aitable-workflow-cli 0.1.28 → 0.1.29-beta.1790736949347

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/assistant/assets/index-BA6il19d.css +1 -0
  2. package/dist/assistant/assets/{index-B3LvYfRW.js → index-BMzAOp70.js} +31 -31
  3. package/dist/assistant/index.html +2 -2
  4. package/dist/chunk-BBP5RVFU.js +15 -0
  5. package/dist/cli.js +180 -73
  6. package/dist/{config-ui-server-4SVD42Z3.js → config-ui-server-UWELHUH4.js} +1 -1
  7. package/dist/web/assets/index-Bnmnydwk.css +1 -0
  8. package/dist/web/assets/index-Dbs1xWB9.js +331 -0
  9. package/dist/web/index.html +2 -2
  10. package/dist/web/install.ps1 +173 -0
  11. package/dist/web/install.sh +188 -0
  12. package/package.json +3 -3
  13. package/templates/ai-native-sdlc/.env.example +11 -0
  14. package/templates/ai-native-sdlc/aitable-workflow.config.yml +47 -0
  15. package/templates/ai-native-sdlc/coding-agents.config.json +17 -0
  16. package/templates/ai-native-sdlc/docs/plans/2026-09-15-ai-native-sdlc-dual-staff-implementation-plan.md +150 -0
  17. package/templates/ai-native-sdlc/docs/plans/2026-09-15-ai-native-sdlc-dual-staff.md +213 -0
  18. package/templates/ai-native-sdlc/docs/plans/2026-09-16-domain-role-notification-routing.md +36 -0
  19. package/templates/ai-native-sdlc/docs/plans/2026-09-16-execution-resume-and-cr-loop.md +29 -0
  20. package/templates/ai-native-sdlc/docs/plans/2026-09-16-project-handoff.md +148 -0
  21. package/templates/ai-native-sdlc/docs/plans/2026-09-17-prd-code-context-and-readable-prompts.md +37 -0
  22. package/templates/ai-native-sdlc/docs/plans/2026-09-21-plan-merge-sync-and-agent-source.md +19 -0
  23. package/templates/ai-native-sdlc/docs/plans/2026-09-21-sdlc-base-ref-and-review-notification.md +18 -0
  24. package/templates/ai-native-sdlc/docs/plans/2026-09-29-borrow-from-joe-design.md +943 -0
  25. package/templates/ai-native-sdlc/lib/artifacts.ts +126 -0
  26. package/templates/ai-native-sdlc/lib/recipe-config.ts +34 -0
  27. package/templates/ai-native-sdlc/lib/recipe-helpers.ts +595 -0
  28. package/templates/ai-native-sdlc/npmrc +1 -0
  29. package/templates/ai-native-sdlc/package.json +19 -0
  30. package/templates/ai-native-sdlc/profile/profile.yml +115 -0
  31. package/templates/ai-native-sdlc/setup/module-config.seed.json +37 -0
  32. package/templates/ai-native-sdlc/test/artifacts.test.ts +72 -0
  33. package/templates/ai-native-sdlc/test/recipe-helpers.test.ts +931 -0
  34. package/templates/ai-native-sdlc/tsconfig.json +17 -0
  35. package/templates/ai-native-sdlc/workflows/.gitkeep +3 -0
  36. package/templates/ai-native-sdlc/workflows/execution/automations/blocked-questions-dev.json +91 -0
  37. package/templates/ai-native-sdlc/workflows/execution/automations/blocked-questions.json +91 -0
  38. package/templates/ai-native-sdlc/workflows/execution/automations/cr-review-dev.json +80 -0
  39. package/templates/ai-native-sdlc/workflows/execution/automations/cr-review.json +81 -0
  40. package/templates/ai-native-sdlc/workflows/execution/automations/resume-answers.json +42 -0
  41. package/templates/ai-native-sdlc/workflows/execution/automations/spec-review-dev.json +138 -0
  42. package/templates/ai-native-sdlc/workflows/execution/recipes/coding.recipe.ts +161 -0
  43. package/templates/ai-native-sdlc/workflows/execution/recipes/prd-review.recipe.ts +200 -0
  44. package/templates/ai-native-sdlc/workflows/execution/recipes/prd.recipe.ts +163 -0
  45. package/templates/ai-native-sdlc/workflows/execution/recipes/review.recipe.ts +257 -0
  46. package/templates/ai-native-sdlc/workflows/execution/recipes/spec-review.recipe.ts +242 -0
  47. package/templates/ai-native-sdlc/workflows/execution/recipes/spec.recipe.ts +173 -0
  48. package/templates/ai-native-sdlc/workflows/execution/workflow.yml +79 -0
  49. package/templates/ai-native-sdlc/workflows/intake/automations/accept-intake.json +101 -0
  50. package/templates/ai-native-sdlc/workflows/intake/recipes/classify-module.recipe.ts +133 -0
  51. package/templates/ai-native-sdlc/workflows/intake/recipes/create-change.recipe.ts +94 -0
  52. package/templates/ai-native-sdlc/workflows/intake/recipes/mechanical-deduplicate.recipe.ts +33 -0
  53. package/templates/ai-native-sdlc/workflows/intake/workflow.yml +62 -0
  54. package/templates/ai-native-sdlc/workspaces/dev/AGENTS.md +69 -0
  55. package/templates/ai-native-sdlc/workspaces/pm/AGENTS.md +48 -0
  56. package/templates/ai-native-sdlc/workspaces/reviewer/AGENTS.md +79 -0
  57. package/dist/assistant/assets/index-CCEHOkkJ.css +0 -1
  58. package/dist/chunk-YDJTCQW4.js +0 -15
  59. package/dist/web/assets/index-DPc2WOdp.css +0 -1
  60. package/dist/web/assets/index-HTw8K38o.js +0 -332
@@ -0,0 +1,79 @@
1
+ # Reviewer 工作规程
2
+
3
+ 你是独立的代码审查者,负责以对抗性思维审查 PRD、技术方案和代码实现。你的核心职责是**找出缺陷和风险**,而不是确认正确性。
4
+
5
+ ## 审查心态
6
+
7
+ ### 对抗性思维
8
+ - **假设被审查对象有缺陷**,你的任务是找到它
9
+ - 不要默认接受作者的方案,要质疑每个决策
10
+ - 寻找边界条件、错误处理缺失、性能问题、安全风险
11
+
12
+ ### 评论处理原则
13
+ - 对每条评论,先理解评审者的意图,再决定修复方案
14
+ - 如果认为评论有误,给出有理有据的反驳而非盲目修改
15
+ - 区分 Critical(必须修复)、Important(应该修复)、Minor(可以后续处理)
16
+
17
+ ## ⚖️ 证据铁律
18
+
19
+ **没有当场跑过验证命令并看到输出 → 不能声称通过。**
20
+
21
+ ### 操作规程
22
+ 1. 识别验证命令(测试/类型检查/构建)
23
+ 2. 运行完整命令(不是部分)
24
+ 3. 阅读完整输出(不是尾部)
25
+ 4. 确认输出支持你的声明
26
+ 5. 只有此时才能声称"通过"
27
+
28
+ ### 🚩 红旗信号
29
+ - 使用"应该"、"大概"、"可能" → 还没验证,继续跑命令
30
+ - 验证前说"太好了"、"搞定了" → 停下来,先跑验证
31
+ - 准备提交但没跑测试 → 不允许
32
+
33
+ ### 表达规范
34
+ - 禁止使用"应该"、"大概"、"可能"、"或许"等模糊表述
35
+ - 每个结论必须有代码级证据(文件路径 + 行号 + 实际输出)
36
+ - 不确定时通过 SDLC_QUESTIONS 向人工确认,不猜测
37
+
38
+ ## 工作边界
39
+
40
+ 每轮任务会给出本次变更的 worktree 绝对路径;当前目录不是工作对象,所有文件读写和命令都必须发生在给定的 worktree 路径内。
41
+
42
+ 本文件只是角色通用规程;进入某个仓库 worktree 后,必须先读取该 worktree 根目录下的 `AGENTS.md`(若存在)并遵循其仓库级约定,仓库约定优先于本通用规程。
43
+
44
+ ## 审查清单
45
+
46
+ ### PRD 审查
47
+ - 需求点是否完整覆盖?
48
+ - 验收标准是否可量化、可测试?
49
+ - 依赖项是否明确列出?
50
+ - 是否有 TBD/待补充等 placeholder?
51
+ - 边界条件和异常场景是否考虑?
52
+
53
+ ### 技术方案审查
54
+ - 方案是否完整覆盖 PRD 需求?
55
+ - 选中的仓库是否合理?未选中的理由是否充分?
56
+ - 实施步骤是否原子化(2-5 分钟一个)?
57
+ - 每步是否有验证命令和预期输出?
58
+ - 风险点是否识别并给出缓解措施?
59
+
60
+ ### 代码审查
61
+ - 代码是否完整实现技术方案?
62
+ - 测试是否真实运行并看到通过输出?
63
+ - 类型检查是否通过(有实际输出)?
64
+ - 是否有遗留 TODO/FIXME/HACK?
65
+ - commit message 是否符合 Conventional Commits?
66
+
67
+ ## 提问协议
68
+
69
+ 需要真人确认时不得猜测或编造,必须提问:
70
+
71
+ - 每个工件末尾固定保留 `## 待确认问题`,逐项列出尚未被人工答复的问题;没有问题时该节写"无"。
72
+ - 最终回复的末尾单独输出一行机器可读清单:`SDLC_QUESTIONS=["问题1","问题2"]`;没有问题输出 `SDLC_QUESTIONS=[]`。
73
+ - 提问后等待人工答复,答复会在下一轮以「已消费的人工答复」给到,继续同一会话。
74
+
75
+ ## Git 提交边界
76
+
77
+ 不得执行 `git commit` 或 `git push`。Agent 只写入指定 worktree 并运行必要测试;工作流会在 Agent 成功后统一提交、推送和创建 CR。
78
+
79
+ 不得创建新的 CR。评审阶段只处理已有 CR 的评论。
@@ -1 +0,0 @@
1
- :root{color-scheme:light;--bg: #ffffff;--panel: #f6f8fa;--border: #d8dee4;--border-soft: #eaecef;--fg: #1f2328;--muted: #59636e;--accent: #0969da;--ok: #1a7f37;--warn-fg: #9a6700;--warn-bg: #fff8c5;--warn-border: #d4a72c;--danger-fg: #cf222e;--danger-bg: #ffebe9}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--fg);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica,Arial,sans-serif;font-size:15px;line-height:1.6}.page{display:flex;flex-direction:column;height:100vh}.topbar{display:flex;align-items:center;gap:8px;padding:12px 20px;border-bottom:1px solid var(--border-soft);background:var(--bg)}.topbar .title{font-weight:650;font-size:15px;letter-spacing:-.01em}.topbar .spacer{flex:1}.topbar .agent{background:var(--bg);color:var(--fg);border:1px solid var(--border);border-radius:6px;padding:4px 8px;font-size:13px}.ghost{background:transparent;color:var(--muted);border:1px solid var(--border);border-radius:6px;padding:4px 10px;cursor:pointer;font-size:13px;text-decoration:none}.ghost:hover{color:var(--fg);border-color:#bfbfbf;background:var(--panel)}.notice{margin:24px 20px;padding:16px;border:1px solid var(--border-soft);border-radius:8px;background:var(--panel);color:var(--muted)}.notice code{color:var(--fg)}.thread{display:flex;flex-direction:column;flex:1;min-height:0;padding:16px 20px}.viewport{flex:1;overflow-y:auto}.empty{color:var(--muted);padding:32px 4px;text-align:center}.msg{margin:14px 0}.msg.user{background:var(--panel);border:1px solid var(--border-soft);border-radius:12px;padding:8px 14px;margin-left:auto;margin-right:0;max-width:85%;white-space:pre-wrap;word-break:break-word;font-size:14.5px}.msg.assistant{background:transparent;border:none;padding:2px 0;max-width:100%}.markdown>div,.markdown{line-height:1.65}.markdown p{margin:.5em 0}.markdown ul,.markdown ol{margin:.5em 0;padding-left:1.6em}.markdown li{margin:.2em 0}.markdown h1,.markdown h2,.markdown h3,.markdown h4{margin:1em 0 .4em;line-height:1.3;font-weight:650}.markdown h1{font-size:1.5em}.markdown h2{font-size:1.25em}.markdown h3{font-size:1.1em}.markdown a{color:var(--accent);text-decoration:none}.markdown a:hover{text-decoration:underline}.markdown code{background:#818b981f;border-radius:6px;padding:.15em .4em;font-size:.88em;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.markdown pre{background:var(--panel);border:1px solid var(--border-soft);border-radius:8px;padding:12px;overflow-x:auto;margin:.6em 0}.markdown pre code{background:transparent;padding:0;font-size:.85em}.markdown blockquote{margin:.6em 0;padding:.1em 1em;border-left:3px solid var(--border);color:var(--muted)}.markdown table{border-collapse:collapse;margin:.6em 0;display:block;overflow-x:auto}.markdown th,.markdown td{border:1px solid var(--border-soft);padding:5px 10px}.markdown th{background:var(--panel)}.markdown hr{border:none;border-top:1px solid var(--border-soft);margin:1em 0}.thought{margin:8px 0;border:1px solid var(--border-soft);border-radius:10px;background:var(--panel);padding:6px 14px}.thought>summary{cursor:pointer;color:var(--muted);font-size:13.5px;font-weight:550;-webkit-user-select:none;user-select:none;padding:2px 0}.thought>summary:hover{color:var(--fg)}.thought-steps{padding:6px 0 4px}.step{position:relative;padding:4px 0 4px 20px;color:var(--muted);font-size:13.5px;line-height:1.6;white-space:pre-wrap;word-break:break-word}.step:before{content:"";position:absolute;left:4px;top:13px;width:7px;height:7px;border-radius:50%;background:var(--accent);opacity:.55}.step.pending:before{animation:pulse 1.2s ease-in-out infinite}@keyframes pulse{50%{opacity:.15}}.thought-steps .part.tool{margin-left:20px}.part{font-size:15px}.part.tool{color:var(--muted);font-size:13px;margin:6px 0;border:1px solid var(--border-soft);border-radius:8px;padding:6px 12px;background:var(--bg)}.part.tool summary{cursor:pointer;color:var(--fg);font-weight:500}.part.tool summary .hint{color:var(--muted);font-weight:400}.part.tool pre{margin:6px 0;white-space:pre-wrap;word-break:break-word;font-size:12px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;background:var(--panel);border-radius:6px;padding:8px}.part.tool .tool-result{margin-top:6px;border-top:1px dashed var(--border-soft);padding-top:6px}.part.tool .tool-result .lbl{color:var(--muted);font-size:12px}.part.ask{border:1px solid var(--warn-border);background:var(--warn-bg);border-radius:8px;padding:8px 12px;margin:8px 0}.part.ask .ask-head{color:var(--warn-fg);font-size:13px;font-weight:600;margin-bottom:4px}.part.ask .ask-body{font-size:13.5px;white-space:pre-wrap;word-break:break-word}.part.permission{color:var(--muted);font-size:13px;margin:6px 0;border:1px solid #ffb3ad;background:var(--danger-bg);border-radius:8px;padding:6px 12px}.part.permission summary{cursor:pointer;color:var(--danger-fg);font-weight:500}.part.permission pre{margin:6px 0;white-space:pre-wrap;word-break:break-word;font-size:12px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.part.status{color:var(--muted);font-size:12.5px;opacity:.9;margin:3px 0;white-space:pre-wrap;word-break:break-word}.reasoning{color:var(--muted);font-size:13.5px;margin-bottom:6px}.reasoning summary{cursor:pointer}.composer{display:flex;gap:8px;padding-top:12px;border-top:1px solid var(--border-soft)}.input{flex:1;padding:10px 14px;border-radius:10px;border:1px solid var(--border);background:var(--bg);color:var(--fg);font:inherit;font-size:14.5px;resize:none}.input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px #0969da26}.btn{padding:8px 18px;border-radius:10px;border:1px solid var(--border);background:var(--bg);color:var(--fg);cursor:pointer;font:inherit;font-size:14px}.btn:hover{background:var(--panel)}.btn.primary{background:#24292f;border-color:#24292f;color:#fff;font-weight:550}.btn.primary:hover{background:#32383f;filter:none}.tabs{display:flex;gap:4px;margin-left:12px}.tab{background:transparent;color:var(--muted);border:1px solid transparent;border-radius:999px;padding:4px 14px;cursor:pointer;font:inherit;font-size:13.5px}.tab:hover{color:var(--fg);background:var(--panel)}.tab.active{color:var(--fg);background:var(--panel);border-color:var(--border-soft);font-weight:550}.chat-body{display:flex;flex-direction:column;flex:1;min-height:0;width:100%;max-width:780px;margin:0 auto}.chat-controls{display:flex;gap:8px;align-items:center;padding:10px 0 0}.chat-controls .agent{background:var(--bg);color:var(--fg);border:1px solid var(--border);border-radius:6px;padding:4px 8px;font-size:13px}.runs-layout{display:grid;grid-template-columns:300px 1fr;flex:1;min-height:0}.runs-side{border-right:1px solid var(--border-soft);background:var(--panel);display:flex;flex-direction:column;min-height:0}.pane-head{display:flex;align-items:center;gap:8px;padding:10px 14px;border-bottom:1px solid var(--border-soft);font-weight:600;font-size:13px}.pane-head .spacer{flex:1}.run-list{list-style:none;margin:0;padding:6px;overflow-y:auto;flex:1}.run-list li{margin-bottom:4px}.empty-side{color:var(--muted);padding:16px;font-size:13px}.run-item{display:flex;flex-wrap:wrap;align-items:center;gap:6px;width:100%;padding:8px 10px;border-radius:8px;border:1px solid transparent;background:transparent;color:var(--fg);cursor:pointer;font:inherit;font-size:12px;text-align:left}.run-item:hover{border-color:var(--border-soft);background:var(--bg)}.run-item.active{border-color:var(--accent);background:var(--bg);box-shadow:0 0 0 3px #0969da1a}.run-item .run-id{flex:1 1 100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.run-item .muted{color:var(--muted);font-size:11.5px}.mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.badge{font-size:11px;border-radius:999px;padding:1px 8px;border:1px solid var(--border);background:var(--bg);color:var(--muted)}.badge.running{color:var(--warn-fg);border-color:var(--warn-border);background:var(--warn-bg)}.badge.succeeded{color:var(--ok);border-color:#4ac26b;background:#dafbe1}.badge.failed,.badge.aborted{color:var(--danger-fg);border-color:#ffb3ad;background:var(--danger-bg)}.badge.src.chat{color:var(--accent);border-color:#54aeff66;background:#ddf4ff}.run-detail{display:flex;flex-direction:column;min-height:0}.run-detail .thread{padding-top:8px}.run-detail .viewport{max-width:820px;width:100%;margin:0 auto}
@@ -1,15 +0,0 @@
1
- import{o as ge,q as fe}from"./chunk-4B6V7VHM.js";import{a}from"./chunk-EI7MMDWY.js";import{createServer as no}from"http";import{stat as Xe,readFile as ae,mkdir as ce,writeFile as Ie,rm as ro}from"fs/promises";import{createReadStream as so,existsSync as et,unlinkSync as io}from"fs";import I from"path";import{fileURLToPath as ao}from"url";import ct from"crypto";import co from"os";import Re from"yaml";import{runCheck as V,resolveConfigPath as lt,loadSettings as lo,detectCodingEngines as uo,loadWorkflowTemplate as po,collectEnvRefs as go,applyConfigSave as fo,ConfigSaveError as mo,runSetupCommand as wo,resolveInsideRoot as Te,assertPortableId as tt}from"aitable-workflow-core";import{mkdir as Pt,readFile as q,writeFile as xt}from"fs/promises";import j from"path";import L from"yaml";import{BotProvisioner as Ot,BotProvisionError as Oe,DwsClient as ke,DwsDevRunner as Ae,fetchFields as Se,loadSettings as _e,loadWorkflowTemplate as At,listDwsConversations as _t,readState as Nt,resetProfileCache as Ne,runDwsCommand as Gt,runCommand as Bt,setupKnowledgeBases as $t,writeBack as ye,assertPortableId as jt}from"aitable-workflow-core";import re from"path";import{closeSync as wt,existsSync as Ee,openSync as ht,readFileSync as yt}from"fs";import{createExecShellToolkit as bt,createStandaloneExecShellToolkit as kt,loadSettings as St,logger as vt,resolveConfigPath as It,spawnManagedProcess as Rt}from"aitable-workflow-core";function Tt(e){let n=yt(re.resolve(e),"utf8").replace(/^\uFEFF/,""),t;try{t=JSON.parse(n)}catch(o){throw new Error(`--argv-file \u4E0D\u662F\u5408\u6CD5 JSON\uFF1A${e}\uFF08${o instanceof Error?o.message:String(o)}\uFF09`)}if(!Array.isArray(t)||t.length===0||t.some(o=>typeof o!="string"||o.length===0))throw new Error(`--argv-file \u5FC5\u987B\u662F\u975E\u7A7A JSON \u5B57\u7B26\u4E32\u6570\u7EC4\uFF1A${e}`);return t}a(Tt,"readExecArgvFile");function Ct(e){if(!e||typeof e!="object")return;let n=e;if(n.success!==!0){if(n.success===!1)return String(n.errorMsg??n.error??n.message??n.errorCode??"\u4E0B\u6E38\u547D\u4EE4\u62A5\u544A\u5931\u8D25");for(let t of["error","errorMsg"]){let o=n[t];if(typeof o=="string"&&o.trim())return o.trim();if(o&&typeof o=="object")return JSON.stringify(o)}if(n.errorCode!==void 0&&n.success!==!0)return String(n.errorCode)}}a(Ct,"jsonPayloadError");async function Et(e,n,t={}){let o=await It(e);if(t.standalone||!Ee(o))return{shell:kt(n,{configDir:re.dirname(o)}),mode:"standalone",bins:{},configPath:o};let r=await St(e),s=r.raw?.toolkit_config?.shell??{};return{shell:bt(r,n),mode:"project",bins:s.bins??{},configPath:o}}a(Et,"createToolkitForExec");async function me(e,n,t){let o=re.resolve(t.logFile),r=re.dirname(o);if(!Ee(r))throw new Error(`\u65E5\u5FD7\u6587\u4EF6\u76EE\u5F55\u4E0D\u5B58\u5728\uFF1A${r}`);let s=t.bins?.[e]??e,i=ht(o,"w"),c;try{return c=Rt({command:s,args:n,stdio:["ignore",i,i]}),await new Promise((p,g)=>{let d=c.child,h=a(b=>g(b),"onError");d.once("error",h),d.once("spawn",()=>{d.removeListener("error",h),p()})}),c.unref(),{pid:c.child.pid,logFile:o}}finally{wt(i)}}a(me,"runDetached");function $o(e,n){e.command("exec").description("\u9003\u751F\u8231\uFF1A\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\u590D\u6742\u53C2\u6570\u53EF\u653E\u5165 UTF-8 JSON \u5B57\u7B26\u4E32\u6570\u7EC4\u6587\u4EF6\u3002\u7528\u6CD5\uFF1Aaitable-workflow exec [-c <path>] [--standalone] [--json | --detach <file>] [--argv-file <file>] -- <bin> <args...>").option("-c, --config <path>","\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84",n.defaultConfig).option("--standalone","\u663E\u5F0F\u65E0\u9879\u76EE\u6A21\u5F0F\uFF1A\u4E0D\u8BFB\u53D6\u9879\u76EE\u914D\u7F6E\uFF0C\u9002\u5408 bootstrap / design \u4EA7\u7269\u751F\u6210\u524D\u63A2\u6D4B dws").option("--timeout <ms>","\u5355\u6B21\u6267\u884C\u8D85\u65F6\uFF08\u6BEB\u79D2\uFF09").option("--json","\u4EE5 run \u65B9\u5F0F\u6267\u884C\u5E76\u89E3\u6790 stdout JSON\uFF1A\u4E0D\u56E0\u975E\u96F6\u9000\u51FA\u91CD\u8BD5\uFF0Cpayload \u7EA7\u9519\u8BEF\uFF08success/errorMsg\uFF09\u5355\u72EC\u68C0\u6D4B").option("--argv-file <file>","\u4ECE UTF-8 JSON \u5B57\u7B26\u4E32\u6570\u7EC4\u8BFB\u53D6\u5B8C\u6574\u547D\u4EE4\uFF08\u7B2C\u4E00\u9879 bin\uFF0C\u5176\u4F59\u4E3A\u53C2\u6570\uFF1B\u652F\u6301 BOM\uFF09").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,o)=>{try{let r=o.argvFile?Tt(o.argvFile):t;if(o.argvFile&&t.length>0)throw new Error("--argv-file \u4E0D\u80FD\u4E0E\u547D\u4EE4\u884C\u547D\u4EE4\u540C\u65F6\u4F7F\u7528");let[s,...i]=r;s||(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 c=o.timeout?Number.parseInt(o.timeout,10):void 0;c!==void 0&&(Number.isNaN(c)||c<=0)&&(console.error("\u2717 --timeout \u5FC5\u987B\u662F\u6B63\u6574\u6570\uFF08\u6BEB\u79D2\uFF09"),process.exit(1)),o.detach&&(o.json||c!==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)),o.json&&vt.setLevel("warn");let p=await Et(o.config,s,{standalone:o.standalone===!0});if(o.detach){let{pid:d,logFile:h}=await me(s,i,{bins:p.bins,logFile:o.detach});console.log(`\u2713 \u5DF2\u540E\u53F0\u542F\u52A8\uFF08pid ${d}\uFF09\uFF0C\u8F93\u51FA\u5B9E\u65F6\u5199\u5165\uFF1A${h}`),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(o.json){let d=await p.shell.run(s,i,{timeoutMs:c}),h=d.stdout.trim(),b={};if(h!=="")try{b=JSON.parse(h)}catch{console.error("\u2717 exec --json \u5931\u8D25: \u547D\u4EE4\u672A\u8FD4\u56DE\u5408\u6CD5 JSON"),d.stderr&&process.stderr.write(d.stderr),process.exit(1)}let P=Ct(b);if(d.exitCode!==0||P){d.stderr&&process.stderr.write(d.stderr);let G=P?`\uFF1A${P}`:`\uFF08\u9000\u51FA\u7801 ${d.exitCode}\uFF09`;console.error(`\u2717 exec --json \u5931\u8D25${G}`),process.exit(1)}console.log(JSON.stringify(b,null,2));return}let g=await p.shell.run(s,i,{timeoutMs:c});g.stdout&&process.stdout.write(g.stdout),g.stderr&&process.stderr.write(g.stderr),g.truncated&&console.error(`
2
- \u26A0\uFE0F \u8F93\u51FA\u56E0\u8D85\u8FC7\u4E0A\u9650\u88AB\u622A\u65AD`),process.exit(g.exitCode??0)}catch(r){console.error(`\u2717 exec \u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),process.exit(1)}})}a($o,"registerExecCommand");async function Ge(e={}){let n=e.list??_t;try{let{conversations:t}=await n({role:"admin"});return{ok:!0,groups:t}}catch(t){return{ok:!1,message:t instanceof Error?t.message:String(t)}}}a(Ge,"listAdminGroups");async function z(e,n){let t={};try{let c=await _e(e,{lenientEnv:!0});for(let p of c.workflowEntries)try{let d=(await At(p.templatePath,{envSource:c.envSource})).tracker;if(!d)continue;t[p.id]={baseId:String(d.base_id??"").trim(),tableId:String(d.table_id??"").trim(),...d.label?{label:String(d.label)}:{}}}catch{}}catch{}let o=await Be(n),r=Object.values(t),s=Object.values(o);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:o}}a(z,"readSetupArtifacts");async function Be(e){let n={},t=j.resolve(e,"profile","profile.yml"),o;try{o=L.parse(await q(t,"utf8"))}catch{return n}let r=R(o)?o.workflows:void 0;if(!R(r))return n;for(let s of Object.values(r)){let i=R(s)?s.steps:void 0;if(R(i)){for(let c of Object.values(i))if(R(c))for(let[p,g]of Object.entries(c)){if(!R(g))continue;let d="baseId"in g||"base_id"in g,h="tableId"in g||"table_id"in g;!d||!h||(n[p]={baseId:String(g.baseId??g.base_id??"").trim(),tableId:String(g.tableId??g.table_id??"").trim()})}}}return n}a(Be,"readProfileConfigTables");var M="wiki/official-aitable-faq";async function Ut(e,n){let t=j.resolve(e,"profile","profile.yml"),o;try{o=L.parse(await q(t,"utf8"))}catch{return[]}let r=R(o)?o.roles:void 0,s=R(r)?r[n]:void 0,i=R(s)?s.knowledge_scope:void 0,c=R(i)?i.kb_collections:void 0;return Array.isArray(c)?c.map(p=>typeof p=="string"?p:R(p)&&typeof p.collection=="string"?p.collection:null).filter(p=>p!==null):[]}a(Ut,"readRoleCollections");function Pe(e){if(L.isScalar(e))return typeof e.value=="string"?e.value:null;if(L.isMap(e)){let n=e.get("collection",!0);return L.isScalar(n)&&typeof n.value=="string"?n.value:null}return null}a(Pe,"kbEntryValue");async function Dt(e,n,t){let o=j.resolve(e,"profile","profile.yml"),r;try{r=await q(o,"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=L.parseDocument(r),i=s.getIn(["roles",n,"knowledge_scope","kb_collections"],!0);if(!L.isSeq(i))return{ok:!1,code:"KB_ROLE_NOT_FOUND",message:`profile.yml \u4E2D\u672A\u627E\u5230 roles.${n}.knowledge_scope.kb_collections\uFF0C\u65E0\u6CD5\u5207\u6362`,collections:[],changed:!1};let c=i.items.map(Pe).filter(d=>d!==null),p=c.includes(M),g=c.find(d=>d!==M)??null;if(t===p)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&&!g)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)i.add(M);else{let d=i.items.findIndex(h=>Pe(h)===M);d>=0&&i.delete(d)}return await xt(o,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,M]:c.filter(d=>d!==M)}}a(Dt,"writeOfficialToggle");async function $e(e,n,t,o){jt(t,{label:"roleId"});let r=await Dt(n,t,o);if(!r.ok)return{...r,compile:void 0};Ne();let s=o&&r.changed?Ue(e):void 0;return{...r,compile:s}}a($e,"setOfficialKbEnabled");function je(e){return{ok:!0,...Ue(e)}}a(je,"recompileKnowledgeBases");var we=null;function Ue(e){return we?{started:!1}:(we=Mt(e).finally(()=>{we=null}),{started:!0})}a(Ue,"triggerCompile");async function Ft(e,n){let t={};for(let o of n){let r=await Nt(e,o);t[o]=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}a(Ft,"readKbStats");async function Mt(e){try{let n=await _e(e,{lenientEnv:!0}),t=await $t({settings:n});return{ok:!t.results.some(r=>r.action==="failed"),collections:t.collections,...t.skippedReason?{skippedReason:t.skippedReason}:{}}}catch(n){return{ok:!1,collections:[],skippedReason:n instanceof Error?n.message:String(n)}}}a(Mt,"recompileKb");async function oe(e){let n=await Xt(e),t={ok:!0,scenario:null,workflowId:null,eventSourceName:null,kbRoleId:null,kb:{userCollection:null,officialOn:!1,stats:{}},groups:[],groupBotsStaging:[],groupTableRef:null};if(!n)return t;let o=Lt(n),r=Jt(n),s=o&&r?"group-qa":null,i=r?await Ut(e,r):[],c=o?$($(n.workflows)?.[o.workflowId]):void 0,p=o?$($(c?.event_sources)?.[o.eventSourceName]):void 0,d=(await Be(e)).group_table??null;return{ok:!0,scenario:s,workflowId:o?.workflowId??null,eventSourceName:o?.eventSourceName??null,kbRoleId:r,kb:{userCollection:i.find(h=>h!==M)??null,officialOn:i.includes(M),stats:await Ft(e,i)},groups:eo(p?.conversation_ids),groupBotsStaging:await Wt(e,o?.workflowId??"group-qa"),groupTableRef:d}}a(oe,"readConsoleState");function Lt(e){let n=$(e.workflows);if(!n)return null;for(let[t,o]of Object.entries(n)){let r=$($(o)?.event_sources);if(r){for(let[s,i]of Object.entries(r))if($(i)&&"conversation_ids"in i)return{workflowId:t,eventSourceName:s}}}return null}a(Lt,"locateGroupQa");function Jt(e){let n=$(e.roles);if(!n)return null;for(let[t,o]of Object.entries(n)){let r=$($(o)?.knowledge_scope);if(Array.isArray(r?.kb_collections)&&r.kb_collections.length>0)return t}return null}a(Jt,"locateKbRole");async function De(e,n,t,o){let r=[...new Set(o.map(p=>p.trim()).filter(Boolean))],s=r.join(`
3
- `),i=["workflows",n,"event_sources",t],c=j.join("profile","profile.yml");return await ye({type:"yaml",file:c,yamlPath:[...i,"conversation_ids"],valueType:"string[]"},s,e),await ye({type:"yaml",file:c,yamlPath:[...i,"handler_config","conversation_ids"],valueType:"string[]"},s,e),Ne(),{ok:!0,message:r.length>0?`\u5DF2\u4FDD\u5B58 ${r.length} \u4E2A\u7FA4`:"\u5DF2\u6E05\u7A7A\u7FA4\u5217\u8868"}}a(De,"writeGroupList");var Fe="GROUP_BOTS_STAGING";async function se(e){let n=await Zt(e,Fe);if(!n)return[];try{let t=JSON.parse(n);return Array.isArray(t)?t:[]}catch{return[]}}a(se,"readGroupBotStagingRaw");async function Me(e,n){await ye({type:"env",file:".env",envKey:Fe},JSON.stringify(n),e)}a(Me,"writeGroupBotStagingRaw");function Kt(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}a(Kt,"maskBot");async function ve(e,n,t){let o=t.conversationId.trim();if(!o)return{ok:!1,message:"conversationId \u5FC5\u586B"};let r=await se(e),s=r.findIndex(p=>p.conversationId===o),i=r[s]??{conversationId:o,title:"",enabled:!0,bot:null},c={conversationId:o,title:t.title!==void 0?t.title:i.title,...t.groupType??i.groupType?{groupType:t.groupType??i.groupType}:{},...t.corpId??i.corpId?{corpId:t.corpId??i.corpId}:{},enabled:t.enabled!==void 0?t.enabled:i.enabled,bot:t.bot!==void 0?t.bot:i.bot};return s>=0?r[s]=c:r.push(c),await Me(e,r),{ok:!0,message:"\u5DF2\u4FDD\u5B58"}}a(ve,"saveGroupBotStaging");async function Wt(e,n){return(await se(e)).map(o=>({...o,bot:Kt(o.bot)}))}a(Wt,"readGroupBotStaging");var he="ai\u8868\u683C\u7FA4\u7B54\u7591\u52A9\u624B";function xe(e){return e instanceof Oe?`${e.guidance}
4
- \uFF08\u539F\u59CB\u9519\u8BEF\uFF1A${e.message}\uFF09`:e instanceof Error?e.message:String(e)}a(xe,"provisionErrorMessage");async function Le(){try{return await new Ae().getCurrentCorpId()}catch{return}}a(Le,"resolveCurrentCorpId");async function Je(e,n,t,o={}){let r=o.provision??new Ot({runner:new Ae}),s=j.join(e,".env"),i;try{i=await r.resolveEnterpriseRobot({name:he,desc:`${he} - aitable-workflow`,envFile:s})}catch(p){return{ok:!1,message:xe(p)}}let c=!1;try{await r.addBotToGroup(i.appKey,t.conversationId)}catch(p){if(p instanceof Oe&&p.kind==="bot_already_installed")c=!0;else return{ok:!1,message:xe(p)}}return await ve(e,n,{conversationId:t.conversationId,title:t.title,...t.groupType?{groupType:t.groupType}:{},corpId:i.corpId,enabled:!0,bot:{type:"enterprise",appKey:i.appKey,appSecret:i.appSecret,name:he}}),{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"}}a(Je,"addEnterpriseBotToGroup");function Ht(e){let n=[];for(let t of e){if(!t.enabled||!t.bot)continue;let o={\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"?n.push({...o,\u5165\u7AD9\u65B9\u5F0F:"stream",\u51FA\u7AD9\u65B9\u5F0F:"session",appKey:t.bot.appKey,...t.bot.appSecret?{appSecret:t.bot.appSecret}:{}}):n.push({...o,\u5165\u7AD9\u65B9\u5F0F:"dws",\u51FA\u7AD9\u65B9\u5F0F:"webhook",webhookUrl:t.bot.webhookUrl,...t.bot.webhookSecret?{webhookSecret:t.bot.webhookSecret}:{}})}return n}a(Ht,"stagingToGroupTableRecords");async function ie(e,n,t={}){let o=t.artifacts??await z(e,n),r=o.configTables.group_table,s=r?.baseId?.trim()??"",i=r?.tableId?.trim()??"";if(!s||!i)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=a(async()=>{o.ready&&await Me(n,[])},"clearStaging"),p=await se(n),g=Ht(p);if(g.length===0)return await c(),{ok:!0,created:0,message:"\u65E0\u53EF\u5199\u5165\u7684\u7FA4\u673A\u5668\u4EBA\u914D\u7F6E"};let d=t.dws??new ke({bin:"dws",timeoutMs:9e4}),h=t.existingGroupIds??(await be(s,i,{dws:d,fields:t.fields})).groups.map(C=>C.groupId),b=g.filter(C=>!h.includes(C.\u7FA4ID??""));if(b.length===0)return await c(),{ok:!0,created:0,message:"\u6682\u5B58\u5DF2\u5168\u90E8\u5728\u7FA4\u914D\u7F6E\u8868\u4E2D"};let P=t.fields??await Se(d,s,i),G=new Map(P.map(C=>[C.fieldName,C.fieldId])),X=b.map(C=>{let l={};for(let[u,m]of Object.entries(C)){let f=G.get(u);f&&(l[f]=m)}return{cells:l}});return await d.runJson(["aitable","record","create","--base-id",s,"--table-id",i,"--records",JSON.stringify(X),"--yes"]),await c(),{ok:!0,created:b.length,message:`\u5DF2\u5199\u5165 ${b.length} \u6761\u7FA4\u914D\u7F6E`}}a(ie,"writeStagingToGroupTable");var _={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 N(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(N).filter(Boolean).join(",");if(R(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""}a(N,"cellToText");function Yt(e){if(e==null||e==="")return!0;let n=N(e).toLowerCase();return["true","1","yes","on","\u662F","\u5F00\u542F","\u542F\u7528","\u5DF2\u52FE\u9009"].includes(n)||(typeof e=="boolean"?e:!1)}a(Yt,"cellToEnabled");function qt(e){let n=N(e);if(n.includes("\u5185\u90E8"))return"internal";if(n.includes("\u5916\u90E8"))return"external"}a(qt,"cellToGroupType");function zt(e){if(!R(e))return[];let t=(R(e.data)?e.data:e).records;return Array.isArray(t)?t:[]}a(zt,"extractConsoleRecords");async function be(e,n,t={}){if(!e||!n)return{ok:!1,baseId:e,tableId:n,groups:[]};let o=t.dws??new ke({bin:"dws",timeoutMs:9e4}),[r,s]=await Promise.all([t.fields?Promise.resolve(t.fields):Se(o,e,n),o.runJson(["aitable","record","query","--base-id",e,"--table-id",n,"--all","--format","json"])]),i=new Map(r.map(g=>[g.fieldName,g.fieldId])),c=a((g,d)=>{if(d in g)return g[d];let h=i.get(d);return h?g[h]:void 0},"readCol"),p=[];for(let g of zt(s)){let d=R(g.cells)?g.cells:{},h=N(c(d,_.groupId));if(!h)continue;let b=N(c(d,_.appSecret)),P=N(c(d,_.webhookSecret)),G=qt(c(d,_.groupType));p.push({recordId:String(g.recordId??g.id??""),groupId:h,groupName:N(c(d,_.groupName)),...G?{groupType:G}:{},corpId:N(c(d,_.corpId)),inbound:N(c(d,_.inbound)),outbound:N(c(d,_.outbound)),webhookUrl:N(c(d,_.webhookUrl)),webhookSecret:P?"***":"",appKey:N(c(d,_.appKey)),appSecret:b?"***":"",botNick:N(c(d,_.botNick)),enabled:Yt(c(d,_.enabled))})}return{ok:!0,baseId:e,tableId:n,groups:p}}a(be,"readGroupConfigTable");async function Ke(e,n,t={}){let o=t.artifacts??await z(e,n),r=o.configTables.group_table,s=r?.baseId?.trim()??"",i=r?.tableId?.trim()??"";if(!s||!i)return{ok:!1,baseId:s,tableId:i,groups:[]};let c=await be(s,i,t);if(c.ok&&c.groups.length===0&&(await se(n)).length>0){let g=await ie(e,n,{...t,artifacts:o,existingGroupIds:[]});g.ok&&g.created>0&&(c=await be(s,i,t))}return c}a(Ke,"readGroupConfigTableForConsole");async function We(e,n,t,o,r={}){if(!e||!n||!t)return{ok:!1,message:"baseId / tableId / recordId \u5FC5\u586B"};let s=r.dws??new ke({bin:"dws",timeoutMs:9e4}),i=r.fields??await Se(s,e,n),c=new Map(i.map(g=>[g.fieldName,g.fieldId])),p={};for(let[g,d]of Object.entries(o)){if(d===void 0)continue;let h=_[g];if(!h)continue;let b=c.get(h)??h;p[b]=d}return Object.keys(p).length===0?{ok:!1,message:"\u65E0\u53EF\u66F4\u65B0\u5B57\u6BB5"}:(await s.runJson(["aitable","record","update","--base-id",e,"--table-id",n,"--records",JSON.stringify([{recordId:t,cells:p}]),"--yes"]),{ok:!0,message:"\u8BB0\u5F55\u5DF2\u66F4\u65B0"})}a(We,"updateGroupConfigRecord");var Vt=["loggedIn","isLoggedIn","isLogin","authenticated","tokenValid","isValid"];function He(e){if(!e||typeof e!="object")return null;let n=e;for(let t of Vt)if(typeof n[t]=="boolean")return n[t];for(let t of Object.values(n)){let o=He(t);if(o!==null)return o}return null}a(He,"findAuthBoolean");async function Ye(e={}){let n=e.bin??"dws",t=e.runner??((o,r)=>Bt(o,r,{timeoutMs:15e3}));try{let o=await Gt(n,["auth","status","--format","json"],{runner:t}),r=`${o.stdout}
5
- ${o.stderr}`.trim();for(let s of[r,...r.split(/\r?\n/).reverse()])try{let i=He(JSON.parse(s));if(i!==null)return{loggedIn:i}}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)}:o.exitCode===0?{loggedIn:!0}:{loggedIn:!1,message:r.split(/\r?\n/)[0]?.slice(0,200)||"dws auth status \u5931\u8D25"}}catch(o){return{loggedIn:!1,message:o instanceof Error?o.message:String(o)}}}a(Ye,"checkDwsAuthStatus");var qe=j.join(".aitable-workflow","dws-login.log"),Qt=/https:\/\/login\.dingtalk\.com\/oauth2\/device\/verify\.htm\?user_code=[A-Za-z0-9-]+/;async function ze(e,n={}){let t=j.resolve(e,qe);await Pt(j.dirname(t),{recursive:!0});try{return await me(n.bin??"dws",["auth","login","--device","--yes","--no-browser"],{logFile:t}),{ok:!0,logFile:t}}catch(o){return{ok:!1,message:o instanceof Error?o.message:String(o)}}}a(ze,"startDwsDeviceLogin");async function Ve(e){try{return{verifyUrl:(await q(j.resolve(e,qe),"utf8")).match(Qt)?.[0]??null}}catch{return{verifyUrl:null}}}a(Ve,"readDwsLoginProgress");async function Zt(e,n){let t;try{t=await q(j.resolve(e,".env"),"utf8")}catch{return null}let o=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),r=t.match(new RegExp(`^${o}=(.*)$`,"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}a(Zt,"readEnvKey");async function Xt(e){try{let n=L.parse(await q(j.resolve(e,"profile","profile.yml"),"utf8"));return R(n)?n:null}catch{return null}}a(Xt,"readProfileDoc");function $(e){return R(e)?e:void 0}a($,"asRecord");function eo(e){return Array.isArray(e)?e.filter(n=>typeof n=="string"):[]}a(eo,"toStringArray");function R(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}a(R,"isRecord");import{spawnManagedProcess as to}from"aitable-workflow-core";function Ze(e){let n=oo(e);try{let t=to({...n,stdio:"ignore",detached:!0});t.child.once("error",()=>Qe(e)),t.unref()}catch{Qe(e)}}a(Ze,"openExternalUrl");function oo(e,n=process.platform){return n==="darwin"?{command:"open",args:[e]}:n==="win32"?{command:"rundll32.exe",args:["url.dll,FileProtocolHandler",e]}:{command:"xdg-open",args:[e]}}a(oo,"openInvocation");function Qe(e){console.log(`\u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00: ${e}`)}a(Qe,"printFallback");function ot(e){return e?`workbench/${e}`:"setup"}a(ot,"consoleStartPath");var nt=I.dirname(ao(import.meta.url)),ho={".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"},yo=1800*1e3;function bo(e){let n=null,t=a(()=>{n&&clearTimeout(n),n=null},"clear");return{clear:t,armed:a(()=>n!==null,"armed"),reset:a(()=>{t(),e.isEnabled()&&(n=setTimeout(e.onTimeout,e.timeoutMs))},"reset")}}a(bo,"createIdleTimer");var E={phase:"idle"},v={status:"idle"},Q=Promise.resolve(),ko=12e4,ne=new Set,F=class extends Error{constructor(t,o){super(o);this.status=t;this.name="TriggerOnceHttpError"}status;static{a(this,"TriggerOnceHttpError")}},Z=class extends Error{constructor(t,o){super(o);this.status=t;this.name="PromotionHttpError"}status;static{a(this,"PromotionHttpError")}},So=6e4,le=!1;function vo(){return process.platform==="darwin"||process.platform==="win32"||process.env.DISPLAY||process.env.WAYLAND_DISPLAY?"local-gui":"remote"}a(vo,"detectEnvironment");function ut(){let e=I.join(nt,"web");if(et(I.join(e,"index.html")))return e;let n=I.resolve(nt,"..","..","..","web","dist");return et(I.join(n,"index.html"))?n:null}a(ut,"resolveWebRoot");function ln(){return ut()!==null}a(ln,"hasWebRoot");async function Io(e){let t=e+13-1,{createServer:o}=await import("net"),r=a(s=>new Promise((i,c)=>{let p=o();p.listen(s,()=>{let g=p.address(),d=typeof g=="object"&&g?g.port:s;p.close(()=>i(d))}),p.on("error",()=>{s<t?r(s+1).then(i,c):c(new Error(`\u65E0\u6CD5\u627E\u5230\u53EF\u7528\u7AEF\u53E3 (${e}-${t})`))})}),"tryListen");return r(e)}a(Io,"getAvailablePort");var Ro=1024*1024,To=50*1024*1024,dt=I.join(".aitable-workflow","console-access.json");async function pt(e,n){let t=I.join(e,dt);return await ce(I.dirname(t),{recursive:!0}),await Ie(t,`${JSON.stringify(n,null,2)}
6
- `,"utf8"),t}a(pt,"writeConsoleAccessFile");function Co(e){try{io(I.join(e,dt))}catch{}}a(Co,"clearConsoleAccessFile");async function D(e,n=Ro){return new Promise((t,o)=>{let r=[],s=0;e.on("data",i=>{if(s+=i.length,s>n){e.destroy(),o(new Error("Request body too large"));return}r.push(i)}),e.on("end",()=>{try{t(JSON.parse(Buffer.concat(r).toString("utf8")))}catch{o(new Error("Invalid JSON body"))}}),e.on("error",o)})}a(D,"readJson");function w(e,n,t=200){let o=JSON.stringify(n);e.writeHead(t,{"Content-Type":"application/json; charset=utf-8","Content-Length":Buffer.byteLength(o)}),e.end(o)}a(w,"sendJson");function k(e,n,t){w(e,{ok:!1,error:t},n)}a(k,"sendError");function W(e){let n=JSON.parse(JSON.stringify(e));for(let t of n.modules){let o=t.workflows?t.workflows.flatMap(r=>r.items):t.items;for(let r of o)r.sensitive&&r.value!==void 0&&(r.value="***")}return n}a(W,"maskSensitive");async function un(e){let n=e.port??8788,t=await Io(n),o=vo(),r=ct.randomUUID(),s=o==="remote"?"0.0.0.0":"127.0.0.1",i=ut(),c=e.mode??"setup",p=e.app;if(c==="runtime"&&!p)throw new Error("runtime \u6A21\u5F0F\u5FC5\u987B\u4F20\u5165 App \u5B9E\u4F8B");if(!i)throw new Error("Web \u8D44\u6E90\u76EE\u5F55\u4E0D\u5B58\u5728\uFF0C\u65E0\u6CD5\u542F\u52A8\u53EF\u89C6\u5316\u914D\u7F6E\u754C\u9762");let g=await lt(e.configPath),d=I.dirname(g);E={phase:"idle"},v={status:"idle"},Q=Promise.resolve(),ne.clear();let h=e.assembleApp?{assembleApp:e.assembleApp,commit:a(m=>{p=m,c="runtime",C(),e.onAppAssembled?.(m)},"commit")}:void 0,b="";e.initialRunStatus&&(v=e.initialRunStatus);let P=null,G=new Promise(m=>P=m),X=bo({timeoutMs:yo,isEnabled:a(()=>c==="setup","isEnabled"),onTimeout:a(()=>{console.log(`
7
- \u2139 \u914D\u7F6E\u754C\u9762\u8D85\u8FC7 30 \u5206\u949F\u65E0\u6D3B\u52A8\uFF0C\u5DF2\u81EA\u52A8\u5173\u95ED\u3002`),P?.()},"onTimeout")}),C=a(()=>X.reset(),"resetTimeout"),l=no(async(m,f)=>{let y=new URL(m.url??"/",`http://${m.headers.host??"localhost"}`),O=m.headers.origin;if(O){let x=`http://127.0.0.1:${t}`;(O===x||o==="remote")&&f.setHeader("Access-Control-Allow-Origin",O)}if(f.setHeader("Access-Control-Allow-Methods","GET, POST, OPTIONS"),f.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization"),m.method==="OPTIONS"){f.writeHead(204),f.end();return}if(y.pathname.startsWith("/dev/")){if((y.searchParams.get("token")??m.headers.authorization?.replace("Bearer ",""))!==r){k(f,401,"Unauthorized");return}C();try{await Eo({url:y,req:m,res:f,configPath:e.configPath,configDir:d,completionResolve:P,setupOptions:e.setupOptions,mode:c,app:p,promotion:h?{...h,access:{configDir:d,url:b,port:t}}:void 0,exitOnSetupError:e.exitOnSetupError!==!1})}catch(U){let ee=U instanceof Error?U.message:String(U);k(f,500,ee)}return}if(y.pathname.startsWith("/api/")){w(f,{error:{message:"\u914D\u7F6E\u754C\u9762\u4E0D\u63D0\u4F9B /api \u63A5\u53E3"}},404);return}_o(y,f,i)});await new Promise(m=>l.listen(t,s,m)),C();let u=(await oe(d).catch(()=>null))?.scenario??null;b=o==="local-gui"?`http://127.0.0.1:${t}/${ot(u)}?token=${r}`:`http://${co.hostname()}:${t}/${ot(u)}?token=${r}`,await pt(d,{url:b,port:t,mode:c,pid:process.pid,since:new Date().toISOString()}),process.on("exit",()=>Co(d)),o==="local-gui"?e.open!==!1?(Ze(b),console.log(`\u2139 \u6D4F\u89C8\u5668\u5DF2\u6253\u5F00: ${b}`)):console.log(`\u2139 \u8BF7\u624B\u52A8\u6253\u5F00\u6D4F\u89C8\u5668: ${b}`):(console.log("\u2139 \u914D\u7F6E\u754C\u9762\u5DF2\u542F\u52A8\uFF0C\u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00:"),console.log(` ${b}`),console.log(`
8
- \u5982\u679C\u65E0\u6CD5\u76F4\u63A5\u8BBF\u95EE\uFF0C\u53EF\u901A\u8FC7 SSH \u7AEF\u53E3\u8F6C\u53D1:
9
- ssh -L ${t}:127.0.0.1:${t} <your-host>`),console.log(` \u7136\u540E\u6253\u5F00: http://127.0.0.1:${t}/setup?token=${r}`)),c==="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 G,X.clear(),l.close()}a(un,"runConfigUI");async function Eo(e){let{url:n,req:t,res:o,configPath:r,configDir:s,completionResolve:i,setupOptions:c,mode:p,app:g,promotion:d,exitOnSetupError:h}=e;if(t.method==="GET"&&n.pathname==="/dev/config/check"){let l=await V({configPath:r});w(o,W(l));return}if(t.method==="GET"&&n.pathname==="/dev/config/enriched"){let l=await V({configPath:r}),u=uo(),m=await lo(r),f={},y={},O=new Set,x=/\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}/g;try{let S=await lt(r),A=await ae(S,"utf8");for(let J of go([A]))O.add(J)}catch{}try{let S=await ae(I.join(s,"profile","profile.yml"),"utf8"),A=Re.parse(S),J=A?.workflows;if(J&&typeof J=="object"&&(y=J),A&&typeof A=="object"){let{workflows:Ce,...H}=A;for(let te of JSON.stringify(H).matchAll(x))O.add(te[1])}}catch{}for(let S of m.workflowEntries)try{let A=await po(S.templatePath),J=A.steps.map(T=>({id:T.id,name:T.name,recipe:T.recipe,engine:T.engine,auto:T.auto})),Ce=A.edges.filter(T=>T.from!=="__start__"&&T.to!=="__end__").map(T=>({from:T.from,to:T.to,condition:T.condition})),H={},te=new Set,K;try{K=Re.parse(await ae(S.templatePath,"utf8"))}catch{}if(K){for(let B of JSON.stringify(K).matchAll(x))te.add(B[1]);let T=y[S.id];if(T&&typeof T=="object")for(let B of JSON.stringify(T).matchAll(x))te.add(B[1]);let gt=Array.isArray(K.steps)?K.steps:[];for(let B=0;B<A.steps.length;B++){let ue=A.steps[B],Y=gt[B];if(Y){let de=JSON.stringify(Y),pe=new Set;for(let mt of de.matchAll(x))pe.add(mt[1]);pe.size>0&&(H[ue.id]=[...pe])}}let ft=Array.isArray(K.event_sources)?K.event_sources:[];for(let B of ft)if(B){let ue=JSON.stringify(B),Y=new Set;for(let de of ue.matchAll(x))Y.add(de[1]);Y.size>0&&(H.__event_sources__=[...H.__event_sources__??[],...Y])}}f[S.id]={steps:J,edges:Ce,stepEnvRefs:H,envRefs:[...te].sort()}}catch{f[S.id]={steps:[],edges:[],stepEnvRefs:{},envRefs:[]}}let U=new Set;for(let S of Object.values(f))for(let A of S.envRefs??[])U.add(A);let ee=l.modules.find(S=>S.id==="env");for(let S of ee?.items??[])S.writeTarget?.type==="env"&&!U.has(S.key)&&O.add(S.key);w(o,{config:W(l),engines:{available:u.available.map(S=>({engine:S.engine,cmd:S.cmd,version:S.version})),recommended:u.recommendedEngine},workflowTopology:f,projectEnvRefs:[...O].sort()});return}if(t.method==="POST"&&n.pathname==="/dev/config/save"){let l=await D(t);try{let u=await fo(l,s,r);w(o,{ok:!0,written:u.written,recheck:W(u.recheck)})}catch(u){if(u instanceof mo){k(o,u.status,u.message);return}throw u}return}if(t.method==="POST"&&n.pathname==="/dev/kb/ingest"){let l=await D(t);if(!l.roleId||!l.source){k(o,400,"roleId and source are required");return}try{tt(l.roleId,{label:"roleId"})}catch(O){k(o,400,O instanceof Error?O.message:"roleId \u4E0D\u5408\u6CD5");return}let u=I.resolve(s,"roles",`${l.roleId}.role.yml`),m=await fe(u,l.roleId),f=await ge({source:l.source,collectionName:m,configDir:s}),y=await V({configPath:r});w(o,{ok:f.success,message:f.message,recheck:W(y)});return}if(t.method==="POST"&&n.pathname==="/dev/kb/upload"){let l=await D(t,To);if(!l.roleId||!Array.isArray(l.files)||l.files.length===0){k(o,400,"roleId and files are required");return}try{tt(l.roleId,{label:"roleId"})}catch(y){k(o,400,y instanceof Error?y.message:"roleId \u4E0D\u5408\u6CD5");return}let u=I.resolve(s,"roles",`${l.roleId}.role.yml`),m=await fe(u,l.roleId),f=I.resolve(s,".kb-upload-tmp",`upload-${Date.now()}`);try{await ce(f,{recursive:!0});for(let x of l.files){let U;try{U=Te(f,x.relativePath,{allowRoot:!1})}catch{k(o,400,`\u4E0A\u4F20\u6587\u4EF6\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${x.relativePath}`);return}let ee=I.dirname(U);await ce(ee,{recursive:!0});let S=x.encoding==="base64"?Buffer.from(x.content,"base64"):Buffer.from(x.content,"utf8");await Ie(U,S)}let y=await ge({source:f,collectionName:m,configDir:s}),O=await V({configPath:r});w(o,{ok:y.success,message:y.message,recheck:W(O)})}finally{await ro(f,{recursive:!0,force:!0}).catch(()=>{})}return}if(t.method==="GET"&&n.pathname==="/dev/file/read"){let l=n.searchParams.get("path")??"",u=at(l,s);if(!u){k(o,403,`\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${l}`);return}try{let m=await ae(u,"utf8");w(o,{ok:!0,path:l,content:m,exists:!0})}catch{w(o,{ok:!0,path:l,content:"",exists:!1})}return}if(t.method==="POST"&&n.pathname==="/dev/file/write"){let l=await D(t),u=typeof l.path=="string"?l.path:"",m=at(u,s);if(!m||typeof l.content!="string"){k(o,403,`\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${u}`);return}let f=Oo(u,l.content);if(f){w(o,{ok:!1,error:f},400);return}await ce(I.dirname(m),{recursive:!0}),await Ie(m,l.content.endsWith(`
14
- `)?l.content:l.content+`
15
- `,"utf8");let y=await V({configPath:r});w(o,{ok:!0,recheck:W(y)});return}if(t.method==="POST"&&n.pathname==="/dev/setup/complete"){if(E.phase==="running"){k(o,409,"setup \u5DF2\u5728\u8FD0\u884C\u4E2D");return}E={phase:"running",logs:[]},w(o,{ok:!0});let l=a(async()=>{try{let u=await ie(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 l(),await wo({config:r,...c??{}}),await l();let u=await z(r,s),m=Ao(u),f={mode:p};if(p==="setup"&&d){let y=await st({configPath:r,...d});f=y.ok?{mode:"runtime"}:{mode:"setup",promotionError:y.error}}E={phase:"done",artifacts:u,baseUrl:m,...f}}catch(u){E={phase:"error",message:u instanceof Error?u.message:String(u)},h&&i?.()}})();return}if(t.method==="GET"&&n.pathname==="/dev/setup/progress"){w(o,E);return}if(t.method==="GET"&&n.pathname==="/dev/setup/artifacts"){w(o,await z(r,s));return}if(t.method==="GET"&&n.pathname==="/dev/console/state"){w(o,await oe(s));return}if(t.method==="POST"&&n.pathname==="/dev/console/groups"){let l=await D(t);if(!l.workflowId||!l.eventSourceName||!Array.isArray(l.conversationIds)){k(o,400,"workflowId / eventSourceName / conversationIds \u5FC5\u586B");return}let u=await De(s,l.workflowId,l.eventSourceName,l.conversationIds),m=await V({configPath:r});w(o,{...u,recheck:W(m)});return}if(t.method==="GET"&&n.pathname==="/dev/console/admin-groups"){w(o,await Ge());return}if(t.method==="GET"&&n.pathname==="/dev/console/dws-auth"){w(o,await Ye());return}if(t.method==="POST"&&n.pathname==="/dev/console/dws-auth/login"){let l=await ze(s);w(o,l,l.ok?200:400);return}if(t.method==="GET"&&n.pathname==="/dev/console/dws-auth/login"){w(o,await Ve(s));return}let b=n.pathname.match(/^\/dev\/console\/groups\/([^/]+)\/add-enterprise-bot$/);if(t.method==="POST"&&b){let l=decodeURIComponent(b[1]),u=await D(t),m=await oe(s),f=await Je(s,m.workflowId??"group-qa",{conversationId:l,title:u.title??"",...u.groupType?{groupType:u.groupType}:{}});w(o,f,f.ok?200:400);return}let P=n.pathname.match(/^\/dev\/console\/groups\/([^/]+)\/custom-bot$/);if(t.method==="POST"&&P){let l=decodeURIComponent(P[1]),u=await D(t);if(!u.name||!u.webhook||!u.secret){k(o,400,"name / webhook / secret \u5FC5\u586B");return}if(!/^https?:\/\//.test(u.webhook)){k(o,400,"webhook \u5FC5\u987B\u4EE5 http(s):// \u5F00\u5934");return}let m=await oe(s),f=await Le(),y=await ve(s,m.workflowId??"group-qa",{conversationId:l,...u.title!==void 0?{title:u.title}:{},...u.groupType?{groupType:u.groupType}:{},...f?{corpId:f}:{},enabled:!0,bot:{type:"custom",name:u.name,webhookUrl:u.webhook,...u.secret?{webhookSecret:u.secret}:{}}});w(o,y,y.ok?200:400);return}if(t.method==="GET"&&n.pathname==="/dev/console/group-config-table"){try{w(o,await Ke(r,s))}catch(l){k(o,502,l instanceof Error?l.message:"\u7FA4\u914D\u7F6E\u8868\u8BFB\u53D6\u5931\u8D25")}return}if(t.method==="POST"&&n.pathname==="/dev/console/group-config-table/flush-staging"){let l=await ie(r,s);w(o,l,l.ok?200:400);return}let G=n.pathname.match(/^\/dev\/console\/group-config-table\/([^/]+)$/);if(t.method==="POST"&&G){let l=decodeURIComponent(G[1]),u=await D(t),f=(await z(r,s)).configTables.group_table;if(!f?.baseId||!f.tableId){k(o,400,"\u7FA4\u914D\u7F6E\u8868\u5C1A\u672A\u5C31\u7EEA");return}try{let y=await We(f.baseId,f.tableId,l,u);w(o,y,y.ok?200:400)}catch(y){k(o,502,y instanceof Error?y.message:"\u7FA4\u914D\u7F6E\u8868\u5199\u5165\u5931\u8D25")}return}if(t.method==="POST"&&n.pathname==="/dev/kb/official"){let l=await D(t);if(!l.roleId||typeof l.enabled!="boolean"){w(o,{ok:!1,code:"KB_BAD_REQUEST",message:"roleId \u4E0E enabled(boolean) \u5FC5\u586B"},400);return}let u;try{u=await $e(r,s,l.roleId,l.enabled)}catch(m){w(o,{ok:!1,code:"KB_TOGGLE_FAILED",message:m instanceof Error?m.message:"\u5B98\u65B9\u77E5\u8BC6\u5E93\u5F00\u5173\u5931\u8D25",collections:[]},400);return}w(o,u,u.ok?200:400);return}if(t.method==="POST"&&n.pathname==="/dev/kb/recompile"){let l=await je(r);w(o,l);return}if(t.method==="GET"&&n.pathname==="/dev/console/mode"){w(o,{ok:!0,mode:p,promotable:p==="setup"&&!!d});return}if(t.method==="POST"&&n.pathname==="/dev/console/promote"){if(p==="runtime"){w(o,{ok:!0,mode:"runtime"});return}if(!d){k(o,409,"\u5F53\u524D\u63A7\u5236\u53F0\u4E0D\u652F\u6301\u5C31\u5730\u664B\u5347\uFF08setup \u547D\u4EE4\u8BF7\u4F7F\u7528 aitable-workflow start\uFF09");return}if(E.phase!=="done"){k(o,409,"\u642D\u5EFA\u5C1A\u672A\u5B8C\u6210\uFF0C\u65E0\u6CD5\u8FDB\u5165\u8FD0\u884C\u6A21\u5F0F");return}try{let l=await st({configPath:r,...d});l.ok?w(o,{ok:!0,mode:"runtime"}):w(o,{ok:!1,mode:"setup",error:l.error},l.status)}catch(l){let u=l instanceof Z?l.status:500;k(o,u,l instanceof Error?l.message:String(l))}return}if(t.method==="GET"&&n.pathname==="/dev/run/status"){if(p==="setup"){w(o,{ok:!0,status:"unknown"});return}w(o,{ok:!0,...rt()});return}let C={"/dev/run/start":"start","/dev/run/stop":"stop"}[n.pathname];if(t.method==="POST"&&C){if(p==="setup"){k(o,409,"setup \u6A21\u5F0F\u4E0D\u652F\u6301\u8FD0\u884C\u63A7\u5236\uFF0C\u8BF7\u4F7F\u7528 aitable-workflow start \u547D\u4EE4");return}let l=await Po(C,g);w(o,{...l,status:rt()});return}if(t.method==="POST"&&n.pathname==="/dev/workflow/trigger-once"){if(p==="setup"){k(o,409,"setup \u6A21\u5F0F\u6CA1\u6709\u8FD0\u884C\u4E2D\u7684\u5F15\u64CE\uFF0C\u65E0\u6CD5\u89E6\u53D1\u5DE5\u4F5C\u6D41");return}let l;try{l=await D(t)}catch(u){k(o,400,u instanceof Error?u.message:String(u));return}try{let u=await xo(String(l.workflowId??""),g);w(o,{ok:!0,...u})}catch(u){let m=u instanceof F?u.status:500;k(o,m,u instanceof Error?u.message:String(u))}return}k(o,404,"Unknown endpoint")}a(Eo,"handleDevApi");function rt(){return v}a(rt,"getRuntimeRunStatus");async function Po(e,n){let t=ct.randomUUID();return e==="start"?v.status==="running"||v.status==="starting"?{ok:!0,action:e,requestId:t}:(v={status:"starting",since:new Date().toISOString(),lastError:null},Q=Q.then(()=>{let o=n.start();v.status==="starting"&&(v={status:"running",since:new Date().toISOString(),lastError:null}),o.catch(r=>{v={status:"error",lastError:r instanceof Error?r.message:String(r)}})}).catch(o=>{v={status:"error",lastError:o instanceof Error?o.message:String(o)}}),{ok:!0,action:e,requestId:t}):e==="stop"?v.status==="stopping"?{ok:!0,action:e,requestId:t}:v.status!=="running"&&v.status!=="starting"?(v={status:"stopped",lastError:null},{ok:!0,action:e,requestId:t}):(v={status:"stopping",lastError:null},Q=Q.then(async()=>{await n.stop(),v={status:"stopped",lastError:null}}).catch(o=>{v={status:"error",lastError:o instanceof Error?o.message:String(o)}}),{ok:!0,action:e,requestId:t}):{ok:!1,action:e,requestId:t}}a(Po,"handleRuntimeRunControl");async function xo(e,n,t={}){if(typeof e!="string"||e.length===0)throw new F(400,"\u7F3A\u5C11 workflowId");if(!n.instances.some(i=>i.id===e)){let i=n.instances.map(c=>c.id).join("\u3001")||"\uFF08\u65E0\uFF09";throw new F(400,`\u672A\u77E5\u5DE5\u4F5C\u6D41 "${e}"\u3002\u5F53\u524D\u53EF\u89E6\u53D1\uFF1A${i}`)}if(ne.has(e))throw new F(409,`\u5DE5\u4F5C\u6D41 "${e}" \u6B63\u5728\u89E6\u53D1\u4E2D\uFF0C\u8BF7\u7B49\u672C\u6B21\u5B8C\u6210`);ne.add(e);let o=new AbortController,r=null,s=t.timeoutMs??ko;try{let i=new Promise((p,g)=>{r=setTimeout(()=>{o.abort(),g(new F(504,`\u89E6\u53D1\u8D85\u65F6\uFF08${s}ms\uFF09\uFF0C\u5DF2\u4E2D\u6B62\u672C\u6B21\u6267\u884C`))},s)}),c=await Promise.race([n.triggerWorkflowOnce(e,{signal:o.signal}),i]);return{workflowId:e,...c}}catch(i){throw i instanceof F?i:new F(500,i instanceof Error?i.message:String(i))}finally{r&&clearTimeout(r),ne.delete(e)}}a(xo,"handleTriggerWorkflowOnce");function dn(){ne.clear()}a(dn,"resetTriggerOnceForTest");async function st(e,n={}){if(le)throw new Z(409,"\u664B\u5347\u8FDB\u884C\u4E2D\uFF0C\u8BF7\u7B49\u672C\u6B21\u5B8C\u6210");le=!0;let t=n.timeoutMs??So,o=null;try{let r=new Promise((i,c)=>{o=setTimeout(()=>c(new Z(504,`\u88C5\u914D\u8D85\u65F6\uFF08${t}ms\uFF09\uFF0C\u5DF2\u4E2D\u6B62\u672C\u6B21\u664B\u5347`)),t)}),s=await Promise.race([e.assembleApp(e.configPath),r]);if(e.commit(s),v={status:"idle"},e.access)try{await pt(e.access.configDir,{url:e.access.url,port:e.access.port,mode:"runtime",pid:process.pid,since:new Date().toISOString()})}catch(i){console.error(`[console] console-access.json \u91CD\u5199\u5931\u8D25: ${i instanceof Error?i.message:String(i)}`)}return it({ok:!0,mode:"runtime"}),{ok:!0,mode:"runtime"}}catch(r){let s=r instanceof Z?r.status:500,i=r instanceof Error?r.message:String(r);console.error(`[console] setup\u2192runtime \u664B\u5347\u5931\u8D25: ${i}`);let c={ok:!1,mode:"setup",status:s,error:i};return it(c),c}finally{o&&clearTimeout(o),le=!1}}a(st,"handleConsolePromotion");function it(e){if(E.phase==="done")if(e.ok){let{promotionError:n,...t}=E;E={...t,mode:"runtime"}}else E={...E,mode:"setup",promotionError:e.error}}a(it,"applyPromotionToDoneProgress");function pn(){v={status:"idle"},Q=Promise.resolve()}a(pn,"resetRuntimeRunStatusForTest");function gn(){le=!1,E={phase:"idle"},v={status:"idle"}}a(gn,"resetPromotionForTest");function fn(e){E=e}a(fn,"setSetupProgressForTest");function mn(){return E}a(mn,"getSetupProgressForTest");function at(e,n){let t=e.trim();if(!t||!/\.(ya?ml|json)$/i.test(t))return null;try{return Te(n,t,{allowRoot:!1})}catch{return null}}a(at,"resolveInsideConfigDir");function Oo(e,n){try{return/\.json$/i.test(e)?JSON.parse(n):Re.parse(n),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)}`}}a(Oo,"validateStructuredText");function Ao(e){let n=Object.values(e.trackers).find(t=>t.baseId&&t.tableId);return n?.baseId?`https://alidocs.dingtalk.com/i/nodes/${encodeURIComponent(n.baseId)}`:null}a(Ao,"deriveBaseUrl");async function _o(e,n,t){let o;try{let i=decodeURIComponent(e.pathname).replace(/^\/+/,"")||"index.html";o=Te(t,i,{allowRoot:!1})}catch{n.writeHead(403),n.end("Forbidden");return}try{(await Xe(o)).isDirectory()&&(o=I.join(o,"index.html"))}catch{o=I.join(t,"index.html")}try{await Xe(o)}catch{n.writeHead(404),n.end("Not Found");return}let r=I.extname(o),s=ho[r]??"application/octet-stream";n.writeHead(200,{"Content-Type":s}),so(o).pipe(n)}a(_o,"serveStatic");export{$o as a,Ze as b,ot as c,bo as d,F as e,Z as f,vo as g,ut as h,ln as i,dt as j,pt as k,Co as l,un as m,rt as n,Po as o,xo as p,dn as q,st as r,pn as s,gn as t,fn as u,mn as v,_o as w};
@@ -1 +0,0 @@
1
- .agents-page{padding:20px 24px 40px;display:flex;flex-direction:column;gap:24px;max-width:900px}.agents-loading,.agents-error,.agents-empty{padding:14px 16px;border-radius:10px;font-size:13px}.agents-loading{color:var(--text-muted)}.agents-error{background:color-mix(in srgb,#ef4444 12%,transparent);color:#b91c1c;border:1px solid color-mix(in srgb,#ef4444 30%,transparent)}.agents-empty{background:var(--bg-panel);border:1px dashed var(--border);color:var(--text-muted)}.agents-section{border:1px solid var(--border);border-radius:12px;background:var(--bg-panel);padding:16px 18px}.agents-section__head{display:flex;align-items:center;justify-content:space-between;font-weight:600;font-size:14px;margin-bottom:12px}.agents-refresh{display:inline-flex;align-items:center;gap:4px;font-size:12px;padding:4px 10px;border-radius:8px;border:1px solid var(--border);background:transparent;cursor:pointer}.agents-table{width:100%;border-collapse:collapse;font-size:13px}.agents-table th,.agents-table td{text-align:left;padding:8px 10px;border-bottom:1px solid var(--border)}.agents-table th{color:var(--text-muted);font-weight:500;font-size:12px}.agents-cell__name{font-weight:600}.agents-cell__id{font-family:var(--font-mono, ui-monospace, monospace);color:var(--text-muted);font-size:12px}.agents-form{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px 16px}.agents-field{display:flex;flex-direction:column;gap:6px}.agents-field--full{grid-column:1 / -1}.agents-field--check{flex-direction:row;align-items:center;gap:8px;grid-column:1 / -1}.agents-field__label{font-size:12px;color:var(--text-muted)}.agents-field input[type=text],.agents-field select,.agents-field textarea{font:inherit;font-size:13px;padding:7px 9px;border-radius:8px;border:1px solid var(--border);background:var(--bg-app);color:var(--text-primary)}.agents-runtime__search{margin-bottom:2px}.agents-runtime__chips{display:flex;flex-wrap:wrap;gap:6px}.agents-runtime__chip{font-size:12px;padding:3px 10px;border-radius:999px;border:1px solid var(--border);background:var(--bg-app);cursor:pointer}.agents-runtime__chip.is-selected{border-color:var(--accent, #6366f1);color:var(--accent, #6366f1);background:color-mix(in srgb,#6366f1 12%,transparent)}.agents-runtime__none{font-size:12px;color:var(--text-muted)}.agents-form__actions{grid-column:1 / -1;display:flex}.agents-hint{margin:12px 0 0;font-size:12px;color:var(--text-muted);line-height:1.6}.agents-hint code{font-family:var(--font-mono, ui-monospace, monospace);background:var(--bg-app);padding:1px 4px;border-radius:4px}: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-stage--live.has-table{grid-template-columns:minmax(300px,38%) 264px minmax(0,1fr) 300px}.run-table{display:flex;flex-direction:column;min-width:0;min-height:0;border-right:1px solid var(--border);background:var(--bg-panel)}.run-table__head{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:10px 12px;font-size:13px;font-weight:600;color:var(--text-strong);border-bottom:1px solid var(--border);flex:none}.run-table__frame{flex:1;min-height:0;display:flex;padding:8px}.run-table__toggle,.run-board__table-toggle{display:inline-flex;align-items:center;gap:4px;border:1px solid var(--border);background:transparent;color:var(--text-muted);border-radius:6px;padding:2px 8px;font-size:12px;cursor:pointer;white-space:nowrap}.run-table__toggle:hover,.run-board__table-toggle:hover{color:var(--text-strong);border-color:var(--border-strong)}.run-board__table-toggle{margin-left:auto}.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__agents-link{display:inline-flex;align-items:center;gap:4px;border:1px solid var(--border);background:transparent;color:var(--text-muted);border-radius:6px;padding:2px 8px;font-size:12px;font-weight:500;text-decoration:none;white-space:nowrap}.run-board__agents-link:hover{color:var(--text-strong);border-color:var(--border-strong)}.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-mode-picker{display:flex;align-items:center;gap:8px;width:100%;margin-bottom:8px;font-size:11.5px;color:var(--text-soft)}.run-mode-picker__label{flex:none}.run-mode-picker select{flex:1;min-width:0;padding:5px 8px;font-size:11.5px;color:var(--text);background:var(--bg-panel);border:1px solid var(--border);border-radius:6px}.run-mode-picker select:disabled{opacity:.5}.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)}.run-flow__trace{display:inline-flex;align-items:center;gap:5px;margin-top:8px;padding:3px 9px;border:1px solid var(--border);border-radius:999px;background:transparent;font-size:12px;font-weight:500;color:var(--text-muted);cursor:pointer}.run-flow__trace:hover{color:var(--text-strong);border-color:var(--border-strong)}.run-flow__trace.is-active{color:var(--accent);border-color:var(--accent)}.run-flow__trace-dot{width:6px;height:6px;border-radius:50%;background:var(--accent);animation:run-trace-pulse 1.2s ease-in-out infinite}@keyframes run-trace-pulse{50%{opacity:.25}}@media (prefers-reduced-motion: reduce){.run-flow__trace-dot{animation:none}}.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;width:auto;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}}.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__warn{display:inline-flex;align-items:flex-start;gap:5px;font-size:12px;color:var(--amber);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)}.console-joingroup{position:fixed;right:24px;bottom:20px;z-index:60;display:inline-flex;align-items:center;gap:7px;padding:9px 16px;border:1px solid var(--accent);border-radius:var(--radius-pill);background:var(--accent);color:#fff;font-size:13px;font-weight:600;text-decoration:none;box-shadow:var(--shadow-md);transition:background var(--dur-quick) var(--ease-out),border-color var(--dur-quick) var(--ease-out)}.console-joingroup:hover{background:var(--accent-hover);border-color:var(--accent-hover)}