aitable-workflow-cli 0.1.18-beta.1787714956535 → 0.1.18

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.
@@ -5,8 +5,8 @@
5
5
  <link rel="icon" type="image/svg+xml" href="/icon.svg" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <title>aitable-workflow · AI 工作流编排</title>
8
- <script type="module" crossorigin src="/assets/index-lunKPh4A.js"></script>
9
- <link rel="stylesheet" crossorigin href="/assets/index-DQw7NZad.css">
8
+ <script type="module" crossorigin src="/assets/index-R-6AMiob.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-OEpyipM4.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aitable-workflow-cli",
3
- "version": "0.1.18-beta.1787714956535",
3
+ "version": "0.1.18",
4
4
  "description": "aitable-workflow 命令行工具(cli):init/design/setup/run/serve 等命令;含 relay 本地反连客户端与 daemon 进程管理。bin: aitable-workflow。",
5
5
  "type": "module",
6
6
  "bin": {
@@ -19,8 +19,8 @@
19
19
  "access": "public"
20
20
  },
21
21
  "dependencies": {
22
- "aitable-workflow-core": "0.1.18-beta.1787714956535",
23
- "aitable-workflow-server": "0.1.18-beta.1787714956535",
22
+ "aitable-workflow-core": "0.1.18",
23
+ "aitable-workflow-server": "0.1.18",
24
24
  "@inquirer/prompts": "^8.5.2",
25
25
  "commander": "^14.0.2",
26
26
  "dotenv": "^17.4.2",
@@ -1,15 +0,0 @@
1
- import{o as ce,q as le}from"./chunk-XGHRD4FJ.js";import{a as l}from"./chunk-EI7MMDWY.js";import{createServer as zt}from"http";import{stat as Qe,readFile as ne,mkdir as oe,writeFile as be,rm as Vt}from"fs/promises";import{createReadStream as Zt,existsSync as Xe,unlinkSync as Qt}from"fs";import I from"path";import{fileURLToPath as Xt}from"url";import rt from"crypto";import en from"os";import ke from"yaml";import{runCheck as M,resolveConfigPath as st,loadSettings as tn,detectCodingEngines as nn,loadWorkflowTemplate as on,collectEnvRefs as rn,applyConfigSave as sn,ConfigSaveError as an,runSetupCommand as cn,resolveInsideRoot as Se,assertPortableId as et}from"aitable-workflow-core";import{mkdir as St,readFile as H,writeFile as vt}from"fs/promises";import N from"path";import D from"yaml";import{BotProvisioner as It,BotProvisionError as Ce,DwsClient as me,DwsDevRunner as Ee,fetchFields as we,loadSettings as xe,loadWorkflowTemplate as Rt,listDwsConversations as Tt,readState as Ct,resetProfileCache as ye,runCommand as Et,setupKnowledgeBases as xt,writeBack as Q,assertPortableId as Pt}from"aitable-workflow-core";import ue from"path";import{closeSync as gt,existsSync as Ie,openSync as ft}from"fs";import{createExecShellToolkit as pt,createStandaloneExecShellToolkit as mt,loadSettings as wt,logger as yt,resolveConfigPath as ht,spawnManagedProcess as bt}from"aitable-workflow-core";async function kt(e,o){let t=await ht(e);if(!Ie(t))return{shell:mt(o,{configDir:ue.dirname(t)}),mode:"standalone",bins:{},configPath:t};let n=await wt(e),r=n.raw?.toolkit_config?.shell??{};return{shell:pt(n,o),mode:"project",bins:r.bins??{},configPath:t}}l(kt,"createToolkitForExec");async function de(e,o,t){let n=ue.resolve(t.logFile),r=ue.dirname(n);if(!Ie(r))throw new Error(`\u65E5\u5FD7\u6587\u4EF6\u76EE\u5F55\u4E0D\u5B58\u5728\uFF1A${r}`);let s=t.bins?.[e]??e,a=ft(n,"w"),c;try{return c=bt({command:s,args:o,stdio:["ignore",a,a]}),await new Promise((d,f)=>{let g=c.child,h=l(S=>f(S),"onError");g.once("error",h),g.once("spawn",()=>{g.removeListener("error",h),d()})}),c.unref(),{pid:c.child.pid,logFile:n}}finally{gt(a)}}l(de,"runDetached");function Rn(e,o){e.command("exec").description("\u9003\u751F\u8231\uFF1A\u5728\u5B9E\u4F8B\u4E0A\u4E0B\u6587\u4E0B\u8BD5\u8DD1\u4E00\u6761\u547D\u4EE4\uFF08\u590D\u7528 shell toolkit \u7684 bins \u89E3\u6790/\u8D85\u65F6/\u8131\u654F\uFF09\uFF0C\u7528\u4E8E dws/git \u547D\u4EE4\u9762 smoke\u3002\u914D\u7F6E\u4E0D\u5B58\u5728\u65F6\u81EA\u52A8\u56DE\u9000\u65E0\u9879\u76EE\u6A21\u5F0F\u3002\u7528\u6CD5\uFF1Aaitable-workflow exec [-c <path>] [--json | --detach <file>] -- <bin> <args...>").option("-c, --config <path>","\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84",o.defaultConfig).option("--timeout <ms>","\u5355\u6B21\u6267\u884C\u8D85\u65F6\uFF08\u6BEB\u79D2\uFF09").option("--json","\u4EE5 runJson \u65B9\u5F0F\u6267\u884C\uFF1A\u8981\u6C42 exit=0 \u4E14 stdout \u4E3A\u5408\u6CD5 JSON\uFF0C\u6253\u5370\u89E3\u6790\u540E\u7684\u5BF9\u8C61").option("--detach <file>","\u540E\u53F0\u5206\u79BB\u8FD0\u884C\uFF1A\u547D\u4EE4\u8F93\u51FA\u5B9E\u65F6\u5199\u5165\u8BE5\u6587\u4EF6\u5E76\u7ACB\u5373\u8FD4\u56DE\uFF08\u65E0\u8D85\u65F6/\u91CD\u8BD5\uFF09\u3002\u9002\u5408 dws auth login --device \u7B49\u9700\u5728\u8FD0\u884C\u4E2D\u8BFB\u53D6\u8F93\u51FA\u7684\u6D41\u7A0B").allowUnknownOption().argument("<command...>","\u8981\u6267\u884C\u7684\u547D\u4EE4\u53CA\u53C2\u6570\uFF08\u5EFA\u8BAE\u7528 -- \u5206\u9694\uFF09\uFF0C\u5982\uFF1Adws chat group create --name x --format json").action(async(t,n)=>{try{let[r,...s]=t;r||(console.error("\u2717 \u672A\u63D0\u4F9B\u8981\u6267\u884C\u7684\u547D\u4EE4\uFF1B\u7528\u6CD5\uFF1Aaitable-workflow exec [-c <path>] -- <bin> <args...>"),process.exit(1));let a=n.timeout?Number.parseInt(n.timeout,10):void 0;a!==void 0&&(Number.isNaN(a)||a<=0)&&(console.error("\u2717 --timeout \u5FC5\u987B\u662F\u6B63\u6574\u6570\uFF08\u6BEB\u79D2\uFF09"),process.exit(1)),n.detach&&(n.json||a!==void 0)&&(console.error("\u2717 --detach \u4E0E --json / --timeout \u4E92\u65A5\uFF08\u5206\u79BB\u8FD0\u884C\u65E0\u8D85\u65F6\u4E0E JSON \u8BED\u4E49\uFF09"),process.exit(1)),n.json&&yt.setLevel("warn");let c=await kt(n.config,r);if(c.mode==="standalone"&&console.error("\u26A0\uFE0F \u672A\u627E\u5230\u914D\u7F6E\u6587\u4EF6\uFF0Cexec \u4EE5\u65E0\u9879\u76EE\u6A21\u5F0F\u8FD0\u884C\uFF08\u65E0 bins \u8986\u76D6/.env \u8131\u654F\uFF0C\u8D70\u9ED8\u8BA4\u8D85\u65F6\u4E0E\u9650\u989D\uFF09"),n.detach){let{pid:f,logFile:g}=await de(r,s,{bins:c.bins,logFile:n.detach});console.log(`\u2713 \u5DF2\u540E\u53F0\u542F\u52A8\uFF08pid ${f}\uFF09\uFF0C\u8F93\u51FA\u5B9E\u65F6\u5199\u5165\uFF1A${g}`),console.error("\u63D0\u793A\uFF1A\u5206\u79BB\u8FD0\u884C\u65E0\u8D85\u65F6\u4E0E\u91CD\u8BD5\u63A7\u5236\uFF0C\u7ED3\u679C\u4EE5\u65E5\u5FD7\u6587\u4EF6\u5185\u5BB9\u4E0E\u5B9E\u9645\u6548\u679C\u4E3A\u51C6\u3002");return}if(n.json){let f=await c.shell.runJson(r,s,{timeoutMs:a});console.log(JSON.stringify(f??{},null,2));return}let d=await c.shell.run(r,s,{timeoutMs:a});d.stdout&&process.stdout.write(d.stdout),d.stderr&&process.stderr.write(d.stderr),d.truncated&&console.error(`
2
- \u26A0\uFE0F \u8F93\u51FA\u56E0\u8D85\u8FC7\u4E0A\u9650\u88AB\u622A\u65AD`),process.exit(d.exitCode??0)}catch(r){console.error(`\u2717 exec \u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),process.exit(1)}})}l(Rn,"registerExecCommand");async function Pe(e={}){let o=e.list??Tt;try{let{conversations:t}=await o({role:"admin"});return{ok:!0,groups:t}}catch(t){return{ok:!1,message:t instanceof Error?t.message:String(t)}}}l(Pe,"listAdminGroups");async function Y(e,o){let t={};try{let c=await xe(e,{lenientEnv:!0});for(let d of c.workflowEntries)try{let g=(await Rt(d.templatePath,{envSource:c.envSource})).tracker;if(!g)continue;t[d.id]={baseId:String(g.base_id??"").trim(),tableId:String(g.table_id??"").trim(),...g.label?{label:String(g.label)}:{}}}catch{}}catch{}let n=await Oe(o),r=Object.values(t),s=Object.values(n);return{ok:!0,ready:r.length>0?r.every(c=>c.baseId&&c.tableId)&&s.every(c=>c.baseId&&c.tableId):r.some(c=>c.baseId&&c.tableId),trackers:t,configTables:n}}l(Y,"readSetupArtifacts");async function Oe(e){let o={},t=N.resolve(e,"profile","profile.yml"),n;try{n=D.parse(await H(t,"utf8"))}catch{return o}let r=v(n)?n.workflows:void 0;if(!v(r))return o;for(let s of Object.values(r)){let a=v(s)?s.steps:void 0;if(v(a)){for(let c of Object.values(a))if(v(c))for(let[d,f]of Object.entries(c)){if(!v(f))continue;let g="baseId"in f||"base_id"in f,h="tableId"in f||"table_id"in f;!g||!h||(o[d]={baseId:String(f.baseId??f.base_id??"").trim(),tableId:String(f.tableId??f.table_id??"").trim()})}}}return o}l(Oe,"readProfileConfigTables");var $="wiki/official-aitable-faq";async function Ot(e,o){let t=N.resolve(e,"profile","profile.yml"),n;try{n=D.parse(await H(t,"utf8"))}catch{return[]}let r=v(n)?n.roles:void 0,s=v(r)?r[o]:void 0,a=v(s)?s.knowledge_scope:void 0,c=v(a)?a.kb_collections:void 0;return Array.isArray(c)?c.map(d=>typeof d=="string"?d:v(d)&&typeof d.collection=="string"?d.collection:null).filter(d=>d!==null):[]}l(Ot,"readRoleCollections");function Re(e){if(D.isScalar(e))return typeof e.value=="string"?e.value:null;if(D.isMap(e)){let o=e.get("collection",!0);return D.isScalar(o)&&typeof o.value=="string"?o.value:null}return null}l(Re,"kbEntryValue");async function At(e,o,t){let n=N.resolve(e,"profile","profile.yml"),r;try{r=await H(n,"utf8")}catch{return{ok:!1,code:"KB_PROFILE_MISSING",message:"profile.yml \u4E0D\u5B58\u5728\uFF0C\u65E0\u6CD5\u5207\u6362\u5B98\u65B9\u77E5\u8BC6\u5E93",collections:[],changed:!1}}let s=D.parseDocument(r),a=s.getIn(["roles",o,"knowledge_scope","kb_collections"],!0);if(!D.isSeq(a))return{ok:!1,code:"KB_ROLE_NOT_FOUND",message:`profile.yml \u4E2D\u672A\u627E\u5230 roles.${o}.knowledge_scope.kb_collections\uFF0C\u65E0\u6CD5\u5207\u6362`,collections:[],changed:!1};let c=a.items.map(Re).filter(g=>g!==null),d=c.includes($),f=c.find(g=>g!==$)??null;if(t===d)return{ok:!0,message:t?"\u5B98\u65B9\u77E5\u8BC6\u5E93\u5DF2\u5904\u4E8E\u542F\u7528\u72B6\u6001":"\u5B98\u65B9\u77E5\u8BC6\u5E93\u5DF2\u5904\u4E8E\u5173\u95ED\u72B6\u6001",collections:c,changed:!1};if(!t&&!f)return{ok:!1,code:"KB_LAST_SOURCE",message:"\u5F53\u524D profile \u672A\u58F0\u660E\u7528\u6237\u5E93\uFF0C\u5173\u95ED\u5B98\u65B9\u5E93\u5C06\u5BFC\u81F4\u52A9\u624B\u65E0\u4EFB\u4F55\u77E5\u8BC6\u6765\u6E90",collections:c,changed:!1};if(t)a.add($);else{let g=a.items.findIndex(h=>Re(h)===$);g>=0&&a.delete(g)}return await vt(n,s.toString(),"utf8"),{ok:!0,message:t?"\u5DF2\u542F\u7528\u5B98\u65B9\u77E5\u8BC6\u5E93":"\u5DF2\u5173\u95ED\u5B98\u65B9\u77E5\u8BC6\u5E93",changed:!0,collections:t?[...c,$]:c.filter(g=>g!==$)}}l(At,"writeOfficialToggle");async function Ae(e,o,t,n){Pt(t,{label:"roleId"});let r=await At(o,t,n);if(!r.ok)return{...r,compile:void 0};ye();let s=n&&r.changed?Ne(e):void 0;return{...r,compile:s}}l(Ae,"setOfficialKbEnabled");function _e(e){return{ok:!0,...Ne(e)}}l(_e,"recompileKnowledgeBases");var ge=null;function Ne(e){return ge?{started:!1}:(ge=Nt(e).finally(()=>{ge=null}),{started:!0})}l(Ne,"triggerCompile");async function _t(e,o){let t={};for(let n of o){let r=await Ct(e,n);t[n]=r?{status:r.status,...typeof r.fileCount=="number"?{sourceCount:r.fileCount}:{},...typeof r.compiledCount=="number"?{articleCount:r.compiledCount}:{},...typeof r.finishedAt=="string"?{finishedAt:r.finishedAt}:{}}:{status:"unknown"}}return t}l(_t,"readKbStats");async function Nt(e){try{let o=await xe(e,{lenientEnv:!0}),t=await xt({settings:o});return{ok:!t.results.some(r=>r.action==="failed"),collections:t.collections,...t.skippedReason?{skippedReason:t.skippedReason}:{}}}catch(o){return{ok:!1,collections:[],skippedReason:o instanceof Error?o.message:String(o)}}}l(Nt,"recompileKb");async function X(e){let o=await ze(e),t={ok:!0,detected:!1,workflowId:null,eventSourceName:null,kbRoleId:null,kb:{userCollection:null,officialOn:!1,stats:{}},robot:{configured:!1,appKeys:[]},groups:[],groupBotsStaging:[],groupTableRef:null};if(!o)return t;let n=Gt(o),r=Bt(o),s=r?await Ot(e,r):[],a=n?T(T(o.workflows)?.[n.workflowId]):void 0,c=await Ut(e,T(T(a?.toolkit_config)?.messaging)),d=n?T(T(a?.event_sources)?.[n.eventSourceName]):void 0,g=(await Oe(e)).group_table??null;return{ok:!0,detected:!!n&&!!r,workflowId:n?.workflowId??null,eventSourceName:n?.eventSourceName??null,kbRoleId:r,kb:{userCollection:s.find(h=>h!==$)??null,officialOn:s.includes($),stats:await _t(e,s)},robot:{configured:c.length>0,appKeys:c},groups:qt(d?.conversation_ids),groupBotsStaging:await Dt(e,n?.workflowId??"group-qa"),groupTableRef:g}}l(X,"readConsoleState");function Gt(e){let o=T(e.workflows);if(!o)return null;for(let[t,n]of Object.entries(o)){let r=T(T(n)?.event_sources);if(r){for(let[s,a]of Object.entries(r))if(T(a)&&"conversation_ids"in a)return{workflowId:t,eventSourceName:s}}}return null}l(Gt,"locateGroupQa");function Bt(e){let o=T(e.roles);if(!o)return null;for(let[t,n]of Object.entries(o)){let r=T(T(n)?.knowledge_scope);if(Array.isArray(r?.kb_collections)&&r.kb_collections.length>0)return t}return null}l(Bt,"locateKbRole");var jt=/^\$\{env\.([A-Za-z_][A-Za-z0-9_]*)\??\}$/;function Ge(e){let o=e?.robot_creds;return typeof o!="string"?null:o.trim().match(jt)?.[1]??null}l(Ge,"robotEnvKey");async function Ut(e,o){let t=o?.robot_creds;if(v(t))return Object.keys(t);let n=Ge(o);if(!n)return[];let r=await Ye(e,n);if(!r)return[];try{let s=JSON.parse(r);return v(s)?Object.keys(s):[]}catch{return[]}}l(Ut,"readRobotAppKeys");async function Be(e,o,t){let n={};for(let c of t){let d=c.appKey.trim(),f=c.clientSecret.trim();!d||!f||(n[d]={client_id:c.clientId.trim()||d,client_secret:f})}if(Object.keys(n).length===0)return{ok:!1,message:"\u81F3\u5C11\u9700\u8981\u4E00\u7EC4\u5B8C\u6574\u7684\u673A\u5668\u4EBA\u51ED\u636E\uFF08AppKey + AppSecret\uFF09"};let r=await ze(e),s=T(T(r?.workflows)?.[o]),a=Ge(T(T(s?.toolkit_config)?.messaging));return a?(await Q({type:"env",file:".env",envKey:a},JSON.stringify(n),e),ye(),{ok:!0,message:`\u5DF2\u4FDD\u5B58 ${Object.keys(n).length} \u4E2A\u673A\u5668\u4EBA\u51ED\u636E`}):{ok:!1,message:`profile.workflows.${o}.toolkit_config.messaging.robot_creds \u9700\u8981\u5199\u6210 env \u5F15\u7528\uFF08\u5982 "\${env.DINGTALK_ROBOTS?}"\uFF09\u624D\u80FD\u7531\u672C\u9875\u5199\u5165\u51ED\u636E\uFF1B\u5BC6\u94A5\u4E0D\u843D profile.yml\u3002`}}l(Be,"writeRobotCreds");async function je(e,o,t,n){let r=[...new Set(n.map(d=>d.trim()).filter(Boolean))],s=r.join(`
3
- `),a=["workflows",o,"event_sources",t],c=N.join("profile","profile.yml");return await Q({type:"yaml",file:c,yamlPath:[...a,"conversation_ids"],valueType:"string[]"},s,e),await Q({type:"yaml",file:c,yamlPath:[...a,"handler_config","conversation_ids"],valueType:"string[]"},s,e),ye(),{ok:!0,message:r.length>0?`\u5DF2\u4FDD\u5B58 ${r.length} \u4E2A\u7FA4`:"\u5DF2\u6E05\u7A7A\u7FA4\u5217\u8868"}}l(je,"writeGroupList");var Ue="GROUP_BOTS_STAGING";async function ee(e){let o=await Ye(e,Ue);if(!o)return[];try{let t=JSON.parse(o);return Array.isArray(t)?t:[]}catch{return[]}}l(ee,"readGroupBotStagingRaw");async function $e(e,o){await Q({type:"env",file:".env",envKey:Ue},JSON.stringify(o),e)}l($e,"writeGroupBotStagingRaw");function $t(e){return e?e.type==="enterprise"?{type:"enterprise",appKey:e.appKey,...e.name?{name:e.name}:{}}:{type:"custom",name:e.name,webhookUrl:e.webhookUrl}:null}l($t,"maskBot");async function he(e,o,t){let n=t.conversationId.trim();if(!n)return{ok:!1,message:"conversationId \u5FC5\u586B"};let r=await ee(e),s=r.findIndex(d=>d.conversationId===n),a=r[s]??{conversationId:n,title:"",enabled:!0,bot:null},c={conversationId:n,title:t.title!==void 0?t.title:a.title,...t.groupType??a.groupType?{groupType:t.groupType??a.groupType}:{},...t.corpId??a.corpId?{corpId:t.corpId??a.corpId}:{},enabled:t.enabled!==void 0?t.enabled:a.enabled,bot:t.bot!==void 0?t.bot:a.bot};return s>=0?r[s]=c:r.push(c),await $e(e,r),{ok:!0,message:"\u5DF2\u4FDD\u5B58"}}l(he,"saveGroupBotStaging");async function Dt(e,o){return(await ee(e)).map(n=>({...n,bot:$t(n.bot)}))}l(Dt,"readGroupBotStaging");var fe="ai\u8868\u683C\u7FA4\u7B54\u7591\u52A9\u624B";function Te(e){return e instanceof Ce?`${e.guidance}
4
- \uFF08\u539F\u59CB\u9519\u8BEF\uFF1A${e.message}\uFF09`:e instanceof Error?e.message:String(e)}l(Te,"provisionErrorMessage");async function De(){try{return await new Ee().getCurrentCorpId()}catch{return}}l(De,"resolveCurrentCorpId");async function Ke(e,o,t,n={}){let r=n.provision??new It({runner:new Ee}),s=N.join(e,".env"),a;try{a=await r.resolveEnterpriseRobot({name:fe,desc:`${fe} - aitable-workflow`,envFile:s})}catch(d){return{ok:!1,message:Te(d)}}let c=!1;try{await r.addBotToGroup(a.appKey,t.conversationId)}catch(d){if(d instanceof Ce&&d.kind==="bot_already_installed")c=!0;else return{ok:!1,message:Te(d)}}return await he(e,o,{conversationId:t.conversationId,title:t.title,...t.groupType?{groupType:t.groupType}:{},corpId:a.corpId,enabled:!0,bot:{type:"enterprise",appKey:a.appKey,appSecret:a.appSecret,name:fe}}),{ok:!0,message:c?"\u8BE5\u7FA4\u5DF2\u5B89\u88C5\u8FC7\u6B64\u673A\u5668\u4EBA\uFF0C\u5DF2\u76F4\u63A5\u8BB0\u5F55\u914D\u7F6E":"\u673A\u5668\u4EBA\u5DF2\u52A0\u5165\u7FA4\u804A"}}l(Ke,"addEnterpriseBotToGroup");function Kt(e){let o=[];for(let t of e){if(!t.enabled||!t.bot)continue;let n={\u7FA4ID:t.conversationId,\u7FA4\u540D\u79F0:t.title,...t.groupType?{\u7FA4\u7C7B\u578B:t.groupType==="internal"?"\u5185\u90E8\u7FA4":"\u5916\u90E8\u7FA4"}:{},...t.corpId?{\u7FA4\u5F52\u5C5E\u4F01\u4E1AcorpId:t.corpId}:{},...t.bot.name?{\u673A\u5668\u4EBA\u6635\u79F0:t.bot.name}:{}};t.bot.type==="enterprise"?o.push({...n,\u5165\u7AD9\u65B9\u5F0F:"stream",\u51FA\u7AD9\u65B9\u5F0F:"session",appKey:t.bot.appKey,...t.bot.appSecret?{appSecret:t.bot.appSecret}:{}}):o.push({...n,\u5165\u7AD9\u65B9\u5F0F:"dws",\u51FA\u7AD9\u65B9\u5F0F:"webhook",webhookUrl:t.bot.webhookUrl,...t.bot.webhookSecret?{webhookSecret:t.bot.webhookSecret}:{}})}return o}l(Kt,"stagingToGroupTableRecords");async function te(e,o,t={}){let n=t.artifacts??await Y(e,o),r=n.configTables.group_table,s=r?.baseId?.trim()??"",a=r?.tableId?.trim()??"";if(!s||!a)return{ok:!1,created:0,message:"\u7FA4\u914D\u7F6E\u8868\u5C1A\u672A\u5C31\u7EEA\uFF08\u7F3A baseId/tableId\uFF09\uFF0C\u6682\u5B58\u4FDD\u7559"};let c=l(async()=>{n.ready&&await $e(o,[])},"clearStaging"),d=await ee(o),f=Kt(d);if(f.length===0)return await c(),{ok:!0,created:0,message:"\u65E0\u53EF\u5199\u5165\u7684\u7FA4\u673A\u5668\u4EBA\u914D\u7F6E"};let g=t.dws??new me({bin:"dws",timeoutMs:9e4}),h=t.existingGroupIds??(await pe(s,a,{dws:g,fields:t.fields})).groups.map(i=>i.groupId),S=f.filter(i=>!h.includes(i.\u7FA4ID??""));if(S.length===0)return await c(),{ok:!0,created:0,message:"\u6682\u5B58\u5DF2\u5168\u90E8\u5728\u7FA4\u914D\u7F6E\u8868\u4E2D"};let B=t.fields??await we(g,s,a),j=new Map(B.map(i=>[i.fieldName,i.fieldId])),L=S.map(i=>{let u={};for(let[p,m]of Object.entries(i)){let y=j.get(p);y&&(u[y]=m)}return{cells:u}});return await g.runJson(["aitable","record","create","--base-id",s,"--table-id",a,"--records",JSON.stringify(L),"--yes"]),await c(),{ok:!0,created:S.length,message:`\u5DF2\u5199\u5165 ${S.length} \u6761\u7FA4\u914D\u7F6E`}}l(te,"writeStagingToGroupTable");var P={groupId:"\u7FA4ID",groupName:"\u7FA4\u540D\u79F0",groupType:"\u7FA4\u7C7B\u578B",corpId:"\u7FA4\u5F52\u5C5E\u4F01\u4E1AcorpId",inbound:"\u5165\u7AD9\u65B9\u5F0F",outbound:"\u51FA\u7AD9\u65B9\u5F0F",webhookUrl:"webhookUrl",webhookSecret:"webhookSecret",appKey:"appKey",appSecret:"appSecret",botNick:"\u673A\u5668\u4EBA\u6635\u79F0",enabled:"\u662F\u5426\u542F\u7528"};function O(e){if(e==null)return"";if(typeof e=="string")return e.trim();if(typeof e=="number")return String(e);if(typeof e=="boolean")return e?"true":"";if(Array.isArray(e))return e.map(O).filter(Boolean).join(",");if(v(e)){if(typeof e.name=="string")return e.name.trim();if(typeof e.value=="string")return e.value.trim();if(typeof e.text=="string")return e.text.trim()}return""}l(O,"cellToText");function Lt(e){if(e==null||e==="")return!0;let o=O(e).toLowerCase();return["true","1","yes","on","\u662F","\u5F00\u542F","\u542F\u7528","\u5DF2\u52FE\u9009"].includes(o)||(typeof e=="boolean"?e:!1)}l(Lt,"cellToEnabled");function Jt(e){let o=O(e);if(o.includes("\u5185\u90E8"))return"internal";if(o.includes("\u5916\u90E8"))return"external"}l(Jt,"cellToGroupType");function Ft(e){if(!v(e))return[];let t=(v(e.data)?e.data:e).records;return Array.isArray(t)?t:[]}l(Ft,"extractConsoleRecords");async function pe(e,o,t={}){if(!e||!o)return{ok:!1,baseId:e,tableId:o,groups:[]};let n=t.dws??new me({bin:"dws",timeoutMs:9e4}),[r,s]=await Promise.all([t.fields?Promise.resolve(t.fields):we(n,e,o),n.runJson(["aitable","record","query","--base-id",e,"--table-id",o,"--all","--format","json"])]),a=new Map(r.map(f=>[f.fieldName,f.fieldId])),c=l((f,g)=>{if(g in f)return f[g];let h=a.get(g);return h?f[h]:void 0},"readCol"),d=[];for(let f of Ft(s)){let g=v(f.cells)?f.cells:{},h=O(c(g,P.groupId));if(!h)continue;let S=O(c(g,P.appSecret)),B=O(c(g,P.webhookSecret)),j=Jt(c(g,P.groupType));d.push({recordId:String(f.recordId??f.id??""),groupId:h,groupName:O(c(g,P.groupName)),...j?{groupType:j}:{},corpId:O(c(g,P.corpId)),inbound:O(c(g,P.inbound)),outbound:O(c(g,P.outbound)),webhookUrl:O(c(g,P.webhookUrl)),webhookSecret:B?"***":"",appKey:O(c(g,P.appKey)),appSecret:S?"***":"",botNick:O(c(g,P.botNick)),enabled:Lt(c(g,P.enabled))})}return{ok:!0,baseId:e,tableId:o,groups:d}}l(pe,"readGroupConfigTable");async function Le(e,o,t={}){let n=t.artifacts??await Y(e,o),r=n.configTables.group_table,s=r?.baseId?.trim()??"",a=r?.tableId?.trim()??"";if(!s||!a)return{ok:!1,baseId:s,tableId:a,groups:[]};let c=await pe(s,a,t);if(c.ok&&c.groups.length===0&&(await ee(o)).length>0){let f=await te(e,o,{...t,artifacts:n,existingGroupIds:[]});f.ok&&f.created>0&&(c=await pe(s,a,t))}return c}l(Le,"readGroupConfigTableForConsole");async function Je(e,o,t,n,r={}){if(!e||!o||!t)return{ok:!1,message:"baseId / tableId / recordId \u5FC5\u586B"};let s=r.dws??new me({bin:"dws",timeoutMs:9e4}),a=r.fields??await we(s,e,o),c=new Map(a.map(f=>[f.fieldName,f.fieldId])),d={};for(let[f,g]of Object.entries(n)){if(g===void 0)continue;let h=P[f];if(!h)continue;let S=c.get(h)??h;d[S]=g}return Object.keys(d).length===0?{ok:!1,message:"\u65E0\u53EF\u66F4\u65B0\u5B57\u6BB5"}:(await s.runJson(["aitable","record","update","--base-id",e,"--table-id",o,"--records",JSON.stringify([{recordId:t,cells:d}]),"--yes"]),{ok:!0,message:"\u8BB0\u5F55\u5DF2\u66F4\u65B0"})}l(Je,"updateGroupConfigRecord");var Mt=["loggedIn","isLoggedIn","isLogin","authenticated","tokenValid","isValid"];function Fe(e){if(!e||typeof e!="object")return null;let o=e;for(let t of Mt)if(typeof o[t]=="boolean")return o[t];for(let t of Object.values(o)){let n=Fe(t);if(n!==null)return n}return null}l(Fe,"findAuthBoolean");async function Me(e={}){let o=e.bin??"dws",t=e.runner??((n,r)=>Et(n,r,{timeoutMs:15e3}));try{let n=await t(o,["auth","status","--format","json"]),r=`${n.stdout}
5
- ${n.stderr}`.trim();for(let s of[r,...r.split(/\r?\n/).reverse()])try{let a=Fe(JSON.parse(s));if(a!==null)return{loggedIn:a}}catch{}return/(未登录|登录失效|token\s*(?:is\s*)?(?:invalid|expired)|not\s+(?:logged|authenticated)|unauthenticated)/i.test(r)?{loggedIn:!1,message:r.split(/\r?\n/)[0]?.slice(0,200)}:n.exitCode===0?{loggedIn:!0}:{loggedIn:!1,message:r.split(/\r?\n/)[0]?.slice(0,200)||"dws auth status \u5931\u8D25"}}catch(n){return{loggedIn:!1,message:n instanceof Error?n.message:String(n)}}}l(Me,"checkDwsAuthStatus");var We=N.join(".aitable-workflow","dws-login.log"),Wt=/https:\/\/login\.dingtalk\.com\/oauth2\/device\/verify\.htm\?user_code=[A-Za-z0-9-]+/;async function qe(e,o={}){let t=N.resolve(e,We);await St(N.dirname(t),{recursive:!0});try{return await de(o.bin??"dws",["auth","login","--device","--yes","--no-browser"],{logFile:t}),{ok:!0,logFile:t}}catch(n){return{ok:!1,message:n instanceof Error?n.message:String(n)}}}l(qe,"startDwsDeviceLogin");async function He(e){try{return{verifyUrl:(await H(N.resolve(e,We),"utf8")).match(Wt)?.[0]??null}}catch{return{verifyUrl:null}}}l(He,"readDwsLoginProgress");async function Ye(e,o){let t;try{t=await H(N.resolve(e,".env"),"utf8")}catch{return null}let n=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),r=t.match(new RegExp(`^${n}=(.*)$`,"m"));if(!r)return null;let s=r[1].trim();return s.startsWith("'")&&s.endsWith("'")&&s.length>=2?s=s.slice(1,-1):s.startsWith('"')&&s.endsWith('"')&&s.length>=2&&(s=s.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\")),s||null}l(Ye,"readEnvKey");async function ze(e){try{let o=D.parse(await H(N.resolve(e,"profile","profile.yml"),"utf8"));return v(o)?o:null}catch{return null}}l(ze,"readProfileDoc");function T(e){return v(e)?e:void 0}l(T,"asRecord");function qt(e){return Array.isArray(e)?e.filter(o=>typeof o=="string"):[]}l(qt,"toStringArray");function v(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}l(v,"isRecord");import{spawnManagedProcess as Ht}from"aitable-workflow-core";function Ze(e){let o=Yt(e);try{let t=Ht({...o,stdio:"ignore",detached:!0});t.child.once("error",()=>Ve(e)),t.unref()}catch{Ve(e)}}l(Ze,"openExternalUrl");function Yt(e,o=process.platform){return o==="darwin"?{command:"open",args:[e]}:o==="win32"?{command:"rundll32.exe",args:["url.dll,FileProtocolHandler",e]}:{command:"xdg-open",args:[e]}}l(Yt,"openInvocation");function Ve(e){console.log(`\u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00: ${e}`)}l(Ve,"printFallback");var tt=I.dirname(Xt(import.meta.url)),ln={".html":"text/html; charset=utf-8",".js":"application/javascript; charset=utf-8",".css":"text/css; charset=utf-8",".json":"application/json; charset=utf-8",".svg":"image/svg+xml",".png":"image/png",".ico":"image/x-icon"},un=1800*1e3,z={phase:"idle"},R={status:"idle"},V=Promise.resolve();function dn(){return process.platform==="darwin"||process.platform==="win32"||process.env.DISPLAY||process.env.WAYLAND_DISPLAY?"local-gui":"remote"}l(dn,"detectEnvironment");function it(){let e=I.join(tt,"web");if(Xe(I.join(e,"index.html")))return e;let o=I.resolve(tt,"..","..","..","web","dist");return Xe(I.join(o,"index.html"))?o:null}l(it,"resolveWebRoot");function Vn(){return it()!==null}l(Vn,"hasWebRoot");async function at(e){let{createServer:o}=await import("net");return new Promise((t,n)=>{let r=o();r.listen(e,()=>{let s=r.address(),a=typeof s=="object"&&s?s.port:e;r.close(()=>t(a))}),r.on("error",()=>{e<8800?at(e+1).then(t,n):n(new Error("\u65E0\u6CD5\u627E\u5230\u53EF\u7528\u7AEF\u53E3 (8788-8800)"))})})}l(at,"getAvailablePort");var gn=1024*1024,fn=50*1024*1024,ct=I.join(".aitable-workflow","console-access.json");async function pn(e,o){let t=I.join(e,ct);return await oe(I.dirname(t),{recursive:!0}),await be(t,`${JSON.stringify(o,null,2)}
6
- `,"utf8"),t}l(pn,"writeConsoleAccessFile");function mn(e){try{Qt(I.join(e,ct))}catch{}}l(mn,"clearConsoleAccessFile");async function G(e,o=gn){return new Promise((t,n)=>{let r=[],s=0;e.on("data",a=>{if(s+=a.length,s>o){e.destroy(),n(new Error("Request body too large"));return}r.push(a)}),e.on("end",()=>{try{t(JSON.parse(Buffer.concat(r).toString("utf8")))}catch{n(new Error("Invalid JSON body"))}}),e.on("error",n)})}l(G,"readJson");function w(e,o,t=200){let n=JSON.stringify(o);e.writeHead(t,{"Content-Type":"application/json; charset=utf-8","Content-Length":Buffer.byteLength(n)}),e.end(n)}l(w,"sendJson");function k(e,o,t){w(e,{ok:!1,error:t},o)}l(k,"sendError");function K(e){let o=JSON.parse(JSON.stringify(e));for(let t of o.modules){let n=t.workflows?t.workflows.flatMap(r=>r.items):t.items;for(let r of n)r.sensitive&&r.value!==void 0&&(r.value="***")}return o}l(K,"maskSensitive");async function Zn(e){let o=await at(8788),t=dn(),n=rt.randomUUID(),r=t==="remote"?"0.0.0.0":"127.0.0.1",s=it(),a=e.mode??"setup",c=e.app;if(a==="runtime"&&!c)throw new Error("runtime \u6A21\u5F0F\u5FC5\u987B\u4F20\u5165 App \u5B9E\u4F8B");if(!s)throw new Error("Web \u8D44\u6E90\u76EE\u5F55\u4E0D\u5B58\u5728\uFF0C\u65E0\u6CD5\u542F\u52A8\u53EF\u89C6\u5316\u914D\u7F6E\u754C\u9762");let d=await st(e.configPath),f=I.dirname(d);z={phase:"idle"},R={status:"idle"},V=Promise.resolve(),e.initialRunStatus&&(R=e.initialRunStatus);let g=null,h=new Promise(u=>g=u),S=null,B=l(()=>{S&&clearTimeout(S),S=setTimeout(()=>{console.log(`
7
- \u2139 \u914D\u7F6E\u754C\u9762\u8D85\u8FC7 30 \u5206\u949F\u65E0\u6D3B\u52A8\uFF0C\u5DF2\u81EA\u52A8\u5173\u95ED\u3002`),g?.()},un)},"resetTimeout"),j=zt(async(u,p)=>{let m=new URL(u.url??"/",`http://${u.headers.host??"localhost"}`),y=u.headers.origin;if(y){let A=`http://127.0.0.1:${o}`;(y===A||t==="remote")&&p.setHeader("Access-Control-Allow-Origin",y)}if(p.setHeader("Access-Control-Allow-Methods","GET, POST, OPTIONS"),p.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization"),u.method==="OPTIONS"){p.writeHead(204),p.end();return}if(m.pathname.startsWith("/dev/")){if((m.searchParams.get("token")??u.headers.authorization?.replace("Bearer ",""))!==n){k(p,401,"Unauthorized");return}B();try{await wn({url:m,req:u,res:p,configPath:e.configPath,configDir:f,completionResolve:g,setupOptions:e.setupOptions,mode:a,app:c,exitOnSetupError:e.exitOnSetupError!==!1})}catch(E){let U=E instanceof Error?E.message:String(E);k(p,500,U)}return}if(m.pathname.startsWith("/api/")){w(p,{error:{message:"\u914D\u7F6E\u754C\u9762\u4E0D\u63D0\u4F9B /api \u63A5\u53E3"}},404);return}kn(m,p,s)});await new Promise(u=>j.listen(o,r,u)),B();let L=a==="runtime"?"workbench":"setup",i=t==="local-gui"?`http://127.0.0.1:${o}/${L}?token=${n}`:`http://${en.hostname()}:${o}/${L}?token=${n}`;await pn(f,{url:i,port:o,mode:a,pid:process.pid,since:new Date().toISOString()}),process.on("exit",()=>mn(f)),t==="local-gui"?e.open!==!1?(Ze(i),console.log(`\u2139 \u6D4F\u89C8\u5668\u5DF2\u6253\u5F00: ${i}`)):console.log(`\u2139 \u8BF7\u624B\u52A8\u6253\u5F00\u6D4F\u89C8\u5668: ${i}`):(console.log("\u2139 \u914D\u7F6E\u754C\u9762\u5DF2\u542F\u52A8\uFF0C\u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00:"),console.log(` ${i}`),console.log(`
8
- \u5982\u679C\u65E0\u6CD5\u76F4\u63A5\u8BBF\u95EE\uFF0C\u53EF\u901A\u8FC7 SSH \u7AEF\u53E3\u8F6C\u53D1:
9
- ssh -L ${o}:127.0.0.1:${o} <your-host>`),console.log(` \u7136\u540E\u6253\u5F00: http://127.0.0.1:${o}/setup?token=${n}`)),a==="runtime"?(console.log(`
10
- \uFF08\u63A7\u5236\u53F0\u968F start \u8FDB\u7A0B\u4FDD\u6301\u8FD0\u884C\uFF0C\u5173\u95ED\u6D4F\u89C8\u5668\u4E0D\u4F1A\u505C\u6B62\u5DE5\u4F5C\u6D41\uFF09`),console.log(` \uFF08\u6309 Ctrl+C \u505C\u6B62 start \u8FDB\u7A0B | \u63A7\u5236\u53F0\u53EF\u505C\u6B62/\u91CD\u542F\u8FD0\u884C\uFF09
11
- `)):(console.log(`
12
- \uFF08\u914D\u7F6E\u53F0\u4F1A\u4FDD\u6301\u8FD0\u884C\uFF0Csetup \u5B8C\u6210\u540E\u53EF\u7EE7\u7EED\u67E5\u770B\u7B54\u7591\u8BB0\u5F55/\u4E13\u5BB6\u914D\u7F6E/\u77E5\u8BC6\u5E93\uFF09`),console.log(` \uFF08\u6309 Ctrl+C \u9000\u51FA | --no-ui \u56DE\u9000\u547D\u4EE4\u884C\u4EA4\u4E92\uFF09
13
- `)),await h,S&&clearTimeout(S),j.close()}l(Zn,"runConfigUI");async function wn(e){let{url:o,req:t,res:n,configPath:r,configDir:s,completionResolve:a,setupOptions:c,mode:d,app:f,exitOnSetupError:g}=e;if(t.method==="GET"&&o.pathname==="/dev/config/check"){let i=await M({configPath:r});w(n,K(i));return}if(t.method==="GET"&&o.pathname==="/dev/config/enriched"){let i=await M({configPath:r}),u=nn(),p=await tn(r),m={},y={},A=new Set,E=/\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}/g;try{let b=await st(r),x=await ne(b,"utf8");for(let J of rn([x]))A.add(J)}catch{}try{let b=await ne(I.join(s,"profile","profile.yml"),"utf8"),x=ke.parse(b),J=x?.workflows;if(J&&typeof J=="object"&&(y=J),x&&typeof x=="object"){let{workflows:ve,...W}=x;for(let Z of JSON.stringify(W).matchAll(E))A.add(Z[1])}}catch{}for(let b of p.workflowEntries)try{let x=await on(b.templatePath),J=x.steps.map(C=>({id:C.id,name:C.name,recipe:C.recipe,engine:C.engine,auto:C.auto})),ve=x.edges.filter(C=>C.from!=="__start__"&&C.to!=="__end__").map(C=>({from:C.from,to:C.to,condition:C.condition})),W={},Z=new Set,F;try{F=ke.parse(await ne(b.templatePath,"utf8"))}catch{}if(F){for(let _ of JSON.stringify(F).matchAll(E))Z.add(_[1]);let C=y[b.id];if(C&&typeof C=="object")for(let _ of JSON.stringify(C).matchAll(E))Z.add(_[1]);let lt=Array.isArray(F.steps)?F.steps:[];for(let _=0;_<x.steps.length;_++){let se=x.steps[_],q=lt[_];if(q){let ie=JSON.stringify(q),ae=new Set;for(let dt of ie.matchAll(E))ae.add(dt[1]);ae.size>0&&(W[se.id]=[...ae])}}let ut=Array.isArray(F.event_sources)?F.event_sources:[];for(let _ of ut)if(_){let se=JSON.stringify(_),q=new Set;for(let ie of se.matchAll(E))q.add(ie[1]);q.size>0&&(W.__event_sources__=[...W.__event_sources__??[],...q])}}m[b.id]={steps:J,edges:ve,stepEnvRefs:W,envRefs:[...Z].sort()}}catch{m[b.id]={steps:[],edges:[],stepEnvRefs:{},envRefs:[]}}let U=new Set;for(let b of Object.values(m))for(let x of b.envRefs??[])U.add(x);let re=i.modules.find(b=>b.id==="env");for(let b of re?.items??[])b.writeTarget?.type==="env"&&!U.has(b.key)&&A.add(b.key);w(n,{config:K(i),engines:{available:u.available.map(b=>({engine:b.engine,cmd:b.cmd,version:b.version})),recommended:u.recommendedEngine},workflowTopology:m,projectEnvRefs:[...A].sort()});return}if(t.method==="POST"&&o.pathname==="/dev/config/save"){let i=await G(t);try{let u=await sn(i,s,r);w(n,{ok:!0,written:u.written,recheck:K(u.recheck)})}catch(u){if(u instanceof an){k(n,u.status,u.message);return}throw u}return}if(t.method==="POST"&&o.pathname==="/dev/kb/ingest"){let i=await G(t);if(!i.roleId||!i.source){k(n,400,"roleId and source are required");return}try{et(i.roleId,{label:"roleId"})}catch(A){k(n,400,A instanceof Error?A.message:"roleId \u4E0D\u5408\u6CD5");return}let u=I.resolve(s,"roles",`${i.roleId}.role.yml`),p=await le(u,i.roleId),m=await ce({source:i.source,collectionName:p,configDir:s}),y=await M({configPath:r});w(n,{ok:m.success,message:m.message,recheck:K(y)});return}if(t.method==="POST"&&o.pathname==="/dev/kb/upload"){let i=await G(t,fn);if(!i.roleId||!Array.isArray(i.files)||i.files.length===0){k(n,400,"roleId and files are required");return}try{et(i.roleId,{label:"roleId"})}catch(y){k(n,400,y instanceof Error?y.message:"roleId \u4E0D\u5408\u6CD5");return}let u=I.resolve(s,"roles",`${i.roleId}.role.yml`),p=await le(u,i.roleId),m=I.resolve(s,".kb-upload-tmp",`upload-${Date.now()}`);try{await oe(m,{recursive:!0});for(let E of i.files){let U;try{U=Se(m,E.relativePath,{allowRoot:!1})}catch{k(n,400,`\u4E0A\u4F20\u6587\u4EF6\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${E.relativePath}`);return}let re=I.dirname(U);await oe(re,{recursive:!0});let b=E.encoding==="base64"?Buffer.from(E.content,"base64"):Buffer.from(E.content,"utf8");await be(U,b)}let y=await ce({source:m,collectionName:p,configDir:s}),A=await M({configPath:r});w(n,{ok:y.success,message:y.message,recheck:K(A)})}finally{await Vt(m,{recursive:!0,force:!0}).catch(()=>{})}return}if(t.method==="GET"&&o.pathname==="/dev/file/read"){let i=o.searchParams.get("path")??"",u=ot(i,s);if(!u){k(n,403,`\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${i}`);return}try{let p=await ne(u,"utf8");w(n,{ok:!0,path:i,content:p,exists:!0})}catch{w(n,{ok:!0,path:i,content:"",exists:!1})}return}if(t.method==="POST"&&o.pathname==="/dev/file/write"){let i=await G(t),u=typeof i.path=="string"?i.path:"",p=ot(u,s);if(!p||typeof i.content!="string"){k(n,403,`\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${u}`);return}let m=hn(u,i.content);if(m){w(n,{ok:!1,error:m},400);return}await oe(I.dirname(p),{recursive:!0}),await be(p,i.content.endsWith(`
14
- `)?i.content:i.content+`
15
- `,"utf8");let y=await M({configPath:r});w(n,{ok:!0,recheck:K(y)});return}if(t.method==="POST"&&o.pathname==="/dev/setup/complete"){if(z.phase==="running"){k(n,409,"setup \u5DF2\u5728\u8FD0\u884C\u4E2D");return}z={phase:"running",logs:[]},w(n,{ok:!0});let i=l(async()=>{try{let u=await te(r,s);u.ok||console.error(`[group-qa] \u7FA4\u914D\u7F6E\u5199\u5165\u672A\u5B8C\u6210: ${u.message}`)}catch(u){console.error(`[group-qa] \u7FA4\u914D\u7F6E\u5199\u5165\u5F02\u5E38: ${u instanceof Error?u.message:String(u)}`)}},"flushStaging");(async()=>{try{await i(),await cn({config:r,...c??{}}),await i();let u=await Y(r,s),p=bn(u);z={phase:"done",artifacts:u,baseUrl:p}}catch(u){z={phase:"error",message:u instanceof Error?u.message:String(u)},g&&a?.()}})();return}if(t.method==="GET"&&o.pathname==="/dev/setup/progress"){w(n,z);return}if(t.method==="GET"&&o.pathname==="/dev/setup/artifacts"){w(n,await Y(r,s));return}if(t.method==="GET"&&o.pathname==="/dev/console/state"){w(n,await X(s));return}if(t.method==="POST"&&o.pathname==="/dev/console/robot"){let i=await G(t);if(!i.workflowId||!Array.isArray(i.creds)){k(n,400,"workflowId \u4E0E creds \u5FC5\u586B");return}let u=await Be(s,i.workflowId,i.creds),p=await M({configPath:r});w(n,{...u,recheck:K(p)},u.ok?200:400);return}if(t.method==="POST"&&o.pathname==="/dev/console/groups"){let i=await G(t);if(!i.workflowId||!i.eventSourceName||!Array.isArray(i.conversationIds)){k(n,400,"workflowId / eventSourceName / conversationIds \u5FC5\u586B");return}let u=await je(s,i.workflowId,i.eventSourceName,i.conversationIds),p=await M({configPath:r});w(n,{...u,recheck:K(p)});return}if(t.method==="GET"&&o.pathname==="/dev/console/admin-groups"){w(n,await Pe());return}if(t.method==="GET"&&o.pathname==="/dev/console/dws-auth"){w(n,await Me());return}if(t.method==="POST"&&o.pathname==="/dev/console/dws-auth/login"){let i=await qe(s);w(n,i,i.ok?200:400);return}if(t.method==="GET"&&o.pathname==="/dev/console/dws-auth/login"){w(n,await He(s));return}let h=o.pathname.match(/^\/dev\/console\/groups\/([^/]+)\/add-enterprise-bot$/);if(t.method==="POST"&&h){let i=decodeURIComponent(h[1]),u=await G(t),p=await X(s),m=await Ke(s,p.workflowId??"group-qa",{conversationId:i,title:u.title??"",...u.groupType?{groupType:u.groupType}:{}});w(n,m,m.ok?200:400);return}let S=o.pathname.match(/^\/dev\/console\/groups\/([^/]+)\/custom-bot$/);if(t.method==="POST"&&S){let i=decodeURIComponent(S[1]),u=await G(t);if(!u.name||!u.webhook||!u.secret){k(n,400,"name / webhook / secret \u5FC5\u586B");return}if(!/^https?:\/\//.test(u.webhook)){k(n,400,"webhook \u5FC5\u987B\u4EE5 http(s):// \u5F00\u5934");return}let p=await X(s),m=await De(),y=await he(s,p.workflowId??"group-qa",{conversationId:i,...u.title!==void 0?{title:u.title}:{},...u.groupType?{groupType:u.groupType}:{},...m?{corpId:m}:{},enabled:!0,bot:{type:"custom",name:u.name,webhookUrl:u.webhook,...u.secret?{webhookSecret:u.secret}:{}}});w(n,y,y.ok?200:400);return}if(t.method==="GET"&&o.pathname==="/dev/console/group-config-table"){try{w(n,await Le(r,s))}catch(i){k(n,502,i instanceof Error?i.message:"\u7FA4\u914D\u7F6E\u8868\u8BFB\u53D6\u5931\u8D25")}return}if(t.method==="POST"&&o.pathname==="/dev/console/group-config-table/flush-staging"){let i=await te(r,s);w(n,i,i.ok?200:400);return}let B=o.pathname.match(/^\/dev\/console\/group-config-table\/([^/]+)$/);if(t.method==="POST"&&B){let i=decodeURIComponent(B[1]),u=await G(t),m=(await Y(r,s)).configTables.group_table;if(!m?.baseId||!m.tableId){k(n,400,"\u7FA4\u914D\u7F6E\u8868\u5C1A\u672A\u5C31\u7EEA");return}try{let y=await Je(m.baseId,m.tableId,i,u);w(n,y,y.ok?200:400)}catch(y){k(n,502,y instanceof Error?y.message:"\u7FA4\u914D\u7F6E\u8868\u5199\u5165\u5931\u8D25")}return}if(t.method==="POST"&&o.pathname==="/dev/kb/official"){let i=await G(t);if(!i.roleId||typeof i.enabled!="boolean"){w(n,{ok:!1,code:"KB_BAD_REQUEST",message:"roleId \u4E0E enabled(boolean) \u5FC5\u586B"},400);return}let u;try{u=await Ae(r,s,i.roleId,i.enabled)}catch(p){w(n,{ok:!1,code:"KB_TOGGLE_FAILED",message:p instanceof Error?p.message:"\u5B98\u65B9\u77E5\u8BC6\u5E93\u5F00\u5173\u5931\u8D25",collections:[]},400);return}w(n,u,u.ok?200:400);return}if(t.method==="POST"&&o.pathname==="/dev/kb/recompile"){let i=await _e(r);w(n,i);return}if(t.method==="GET"&&o.pathname==="/dev/console/mode"){w(n,{ok:!0,mode:d});return}if(t.method==="GET"&&o.pathname==="/dev/run/status"){if(d==="setup"){w(n,{ok:!0,status:"unknown"});return}w(n,{ok:!0,...nt()});return}let L={"/dev/run/start":"start","/dev/run/stop":"stop","/dev/workflow/sync-config":"sync-config"}[o.pathname];if(t.method==="POST"&&L){if(d==="setup"){k(n,409,"setup \u6A21\u5F0F\u4E0D\u652F\u6301\u8FD0\u884C\u63A7\u5236\uFF0C\u8BF7\u4F7F\u7528 aitable-workflow start \u547D\u4EE4");return}let i=await yn(L,f);w(n,{...i,status:nt()});return}k(n,404,"Unknown endpoint")}l(wn,"handleDevApi");function nt(){return R}l(nt,"getRuntimeRunStatus");async function yn(e,o){let t=rt.randomUUID();return e==="start"?R.status==="running"||R.status==="starting"?{ok:!0,action:e,requestId:t}:(R={status:"starting",since:new Date().toISOString(),lastError:null},V=V.then(()=>{let n=o.start();R.status==="starting"&&(R={status:"running",since:new Date().toISOString(),lastError:null}),n.catch(r=>{R={status:"error",lastError:r instanceof Error?r.message:String(r)}})}).catch(n=>{R={status:"error",lastError:n instanceof Error?n.message:String(n)}}),{ok:!0,action:e,requestId:t}):e==="stop"?R.status==="stopping"?{ok:!0,action:e,requestId:t}:R.status!=="running"&&R.status!=="starting"?(R={status:"stopped",lastError:null},{ok:!0,action:e,requestId:t}):(R={status:"stopping",lastError:null},V=V.then(async()=>{await o.stop(),R={status:"stopped",lastError:null}}).catch(n=>{R={status:"error",lastError:n instanceof Error?n.message:String(n)}}),{ok:!0,action:e,requestId:t}):e==="sync-config"?{ok:!0,action:e,requestId:t}:{ok:!1,action:e,requestId:t}}l(yn,"handleRuntimeRunControl");function Qn(){R={status:"idle"},V=Promise.resolve()}l(Qn,"resetRuntimeRunStatusForTest");function ot(e,o){let t=e.trim();if(!t||!/\.(ya?ml|json)$/i.test(t))return null;try{return Se(o,t,{allowRoot:!1})}catch{return null}}l(ot,"resolveInsideConfigDir");function hn(e,o){try{return/\.json$/i.test(e)?JSON.parse(o):ke.parse(o),null}catch(t){return`${/\.json$/i.test(e)?"JSON":"YAML"} \u8BED\u6CD5\u9519\u8BEF\uFF0C\u672A\u4FDD\u5B58: ${t instanceof Error?t.message:String(t)}`}}l(hn,"validateStructuredText");function bn(e){let o=Object.values(e.trackers).find(t=>t.baseId&&t.tableId);return o?.baseId?`https://alidocs.dingtalk.com/i/nodes/${encodeURIComponent(o.baseId)}`:null}l(bn,"deriveBaseUrl");async function kn(e,o,t){let n;try{let a=decodeURIComponent(e.pathname).replace(/^\/+/,"")||"index.html";n=Se(t,a,{allowRoot:!1})}catch{o.writeHead(403),o.end("Forbidden");return}try{(await Qe(n)).isDirectory()&&(n=I.join(n,"index.html"))}catch{n=I.join(t,"index.html")}try{await Qe(n)}catch{o.writeHead(404),o.end("Not Found");return}let r=I.extname(n),s=ln[r]??"application/octet-stream";o.writeHead(200,{"Content-Type":s}),Zt(n).pipe(o)}l(kn,"serveStatic");export{Rn as a,Ze as b,dn as c,it as d,Vn as e,ct as f,pn as g,mn as h,Zn as i,nt as j,yn as k,Qn as l,kn as m};
@@ -1 +0,0 @@
1
- import{c as a,d as b,e as c,f as d,g as e,h as f,i as g,j as h,k as i,l as j,m as k}from"./chunk-3RV7QGWM.js";import"./chunk-XGHRD4FJ.js";import"./chunk-EI7MMDWY.js";export{d as CONSOLE_ACCESS_FILE_REL,f as clearConsoleAccessFile,a as detectEnvironment,h as getRuntimeRunStatus,i as handleRuntimeRunControl,c as hasWebRoot,j as resetRuntimeRunStatusForTest,b as resolveWebRoot,g as runConfigUI,k as serveStatic,e as writeConsoleAccessFile};
@@ -1 +0,0 @@
1
- .console{display:grid;grid-template-columns:200px 1fr;height:100%;min-height:0;overflow:hidden}.console__rail{display:flex;flex-direction:column;gap:4px;padding:16px 10px;border-right:1px solid var(--border);background:var(--bg-panel);min-height:0}.console__brand{display:flex;align-items:center;gap:8px;padding:4px 8px 14px}.console__brand-mark{width:22px;height:22px;border-radius:var(--radius-sm);display:grid;place-items:center;background:var(--accent);flex:0 0 auto}.console__brand-text{font-size:13px;font-weight:650;color:var(--text-strong)}.console__nav{display:flex;flex-direction:column;gap:2px}.console__nav-item{display:flex;align-items:center;gap:9px;padding:8px 10px;border:1px solid transparent;border-radius:var(--radius);background:transparent;color:var(--text-muted);font-size:13px;text-align:left;cursor:pointer;transition:background var(--dur-quick) var(--ease-out),color var(--dur-quick) var(--ease-out)}.console__nav-item:hover{background:var(--bg-fill-tertiary);color:var(--text)}.console__nav-item.is-active{background:var(--accent-tint);border-color:var(--accent-soft);color:var(--accent-strong);font-weight:600}.console__fallback{margin-top:auto;display:flex;align-items:center;gap:6px;padding:7px 10px;border:1px solid var(--border);border-radius:var(--radius);background:transparent;color:var(--text-soft);font-size:12px;cursor:pointer}.console__fallback:hover{color:var(--text);border-color:var(--border-strong)}.console__main{display:flex;flex-direction:column;min-height:0;min-width:0;overflow:hidden}.console__topbar{display:flex;align-items:center;gap:10px;padding:12px 24px;border-bottom:1px solid var(--border);background:var(--bg-panel);flex:0 0 auto}.console__topbar-title{font-size:15px;font-weight:650;color:var(--text-strong)}.console__spacer{flex:1}.console__status{display:inline-flex;align-items:center;gap:4px;padding:3px 10px;border-radius:var(--radius-pill);font-size:12px;border:1px solid var(--border);background:var(--bg-subtle);color:var(--text-muted)}.console__status--running{background:var(--green-bg);border-color:var(--green-border);color:var(--green)}.console__status--error{background:var(--red-bg);border-color:var(--red-border);color:var(--red)}.console__status--stopped{background:var(--amber-bg);border-color:var(--amber-border);color:var(--amber)}.console__run{font-size:13px;padding:5px 14px}.console__run--danger{border-color:var(--red-border);color:var(--red)}.console__run--danger:hover:not(:disabled){background:var(--red-bg)}.console__error{display:flex;align-items:center;gap:8px;margin:12px 24px 0;padding:10px 14px;border-radius:var(--radius);background:var(--red-bg);border:1px solid var(--red-border);color:var(--red);font-size:13px;flex:0 0 auto}.console-auth-banner{display:flex;align-items:center;flex-wrap:wrap;gap:10px;padding:10px 14px;margin-bottom:16px;border-radius:var(--radius);background:var(--red-bg);border:1px solid var(--red-border);color:var(--red);font-size:13px}.console-auth-banner__text{flex:1 1 auto;min-width:200px}.console-auth-banner__btn{display:inline-flex;align-items:center;gap:4px;font-size:12px;padding:4px 14px;border-radius:var(--radius-sm);text-decoration:none;white-space:nowrap}.console-auth-banner__wait{font-size:12px;opacity:.8}.console-auth-banner__err{flex-basis:100%;font-size:12px}.console__retry{margin-left:auto;font-size:12px;padding:3px 12px;border-radius:var(--radius-sm);background:transparent;border:1px solid var(--red-border);color:var(--red);cursor:pointer}.console__loading{padding:40px;text-align:center;color:var(--text-muted);font-size:14px}.console-page{padding:24px;overflow-y:auto;min-height:0;flex:1}.console-page--frame{overflow:hidden;display:flex;flex-direction:column}.console-section{max-width:920px;margin:0 auto 28px}.console-section--frame{max-width:none;display:flex;flex-direction:column;min-height:0;flex:1;margin:0}.console-section__title{font-size:17px;font-weight:650;color:var(--text-strong);margin:0 0 6px}.console-section__sub{font-size:13px;color:var(--text-muted);margin:0 0 16px;line-height:1.65}.console-section__tablelink{font-size:13px;color:var(--text-muted);margin:0 0 16px}.console-section__tablelink a{color:var(--blue);text-decoration:none}.console-section__tablelink a:hover{text-decoration:underline}.console-quick{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:14px}.console-quick__card{position:relative;display:flex;flex-direction:column;gap:6px;padding:16px;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-panel);box-shadow:var(--shadow-xs)}.console-quick__card.is-done{border-color:var(--green-border);background:var(--bg-elevated)}.console-quick__badge{position:absolute;top:14px;right:14px}.console-quick__title{font-size:14px;font-weight:650;color:var(--text-strong);padding-right:24px}.console-quick__desc{font-size:12px;color:var(--text-muted);line-height:1.6;min-height:38px}.console-quick__hint{font-size:12px;color:var(--amber)}.console-quick__hint.is-done{color:var(--green)}.console-quick__hint.is-loading{color:var(--text-faint)}.console-quick__badge.is-loading svg{animation:console-quick-spin 1.2s linear infinite}@keyframes console-quick-spin{to{transform:rotate(360deg)}}.console-quick__cta{margin-top:6px;align-self:flex-start;font-size:13px;padding:5px 14px}.console-build{display:flex;align-items:center;gap:12px;margin-top:18px;padding-top:16px;border-top:1px solid var(--border-soft)}.console-build__btn{font-size:14px;padding:8px 20px}.console-build__rebuild{font-size:13px;padding:6px 14px}.console-build__hint{font-size:12px;color:var(--text-muted)}.console-intro{display:flex;flex-direction:column;gap:14px}.console-intro__item{display:flex;gap:12px;padding:14px 16px;border:1px solid var(--border-soft);border-radius:var(--radius);background:var(--bg-panel)}.console-intro__icon{width:30px;height:30px;flex:0 0 auto;border-radius:var(--radius-sm);display:grid;place-items:center;background:var(--accent-tint)}.console-intro__head{font-size:13px;font-weight:600;color:var(--text-strong);margin-bottom:4px}.console-intro__body{font-size:12.5px;color:var(--text-muted);line-height:1.7}.console-sub{padding:24px;max-width:960px;margin:0 auto;width:100%;overflow-y:auto;min-height:0;flex:1;display:flex;flex-direction:column;gap:14px}.console-sub__head{display:flex;flex-direction:column;gap:4px}.console-sub__back{align-self:flex-start;display:inline-flex;align-items:center;gap:4px;padding:3px 8px 3px 4px;margin-bottom:6px;border:none;background:transparent;color:var(--text-muted);font-size:12px;cursor:pointer}.console-sub__back:hover{color:var(--text);background:transparent}.console-sub__title{font-size:17px;font-weight:650;color:var(--text-strong);margin:0}.console-sub__desc{font-size:13px;color:var(--text-muted);margin:0}.console-sub__add{align-self:flex-start;font-size:12px;padding:5px 12px}.console-sub__foot{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding-top:6px}.console-sub__ok{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--green)}.console-sub__err{display:inline-flex;align-items:flex-start;gap:5px;font-size:12px;color:var(--red);line-height:1.6}.console-sub__saving{font-size:12px;color:var(--text-muted)}.console-card{display:flex;flex-direction:column;gap:12px;padding:16px;border:1px solid var(--border-soft);border-radius:var(--radius);background:var(--bg-panel)}.console-card__head{display:flex;align-items:center;gap:8px}.console-card__title{font-size:13px;font-weight:600;color:var(--text)}.console-card__remove{margin-left:auto;display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border:1px solid var(--border);border-radius:var(--radius-sm);background:transparent;color:var(--text-soft);font-size:11px;cursor:pointer}.console-card__remove:hover{color:var(--red);border-color:var(--red-border)}.console-field{display:flex;flex-direction:column;gap:5px}.console-field__label{font-size:12px;font-weight:500;color:var(--text-muted)}.console-field__textarea{font-family:var(--mono);font-size:12px;resize:vertical}.console-note{display:flex;gap:9px;padding:12px 14px;border-radius:var(--radius);background:var(--blue-bg);border:1px solid var(--blue-border);color:var(--text);font-size:12.5px;line-height:1.7}.console-note--warn{background:var(--amber-bg);border-color:var(--amber-border)}.console-note--ok{background:var(--green-bg);border-color:var(--green-border)}.console-note--err{background:var(--red-bg);border-color:var(--red-border)}.console-note code{font-family:var(--mono);font-size:11.5px;padding:1px 4px;border-radius:var(--radius-xs);background:var(--bg-fill-tertiary)}.console-note__title{font-weight:600;color:var(--text-strong);margin-bottom:3px}.console-note__howto{margin-top:6px;color:var(--text-muted)}.console-kb{display:flex;flex-direction:column;gap:14px;margin-bottom:16px}.console-kb__card{display:flex;flex-direction:column;gap:10px;padding:16px 18px;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-panel)}.console-kb__head{display:flex;align-items:center;gap:8px}.console-kb__title{font-size:14px;font-weight:650;color:var(--text-strong)}.console-kb__head>.console-kb__stats{margin-left:auto}.console-kb__card .console-frame{margin-top:2px;flex:none}.console-kb__card .console-frame__stage{min-height:420px}.console-kb__desc{font-size:12.5px;color:var(--text-muted);line-height:1.7;margin:0}.console-kb__title-row{display:flex;align-items:center;gap:10px}.console-kb__count{padding:2px 9px;border-radius:var(--radius-pill);background:var(--bg-fill-secondary);border:1px solid var(--border-soft);color:var(--text-muted);font-size:11px}.console-kb__badge{padding:2px 8px;border-radius:var(--radius-pill);background:var(--bg-fill-secondary);border:1px solid var(--border-soft);color:var(--text-muted);font-size:11px}.console-kb__switch{margin-left:auto;display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--text);cursor:pointer;-webkit-user-select:none;user-select:none}.console-kb__switch input[type=checkbox]{width:14px;height:14px;accent-color:var(--accent);cursor:pointer}.console-kb__stats{font-size:12px;color:var(--text-soft)}.console-tabs{display:flex;gap:0;border-bottom:1px solid var(--border);margin-bottom:14px;flex:0 0 auto}.console-tabs__tab{display:flex;align-items:center;gap:6px;padding:9px 16px;font-size:13px;font-weight:500;color:var(--text-muted);background:transparent;border:none;border-bottom:2px solid transparent;cursor:pointer}.console-tabs__tab:hover{color:var(--text);background:transparent}.console-tabs__tab.is-active{color:var(--text-strong);font-weight:600;border-bottom-color:var(--accent)}.console-tabs__dot{width:6px;height:6px;border-radius:50%;background:var(--amber)}.console-sync{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding-top:12px;flex:0 0 auto}.console-sync__hint{font-size:12px;color:var(--text-muted)}.console-frame{display:flex;flex-direction:column;min-height:0;flex:1;border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;background:var(--bg-elevated);margin-top:12px}.console-frame__iframe{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;border:none;display:block}.console-frame__stage{position:relative;flex:1;min-height:320px}.console-frame__loading{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;gap:8px;background:var(--bg-subtle);color:var(--text-faint);font-size:12.5px}.console-frame__spinner{width:14px;height:14px;border:2px solid var(--border-strong);border-top-color:var(--text-faint);border-radius:50%;animation:console-quick-spin 1.2s linear infinite}.console-frame__foot{display:flex;align-items:center;gap:6px;padding:6px 12px;border-top:1px solid var(--border-soft);background:var(--bg-subtle);font-size:11.5px;color:var(--text-muted);flex:0 0 auto}.console-frame__link{margin-left:auto;color:var(--accent);text-decoration:none}.console-frame__link:hover{text-decoration:underline}.console-frame__empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;flex:1;min-height:260px;margin-top:12px;border:1px dashed var(--border-strong);border-radius:var(--radius);background:var(--bg-subtle)}.console-frame__empty-text{max-width:420px;text-align:center;font-size:13px;color:var(--text-muted);line-height:1.7;margin:0}.console__done{grid-column:1 / -1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;min-height:60vh;text-align:center}.console__done-icon{width:54px;height:54px;border-radius:50%;display:grid;place-items:center;background:var(--green-bg);border:1px solid var(--green-border)}.console__done-title{font-size:19px;font-weight:650;color:var(--text-strong);margin:8px 0 0}.console__done-text{font-size:14px;color:var(--text-muted);margin:0}.console__done-hint{font-size:13px;color:var(--text-soft);margin:0}.group-select__item input[type=checkbox],.group-bot-table__switch input[type=checkbox],.addbot__option input[type=radio]{width:16px;height:16px;flex:0 0 auto;margin:0;padding:0;border:0;border-radius:0;box-shadow:none;background:none;accent-color:var(--accent);cursor:pointer}.group-select__search{margin-bottom:12px}.group-select__list{display:flex;flex-direction:column;gap:2px;max-height:380px;overflow-y:auto;border:1px solid var(--border-soft);border-radius:var(--radius);padding:6px}.group-select__item{display:flex;align-items:center;gap:10px;padding:9px 10px;border-radius:var(--radius-sm);cursor:pointer;transition:background var(--dur-quick) var(--ease-out)}.group-select__item:hover{background:var(--bg-subtle)}.group-select__name{flex:1;font-size:13px;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-select__type{font-size:12px;color:var(--text-soft);white-space:nowrap}.group-select__count{font-size:13px;color:var(--text-muted)}.group-select__foot-actions{display:flex;gap:8px;margin-left:auto}.console-retry{margin-left:8px;border:none;background:transparent;color:var(--accent);font-size:12px;font-weight:600;cursor:pointer}.group-bot-table{border:1px solid var(--border-soft);border-radius:var(--radius);overflow:hidden}.group-bot-table__head,.group-bot-table__row{display:grid;grid-template-columns:2fr 1fr 2fr 1fr;align-items:center;gap:8px;padding:10px 14px}.group-bot-table__head{background:var(--bg-subtle);font-size:12px;font-weight:600;color:var(--text-soft)}.group-bot-table__row{border-top:1px solid var(--border-soft);font-size:13px;color:var(--text)}.group-bot-table__col--name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-bot-table__bot-name{display:inline-flex;align-items:center;gap:5px}.group-bot-table__edit{margin-left:8px;border:none;background:transparent;color:var(--accent);font-size:12px;cursor:pointer;display:inline-flex;align-items:center;gap:3px}.group-bot-table__switch{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--text-soft);cursor:pointer}.addbot__option{display:flex;align-items:center;gap:12px;padding:12px 14px;border:1px solid var(--border-soft);border-radius:var(--radius);margin-bottom:10px;cursor:pointer;transition:border-color var(--dur-quick) var(--ease-out),background var(--dur-quick) var(--ease-out)}.addbot__option.is-active{border-color:var(--accent);background:var(--accent-tint)}.addbot__option.is-disabled{opacity:.55;cursor:not-allowed}.addbot__option-title{font-size:13px;font-weight:600;color:var(--text-strong)}.addbot__option-desc{font-size:12px;color:var(--text-soft);margin-top:2px}.addbot__option>div{flex:1;min-width:0}.addbot__creds{margin:-2px 0 10px;padding:10px 12px;background:var(--bg-subtle);border-radius:var(--radius)}:root{--bg: #faf9f7;--bg-app: #faf9f7;--bg-panel: #fdfcfa;--bg-subtle: #f4f5f7;--bg-muted: #eef1f5;--bg-fill-tertiary: rgba(0, 0, 0, .03);--bg-fill-secondary: rgba(0, 0, 0, .06);--bg-fill: rgba(0, 0, 0, .12);--bg-elevated: #fffefc;--border: #e1e5eb;--border-strong: #c9d0da;--border-soft: #edf0f4;--text: #1a1916;--text-strong: #0d0c0a;--text-muted: #74716b;--text-soft: #989590;--text-faint: #b3b0a8;--accent: #c96442;--accent-strong: #b45a3b;--accent-soft: #f5d8cb;--accent-tint: #fbeee5;--accent-hover: #b45a3b;--green: #1f7a3a;--green-bg: #e8f7ee;--green-border: #c6ead2;--blue: #2348b8;--blue-bg: #e8efff;--blue-border: #c8d6ff;--purple: #6c3aa6;--purple-bg: #f3ecf9;--purple-border: #e4d4f1;--red: #9c2a25;--red-bg: #fdecea;--red-border: #f5c6c2;--amber: #b26200;--amber-bg: #fff3e0;--amber-border: #f5dcae;--shadow-xs: 0 1px 0 rgba(28, 27, 26, .04);--shadow-sm: 0 1px 2px rgba(28, 27, 26, .05), 0 1px 3px rgba(28, 27, 26, .04);--shadow-md: 0 6px 24px rgba(28, 27, 26, .07), 0 2px 6px rgba(28, 27, 26, .04);--shadow-lg: 0 24px 60px rgba(28, 27, 26, .16), 0 8px 16px rgba(28, 27, 26, .07);--radius-xs: 4px;--radius-sm: 6px;--radius: 8px;--radius-md: 10px;--radius-lg: 12px;--radius-pill: 999px;--ease-out: cubic-bezier(.23, 1, .32, 1);--dur-quick: .12s;--dur-enter: .2s;--dur-exit: .14s;--selected: #2563eb;--selected-soft: rgba(37, 99, 235, .16);--serif: "Source Serif Pro", "Source Serif 4", Georgia, "Times New Roman", serif;--sans: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei UI", "Noto Sans", Roboto, "Helvetica Neue", Arial, sans-serif;--mono: ui-monospace, "SF Mono", SFMono-Regular, "JetBrains Mono", Menlo, Consolas, monospace;--prose-font-size: 15px;--prose-line-height: 1.75;--code-header-bg: #f4f5f7;--code-body-bg: #f9fafb;--code-font-size: 13px;--code-line-height: 1.65;--agent-claude: #d4a574;--agent-codex: #10a37f;--agent-qoder: #6366f1;--agent-qwenwork: #7c3aed;--agent-llm: #8c8c8c}[data-theme=dark]{color-scheme:dark;--bg: #1a1917;--bg-app: #1a1917;--bg-panel: #222120;--bg-subtle: #252321;--bg-muted: #2e2c29;--bg-fill-tertiary: rgba(255, 255, 255, .06);--bg-fill-secondary: rgba(255, 255, 255, .1);--bg-fill: rgba(255, 255, 255, .16);--bg-elevated: #2a2825;--border: #333128;--border-strong: #46433c;--border-soft: #2a2825;--text: #e8e4dc;--text-strong: #f2ede4;--text-muted: #9a9690;--text-soft: #6e6b65;--text-faint: #4e4b46;--accent: #d97a56;--accent-strong: #e8896a;--accent-soft: #3d2318;--accent-tint: #2e1a12;--accent-hover: #e8896a;--green: #4caf72;--green-bg: #0f2a18;--green-border: #1a4028;--blue: #6b8fe8;--blue-bg: #0f1a38;--blue-border: #1a2c58;--purple: #a87dd4;--purple-bg: #1e1030;--purple-border: #321a50;--red: #e06b65;--red-bg: #2a0e0c;--red-border: #451714;--amber: #e09a40;--amber-bg: #2a1a04;--amber-border: #4a3410;--shadow-xs: 0 1px 0 rgba(0, 0, 0, .2);--shadow-sm: 0 1px 2px rgba(0, 0, 0, .3), 0 1px 3px rgba(0, 0, 0, .2);--shadow-md: 0 6px 24px rgba(0, 0, 0, .4), 0 2px 6px rgba(0, 0, 0, .25);--shadow-lg: 0 24px 60px rgba(0, 0, 0, .6), 0 8px 16px rgba(0, 0, 0, .3);--code-header-bg: #1e1e20;--code-body-bg: #18181b}*{box-sizing:border-box}html,body,#root{height:100%;margin:0;overflow:hidden}body{font-family:var(--sans);font-size:14px;line-height:1.6;color:var(--text);background:var(--bg-app);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}button{font:inherit;color:var(--text);background:var(--bg-panel);border:1px solid var(--border);border-radius:var(--radius-sm);padding:6px 12px;cursor:pointer;transition:background var(--dur-quick) var(--ease-out),border-color var(--dur-quick) var(--ease-out),color var(--dur-quick) var(--ease-out),box-shadow var(--dur-quick) var(--ease-out),transform var(--dur-quick) var(--ease-out)}button:hover:not(:disabled){background:var(--bg-subtle);border-color:var(--border-strong)}button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}button:disabled{opacity:.5;cursor:not-allowed}a.primary{font:inherit;padding:6px 12px;border:1px solid transparent;border-radius:var(--radius-sm);text-decoration:none;cursor:pointer;transition:background var(--dur-quick) var(--ease-out),border-color var(--dur-quick) var(--ease-out),color var(--dur-quick) var(--ease-out),box-shadow var(--dur-quick) var(--ease-out),transform var(--dur-quick) var(--ease-out)}button.primary,a.primary{display:inline-flex;align-items:center;justify-content:center;gap:6px;background:var(--accent);border-color:var(--accent);color:#fff;font-weight:500;line-height:1.2;box-shadow:0 1px #b45a3b2e inset,var(--shadow-xs)}button.primary:hover:not(:disabled),a.primary:hover{background:var(--accent-hover);border-color:var(--accent-hover)}button.primary-ghost{display:inline-flex;align-items:center;justify-content:center;gap:6px;background:var(--bg-panel);border-color:var(--accent);color:var(--accent);font-weight:500;line-height:1.2}button.primary-ghost:hover:not(:disabled){background:var(--accent-tint)}button.ghost{display:inline-flex;align-items:center;justify-content:center;gap:6px;background:transparent;border-color:var(--border);color:var(--text);line-height:1.2}button.ghost:hover:not(:disabled){background:var(--bg-subtle);border-color:var(--border-strong)}button.subtle{background:var(--bg-subtle);border-color:transparent;color:var(--text)}button.subtle:hover:not(:disabled){background:var(--bg-muted)}input,textarea,select{font:inherit;color:var(--text);background:var(--bg-panel);border:1px solid var(--border);border-radius:var(--radius-sm);padding:7px 10px;width:100%;transition:border-color var(--dur-quick) var(--ease-out),box-shadow var(--dur-quick) var(--ease-out)}input::placeholder,textarea::placeholder{color:var(--text-faint)}input:focus,textarea:focus,select:focus{outline:none;border-color:var(--selected);box-shadow:0 0 0 3px var(--selected-soft)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:var(--bg-fill);border-radius:var(--radius-pill);border:2px solid transparent;background-clip:content-box}::-webkit-scrollbar-thumb:hover{background:var(--border-strong);background-clip:content-box}.react-flow{direction:ltr;--xy-edge-stroke-default: #b1b1b7;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #555;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(255, 255, 255, .5);--xy-minimap-background-color-default: #fff;--xy-minimap-mask-background-color-default: rgba(240, 240, 240, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #e2e2e2;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: transparent;--xy-background-pattern-dots-color-default: #91919a;--xy-background-pattern-lines-color-default: #eee;--xy-background-pattern-cross-color-default: #e2e2e2;background-color:var(--xy-background-color, var(--xy-background-color-default));--xy-node-color-default: inherit;--xy-node-border-default: 1px solid #1a192b;--xy-node-background-color-default: #fff;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #1a192b;--xy-node-border-radius-default: 3px;--xy-handle-background-color-default: #1a192b;--xy-handle-border-color-default: #fff;--xy-selection-background-color-default: rgba(0, 89, 220, .08);--xy-selection-border-default: 1px dotted rgba(0, 89, 220, .8);--xy-controls-button-background-color-default: #fefefe;--xy-controls-button-background-color-hover-default: #f4f4f4;--xy-controls-button-color-default: inherit;--xy-controls-button-color-hover-default: inherit;--xy-controls-button-border-color-default: #eee;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #ffffff;--xy-edge-label-color-default: inherit;--xy-resize-background-color-default: #3367d9}.react-flow.dark{--xy-edge-stroke-default: #3e3e3e;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #727272;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(150, 150, 150, .25);--xy-minimap-background-color-default: #141414;--xy-minimap-mask-background-color-default: rgba(60, 60, 60, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #2b2b2b;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: #141414;--xy-background-pattern-dots-color-default: #555;--xy-background-pattern-lines-color-default: #333;--xy-background-pattern-cross-color-default: #333;--xy-node-color-default: #f8f8f8;--xy-node-border-default: 1px solid #3c3c3c;--xy-node-background-color-default: #1e1e1e;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #999;--xy-handle-background-color-default: #bebebe;--xy-handle-border-color-default: #1e1e1e;--xy-selection-background-color-default: rgba(200, 200, 220, .08);--xy-selection-border-default: 1px dotted rgba(200, 200, 220, .8);--xy-controls-button-background-color-default: #2b2b2b;--xy-controls-button-background-color-hover-default: #3e3e3e;--xy-controls-button-color-default: #f8f8f8;--xy-controls-button-color-hover-default: #fff;--xy-controls-button-border-color-default: #5b5b5b;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #141414;--xy-edge-label-color-default: #f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1;touch-action:none}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.react-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background-color:var(--xy-handle-background-color, var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));border-radius:100%}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px) translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px) translateY(-50%)}.react-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;left:0;top:0}.react-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );stroke:var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );stroke-width:var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) )}.react-flow__minimap-node{fill:var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );stroke:var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );stroke-width:var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) )}.react-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.react-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.react-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.react-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{display:flex;justify-content:center;align-items:center;height:26px;width:26px;padding:4px;border:none;background:var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));border-bottom:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );color:var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:var(--xy-node-border-radius, var(--xy-node-border-radius-default));width:150px;font-size:12px;color:var(--xy-node-color, var(--xy-node-color-default));text-align:center;border:var(--xy-node-border, var(--xy-node-border-default));background-color:var(--xy-node-background-color, var(--xy-node-background-color-default))}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );color:var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) )}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) )}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:5px;height:5px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));translate:-50% -50%}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color, var(--xy-edge-label-color-default))}.app-root{height:100vh;display:grid;grid-template-rows:48px 1fr;background:var(--bg-app);overflow:hidden}.chrome{display:flex;align-items:center;gap:16px;padding:0 14px;border-bottom:1px solid var(--border);background:color-mix(in srgb,var(--bg-panel) 88%,var(--bg-subtle));-webkit-user-select:none;user-select:none}.chrome__brand{display:flex;align-items:center;gap:8px;font-weight:650;font-size:14px;color:var(--text-strong);letter-spacing:.2px;text-decoration:none;background:none;border:none;padding:4px 8px;border-radius:var(--radius-sm);cursor:pointer;transition:background var(--dur-quick) var(--ease-out)}.chrome__brand:hover{background:var(--bg-fill-tertiary)}.chrome__brand-mark{width:24px;height:24px;border-radius:var(--radius-sm);display:grid;place-items:center;background:linear-gradient(135deg,var(--accent),var(--accent-strong));color:#fff}.chrome__spacer{flex:1}.chrome__theme{width:32px;height:32px;padding:0;display:grid;place-items:center;border-radius:var(--radius-sm);background:transparent;border-color:transparent;color:var(--text-muted)}.stepper{display:flex;align-items:center;gap:2px}.stepper__item{display:inline-flex;align-items:center;gap:7px;padding:5px 12px;border-radius:var(--radius-pill);background:transparent;border:1px solid transparent;color:var(--text-soft);font-size:13px;font-weight:500;text-decoration:none;transition:all var(--dur-quick) var(--ease-out)}.stepper__item:hover:not(:disabled){color:var(--text);background:var(--bg-subtle)}.stepper__item.is-active{color:var(--accent);background:var(--accent-tint);border-color:var(--accent-soft)}.stepper__item.is-done{color:var(--green)}.stepper__num{width:18px;height:18px;border-radius:50%;display:grid;place-items:center;font-size:11px;font-weight:700;background:var(--bg-fill-secondary);color:var(--text-muted)}.stepper__item.is-active .stepper__num{background:var(--accent);color:#fff}.stepper__item.is-done .stepper__num{background:var(--green);color:#fff}.stepper__sep{width:16px;height:1px;background:var(--border)}.body{display:grid;grid-template-columns:232px minmax(0,1fr);min-height:0;overflow:hidden}.body.body--rail-collapsed{grid-template-columns:36px minmax(0,1fr)}.body--norail{grid-template-columns:1fr}.rail{border-right:1px solid var(--border);background:color-mix(in srgb,var(--bg-panel) 60%,var(--bg-app));display:flex;flex-direction:column;min-height:0;padding:12px 10px;gap:4px}.rail__head{display:flex;align-items:center;gap:6px}.rail__title{flex:1;font-size:11px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--text-faint);padding:4px 8px 8px}.rail__item{display:flex;align-items:center;gap:9px;width:100%;padding:8px 10px;border-radius:var(--radius);background:transparent;border-color:transparent;color:var(--text);text-align:left;font-size:13.5px}.rail__list{display:flex;flex-direction:column;gap:4px;min-height:0;overflow:auto}.rail__item-copy{min-width:0;display:flex;flex-direction:column;gap:1px}.rail__item-title,.rail__item-sub{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rail__item-title{line-height:1.25}.rail__item-sub{font-size:11px;color:var(--text-faint);font-weight:400}.rail__item:hover:not(:disabled){background:var(--bg-subtle)}.rail__item.is-active{background:var(--accent-tint);color:var(--accent-strong);font-weight:550}.rail__item-icon{color:var(--text-muted);flex:0 0 auto}.rail__item.is-active .rail__item-icon{color:var(--accent)}.rail__badge{margin-left:auto;font-size:11px;background:var(--bg-fill-secondary);color:var(--text-muted);border-radius:var(--radius-pill);padding:1px 7px;min-width:18px;text-align:center}.rail__new{margin-top:8px}.rail__project{position:relative;display:flex;flex-direction:column}.rail__item--project{font-weight:600;padding-right:28px}.rail__item--workflow{padding-left:32px;font-size:12.5px;color:var(--text-soft);margin-top:4px}.rail__workflow-list,.rail__workflow-empty{display:flex;flex-direction:column;gap:2px;padding-left:4px}.rail__workflow-card-wrap{position:relative}.rail__workflow-add,.rail__workflow-new{margin-top:4px;color:var(--text-muted)}.rail__workflow-add:hover,.rail__workflow-new:hover{color:var(--accent)}.rail__workflow-error{padding:6px 10px 6px 32px;font-size:11.5px;color:var(--danger, #dc2626)}.rail__workflow-list .rail__item-delete{opacity:1;top:4px;right:4px}.rail__item-delete{position:absolute;top:6px;right:6px;width:20px;height:20px;display:grid;place-items:center;border-radius:var(--radius-sm);background:transparent;border:1px solid transparent;color:var(--text-muted);opacity:0;transition:opacity .12s ease,background .12s ease,color .12s ease;cursor:pointer}.rail__project:hover .rail__item-delete,.rail__item-delete:focus-visible{opacity:1}.rail__item-delete:hover{background:var(--danger-bg, rgba(220, 38, 38, .12));color:var(--danger, #dc2626);border-color:var(--border-soft)}.rail__spacer{flex:1}.rail__foot{font-size:11px;color:var(--text-faint);padding:8px;line-height:1.5;border-top:1px solid var(--border-soft)}.rail__collapse,.rail-peek{width:28px;height:28px;display:grid;place-items:center;border-radius:var(--radius-sm);background:transparent;border-color:transparent;color:var(--text-muted)}.rail__collapse:hover,.rail-peek:hover{background:var(--bg-subtle);color:var(--text)}.rail-peek{align-self:start;margin:10px 4px}.split{display:grid;grid-template-columns:var(--chat-width, minmax(420px, 44%)) 7px minmax(0,1fr);min-height:0;overflow:hidden}.split--chatonly{grid-template-columns:1fr}.split--work-hidden{grid-template-columns:minmax(0,1fr)}.split.split--chat-collapsed{grid-template-columns:36px minmax(0,1fr)}.split-chat-peek{width:28px;height:44px;align-self:center;justify-self:center;display:grid;place-items:center;border-radius:var(--radius-pill);color:var(--text-muted);background:var(--bg-subtle);border-color:var(--border)}.split-chat-peek:hover{color:var(--accent);border-color:var(--accent-soft)}.split-resizer{width:7px;min-height:0;cursor:col-resize;border:0;border-right:1px solid var(--border);background:color-mix(in srgb,var(--bg-panel) 70%,var(--bg-app));padding:0}.split-resizer:hover,.split-resizer:active{background:var(--accent-soft)}.split__chat{border-right:1px solid var(--border);min-width:0;min-height:0;display:flex;flex-direction:column;background:var(--bg-app)}.split__work{min-width:0;min-height:0;overflow:hidden;background:var(--bg-panel);display:flex;flex-direction:column}.work-head{display:flex;align-items:center;gap:10px;padding:12px 16px;border-bottom:1px solid var(--border);min-height:46px}.work-head__title{font-weight:600;color:var(--text-strong)}.work-head__sub{font-size:12px;color:var(--text-muted)}.work-head__spacer{flex:1}.work-head__cta{margin-left:auto;padding:6px 13px;font-size:13px}.work-body{flex:1;min-height:0;overflow:auto}.pill{display:inline-flex;align-items:center;gap:5px;padding:2px 9px;border-radius:var(--radius-pill);font-size:11.5px;font-weight:550;border:1px solid transparent}.pill--green{color:var(--green);background:var(--green-bg);border-color:var(--green-border)}.pill--blue{color:var(--blue);background:var(--blue-bg);border-color:var(--blue-border)}.pill--amber{color:var(--amber);background:var(--amber-bg);border-color:var(--amber-border)}.pill--red{color:var(--red);background:var(--red-bg);border-color:var(--red-border)}.pill--muted{color:var(--text-muted);background:var(--bg-subtle);border-color:var(--border)}.empty-hint{color:var(--text-soft);font-size:13px;text-align:center;padding:40px 24px;line-height:1.7}.step-list{display:flex;flex-direction:column;gap:8px}.step-list__item{display:flex;align-items:center;gap:10px;padding:10px 12px;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-panel)}.step-list__engine{flex:0 0 auto;font-size:10.5px;font-weight:700;letter-spacing:.3px;color:#fff;padding:2px 8px;border-radius:var(--radius-pill)}.step-list__name{font-size:13.5px;color:var(--text-strong);font-weight:500}.step-list__item .pill{margin-left:auto}.cfg-grid{display:flex;flex-direction:column;gap:10px}.cfg-card{border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-panel);overflow:hidden;transition:border-color var(--dur-enter) var(--ease-out)}.cfg-card.is-done{border-color:var(--green-border)}.cfg-card__head{display:flex;align-items:center;gap:9px;padding:10px 12px;border-bottom:1px solid var(--border-soft);background:var(--bg-subtle)}.cfg-card__icon{width:24px;height:24px;flex:0 0 auto;display:grid;place-items:center;border-radius:var(--radius-sm);background:var(--bg-panel);color:var(--text-muted)}.cfg-card.is-done .cfg-card__icon{color:var(--green)}.cfg-card__title{font-size:13px;font-weight:600;color:var(--text-strong)}.cfg-card__status{margin-left:auto;display:inline-flex;align-items:center;gap:4px;font-size:11px;color:var(--text-faint)}.cfg-card__status.is-done{color:var(--green)}.cfg-card__body{padding:11px 12px;font-size:13px}.cfg-muted{color:var(--text-soft);font-size:12.5px}.cfg-label{display:flex;flex-direction:column;gap:6px;font-size:12.5px;color:var(--text-soft)}.cfg-input,.cfg-textarea{width:100%;box-sizing:border-box;padding:8px 10px;border:1px solid var(--border);border-radius:var(--radius);font-size:13px;color:var(--text);background:var(--bg-panel);font-family:inherit}.cfg-textarea{font-family:ui-monospace,SF Mono,Menlo,monospace;resize:vertical;line-height:1.5}.cfg-input:focus,.cfg-textarea:focus{outline:none;border-color:var(--accent)}.cfg-value{color:var(--text);display:inline-flex;align-items:center;flex-wrap:wrap}.cfg-sop{margin:0;color:var(--text);line-height:1.6;font-size:12.5px}.chip-row{display:flex;flex-wrap:wrap;gap:6px}.agent-chip{display:inline-flex;align-items:center;gap:6px;padding:3px 10px 3px 8px;border-radius:var(--radius-pill);font-size:12px;font-weight:500;color:var(--text-strong);background:color-mix(in srgb,var(--c) 12%,var(--bg-panel));border:1px solid color-mix(in srgb,var(--c) 35%,transparent)}.agent-chip__dot{width:8px;height:8px;border-radius:50%;background:var(--c)}.cfg-cta{margin-top:16px;display:flex;align-items:center;gap:12px;padding:14px 16px;border:1px solid var(--green-border);background:var(--green-bg);border-radius:var(--radius-md)}.cfg-cta__text{flex:1;display:inline-flex;align-items:center;gap:8px;font-size:13.5px;color:var(--green);font-weight:500}.cfg-cta--pending{border-color:var(--amber-border);background:var(--amber-bg)}.cfg-cta__text--pending{color:var(--amber)}.cfg-cta__btn{flex:0 0 auto;white-space:nowrap}.home-hero{display:flex;flex-direction:column;align-items:center;text-align:center;max-width:720px;margin:0 auto;padding:72px 24px 48px}.home-hero__mark{width:56px;height:56px;border-radius:var(--radius-lg);display:grid;place-items:center;margin-bottom:20px;background:linear-gradient(135deg,var(--accent),var(--accent-strong));box-shadow:var(--shadow-md)}.home-hero__title{font-size:30px;margin:0 0 12px;color:var(--text-strong)}.home-hero__desc{margin:0 0 28px;color:var(--text-muted);font-size:15px;line-height:1.7}.home-hero__ctas{display:flex;gap:12px;align-items:center}.home-hero__error{margin-top:10px;font-size:12.5px;color:var(--danger, #dc2626)}.home-hero__cta{padding:10px 22px;font-size:15px}.home-hero__cta--ghost{border:1px solid var(--border-strong);background:transparent;color:var(--text);border-radius:var(--radius);cursor:pointer;font-weight:500;display:inline-flex;align-items:center;gap:8px;transition:background var(--dur-quick) var(--ease-out),border-color var(--dur-quick) var(--ease-out)}.home-hero__cta--ghost:hover{background:var(--bg-subtle);border-color:var(--accent)}.home-beats{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-top:44px;width:100%}.home-beat{position:relative;display:flex;flex-direction:column;align-items:center;gap:4px;padding:18px 12px 16px;border:1px solid var(--border);border-radius:var(--radius-lg);background:var(--bg-elevated);box-shadow:var(--shadow-xs);text-align:center}.home-beat__idx{position:absolute;top:8px;left:10px;font-family:var(--mono);font-size:11px;color:var(--text-faint)}.home-beat__icon{width:34px;height:34px;border-radius:var(--radius-pill);display:grid;place-items:center;color:var(--accent);background:var(--accent-tint);margin-bottom:4px}.home-beat__label{font-size:14px;font-weight:600;color:var(--text-strong)}.home-beat__desc{font-size:11.5px;color:var(--text-muted);line-height:1.5}.home-projects{width:100%;max-width:640px;margin:32px auto 0;text-align:left}.home-projects__title{font-size:13px;color:var(--text-muted);margin-bottom:8px}.home-projects__empty{font-size:13px;color:var(--text-soft);padding:12px 0}.home-projects__retry{margin-left:8px;padding:0;border:0;background:none;font:inherit;color:var(--accent);cursor:pointer;text-decoration:underline}.home-projects__list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px}.home-projects__item{display:flex;align-items:center;gap:8px;padding:10px 12px;border-radius:var(--radius);color:var(--text);text-decoration:none;transition:background var(--dur-quick) var(--ease-out)}.home-projects__item:hover{background:var(--bg-subtle)}.home-projects__name{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.home-projects__id{font-size:11px;color:var(--text-faint)}.rail__machines{margin-top:4px;color:var(--text-muted);font-size:13px;border-top:1px solid var(--border-soft);padding-top:8px}.rail__machines:hover{color:var(--accent)}.engine-selector{display:flex;flex-direction:column;gap:8px}.engine-selector__group{display:flex;flex-direction:column;gap:4px}.engine-selector__label{font-size:12px;font-weight:600;color:var(--text-soft);text-transform:uppercase;letter-spacing:.5px;margin-bottom:2px}.engine-option{display:flex;align-items:center;gap:10px;padding:10px 14px;background:var(--bg-panel);border:1px solid var(--border);border-radius:var(--radius);cursor:pointer;text-align:left;width:100%;transition:border-color var(--dur-quick) var(--ease-out),background var(--dur-quick) var(--ease-out)}.engine-option:hover{border-color:var(--accent);background:var(--bg-fill-tertiary)}.engine-option.is-selected{border-color:var(--accent);background:var(--selected-soft)}.engine-option--disabled{cursor:default;opacity:.5}.engine-option--disabled:hover{border-color:var(--border);background:var(--bg-panel)}.engine-option__info{display:flex;flex-direction:column;gap:2px;flex:1}.engine-option__name{font-size:14px;font-weight:600;color:var(--text-strong)}.engine-option__caps{font-size:12px;color:var(--text-muted)}.engine-selected{display:flex;align-items:center;gap:8px;font-size:14px;color:var(--text)}.engine-change-btn{margin-left:auto;font-size:12px;padding:2px 10px;border:1px solid var(--border);border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);cursor:pointer}.engine-change-btn:hover{background:var(--bg-fill-tertiary);color:var(--text)}.engine-empty{padding:12px;background:var(--bg-fill-secondary);border-radius:var(--radius);text-align:center}.engine-empty__text{font-size:13px;color:var(--text-muted);margin-bottom:6px}.engine-empty__link{color:var(--accent);background:none;border:none;cursor:pointer;font:inherit;font-weight:500;text-decoration:underline;padding:0}.agent-selector{display:flex;flex-direction:column;gap:4px}.agent-option{display:flex;align-items:center;gap:10px;padding:8px 12px;background:var(--bg-panel);border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;text-align:left;width:100%;transition:border-color var(--dur-quick) var(--ease-out)}.agent-option:hover:not(:disabled){border-color:var(--accent)}.agent-option.is-selected{border-color:var(--accent);background:var(--selected-soft)}.agent-option.is-unavailable{opacity:.45;cursor:default}.agent-option__check{width:18px;height:18px;display:grid;place-items:center;border:1.5px solid var(--border);border-radius:3px;color:var(--accent)}.agent-option.is-selected .agent-option__check{background:var(--accent);border-color:var(--accent);color:#fff}.agent-option__info{display:flex;flex-direction:column;gap:1px;flex:1}.agent-option__name{font-size:13px;font-weight:600;color:var(--text-strong)}.agent-option__vendor{font-size:11px;color:var(--text-muted)}.agent-option__badge{font-size:11px;color:var(--text-faint);font-style:italic}.engine-bar{display:flex;align-items:center;gap:8px;padding:6px 14px;background:var(--bg-panel);border:1px solid var(--border);border-radius:var(--radius-sm);font-size:13px;margin-bottom:8px}.engine-bar--offline{border-color:var(--red-border);background:var(--red-bg)}.engine-bar__name{font-weight:600;color:var(--text-strong)}.engine-bar__caps{color:var(--text-muted);font-size:12px}.engine-bar__offline-text{color:var(--red);font-weight:500}.engine-bar__waiting{color:var(--text-muted);font-style:italic;font-size:12px}.engine-bar__action{font-size:12px;font-family:inherit;padding:2px 10px;border:1px solid var(--border);border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);text-decoration:none;cursor:pointer}.engine-bar__action:hover{background:var(--bg-fill-tertiary);color:var(--text)}.engine-switch-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#0000004d;display:grid;place-items:center;z-index:200}.engine-switch-dialog{background:var(--bg-panel);border:1px solid var(--border);border-radius:var(--radius-lg);padding:20px;min-width:360px;max-width:480px;box-shadow:var(--shadow-lg)}.engine-switch-dialog__title{font-size:16px;font-weight:600;color:var(--text-strong);margin-bottom:12px}.engine-switch-dialog__empty{font-size:13px;color:var(--text-muted);padding:16px;text-align:center}.engine-switch-dialog__option{display:flex;align-items:center;gap:8px;width:100%;padding:10px 12px;border:1px solid var(--border);border-radius:var(--radius-sm);background:transparent;cursor:pointer;text-align:left;font-size:14px;color:var(--text);margin-bottom:6px;transition:border-color var(--dur-quick) var(--ease-out)}.engine-switch-dialog__option:hover{border-color:var(--accent)}.engine-switch-dialog__caps{font-size:12px;color:var(--text-muted);margin-left:auto}.engine-switch-dialog__cancel{width:100%;padding:8px;margin-top:8px;border:1px solid var(--border);border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);cursor:pointer;font-size:13px}.stage-skeleton{display:flex;flex-direction:column;gap:12px;padding:24px}.stage-skeleton__bar,.stage-skeleton__card{background:linear-gradient(90deg,var(--bg-subtle) 25%,var(--border) 37%,var(--bg-subtle) 63%);background-size:400% 100%;animation:stage-skeleton-shimmer 1.4s ease infinite;border-radius:6px}.stage-skeleton__bar{height:14px;width:60%}.stage-skeleton__bar--wide{width:82%}.stage-skeleton__bar--narrow{width:38%}.stage-skeleton__card{flex:1;min-height:180px;border-radius:10px}@keyframes stage-skeleton-shimmer{0%{background-position:100% 50%}to{background-position:0 50%}}.modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;display:flex;align-items:center;justify-content:center;background:#00000059;animation:modal-fade-in var(--dur-enter) var(--ease-out)}@keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}.modal-card{width:100%;max-width:520px;background:var(--bg-elevated);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);overflow:hidden;animation:modal-scale-in var(--dur-enter) var(--ease-out)}@keyframes modal-scale-in{0%{opacity:0;transform:scale(.96) translateY(8px)}to{opacity:1;transform:scale(1) translateY(0)}}.modal-card__head{display:flex;align-items:center;gap:8px;padding:16px 20px 12px;border-bottom:1px solid var(--border-soft)}.modal-card__icon{display:grid;place-items:center;width:28px;height:28px;border-radius:var(--radius);background:var(--amber-bg);color:var(--amber)}.modal-card__title{flex:1;font-size:15px;font-weight:600;color:var(--text-strong)}.modal-card__close{display:grid;place-items:center;width:28px;height:28px;border:none;border-radius:var(--radius-sm);background:transparent;color:var(--text-soft);cursor:pointer;transition:background var(--dur-quick) var(--ease-out),color var(--dur-quick) var(--ease-out)}.modal-card__close:hover{background:var(--bg-fill-tertiary);color:var(--text)}.modal-card__body{padding:16px 20px}.modal-card__section-label{font-size:13px;color:var(--text-muted);margin-bottom:10px}.modal-card__section-label--warn{margin-top:16px;color:var(--amber)}.modal-card__list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}.modal-card__item{display:flex;align-items:center;gap:8px;padding:8px 12px;border-radius:var(--radius);font-size:13px}.modal-card__item--error{background:var(--red-bg);border:1px solid var(--red-border)}.modal-card__item--warn{background:var(--amber-bg);border:1px solid var(--amber-border)}.modal-card__item-scope{font-size:11px;font-weight:600;color:var(--text-soft);white-space:nowrap}.modal-card__item-target{font-family:var(--mono);font-size:12px;color:var(--text-strong);font-weight:600;white-space:nowrap}.modal-card__item-label{flex:1;color:var(--text-muted);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.modal-card__locate{flex:0 0 auto;border:none;background:transparent;color:var(--accent);font-size:12px;font-weight:600;cursor:pointer;padding:2px 6px;border-radius:var(--radius-sm);transition:background var(--dur-quick) var(--ease-out);white-space:nowrap}.modal-card__locate:hover{background:var(--accent-tint)}.modal-card__foot{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px 16px;border-top:1px solid var(--border-soft)}.modal-card__btn{padding:7px 16px;border:1px solid var(--border-strong);border-radius:var(--radius);background:var(--bg-elevated);color:var(--text);font-size:13px;font-weight:500;cursor:pointer;transition:background var(--dur-quick) var(--ease-out),border-color var(--dur-quick) var(--ease-out)}.modal-card__btn:hover{background:var(--bg-subtle)}.modal-card__btn.primary{border-color:transparent}.chat{display:flex;flex-direction:column;min-height:0;height:100%}.chat__head{padding:12px 16px;border-bottom:1px solid var(--border);min-height:46px;display:flex;flex-direction:column;justify-content:center}.chat__head-title{font-weight:600;color:var(--text-strong)}.chat__head-sub{font-size:12px;color:var(--text-muted);margin-top:2px}.chat__body{flex:1;min-height:0;overflow:auto;padding:18px 16px;display:flex;flex-direction:column;gap:16px}.chat__empty{color:var(--text-soft);font-size:13.5px;text-align:center;padding:48px 20px;line-height:1.7}.msg{display:flex;gap:10px}.msg--user{justify-content:flex-end}.msg--user .msg__bubble{max-width:82%;background:var(--accent-tint);border:1px solid var(--accent-soft);color:var(--text-strong);padding:9px 13px;border-radius:var(--radius-lg) var(--radius-lg) var(--radius-xs) var(--radius-lg);font-size:13.5px;white-space:pre-wrap;line-height:1.55}.msg__avatar{width:26px;height:26px;flex:0 0 auto;border-radius:var(--radius-pill);display:grid;place-items:center;background:linear-gradient(135deg,var(--accent),var(--accent-strong));margin-top:2px}.msg__content{min-width:0;flex:1;display:flex;flex-direction:column;gap:10px}.msg__text{margin:0;font-size:14px;line-height:1.68;color:var(--text);white-space:pre-wrap}.msg__text--agent{align-self:flex-start;background:var(--accent-tint);border:1px solid var(--accent-soft);border-radius:10px;padding:8px 12px}.think-block{align-self:flex-start;max-width:100%;border:1px dashed var(--accent-soft);border-radius:10px;background:transparent;padding:2px 4px}.think-block__summary{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--text-muted, #8a8f98);cursor:pointer;list-style:none;padding:4px 8px;-webkit-user-select:none;user-select:none}.think-block__summary::-webkit-details-marker{display:none}.think-block__body{margin:4px 8px 6px;font-size:12.5px;line-height:1.6;font-style:italic;color:var(--text-muted, #8a8f98);white-space:pre-wrap}.msg__form-hint{display:inline-flex;align-items:center;gap:6px;align-self:flex-start;font-size:12.5px;color:var(--accent-strong);background:var(--accent-tint);border:1px solid var(--accent-soft);border-radius:var(--radius-pill);padding:5px 12px}.chat__typing{display:inline-flex;gap:4px;padding:4px 2px;align-self:flex-start}.chat__typing span,.questions-panel-dot{width:6px;height:6px;border-radius:50%;background:var(--text-faint);animation:chat-bounce 1.2s infinite ease-in-out}.chat__typing span:nth-child(2){animation-delay:.15s}.chat__typing span:nth-child(3){animation-delay:.3s}@keyframes chat-bounce{0%,60%,to{transform:translateY(0);opacity:.5}30%{transform:translateY(-4px);opacity:1}}.chat__composer{display:flex;gap:8px;align-items:flex-end;padding:12px 14px;border-top:1px solid var(--border);background:color-mix(in srgb,var(--bg-panel) 70%,var(--bg-app))}.chat__input{resize:none;max-height:140px;line-height:1.5;border-radius:var(--radius-md)}.chat__send{width:38px;height:38px;flex:0 0 auto;padding:0}.todo-card{border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-panel);overflow:hidden}.todo-card__head{display:flex;align-items:center;gap:7px;padding:9px 12px;border-bottom:1px solid var(--border-soft);font-size:12px;font-weight:600;color:var(--text-strong);background:var(--bg-subtle)}.todo-card__count{margin-left:auto;font-size:11px;font-weight:500;color:var(--text-muted)}.todo-card__list{list-style:none;margin:0;padding:6px;display:flex;flex-direction:column;gap:2px}.todo-item{display:flex;align-items:center;gap:9px;padding:6px 8px;border-radius:var(--radius-sm);font-size:13px}.todo-item.is-done .todo-item__text{color:var(--text-muted)}.todo-item.is-active{background:var(--accent-tint)}.todo-item__mark{width:16px;height:16px;flex:0 0 auto;display:grid;place-items:center;color:var(--green)}.todo-item.is-active .todo-item__mark{color:var(--accent)}.todo-item__dot{width:7px;height:7px;border-radius:50%;border:1.5px solid var(--text-faint)}.todo-item__spinner,.tool-card__spinner{width:13px;height:13px;border-radius:50%;border:2px solid var(--accent-soft);border-top-color:var(--accent);animation:spin .7s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.tool-card{display:flex;align-items:center;gap:9px;min-width:0;padding:8px 12px;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-panel);font-size:13px}.tool-card.is-done{border-color:var(--green-border)}.tool-card.is-error{border-color:var(--red-border)}.tool-card__icon{width:18px;height:18px;flex:0 0 auto;display:grid;place-items:center;color:var(--green)}.tool-card.is-error .tool-card__icon{color:var(--red)}.tool-card__label{min-width:max-content;color:var(--text-strong);font-weight:500;white-space:nowrap;word-break:keep-all}.tool-card__detail{min-width:0;color:var(--text-muted);font-size:12px;margin-left:auto;font-family:var(--mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.question-form{margin:0;border:1px solid var(--border);border-radius:var(--radius-lg);background:var(--bg-panel);box-shadow:var(--shadow-md);overflow:hidden;max-height:100%;min-height:0;display:flex;flex-direction:column}.question-form-locked{background:var(--bg-subtle);box-shadow:none;opacity:.94}.question-form-head{display:flex;align-items:center;gap:12px;padding:12px 14px;border-bottom:1px solid var(--border);background:linear-gradient(180deg,var(--accent-tint) 0%,var(--bg-panel) 100%)}.question-form-locked .question-form-head{background:var(--bg-subtle)}.question-form-icon{width:28px;height:28px;border-radius:var(--radius-pill);background:var(--accent);color:#fff;font-weight:600;font-size:14px;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.question-form-titles{flex:1;min-width:0}.question-form-title{font-size:14px;font-weight:600;color:var(--text)}.question-form-desc{margin-top:2px;font-size:12px;color:var(--text-muted);line-height:1.45}.question-form-pill{font-size:10px;letter-spacing:.04em;padding:3px 8px;border-radius:var(--radius-pill);background:var(--bg-panel);border:1px solid var(--border);color:var(--text-muted)}.question-form-body{display:flex;flex-direction:column;gap:14px;padding:14px;min-height:0;overflow-y:auto;overscroll-behavior:contain}.qf-field{display:flex;flex-direction:column;gap:6px}.qf-label{font-size:12px;font-weight:500;color:var(--text);display:flex;align-items:center;gap:4px}.qf-required{color:var(--accent)}.qf-help{font-size:11px;color:var(--text-muted);margin-top:-2px;line-height:1.4}.qf-error{font-size:11px;color:var(--danger, #e5484d);line-height:1.4}.qf-field-error>.qf-label{color:var(--danger, #e5484d)}.qf-options{display:flex;flex-wrap:wrap;gap:6px}.qf-chip{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border:1px solid var(--border);border-radius:var(--radius-pill);background:var(--bg-panel);font-size:12px;cursor:pointer;transition:border-color .12s var(--ease-out),background .12s var(--ease-out),color .12s var(--ease-out)}.qf-chip input{width:auto;margin:0;display:none}.qf-chip-copy{display:flex;flex-direction:column;gap:2px;line-height:1.2}.qf-chip-desc{color:var(--text-muted);font-size:11px}.qf-chip-on .qf-chip-desc{color:inherit;opacity:.72}.qf-chip:hover{border-color:var(--border-strong)}.qf-chip-disabled{cursor:not-allowed;opacity:.48}.qf-chip-on{border-color:var(--accent);background:var(--accent-soft);color:var(--accent-hover);font-weight:500}.question-form-locked .qf-chip{cursor:default}.qf-choices{display:flex;flex-direction:column;gap:6px}.qf-choice{display:flex;align-items:flex-start;gap:9px;padding:9px 11px;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-panel);font-size:13px;cursor:pointer;transition:border-color .12s var(--ease-out),background .12s var(--ease-out)}.qf-choice input{width:15px;height:15px;margin:1px 0 0;flex:0 0 auto;accent-color:var(--accent);cursor:pointer}.qf-choice input:focus{box-shadow:none}.qf-choice:hover{border-color:var(--border-strong)}.qf-choice.is-on{border-color:var(--accent);background:var(--accent-tint)}.qf-choice.is-disabled{cursor:default;opacity:.55}.question-form-locked .qf-choice{cursor:default}.qf-input,.qf-select,.qf-textarea{font-size:13px}.qf-textarea{resize:vertical;min-height:64px}.qf-range-wrap{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px}.qf-range{width:100%;min-width:0}.qf-range-value{min-width:38px;padding:3px 6px;border:1px solid var(--border-soft);border-radius:var(--radius-sm);background:var(--bg-subtle);color:var(--text-muted);font-size:11px;text-align:center}.qf-color{width:44px;height:34px;padding:2px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-panel)}.qf-switch{display:inline-flex;width:fit-content;align-items:center;cursor:pointer}.qf-switch input{position:absolute;opacity:0;pointer-events:none}.qf-switch span{position:relative;width:38px;height:22px;border:1px solid var(--border);border-radius:var(--radius-pill);background:var(--bg-subtle);transition:background-color .14s var(--ease-out),border-color .14s var(--ease-out)}.qf-switch span:after{content:"";position:absolute;top:3px;left:3px;width:14px;height:14px;border-radius:var(--radius-pill);background:var(--bg-panel);box-shadow:var(--shadow-sm);transition:transform .14s var(--ease-out)}.qf-switch input:checked+span{border-color:var(--accent);background:var(--accent-soft)}.qf-switch input:checked+span:after{transform:translate(16px)}.question-form-foot{display:flex;align-items:center;gap:12px;padding:10px 14px;border-top:1px solid var(--border);background:var(--bg-subtle)}.qf-hint,.qf-locked-note{flex:1;font-size:11px;color:var(--text-muted);line-height:1.4}.questions-panel{flex:1;display:flex;flex-direction:column;min-height:0;height:100%;overflow:hidden}.questions-panel-body{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;padding:16px;display:flex;flex-direction:column;gap:12px;overscroll-behavior:contain}.questions-panel-skeleton{color:var(--text-soft);font-size:13px;text-align:center;padding:40px 20px}.questions-panel-typing{display:inline-flex;gap:4px;align-self:center;padding:4px}.questions-panel-dot:nth-child(2){animation-delay:.15s}.questions-panel-dot:nth-child(3){animation-delay:.3s}.questions-panel-foot{flex:0 0 auto;display:flex;align-items:center;gap:8px;padding:12px 16px;border-top:1px solid var(--border);background:color-mix(in srgb,var(--bg-panel) 70%,var(--bg-app))}.questions-panel-status{flex:1;font-size:11.5px;color:var(--text-muted)}.role-panel{display:flex;flex-direction:column;gap:8px}.role-item{border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-panel);overflow:hidden;transition:border-color var(--dur-enter) var(--ease-out)}.role-item.is-open{border-color:var(--accent-border, var(--accent));box-shadow:var(--shadow-sm)}.role-item__head{display:flex;align-items:center;gap:8px;padding:8px 10px}.role-item__toggle{display:flex;align-items:center;gap:8px;flex:1;min-width:0;border:none;background:transparent;cursor:pointer;color:var(--text-muted);text-align:left}.role-item__avatar{display:grid;place-items:center;width:24px;height:24px;flex:0 0 auto;border-radius:var(--radius-pill);color:var(--accent);background:var(--accent-tint)}.role-item__name{flex:1;min-width:0;border:1px solid transparent;border-radius:var(--radius-sm);padding:3px 6px;font-size:13px;font-weight:600;color:var(--text-strong);background:transparent}.role-item__name:hover{border-color:var(--border-soft)}.role-item__name:focus{outline:none;border-color:var(--accent);background:var(--bg-subtle)}.role-item__summary{flex:0 0 auto;font-size:11px;color:var(--text-soft);white-space:nowrap}.role-item__remove{display:grid;place-items:center;width:24px;height:24px;flex:0 0 auto;border:none;border-radius:var(--radius-sm);background:transparent;color:var(--text-faint);cursor:pointer;transition:background var(--dur-quick) var(--ease-out),color var(--dur-quick) var(--ease-out)}.role-item__remove:hover{background:var(--red-bg, var(--bg-fill-tertiary));color:var(--red, var(--text))}.role-item__body{display:flex;flex-direction:column;gap:12px;padding:4px 12px 14px}.role-field{display:flex;flex-direction:column;gap:6px}.role-field__label{font-size:11.5px;font-weight:600;color:var(--text-muted)}.role-persona{width:100%;min-height:58px}.role-choices{display:flex;flex-wrap:wrap;gap:6px}.role-choice{display:inline-flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--border);border-radius:var(--radius-pill);background:var(--bg-panel);font-size:12px;color:var(--text-muted);cursor:pointer;transition:border-color .12s var(--ease-out),background .12s var(--ease-out),color .12s var(--ease-out)}.role-choice input{width:14px;height:14px;margin:0;accent-color:var(--accent);cursor:pointer}.role-choice:hover{border-color:var(--border-strong)}.role-choice.is-on{border-color:var(--accent);background:var(--accent-soft);color:var(--accent-hover);font-weight:500}.role-item__chips{display:flex;flex-wrap:wrap;gap:5px;padding:0 12px 10px}.role-tag{font-size:11px;padding:2px 8px;border-radius:var(--radius-pill);background:var(--bg-fill-tertiary);color:var(--text-soft)}.role-add{display:inline-flex;align-items:center;gap:6px;align-self:flex-start;padding:6px 12px;border:1px dashed var(--border-strong);border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);font-size:12.5px;cursor:pointer;transition:border-color var(--dur-quick) var(--ease-out),color var(--dur-quick) var(--ease-out)}.role-add:hover{border-color:var(--accent);color:var(--accent)}.kb-folder-list{display:flex;flex-wrap:wrap;gap:6px}.kb-folder-chip{display:inline-flex;align-items:center;gap:5px;padding:4px 8px 4px 10px;border-radius:var(--radius-pill);background:var(--accent-tint);border:1px solid var(--accent-soft);color:var(--accent-strong, var(--accent));font-size:12px;font-weight:500}.kb-folder-chip__remove{display:grid;place-items:center;width:16px;height:16px;border:none;border-radius:50%;background:transparent;color:var(--text-soft);cursor:pointer;padding:0;transition:background .12s var(--ease-out),color .12s var(--ease-out)}.kb-folder-chip__remove:hover{background:var(--red-bg, var(--bg-fill-tertiary));color:var(--red, var(--text))}.kb-folder-pick{display:inline-flex;align-items:center;gap:6px;align-self:flex-start;padding:7px 14px;border:1px dashed var(--border-strong);border-radius:var(--radius);background:transparent;color:var(--text-muted);font-size:12.5px;cursor:pointer;transition:border-color var(--dur-quick) var(--ease-out),color var(--dur-quick) var(--ease-out)}.kb-folder-pick:hover{border-color:var(--accent);color:var(--accent)}.design-workspace{display:flex;flex:1;min-height:0;min-width:0}.design-workspace--tabbed{flex-direction:column}.dw-preview,.dw-code-view{display:flex;flex:1;min-height:0;min-width:0}.dw-panel{display:flex;flex-direction:column;flex:1 1 0;min-width:0;min-height:0}.dw-panel--canvas{border-right:1px solid var(--border)}.dw-panel__head{display:flex;align-items:center;gap:7px;padding:7px 10px 7px 14px;border-bottom:1px solid var(--border-soft);background:var(--bg-subtle);font-size:12px;color:var(--text-muted);flex:0 0 auto}.dw-panel__title{font-weight:600;color:var(--text)}.dw-panel__collapse{margin-left:auto;display:grid;place-items:center;width:24px;height:24px;border:none;border-radius:var(--radius-sm);background:transparent;color:var(--text-soft);cursor:pointer;transition:background var(--dur-quick) var(--ease-out),color var(--dur-quick) var(--ease-out)}.dw-panel__collapse:hover{background:var(--bg-fill-tertiary);color:var(--text)}.dw-rail{display:flex;flex-direction:column;align-items:center;gap:10px;flex:0 0 40px;padding:12px 0;border:none;background:var(--bg-subtle);color:var(--text-muted);cursor:pointer;transition:background var(--dur-quick) var(--ease-out),color var(--dur-quick) var(--ease-out)}.dw-rail--left{border-right:1px solid var(--border)}.dw-rail--right{border-left:1px solid var(--border)}.dw-rail:hover{background:var(--bg-muted);color:var(--text)}.dw-rail__label{writing-mode:vertical-rl;font-size:12px;font-weight:600;letter-spacing:.04em}.wf-canvas{position:relative;min-width:0;flex:1;min-height:0;background:var(--bg-subtle)}.wf-canvas .react-flow__attribution{display:none}.wf-canvas .react-flow__controls{box-shadow:var(--shadow-sm);border-radius:var(--radius-sm);overflow:hidden}.wf-canvas .react-flow__controls-button{background:var(--bg-elevated);border-bottom:1px solid var(--border-soft);color:var(--text-muted)}.wf-canvas .react-flow__controls-button:hover{background:var(--bg-muted)}.wf-canvas .react-flow__controls-button svg{fill:currentColor}.wf-node{--engine: var(--agent-llm);position:relative;display:flex;width:208px;overflow:hidden;border:1px solid var(--border-strong);border-radius:var(--radius-md);background:var(--bg-elevated);box-shadow:var(--shadow-sm);transition:border-color var(--dur-enter) var(--ease-out),box-shadow var(--dur-enter) var(--ease-out),transform var(--dur-enter) var(--ease-out)}.wf-node__bar{width:4px;flex:0 0 4px;background:var(--engine)}.wf-node__body{flex:1;min-width:0;padding:10px 12px}.wf-node__top{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.wf-node__engine{font-size:10.5px;font-weight:600;letter-spacing:.02em;color:#fff;background:var(--engine);padding:2px 7px;border-radius:var(--radius-pill)}.wf-node__flag{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:var(--radius-pill);color:var(--text-soft);background:var(--bg-fill-tertiary)}.wf-node__flag--human{color:var(--amber);background:var(--amber-bg)}.wf-node__name{font-size:13.5px;font-weight:600;color:var(--text-strong);line-height:1.35;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wf-node__recipe{margin-top:3px;font-family:var(--mono);font-size:11px;color:var(--text-soft);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wf-node__handle{width:7px;height:7px;background:var(--border-strong);border:1.5px solid var(--bg-elevated)}.wf-node.is-selected{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft),var(--shadow-md)}.wf-node.is-running{border-color:var(--engine);animation:wf-node-pulse 1.6s var(--ease-out) infinite}.wf-node.is-success{border-color:var(--green-border)}.wf-node.is-error{border-color:var(--red-border)}.wf-node.is-review{border-color:var(--amber-border)}@keyframes wf-node-pulse{0%,to{box-shadow:var(--shadow-sm)}50%{box-shadow:0 0 0 4px var(--accent-soft),var(--shadow-md)}}.wf-node.is-config-missing{border-color:var(--red-border)}.wf-node.is-config-missing .wf-node__bar{background:var(--red)}.wf-node__top-right{display:flex;align-items:center;gap:4px}.wf-node__config-badge{font-size:10px;font-weight:700;color:var(--red);background:var(--red-bg);padding:1px 6px;border-radius:var(--radius-pill);border:1px solid var(--red-border);white-space:nowrap}.wf-node__config-warn{margin-top:6px;padding-top:5px;border-top:1px solid var(--border-soft);font-size:11px;color:var(--red);font-weight:500}.dw-tabs{display:flex;align-items:center;gap:0;border-bottom:1px solid var(--border-soft);background:var(--bg-subtle);flex:0 0 auto}.dw-tabs__tab{display:flex;align-items:center;gap:6px;padding:8px 16px;border:none;border-bottom:2px solid transparent;background:transparent;color:var(--text-muted);font-size:12.5px;font-weight:500;cursor:pointer;transition:color var(--dur-quick) var(--ease-out),border-color var(--dur-quick) var(--ease-out)}.dw-tabs__tab:hover{color:var(--text)}.dw-tabs__tab.is-active{color:var(--text-strong);font-weight:600;border-bottom-color:var(--accent)}.step-config-form{display:flex;flex-direction:column;width:320px;min-width:280px;max-width:380px;border-left:1px solid var(--border);background:var(--bg-panel);overflow-y:auto}.step-config-form__head{display:flex;align-items:center;gap:7px;padding:10px 14px;border-bottom:1px solid var(--border-soft);background:var(--bg-subtle)}.step-config-form__title{font-size:13px;font-weight:600;color:var(--text-strong)}.step-config-form__meta{padding:6px 14px;border-bottom:1px solid var(--border-soft)}.step-config-form__recipe{font-family:var(--mono);font-size:11.5px;color:var(--text-soft)}.step-config-form__body{flex:1;padding:12px 14px;display:flex;flex-direction:column;gap:16px}.step-config-form__group{border:none;padding:0;margin:0}.step-config-form__group-title{font-size:11.5px;font-weight:600;color:var(--text-muted);margin-bottom:8px;padding-bottom:4px;border-bottom:1px solid var(--border-soft)}.step-config-form__field{display:flex;flex-direction:column;gap:4px;margin-bottom:10px}.step-config-form__label{font-size:12px;font-weight:600;color:var(--text-muted)}.step-config-form__help{font-size:11px;color:var(--text-soft)}.step-config-form__required-hint{font-size:11px;color:var(--red);font-weight:500}.step-config-form__env-ref{display:flex;flex-direction:column;gap:4px;margin-bottom:10px}.step-config-form__env-mapping{font-family:var(--mono);font-size:11px;color:var(--text-soft);padding:2px 6px;border-radius:var(--radius-xs);background:var(--bg-fill-tertiary)}.step-config-form__foot{display:flex;justify-content:flex-end;gap:8px;padding:10px 14px;border-top:1px solid var(--border-soft)}.step-config-form__btn{padding:6px 14px;border:1px solid var(--border-strong);border-radius:var(--radius);background:var(--bg-elevated);color:var(--text);font-size:12.5px;cursor:pointer;transition:background var(--dur-quick) var(--ease-out)}.step-config-form__btn:hover{background:var(--bg-subtle)}.step-config-form__btn.primary{border-color:transparent}.is-required-empty{border-color:var(--red-border)!important;box-shadow:0 0 0 1px var(--red-border)}.design-progress{justify-content:center;gap:16px;padding:28px;background:radial-gradient(circle at 20% 10%,var(--accent-tint),transparent 34%),var(--bg-panel)}.design-progress__hero{display:flex;align-items:flex-start;gap:12px;max-width:640px}.design-progress__icon{display:grid;place-items:center;width:36px;height:36px;flex:0 0 auto;border-radius:var(--radius-pill);background:linear-gradient(135deg,var(--accent),var(--accent-strong));box-shadow:var(--shadow-sm)}.design-progress__title{font-size:18px;font-weight:700;color:var(--text-strong)}.design-progress__message{margin-top:5px;color:var(--text-muted);font-size:13.5px;line-height:1.6}.design-progress .todo-card{max-width:640px;width:100%;box-shadow:var(--shadow-sm)}.design-progress__meta{display:flex;flex-wrap:wrap;gap:8px;max-width:640px;color:var(--text-soft);font-size:12px}.design-progress__meta span{padding:4px 9px;border:1px solid var(--border-soft);border-radius:var(--radius-pill);background:var(--bg-subtle)}.code-panel{display:grid;grid-template-columns:180px minmax(0,1fr);min-width:0;flex:1;min-height:0;background:var(--bg-panel)}.code-panel.tree-collapsed{grid-template-columns:32px minmax(0,1fr)}.code-tree__bar{display:flex;align-items:center;gap:6px;padding:2px 2px 6px;margin-bottom:2px;border-bottom:1px solid var(--border-soft)}.code-tree__heading{font-size:11px;font-weight:600;letter-spacing:.04em;color:var(--text-soft)}.code-tree__toggle,.code-tree__expand{display:grid;place-items:center;width:22px;height:22px;border:none;border-radius:var(--radius-sm);background:transparent;color:var(--text-soft);cursor:pointer;transition:background var(--dur-quick) var(--ease-out),color var(--dur-quick) var(--ease-out)}.code-tree__toggle{margin-left:auto}.code-tree__expand{margin:8px auto 0;border-right:1px solid var(--border-soft);border-radius:0;width:32px;height:32px}.code-tree__toggle:hover,.code-tree__expand:hover{background:var(--bg-fill-tertiary);color:var(--text)}.code-tree{display:flex;flex-direction:column;gap:2px;padding:10px 8px;overflow-y:auto;border-right:1px solid var(--border-soft);background:var(--bg-subtle)}.code-tree__file{display:flex;align-items:center;gap:7px;width:100%;padding:6px 9px;border:none;border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);font-size:12.5px;font-family:var(--mono);text-align:left;cursor:pointer;transition:background var(--dur-quick) var(--ease-out)}.code-tree__file:hover{background:var(--bg-fill-tertiary);color:var(--text)}.code-tree__file-text{display:flex;flex-direction:column;min-width:0;gap:1px}.code-tree__file-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.code-tree__file-summary{color:var(--text-soft);font-family:var(--font-sans);font-size:11px;font-weight:500}.code-tree__file.is-nested{padding-left:20px}.code-tree__file.is-active{background:var(--bg-fill-secondary);color:var(--text-strong);font-weight:600}.code-tree__file.is-linked{color:var(--accent);background:var(--accent-tint)}.code-tree__folder{display:flex;align-items:center;gap:7px;padding:8px 9px 4px;color:var(--text-soft);font-size:11.5px;font-weight:600;letter-spacing:.02em}.code-editor{display:flex;flex-direction:column;min-width:0;min-height:0}.code-editor__head{display:flex;align-items:center;gap:7px;padding:8px 14px;border-bottom:1px solid var(--border-soft);color:var(--text-muted);font-size:12px;font-family:var(--mono);background:var(--code-header-bg)}.code-editor__lang{margin-left:auto;font-size:10.5px;color:var(--text-soft);text-transform:uppercase;letter-spacing:.04em}.code-editor__body{flex:1;min-height:0}.code-editor__loading{display:flex;align-items:center;justify-content:center;height:100%;color:var(--text-soft);font-size:13px}.setup-theater{padding:16px}.setup-intro{display:flex;flex-direction:column;align-items:center;text-align:center;gap:12px;max-width:420px;margin:48px auto 0}.setup-intro__icon{width:60px;height:60px;border-radius:var(--radius-lg);display:grid;place-items:center;background:linear-gradient(135deg,var(--accent),var(--accent-strong));box-shadow:var(--shadow-md)}.setup-intro__title{margin:4px 0 0;font-size:19px;color:var(--text-strong)}.setup-intro__desc{margin:0;color:var(--text-muted);font-size:14px;line-height:1.7}.setup-intro__desc b{color:var(--accent)}.setup-intro__cta{margin-top:8px;padding:10px 22px;font-size:15px}.setup-recovery-card{width:100%;margin-top:10px;padding:12px;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-subtle);text-align:left}.setup-recovery-card__title{font-size:13px;font-weight:600;color:var(--text-strong)}.setup-recovery-card__desc{margin:6px 0 10px;font-size:12.5px;line-height:1.6;color:var(--text-muted)}.setup-recovery-card__form{display:flex;gap:8px;align-items:center}.setup-recovery-card__form input{min-width:0}.setup-recovery-card__form button{flex:0 0 auto}.setup-section{margin-bottom:22px}.setup-section__head{display:flex;align-items:center;gap:7px;margin-bottom:12px;font-size:13.5px;font-weight:600;color:var(--text-strong)}.setup-section__count{margin-left:auto;font-family:var(--mono);font-size:12px;font-weight:500;color:var(--text-soft)}.setup-group-label{margin:10px 0 8px;font-size:11.5px;font-weight:600;letter-spacing:.02em;color:var(--text-soft)}.field-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:8px}.field-chip{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:9px 12px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-elevated);box-shadow:var(--shadow-xs)}.field-chip--process{border-style:dashed;background:var(--bg-subtle)}.field-chip__name{font-size:13px;font-weight:500;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.field-chip__type{flex:0 0 auto;font-size:11px;color:var(--text-soft);background:var(--bg-fill-tertiary);padding:2px 7px;border-radius:var(--radius-pill)}.view-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:10px}.view-card{padding:12px 14px;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-elevated);box-shadow:var(--shadow-xs)}.view-card__kind{display:inline-block;font-size:11px;font-weight:600;color:#fff;padding:2px 8px;border-radius:var(--radius-pill);background:var(--text-soft)}.view-card__kind--grid{background:var(--blue)}.view-card__kind--kanban{background:var(--purple)}.view-card__kind--calendar{background:var(--green)}.view-card__kind--form{background:var(--accent)}.view-card__name{margin:8px 0 3px;font-size:13.5px;font-weight:600;color:var(--text-strong)}.view-card__desc{font-size:12px;color:var(--text-muted);line-height:1.5}.table-link-card{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 16px;margin-bottom:20px;border:1px solid var(--green-border);border-radius:var(--radius-lg);background:var(--green-bg)}.table-link-card__info{display:flex;align-items:center;gap:12px}.table-link-card__badge{width:30px;height:30px;flex:0 0 auto;border-radius:var(--radius-pill);display:grid;place-items:center;background:var(--green)}.table-link-card__title{font-size:14px;font-weight:600;color:var(--text-strong)}.table-link-card__sub{margin-top:2px;font-size:12.5px;color:var(--text-muted)}.table-link-card__open{flex:0 0 auto;text-decoration:none;padding:9px 16px}.adjust{padding:32px 40px 100px;overflow-y:auto;width:100%;max-width:1100px;margin:0 auto}.adjust__head{margin-bottom:16px}.adjust__title{font-size:20px;font-weight:700;color:var(--text-strong);margin:0}.adjust__sub{font-size:14px;color:var(--text-muted);margin:6px 0 0}.adjust__hint{display:flex;align-items:center;gap:8px;padding:8px 12px;margin-bottom:16px;border-radius:var(--radius);background:var(--bg-fill-tertiary);font-size:13px;color:var(--text-muted)}.adjust__hint code{font-family:var(--mono);font-size:12px}.adjust__loading{padding:32px;text-align:center;color:var(--text-muted);font-size:14px}.adjust__error{display:flex;align-items:center;gap:8px;padding:12px 16px;border-radius:var(--radius);background:var(--red-bg);border:1px solid var(--red-border);color:var(--red);font-size:13px;margin-bottom:16px}.adjust__retry{margin-left:auto;font-size:12px;padding:3px 12px;border-radius:var(--radius-sm);background:transparent;border:1px solid var(--red-border);color:var(--red);cursor:pointer}.adjust__retry:hover{background:var(--red-bg)}.adjust__done{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:50vh;gap:10px;text-align:center}.adjust__done-icon{width:56px;height:56px;border-radius:50%;display:grid;place-items:center;background:var(--green-bg);border:1px solid var(--green-border)}.adjust__done-title{font-size:20px;font-weight:650;color:var(--text-strong);margin:8px 0 0}.adjust__done-text{color:var(--text-muted);font-size:14px;margin:0}.adjust__done-hint{color:var(--text-soft);font-size:13px;margin:0}.adjust__tab-area{width:80%;margin:0 auto}.adjust__tabs{display:flex;gap:0;border-bottom:1px solid var(--border);margin-bottom:20px}.adjust__tab{display:flex;align-items:center;gap:6px;padding:10px 18px;font-size:14px;font-weight:500;color:var(--text-muted);background:transparent;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:color var(--dur-quick) var(--ease-out),border-color var(--dur-quick) var(--ease-out);position:relative}.adjust__tab:hover{color:var(--text)}.adjust__tab.is-active{color:var(--text-strong);font-weight:600;border-bottom-color:var(--accent)}.adjust__tab-dot{width:6px;height:6px;border-radius:50%;background:var(--red);flex-shrink:0}.adjust__tab-content{min-height:300px}.adjust__tab-inner{display:flex;flex-direction:column;gap:16px}.adjust__section{border:1px solid var(--border-soft);border-radius:var(--radius);padding:16px;background:var(--bg-panel)}.adjust__section-title{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:600;color:var(--text);margin:0 0 12px}.adjust__engine-row{display:flex;align-items:center;gap:10px}.adjust__engine-select{min-width:280px}.adjust__engine-warn{display:flex;align-items:center;gap:4px;font-size:12px;color:var(--red);max-width:400px}.adjust__engine-ok{display:flex;align-items:center}.adjust__engine-saving{font-size:12px;color:var(--text-muted)}.adjust__hint-text{font-size:12px;color:var(--text-soft);margin:6px 0 0}.adjust__empty{display:flex;align-items:center;justify-content:center;gap:8px;padding:40px 20px;color:var(--text-muted);font-size:14px}.role-card{border:1px solid var(--border-soft);border-radius:var(--radius);background:var(--bg-panel);overflow:hidden}.role-card.is-ok{border-color:var(--green-border)}.role-card__head{display:flex;align-items:center;gap:8px;padding:12px 16px;border-bottom:1px solid var(--border-soft)}.role-card__name{font-weight:600;font-size:14px;color:var(--text);flex:1}.role-card__status{font-size:12px;color:var(--text-muted)}.role-card__status.is-ok{color:var(--green);display:flex;align-items:center;gap:4px}.role-card__body{padding:8px 0}.role-card__kb{margin-top:8px;padding-top:8px;border-top:1px dashed var(--border-soft)}.role-card__kb-title{font-size:12px;font-weight:600;color:var(--text-muted);margin-bottom:6px}.wf-card{border:1px solid var(--border-soft);border-radius:var(--radius);background:var(--bg-panel);overflow:hidden}.wf-card.is-done{border-color:var(--green-border)}.wf-card__head{display:flex;align-items:center;gap:8px;padding:12px 16px;width:100%;background:transparent;border:none;cursor:pointer;font-size:14px;color:var(--text);text-align:left}.wf-card__head:hover{background:var(--bg-fill-tertiary)}.wf-card__icon{color:var(--text-muted)}.wf-card__name{font-weight:600;flex:1}.wf-card__badge{font-size:12px;padding:2px 8px;border-radius:var(--radius-pill);background:var(--red-bg);color:var(--red);border:1px solid var(--red-border)}.wf-card__badge--process{background:var(--bg-fill-tertiary);color:var(--amber);border-color:var(--border-soft)}.wf-card__status{font-size:12px;color:var(--text-muted)}.wf-card__status.is-ok{color:var(--green);display:flex;align-items:center;gap:4px}.wf-card__chevron{transition:transform var(--dur-quick) var(--ease-out);color:var(--text-soft)}.wf-card__chevron.is-open{transform:rotate(90deg)}.wf-card__body{border-top:1px solid var(--border-soft)}.wf-card__tracker{padding:8px 8px 0;border-bottom:1px solid var(--border-soft)}.wf-card__canvas-row{display:flex;min-height:340px}.wf-card__canvas-row.has-panel{min-height:380px}.wf-card__canvas{flex:1;min-width:0;position:relative}.wf-card__canvas .wf-canvas{height:100%;min-height:340px}.wf-card__panel{width:320px;min-width:280px;max-width:380px;border-left:1px solid var(--border);display:flex;flex-direction:column;background:var(--bg-elevated);overflow-y:auto}.wf-card__panel-head{display:flex;align-items:center;gap:8px;padding:10px 14px;border-bottom:1px solid var(--border-soft);font-size:13px;font-weight:600;color:var(--text);flex-shrink:0}.wf-card__panel-close{margin-left:auto;background:transparent;border:none;cursor:pointer;color:var(--text-muted);padding:2px;border-radius:var(--radius-xs)}.wf-card__panel-close:hover{background:var(--bg-fill-secondary)}.wf-card__panel-body{flex:1;overflow-y:auto;padding:4px 0}.wf-card__panel-divider{padding:8px 16px 4px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--text-soft);border-top:1px solid var(--border-soft);margin-top:4px}.wf-card__events{border-top:1px solid var(--border-soft);padding:8px 0 4px}.wf-card__events-title{display:flex;align-items:center;gap:6px;padding:4px 16px 8px;font-size:12px;font-weight:600;color:var(--text-muted)}@media (max-width: 768px){.adjust{padding:20px 16px 100px}.wf-card__canvas-row{flex-direction:column}.wf-card__panel{width:100%;max-width:none;border-left:none;border-top:1px solid var(--border)}.adjust__engine-row{flex-direction:column;align-items:flex-start}.adjust__engine-select{min-width:100%}}.prov-card{border:1px solid var(--border-soft);border-radius:var(--radius);background:var(--bg-panel);padding:12px 14px;margin-top:10px}.prov-card__head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.prov-card__label{font-size:13px;font-weight:600;color:var(--text)}.prov-card__store{font-size:11px;color:var(--text-muted);font-family:var(--font-mono, monospace)}.prov-card__instances{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}.prov-chip{display:inline-flex;align-items:center;gap:5px;padding:3px 8px;border-radius:999px;background:var(--green-tint, rgba(0, 160, 90, .1));border:1px solid var(--green-border, rgba(0, 160, 90, .3));font-size:12px;color:var(--text)}.prov-chip__remove{display:inline-flex;border:none;background:none;cursor:pointer;color:var(--text-muted);padding:0}.prov-chip__remove:hover{color:var(--red)}.prov-card__empty{margin-top:8px;font-size:12px;color:var(--text-muted)}.prov-add-btn{margin-top:10px;display:inline-flex;align-items:center;gap:5px;padding:5px 10px;border:1px dashed var(--border);border-radius:var(--radius-sm, 6px);background:none;cursor:pointer;font-size:12px;color:var(--accent)}.prov-add-btn:hover{background:var(--accent-tint)}.prov-form{margin-top:10px;padding:12px;border:1px solid var(--border-soft);border-radius:var(--radius-sm, 6px);background:var(--bg);display:flex;flex-direction:column;gap:8px}.prov-form__field{display:flex;flex-direction:column;gap:4px}.prov-form__label{display:flex;align-items:center;gap:6px;font-size:12px;font-weight:500;color:var(--text)}.prov-form__hint{font-size:11px;color:var(--text-muted);font-family:var(--font-mono, monospace)}.process-errors{border:1px solid var(--red-border);border-radius:var(--radius);background:var(--red-bg);padding:12px 16px;margin-top:16px}.process-errors__head{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:600;color:var(--red);margin-bottom:8px}.process-errors__copy{margin-left:auto;font-size:12px;padding:2px 10px;border-radius:var(--radius-sm);background:transparent;border:1px solid var(--red-border);color:var(--red);cursor:pointer}.process-errors__copy:hover{background:var(--bg-fill-tertiary)}.process-errors__item{display:flex;align-items:flex-start;gap:8px;padding:6px 0;border-top:1px solid var(--border-soft)}.process-errors__item:first-of-type{border-top:none}.process-errors__item--warn{opacity:.85}.process-errors__icon{flex-shrink:0;margin-top:1px}.process-errors__body{display:flex;flex-direction:column;gap:2px;min-width:0}.process-errors__key{font-family:var(--mono);font-size:11px;color:var(--text-muted)}.process-errors__msg{font-size:13px;color:var(--text);word-break:break-word;line-height:1.5}.cfg-card__head--toggle{cursor:pointer;width:100%;text-align:left;border:none;background:none;padding:12px 16px;display:flex;align-items:center;gap:8px;font:inherit;color:inherit}.cfg-card__head--toggle:hover{background:var(--bg-fill-tertiary)}.cfg-card__counts{display:flex;gap:8px;margin-left:auto}.cfg-count{font-size:11px;font-weight:600;padding:2px 8px;border-radius:var(--radius-pill)}.cfg-count--error{background:var(--red-bg);color:var(--red)}.cfg-count--warn{background:var(--amber-bg);color:var(--amber)}.cfg-card__chevron{transition:transform var(--dur-quick) var(--ease-out);color:var(--text-muted)}.cfg-card__chevron.is-open{transform:rotate(90deg)}.cfg-item{padding:10px 16px;border-bottom:1px solid var(--border-soft)}.cfg-item:last-child{border-bottom:none}.cfg-item__head{display:flex;align-items:center;gap:8px}.cfg-item__status{flex:0 0 auto}.cfg-item__label{font-size:13px;font-weight:550;color:var(--text-strong)}.cfg-item__badge{font-size:10px;font-weight:600;padding:1px 6px;border-radius:var(--radius-pill)}.cfg-item__badge--sensitive{background:var(--amber-bg);color:var(--amber);border:1px solid var(--amber-border)}.cfg-item__badge--required{background:var(--red-bg);color:var(--red);border:1px solid var(--red-border)}.cfg-item__desc{font-size:12px;color:var(--text-muted);margin:4px 0 0 22px}.cfg-item__value-row{display:flex;align-items:center;gap:8px;margin:6px 0 0 22px}.cfg-item__value{font-size:13px;font-family:var(--mono);color:var(--text);word-break:break-all}.cfg-item__value--multiline{white-space:pre-wrap;word-break:break-word;max-height:180px;overflow-y:auto;display:block;flex:1}.cfg-item__edit-btn{font-size:12px;padding:2px 10px;border-radius:var(--radius-sm);background:var(--bg-fill-tertiary);border:1px solid var(--border);color:var(--accent);cursor:pointer;transition:all var(--dur-quick) var(--ease-out)}.cfg-item__edit-btn:hover{background:var(--accent-tint);border-color:var(--accent-soft)}.cfg-item__edit{margin:8px 0 0 22px;display:flex;flex-direction:column;gap:8px}.cfg-item__input{width:100%;box-sizing:border-box}.cfg-item__edit-actions{display:flex;gap:8px}.cfg-item__save-btn{font-size:12px;padding:4px 14px}.cfg-item__cancel-btn{font-size:12px;padding:4px 14px;border-radius:var(--radius-sm);background:var(--bg-fill-tertiary);border:1px solid var(--border);color:var(--text-muted);cursor:pointer}.cfg-item__cancel-btn:hover{background:var(--bg-fill-secondary)}.cfg-item__kb-error{display:flex;align-items:center;gap:4px;font-size:12px;color:var(--red);margin-top:4px}.cfg-item__suggest{font-size:12px;color:var(--text-muted);margin-top:4px}.cfg-item__suggest code{font-family:var(--font-mono, monospace);color:var(--accent);background:var(--accent-tint);padding:1px 5px;border-radius:4px}.cfg-item__kb-success{display:flex;align-items:center;gap:4px;font-size:12px;color:var(--green);padding:4px 0}.env-map{display:flex;flex-direction:column;gap:8px}.env-map__hint{font-size:12px;color:var(--text-muted);margin:0}.env-map__hint code{font-family:var(--mono);color:var(--accent);background:var(--accent-tint);padding:1px 5px;border-radius:4px;margin:0 2px}.env-map__entry{border:1px solid var(--border);border-radius:var(--radius-sm);padding:8px 10px;display:flex;flex-direction:column;gap:6px;background:var(--bg-fill-tertiary)}.env-map__entry-head{display:flex;align-items:center;gap:8px}.env-map__entry-index{font-size:12px;color:var(--text-muted);flex-shrink:0}.env-map__key-input{flex:1;font-family:var(--mono)}.env-map__remove-btn{flex-shrink:0;padding:4px;border-radius:var(--radius-sm);background:transparent;border:1px solid var(--border);color:var(--text-muted);cursor:pointer;display:inline-flex;align-items:center}.env-map__remove-btn:hover{color:var(--red);border-color:var(--red)}.env-map__fields{display:flex;flex-direction:column;gap:4px;margin-left:24px}.env-map__field{display:flex;align-items:center;gap:8px}.env-map__field-name{font-size:12px;font-family:var(--mono);color:var(--text-muted);min-width:96px;text-align:right;flex-shrink:0}.env-map__field-input{flex:1}.env-map__add-btn{align-self:flex-start;display:inline-flex;align-items:center;gap:4px;font-size:12px;padding:4px 12px;border-radius:var(--radius-sm);background:var(--bg-fill-tertiary);border:1px dashed var(--border);color:var(--accent);cursor:pointer}.env-map__add-btn:hover{background:var(--accent-tint);border-color:var(--accent-soft)}.env-map__error{font-size:12px;color:var(--red)}.kb-panel{margin:8px 0 0 22px;display:flex;flex-direction:column;gap:8px}.kb-panel__results{display:flex;flex-direction:column;gap:4px}.kb-panel__result{display:flex;align-items:flex-start;gap:6px;font-size:12px;line-height:1.5;padding:4px 0;white-space:pre-wrap}.kb-panel__result.is-ok{color:var(--green)}.kb-panel__result.is-error{color:var(--red)}.kb-panel__rows{display:flex;flex-direction:column;gap:6px;padding:8px;border:1px solid var(--border-soft);border-radius:var(--radius);background:var(--bg-fill-tertiary)}.kb-panel__row{display:flex;align-items:center;gap:8px}.kb-panel__type-select{flex:0 0 auto;width:120px;font-size:12px;padding:4px 8px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg);color:var(--text);cursor:pointer}.kb-panel__file-area{flex:1;display:flex;align-items:center;gap:6px;min-width:0}.kb-panel__file-info{font-size:12px;color:var(--text);flex-shrink:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:default}.kb-panel__file-placeholder{font-size:12px;color:var(--text-muted)}.kb-panel__file-btn{flex:0 0 auto;font-size:11px;padding:3px 8px;border-radius:var(--radius-sm);background:var(--bg);border:1px solid var(--border);color:var(--accent);cursor:pointer;white-space:nowrap}.kb-panel__file-btn:hover{background:var(--accent-tint);border-color:var(--accent-soft)}.kb-panel__url-input{flex:1;font-size:12px;min-width:0}.kb-panel__row-remove{flex:0 0 auto;display:flex;align-items:center;justify-content:center;width:20px;height:20px;border:none;background:transparent;cursor:pointer;color:var(--text-muted);border-radius:var(--radius-xs)}.kb-panel__row-remove:hover{background:var(--bg-fill-secondary);color:var(--red)}.kb-panel__actions{display:flex;align-items:center;gap:8px}.kb-panel__import-btn{font-size:12px;padding:4px 14px}.cfg-workflow-group{border-top:1px solid var(--border-soft)}.cfg-workflow-group:first-child{border-top:none}.cfg-workflow-group__head{display:flex;align-items:center;gap:6px;padding:8px 16px;font-size:12px;font-weight:600;color:var(--text-muted);background:var(--bg-fill-tertiary)}.cfg-workflow-group__status{margin-left:auto;font-size:11px}.cfg-workflow-group__status.is-ok{color:var(--green)}.cfg-summary{position:fixed;bottom:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;padding:12px 24px;background:var(--bg-panel);border-top:1px solid var(--border);box-shadow:var(--shadow-md);z-index:10}.cfg-summary--ok{border-top-color:var(--green-border);background:color-mix(in srgb,var(--green-bg) 30%,var(--bg-panel))}.cfg-summary__stats{display:flex;align-items:center;gap:16px}.cfg-summary__stat{display:flex;align-items:center;gap:4px;font-size:13px;color:var(--text-muted)}.cfg-summary__stat--error{color:var(--red);font-weight:600}.cfg-summary__stat--warn{color:var(--amber)}.cfg-summary__btn{padding:8px 20px;font-size:14px}.file-ref{margin-top:6px}.file-ref__toggle{display:flex;align-items:center;gap:6px;width:100%;padding:5px 8px;background:var(--surface-2, rgba(0, 0, 0, .02));border:1px solid var(--border);border-radius:6px;cursor:pointer;text-align:left}.file-ref__toggle:hover{border-color:var(--text-muted)}.file-ref__chevron{display:inline-flex;transition:transform .15s ease;color:var(--text-muted)}.file-ref__chevron.is-open{transform:rotate(90deg)}.file-ref__path{font-family:var(--mono);font-size:12px;color:var(--text)}.file-ref__summary{margin-left:auto;font-size:11px;color:var(--text-muted);font-family:var(--mono)}.file-ref__missing{margin-left:auto;font-size:11px;color:var(--amber)}.file-ref__locked-hint{display:flex;align-items:center;gap:4px;margin-top:4px;padding-left:2px;font-size:11px;color:var(--text-muted)}.file-ref__body{margin-top:6px;padding:8px;border:1px solid var(--border);border-radius:6px}.file-ref__pre{margin:0;max-height:320px;overflow:auto;font-family:var(--mono);font-size:12px;line-height:1.55;white-space:pre;color:var(--text)}.file-ref__editor{width:100%;min-height:320px;font-family:var(--mono);font-size:12px;line-height:1.55;white-space:pre;overflow-wrap:normal;overflow-x:auto}.file-ref__actions{display:flex;align-items:center;gap:8px;margin-top:8px}.file-ref__btn{font-size:12px;padding:4px 12px;border-radius:5px;cursor:pointer}.file-ref__hint{font-size:11px;color:var(--text-muted)}.file-ref__hint--inline{margin-left:auto}.file-ref__saved{display:inline-flex;align-items:center;gap:4px;font-size:11px;color:var(--green)}.file-ref__error{display:flex;align-items:flex-start;gap:6px;margin-bottom:8px;padding:6px 8px;font-size:12px;color:var(--red);background:var(--red-bg);border-radius:5px;word-break:break-word}.test-stage{display:grid;grid-template-columns:1fr 280px 320px;flex:1;min-height:0;min-width:0}.test-main{display:flex;flex-direction:column;min-width:0;border-right:1px solid var(--border)}.test-main__head{display:flex;align-items:center;gap:10px;padding:10px 16px;border-bottom:1px solid var(--border-soft);background:var(--bg-subtle)}.test-guide,.test-intro{display:flex;flex-direction:column;align-items:center;justify-content:center;flex:1;gap:18px;padding:40px 32px;text-align:center}.test-guide__icon,.test-intro__icon{display:grid;place-items:center;width:56px;height:56px;border-radius:var(--radius-lg);background:var(--accent)}.test-guide__title,.test-intro__title{font-size:18px;font-weight:700;color:var(--text-strong);margin:0}.test-intro__desc{font-size:14px;color:var(--text-muted);max-width:400px;line-height:1.6}.test-guide__steps{display:flex;flex-direction:column;gap:10px;text-align:left;width:100%;max-width:380px}.test-guide__step{display:flex;align-items:center;gap:10px;padding:10px 14px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-elevated);font-size:13.5px;color:var(--text)}.test-guide__step-num{display:grid;place-items:center;width:22px;height:22px;flex:0 0 auto;border-radius:var(--radius-pill);background:var(--accent);color:#fff;font-size:12px;font-weight:700}.test-guide__link{margin-left:auto;display:inline-flex;align-items:center;gap:4px;color:var(--accent);font-size:12px;font-weight:500;text-decoration:none}.test-guide__link:hover{text-decoration:underline}.test-guide__cta,.test-intro__cta{margin-top:8px}.test-result{display:flex;flex-direction:column;align-items:center;justify-content:center;flex:1;gap:14px;padding:40px 32px;text-align:center}.test-result__icon{display:grid;place-items:center;width:48px;height:48px;border-radius:var(--radius-pill)}.test-result__icon--success{background:var(--green)}.test-result__icon--failed{background:var(--red)}.test-result__title{font-size:16px;font-weight:700;color:var(--text-strong);margin:0}.test-result__desc{font-size:13.5px;color:var(--text-muted);max-width:400px;line-height:1.6}.test-result__actions{display:flex;gap:8px;margin-top:8px}.test-result__cta,.test-result__btn{padding:8px 18px;border:1px solid var(--border-strong);border-radius:var(--radius);background:var(--bg-elevated);color:var(--text);font-size:13px;cursor:pointer;transition:background var(--dur-quick) var(--ease-out)}.test-result__btn:hover{background:var(--bg-subtle)}.test-result__btn.primary{border-color:transparent}.test-flow{display:flex;flex-direction:column;border-right:1px solid var(--border);overflow-y:auto}.test-flow__head{padding:10px 14px;border-bottom:1px solid var(--border-soft);background:var(--bg-subtle);font-size:12px;font-weight:600;color:var(--text-muted)}.test-logs{display:flex;flex-direction:column;min-width:0;overflow-y:auto}.test-logs__head{display:flex;align-items:center;gap:7px;padding:10px 14px;border-bottom:1px solid var(--border-soft);background:var(--bg-subtle);font-size:12px;font-weight:600;color:var(--text-muted)}.test-logs__body{flex:1;overflow-y:auto}.run-intro{display:flex;flex-direction:column;align-items:center;text-align:center;gap:12px;max-width:440px;margin:52px auto 0}.run-intro__icon{width:60px;height:60px;border-radius:var(--radius-lg);display:grid;place-items:center;background:linear-gradient(135deg,var(--accent),var(--accent-strong));box-shadow:var(--shadow-md)}.run-intro__title{margin:4px 0 0;font-size:19px;color:var(--text-strong)}.run-intro__desc{margin:0;color:var(--text-muted);font-size:14px;line-height:1.7}.run-intro__cta{margin-top:8px;padding:10px 22px;font-size:15px}.run-stage{display:grid;grid-template-columns:288px minmax(0,1fr) 320px;height:100%;min-height:0;background:var(--bg-panel)}.run-board{display:flex;flex-direction:column;min-height:0;border-right:1px solid var(--border);background:var(--bg-subtle)}.run-board__head,.run-flow__head,.run-logs__head{display:flex;align-items:center;gap:8px;padding:14px 16px;border-bottom:1px solid var(--border-soft);font-size:13px;font-weight:600;color:var(--text-strong)}.run-board__stat{margin-left:auto;font-family:var(--mono);font-size:11.5px;font-weight:500;color:var(--text-soft)}.run-board__list{flex:1;min-height:0;overflow-y:auto;padding:10px;display:flex;flex-direction:column;gap:8px}.run-board__foot{padding:10px 16px;border-top:1px solid var(--border-soft);font-size:11.5px;color:var(--text-soft)}.run-live-start{width:100%;justify-content:center}.run-live-stop{width:100%;justify-content:center;margin-top:8px}.ticket-card{display:block;width:100%;text-align:left;padding:11px 13px;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-elevated);box-shadow:var(--shadow-xs);cursor:pointer;transition:border-color var(--dur-quick) var(--ease-out),box-shadow var(--dur-quick) var(--ease-out)}.ticket-card:hover{border-color:var(--border-strong)}.ticket-card.is-selected{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}.ticket-card__top{display:flex;align-items:center;justify-content:space-between;margin-bottom:7px}.ticket-card__prio{font-size:11px;color:var(--text-soft)}.ticket-card__title{font-size:13.5px;font-weight:600;color:var(--text-strong);line-height:1.35}.ticket-card__meta{margin-top:3px;font-size:11.5px;color:var(--text-muted)}.ticket-card__progress{display:flex;align-items:center;gap:8px;margin-top:8px;font-family:var(--mono);font-size:11px;color:var(--text-soft)}.ticket-card__await{color:var(--amber);font-weight:600;font-family:var(--sans)}.run-flow{display:flex;flex-direction:column;min-width:0;min-height:0}.run-flow__head{flex-direction:column;align-items:flex-start;gap:2px}.run-flow__title{font-size:15px;font-weight:600;color:var(--text-strong)}.run-flow__sub{font-size:12.5px;font-weight:400;color:var(--text-muted)}.step-chain{flex:1;min-height:0;overflow-y:auto;padding:20px 24px}.chain-node{position:relative}.chain-node__line{position:absolute;left:11px;top:-18px;height:18px;width:2px;background:var(--border-strong)}.chain-node__line.is-done{background:var(--green)}.chain-node__line.is-active{background:linear-gradient(var(--green),var(--accent))}.chain-node__row{display:flex;gap:12px;padding-bottom:18px}.chain-node__dot{flex:0 0 auto;width:24px;height:24px;border-radius:var(--radius-pill);display:grid;place-items:center;background:var(--bg-muted);border:2px solid var(--border-strong)}.chain-node.is-done .chain-node__dot{background:var(--green);border-color:var(--green)}.chain-node.is-active .chain-node__dot{background:var(--accent-tint);border-color:var(--accent)}.chain-node__pulse{width:8px;height:8px;border-radius:var(--radius-pill);background:var(--accent);animation:chain-pulse 1.3s var(--ease-out) infinite}.chain-node__idle{width:7px;height:7px;border-radius:var(--radius-pill);background:var(--text-faint)}@keyframes chain-pulse{0%,to{box-shadow:0 0 0 0 var(--accent-soft);opacity:1}50%{box-shadow:0 0 0 6px transparent;opacity:.7}}.chain-node__body{flex:1;min-width:0;padding-top:1px}.chain-node__name{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;font-size:14px;font-weight:600;color:var(--text-strong)}.chain-node__label{white-space:nowrap}.chain-node.is-pending .chain-node__name{color:var(--text-soft);font-weight:500}.chain-node__engine{font-size:10.5px;font-weight:600;color:#fff;background:var(--c, var(--agent-llm));padding:1px 7px;border-radius:var(--radius-pill)}.chain-node__recipe{margin-top:3px;font-family:var(--mono);font-size:11.5px;color:var(--text-soft)}.chain-node__approve{display:flex;gap:8px;margin-top:10px}.btn-approve{padding:6px 14px;font-size:13px}.btn-reject{display:inline-flex;align-items:center;gap:5px;padding:6px 14px;font-size:13px;border:1px solid var(--border-strong);border-radius:var(--radius);background:var(--bg-elevated);color:var(--text-muted);cursor:pointer;transition:border-color var(--dur-quick) var(--ease-out)}.btn-reject:hover{border-color:var(--red-border);color:var(--red)}.run-logs{display:flex;flex-direction:column;min-height:0;border-left:1px solid var(--border);background:var(--bg-subtle)}.run-logs__sub{margin-left:auto;font-size:11px;font-weight:400;color:var(--text-soft);max-width:140px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.run-logs__body{flex:1;min-height:0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:8px}.log-line{display:flex;gap:9px;padding:8px 10px;border-radius:var(--radius-sm);background:var(--bg-elevated);border:1px solid var(--border-soft)}.log-line__icon{flex:0 0 auto;width:18px;height:18px;border-radius:var(--radius-pill);display:grid;place-items:center;color:var(--text-soft);background:var(--bg-fill-tertiary)}.log-line--ai .log-line__icon{color:var(--purple);background:var(--purple-bg)}.log-line--ok .log-line__icon{color:var(--green);background:var(--green-bg)}.log-line--warn .log-line__icon{color:var(--amber);background:var(--amber-bg)}.log-line--error .log-line__icon{color:var(--red);background:var(--red-bg)}.log-line__content{min-width:0}.log-line__step{display:block;font-size:10.5px;font-weight:600;color:var(--text-soft);margin-bottom:1px}.log-line__text{font-size:12.5px;color:var(--text);line-height:1.5}.import-panel{width:100%;max-width:600px;background:var(--bg-elevated);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);overflow:hidden;animation:modal-scale-in var(--dur-enter) var(--ease-out)}.import-panel__head{display:flex;align-items:center;padding:16px 20px 12px;border-bottom:1px solid var(--border-soft)}.import-panel__title{flex:1;font-size:16px;font-weight:700;color:var(--text-strong)}.import-panel__body{padding:20px;display:flex;flex-direction:column;gap:16px}.import-panel__sources{display:flex;gap:10px}.import-source{flex:1;display:flex;align-items:center;gap:8px;padding:12px 14px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-panel);font-size:13.5px;color:var(--text);cursor:pointer;transition:border-color var(--dur-quick) var(--ease-out);white-space:nowrap}.import-source input[type=radio]{accent-color:var(--accent);margin:0;flex:0 0 auto}.import-source:hover{border-color:var(--border-strong)}.import-source.is-selected{border-color:var(--accent);background:var(--accent-tint)}.import-drop{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:32px;border:2px dashed var(--border-strong);border-radius:var(--radius);background:var(--bg-subtle);color:var(--text-muted);font-size:13px;cursor:pointer;transition:border-color var(--dur-quick) var(--ease-out),color var(--dur-quick) var(--ease-out)}.import-drop:hover{border-color:var(--accent);color:var(--accent)}.import-preview__title{font-size:13px;font-weight:600;color:var(--text-muted);margin-bottom:8px}.import-preview__list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px}.import-preview__item{display:flex;align-items:center;gap:8px;padding:6px 10px;border-radius:var(--radius-sm);font-size:13px;font-family:var(--mono)}.import-preview__item--ok{color:var(--green)}.import-preview__item--warning{color:var(--amber)}.import-preview__item--error{color:var(--red)}.import-preview__icon{flex:0 0 auto;font-weight:700}.import-preview__path{flex:1;color:var(--text)}.import-preview__detail{font-family:var(--sans);font-size:11.5px;color:var(--text-soft)}.import-env-warn{display:flex;align-items:center;gap:6px;padding:8px 12px;border-radius:var(--radius);background:var(--amber-bg);border:1px solid var(--amber-border);color:var(--amber);font-size:12.5px;font-weight:500}.import-panel__foot{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px 16px;border-top:1px solid var(--border-soft)}.import-templates{display:flex;flex-direction:column;gap:4px;max-height:260px;overflow-y:auto}.import-template{display:flex;align-items:center;gap:10px;width:100%;padding:10px 14px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-panel);color:var(--text);font-size:13.5px;cursor:pointer;text-align:left;transition:border-color var(--dur-quick) var(--ease-out),background var(--dur-quick) var(--ease-out)}.import-template:hover{border-color:var(--accent);background:var(--bg-fill-tertiary)}.import-template.is-selected{border-color:var(--accent);background:var(--accent-tint)}.import-template__icon{color:var(--text-muted);flex:0 0 auto}.import-template__name{flex:1;font-weight:500}.import-confirm{display:flex;flex-direction:column;align-items:center;gap:12px;padding:16px 0;text-align:center}.import-confirm__icon{width:48px;height:48px;border-radius:var(--radius-lg);display:grid;place-items:center;background:var(--accent-tint);color:var(--accent)}.import-confirm__title{margin:0;font-size:16px;font-weight:600;color:var(--text-strong)}.import-confirm__desc{margin:0;font-size:13px;color:var(--text-muted);line-height:1.6}.import-confirm__input{width:100%;max-width:320px;padding:8px 12px;border:1px solid var(--border);border-radius:var(--radius);font-size:14px;color:var(--text);background:var(--bg-panel);text-align:center}.import-confirm__input:focus{outline:none;border-color:var(--accent)}.auth-page{height:100vh;display:flex;align-items:center;justify-content:center;background:var(--bg-app);font-family:var(--sans)}.auth-card{width:380px;max-width:calc(100vw - 32px);background:var(--bg-panel);border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-md);padding:36px 32px 32px}.auth-card__brand{display:flex;align-items:center;justify-content:center;gap:10px;margin-bottom:28px}.auth-card__brand-mark{width:32px;height:32px;border-radius:var(--radius-sm);display:grid;place-items:center;background:linear-gradient(135deg,var(--accent),var(--accent-strong));color:#fff}.auth-card__brand-name{font-size:18px;font-weight:650;color:var(--text-strong);letter-spacing:.2px}.auth-card__title{font-size:20px;font-weight:600;color:var(--text-strong);text-align:center;margin:0 0 24px}.auth-field{margin-bottom:16px}.auth-field__label{display:block;font-size:13px;font-weight:500;color:var(--text);margin-bottom:6px}.auth-field__input{width:100%;padding:9px 12px;font-size:14px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-elevated);color:var(--text);transition:border-color var(--dur-quick) var(--ease-out),box-shadow var(--dur-quick) var(--ease-out)}.auth-field__input::placeholder{color:var(--text-faint)}.auth-field__input:focus{outline:none;border-color:var(--selected);box-shadow:0 0 0 3px var(--selected-soft)}.auth-field__input.is-error{border-color:var(--red)}.auth-field__hint{font-size:12px;color:var(--red);margin-top:4px;min-height:16px}.auth-error{font-size:13px;color:var(--red);background:var(--red-bg);border:1px solid var(--red-border);border-radius:var(--radius-sm);padding:8px 12px;margin-bottom:16px;text-align:center}.auth-submit{width:100%;padding:10px 16px;font-size:15px;margin-top:4px}.auth-submit:disabled{opacity:.6;cursor:not-allowed}.auth-footer{text-align:center;margin-top:20px;font-size:13px;color:var(--text-muted)}.auth-footer__link{color:var(--accent);cursor:pointer;font-weight:500;background:none;border:none;padding:0;font:inherit;text-decoration:none}.auth-footer__link:hover{color:var(--accent-hover);text-decoration:underline}@keyframes auth-spin{to{transform:rotate(360deg)}}.auth-spinner{display:inline-block;width:16px;height:16px;border:2px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:auth-spin .6s linear infinite;vertical-align:middle;margin-right:6px}.account-page{max-width:720px;margin:0 auto;padding:24px 20px 48px}.account-section{margin-bottom:32px}.account-section__title{font-size:16px;font-weight:600;color:var(--text-strong);margin:0 0 12px}.account-card{background:var(--bg-panel);border:1px solid var(--border);border-radius:var(--radius);padding:20px;box-shadow:var(--shadow-xs)}.account-card__loading{color:var(--text-muted);font-size:14px}.account-card__row{display:flex;align-items:center;gap:14px;margin-bottom:12px}.account-card__avatar{width:44px;height:44px;border-radius:50%;background:var(--bg-fill-secondary);display:grid;place-items:center;color:var(--text-muted);flex-shrink:0;overflow:hidden}.account-card__avatar-img{width:100%;height:100%;object-fit:cover}.account-card__info{display:flex;align-items:center;gap:10px}.account-card__username{font-size:17px;font-weight:600;color:var(--text-strong)}.account-card__role{font-size:12px;font-weight:500;padding:2px 8px;border-radius:var(--radius-pill);background:var(--blue-bg);color:var(--blue);border:1px solid var(--blue-border)}.account-card__role--admin{background:var(--purple-bg);color:var(--purple);border-color:var(--purple-border)}.account-card__detail{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--text-muted);padding-top:8px;border-top:1px solid var(--border-soft)}.account-card__label{color:var(--text-soft)}.account-card__value{color:var(--text)}.machine-card{background:var(--bg-panel);border:1px solid var(--border);border-radius:var(--radius);padding:16px;box-shadow:var(--shadow-xs);transition:border-color var(--dur-quick) var(--ease-out)}.machine-card:hover{border-color:var(--border-strong)}.machine-card__header{display:flex;align-items:center;gap:8px;margin-bottom:6px}.machine-status{width:8px;height:8px;border-radius:50%;flex-shrink:0}.machine-status--online{background:var(--green);box-shadow:0 0 4px var(--green)}.machine-status--offline{background:var(--text-faint)}.machine-card__name{font-size:14px;font-weight:600;color:var(--text-strong)}.machine-card__slug{font-size:12px;color:var(--text-soft);font-family:var(--mono)}.machine-card__desc{font-size:13px;color:var(--text-muted);margin-bottom:8px}.machine-card__meta{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:12px;color:var(--text-soft);margin-bottom:10px}.machine-card__id{display:flex;align-items:center;gap:4px;font-family:var(--mono);font-size:11px;color:var(--text-muted)}.machine-card__copy{background:none;border:none;padding:2px;cursor:pointer;color:var(--text-soft);display:inline-flex;align-items:center;border-radius:var(--radius-xs);transition:color var(--dur-quick) var(--ease-out)}.machine-card__copy:hover{color:var(--accent)}.machine-card__seen{font-size:12px;color:var(--text-soft);white-space:nowrap}.machine-card__actions{display:flex;justify-content:flex-end}.machine-card__revoke{font-size:12px;padding:4px 12px;border-radius:var(--radius-sm);border:1px solid var(--red-border);background:var(--red-bg);color:var(--red);cursor:pointer;transition:background var(--dur-quick) var(--ease-out),color var(--dur-quick) var(--ease-out)}.machine-card__revoke:hover{background:var(--red);color:#fff}.machine-list__loading,.machine-list__empty{font-size:14px;color:var(--text-muted);padding:20px;text-align:center;background:var(--bg-panel);border:1px solid var(--border);border-radius:var(--radius)}.machine-list__error{font-size:14px;color:var(--red);background:var(--red-bg);border:1px solid var(--red-border);border-radius:var(--radius);padding:12px 16px;display:flex;align-items:center;justify-content:space-between}.machine-list__retry{font-size:13px;padding:4px 12px;border-radius:var(--radius-sm);border:1px solid var(--red-border);background:transparent;color:var(--red);cursor:pointer}.machine-list__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.machine-list__count{font-size:13px;color:var(--text-muted)}.machine-list__header-actions{display:inline-flex;align-items:center;gap:8px}.machine-list__refresh{display:inline-flex;align-items:center;gap:4px;font-size:13px;padding:6px 12px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-panel);color:var(--text);cursor:pointer}.machine-list__refresh:hover{background:var(--bg-hover, rgba(127, 127, 127, .08))}.machine-list__add{display:inline-flex;align-items:center;gap:4px;font-size:13px;padding:6px 14px}.machine-list__grid{display:grid;gap:10px}.machine-form{background:var(--bg-panel);border:1px solid var(--border);border-radius:var(--radius);padding:20px;margin-bottom:12px;box-shadow:var(--shadow-sm)}.machine-form__title{font-size:15px;font-weight:600;color:var(--text-strong);margin-bottom:16px}.machine-form__error{font-size:13px;color:var(--red);background:var(--red-bg);border:1px solid var(--red-border);border-radius:var(--radius-sm);padding:8px 12px;margin-bottom:12px}.machine-form__field{margin-bottom:12px}.machine-form__label{display:block;font-size:13px;font-weight:500;color:var(--text);margin-bottom:4px}.machine-form__required{color:var(--red)}.machine-form__input{width:100%;padding:8px 12px;font-size:14px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-elevated);color:var(--text);transition:border-color var(--dur-quick) var(--ease-out),box-shadow var(--dur-quick) var(--ease-out)}.machine-form__input::placeholder{color:var(--text-faint)}.machine-form__input:focus{outline:none;border-color:var(--selected);box-shadow:0 0 0 3px var(--selected-soft)}.machine-form__actions{display:flex;justify-content:flex-end;gap:8px;margin-top:16px}.machine-form__cancel{font-size:13px;padding:7px 16px;border-radius:var(--radius-sm);border:1px solid var(--border);background:transparent;color:var(--text);cursor:pointer}.machine-form__cancel:hover{background:var(--bg-fill-tertiary)}.machine-form__submit{font-size:13px;padding:7px 16px}.machine-form__submit:disabled{opacity:.6;cursor:not-allowed}.user-menu{position:relative;margin-left:8px}.user-menu__trigger{display:flex;align-items:center;gap:6px;padding:4px 10px;font-size:13px;font-weight:500;color:var(--text);background:transparent;border:1px solid transparent;border-radius:var(--radius-sm);cursor:pointer;transition:background var(--dur-quick) var(--ease-out),border-color var(--dur-quick) var(--ease-out)}.user-menu__trigger:hover{background:var(--bg-fill-tertiary);border-color:var(--border)}.user-menu__name{max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.user-menu__dropdown{position:absolute;top:calc(100% + 4px);right:0;min-width:160px;background:var(--bg-panel);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow-md);padding:4px;z-index:100;animation:userMenuFadeIn var(--dur-enter) var(--ease-out)}@keyframes userMenuFadeIn{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.user-menu__item{display:flex;align-items:center;gap:8px;width:100%;padding:8px 12px;font-size:13px;color:var(--text);text-decoration:none;background:transparent;border:none;border-radius:var(--radius-xs);cursor:pointer;text-align:left;transition:background var(--dur-quick) var(--ease-out)}.user-menu__item:hover{background:var(--bg-fill-tertiary)}.user-menu__item--danger{color:var(--red)}.user-menu__item--danger:hover{background:var(--red-bg)}.user-menu__divider{height:1px;background:var(--border-soft);margin:4px 8px}.work-head__left{display:flex;align-items:center;gap:12px}.account-back-btn{display:inline-flex;align-items:center;gap:4px;padding:6px 12px;font-size:13px;font-weight:500;color:var(--text);background:transparent;border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;text-decoration:none;transition:background var(--dur-quick) var(--ease-out),border-color var(--dur-quick) var(--ease-out);white-space:nowrap}.account-back-btn:hover{background:var(--bg-fill-tertiary);border-color:var(--border-strong)}.daemon-connect-card{background:var(--bg-panel);border:1px solid var(--green-border, var(--border));border-radius:var(--radius);padding:20px;margin-bottom:12px;box-shadow:var(--shadow-sm)}.daemon-connect-card__header{display:flex;align-items:center;gap:8px;margin-bottom:12px}.daemon-connect-card__title{font-size:15px;font-weight:600;color:var(--text-strong)}.daemon-connect-card__warn{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--orange, #e67e22);background:var(--orange-bg, rgba(230, 126, 34, .08));border:1px solid var(--orange-border, rgba(230, 126, 34, .2));border-radius:var(--radius-sm);padding:8px 12px;margin-bottom:16px}.daemon-connect-card__section{margin-bottom:14px}.daemon-connect-card__label{font-size:12px;font-weight:600;color:var(--text-soft);text-transform:uppercase;letter-spacing:.5px;margin-bottom:6px}.daemon-connect-card__copyable{display:flex;align-items:center;gap:8px;background:var(--bg-elevated);border:1px solid var(--border);border-radius:var(--radius-sm);padding:8px 12px}.daemon-connect-card__copyable--cmd{align-items:flex-start}.daemon-connect-card__code{flex:1;font-family:var(--mono);font-size:13px;color:var(--text);word-break:break-all;-webkit-user-select:all;user-select:all}.daemon-connect-card__pre{flex:1;font-family:var(--mono);font-size:13px;color:var(--text);margin:0;white-space:pre-wrap;word-break:break-all;-webkit-user-select:all;user-select:all;line-height:1.6}.daemon-connect-card__copy-btn{display:inline-flex;align-items:center;gap:4px;padding:4px 10px;font-size:12px;font-weight:500;color:var(--accent);background:transparent;border:1px solid var(--accent);border-radius:var(--radius-sm);cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background var(--dur-quick) var(--ease-out),color var(--dur-quick) var(--ease-out)}.daemon-connect-card__copy-btn:hover{background:var(--accent);color:#fff}.daemon-connect-card__hint{font-size:12px;color:var(--text-muted);margin-top:6px;line-height:1.5}.daemon-connect-card__hint code{font-family:var(--mono);font-size:12px;background:var(--bg-fill-secondary);padding:1px 4px;border-radius:3px}.daemon-connect-card__actions{display:flex;justify-content:flex-end;margin-top:16px}.daemon-connect-card__close{font-size:13px;padding:7px 16px;border-radius:var(--radius-sm);border:1px solid var(--border);background:transparent;color:var(--text);cursor:pointer;transition:background var(--dur-quick) var(--ease-out)}.daemon-connect-card__close:hover{background:var(--bg-fill-tertiary)}.machine-card__runtimes{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:8px}.machine-card__runtimes--offline{margin-bottom:8px}.machine-card__runtime-tag{font-size:11px;font-weight:500;padding:2px 8px;border-radius:var(--radius-pill);background:var(--blue-bg);color:var(--blue);border:1px solid var(--blue-border)}.machine-card__runtime-tag--dws{background:var(--purple-bg);color:var(--purple);border-color:var(--purple-border)}.machine-card__runtime-hint{font-size:12px;color:var(--text-faint);font-style:italic}.machine-card__edit-row{display:flex;align-items:center;gap:4px;flex:1}.machine-card__edit-input{flex:1;padding:3px 8px;font-size:14px;font-weight:600;border:1px solid var(--selected);border-radius:var(--radius-xs);background:var(--bg-elevated);color:var(--text-strong);outline:none;box-shadow:0 0 0 2px var(--selected-soft)}.machine-card__edit-save,.machine-card__edit-cancel{width:24px;height:24px;display:grid;place-items:center;border:none;border-radius:var(--radius-xs);cursor:pointer;background:transparent;color:var(--text-soft);transition:color var(--dur-quick) var(--ease-out),background var(--dur-quick) var(--ease-out)}.machine-card__edit-save:hover{color:var(--green);background:var(--bg-fill-tertiary)}.machine-card__edit-cancel:hover{color:var(--red);background:var(--bg-fill-tertiary)}.machine-card__actions{display:flex;justify-content:flex-end;gap:8px}.machine-card__action-btn{display:inline-flex;align-items:center;gap:4px;font-size:12px;padding:4px 12px;border-radius:var(--radius-sm);border:1px solid var(--border);background:transparent;color:var(--text-muted);cursor:pointer;transition:background var(--dur-quick) var(--ease-out),color var(--dur-quick) var(--ease-out)}.machine-card__action-btn:hover{background:var(--bg-fill-tertiary);color:var(--text)}.machine-card__command{margin:8px 0;padding:10px 12px;background:var(--bg-elevated);border:1px solid var(--border);border-radius:var(--radius-sm)}.machine-card__command-label{font-size:11px;font-weight:600;color:var(--text-soft);text-transform:uppercase;letter-spacing:.5px;margin-bottom:6px}.machine-card__command-box{display:flex;align-items:flex-start;gap:8px}.machine-card__command-pre{flex:1;font-family:var(--mono);font-size:12px;color:var(--text);margin:0;white-space:pre-wrap;word-break:break-all;-webkit-user-select:all;user-select:all;line-height:1.6}.machine-card__command-copy{display:inline-flex;align-items:center;gap:4px;padding:3px 8px;font-size:11px;font-weight:500;color:var(--accent);background:transparent;border:1px solid var(--accent);border-radius:var(--radius-sm);cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background var(--dur-quick) var(--ease-out)}.machine-card__command-copy:hover{background:var(--accent);color:#fff}.machine-card__command-hint{font-size:11px;color:var(--text-faint);margin-top:6px}.machine-card__command-hint code{font-family:var(--mono);background:var(--bg-fill-secondary);padding:1px 3px;border-radius:2px}.machine-card__action-btn.is-active{border-color:var(--accent);color:var(--accent)}.trace-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:color-mix(in srgb,var(--text-strong) 32%,transparent);display:flex;justify-content:flex-end;z-index:300}.trace-panel{position:relative;display:flex;flex-direction:column;width:380px;max-width:92vw;height:100%;background:var(--bg-panel);border-left:1px solid var(--border);box-shadow:var(--shadow-lg)}.trace-panel__head{display:flex;align-items:center;justify-content:space-between;padding:16px 18px 12px;border-bottom:1px solid var(--border-soft)}.trace-panel__title{margin:0;font-size:12px;font-weight:600;letter-spacing:.9px;text-transform:uppercase;color:var(--text-muted)}.trace-panel__close{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);cursor:pointer}.trace-panel__close:hover{background:var(--bg-fill);color:var(--text-strong)}.trace-panel__body{flex:1;overflow-y:auto;padding:16px 18px 24px}.trace-grp{display:grid;grid-template-columns:26px minmax(0,1fr);column-gap:9px;margin-bottom:14px}.trace-av{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:var(--radius-pill);background:var(--bg-fill);color:var(--text-muted);line-height:0;margin-top:1px}.trace-body{min-width:0}.trace-head{font-size:12px;font-weight:600;color:var(--text-muted);margin-bottom:2px}.trace-text{position:relative;font-size:14px;line-height:1.55;color:var(--text);overflow-wrap:anywhere;min-width:0;white-space:pre-wrap}.trace-text--thinking{font-style:italic;color:var(--text-soft)}.trace-tool,.trace-status{display:flex;align-items:flex-start;gap:6px;font-size:12.5px;color:var(--text-muted);margin:4px 0;overflow-wrap:anywhere}.trace-tool svg,.trace-status svg{flex:none;margin-top:2px;color:var(--text-faint)}.trace-toolret{display:flex;align-items:flex-start;gap:6px;font-size:12px;line-height:1.5;color:var(--text-faint);margin:2px 0 4px 12px;overflow-wrap:anywhere}.trace-toolret svg{flex:none;margin-top:2px;color:var(--text-faint)}.trace-toolret__label{min-width:0}.trace-toolret--expandable{cursor:pointer}.trace-toolret__summary{display:flex;align-items:flex-start;gap:6px;list-style:none;cursor:pointer}.trace-toolret__summary::-webkit-details-marker{display:none}.trace-toolret__summary:after{content:"展开";flex:none;margin-left:auto;font-size:11px;color:var(--accent, var(--text-muted))}.trace-toolret--expandable[open] .trace-toolret__summary:after{content:"收起"}.trace-toolret__full{margin:4px 0 0;padding:6px 8px;border-radius:var(--radius-sm);background:var(--bg-fill);color:var(--text);font-size:12px;line-height:1.5;white-space:pre-wrap;overflow-wrap:anywhere;max-height:320px;overflow-y:auto}.trace-perm{display:flex;align-items:flex-start;gap:6px;font-size:12.5px;line-height:1.5;color:var(--amber);background:var(--amber-bg);border:1px solid var(--amber-border);border-radius:var(--radius-sm);padding:4px 8px;margin:4px 0;overflow-wrap:anywhere}.trace-perm svg{flex:none;margin-top:2px;color:var(--amber)}.trace-perm__label{min-width:0;font-weight:500}.trace-perm__summary{display:flex;align-items:flex-start;gap:6px;list-style:none;cursor:pointer}.trace-perm__summary::-webkit-details-marker{display:none}.trace-perm__summary:after{content:"展开";flex:none;margin-left:auto;font-size:11px;color:var(--amber)}.trace-perm--expandable[open] .trace-perm__summary:after{content:"收起"}.trace-perm__full{margin:6px 0 0;padding:6px 8px;border-radius:var(--radius-sm);background:color-mix(in srgb,var(--amber-bg) 60%,transparent);color:var(--text);font-size:12px;line-height:1.5;white-space:pre-wrap;overflow-wrap:anywhere;max-height:320px;overflow-y:auto}.trace-text--foldable{cursor:pointer}.trace-text__summary{list-style:none;cursor:pointer;overflow-wrap:anywhere}.trace-text__summary::-webkit-details-marker{display:none}.trace-text__summary:after{content:" 展开";font-size:11px;font-style:normal;color:var(--accent, var(--text-muted))}.trace-text--foldable[open] .trace-text__summary:after{content:" 收起"}.trace-text__full{margin-top:4px;white-space:pre-wrap;overflow-wrap:anywhere}.trace-empty{font-size:13px;line-height:1.6;color:var(--text-faint)}.trace-cursor{display:inline-block;width:2px;height:13px;background:var(--text-strong);vertical-align:-2px;margin-left:1px;animation:trace-blink 1s step-end infinite}@keyframes trace-blink{50%{opacity:0}}@media (prefers-reduced-motion: reduce){.trace-cursor{animation:none}}