tianxincode 1.0.13 → 1.0.14

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.
Files changed (86) hide show
  1. package/dist/api/filesystem.routes.js +13 -4
  2. package/dist/api/filesystem.routes.js.map +1 -1
  3. package/dist/components/App.backup.d.ts +34 -0
  4. package/dist/components/App.backup.d.ts.map +1 -0
  5. package/dist/components/App.backup.js +692 -0
  6. package/dist/components/App.backup.js.map +1 -0
  7. package/dist/components/App.d.ts +33 -24
  8. package/dist/components/App.d.ts.map +1 -1
  9. package/dist/components/App.js +182 -718
  10. package/dist/components/App.js.map +1 -1
  11. package/dist/components/FileSelector.d.ts +47 -0
  12. package/dist/components/FileSelector.d.ts.map +1 -0
  13. package/dist/components/FileSelector.js +40 -0
  14. package/dist/components/FileSelector.js.map +1 -0
  15. package/dist/components/Header.d.ts +3 -0
  16. package/dist/components/Header.d.ts.map +1 -0
  17. package/dist/components/Header.js +17 -0
  18. package/dist/components/Header.js.map +1 -0
  19. package/dist/components/InputArea.d.ts +50 -0
  20. package/dist/components/InputArea.d.ts.map +1 -0
  21. package/dist/components/InputArea.js +52 -0
  22. package/dist/components/InputArea.js.map +1 -0
  23. package/dist/components/MainContent.d.ts +11 -0
  24. package/dist/components/MainContent.d.ts.map +1 -0
  25. package/dist/components/MainContent.js +118 -0
  26. package/dist/components/MainContent.js.map +1 -0
  27. package/dist/components/MessageList.d.ts +11 -0
  28. package/dist/components/MessageList.d.ts.map +1 -0
  29. package/dist/components/MessageList.js +129 -0
  30. package/dist/components/MessageList.js.map +1 -0
  31. package/dist/components/ModelSelector.d.ts +42 -0
  32. package/dist/components/ModelSelector.d.ts.map +1 -0
  33. package/dist/components/ModelSelector.js +36 -0
  34. package/dist/components/ModelSelector.js.map +1 -0
  35. package/dist/components/StatusBar.d.ts +14 -0
  36. package/dist/components/StatusBar.d.ts.map +1 -0
  37. package/dist/components/StatusBar.js +21 -0
  38. package/dist/components/StatusBar.js.map +1 -0
  39. package/dist/components/hooks/useChat.d.ts +69 -0
  40. package/dist/components/hooks/useChat.d.ts.map +1 -0
  41. package/dist/components/hooks/useChat.js +270 -0
  42. package/dist/components/hooks/useChat.js.map +1 -0
  43. package/dist/components/hooks/useFileSelect.d.ts +58 -0
  44. package/dist/components/hooks/useFileSelect.d.ts.map +1 -0
  45. package/dist/components/hooks/useFileSelect.js +182 -0
  46. package/dist/components/hooks/useFileSelect.js.map +1 -0
  47. package/dist/components/hooks/useModelSelect.d.ts +54 -0
  48. package/dist/components/hooks/useModelSelect.d.ts.map +1 -0
  49. package/dist/components/hooks/useModelSelect.js +137 -0
  50. package/dist/components/hooks/useModelSelect.js.map +1 -0
  51. package/dist/components/useInputHandler.d.ts +33 -0
  52. package/dist/components/useInputHandler.d.ts.map +1 -0
  53. package/dist/components/useInputHandler.js +130 -0
  54. package/dist/components/useInputHandler.js.map +1 -0
  55. package/dist/hooks/useAlternateBuffer.d.ts +14 -0
  56. package/dist/hooks/useAlternateBuffer.d.ts.map +1 -0
  57. package/dist/hooks/useAlternateBuffer.js +20 -0
  58. package/dist/hooks/useAlternateBuffer.js.map +1 -0
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +0 -1
  61. package/dist/index.js.map +1 -1
  62. package/package.json +7 -5
  63. package/scripts/ink-scroll-demo.tsx +147 -0
  64. package/web/dist/assets/{AiLogsView-D_SQ6qo4.js → AiLogsView-3J-YAusV.js} +1 -1
  65. package/web/dist/assets/{DevWorkflowView-C5VnPngb.css → DevWorkflowView-BRvigFN5.css} +1 -1
  66. package/web/dist/assets/{DevWorkflowView-iHAv9LC0.js → DevWorkflowView-DMCpylwg.js} +5 -5
  67. package/web/dist/assets/{Layout-CQhbIJxB.js → Layout-B905ASbH.js} +1 -1
  68. package/web/dist/assets/{TasksView-B9B2H3-S.js → TasksView-CCzwoCHn.js} +1 -1
  69. package/web/dist/assets/{TerminalView-BKhdi5UF.js → TerminalView-CxtZwfd-.js} +1 -1
  70. package/web/dist/assets/{cssMode-C_gwipb0.js → cssMode-tUnhOlEq.js} +1 -1
  71. package/web/dist/assets/{freemarker2-WCA_pR0J.js → freemarker2-BkGxlHtf.js} +1 -1
  72. package/web/dist/assets/{handlebars-fzVGzXHj.js → handlebars-BCSYP3By.js} +1 -1
  73. package/web/dist/assets/{html-C4Rga6DD.js → html-D_GMhfaP.js} +1 -1
  74. package/web/dist/assets/{htmlMode-BvrJ57rW.js → htmlMode-DDgBAK4r.js} +1 -1
  75. package/web/dist/assets/{index-9RP8PAfk.js → index-CUPB0bCv.js} +13 -13
  76. package/web/dist/assets/{javascript-cXKyuP98.js → javascript-CGc1uqdW.js} +1 -1
  77. package/web/dist/assets/{jsonMode-Q4CMzwiX.js → jsonMode-Ce0FYmxJ.js} +1 -1
  78. package/web/dist/assets/{liquid-CrbU0gmK.js → liquid-BwNgZkfv.js} +1 -1
  79. package/web/dist/assets/{mdx-D72Dcs66.js → mdx-CF1JkZ9f.js} +1 -1
  80. package/web/dist/assets/{python-DPqkZ_Xm.js → python-CXnk0DYj.js} +1 -1
  81. package/web/dist/assets/{razor-DknXaqXN.js → razor-CWGzlt3Z.js} +1 -1
  82. package/web/dist/assets/{tsMode-DZAV3Wgo.js → tsMode-CXhn7HXH.js} +1 -1
  83. package/web/dist/assets/{typescript-DenKTmW3.js → typescript-DF01mLhp.js} +1 -1
  84. package/web/dist/assets/{xml-C_uqJta0.js → xml-ZLfViiJc.js} +1 -1
  85. package/web/dist/assets/{yaml-vwb3U7d7.js → yaml-CV_nX5Yg.js} +1 -1
  86. package/web/dist/index.html +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tianxincode",
3
- "version": "1.0.13",
3
+ "version": "1.0.14",
4
4
  "type": "module",
5
5
  "description": "AI Coding Assistant",
6
6
  "main": "dist/index.js",
@@ -12,6 +12,7 @@
12
12
  "build": "tsc && npm run copy-txt",
13
13
  "copy-txt": "node -e \"const fs=require('fs');const path=require('path');const providerSrc='src/modules/tools/provider';const providerDst='dist/modules/tools/provider';fs.readdirSync(providerSrc).filter(f=>f.endsWith('.txt')).forEach(f=>{fs.mkdirSync(providerDst,{recursive:true});fs.copyFileSync(path.join(providerSrc,f),path.join(providerDst,f))});const skillSrc='src/modules/skill';const skillDst='dist/modules/skill';fs.mkdirSync(skillDst,{recursive:true});fs.copyFileSync(path.join(skillSrc,'skill.txt'),path.join(skillDst,'skill.txt'));const providerPromptSrc='src/modules/ai/provider/openai/prompt';const providerPromptDst='dist/modules/ai/provider/openai/prompt';fs.mkdirSync(providerPromptDst,{recursive:true});fs.copyFileSync(path.join(providerPromptSrc,'role.txt'),path.join(providerPromptDst,'role.txt'));const agents=['code','chat','task'];agents.forEach(agent=>{const src='src/modules/ai/agents/'+agent+'/prompts';const dst='dist/modules/ai/agents/'+agent+'/prompts';fs.mkdirSync(dst,{recursive:true});fs.copyFileSync(path.join(src,'role.txt'),path.join(dst,'role.txt'))});console.log('Copied .txt files to dist')\"",
14
14
  "dev": "tsx src/index.ts",
15
+ "demo:ink-scroll": "tsx scripts/ink-scroll-demo.tsx",
15
16
  "start": "node dist/index.js",
16
17
  "start:web": "node dist/index.js web",
17
18
  "web:dev": "cd web && npm run dev",
@@ -31,13 +32,14 @@
31
32
  "cors": "^2.8.6",
32
33
  "dingtalk-stream-sdk-nodejs": "^2.0.4",
33
34
  "express": "^5.2.1",
34
- "ink": "^5.1.1",
35
+ "ink": "^6.8.0",
35
36
  "js-yaml": "^4.1.1",
36
37
  "node-cron": "^4.2.1",
37
38
  "node-pty": "^1.0.0",
38
39
  "nodemailer": "^8.0.4",
39
40
  "openai": "^5.5.1",
40
- "react": "^18.3.1",
41
+ "react": "^19.2.4",
42
+ "react-dom": "^19.2.4",
41
43
  "sql.js": "^1.12.0",
42
44
  "uuid": "^9.0.1",
43
45
  "which": "^6.0.1",
@@ -52,8 +54,8 @@
52
54
  "@types/js-yaml": "^4.0.9",
53
55
  "@types/node": "^25.5.0",
54
56
  "@types/node-cron": "^3.0.11",
55
- "@types/react": "^18.3.28",
56
- "@types/react-dom": "^18.3.7",
57
+ "@types/react": "^19.2.14",
58
+ "@types/react-dom": "^19.2.3",
57
59
  "@types/sql.js": "^1.4.9",
58
60
  "@types/uuid": "^10.0.0",
59
61
  "@types/which": "^3.0.4",
@@ -0,0 +1,147 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Ink Static 模式 demo:上 Logo / 中历史消息(Static) / 下输入框
4
+ *
5
+ * - 历史消息使用 Ink 的 Static 渲染。
6
+ * - 回车:输入追加到历史区(Static 仅新增这一条)。
7
+ * - q / Esc:退出
8
+ *
9
+ * 运行:npm run demo:ink-scroll
10
+ */
11
+
12
+ import React, { useEffect, useState } from 'react';
13
+ import { Box, Static, Text, render, useApp, useInput, useStdout } from 'ink';
14
+
15
+ const LOGO_LINES = 6;
16
+ const FOOTER_LINES = 3;
17
+
18
+ interface HistoryItem {
19
+ id: string;
20
+ text: string;
21
+ }
22
+
23
+ export function InkScrollDemoApp() {
24
+ const { exit } = useApp();
25
+ const { stdout } = useStdout();
26
+
27
+ const [terminalSize, setTerminalSize] = useState(() => ({
28
+ rows: stdout.rows || 24,
29
+ cols: stdout.columns || 80,
30
+ }));
31
+
32
+ useEffect(() => {
33
+ const onResize = () => {
34
+ setTerminalSize({
35
+ rows: stdout.rows || 24,
36
+ cols: stdout.columns || 80,
37
+ });
38
+ };
39
+ stdout.on('resize', onResize);
40
+ return () => {
41
+ stdout.off('resize', onResize);
42
+ };
43
+ }, [stdout]);
44
+
45
+ const terminalRows = terminalSize.rows;
46
+ const terminalCols = terminalSize.cols;
47
+ const historyViewportLines = 30;
48
+
49
+ const [history, setHistory] = useState<HistoryItem[]>(() => [
50
+ { id: 'boot-1', text: '欢迎使用 Static demo:回车会把输入追加到历史。' },
51
+ { id: 'boot-2', text: '你可以持续输入,观察输入框更新时历史不重绘。' },
52
+ ]);
53
+ const logoStaticItems: HistoryItem[] = [
54
+ { id: 'logo-1', text: '╔══════════════════════════════════╗' },
55
+ { id: 'logo-2', text: '║ INK LAYOUT DEMO ║' },
56
+ { id: 'logo-3', text: '║ Logo / History / Input ║' },
57
+ { id: 'logo-4', text: '╚══════════════════════════════════╝' },
58
+ ];
59
+ const [input, setInput] = useState('');
60
+ const [cursorPosition, setCursorPosition] = useState(0);
61
+
62
+ useInput((chunk, key) => {
63
+ const text = typeof chunk === 'string' ? chunk : '';
64
+ const keyAny = key as { leftArrow?: boolean; rightArrow?: boolean };
65
+
66
+ if (key.escape || (text === 'q' && !key.ctrl && !key.meta)) {
67
+ exit();
68
+ return;
69
+ }
70
+
71
+ if (key.return) {
72
+ const line = input.trim();
73
+ if (line) {
74
+ const id = `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
75
+ setHistory(prev => [...prev, { id, text: line }]);
76
+ }
77
+ setInput('');
78
+ setCursorPosition(0);
79
+ return;
80
+ }
81
+
82
+ if (key.backspace || key.delete) {
83
+ if (cursorPosition > 0) {
84
+ const next = input.slice(0, cursorPosition - 1) + input.slice(cursorPosition);
85
+ setInput(next);
86
+ setCursorPosition(c => c - 1);
87
+ }
88
+ return;
89
+ }
90
+
91
+ if (keyAny.leftArrow) {
92
+ setCursorPosition(c => Math.max(0, c - 1));
93
+ return;
94
+ }
95
+ if (keyAny.rightArrow) {
96
+ setCursorPosition(c => Math.min(input.length, c + 1));
97
+ return;
98
+ }
99
+
100
+ if (text && !key.ctrl && !key.meta) {
101
+ const next = input.slice(0, cursorPosition) + text + input.slice(cursorPosition);
102
+ setInput(next);
103
+ setCursorPosition(cursorPosition + text.length);
104
+ }
105
+ });
106
+
107
+ return (
108
+ <Box flexDirection="column" width={terminalCols} height={5}>
109
+ {/* 顶部 Logo */}
110
+
111
+
112
+ {/* 中间历史(Static) */}
113
+ <Box flexDirection="column" flexGrow={1} minHeight={0}>
114
+ <Static items={logoStaticItems}>
115
+ {item => (
116
+ <Text key={item.id} bold color="cyan">
117
+ {item.text}
118
+ </Text>
119
+ )}
120
+ </Static>
121
+ <Static items={history}>
122
+ {(item, index) => (
123
+ <Text key={item.id}>
124
+ <Text dimColor>{String(index + 1).padStart(3, ' ')}. </Text>
125
+ <Text>{item.text}</Text>
126
+ </Text>
127
+ )}
128
+ </Static>
129
+ </Box>
130
+
131
+ {/* 底部输入框 */}
132
+ <Box flexDirection="column" flexShrink={0} marginTop={0}>
133
+ <Box borderStyle="single" borderColor="gray" paddingX={1}>
134
+ <Text dimColor>{'> '}</Text>
135
+ <Text>{input.slice(0, cursorPosition)}</Text>
136
+ <Text color="cyan">▋</Text>
137
+ <Text>{input.slice(cursorPosition)}</Text>
138
+ </Box>
139
+ <Text dimColor>
140
+ Static 历史模式 | 回车追加历史 | q / Esc 退出
141
+ </Text>
142
+ </Box>
143
+ </Box>
144
+ );
145
+ }
146
+
147
+ render(<InkScrollDemoApp />);
@@ -1 +1 @@
1
- import{n as x,a as n}from"./index-9RP8PAfk.js";const c=[{key:"ai_call_logs",name:"AI 日志",icon:"fa-solid fa-robot text-xs"}],p={name:"AiLogsView",data(){return{logTypes:c,selectedLogType:c[0],logs:[],page:1,pageSize:20,total:0,totalPages:1,sessions:[],loading:!1,filters:{callType:"",sessionId:"",startTime:"",endTime:""}}},async created(){await this.loadSessions(),await this.loadLogs()},methods:{async loadSessions(){try{const s=await n.getSessions(100,0);this.sessions=s.data||[]}catch(s){console.error("Load sessions failed:",s)}},selectLogType(s){this.selectedLogType=s,this.resetFilters()},async loadLogs(){this.loading=!0;try{const s=await n.getAiCallLogs(this.page,this.pageSize);let t=s.data.rows||[];if(this.filters.callType&&(t=t.filter(e=>e.call_type===this.filters.callType)),this.filters.sessionId&&(t=t.filter(e=>e.session_id&&e.session_id.includes(this.filters.sessionId))),this.filters.startTime){const e=new Date(this.filters.startTime).getTime();t=t.filter(l=>new Date(l.request_time).getTime()>=e)}if(this.filters.endTime){const e=new Date(this.filters.endTime).getTime();t=t.filter(l=>new Date(l.request_time).getTime()<=e)}this.logs=t,this.total=s.data.total,this.totalPages=s.data.totalPages}catch(s){console.error("Load logs failed:",s),this.logs=[]}finally{this.loading=!1}},resetFilters(){this.filters.callType="",this.filters.sessionId="",this.filters.startTime="",this.filters.endTime="",this.page=1,this.loadLogs()},async prevPage(){this.page>1&&(this.page--,await this.loadLogs())},async nextPage(){this.page<this.totalPages&&(this.page++,await this.loadLogs())},formatTime(s){return s?new Date(s).toLocaleString("zh-CN"):"-"},getSessionTitle(s){if(!s)return"-";const t=this.sessions.find(e=>e.id===s);return t?t.title:s.substring(0,8)},formatDuration(s){return s?s<1e3?`${s}ms`:`${(s/1e3).toFixed(2)}s`:"0ms"}}};var b=function(){var l,d;var t=this,e=t._self._c;return e("div",{staticClass:"flex-1 flex overflow-hidden"},[e("aside",{staticClass:"w-[260px] bg-sidebar border-r border-border flex flex-col shrink-0"},[t._m(0),e("div",{staticClass:"flex-1 overflow-y-auto py-1"},t._l(t.logTypes,function(a){var i;return e("div",{key:a.key,staticClass:"flex items-center gap-2 px-3 py-1.5 cursor-pointer text-sm",class:((i=t.selectedLogType)==null?void 0:i.key)===a.key?"bg-active text-white border-l-2 border-accent":"text-textMuted hover:text-white hover:bg-white/5 border-l-2 border-transparent",on:{click:function(r){return t.selectLogType(a)}}},[e("i",{class:a.icon}),e("span",{staticClass:"truncate"},[t._v(t._s(a.name))])])}),0)]),e("main",{staticClass:"flex-1 flex flex-col min-w-0 bg-[#1e1e1e]"},[e("div",{staticClass:"px-4 py-3 border-b border-border bg-sidebar"},[e("div",{staticClass:"flex items-center gap-4 mb-3"},[e("div",{staticClass:"flex items-center gap-2"},[e("i",{class:(l=t.selectedLogType)==null?void 0:l.icon}),e("span",{staticClass:"text-white font-medium"},[t._v(t._s((d=t.selectedLogType)==null?void 0:d.name))])]),e("span",{staticClass:"text-xs text-textMuted"},[t._v(t._s(t.total)+" 条记录")])]),e("div",{staticClass:"flex items-center gap-4 flex-wrap"},[e("div",{staticClass:"flex items-center gap-2"},[e("label",{staticClass:"text-xs text-textMuted"},[t._v("调用类型:")]),e("select",{directives:[{name:"model",rawName:"v-model",value:t.filters.callType,expression:"filters.callType"}],staticClass:"bg-black/20 border border-white/10 text-white text-xs px-2 py-1 rounded",on:{change:[function(a){var i=Array.prototype.filter.call(a.target.options,function(r){return r.selected}).map(function(r){var o="_value"in r?r._value:r.value;return o});t.$set(t.filters,"callType",a.target.multiple?i:i[0])},t.loadLogs]}},[e("option",{attrs:{value:""}},[t._v("全部")]),e("option",{attrs:{value:"tool_call"}},[t._v("工具调用")]),e("option",{attrs:{value:"normal"}},[t._v("普通对话")])])]),e("div",{staticClass:"flex items-center gap-2"},[e("label",{staticClass:"text-xs text-textMuted"},[t._v("会话:")]),e("select",{directives:[{name:"model",rawName:"v-model",value:t.filters.sessionId,expression:"filters.sessionId"}],staticClass:"bg-black/20 border border-white/10 text-white text-xs px-2 py-1 rounded",on:{change:[function(a){var i=Array.prototype.filter.call(a.target.options,function(r){return r.selected}).map(function(r){var o="_value"in r?r._value:r.value;return o});t.$set(t.filters,"sessionId",a.target.multiple?i:i[0])},t.loadLogs]}},[e("option",{attrs:{value:""}},[t._v("全部会话")]),t._l(t.sessions,function(a){return e("option",{key:a.id,domProps:{value:a.id}},[t._v(t._s(a.title))])})],2)]),e("div",{staticClass:"flex items-center gap-2"},[e("label",{staticClass:"text-xs text-textMuted"},[t._v("开始时间:")]),e("input",{directives:[{name:"model",rawName:"v-model",value:t.filters.startTime,expression:"filters.startTime"}],staticClass:"bg-black/20 border border-white/10 text-white text-xs px-2 py-1 rounded",attrs:{type:"datetime-local"},domProps:{value:t.filters.startTime},on:{change:t.loadLogs,input:function(a){a.target.composing||t.$set(t.filters,"startTime",a.target.value)}}})]),e("div",{staticClass:"flex items-center gap-2"},[e("label",{staticClass:"text-xs text-textMuted"},[t._v("结束时间:")]),e("input",{directives:[{name:"model",rawName:"v-model",value:t.filters.endTime,expression:"filters.endTime"}],staticClass:"bg-black/20 border border-white/10 text-white text-xs px-2 py-1 rounded",attrs:{type:"datetime-local"},domProps:{value:t.filters.endTime},on:{change:t.loadLogs,input:function(a){a.target.composing||t.$set(t.filters,"endTime",a.target.value)}}})]),e("button",{staticClass:"px-3 py-1 bg-accent text-white text-xs rounded hover:bg-accent/80",on:{click:t.loadLogs}},[t._v(" 查询 ")]),e("button",{staticClass:"px-3 py-1 text-textMuted text-xs rounded hover:bg-white/10",on:{click:t.resetFilters}},[t._v(" 重置 ")])])]),e("div",{staticClass:"flex-1 overflow-auto p-4"},[e("table",{staticClass:"w-full text-sm"},[t._m(1),e("tbody",[t._l(t.logs,function(a){return e("tr",{key:a.id,staticClass:"hover:bg-white/5"},[e("td",{staticClass:"px-3 py-2 text-gray-300 border-b border-border/30"},[t._v(t._s(a.id))]),e("td",{staticClass:"px-3 py-2 text-gray-300 border-b border-border/30"},[t._v(t._s(t.formatTime(a.request_time)))]),e("td",{staticClass:"px-3 py-2 border-b border-border/30"},[e("span",{staticClass:"text-xs px-2 py-0.5 rounded",class:a.call_type==="tool_call"?"bg-blue-500/20 text-blue-400":"bg-green-500/20 text-green-400"},[t._v(" "+t._s(a.call_type==="tool_call"?"工具调用":"普通对话")+" ")])]),e("td",{staticClass:"px-3 py-2 text-gray-300 border-b border-border/30"},[t._v(t._s(a.model_name))]),e("td",{staticClass:"px-3 py-2 text-gray-300 border-b border-border/30"},[t._v(t._s(t.formatDuration(a.duration_ms)))]),e("td",{staticClass:"px-3 py-2 text-gray-300 border-b border-border/30"},[t._v(t._s(a.input_tokens||0))]),e("td",{staticClass:"px-3 py-2 text-gray-300 border-b border-border/30"},[t._v(t._s(a.output_tokens||0))]),e("td",{staticClass:"px-3 py-2 text-gray-300 border-b border-border/30"},[t._v("$"+t._s((a.cost||0).toFixed(4)))]),e("td",{staticClass:"px-3 py-2 text-gray-300 border-b border-border/30 truncate max-w-[150px]",attrs:{title:a.session_id}},[t._v(t._s(t.getSessionTitle(a.session_id)))])])}),t.logs.length===0?e("tr",[e("td",{staticClass:"px-3 py-8 text-center text-textMuted",attrs:{colspan:"9"}},[t._v("暂无数据")])]):t._e()],2)])]),e("div",{staticClass:"flex items-center justify-between px-4 py-2 border-t border-border bg-sidebar"},[e("span",{staticClass:"text-xs text-textMuted"},[t._v("共 "+t._s(t.total)+" 条")]),e("div",{staticClass:"flex items-center gap-2"},[e("button",{staticClass:"px-2 py-1 text-xs text-textMuted hover:text-white disabled:opacity-30 disabled:cursor-not-allowed",attrs:{disabled:t.page<=1},on:{click:t.prevPage}},[e("i",{staticClass:"fa-solid fa-chevron-left"}),t._v(" 上一页 ")]),e("span",{staticClass:"text-xs text-textMuted"},[t._v(t._s(t.page)+" / "+t._s(t.totalPages||1))]),e("button",{staticClass:"px-2 py-1 text-xs text-textMuted hover:text-white disabled:opacity-30 disabled:cursor-not-allowed",attrs:{disabled:t.page>=t.totalPages},on:{click:t.nextPage}},[t._v(" 下一页 "),e("i",{staticClass:"fa-solid fa-chevron-right"})])])])])])},f=[function(){var s=this,t=s._self._c;return t("div",{staticClass:"flex border-b border-border text-xs uppercase font-bold text-textMuted"},[t("div",{staticClass:"px-4 py-2 border-b-2 border-accent text-white flex items-center gap-2"},[t("i",{staticClass:"fa-solid fa-list"}),s._v(" 日志 ")])])},function(){var s=this,t=s._self._c;return t("thead",{staticClass:"bg-sidebar sticky top-0"},[t("tr",[t("th",{staticClass:"px-3 py-2 text-left text-xs font-bold text-textMuted uppercase border-b border-border"},[s._v("ID")]),t("th",{staticClass:"px-3 py-2 text-left text-xs font-bold text-textMuted uppercase border-b border-border"},[s._v("时间")]),t("th",{staticClass:"px-3 py-2 text-left text-xs font-bold text-textMuted uppercase border-b border-border"},[s._v("类型")]),t("th",{staticClass:"px-3 py-2 text-left text-xs font-bold text-textMuted uppercase border-b border-border"},[s._v("模型")]),t("th",{staticClass:"px-3 py-2 text-left text-xs font-bold text-textMuted uppercase border-b border-border"},[s._v("耗时")]),t("th",{staticClass:"px-3 py-2 text-left text-xs font-bold text-textMuted uppercase border-b border-border"},[s._v("输入Token")]),t("th",{staticClass:"px-3 py-2 text-left text-xs font-bold text-textMuted uppercase border-b border-border"},[s._v("输出Token")]),t("th",{staticClass:"px-3 py-2 text-left text-xs font-bold text-textMuted uppercase border-b border-border"},[s._v("费用")]),t("th",{staticClass:"px-3 py-2 text-left text-xs font-bold text-textMuted uppercase border-b border-border"},[s._v("会话ID")])])])}],u=x(p,b,f,!1,null,null);const _=u.exports;export{_ as default};
1
+ import{n as x,a as n}from"./index-CUPB0bCv.js";const c=[{key:"ai_call_logs",name:"AI 日志",icon:"fa-solid fa-robot text-xs"}],p={name:"AiLogsView",data(){return{logTypes:c,selectedLogType:c[0],logs:[],page:1,pageSize:20,total:0,totalPages:1,sessions:[],loading:!1,filters:{callType:"",sessionId:"",startTime:"",endTime:""}}},async created(){await this.loadSessions(),await this.loadLogs()},methods:{async loadSessions(){try{const s=await n.getSessions(100,0);this.sessions=s.data||[]}catch(s){console.error("Load sessions failed:",s)}},selectLogType(s){this.selectedLogType=s,this.resetFilters()},async loadLogs(){this.loading=!0;try{const s=await n.getAiCallLogs(this.page,this.pageSize);let t=s.data.rows||[];if(this.filters.callType&&(t=t.filter(e=>e.call_type===this.filters.callType)),this.filters.sessionId&&(t=t.filter(e=>e.session_id&&e.session_id.includes(this.filters.sessionId))),this.filters.startTime){const e=new Date(this.filters.startTime).getTime();t=t.filter(l=>new Date(l.request_time).getTime()>=e)}if(this.filters.endTime){const e=new Date(this.filters.endTime).getTime();t=t.filter(l=>new Date(l.request_time).getTime()<=e)}this.logs=t,this.total=s.data.total,this.totalPages=s.data.totalPages}catch(s){console.error("Load logs failed:",s),this.logs=[]}finally{this.loading=!1}},resetFilters(){this.filters.callType="",this.filters.sessionId="",this.filters.startTime="",this.filters.endTime="",this.page=1,this.loadLogs()},async prevPage(){this.page>1&&(this.page--,await this.loadLogs())},async nextPage(){this.page<this.totalPages&&(this.page++,await this.loadLogs())},formatTime(s){return s?new Date(s).toLocaleString("zh-CN"):"-"},getSessionTitle(s){if(!s)return"-";const t=this.sessions.find(e=>e.id===s);return t?t.title:s.substring(0,8)},formatDuration(s){return s?s<1e3?`${s}ms`:`${(s/1e3).toFixed(2)}s`:"0ms"}}};var b=function(){var l,d;var t=this,e=t._self._c;return e("div",{staticClass:"flex-1 flex overflow-hidden"},[e("aside",{staticClass:"w-[260px] bg-sidebar border-r border-border flex flex-col shrink-0"},[t._m(0),e("div",{staticClass:"flex-1 overflow-y-auto py-1"},t._l(t.logTypes,function(a){var i;return e("div",{key:a.key,staticClass:"flex items-center gap-2 px-3 py-1.5 cursor-pointer text-sm",class:((i=t.selectedLogType)==null?void 0:i.key)===a.key?"bg-active text-white border-l-2 border-accent":"text-textMuted hover:text-white hover:bg-white/5 border-l-2 border-transparent",on:{click:function(r){return t.selectLogType(a)}}},[e("i",{class:a.icon}),e("span",{staticClass:"truncate"},[t._v(t._s(a.name))])])}),0)]),e("main",{staticClass:"flex-1 flex flex-col min-w-0 bg-[#1e1e1e]"},[e("div",{staticClass:"px-4 py-3 border-b border-border bg-sidebar"},[e("div",{staticClass:"flex items-center gap-4 mb-3"},[e("div",{staticClass:"flex items-center gap-2"},[e("i",{class:(l=t.selectedLogType)==null?void 0:l.icon}),e("span",{staticClass:"text-white font-medium"},[t._v(t._s((d=t.selectedLogType)==null?void 0:d.name))])]),e("span",{staticClass:"text-xs text-textMuted"},[t._v(t._s(t.total)+" 条记录")])]),e("div",{staticClass:"flex items-center gap-4 flex-wrap"},[e("div",{staticClass:"flex items-center gap-2"},[e("label",{staticClass:"text-xs text-textMuted"},[t._v("调用类型:")]),e("select",{directives:[{name:"model",rawName:"v-model",value:t.filters.callType,expression:"filters.callType"}],staticClass:"bg-black/20 border border-white/10 text-white text-xs px-2 py-1 rounded",on:{change:[function(a){var i=Array.prototype.filter.call(a.target.options,function(r){return r.selected}).map(function(r){var o="_value"in r?r._value:r.value;return o});t.$set(t.filters,"callType",a.target.multiple?i:i[0])},t.loadLogs]}},[e("option",{attrs:{value:""}},[t._v("全部")]),e("option",{attrs:{value:"tool_call"}},[t._v("工具调用")]),e("option",{attrs:{value:"normal"}},[t._v("普通对话")])])]),e("div",{staticClass:"flex items-center gap-2"},[e("label",{staticClass:"text-xs text-textMuted"},[t._v("会话:")]),e("select",{directives:[{name:"model",rawName:"v-model",value:t.filters.sessionId,expression:"filters.sessionId"}],staticClass:"bg-black/20 border border-white/10 text-white text-xs px-2 py-1 rounded",on:{change:[function(a){var i=Array.prototype.filter.call(a.target.options,function(r){return r.selected}).map(function(r){var o="_value"in r?r._value:r.value;return o});t.$set(t.filters,"sessionId",a.target.multiple?i:i[0])},t.loadLogs]}},[e("option",{attrs:{value:""}},[t._v("全部会话")]),t._l(t.sessions,function(a){return e("option",{key:a.id,domProps:{value:a.id}},[t._v(t._s(a.title))])})],2)]),e("div",{staticClass:"flex items-center gap-2"},[e("label",{staticClass:"text-xs text-textMuted"},[t._v("开始时间:")]),e("input",{directives:[{name:"model",rawName:"v-model",value:t.filters.startTime,expression:"filters.startTime"}],staticClass:"bg-black/20 border border-white/10 text-white text-xs px-2 py-1 rounded",attrs:{type:"datetime-local"},domProps:{value:t.filters.startTime},on:{change:t.loadLogs,input:function(a){a.target.composing||t.$set(t.filters,"startTime",a.target.value)}}})]),e("div",{staticClass:"flex items-center gap-2"},[e("label",{staticClass:"text-xs text-textMuted"},[t._v("结束时间:")]),e("input",{directives:[{name:"model",rawName:"v-model",value:t.filters.endTime,expression:"filters.endTime"}],staticClass:"bg-black/20 border border-white/10 text-white text-xs px-2 py-1 rounded",attrs:{type:"datetime-local"},domProps:{value:t.filters.endTime},on:{change:t.loadLogs,input:function(a){a.target.composing||t.$set(t.filters,"endTime",a.target.value)}}})]),e("button",{staticClass:"px-3 py-1 bg-accent text-white text-xs rounded hover:bg-accent/80",on:{click:t.loadLogs}},[t._v(" 查询 ")]),e("button",{staticClass:"px-3 py-1 text-textMuted text-xs rounded hover:bg-white/10",on:{click:t.resetFilters}},[t._v(" 重置 ")])])]),e("div",{staticClass:"flex-1 overflow-auto p-4"},[e("table",{staticClass:"w-full text-sm"},[t._m(1),e("tbody",[t._l(t.logs,function(a){return e("tr",{key:a.id,staticClass:"hover:bg-white/5"},[e("td",{staticClass:"px-3 py-2 text-gray-300 border-b border-border/30"},[t._v(t._s(a.id))]),e("td",{staticClass:"px-3 py-2 text-gray-300 border-b border-border/30"},[t._v(t._s(t.formatTime(a.request_time)))]),e("td",{staticClass:"px-3 py-2 border-b border-border/30"},[e("span",{staticClass:"text-xs px-2 py-0.5 rounded",class:a.call_type==="tool_call"?"bg-blue-500/20 text-blue-400":"bg-green-500/20 text-green-400"},[t._v(" "+t._s(a.call_type==="tool_call"?"工具调用":"普通对话")+" ")])]),e("td",{staticClass:"px-3 py-2 text-gray-300 border-b border-border/30"},[t._v(t._s(a.model_name))]),e("td",{staticClass:"px-3 py-2 text-gray-300 border-b border-border/30"},[t._v(t._s(t.formatDuration(a.duration_ms)))]),e("td",{staticClass:"px-3 py-2 text-gray-300 border-b border-border/30"},[t._v(t._s(a.input_tokens||0))]),e("td",{staticClass:"px-3 py-2 text-gray-300 border-b border-border/30"},[t._v(t._s(a.output_tokens||0))]),e("td",{staticClass:"px-3 py-2 text-gray-300 border-b border-border/30"},[t._v("$"+t._s((a.cost||0).toFixed(4)))]),e("td",{staticClass:"px-3 py-2 text-gray-300 border-b border-border/30 truncate max-w-[150px]",attrs:{title:a.session_id}},[t._v(t._s(t.getSessionTitle(a.session_id)))])])}),t.logs.length===0?e("tr",[e("td",{staticClass:"px-3 py-8 text-center text-textMuted",attrs:{colspan:"9"}},[t._v("暂无数据")])]):t._e()],2)])]),e("div",{staticClass:"flex items-center justify-between px-4 py-2 border-t border-border bg-sidebar"},[e("span",{staticClass:"text-xs text-textMuted"},[t._v("共 "+t._s(t.total)+" 条")]),e("div",{staticClass:"flex items-center gap-2"},[e("button",{staticClass:"px-2 py-1 text-xs text-textMuted hover:text-white disabled:opacity-30 disabled:cursor-not-allowed",attrs:{disabled:t.page<=1},on:{click:t.prevPage}},[e("i",{staticClass:"fa-solid fa-chevron-left"}),t._v(" 上一页 ")]),e("span",{staticClass:"text-xs text-textMuted"},[t._v(t._s(t.page)+" / "+t._s(t.totalPages||1))]),e("button",{staticClass:"px-2 py-1 text-xs text-textMuted hover:text-white disabled:opacity-30 disabled:cursor-not-allowed",attrs:{disabled:t.page>=t.totalPages},on:{click:t.nextPage}},[t._v(" 下一页 "),e("i",{staticClass:"fa-solid fa-chevron-right"})])])])])])},f=[function(){var s=this,t=s._self._c;return t("div",{staticClass:"flex border-b border-border text-xs uppercase font-bold text-textMuted"},[t("div",{staticClass:"px-4 py-2 border-b-2 border-accent text-white flex items-center gap-2"},[t("i",{staticClass:"fa-solid fa-list"}),s._v(" 日志 ")])])},function(){var s=this,t=s._self._c;return t("thead",{staticClass:"bg-sidebar sticky top-0"},[t("tr",[t("th",{staticClass:"px-3 py-2 text-left text-xs font-bold text-textMuted uppercase border-b border-border"},[s._v("ID")]),t("th",{staticClass:"px-3 py-2 text-left text-xs font-bold text-textMuted uppercase border-b border-border"},[s._v("时间")]),t("th",{staticClass:"px-3 py-2 text-left text-xs font-bold text-textMuted uppercase border-b border-border"},[s._v("类型")]),t("th",{staticClass:"px-3 py-2 text-left text-xs font-bold text-textMuted uppercase border-b border-border"},[s._v("模型")]),t("th",{staticClass:"px-3 py-2 text-left text-xs font-bold text-textMuted uppercase border-b border-border"},[s._v("耗时")]),t("th",{staticClass:"px-3 py-2 text-left text-xs font-bold text-textMuted uppercase border-b border-border"},[s._v("输入Token")]),t("th",{staticClass:"px-3 py-2 text-left text-xs font-bold text-textMuted uppercase border-b border-border"},[s._v("输出Token")]),t("th",{staticClass:"px-3 py-2 text-left text-xs font-bold text-textMuted uppercase border-b border-border"},[s._v("费用")]),t("th",{staticClass:"px-3 py-2 text-left text-xs font-bold text-textMuted uppercase border-b border-border"},[s._v("会话ID")])])])}],u=x(p,b,f,!1,null,null);const _=u.exports;export{_ as default};
@@ -1 +1 @@
1
- .workflow-sidebar[data-v-8e3cf2bb]{width:280px;background:#2d2d2d;border-right:1px solid #1e1e1e;display:flex;flex-direction:column;flex-shrink:0}.sidebar-header[data-v-8e3cf2bb]{padding:16px;border-bottom:1px solid #1e1e1e}.sidebar-header h3[data-v-8e3cf2bb]{font-size:14px;color:#84848a;margin-bottom:12px}.sidebar-header .el-select[data-v-8e3cf2bb]{width:100%;margin-bottom:8px}.project-display-row[data-v-8e3cf2bb]{display:flex;justify-content:space-between;gap:8px;margin-bottom:8px;padding:8px 10px;background:#ffffff0a;border:1px solid #3f3f46;border-radius:6px}.project-display-row .label[data-v-8e3cf2bb]{color:#84848a;font-size:12px}.project-display-row .value[data-v-8e3cf2bb]{color:#d4d4d8;font-size:12px;max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.step-list[data-v-8e3cf2bb]{flex:1;overflow-y:auto;padding:16px}.step-item[data-v-8e3cf2bb]{display:flex;align-items:center;gap:12px;padding:14px 16px;border-radius:8px;margin-bottom:8px;cursor:pointer;transition:all .2s;border:1px solid transparent}.step-item[data-v-8e3cf2bb]:hover{background:#ffffff0d}.step-item.active[data-v-8e3cf2bb]{background:#409eff26;border-color:#409eff}.step-item.completed .step-icon[data-v-8e3cf2bb]{background:#22c55e}.step-item.active .step-icon[data-v-8e3cf2bb]{background:#409eff}.step-icon[data-v-8e3cf2bb]{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:14px;color:#fff;flex-shrink:0}.step-info[data-v-8e3cf2bb]{flex:1}.step-title[data-v-8e3cf2bb]{font-size:14px;font-weight:500;margin-bottom:2px;color:#f4f4f5}.step-desc[data-v-8e3cf2bb]{font-size:12px;color:#84848a}.step-status[data-v-8e3cf2bb]{font-size:14px}.step1-container[data-v-59997ee1]{height:100%;padding:24px;overflow:hidden}.step1-main[data-v-59997ee1]{max-width:600px;margin:0 auto}.panel-section[data-v-59997ee1]{background:#121212;border:1px solid #1e1e1e;border-radius:8px;overflow:hidden}.panel-section-header[data-v-59997ee1]{background:#121212;border-bottom:1px solid #1e1e1e;padding:12px 16px;font-size:14px;font-weight:500;display:flex;align-items:center;justify-content:space-between;color:#f4f4f5}.panel-section-header .el-button[data-v-59997ee1]{padding:4px 8px;font-size:12px}.panel-section-body[data-v-59997ee1]{padding:24px}.form-hint[data-v-59997ee1]{font-size:12px;color:#84848a;margin-top:8px}.form-hint code[data-v-59997ee1]{background:#18191b;padding:2px 6px;border-radius:4px;font-family:ui-monospace,monospace;color:#409eff}.flex[data-v-59997ee1]{display:flex}.gap-2[data-v-59997ee1]{gap:8px}.step2-container[data-v-24f603b8]{height:100%;display:flex;flex-direction:column}.step2-main[data-v-24f603b8]{display:flex;flex:1;gap:16px;overflow:hidden;padding:16px}.editor-panel[data-v-24f603b8]{flex:1;min-width:300px;background:#121212;border:1px solid #1e1e1e;border-radius:8px;overflow:hidden;display:flex;flex-direction:column}.editor-header[data-v-24f603b8]{background:#121212;border-bottom:1px solid #1e1e1e;padding:12px 16px;font-size:13px;color:#84848a;display:flex;align-items:center;gap:8px}.editor-container[data-v-24f603b8]{flex:1;min-height:0}.chat-panel[data-v-24f603b8]{width:480px;background:#121212;border:1px solid #1e1e1e;border-radius:8px;overflow:hidden;display:flex;flex-direction:column;flex-shrink:0}.panel-header[data-v-24f603b8]{background:#121212;border-bottom:1px solid #1e1e1e;padding:12px 16px;font-size:14px;font-weight:500;color:#f4f4f5;flex-shrink:0}.chat-messages[data-v-24f603b8]{flex:1;overflow-y:auto;padding:0 16px 16px;font-size:14px;line-height:1.6}.empty-state[data-v-24f603b8]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:#84848a}.empty-state i[data-v-24f603b8]{font-size:48px;margin-bottom:16px;opacity:.5}.todos-list[data-v-24f603b8]{margin-bottom:16px;color:#d4d4d8}.todo-item[data-v-24f603b8]{display:flex;align-items:center;gap:8px;padding:2px 0}.todo-status[data-v-24f603b8],.todo-name[data-v-24f603b8]{font-size:14px}.user-question[data-v-24f603b8]{color:#60a5fa;font-weight:700;margin-bottom:16px}.user-question[data-v-24f603b8] p{color:#d4d4d8;font-weight:400;margin:0 0 8px;font-size:14px;line-height:1.6}.user-question[data-v-24f603b8] strong{color:#fff}.user-question[data-v-24f603b8] code{background:#27272a;padding:2px 6px;border-radius:4px;color:#60a5fa;font-size:13px}.user-question[data-v-24f603b8] pre{background:#1e1e1e;padding:12px;border-radius:6px;overflow-x:auto;margin:8px 0;font-size:13px}.user-question[data-v-24f603b8] ul,.user-question[data-v-24f603b8] ol{margin:8px 0;padding-left:20px;color:#d4d4d8}.user-question[data-v-24f603b8] li{margin:4px 0;color:#d4d4d8}.user-question[data-v-24f603b8] h1,.user-question[data-v-24f603b8] h2,.user-question[data-v-24f603b8] h3{color:#fff;margin:12px 0 8px}.user-question[data-v-24f603b8] h1{font-size:20px}.user-question[data-v-24f603b8] h2{font-size:18px}.user-question[data-v-24f603b8] h3{font-size:16px}.user-question[data-v-24f603b8] table{border-collapse:collapse;margin:8px 0;width:100%}.user-question[data-v-24f603b8] th,.user-question[data-v-24f603b8] td{border:1px solid #3f3f46;padding:6px 10px;color:#d4d4d8}.user-question[data-v-24f603b8] th{background:#1e1e1e;color:#fff}.user-question[data-v-24f603b8] blockquote{border-left:3px solid #409EFF;padding-left:12px;margin:8px 0;color:#a1a1aa}.user-question[data-v-24f603b8] hr{border:none;border-top:1px solid #3f3f46;margin:12px 0}.ai-thought[data-v-24f603b8]{color:#d4d4d8;margin-bottom:16px;font-size:14px;line-height:1.6}.ai-thought[data-v-24f603b8] p{margin:0 0 8px}.ai-thought[data-v-24f603b8] strong{color:#fff}.ai-thought[data-v-24f603b8] code{background:#27272a;padding:2px 6px;border-radius:4px;color:#60a5fa;font-size:13px}.ai-thought[data-v-24f603b8] pre{background:#1e1e1e;padding:12px;border-radius:6px;overflow-x:auto;margin:8px 0}.ai-thought[data-v-24f603b8] ul,.ai-thought[data-v-24f603b8] ol{margin:8px 0;padding-left:20px}.ai-thought[data-v-24f603b8] li{margin:4px 0}.ai-thought[data-v-24f603b8] h1,.ai-thought[data-v-24f603b8] h2,.ai-thought[data-v-24f603b8] h3{color:#fff;margin:12px 0 8px}.ai-thought[data-v-24f603b8] table{border-collapse:collapse;margin:8px 0;width:100%}.ai-thought[data-v-24f603b8] th,.ai-thought[data-v-24f603b8] td{border:1px solid #3f3f46;padding:6px 10px}.ai-thought[data-v-24f603b8] th{background:#1e1e1e}.ai-thought[data-v-24f603b8] blockquote{border-left:3px solid #409EFF;padding-left:12px;margin:8px 0;color:#a1a1aa}.log-mute[data-v-24f603b8]{color:#84848a;margin-bottom:16px;white-space:pre}.tool-success[data-v-24f603b8]{color:#22c55e}.tool-fail[data-v-24f603b8]{color:#ef4444}.tool-input[data-v-24f603b8]{color:#60a5fa;margin-left:8px}.build-info[data-v-24f603b8]{color:#84848a;display:flex;align-items:center;gap:8px;margin-bottom:16px}.build-info .icon[data-v-24f603b8]{color:#60a5fa;font-size:12px}.chat-input-area[data-v-24f603b8]{border-top:1px solid #1e1e1e;padding:12px 16px;background:#121212;display:flex;flex-direction:column;gap:8px;flex-shrink:0}.input-area[data-v-24f603b8]{width:100%}.input-actions[data-v-24f603b8]{display:flex;justify-content:flex-end;gap:8px}.send-btn[data-v-24f603b8],.stop-btn[data-v-24f603b8]{height:auto}.status-bar[data-v-24f603b8]{display:flex;gap:8px;align-items:center;padding:6px 16px;font-size:12px;color:#84848a;border-top:1px solid #1e1e1e;flex-shrink:0;flex-wrap:wrap;background:#0a0a09}.status-bar .separator[data-v-24f603b8]{color:#3f3f46}.status-ready[data-v-24f603b8]{color:#22c55e}.status-thinking[data-v-24f603b8]{color:#60a5fa}.token-warning[data-v-24f603b8]{color:#ef4444}.compaction-info[data-v-24f603b8]{color:#22c55e;margin-left:8px}.model-selector[data-v-24f603b8]{cursor:pointer}.model-selector[data-v-24f603b8]:hover{color:#60a5fa}.status-action[data-v-24f603b8]{cursor:pointer}.status-action[data-v-24f603b8]:hover{color:#60a5fa}.system-message[data-v-24f603b8]{color:#a78bfa;font-size:13px;margin-bottom:16px;padding:8px 12px;background:#1e1e1e;border-radius:6px}.step3-container[data-v-a1097356]{height:100%;display:flex;flex-direction:column}.step3-main[data-v-a1097356]{flex:1;overflow:hidden;padding:16px}.code-chat-panel[data-v-a1097356]{height:100%;background:#121212;border:1px solid #1e1e1e;border-radius:8px;overflow:hidden;display:flex;flex-direction:column}.panel-header[data-v-a1097356]{background:#121212;border-bottom:1px solid #1e1e1e;padding:12px 16px;font-size:14px;font-weight:500;color:#f4f4f5;display:flex;align-items:center;justify-content:space-between;flex-shrink:0}.chat-messages[data-v-a1097356]{flex:1;overflow-y:auto;padding:0 16px 16px;font-size:14px;line-height:1.6}.empty-state[data-v-a1097356]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:#84848a}.empty-state i[data-v-a1097356]{font-size:48px;margin-bottom:16px;opacity:.5}.todos-list[data-v-a1097356]{margin-bottom:16px;color:#d4d4d8}.todo-item[data-v-a1097356]{display:flex;align-items:center;gap:8px;padding:2px 0}.todo-status[data-v-a1097356],.todo-name[data-v-a1097356]{font-size:14px}.user-question[data-v-a1097356]{color:#60a5fa;font-weight:700;margin-bottom:16px}.user-question[data-v-a1097356] p{color:#d4d4d8;font-weight:400;margin:0 0 8px;font-size:14px;line-height:1.6}.user-question[data-v-a1097356] strong{color:#fff}.user-question[data-v-a1097356] code{background:#27272a;padding:2px 6px;border-radius:4px;color:#60a5fa;font-size:13px}.user-question[data-v-a1097356] pre{background:#1e1e1e;padding:12px;border-radius:6px;overflow-x:auto;margin:8px 0;font-size:13px}.user-question[data-v-a1097356] ul,.user-question[data-v-a1097356] ol{margin:8px 0;padding-left:20px;color:#d4d4d8}.user-question[data-v-a1097356] li{margin:4px 0;color:#d4d4d8}.user-question[data-v-a1097356] h1,.user-question[data-v-a1097356] h2,.user-question[data-v-a1097356] h3{color:#fff;margin:12px 0 8px}.user-question[data-v-a1097356] h1{font-size:20px}.user-question[data-v-a1097356] h2{font-size:18px}.user-question[data-v-a1097356] h3{font-size:16px}.user-question[data-v-a1097356] table{border-collapse:collapse;margin:8px 0;width:100%}.user-question[data-v-a1097356] th,.user-question[data-v-a1097356] td{border:1px solid #3f3f46;padding:6px 10px;color:#d4d4d8}.user-question[data-v-a1097356] th{background:#1e1e1e;color:#fff}.user-question[data-v-a1097356] blockquote{border-left:3px solid #409EFF;padding-left:12px;margin:8px 0;color:#a1a1aa}.user-question[data-v-a1097356] hr{border:none;border-top:1px solid #3f3f46;margin:12px 0}.ai-thought[data-v-a1097356]{color:#d4d4d8;margin-bottom:16px;font-size:14px;line-height:1.6}.ai-thought[data-v-a1097356] p{margin:0 0 8px}.ai-thought[data-v-a1097356] strong{color:#fff}.ai-thought[data-v-a1097356] code{background:#27272a;padding:2px 6px;border-radius:4px;color:#60a5fa;font-size:13px}.ai-thought[data-v-a1097356] pre{background:#1e1e1e;padding:12px;border-radius:6px;overflow-x:auto;margin:8px 0}.ai-thought[data-v-a1097356] ul,.ai-thought[data-v-a1097356] ol{margin:8px 0;padding-left:20px}.ai-thought[data-v-a1097356] li{margin:4px 0}.ai-thought[data-v-a1097356] h1,.ai-thought[data-v-a1097356] h2,.ai-thought[data-v-a1097356] h3{color:#fff;margin:12px 0 8px}.ai-thought[data-v-a1097356] table{border-collapse:collapse;margin:8px 0;width:100%}.ai-thought[data-v-a1097356] th,.ai-thought[data-v-a1097356] td{border:1px solid #3f3f46;padding:6px 10px}.ai-thought[data-v-a1097356] th{background:#1e1e1e}.ai-thought[data-v-a1097356] blockquote{border-left:3px solid #409EFF;padding-left:12px;margin:8px 0;color:#a1a1aa}.log-mute[data-v-a1097356]{color:#84848a;margin-bottom:16px;white-space:pre}.tool-success[data-v-a1097356]{color:#22c55e}.tool-fail[data-v-a1097356]{color:#ef4444}.tool-input[data-v-a1097356]{color:#60a5fa;margin-left:8px}.build-info[data-v-a1097356]{color:#84848a;display:flex;align-items:center;gap:8px;margin-bottom:16px}.build-info .icon[data-v-a1097356]{color:#60a5fa;font-size:12px}.chat-input-area[data-v-a1097356]{border-top:1px solid #1e1e1e;padding:12px 16px;background:#121212;display:flex;flex-direction:column;gap:8px;flex-shrink:0}.input-area[data-v-a1097356]{width:100%}.input-actions[data-v-a1097356]{display:flex;justify-content:flex-end;gap:8px}.send-btn[data-v-a1097356],.stop-btn[data-v-a1097356]{height:auto}.status-bar[data-v-a1097356]{display:flex;gap:8px;align-items:center;padding:6px 16px;font-size:12px;color:#84848a;border-top:1px solid #1e1e1e;flex-shrink:0;flex-wrap:wrap;background:#0a0a09}.status-bar .separator[data-v-a1097356]{color:#3f3f46}.status-ready[data-v-a1097356]{color:#22c55e}.status-thinking[data-v-a1097356]{color:#60a5fa}.token-warning[data-v-a1097356]{color:#ef4444}.compaction-info[data-v-a1097356]{color:#22c55e;margin-left:8px}.model-selector[data-v-a1097356]{cursor:pointer}.model-selector[data-v-a1097356]:hover{color:#60a5fa}.status-action[data-v-a1097356]{cursor:pointer}.status-action[data-v-a1097356]:hover{color:#60a5fa}.system-message[data-v-a1097356]{color:#a78bfa;font-size:13px;margin-bottom:16px;padding:8px 12px;background:#1e1e1e;border-radius:6px}.step4-container[data-v-407d40b9]{height:100%;display:flex;flex-direction:column}.step4-main[data-v-407d40b9]{flex:1;overflow:hidden;padding:16px}.code-chat-panel[data-v-407d40b9]{height:100%;background:#121212;border:1px solid #1e1e1e;border-radius:8px;overflow:hidden;display:flex;flex-direction:column}.panel-header[data-v-407d40b9]{background:#121212;border-bottom:1px solid #1e1e1e;padding:12px 16px;font-size:14px;font-weight:500;color:#f4f4f5;display:flex;align-items:center;justify-content:space-between;flex-shrink:0}.chat-messages[data-v-407d40b9]{flex:1;overflow-y:auto;padding:0 16px 16px;font-size:14px;line-height:1.6}.empty-state[data-v-407d40b9]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:#84848a}.empty-state i[data-v-407d40b9]{font-size:48px;margin-bottom:16px;opacity:.5}.todos-list[data-v-407d40b9]{margin-bottom:16px;color:#d4d4d8}.todo-item[data-v-407d40b9]{display:flex;align-items:center;gap:8px;padding:2px 0}.todo-status[data-v-407d40b9],.todo-name[data-v-407d40b9]{font-size:14px}.user-question[data-v-407d40b9]{color:#60a5fa;font-weight:700;margin-bottom:16px}.user-question[data-v-407d40b9] p{color:#d4d4d8;font-weight:400;margin:0 0 8px;font-size:14px;line-height:1.6}.user-question[data-v-407d40b9] strong{color:#fff}.user-question[data-v-407d40b9] code{background:#27272a;padding:2px 6px;border-radius:4px;color:#60a5fa;font-size:13px}.user-question[data-v-407d40b9] pre{background:#1e1e1e;padding:12px;border-radius:6px;overflow-x:auto;margin:8px 0;font-size:13px}.user-question[data-v-407d40b9] ul,.user-question[data-v-407d40b9] ol{margin:8px 0;padding-left:20px;color:#d4d4d8}.user-question[data-v-407d40b9] li{margin:4px 0;color:#d4d4d8}.user-question[data-v-407d40b9] h1,.user-question[data-v-407d40b9] h2,.user-question[data-v-407d40b9] h3{color:#fff;margin:12px 0 8px}.user-question[data-v-407d40b9] h1{font-size:20px}.user-question[data-v-407d40b9] h2{font-size:18px}.user-question[data-v-407d40b9] h3{font-size:16px}.user-question[data-v-407d40b9] table{border-collapse:collapse;margin:8px 0;width:100%}.user-question[data-v-407d40b9] th,.user-question[data-v-407d40b9] td{border:1px solid #3f3f46;padding:6px 10px;color:#d4d4d8}.user-question[data-v-407d40b9] th{background:#1e1e1e;color:#fff}.user-question[data-v-407d40b9] blockquote{border-left:3px solid #409EFF;padding-left:12px;margin:8px 0;color:#a1a1aa}.user-question[data-v-407d40b9] hr{border:none;border-top:1px solid #3f3f46;margin:12px 0}.ai-thought[data-v-407d40b9]{color:#d4d4d8;margin-bottom:16px;font-size:14px;line-height:1.6}.ai-thought[data-v-407d40b9] p{margin:0 0 8px}.ai-thought[data-v-407d40b9] strong{color:#fff}.ai-thought[data-v-407d40b9] code{background:#27272a;padding:2px 6px;border-radius:4px;color:#60a5fa;font-size:13px}.ai-thought[data-v-407d40b9] pre{background:#1e1e1e;padding:12px;border-radius:6px;overflow-x:auto;margin:8px 0}.ai-thought[data-v-407d40b9] ul,.ai-thought[data-v-407d40b9] ol{margin:8px 0;padding-left:20px}.ai-thought[data-v-407d40b9] li{margin:4px 0}.ai-thought[data-v-407d40b9] h1,.ai-thought[data-v-407d40b9] h2,.ai-thought[data-v-407d40b9] h3{color:#fff;margin:12px 0 8px}.ai-thought[data-v-407d40b9] table{border-collapse:collapse;margin:8px 0;width:100%}.ai-thought[data-v-407d40b9] th,.ai-thought[data-v-407d40b9] td{border:1px solid #3f3f46;padding:6px 10px}.ai-thought[data-v-407d40b9] th{background:#1e1e1e}.ai-thought[data-v-407d40b9] blockquote{border-left:3px solid #409EFF;padding-left:12px;margin:8px 0;color:#a1a1aa}.log-mute[data-v-407d40b9]{color:#84848a;margin-bottom:16px;white-space:pre}.tool-success[data-v-407d40b9]{color:#22c55e}.tool-fail[data-v-407d40b9]{color:#ef4444}.tool-input[data-v-407d40b9]{color:#60a5fa;margin-left:8px}.build-info[data-v-407d40b9]{color:#84848a;display:flex;align-items:center;gap:8px;margin-bottom:16px}.build-info .icon[data-v-407d40b9]{color:#60a5fa;font-size:12px}.chat-input-area[data-v-407d40b9]{border-top:1px solid #1e1e1e;padding:12px 16px;background:#121212;display:flex;flex-direction:column;gap:8px;flex-shrink:0}.input-area[data-v-407d40b9]{width:100%}.input-actions[data-v-407d40b9]{display:flex;justify-content:flex-end;gap:8px}.send-btn[data-v-407d40b9],.stop-btn[data-v-407d40b9]{height:auto}.status-bar[data-v-407d40b9]{display:flex;gap:8px;align-items:center;padding:6px 16px;font-size:12px;color:#84848a;border-top:1px solid #1e1e1e;flex-shrink:0;flex-wrap:wrap;background:#0a0a09}.status-bar .separator[data-v-407d40b9]{color:#3f3f46}.status-ready[data-v-407d40b9]{color:#22c55e}.status-thinking[data-v-407d40b9]{color:#60a5fa}.token-warning[data-v-407d40b9]{color:#ef4444}.compaction-info[data-v-407d40b9]{color:#22c55e;margin-left:8px}.model-selector[data-v-407d40b9]{cursor:pointer}.model-selector[data-v-407d40b9]:hover{color:#60a5fa}.status-action[data-v-407d40b9]{cursor:pointer}.status-action[data-v-407d40b9]:hover{color:#60a5fa}.system-message[data-v-407d40b9]{color:#a78bfa;font-size:13px;margin-bottom:16px;padding:8px 12px;background:#1e1e1e;border-radius:6px}.dev-workflow-view[data-v-fb0d8a90]{display:flex;height:100%;overflow:hidden;background:#0a0a09}.main-content[data-v-fb0d8a90]{flex:1;display:flex;flex-direction:column;overflow:hidden}.panel-header[data-v-fb0d8a90]{background:#121212;border-bottom:1px solid #1e1e1e;padding:12px 24px;display:flex;align-items:center;justify-content:space-between;flex-shrink:0}.panel-title[data-v-fb0d8a90]{font-size:16px;font-weight:500;color:#f4f4f5}.panel-actions[data-v-fb0d8a90]{display:flex;gap:12px}.step-content[data-v-fb0d8a90]{flex:1;overflow:hidden}.status-bar[data-v-fb0d8a90]{background:#121212;border-top:1px solid #1e1e1e;padding:8px 24px;font-size:12px;color:#84848a;display:flex;align-items:center;justify-content:space-between;flex-shrink:0}
1
+ .workflow-sidebar[data-v-8e3cf2bb]{width:280px;background:#2d2d2d;border-right:1px solid #1e1e1e;display:flex;flex-direction:column;flex-shrink:0}.sidebar-header[data-v-8e3cf2bb]{padding:16px;border-bottom:1px solid #1e1e1e}.sidebar-header h3[data-v-8e3cf2bb]{font-size:14px;color:#84848a;margin-bottom:12px}.sidebar-header .el-select[data-v-8e3cf2bb]{width:100%;margin-bottom:8px}.project-display-row[data-v-8e3cf2bb]{display:flex;justify-content:space-between;gap:8px;margin-bottom:8px;padding:8px 10px;background:#ffffff0a;border:1px solid #3f3f46;border-radius:6px}.project-display-row .label[data-v-8e3cf2bb]{color:#84848a;font-size:12px}.project-display-row .value[data-v-8e3cf2bb]{color:#d4d4d8;font-size:12px;max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.step-list[data-v-8e3cf2bb]{flex:1;overflow-y:auto;padding:16px}.step-item[data-v-8e3cf2bb]{display:flex;align-items:center;gap:12px;padding:14px 16px;border-radius:8px;margin-bottom:8px;cursor:pointer;transition:all .2s;border:1px solid transparent}.step-item[data-v-8e3cf2bb]:hover{background:#ffffff0d}.step-item.active[data-v-8e3cf2bb]{background:#409eff26;border-color:#409eff}.step-item.completed .step-icon[data-v-8e3cf2bb]{background:#22c55e}.step-item.active .step-icon[data-v-8e3cf2bb]{background:#409eff}.step-icon[data-v-8e3cf2bb]{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:14px;color:#fff;flex-shrink:0}.step-info[data-v-8e3cf2bb]{flex:1}.step-title[data-v-8e3cf2bb]{font-size:14px;font-weight:500;margin-bottom:2px;color:#f4f4f5}.step-desc[data-v-8e3cf2bb]{font-size:12px;color:#84848a}.step-status[data-v-8e3cf2bb]{font-size:14px}.step1-container[data-v-bf976168]{height:100%;padding:24px;overflow:hidden}.step1-main[data-v-bf976168]{max-width:600px;margin:0 auto}.panel-section[data-v-bf976168]{background:#121212;border:1px solid #1e1e1e;border-radius:8px;overflow:hidden}.panel-section-header[data-v-bf976168]{background:#121212;border-bottom:1px solid #1e1e1e;padding:12px 16px;font-size:14px;font-weight:500;display:flex;align-items:center;justify-content:space-between;color:#f4f4f5}.panel-section-header .el-button[data-v-bf976168]{padding:4px 8px;font-size:12px}.panel-section-body[data-v-bf976168]{padding:24px}.form-hint[data-v-bf976168]{font-size:12px;color:#84848a;margin-top:8px}.form-hint code[data-v-bf976168]{background:#18191b;padding:2px 6px;border-radius:4px;font-family:ui-monospace,monospace;color:#409eff}.flex[data-v-bf976168]{display:flex}.gap-2[data-v-bf976168]{gap:8px}.step2-container[data-v-24f603b8]{height:100%;display:flex;flex-direction:column}.step2-main[data-v-24f603b8]{display:flex;flex:1;gap:16px;overflow:hidden;padding:16px}.editor-panel[data-v-24f603b8]{flex:1;min-width:300px;background:#121212;border:1px solid #1e1e1e;border-radius:8px;overflow:hidden;display:flex;flex-direction:column}.editor-header[data-v-24f603b8]{background:#121212;border-bottom:1px solid #1e1e1e;padding:12px 16px;font-size:13px;color:#84848a;display:flex;align-items:center;gap:8px}.editor-container[data-v-24f603b8]{flex:1;min-height:0}.chat-panel[data-v-24f603b8]{width:480px;background:#121212;border:1px solid #1e1e1e;border-radius:8px;overflow:hidden;display:flex;flex-direction:column;flex-shrink:0}.panel-header[data-v-24f603b8]{background:#121212;border-bottom:1px solid #1e1e1e;padding:12px 16px;font-size:14px;font-weight:500;color:#f4f4f5;flex-shrink:0}.chat-messages[data-v-24f603b8]{flex:1;overflow-y:auto;padding:0 16px 16px;font-size:14px;line-height:1.6}.empty-state[data-v-24f603b8]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:#84848a}.empty-state i[data-v-24f603b8]{font-size:48px;margin-bottom:16px;opacity:.5}.todos-list[data-v-24f603b8]{margin-bottom:16px;color:#d4d4d8}.todo-item[data-v-24f603b8]{display:flex;align-items:center;gap:8px;padding:2px 0}.todo-status[data-v-24f603b8],.todo-name[data-v-24f603b8]{font-size:14px}.user-question[data-v-24f603b8]{color:#60a5fa;font-weight:700;margin-bottom:16px}.user-question[data-v-24f603b8] p{color:#d4d4d8;font-weight:400;margin:0 0 8px;font-size:14px;line-height:1.6}.user-question[data-v-24f603b8] strong{color:#fff}.user-question[data-v-24f603b8] code{background:#27272a;padding:2px 6px;border-radius:4px;color:#60a5fa;font-size:13px}.user-question[data-v-24f603b8] pre{background:#1e1e1e;padding:12px;border-radius:6px;overflow-x:auto;margin:8px 0;font-size:13px}.user-question[data-v-24f603b8] ul,.user-question[data-v-24f603b8] ol{margin:8px 0;padding-left:20px;color:#d4d4d8}.user-question[data-v-24f603b8] li{margin:4px 0;color:#d4d4d8}.user-question[data-v-24f603b8] h1,.user-question[data-v-24f603b8] h2,.user-question[data-v-24f603b8] h3{color:#fff;margin:12px 0 8px}.user-question[data-v-24f603b8] h1{font-size:20px}.user-question[data-v-24f603b8] h2{font-size:18px}.user-question[data-v-24f603b8] h3{font-size:16px}.user-question[data-v-24f603b8] table{border-collapse:collapse;margin:8px 0;width:100%}.user-question[data-v-24f603b8] th,.user-question[data-v-24f603b8] td{border:1px solid #3f3f46;padding:6px 10px;color:#d4d4d8}.user-question[data-v-24f603b8] th{background:#1e1e1e;color:#fff}.user-question[data-v-24f603b8] blockquote{border-left:3px solid #409EFF;padding-left:12px;margin:8px 0;color:#a1a1aa}.user-question[data-v-24f603b8] hr{border:none;border-top:1px solid #3f3f46;margin:12px 0}.ai-thought[data-v-24f603b8]{color:#d4d4d8;margin-bottom:16px;font-size:14px;line-height:1.6}.ai-thought[data-v-24f603b8] p{margin:0 0 8px}.ai-thought[data-v-24f603b8] strong{color:#fff}.ai-thought[data-v-24f603b8] code{background:#27272a;padding:2px 6px;border-radius:4px;color:#60a5fa;font-size:13px}.ai-thought[data-v-24f603b8] pre{background:#1e1e1e;padding:12px;border-radius:6px;overflow-x:auto;margin:8px 0}.ai-thought[data-v-24f603b8] ul,.ai-thought[data-v-24f603b8] ol{margin:8px 0;padding-left:20px}.ai-thought[data-v-24f603b8] li{margin:4px 0}.ai-thought[data-v-24f603b8] h1,.ai-thought[data-v-24f603b8] h2,.ai-thought[data-v-24f603b8] h3{color:#fff;margin:12px 0 8px}.ai-thought[data-v-24f603b8] table{border-collapse:collapse;margin:8px 0;width:100%}.ai-thought[data-v-24f603b8] th,.ai-thought[data-v-24f603b8] td{border:1px solid #3f3f46;padding:6px 10px}.ai-thought[data-v-24f603b8] th{background:#1e1e1e}.ai-thought[data-v-24f603b8] blockquote{border-left:3px solid #409EFF;padding-left:12px;margin:8px 0;color:#a1a1aa}.log-mute[data-v-24f603b8]{color:#84848a;margin-bottom:16px;white-space:pre}.tool-success[data-v-24f603b8]{color:#22c55e}.tool-fail[data-v-24f603b8]{color:#ef4444}.tool-input[data-v-24f603b8]{color:#60a5fa;margin-left:8px}.build-info[data-v-24f603b8]{color:#84848a;display:flex;align-items:center;gap:8px;margin-bottom:16px}.build-info .icon[data-v-24f603b8]{color:#60a5fa;font-size:12px}.chat-input-area[data-v-24f603b8]{border-top:1px solid #1e1e1e;padding:12px 16px;background:#121212;display:flex;flex-direction:column;gap:8px;flex-shrink:0}.input-area[data-v-24f603b8]{width:100%}.input-actions[data-v-24f603b8]{display:flex;justify-content:flex-end;gap:8px}.send-btn[data-v-24f603b8],.stop-btn[data-v-24f603b8]{height:auto}.status-bar[data-v-24f603b8]{display:flex;gap:8px;align-items:center;padding:6px 16px;font-size:12px;color:#84848a;border-top:1px solid #1e1e1e;flex-shrink:0;flex-wrap:wrap;background:#0a0a09}.status-bar .separator[data-v-24f603b8]{color:#3f3f46}.status-ready[data-v-24f603b8]{color:#22c55e}.status-thinking[data-v-24f603b8]{color:#60a5fa}.token-warning[data-v-24f603b8]{color:#ef4444}.compaction-info[data-v-24f603b8]{color:#22c55e;margin-left:8px}.model-selector[data-v-24f603b8]{cursor:pointer}.model-selector[data-v-24f603b8]:hover{color:#60a5fa}.status-action[data-v-24f603b8]{cursor:pointer}.status-action[data-v-24f603b8]:hover{color:#60a5fa}.system-message[data-v-24f603b8]{color:#a78bfa;font-size:13px;margin-bottom:16px;padding:8px 12px;background:#1e1e1e;border-radius:6px}.step3-container[data-v-a1097356]{height:100%;display:flex;flex-direction:column}.step3-main[data-v-a1097356]{flex:1;overflow:hidden;padding:16px}.code-chat-panel[data-v-a1097356]{height:100%;background:#121212;border:1px solid #1e1e1e;border-radius:8px;overflow:hidden;display:flex;flex-direction:column}.panel-header[data-v-a1097356]{background:#121212;border-bottom:1px solid #1e1e1e;padding:12px 16px;font-size:14px;font-weight:500;color:#f4f4f5;display:flex;align-items:center;justify-content:space-between;flex-shrink:0}.chat-messages[data-v-a1097356]{flex:1;overflow-y:auto;padding:0 16px 16px;font-size:14px;line-height:1.6}.empty-state[data-v-a1097356]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:#84848a}.empty-state i[data-v-a1097356]{font-size:48px;margin-bottom:16px;opacity:.5}.todos-list[data-v-a1097356]{margin-bottom:16px;color:#d4d4d8}.todo-item[data-v-a1097356]{display:flex;align-items:center;gap:8px;padding:2px 0}.todo-status[data-v-a1097356],.todo-name[data-v-a1097356]{font-size:14px}.user-question[data-v-a1097356]{color:#60a5fa;font-weight:700;margin-bottom:16px}.user-question[data-v-a1097356] p{color:#d4d4d8;font-weight:400;margin:0 0 8px;font-size:14px;line-height:1.6}.user-question[data-v-a1097356] strong{color:#fff}.user-question[data-v-a1097356] code{background:#27272a;padding:2px 6px;border-radius:4px;color:#60a5fa;font-size:13px}.user-question[data-v-a1097356] pre{background:#1e1e1e;padding:12px;border-radius:6px;overflow-x:auto;margin:8px 0;font-size:13px}.user-question[data-v-a1097356] ul,.user-question[data-v-a1097356] ol{margin:8px 0;padding-left:20px;color:#d4d4d8}.user-question[data-v-a1097356] li{margin:4px 0;color:#d4d4d8}.user-question[data-v-a1097356] h1,.user-question[data-v-a1097356] h2,.user-question[data-v-a1097356] h3{color:#fff;margin:12px 0 8px}.user-question[data-v-a1097356] h1{font-size:20px}.user-question[data-v-a1097356] h2{font-size:18px}.user-question[data-v-a1097356] h3{font-size:16px}.user-question[data-v-a1097356] table{border-collapse:collapse;margin:8px 0;width:100%}.user-question[data-v-a1097356] th,.user-question[data-v-a1097356] td{border:1px solid #3f3f46;padding:6px 10px;color:#d4d4d8}.user-question[data-v-a1097356] th{background:#1e1e1e;color:#fff}.user-question[data-v-a1097356] blockquote{border-left:3px solid #409EFF;padding-left:12px;margin:8px 0;color:#a1a1aa}.user-question[data-v-a1097356] hr{border:none;border-top:1px solid #3f3f46;margin:12px 0}.ai-thought[data-v-a1097356]{color:#d4d4d8;margin-bottom:16px;font-size:14px;line-height:1.6}.ai-thought[data-v-a1097356] p{margin:0 0 8px}.ai-thought[data-v-a1097356] strong{color:#fff}.ai-thought[data-v-a1097356] code{background:#27272a;padding:2px 6px;border-radius:4px;color:#60a5fa;font-size:13px}.ai-thought[data-v-a1097356] pre{background:#1e1e1e;padding:12px;border-radius:6px;overflow-x:auto;margin:8px 0}.ai-thought[data-v-a1097356] ul,.ai-thought[data-v-a1097356] ol{margin:8px 0;padding-left:20px}.ai-thought[data-v-a1097356] li{margin:4px 0}.ai-thought[data-v-a1097356] h1,.ai-thought[data-v-a1097356] h2,.ai-thought[data-v-a1097356] h3{color:#fff;margin:12px 0 8px}.ai-thought[data-v-a1097356] table{border-collapse:collapse;margin:8px 0;width:100%}.ai-thought[data-v-a1097356] th,.ai-thought[data-v-a1097356] td{border:1px solid #3f3f46;padding:6px 10px}.ai-thought[data-v-a1097356] th{background:#1e1e1e}.ai-thought[data-v-a1097356] blockquote{border-left:3px solid #409EFF;padding-left:12px;margin:8px 0;color:#a1a1aa}.log-mute[data-v-a1097356]{color:#84848a;margin-bottom:16px;white-space:pre}.tool-success[data-v-a1097356]{color:#22c55e}.tool-fail[data-v-a1097356]{color:#ef4444}.tool-input[data-v-a1097356]{color:#60a5fa;margin-left:8px}.build-info[data-v-a1097356]{color:#84848a;display:flex;align-items:center;gap:8px;margin-bottom:16px}.build-info .icon[data-v-a1097356]{color:#60a5fa;font-size:12px}.chat-input-area[data-v-a1097356]{border-top:1px solid #1e1e1e;padding:12px 16px;background:#121212;display:flex;flex-direction:column;gap:8px;flex-shrink:0}.input-area[data-v-a1097356]{width:100%}.input-actions[data-v-a1097356]{display:flex;justify-content:flex-end;gap:8px}.send-btn[data-v-a1097356],.stop-btn[data-v-a1097356]{height:auto}.status-bar[data-v-a1097356]{display:flex;gap:8px;align-items:center;padding:6px 16px;font-size:12px;color:#84848a;border-top:1px solid #1e1e1e;flex-shrink:0;flex-wrap:wrap;background:#0a0a09}.status-bar .separator[data-v-a1097356]{color:#3f3f46}.status-ready[data-v-a1097356]{color:#22c55e}.status-thinking[data-v-a1097356]{color:#60a5fa}.token-warning[data-v-a1097356]{color:#ef4444}.compaction-info[data-v-a1097356]{color:#22c55e;margin-left:8px}.model-selector[data-v-a1097356]{cursor:pointer}.model-selector[data-v-a1097356]:hover{color:#60a5fa}.status-action[data-v-a1097356]{cursor:pointer}.status-action[data-v-a1097356]:hover{color:#60a5fa}.system-message[data-v-a1097356]{color:#a78bfa;font-size:13px;margin-bottom:16px;padding:8px 12px;background:#1e1e1e;border-radius:6px}.step4-container[data-v-407d40b9]{height:100%;display:flex;flex-direction:column}.step4-main[data-v-407d40b9]{flex:1;overflow:hidden;padding:16px}.code-chat-panel[data-v-407d40b9]{height:100%;background:#121212;border:1px solid #1e1e1e;border-radius:8px;overflow:hidden;display:flex;flex-direction:column}.panel-header[data-v-407d40b9]{background:#121212;border-bottom:1px solid #1e1e1e;padding:12px 16px;font-size:14px;font-weight:500;color:#f4f4f5;display:flex;align-items:center;justify-content:space-between;flex-shrink:0}.chat-messages[data-v-407d40b9]{flex:1;overflow-y:auto;padding:0 16px 16px;font-size:14px;line-height:1.6}.empty-state[data-v-407d40b9]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:#84848a}.empty-state i[data-v-407d40b9]{font-size:48px;margin-bottom:16px;opacity:.5}.todos-list[data-v-407d40b9]{margin-bottom:16px;color:#d4d4d8}.todo-item[data-v-407d40b9]{display:flex;align-items:center;gap:8px;padding:2px 0}.todo-status[data-v-407d40b9],.todo-name[data-v-407d40b9]{font-size:14px}.user-question[data-v-407d40b9]{color:#60a5fa;font-weight:700;margin-bottom:16px}.user-question[data-v-407d40b9] p{color:#d4d4d8;font-weight:400;margin:0 0 8px;font-size:14px;line-height:1.6}.user-question[data-v-407d40b9] strong{color:#fff}.user-question[data-v-407d40b9] code{background:#27272a;padding:2px 6px;border-radius:4px;color:#60a5fa;font-size:13px}.user-question[data-v-407d40b9] pre{background:#1e1e1e;padding:12px;border-radius:6px;overflow-x:auto;margin:8px 0;font-size:13px}.user-question[data-v-407d40b9] ul,.user-question[data-v-407d40b9] ol{margin:8px 0;padding-left:20px;color:#d4d4d8}.user-question[data-v-407d40b9] li{margin:4px 0;color:#d4d4d8}.user-question[data-v-407d40b9] h1,.user-question[data-v-407d40b9] h2,.user-question[data-v-407d40b9] h3{color:#fff;margin:12px 0 8px}.user-question[data-v-407d40b9] h1{font-size:20px}.user-question[data-v-407d40b9] h2{font-size:18px}.user-question[data-v-407d40b9] h3{font-size:16px}.user-question[data-v-407d40b9] table{border-collapse:collapse;margin:8px 0;width:100%}.user-question[data-v-407d40b9] th,.user-question[data-v-407d40b9] td{border:1px solid #3f3f46;padding:6px 10px;color:#d4d4d8}.user-question[data-v-407d40b9] th{background:#1e1e1e;color:#fff}.user-question[data-v-407d40b9] blockquote{border-left:3px solid #409EFF;padding-left:12px;margin:8px 0;color:#a1a1aa}.user-question[data-v-407d40b9] hr{border:none;border-top:1px solid #3f3f46;margin:12px 0}.ai-thought[data-v-407d40b9]{color:#d4d4d8;margin-bottom:16px;font-size:14px;line-height:1.6}.ai-thought[data-v-407d40b9] p{margin:0 0 8px}.ai-thought[data-v-407d40b9] strong{color:#fff}.ai-thought[data-v-407d40b9] code{background:#27272a;padding:2px 6px;border-radius:4px;color:#60a5fa;font-size:13px}.ai-thought[data-v-407d40b9] pre{background:#1e1e1e;padding:12px;border-radius:6px;overflow-x:auto;margin:8px 0}.ai-thought[data-v-407d40b9] ul,.ai-thought[data-v-407d40b9] ol{margin:8px 0;padding-left:20px}.ai-thought[data-v-407d40b9] li{margin:4px 0}.ai-thought[data-v-407d40b9] h1,.ai-thought[data-v-407d40b9] h2,.ai-thought[data-v-407d40b9] h3{color:#fff;margin:12px 0 8px}.ai-thought[data-v-407d40b9] table{border-collapse:collapse;margin:8px 0;width:100%}.ai-thought[data-v-407d40b9] th,.ai-thought[data-v-407d40b9] td{border:1px solid #3f3f46;padding:6px 10px}.ai-thought[data-v-407d40b9] th{background:#1e1e1e}.ai-thought[data-v-407d40b9] blockquote{border-left:3px solid #409EFF;padding-left:12px;margin:8px 0;color:#a1a1aa}.log-mute[data-v-407d40b9]{color:#84848a;margin-bottom:16px;white-space:pre}.tool-success[data-v-407d40b9]{color:#22c55e}.tool-fail[data-v-407d40b9]{color:#ef4444}.tool-input[data-v-407d40b9]{color:#60a5fa;margin-left:8px}.build-info[data-v-407d40b9]{color:#84848a;display:flex;align-items:center;gap:8px;margin-bottom:16px}.build-info .icon[data-v-407d40b9]{color:#60a5fa;font-size:12px}.chat-input-area[data-v-407d40b9]{border-top:1px solid #1e1e1e;padding:12px 16px;background:#121212;display:flex;flex-direction:column;gap:8px;flex-shrink:0}.input-area[data-v-407d40b9]{width:100%}.input-actions[data-v-407d40b9]{display:flex;justify-content:flex-end;gap:8px}.send-btn[data-v-407d40b9],.stop-btn[data-v-407d40b9]{height:auto}.status-bar[data-v-407d40b9]{display:flex;gap:8px;align-items:center;padding:6px 16px;font-size:12px;color:#84848a;border-top:1px solid #1e1e1e;flex-shrink:0;flex-wrap:wrap;background:#0a0a09}.status-bar .separator[data-v-407d40b9]{color:#3f3f46}.status-ready[data-v-407d40b9]{color:#22c55e}.status-thinking[data-v-407d40b9]{color:#60a5fa}.token-warning[data-v-407d40b9]{color:#ef4444}.compaction-info[data-v-407d40b9]{color:#22c55e;margin-left:8px}.model-selector[data-v-407d40b9]{cursor:pointer}.model-selector[data-v-407d40b9]:hover{color:#60a5fa}.status-action[data-v-407d40b9]{cursor:pointer}.status-action[data-v-407d40b9]:hover{color:#60a5fa}.system-message[data-v-407d40b9]{color:#a78bfa;font-size:13px;margin-bottom:16px;padding:8px 12px;background:#1e1e1e;border-radius:6px}.dev-workflow-view[data-v-3052e4a8]{display:flex;height:100%;overflow:hidden;background:#0a0a09}.main-content[data-v-3052e4a8]{flex:1;display:flex;flex-direction:column;overflow:hidden}.panel-header[data-v-3052e4a8]{background:#121212;border-bottom:1px solid #1e1e1e;padding:12px 24px;display:flex;align-items:center;justify-content:space-between;flex-shrink:0}.panel-title[data-v-3052e4a8]{font-size:16px;font-weight:500;color:#f4f4f5}.panel-actions[data-v-3052e4a8]{display:flex;gap:12px}.step-content[data-v-3052e4a8]{flex:1;overflow:hidden}.status-bar[data-v-3052e4a8]{background:#121212;border-top:1px solid #1e1e1e;padding:8px 24px;font-size:12px;color:#84848a;display:flex;align-items:center;justify-content:space-between;flex-shrink:0}