@tea-agent/loop-agent 0.33.7-beta.0 → 0.34.0

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 (83) hide show
  1. package/CHANGELOG.md +38 -17
  2. package/dist/application/task-lifecycle/advance.js +254 -4
  3. package/dist/application/task-lifecycle/gates.js +50 -0
  4. package/dist/application/task-lifecycle/observe.js +11 -2
  5. package/dist/commands/init-upgrade.js +32 -1
  6. package/dist/commands/init.js +94 -3
  7. package/dist/executors/shell-executor.js +4 -91
  8. package/dist/executors/shell-write-guard.js +26 -8
  9. package/dist/shared/operator/capabilities.js +72 -42
  10. package/dist/shared/resilient-git.js +133 -0
  11. package/dist/task/source-prepare/artifact-meta.js +137 -0
  12. package/dist/task/source-prepare/index.js +2 -0
  13. package/dist/task/source-prepare/parse-intent.js +58 -10
  14. package/dist/task/source-prepare/prepare.js +180 -16
  15. package/dist/task/source-prepare/reference-integrity.js +18 -2
  16. package/dist/task/source-prepare/semantic-intake.js +404 -0
  17. package/dist/worker/console/app-data.js +2 -0
  18. package/dist/worker/console/chat/chat-event-store.js +190 -25
  19. package/dist/worker/console/chat/model-resolver.js +17 -0
  20. package/dist/worker/console/chat/pi-console-config.js +250 -32
  21. package/dist/worker/console/chat/pi-runtime.js +1007 -188
  22. package/dist/worker/console/chat/resource-loader.js +5 -4
  23. package/dist/worker/console/chat/routes.js +495 -157
  24. package/dist/worker/console/chat/runtime-context.js +48 -12
  25. package/dist/worker/console/chat/runtime-selection.js +59 -0
  26. package/dist/worker/console/chat/session-store.js +39 -0
  27. package/dist/worker/console/chat/shortcuts.js +1 -0
  28. package/dist/worker/console/chat/tool-adapter.js +9 -3
  29. package/dist/worker/console/chat/tools.js +5 -1
  30. package/dist/worker/console/dag-execution-receipt.js +380 -0
  31. package/dist/worker/console/operator-actions.js +559 -68
  32. package/dist/worker/console/server.js +8 -15
  33. package/dist/worker/console/static/assets/index-BQkhJpV8.css +1 -0
  34. package/dist/worker/console/static/assets/index-CMHovlqG.js +32 -0
  35. package/dist/worker/console/static/index.html +2 -2
  36. package/dist/worker/console/static-src/operator-chat/chat-sse-events.js +45 -8
  37. package/dist/worker/console/static-src/operator-chat/landing-density.js +23 -0
  38. package/dist/worker/console/static-src/operator-chat/refs.js +9 -0
  39. package/dist/worker/console/static-src/operator-chat/runtime-snapshot-store.js +257 -0
  40. package/dist/worker/console/static-src/operator-chat/session-title-watcher.js +128 -0
  41. package/dist/worker/console/static-src/operator-chat/sidebar-split.js +90 -0
  42. package/dist/worker/console/static-src/operator-chat/spatial-overlay.js +37 -0
  43. package/dist/worker/console/static-src/operator-chat/useChatSessions.js +125 -22
  44. package/dist/worker/console/static-src/operator-chat/useChatStream.js +215 -184
  45. package/dist/worker/console/static-src/operator-chat/useChatThread.js +49 -5
  46. package/dist/worker/console/static-src/operator-chat/useComposer.js +17 -0
  47. package/dist/worker/console/static-src/operator-chat/useOverlayFocus.js +84 -0
  48. package/dist/worker/console/static-src/operator-chat/useRuntimeControls.js +225 -74
  49. package/dist/worker/console/static-src/operator-chat/useRuntimeSnapshot.js +196 -0
  50. package/dist/worker/console/static-src/operator-chat/useWorkspaceLayout.js +58 -0
  51. package/dist/worker/console/static-src/operator-chat/workspace-layout-mode.js +31 -0
  52. package/dist/worker/delivery/final-verification.js +13 -5
  53. package/dist/worker/delivery/package.js +31 -19
  54. package/dist/worker/delivery/verification-bundle.js +6 -4
  55. package/dist/worker/observe/static/operator-chrome.css +5 -2
  56. package/dist/worker/observe/static/operator-chrome.js +6 -1
  57. package/dist/worker/observe/static/styles.css +39 -9
  58. package/dist/workflows/dag/backend-test-case-coverage-analysis.js +33 -462
  59. package/dist/workflows/dag/backend-test-case-manifest.js +0 -4
  60. package/dist/workflows/dag/backend-test-markdown-workflow.js +1 -25
  61. package/dist/workflows/dag/backend-test-module-stem.js +0 -5
  62. package/dist/workflows/dag/backend-test-pytest-collection.js +24 -345
  63. package/dist/workflows/dag/backend-test-scenario-param.js +82 -269
  64. package/dist/workflows/dag/backend-test-writer-completeness.js +16 -47
  65. package/dist/workflows/dag/dynamic-runtime/map.js +8 -24
  66. package/dist/workflows/dag/frontend-worktree-diff.js +12 -27
  67. package/dist/workflows/dag/init-hybrid.js +34 -46
  68. package/dist/workflows/dag/types.js +0 -7
  69. package/dist/workflows/dag/workspace-checkpoint.js +8 -27
  70. package/docs/templates/backend-test-dag.json +29 -32
  71. package/harness.json +1 -1
  72. package/package.json +1 -1
  73. package/skills/local-jacoco-coverage/SKILL.md +281 -0
  74. package/skills/local-jacoco-coverage/references/requirement-to-source-mapping.md +85 -0
  75. package/skills/local-jacoco-coverage/references/runtime-alignment.md +106 -0
  76. package/skills/local-jacoco-coverage/scripts/run-coverage-analysis.sh +148 -0
  77. package/skills/local-jacoco-coverage/scripts/start-jacoco-agent.sh +110 -0
  78. package/skills/loop-agent/references/command-reference.md +3 -1
  79. package/skills/loop-agent/references/source-and-plan-practice.md +13 -0
  80. package/skills/loop-agent/references/task-workflow.md +4 -0
  81. package/dist/worker/console/chat/instruction-skills.js +0 -217
  82. package/dist/worker/console/static/assets/index-CnUXAqxG.css +0 -1
  83. package/dist/worker/console/static/assets/index-CteJFFL2.js +0 -29
@@ -0,0 +1,110 @@
1
+ #!/usr/bin/env bash
2
+ # start-jacoco-agent.sh
3
+ # 在本地/测试环境启动 Java 后端服务并挂载 JaCoCo agent(tcpserver 模式)。
4
+ # 本脚本只做三件事:校验 --agent-jar 存在、拼装 -javaagent 参数、把 -- 之后的原始启动命令交给 exec。
5
+ # 它不修改启动命令的语义,只前置 agent 参数。
6
+ #
7
+ # 用法:
8
+ # bash start-jacoco-agent.sh --agent-jar <path> [--includes <pkg>] [--port <n>]
9
+ # [--address <ip>] [--append <bool>] -- <启动命令...>
10
+ # 示例:
11
+ # bash start-jacoco-agent.sh --agent-jar /opt/jacoco/jacocoagent.jar \
12
+ # --includes "com.yourcompany.*" --port 6300 -- mvn spring-boot:run
13
+ # bash start-jacoco-agent.sh --agent-jar /opt/jacoco/jacocoagent.jar \
14
+ # --includes "com.yourcompany.*" -- java -jar your-app.jar
15
+ #
16
+ # 退出码:
17
+ # 0 服务正常退出
18
+ # 2 参数错误
19
+ # 3 --agent-jar 不存在
20
+ # 4 未提供 -- 之后的启动命令
21
+ # * 继承被启动命令的退出码
22
+
23
+ set -euo pipefail
24
+
25
+ log() { printf '[start-jacoco-agent] %s\n' "$*" >&2; }
26
+ die() { printf '[start-jacoco-agent] ERROR: %s\n' "$*" >&2; exit "${2:-1}"; }
27
+
28
+ AGENT_JAR=""
29
+ INCLUDES="*"
30
+ PORT="6300"
31
+ ADDRESS="0.0.0.0"
32
+ APPEND="false"
33
+ SEPARATOR_IDX=-1
34
+
35
+ args=("$@")
36
+ for ((i = 0; i < ${#args[@]}; i++)); do
37
+ case "${args[$i]}" in
38
+ --agent-jar)
39
+ ((i + 1 < ${#args[@]})) || die "--agent-jar 需要一个值" 2
40
+ AGENT_JAR="${args[$((i + 1))]}"
41
+ ((i++))
42
+ ;;
43
+ --includes)
44
+ ((i + 1 < ${#args[@]})) || die "--includes 需要一个值" 2
45
+ INCLUDES="${args[$((i + 1))]}"
46
+ ((i++))
47
+ ;;
48
+ --port)
49
+ ((i + 1 < ${#args[@]})) || die "--port 需要一个值" 2
50
+ PORT="${args[$((i + 1))]}"
51
+ ((i++))
52
+ ;;
53
+ --address)
54
+ ((i + 1 < ${#args[@]})) || die "--address 需要一个值" 2
55
+ ADDRESS="${args[$((i + 1))]}"
56
+ ((i++))
57
+ ;;
58
+ --append)
59
+ ((i + 1 < ${#args[@]})) || die "--append 需要一个值" 2
60
+ APPEND="${args[$((i + 1))]}"
61
+ ((i++))
62
+ ;;
63
+ --)
64
+ SEPARATOR_IDX=$((i + 1))
65
+ break
66
+ ;;
67
+ --help|-h)
68
+ sed -n '2,30p' "$0"
69
+ exit 0
70
+ ;;
71
+ *)
72
+ die "未知参数: ${args[$i]}(启动命令请放在 -- 之后)" 2
73
+ ;;
74
+ esac
75
+ done
76
+
77
+ [[ -n "$AGENT_JAR" ]] || die "缺少必填 --agent-jar <path>" 2
78
+ [[ -f "$AGENT_JAR" ]] || die "--agent-jar 不存在: $AGENT_JAR" 3
79
+ [[ "$SEPARATOR_IDX" -ge 0 && "$SEPARATOR_IDX" -lt ${#args[@]} ]] || die "未提供 -- 之后的启动命令" 4
80
+
81
+ # 拼装 -javaagent 参数(JaCoCo tcpserver 模式)
82
+ AGENT_OPTS="output=tcpserver,address=${ADDRESS},port=${PORT},includes=${INCLUDES},append=${APPEND}"
83
+ JAVA_AGENT="-javaagent:${AGENT_JAR}=${AGENT_OPTS}"
84
+
85
+ # 取出 -- 之后的启动命令
86
+ launch=("${args[@]:$SEPARATOR_IDX}")
87
+ [[ ${#launch[@]} -gt 0 ]] || die "-- 之后没有启动命令" 4
88
+
89
+ log "agent jar : $AGENT_JAR"
90
+ log "agent options : $AGENT_OPTS"
91
+ log "launch command: ${launch[*]}"
92
+ log ""
93
+ log "⚠️ JaCoCo agent 仅限测试环境;生产环境严禁挂载。"
94
+ log "⚠️ address=$ADDRESS 意味着任何能访问 $PORT 的机器都能 dump,请用安全组限制。"
95
+ log ""
96
+
97
+ # 若启动命令是 java*,直接前置 -javaagent;
98
+ # 若是 mvn*,转成 -Dspring-boot.run.jvmArguments(Spring Boot Maven 插件约定);
99
+ # 其它命令:前置 JAVA_TOOL_OPTIONS(最通用,但无法覆盖命令里已有的 -javaagent)。
100
+ case "${launch[0]}" in
101
+ java)
102
+ exec "${launch[0]}" "$JAVA_AGENT" "${launch[@]:1}"
103
+ ;;
104
+ mvn)
105
+ exec "${launch[0]}" "${launch[@]:1}" "-Dspring-boot.run.jvmArguments=$JAVA_AGENT"
106
+ ;;
107
+ *)
108
+ JAVA_TOOL_OPTIONS="$JAVA_AGENT" exec "${launch[@]}"
109
+ ;;
110
+ esac
@@ -224,7 +224,9 @@ loop-agent task advance <task-id> "标题" \
224
224
  --json
225
225
  ```
226
226
 
227
- 默认无 LLM 写 source;工程边界用 flags 显式给出。不要让 AI 直接改写 `source/references/*`。高级用户仍可手工编辑后 `task advance --from-draft`。
227
+ 默认无 LLM 写 source;工程边界用 flags 显式给出。不要让 AI 直接改写 `source/references/*`。
228
+ Product Requirement V3/V4(`product-requirement.md`)由确定性解析消费;`product-analysis` / `requirement-clarification` 不能单独作为可执行 PRD。
229
+ intake 失败时不要在原 PRD 目录生成兼容 md/json;`--from-draft` **仅**人工 reviewed draft / managed 恢复 / 调试,不是 `EMPTY_ACCEPTANCE` 默认恢复路径。
228
230
 
229
231
  ### Feature-study workflow(参考代码 → 轻量实现)
230
232
 
@@ -41,6 +41,19 @@ Task 目录布局:`task-workflow.md`。
41
41
  - 把用户 PRD **整篇改写**进 `需求.md` 后删掉原文路径。
42
42
  - AI 直接 edit `source/references/*`。
43
43
  - 只把 PRD 路径写在聊天里,不落盘到 task 容器。
44
+ - 把 `product-analysis.md` 当可执行 PRD,或把 analysis/clarification 改写成假 AC 以通过 prepare。
45
+ - intake 失败后在原 PRD 目录生成「兼容格式」Markdown / `reviewed-draft.json`,再用 `--from-draft` 绕过(默认禁止)。
46
+ - 把 `--from-draft` 当作 `EMPTY_ACCEPTANCE` 的自动恢复手段。
47
+
48
+ ### Product Analysis 套件
49
+
50
+ | 文件 | role | 用途 |
51
+ |---|---|---|
52
+ | `product-requirement.md` | `requirement` | **唯一**可执行需求事实源(complete 后才进 DAG) |
53
+ | `product-analysis.md` | `analysis` | 分析证据;**不能**单独作为 requirement |
54
+ | `requirement-clarification.md` | `clarification` | 决策追溯;**不能**单独作为 requirement |
55
+
56
+ `task advance --prd` 可多次传入;未写 `--role` 时按路径/frontmatter 推断。intake 未完成时 lifecycle 为 `intake-incomplete`(PRD 已归档,DAG 未生成)。
44
57
 
45
58
  ### 推荐顺序(有 PRD 时)
46
59
 
@@ -37,6 +37,10 @@ loop-agent task status <task-id> --json
37
37
  ```
38
38
 
39
39
  - 用户原始 PRD 用 `task advance --prd <prd>` 归档到 `source/references/`,禁止 AI 改写。**有文件就归档**。
40
+ - Product Analysis 套件职责:`product-requirement.md` 是唯一可执行需求事实源;`product-analysis.md` / `requirement-clarification.md` 仅引用。未显式 `--role` 时按文件名/frontmatter 推断(analysis / clarification / requirement)。
41
+ - 遇到 `PRODUCT_ANALYSIS_NOT_EXECUTABLE` / `PRODUCT_REQUIREMENT_PENDING` / `EMPTY_ACCEPTANCE`:**禁止**改写原始产物,**禁止**在原 PRD 目录生成兼容 Markdown 或 `reviewed-draft.json` 自救;应换正确 requirement 文档或补真实验收标准后重试。
42
+ - `--from-draft` 仅用于人工 reviewed draft / managed 恢复 / 调试,不是 intake 失败的默认恢复路径。
43
+ - 确定性解析失败且缺口为结构性时,`task advance` 可自动做**一次** Semantic Intake(只读 Pi → `artifacts/intake/semantic-draft.json` → prepare);analysis/pending/真缺决策不会调用。可用 `LOOP_AGENT_SEMANTIC_INTAKE=0` 关闭。禁止在原 PRD 目录写 sidecar。
40
44
  - 默认用 `task advance`(带 `--allowed-path` / `--verify`)投影 `需求.md` / `执行约束.md` 与 managed paths;**不要**默认让 LLM/主会话手写两 source。
41
45
  - 无独立 PRD 的微小任务可用 `task advance --from-text ...` escape hatch(见 `source-and-plan-practice.md`)。
42
46
  - 若 `ai_workspace/loop-agent/` 已有权威 plan/spec/PRD,优先 `task advance --prd` 归档并派生薄契约;避免把长 PRD 直接改写成唯一 source。
@@ -1,217 +0,0 @@
1
- /**
2
- * Operator Chat — instruction skills whitelist (design §7.5 / plan D1).
3
- *
4
- * Hard rules (plan D1):
5
- * - skills are READ-ONLY text context injected into the Chat system prompt;
6
- * - skills are NEVER registered as executable tools;
7
- * - the whitelist is a COMPILE-TIME constant (no runtime dir scan, no env override);
8
- * - arbitrary pi extension / package tool / user-level ~/.pi/agent skill is
9
- * never discovered or loaded (V12);
10
- * - project `.agents/skills/` (init projection) is NOT injected (prevents
11
- * target-repo injecting write instructions).
12
- *
13
- * Only the loop-agent repo's own audited skills are eligible. Workflow-specific
14
- * skills are conditional on taskKind/workflow and loaded on demand (not in MVP
15
- * operator-context default set).
16
- */
17
- import { readFile } from "node:fs/promises";
18
- import path from "node:path";
19
- /**
20
- * Operator-context instruction skills (plan D1, "operator-context 允许").
21
- * These are read-only methodology skills. Loaded as text context for every
22
- * Chat session by default.
23
- *
24
- * MUST stay a compile-time constant. Adding a skill requires an ADR / plan note.
25
- */
26
- export const OPERATOR_CHAT_ALLOWED_INSTRUCTION_SKILLS = Object.freeze([
27
- "grill-me",
28
- "systematic-debugging",
29
- "code-review-core",
30
- "codebase-scout",
31
- "verification-before-completion",
32
- "requesting-code-review",
33
- "analyze-product-requirements",
34
- "analyze-product-dependencies",
35
- "using-git-worktrees",
36
- ]);
37
- /**
38
- * Meta / governance skills that must NEVER be injected into Chat context
39
- * (plan D1 "元 / 治理 skill"). Injecting these would let Chat rewrite its own
40
- * governance. Listed explicitly so accidental allowlist edits are caught.
41
- */
42
- export const OPERATOR_CHAT_DENIED_INSTRUCTION_SKILLS = Object.freeze([
43
- "loop-agent",
44
- "agent-worker",
45
- "init-capability-evolution",
46
- "ai-engineering-context",
47
- "grill-with-docs",
48
- ]);
49
- /**
50
- * Workflow-specific skills (plan D1 "workflow-specific 允许(条件)").
51
- * Only injected when the corresponding taskKind / workflow is active.
52
- * NOT loaded by default in MVP Chat.
53
- */
54
- export const OPERATOR_CHAT_WORKFLOW_CONDITIONAL_SKILLS = Object.freeze([
55
- "frontend-implementation",
56
- "frontend-review",
57
- "frontend-verification",
58
- "frontend-design-review",
59
- "test-driven-development",
60
- "webapp-testing",
61
- "playwright-cli",
62
- "playwright-cli-case-generator",
63
- "browser-tools",
64
- ]);
65
- const ALLOWED = new Set(OPERATOR_CHAT_ALLOWED_INSTRUCTION_SKILLS.map((s) => s.toLowerCase()));
66
- const DENIED = new Set(OPERATOR_CHAT_DENIED_INSTRUCTION_SKILLS.map((s) => s.toLowerCase()));
67
- const CONDITIONAL = new Set(OPERATOR_CHAT_WORKFLOW_CONDITIONAL_SKILLS.map((s) => s.toLowerCase()));
68
- export function isOperatorChatInstructionSkillAllowed(name) {
69
- return ALLOWED.has(name.trim().toLowerCase());
70
- }
71
- export function isOperatorChatInstructionSkillDenied(name) {
72
- return DENIED.has(name.trim().toLowerCase());
73
- }
74
- export function isOperatorChatInstructionSkillConditional(name) {
75
- return CONDITIONAL.has(name.trim().toLowerCase());
76
- }
77
- export function classifyInstructionSkill(name, options) {
78
- const n = name.trim().toLowerCase();
79
- if (DENIED.has(n)) {
80
- return { ok: false, reason: "denied-governance", name };
81
- }
82
- if (ALLOWED.has(n)) {
83
- return { ok: true, kind: "operator-context", name };
84
- }
85
- if (CONDITIONAL.has(n)) {
86
- const active = options?.activeWorkflowSkills ?? [];
87
- const activeLower = new Set(active.map((s) => s.toLowerCase()));
88
- if (activeLower.has(n)) {
89
- // Conditional skill is allowed only when explicitly activated by workflow.
90
- // For MVP, conditional skills are not auto-injected; callers must opt in.
91
- return { ok: false, reason: "conditional-not-active", name };
92
- }
93
- return { ok: false, reason: "conditional-not-active", name };
94
- }
95
- return { ok: false, reason: "unknown", name };
96
- }
97
- /**
98
- * Parse a SKILL.md frontmatter description (first `description:` line) and
99
- * return the body text (frontmatter stripped). Tolerant of missing frontmatter.
100
- */
101
- export function parseSkillFrontmatter(raw) {
102
- let description = "";
103
- let bodyText = raw;
104
- const hasFrontmatter = raw.trimStart().startsWith("---");
105
- if (hasFrontmatter) {
106
- const lines = raw.split(/\r?\n/);
107
- // find closing ---
108
- let closeIdx = -1;
109
- for (let i = 1; i < lines.length; i++) {
110
- if (lines[i].trim() === "---") {
111
- closeIdx = i;
112
- break;
113
- }
114
- }
115
- if (closeIdx > 0) {
116
- const fm = lines.slice(1, closeIdx).join("\n");
117
- bodyText = lines.slice(closeIdx + 1).join("\n").trim();
118
- const descMatch = fm.match(/^description:\s*(.+)$/m);
119
- if (descMatch) {
120
- description = descMatch[1].trim().replace(/^["']|["']$/g, "");
121
- }
122
- }
123
- }
124
- else {
125
- bodyText = raw.trim();
126
- }
127
- return { description, bodyText };
128
- }
129
- /**
130
- * Load the operator-context instruction skills from the loop-agent repo's own
131
- * `skills/` directory and return their text bodies for system-prompt injection.
132
- *
133
- * Security: only names in OPERATOR_CHAT_ALLOWED_INSTRUCTION_SKILLS are read;
134
- * any other path is rejected before filesystem access (safe-side).
135
- *
136
- * @param skillsDir absolute path to the loop-agent repo `skills/` directory
137
- * (source repo / npm pack asset, NOT target project `.agents/skills/`).
138
- * @param names override list (tests); defaults to the full allowlist.
139
- */
140
- export async function loadOperatorChatInstructionSkills(skillsDir, names) {
141
- const selected = names ?? OPERATOR_CHAT_ALLOWED_INSTRUCTION_SKILLS;
142
- const loaded = [];
143
- const failures = [];
144
- const skipped = [];
145
- for (const rawName of selected) {
146
- const name = rawName.trim();
147
- if (!isOperatorChatInstructionSkillAllowed(name)) {
148
- skipped.push(name);
149
- continue;
150
- }
151
- // Defense in depth: reject path traversal / governance skills even if
152
- // an attacker managed to mutate the allowlist at runtime.
153
- if (isOperatorChatInstructionSkillDenied(name)) {
154
- skipped.push(name);
155
- continue;
156
- }
157
- const skillPath = path.join(skillsDir, name, "SKILL.md");
158
- const resolved = path.resolve(skillPath);
159
- const resolvedSkillsDir = path.resolve(skillsDir);
160
- if (!resolved.startsWith(resolvedSkillsDir + path.sep)) {
161
- failures.push({
162
- name,
163
- message: "path escapes skills directory",
164
- });
165
- continue;
166
- }
167
- try {
168
- const raw = await readFile(resolved, "utf8");
169
- const { description, bodyText } = parseSkillFrontmatter(raw);
170
- loaded.push({
171
- name,
172
- description,
173
- bodyText,
174
- charCount: bodyText.length,
175
- });
176
- }
177
- catch (error) {
178
- failures.push({
179
- name,
180
- message: error instanceof Error ? error.message : String(error),
181
- });
182
- }
183
- }
184
- return { loaded, failures, skipped };
185
- }
186
- /** Hard cap on total injected instruction-skill chars (token budget guard). */
187
- export const OPERATOR_CHAT_INSTRUCTION_CHAR_BUDGET = 24_000;
188
- /**
189
- * Compose the system-prompt fragment listing loaded instruction skills.
190
- * Each skill is rendered as a bounded text block. If total chars exceed the
191
- * budget, later skills are truncated (operator-context set is small enough
192
- * that truncation should not trigger in practice, but the cap is enforced).
193
- */
194
- export function composeInstructionSkillsPrompt(skills, budget = OPERATOR_CHAT_INSTRUCTION_CHAR_BUDGET) {
195
- if (skills.length === 0)
196
- return "";
197
- const lines = [
198
- "## Operator methodology context (read-only instruction skills)",
199
- "",
200
- "These skills are READ-ONLY context. You may reference their methodology when reasoning, but you CANNOT execute them. All actions must go through the registered operator tools.",
201
- "",
202
- ];
203
- let used = 0;
204
- for (const skill of skills) {
205
- const header = `\n### ${skill.name}${skill.description ? ` — ${skill.description}` : ""}\n`;
206
- const remaining = budget - used - header.length;
207
- if (remaining <= 0) {
208
- lines.push(`_[${skill.name}: omitted, char budget exhausted]_`);
209
- break;
210
- }
211
- const slice = skill.bodyText.slice(0, Math.max(0, remaining));
212
- lines.push(header);
213
- lines.push(slice);
214
- used += header.length + slice.length;
215
- }
216
- return lines.join("\n");
217
- }
@@ -1 +0,0 @@
1
- :root{--canvas: #f7f7f4;--canvas-soft: #fafaf7;--surface: #ffffff;--surface-muted: #f0efe9;--ink: #26251e;--body: #5a5852;--muted: #807d72;--muted-soft: #a09c92;--hairline: #e6e5e0;--hairline-strong: #cfcdc4;--orange: #f54e00;--orange-active: #d04200;--orange-soft: color-mix(in srgb, var(--orange) 12%, white);--blue: #3f6ea4;--green: #1f8a65;--amber: #a66a00;--red: #c72d53;--peach: #f1d8cb;--mint: #d8ead5;--space-1: 4px;--space-2: 8px;--space-3: 12px;--space-4: 16px;--space-5: 20px;--space-6: 24px;--space-8: 32px;--space-12: 48px;--radius-sm: 6px;--radius-md: 8px;--radius-lg: 12px;--radius-xl: 16px;--radius-pill: 999px;--transition-fast: .16s ease;--transition-base: .22s ease;--ease-out: cubic-bezier(.22, 1, .36, 1);--shadow-sm: 0 1px 2px rgb(38 37 30 / 5%);--shadow-panel: 0 1px 2px rgb(38 37 30 / 4%), 0 8px 24px rgb(38 37 30 / 3%);--shadow-soft: 0 10px 30px rgb(38 37 30 / 6%);--shadow-lg: 0 16px 44px rgb(38 37 30 / 10%);--shell-max: 1680px;--text-xs: 11px;--text-sm: 12px;--text-md: 13px;--text-base: 14px;--text-lg: 16px;--text-xl: 20px;--text-2xl: 26px;--font-mono: "JetBrains Mono", "SFMono-Regular", Consolas, "Segoe UI Mono", monospace;--bg: var(--canvas);--border: var(--hairline);--accent: var(--orange);--accent-active: var(--orange-active);--danger: var(--red);--success: var(--green);--warning: var(--amber);--info: var(--blue);--text-muted: var(--muted);--surface-raised: var(--surface);--surface-hover: var(--surface-muted);--surface-sunken: var(--canvas-soft);--oc-tree-guide: 14px;color-scheme:light;font-family:Segoe UI,PingFang SC,Hiragino Sans GB,Noto Sans SC,system-ui,-apple-system,sans-serif;line-height:1.5}*{box-sizing:border-box}html{background:radial-gradient(1200px 480px at 8% -10%,rgb(241 216 203 / 45%),transparent 55%),radial-gradient(900px 420px at 100% 0%,rgb(216 234 213 / 35%),transparent 50%),var(--canvas);min-height:100%}body{margin:0;min-height:100vh;min-width:320px;background:transparent;color:var(--ink);font-size:14px}button,input,select,textarea{font:inherit}a{color:inherit}::selection{background:color-mix(in srgb,var(--orange) 18%,white)}.oc-messages,.oc-session-scroll,.oc-tree-scroll,.oc-process-timeline,.oc-tools-catalog-body,.oc-runtime-context-body,.inspect-split-panel{scrollbar-width:thin;scrollbar-color:var(--hairline-strong) transparent}.oc-messages::-webkit-scrollbar,.oc-session-scroll::-webkit-scrollbar,.oc-tree-scroll::-webkit-scrollbar,.oc-process-timeline::-webkit-scrollbar,.oc-tools-catalog-body::-webkit-scrollbar,.oc-runtime-context-body::-webkit-scrollbar,.inspect-split-panel::-webkit-scrollbar{width:8px;height:8px}.oc-messages::-webkit-scrollbar-thumb,.oc-session-scroll::-webkit-scrollbar-thumb,.oc-tree-scroll::-webkit-scrollbar-thumb,.oc-process-timeline::-webkit-scrollbar-thumb,.oc-tools-catalog-body::-webkit-scrollbar-thumb,.oc-runtime-context-body::-webkit-scrollbar-thumb,.inspect-split-panel::-webkit-scrollbar-thumb{background:var(--hairline-strong);border-radius:999px;border:2px solid transparent;background-clip:content-box}.oc-messages::-webkit-scrollbar-track,.oc-session-scroll::-webkit-scrollbar-track,.oc-tree-scroll::-webkit-scrollbar-track,.oc-process-timeline::-webkit-scrollbar-track,.oc-tools-catalog-body::-webkit-scrollbar-track,.oc-runtime-context-body::-webkit-scrollbar-track,.inspect-split-panel::-webkit-scrollbar-track{background:transparent}code,.cmd,.kv dd code{font-family:var(--font-mono)}.console-app{display:flex;flex-direction:column;min-height:100dvh}html:has(.console-app.is-chat-focus),body:has(.console-app.is-chat-focus){height:100%;overflow:hidden}.console-app.is-chat-focus{height:100dvh;max-height:100dvh;overflow:hidden}.console-shell{flex:1 1 auto;display:flex;flex-direction:column;min-height:0;width:min(100% - 48px,var(--shell-max));margin:0 auto;padding:var(--space-5) 0 var(--space-12, 48px)}.flash{display:flex;gap:var(--space-3);align-items:flex-start;margin:0 0 var(--space-4);padding:12px 16px;border:1px solid var(--hairline);border-left:3px solid var(--hairline-strong);border-radius:var(--radius-md);background:var(--surface);box-shadow:var(--shadow-panel);animation:flash-in .22s var(--ease-out)}.flash-error{border-color:color-mix(in srgb,var(--red) 35%,var(--hairline));border-left-color:var(--red);background:color-mix(in srgb,var(--red) 6%,var(--surface));color:var(--red)}.flash-info{border-color:color-mix(in srgb,var(--blue) 30%,var(--hairline));border-left-color:var(--blue);background:color-mix(in srgb,var(--blue) 6%,var(--surface));color:var(--body)}.flash-label{flex:0 0 auto;min-width:3.5rem;font-size:var(--text-xs);font-weight:700;letter-spacing:.04em;text-transform:uppercase;padding-top:1px}.flash-body{margin:0;overflow-wrap:anywhere;font-size:var(--text-md);line-height:1.55}.muted{color:var(--muted)}.console-main{display:grid;gap:var(--space-4)}.console-main--fill{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;gap:var(--space-3)}.console-shell.is-chat-focus{flex:1 1 auto;min-height:0;overflow:hidden;padding-bottom:var(--space-3)}.console-shell.is-chat-focus .console-main--fill{flex:1 1 auto;min-height:0;overflow:hidden}.panel--chat{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;padding:var(--space-3);overflow:hidden}.panel--chat .oc-shell{flex:1 1 auto;min-height:0;height:auto;overflow:hidden}.console-shell.is-chat-focus .panel--chat{padding:var(--space-2)}.console-shell.is-chat-focus .panel--chat .oc-shell{min-height:0;gap:var(--space-2);overflow:hidden}.inspect-split-panel{position:fixed;z-index:50;top:16px;right:16px;bottom:16px;width:min(420px,calc(100vw - 32px));display:grid;align-content:start;gap:var(--space-4);padding:var(--space-5);overflow:auto;border:1px solid var(--hairline);border-radius:var(--radius-lg);background:var(--surface);box-shadow:var(--shadow-soft)}.inspect-split-nodes{display:grid;gap:6px;margin:0;padding:0;list-style:none;max-height:220px;overflow:auto}.inspect-split-nodes li{display:grid;grid-template-columns:1fr auto;gap:var(--space-2);align-items:center;padding:6px 8px;border:1px solid var(--hairline);border-radius:var(--radius-sm);background:var(--canvas-soft);font-size:12px}.inspect-split-nodes li.is-active{border-color:var(--orange);background:var(--orange-soft)}.inspect-split-nodes code{color:var(--muted);font-size:11px}.inspect-split-header{display:flex;align-items:start;justify-content:space-between;gap:var(--space-3)}.inspect-split-header h2,.inspect-split-panel h3{margin:0}.inspect-split-kicker,.inspect-split-id{margin:0;color:var(--muted);font-size:12px}.inspect-split-facts{display:grid;gap:var(--space-2);margin:0}.inspect-split-facts div{display:grid;grid-template-columns:7rem 1fr;gap:var(--space-2);padding-bottom:var(--space-2);border-bottom:1px solid var(--hairline)}.inspect-split-facts dt{color:var(--muted)}.inspect-split-facts dd{margin:0;overflow-wrap:anywhere}.inspect-split-events{display:grid;gap:8px;margin:0;padding-left:18px;color:var(--body);font-size:12px}.panel{min-width:0;border:1px solid var(--hairline);background:color-mix(in srgb,var(--surface) 96%,transparent);border-radius:var(--radius-lg);padding:var(--space-6);box-shadow:var(--shadow-panel)}.panel h2{margin:0 0 var(--space-2);color:var(--ink);font-size:var(--text-xl);font-weight:700;letter-spacing:-.02em}.panel-lead{margin:0 0 var(--space-5);color:var(--muted);font-size:var(--text-md);line-height:1.55}.panel h3{margin:0 0 var(--space-3);color:var(--ink);font-size:15px;font-weight:700;letter-spacing:-.01em}.empty-state{border:1px dashed var(--hairline-strong);border-radius:var(--radius-lg);padding:var(--space-8) var(--space-6);background:var(--canvas-soft);color:var(--body);text-align:center}.empty-state .cta-row{justify-content:center}.empty-title{margin:0 0 var(--space-2);color:var(--ink);font-size:var(--text-lg);font-weight:700;letter-spacing:-.01em}.empty-state .muted{max-width:52ch;margin-left:auto;margin-right:auto}.checklist{margin:0 0 var(--space-4);padding:var(--space-4);border:1px solid var(--hairline);border-radius:var(--radius-md);background:var(--canvas-soft);list-style:none;color:var(--body)}.checklist li{position:relative;padding:6px 0 6px 22px}.checklist li:before{content:"";position:absolute;left:0;top:12px;width:8px;height:8px;border-radius:50%;background:var(--orange);opacity:.75}.kv{display:grid;gap:var(--space-1);margin:0}.kv div{display:grid;grid-template-columns:9rem 1fr;gap:var(--space-3);padding:10px 0;border-bottom:1px solid var(--hairline)}.kv div:last-child{border-bottom:none}.kv dt{color:var(--muted);font-size:var(--text-sm);font-weight:600}.kv dd{margin:0;color:var(--ink);overflow-wrap:anywhere;font-variant-numeric:tabular-nums}code{font-size:.85rem;color:var(--ink)}.cmd{display:block;width:100%;margin:0;padding:var(--space-3) var(--space-4);border:1px solid var(--hairline);border-radius:var(--radius-md);background:var(--canvas-soft);color:var(--ink);font-size:var(--text-sm);line-height:1.55;overflow-x:auto;white-space:pre-wrap;word-break:break-word;max-height:280px}.external-link{color:var(--orange);text-decoration:none;font-weight:600}.external-link:hover{text-decoration:underline}.error{color:var(--red)}.wizard-steps{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:var(--space-2);list-style:none;padding:0;margin:0 0 var(--space-5)}.wizard-steps li{position:relative;min-height:54px;display:grid;align-content:center;gap:3px;border:1px solid var(--hairline);border-radius:var(--radius-md);padding:9px 12px;background:var(--canvas-soft);color:var(--muted);font-size:var(--text-sm);font-weight:600;transition:border-color var(--transition-fast),background-color var(--transition-fast),color var(--transition-fast),box-shadow var(--transition-fast),transform var(--transition-fast)}.wizard-steps li[data-done=true]{border-color:color-mix(in srgb,var(--green) 35%,var(--hairline));background:color-mix(in srgb,var(--mint) 45%,var(--surface));color:var(--green)}.wizard-steps li[data-active=true]{border-color:var(--orange);background:var(--surface);color:var(--ink);box-shadow:0 0 0 3px var(--orange-soft),var(--shadow-panel);transform:translateY(-1px)}.wizard-steps .step-index{font-size:10px;font-weight:700;letter-spacing:.06em;font-variant-numeric:tabular-nums;color:var(--muted-soft)}.wizard-steps li[data-active=true] .step-index{color:var(--orange);opacity:1}.wizard-steps li[data-done=true] .step-index{color:inherit;opacity:.8}.wizard-steps .step-label{line-height:1.25;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.field{display:grid;gap:var(--space-1);margin:0 0 var(--space-4);width:min(100%,520px)}.field span{font-size:12px;font-weight:600;color:var(--muted)}.field input,.field textarea,.field select{width:100%;border:1px solid var(--hairline-strong);border-radius:var(--radius-md);background:var(--surface);color:var(--ink);transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.field input{min-height:40px;padding:0 var(--space-3)}.field select{min-height:40px;padding:0 var(--space-3);cursor:pointer}.field textarea{min-height:120px;padding:var(--space-3);resize:vertical}.field input:focus-visible,.field textarea:focus-visible,.field select:focus-visible{outline:none;border-color:var(--orange);box-shadow:0 0 0 3px var(--orange-soft)}.field input:disabled,.field textarea:disabled,.field select:disabled{background:var(--surface-muted);color:var(--muted);cursor:not-allowed}.workflow-hint{margin:calc(var(--space-1) * -1) 0 var(--space-3);color:var(--muted);font-size:12px}.prd-drop-zone{position:relative;width:min(100%,720px);margin:0 0 var(--space-3);padding:var(--space-3);border:1px dashed var(--hairline-strong);border-radius:var(--radius-md);background:var(--surface);transition:border-color var(--transition-fast),background-color var(--transition-fast),box-shadow var(--transition-fast)}.prd-drop-zone.is-dragover{border-color:var(--orange);background:var(--orange-soft);box-shadow:0 0 0 3px var(--orange-soft)}.prd-upload-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2) var(--space-3);margin:0 0 var(--space-3)}.prd-upload-btn{display:inline-flex;align-items:center;cursor:pointer;margin:0}.prd-upload-btn.is-disabled,.prd-upload-btn:has(input:disabled){opacity:.55;cursor:not-allowed;pointer-events:none}.prd-upload-btn:focus-within{outline:none;box-shadow:0 0 0 3px var(--orange-soft)}.prd-upload-hint{font-size:12px}.prd-file-meta{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2) var(--space-3);margin:0 0 var(--space-3);padding:var(--space-2) var(--space-3);border:1px solid var(--hairline);border-radius:var(--radius-md);background:var(--surface-muted);font-size:12px;color:var(--ink)}.prd-file-list{list-style:none;margin:0 0 var(--space-3);padding:0;display:grid;gap:var(--space-2)}.prd-file-list li{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--space-2);padding:var(--space-2) var(--space-3);border:1px solid var(--hairline);border-radius:var(--radius-md);background:var(--surface-muted);font-size:12px}.prd-file-list li.is-primary{border-color:color-mix(in srgb,var(--orange) 40%,var(--hairline-strong))}.prd-file-item-name{display:inline-flex;flex-wrap:wrap;align-items:center;gap:var(--space-1);min-width:0}.prd-file-primary-tag{display:inline-flex;align-items:center;padding:0 6px;border-radius:999px;background:var(--orange-soft);color:var(--orange);font-size:11px;font-weight:700}.prd-file-item-actions{display:inline-flex;flex-wrap:wrap;gap:var(--space-1)}.prd-file-item-actions .btn,.prd-file-clear{min-height:28px;padding:0 var(--space-2);font-size:12px}.prd-drop-hint{margin:0 0 var(--space-3);font-size:13px;font-weight:600;color:var(--orange)}.prd-text-field{width:100%;margin-bottom:0}.prd-file-error{width:min(100%,720px);margin:0 0 var(--space-3);padding:var(--space-2) var(--space-3);border:1px solid color-mix(in srgb,var(--orange) 45%,var(--hairline-strong));border-radius:var(--radius-md);background:var(--orange-soft);color:var(--ink);font-size:13px}.meta-row{display:grid;gap:6px;margin:0 0 var(--space-4);padding:var(--space-3) var(--space-4);border:1px solid var(--hairline);border-radius:var(--radius-md);background:var(--canvas-soft);font-size:13px}.meta-row code{font-size:12px}.cta-row,.recovery-cta-row{display:flex;flex-wrap:wrap;gap:var(--space-2);align-items:center}.cta-row{margin-top:var(--space-3)}.cta-row .cmd{flex:1 1 100%}.wizard-body{display:grid;gap:var(--space-3);justify-items:stretch;animation:panel-in .24s ease}.wizard-body>div{display:grid;gap:var(--space-3);justify-items:stretch}.wizard-body .field{width:100%;max-width:640px}.wizard-body .cta-row{margin-top:var(--space-1)}.interview-card{width:100%;padding:var(--space-5);border:1px solid var(--hairline);border-radius:var(--radius-lg);background:linear-gradient(180deg,var(--surface),var(--canvas-soft));box-shadow:var(--shadow-panel)}.interview-q{margin:0 0 var(--space-2);color:var(--ink)}.btn,button{appearance:none;display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:34px;padding:0 14px;border:1px solid var(--hairline-strong);border-radius:var(--radius-md);background:var(--surface);color:var(--ink);font-size:var(--text-md);font-weight:600;letter-spacing:.01em;cursor:pointer;transition:border-color var(--transition-fast),background-color var(--transition-fast),color var(--transition-fast),box-shadow var(--transition-fast),transform var(--transition-fast)}.btn:hover:not(:disabled),button:hover:not(:disabled){border-color:color-mix(in srgb,var(--ink) 18%,var(--hairline-strong));background:var(--canvas-soft);outline:none}.btn:focus-visible:not(:disabled),button:focus-visible:not(:disabled){outline:none;box-shadow:0 0 0 3px var(--orange-soft)}.btn:active:not(:disabled),button:active:not(:disabled){transform:translateY(1px)}.btn:disabled,button:disabled{opacity:.48;cursor:not-allowed;transform:none}.btn-primary,button.btn-primary{border-color:var(--orange);background:linear-gradient(180deg,var(--orange),var(--orange-active));color:#fff;font-weight:650;box-shadow:inset 0 1px #ffffff2e,0 6px 16px #f54e002e}.btn-primary:hover:not(:disabled),button.btn-primary:hover:not(:disabled){border-color:var(--orange-active);background:var(--orange-active);color:#fff;box-shadow:inset 0 1px #ffffff1f,0 8px 20px #f54e003d;transform:translateY(-1px)}.btn-primary:active:not(:disabled),button.btn-primary:active:not(:disabled){transform:translateY(0);box-shadow:0 2px 8px #f54e0033}.btn-secondary,button.btn-secondary{border-color:var(--hairline-strong);background:var(--surface);color:var(--ink);box-shadow:var(--shadow-sm)}.btn-secondary:hover:not(:disabled),button.btn-secondary:hover:not(:disabled){background:var(--canvas-soft)}.btn-ghost,button.btn-ghost{border-color:transparent;background:transparent;color:var(--body)}.btn-ghost:hover:not(:disabled),button.btn-ghost:hover:not(:disabled){background:var(--surface-muted);color:var(--ink)}.recovery-cta-row{margin-top:var(--space-3)}.recovery-confirm{margin-top:var(--space-3);padding:var(--space-4);border:1px solid color-mix(in srgb,var(--orange) 40%,var(--hairline));border-radius:var(--radius-md);background:color-mix(in srgb,var(--orange-soft) 55%,var(--surface))}.recovery-confirm h3{margin:0 0 var(--space-2);font-size:15px}.recovery-confirm .cta-row{margin-top:var(--space-3)}.recovery-report{margin-top:var(--space-3);padding:var(--space-4);border:1px solid var(--hairline);border-radius:var(--radius-md);background:var(--surface)}.recovery-report-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);margin-bottom:var(--space-3)}.recovery-report-header h3{margin:0;font-size:15px}.recovery-report-facts{display:grid;gap:var(--space-2);margin:0 0 var(--space-3)}.recovery-report-facts div{display:grid;grid-template-columns:5.5rem 1fr;gap:var(--space-2)}.recovery-report-facts dt{color:var(--muted);font-size:12px}.recovery-report-facts dd{margin:0;overflow-wrap:anywhere}.recovery-steps{margin:.5rem 0 .75rem 1.25rem;padding:0;line-height:1.5}.recovery-lane{margin-top:var(--space-4);padding-top:var(--space-3);border-top:1px solid var(--hairline)}.recovery-lane h3{margin:0 0 .35rem;font-size:1rem}.recovery-cta-row button[disabled]{opacity:.4}@keyframes flash-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}@keyframes panel-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}@media(max-width:800px){.console-shell{width:min(100% - 24px,var(--shell-max));padding-top:var(--space-5)}.inspect-split-panel{inset:auto 0 0;width:100%;max-height:min(76vh,680px);border-radius:var(--radius-lg) var(--radius-lg) 0 0}.kv div{grid-template-columns:1fr}.wizard-steps{grid-template-columns:repeat(2,minmax(0,1fr))}}.oc-shell{display:flex;flex-direction:column;height:100%;min-height:0;gap:var(--space-3);position:relative;overflow:hidden}.oc-workspace{display:flex;flex:1 1 auto;min-height:0;gap:0;position:relative;overflow:hidden}.oc-main{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;min-height:0;overflow:hidden}.oc-sidebar{flex:0 0 280px;width:280px;min-width:0;display:flex;flex-direction:column;gap:var(--space-2);margin-right:var(--space-3);padding:var(--space-2);overflow:hidden;border:1px solid var(--hairline);border-radius:var(--radius-md);background:var(--surface)}.oc-sidebar.is-collapsed{flex:0 0 36px;width:36px;padding:6px;overflow:visible;align-items:center}.oc-sidebar-header-actions{display:inline-flex;align-items:center;gap:2px}.oc-sidebar-toggle{appearance:none;display:inline-grid;place-items:center;width:28px;height:28px;padding:0;border:1px solid transparent;border-radius:var(--radius-sm);background:transparent;color:var(--muted);cursor:pointer;transition:background-color var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast)}.oc-sidebar-toggle:hover{color:var(--ink);background:color-mix(in srgb,var(--orange) 8%,var(--surface));border-color:var(--hairline)}.oc-sidebar-toggle:focus-visible{outline:2px solid color-mix(in srgb,var(--orange) 45%,transparent);outline-offset:1px}.oc-sidebar-toggle.is-collapsed{width:100%;height:28px}.oc-sidebar-section{display:flex;flex-direction:column;gap:6px;min-height:0}.oc-sidebar-section>header{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:13px;flex-shrink:0}.oc-sessions{flex:0 1 auto;max-height:min(34vh,320px)}.oc-session-scroll{min-height:0;max-height:min(28vh,260px);overflow:auto;padding:4px;border:1px solid var(--hairline);border-radius:var(--radius-md);background:linear-gradient(180deg,color-mix(in srgb,var(--canvas-soft) 70%,white),var(--canvas-soft))}.oc-session-group{display:flex;flex-direction:column;gap:2px}.oc-session-group>small{margin:4px 6px 2px;color:var(--muted-soft);font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.oc-session-item{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:2px;align-items:center;border-radius:6px;transition:background-color var(--transition-fast)}.oc-session-item:hover,.oc-session-item:focus-within{background:color-mix(in srgb,var(--orange) 8%,var(--surface))}.oc-session-item.is-active{background:var(--orange-soft)}.oc-session-main{min-width:0;padding:5px 6px;border:0;background:transparent;color:inherit;text-align:left;cursor:pointer}.oc-session-main strong,.oc-session-main span{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.oc-session-main strong{font-size:12.5px;font-weight:650;line-height:1.25}.oc-session-main span{color:var(--muted-soft);font-size:10px;margin-top:1px;font-variant-numeric:tabular-nums}.oc-session-actions{display:none;align-items:center;gap:0;padding-right:2px}.oc-session-item:hover .oc-session-actions,.oc-session-item:focus-within .oc-session-actions,.oc-session-item.is-active .oc-session-actions{display:inline-flex}.oc-session-menu{padding:3px 4px;border:0;background:transparent;color:var(--muted);cursor:pointer;font:inherit;font-size:10px;white-space:nowrap}.oc-session-menu:hover{color:var(--ink)}.oc-session-delete{color:color-mix(in srgb,var(--red) 75%,var(--muted))}.oc-session-delete:hover{color:var(--red)}.oc-explorer{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;gap:6px;border-top:1px solid var(--hairline);padding-top:var(--space-3);margin-top:2px}.oc-explorer-hint{margin:0 2px;color:var(--muted-soft);font-size:10.5px;letter-spacing:.01em}.oc-tree-scroll{flex:1 1 auto;min-height:120px;max-height:min(52vh,560px);overflow:auto;padding:4px;border:1px solid var(--hairline);border-radius:var(--radius-md);background:linear-gradient(180deg,color-mix(in srgb,var(--canvas-soft) 70%,white),var(--canvas-soft))}.oc-tree,.oc-tree ul{list-style:none;padding:0;margin:0}.oc-tree-node{position:relative}.oc-tree-row{appearance:none;display:grid;grid-template-columns:12px 14px minmax(0,1fr);align-items:center;gap:6px;width:100%;min-height:28px;margin:0;padding:3px 8px;border:0;border-radius:6px;background:transparent;color:var(--ink);text-align:left;cursor:pointer;transition:background-color var(--transition-fast),color var(--transition-fast)}.oc-tree-row:hover{background:color-mix(in srgb,var(--orange) 8%,var(--surface))}.oc-tree-row:focus-visible{outline:2px solid color-mix(in srgb,var(--orange) 45%,transparent);outline-offset:1px}.oc-tree-chevron{color:var(--muted-soft);transition:transform var(--transition-fast);transform:rotate(0)}.oc-tree-chevron.is-open{transform:rotate(90deg)}.oc-tree-chevron-spacer{width:12px;height:12px}.oc-tree-glyph{flex-shrink:0;color:var(--amber)}.oc-tree-glyph.is-folder-open{color:color-mix(in srgb,var(--orange) 70%,var(--amber))}.oc-tree-glyph.is-file{color:var(--muted)}.oc-tree-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;line-height:1.25;font-variant-numeric:tabular-nums}.oc-tree-dir .oc-tree-label{font-weight:650;color:var(--ink)}.oc-tree-file .oc-tree-label{font-family:JetBrains Mono,SFMono-Regular,Consolas,Segoe UI Mono,monospace;font-size:11.5px;font-weight:500;color:var(--body)}.oc-tree-node.is-dot .oc-tree-label{color:var(--muted-soft);font-weight:500}.oc-tree-node.is-dot .oc-tree-glyph{opacity:.7}.oc-tree-children{position:relative;margin:0}.oc-tree-children:before{content:"";position:absolute;top:0;bottom:2px;left:var(--oc-tree-guide, 14px);width:1px;background:color-mix(in srgb,var(--hairline-strong) 55%,transparent);pointer-events:none}.oc-tree-empty,.oc-sidebar-error{margin:8px 6px;color:var(--muted);font-size:12px;line-height:1.45}.oc-sidebar-error{color:var(--red)}.oc-governance{margin-top:auto;border-top:1px solid var(--hairline);padding-top:8px}.oc-governance-links{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:4px}.oc-governance-links button{min-height:28px;padding:4px 6px;border:1px solid var(--hairline);border-radius:var(--radius-sm);background:var(--surface);color:var(--muted);cursor:pointer;font:inherit;font-size:11px;font-weight:600;text-align:center}.oc-governance-links button:hover{color:var(--ink);border-color:color-mix(in srgb,var(--ink) 18%,var(--hairline))}.oc-governance-panel button{border:0;background:transparent;color:var(--muted);cursor:pointer;font:inherit;font-size:11px}.oc-governance-panel{position:absolute;z-index:10;left:282px;bottom:0;width:min(440px,calc(100vw - 320px));max-height:75%;overflow:auto;padding:12px;border:1px solid var(--hairline);border-radius:var(--radius-md);background:var(--surface);box-shadow:var(--shadow-panel)}.oc-governance-panel header,.oc-governance-panel article,.oc-governance-panel label{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:5px 0}.oc-governance-panel small,.oc-governance-panel span{color:var(--muted);font-size:11px}.oc-governance-panel button:disabled{cursor:wait;opacity:.5}.oc-governance-error{color:var(--red);font-size:var(--text-sm)}.oc-model-provider{display:block!important;border-bottom:1px solid var(--hairline)}.oc-model-provider>div,.oc-model-row,.oc-model-row>div{display:flex;align-items:center;justify-content:space-between;gap:8px}.oc-model-row{padding:4px 0 4px 10px}.oc-model-form{display:grid;gap:6px;margin-top:10px}.oc-model-form input{min-width:0;border:1px solid var(--hairline);border-radius:var(--radius-sm);background:var(--surface);color:var(--ink);padding:6px 8px;font:inherit;font-size:12px}.oc-model-form button{justify-self:start}.oc-model-test-result{padding:6px 8px;border-radius:var(--radius-sm);background:var(--surface-muted);font-size:12px}.oc-file-preview{position:absolute;z-index:4;inset:0;display:flex;flex-direction:column;overflow:hidden;border:1px solid var(--hairline);border-radius:var(--radius-md);background:var(--surface);box-shadow:var(--shadow-panel)}.oc-file-preview header{display:flex;align-items:center;gap:var(--space-2);padding:10px 12px;border-bottom:1px solid var(--hairline)}.oc-file-tabs{display:flex;min-width:0;gap:2px;overflow-x:auto}.oc-file-tabs button{max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--muted);padding:4px 7px;cursor:pointer}.oc-file-tabs button.is-active{background:var(--surface-muted);color:var(--ink);font-weight:650}.oc-file-preview header span{flex:1;color:var(--muted);font-size:11px}.oc-file-preview pre{flex:1;min-height:0;margin:0;padding:var(--space-3);overflow:auto;font-size:12px;line-height:1.5;white-space:pre-wrap}.oc-file-preview-loading{position:absolute;z-index:5;right:12px;top:12px;padding:6px 8px;border-radius:var(--radius-sm);background:var(--surface-muted);color:var(--muted);font-size:12px}.oc-process{display:flex;flex-direction:column;flex:0 0 min(360px,42%);width:min(360px,42%);min-width:280px;min-height:0;border:1px solid var(--hairline);border-radius:var(--radius-md);background:var(--surface);box-shadow:var(--shadow-panel);margin-left:var(--space-3);overflow:hidden;animation:panel-in .18s ease}.oc-turn-group{display:flex;flex-direction:column;gap:8px;margin-bottom:12px}.oc-process-inline{margin:0 0 4px 44px;max-width:min(720px,100%)}.oc-process-inline-summary{display:inline-flex;align-items:center;gap:6px;min-height:24px;padding:2px 0;border:none;background:transparent;color:var(--muted);cursor:pointer;font-size:12px;text-align:left}.oc-process-inline-summary:hover,.oc-process-inline-summary.is-open{color:var(--ink)}.oc-process-inline-summary.is-running{color:var(--accent, #2563eb)}.oc-process-inline-summary.is-error{color:var(--danger, #dc2626)}.oc-process-inline-summary .oc-tool-chevron{width:12px;height:12px;flex-shrink:0;transition:transform .15s ease}.oc-process-inline-summary.is-open .oc-tool-chevron{transform:rotate(90deg)}.oc-process-inline-body{display:flex;flex-direction:column;gap:8px;margin-top:8px}.oc-tool-duration{flex-shrink:0;font-size:11px;font-variant-numeric:tabular-nums;color:var(--muted)}.oc-tool-expand-result{margin-top:4px;font-size:12px}.oc-process-head{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2);padding:10px 12px;border-bottom:1px solid var(--hairline);flex-shrink:0}.oc-process-title{display:inline-flex;align-items:center;gap:8px;font-weight:700;font-size:13px;color:var(--ink)}.oc-process-title-mark{width:8px;height:8px;border-radius:50%;background:var(--orange)}.oc-process-count{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:18px;padding:0 6px;border-radius:var(--radius-pill);background:var(--surface-muted);color:var(--muted);font-size:11px;font-weight:650}.oc-process-close{font-size:12px}.oc-process-timeline{flex:1 1 auto;min-height:0;overflow-y:auto;padding:var(--space-3);display:flex;flex-direction:column;gap:0}.oc-process-empty{padding:var(--space-4);color:var(--muted);font-size:12.5px;line-height:1.5;text-align:center}.oc-process-item{display:grid;grid-template-columns:20px 52px minmax(0,1fr);gap:8px;align-items:start;padding:4px 0}.oc-process-rail{position:relative;display:grid;place-items:center;min-height:34px}.oc-process-rail:before{position:absolute;top:0;bottom:0;width:1px;background:var(--hairline);content:""}.oc-process-item.is-first .oc-process-rail:before{top:50%}.oc-process-item.is-last .oc-process-rail:before{bottom:50%}.oc-process-dot{position:relative;z-index:1;width:8px;height:8px;border-radius:50%;background:var(--surface);border:2px solid color-mix(in srgb,var(--orange) 55%,var(--hairline))}.oc-process-item.is-running .oc-process-dot{border-color:var(--orange-active);background:var(--orange-soft)}.oc-process-item.is-error .oc-process-dot{border-color:var(--red);background:color-mix(in srgb,var(--red) 18%,var(--surface))}.oc-process-time{padding-top:10px;font-size:11px;color:var(--muted-soft);font-variant-numeric:tabular-nums;white-space:nowrap}.oc-process-body{min-width:0}.oc-process-toggle{cursor:pointer;font:inherit}.oc-process-toggle.is-active{border-color:color-mix(in srgb,var(--orange) 40%,var(--hairline));background:color-mix(in srgb,var(--orange) 10%,var(--surface));color:var(--orange-active)}.oc-process-toggle.is-running{border-color:color-mix(in srgb,var(--orange) 40%,var(--hairline));color:var(--orange-active)}.oc-process-toggle.is-error{border-color:color-mix(in srgb,var(--red) 35%,var(--hairline));background:color-mix(in srgb,var(--red) 8%,var(--surface));color:var(--red)}.oc-process-summary{display:inline-flex;align-items:center;gap:4px;padding:3px 10px;border:1px solid var(--hairline);border-radius:var(--radius-pill);background:var(--surface);color:var(--muted);font-size:11.5px;font-weight:650;cursor:pointer;font:inherit;max-width:min(420px,100%);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.oc-process-summary:hover,.oc-process-summary.is-open{border-color:color-mix(in srgb,var(--orange) 35%,var(--hairline));color:var(--orange-active)}.oc-process-summary.is-running{color:var(--orange-active);border-color:color-mix(in srgb,var(--orange) 40%,var(--hairline));background:var(--orange-soft)}.oc-process-summary.is-error{color:var(--red);border-color:color-mix(in srgb,var(--red) 35%,var(--hairline));background:color-mix(in srgb,var(--red) 8%,var(--surface))}.oc-process-summary.is-ok{color:var(--green);border-color:color-mix(in srgb,var(--green) 30%,var(--hairline))}@media(max-width:900px){.oc-sidebar{position:absolute;inset:0 auto 0 0;z-index:7;width:min(300px,calc(100% - 24px));margin-right:0;box-shadow:var(--shadow-soft)}.oc-sidebar.is-collapsed{position:static;width:auto}.oc-workspace.has-process .oc-process{position:absolute;top:0;right:0;bottom:0;z-index:8;width:min(360px,calc(100% - 24px));min-width:0;flex:none;margin-left:0;border-radius:var(--radius-md) 0 0 var(--radius-md);box-shadow:var(--shadow-soft)}}.oc-banner{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2) var(--space-3);padding:10px 14px;border:1px solid var(--hairline);border-radius:var(--radius-md);background:color-mix(in srgb,var(--surface) 94%,transparent);box-shadow:var(--shadow-panel)}.oc-shell>.oc-alert:first-child{margin-top:0}.oc-banner-title{display:inline-flex;align-items:center;gap:6px;font-weight:700;color:var(--ink)}.oc-banner-dot{width:8px;height:8px;border-radius:50%;background:var(--orange)}.oc-banner-body{color:var(--body);font-size:12.5px;line-height:1.45}.oc-banner-body strong{color:var(--ink)}.oc-cap-chips{display:inline-flex;flex-wrap:wrap;gap:6px;margin-left:auto;align-items:center}.oc-cap-chip{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border:1px solid color-mix(in srgb,var(--green) 30%,var(--hairline));border-radius:var(--radius-pill);background:color-mix(in srgb,var(--mint) 50%,var(--surface));color:var(--green);font-size:11.5px;font-weight:650}button.oc-cap-chip{font:inherit;cursor:pointer}.oc-tools-menu{position:relative}.oc-tools-menu--composer .oc-tools-catalog{top:auto;bottom:calc(100% + 8px)}.oc-tools-toggle.is-active{border-color:color-mix(in srgb,var(--orange) 40%,var(--hairline));background:color-mix(in srgb,var(--orange) 10%,var(--surface));color:var(--orange-active)}.oc-tools-catalog{position:absolute;top:calc(100% + 8px);right:0;z-index:20;width:min(420px,calc(100vw - 48px));max-height:min(480px,60vh);display:flex;flex-direction:column;border:1px solid var(--hairline);border-radius:var(--radius-md);background:var(--surface);box-shadow:var(--shadow-soft);animation:panel-in .16s ease;overflow:hidden}.oc-tools-catalog-head{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:1px solid var(--hairline);flex-shrink:0}.oc-tools-catalog-head strong{font-size:13px;color:var(--ink)}.oc-tools-catalog-meta{font-size:11.5px;color:var(--muted-soft)}.oc-tools-catalog-close{margin-left:auto;font-size:12px}.oc-tools-catalog-body{overflow-y:auto;padding:var(--space-3);display:flex;flex-direction:column;gap:var(--space-3)}.oc-tools-group-title{margin:0 0 8px;font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--muted-soft)}.oc-tools-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}.oc-tools-item{padding:8px 10px;border:1px solid var(--hairline);border-radius:var(--radius-sm);background:color-mix(in srgb,var(--surface-muted) 55%,var(--surface))}.oc-tools-item-head{display:flex;align-items:center;gap:8px;margin-bottom:4px}.oc-tools-name{font-family:JetBrains Mono,SFMono-Regular,Consolas,monospace;font-size:12.5px;font-weight:650;color:var(--ink)}.oc-tools-kind{margin-left:auto;font-size:10.5px;font-weight:650;padding:1px 7px;border-radius:var(--radius-pill);color:var(--muted);background:var(--surface);border:1px solid var(--hairline)}.oc-tools-kind.is-explore,.oc-tools-kind.is-read{color:var(--green);border-color:color-mix(in srgb,var(--green) 28%,var(--hairline));background:color-mix(in srgb,var(--mint) 45%,transparent)}.oc-tools-kind.is-mutation{color:var(--orange-active);border-color:color-mix(in srgb,var(--orange) 35%,var(--hairline));background:var(--orange-soft)}.oc-tools-kind.is-long-running{color:var(--amber);border-color:color-mix(in srgb,var(--amber) 35%,var(--hairline));background:color-mix(in srgb,var(--amber) 10%,var(--surface))}.oc-tools-desc{margin:0;font-size:12px;line-height:1.45;color:var(--body)}.oc-tools-cli{margin:4px 0 0;font-size:11px;color:var(--muted-soft)}.oc-tools-cli code{font-size:11px;color:var(--muted)}.oc-alert{padding:10px 14px;border-radius:var(--radius-md);font-size:var(--text-md);line-height:1.5;animation:panel-in .18s var(--ease-out)}.oc-alert-warning{border:1px solid color-mix(in srgb,var(--amber) 35%,var(--hairline));border-left:3px solid var(--amber);background:color-mix(in srgb,var(--amber) 8%,var(--surface));color:var(--amber)}.oc-alert-error{border:1px solid color-mix(in srgb,var(--red) 35%,var(--hairline));border-left:3px solid var(--red);background:color-mix(in srgb,var(--red) 7%,var(--surface));color:var(--red)}.oc-messages{flex:1 1 auto;min-height:0;overflow-y:auto;padding:var(--space-3) var(--space-3) var(--space-2);display:flex;flex-direction:column;gap:var(--space-3)}.oc-messages.has-thread:before{content:"";flex:1 1 auto;min-height:0}.oc-messages.is-empty{justify-content:center;align-items:center;padding:var(--space-5) var(--space-4) var(--space-4);background:radial-gradient(640px 300px at 50% 28%,rgb(241 216 203 / 34%),transparent 68%),radial-gradient(520px 240px at 78% 78%,rgb(216 234 213 / 26%),transparent 62%)}.oc-main.is-landing{position:relative}.oc-day-sep{display:flex;align-items:center;gap:var(--space-3);color:var(--muted-soft);font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;margin:var(--space-2) 0}.oc-day-sep:before,.oc-day-sep:after{content:"";flex:1;height:1px;background:var(--hairline)}.oc-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;flex:0 1 auto;gap:var(--space-5);text-align:center;width:min(100%,680px);padding:var(--space-2) var(--space-2) var(--space-4);animation:oc-empty-in .28s ease both}@keyframes oc-empty-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@media(prefers-reduced-motion:reduce){.oc-empty{animation:none}}.oc-empty-hero{display:flex;flex-direction:column;align-items:center;gap:var(--space-3)}.oc-empty-icon{display:grid;place-items:center;width:56px;height:56px;border-radius:50%;background:linear-gradient(145deg,color-mix(in srgb,var(--orange) 18%,white),color-mix(in srgb,var(--mint) 35%,white));color:var(--orange-active);font-size:26px;font-weight:800;font-family:var(--font-mono, "JetBrains Mono", monospace);box-shadow:0 0 0 1px color-mix(in srgb,var(--orange) 18%,transparent)}.oc-empty-copy{display:flex;flex-direction:column;align-items:center;gap:var(--space-2)}.oc-empty h3{margin:0;font-size:20px;font-weight:700;letter-spacing:-.02em;color:var(--ink)}.oc-empty p{margin:0;max-width:48ch;color:var(--muted);font-size:13px;line-height:1.55}.oc-suggestions{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-2);width:100%}@media(max-width:560px){.oc-suggestions{grid-template-columns:1fr}}.oc-suggestion{appearance:none;display:flex;flex-direction:column;gap:5px;text-align:left;min-height:0;padding:14px 16px;border:1px solid var(--hairline);border-radius:var(--radius-lg);background:color-mix(in srgb,var(--surface) 88%,transparent);color:var(--ink);cursor:pointer;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);transition:border-color var(--transition-fast),background var(--transition-fast),transform var(--transition-fast),box-shadow var(--transition-fast)}.oc-suggestion:hover:not(:disabled){border-color:color-mix(in srgb,var(--orange) 45%,var(--hairline));background:var(--surface);box-shadow:0 0 0 3px var(--orange-soft),var(--shadow-panel);transform:translateY(-1px)}.oc-suggestion:disabled{opacity:.55;cursor:not-allowed}.oc-suggestion strong{font-size:var(--text-md);font-weight:700}.oc-suggestion span{color:var(--muted);font-size:var(--text-sm);line-height:1.45}.oc-empty-tips{display:flex;flex-wrap:wrap;justify-content:center;gap:var(--space-2) var(--space-3);margin:0;padding:0;list-style:none;color:var(--muted-soft);font-size:12px}.oc-empty-tips li{display:inline-flex;align-items:center;gap:6px}.oc-empty-tips kbd{display:inline-grid;place-items:center;min-width:1.4em;padding:1px 6px;border:1px solid var(--hairline);border-radius:5px;background:var(--surface);color:var(--body);font-family:var(--font-mono, "JetBrains Mono", monospace);font-size:11px;font-weight:600;line-height:1.4}.oc-empty-cta{margin-top:calc(var(--space-1) * -1)}.oc-row{display:flex;flex-direction:column;gap:4px;max-width:100%}.oc-row.is-user{align-self:flex-end;align-items:flex-end;width:auto;max-width:min(100%,720px)}.oc-row.is-assistant,.oc-row.is-tool{align-self:stretch;align-items:stretch;width:100%;max-width:100%}.oc-meta{display:flex;align-items:center;gap:8px;font-size:11.5px;color:var(--muted-soft)}.oc-row.is-assistant .oc-meta,.oc-row.is-user .oc-meta{width:100%;max-width:100%}.oc-message-copy{appearance:none;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:26px;height:26px;margin-left:auto;padding:0;border:1px solid transparent;border-radius:var(--radius-sm);background:transparent;color:var(--muted-soft);cursor:pointer;opacity:0;transition:opacity var(--transition-fast),background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast)}.oc-row:hover .oc-message-copy,.oc-row:focus-within .oc-message-copy,.oc-message-copy:focus-visible{opacity:1}.oc-message-copy:hover{color:var(--body);background:color-mix(in srgb,var(--ink) 6%,transparent);border-color:var(--hairline)}.oc-message-copy.is-copied{opacity:1;color:var(--green, #1a7f37);border-color:color-mix(in srgb,var(--green, #1a7f37) 35%,transparent)}@media(hover:none){.oc-message-copy{opacity:.5}}.oc-avatar{display:grid;place-items:center;width:22px;height:22px;border-radius:50%;font-size:11px;font-weight:700;flex-shrink:0}.oc-avatar-user{background:var(--ink);color:#fff}.oc-avatar-assistant{background:var(--orange);color:#fff}.oc-role{font-weight:700;color:var(--body)}.oc-time{font-variant-numeric:tabular-nums}.oc-bubble{padding:10px 14px;border-radius:var(--radius-lg);font-size:14px;line-height:1.6;overflow-wrap:anywhere;word-break:break-word;animation:bubble-in .16s ease}@keyframes bubble-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}.oc-bubble-user{background:var(--ink);color:#fff;border-bottom-right-radius:4px;box-shadow:0 4px 14px #26251e1f}.oc-bubble-assistant{background:var(--surface);color:var(--ink);border:1px solid var(--hairline);border-bottom-left-radius:4px}.oc-bubble-tool{background:var(--canvas-soft);color:var(--body);border:1px solid var(--hairline)}.oc-bubble-error{border-color:color-mix(in srgb,var(--red) 40%,var(--hairline));background:color-mix(in srgb,var(--red) 7%,var(--surface));color:var(--red)}.oc-md{display:flex;flex-direction:column;gap:var(--space-2)}.oc-md>*:first-child{margin-top:0}.oc-md>*:last-child{margin-bottom:0}.oc-md p{margin:0}.oc-md h1,.oc-md h2,.oc-md h3,.oc-md h4{margin:var(--space-3) 0 var(--space-2);color:inherit;font-weight:700;line-height:1.3}.oc-md h1{font-size:1.3em}.oc-md h2{font-size:1.18em}.oc-md h3{font-size:1.06em}.oc-md h4{font-size:1em}.oc-md ul,.oc-md ol{margin:0;padding-left:1.4em;display:flex;flex-direction:column;gap:2px}.oc-md li{margin:0}.oc-md blockquote{margin:0;padding:2px 0 2px 12px;border-left:3px solid var(--hairline-strong);color:var(--body)}.oc-bubble-user .oc-md blockquote{border-left-color:#ffffff59;color:#ffffffd1}.oc-md code{font-size:.86em;padding:1px 5px;border-radius:4px;background:color-mix(in srgb,var(--ink) 8%,transparent)}.oc-bubble-user .oc-md code{background:#ffffff29}.oc-md pre{margin:0;padding:0;background:transparent}.oc-codeblock{margin:0;border:1px solid var(--hairline);border-radius:var(--radius-md);background:var(--surface-muted);overflow:hidden}.oc-bubble-assistant .oc-codeblock{background:#f3efe8}.oc-codeblock-head{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2);padding:5px 6px 5px 10px;border-bottom:1px solid var(--hairline);font-size:11px;color:var(--muted);background:color-mix(in srgb,var(--ink) 4%,transparent)}.oc-codeblock-lang{font-family:JetBrains Mono,SFMono-Regular,Consolas,monospace;font-weight:600;text-transform:lowercase}.oc-codeblock-copy{appearance:none;display:inline-flex;align-items:center;gap:5px;min-height:26px;padding:0 9px;border:1px solid transparent;border-radius:var(--radius-sm);background:transparent;color:var(--muted);font-size:11px;font-weight:600;cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast)}.oc-codeblock-copy:hover{background:var(--surface);color:var(--ink);border-color:var(--hairline-strong)}.oc-codeblock pre{margin:0;padding:var(--space-3) var(--space-4);overflow-x:auto;font-family:JetBrains Mono,SFMono-Regular,Consolas,monospace;font-size:12.5px;line-height:1.55;white-space:pre;color:var(--ink)}.oc-md a{color:var(--orange);text-decoration:none;border-bottom:1px solid color-mix(in srgb,var(--orange) 40%,transparent)}.oc-md a:hover{border-bottom-color:var(--orange)}.oc-md hr{margin:var(--space-2) 0;border:none;border-top:1px solid var(--hairline-strong)}.oc-stream{white-space:pre-wrap;font-family:JetBrains Mono,SFMono-Regular,Consolas,monospace;font-size:13px;line-height:1.55}.oc-cursor{display:inline-block;width:7px;height:1.05em;margin-left:2px;vertical-align:text-bottom;background:var(--orange);animation:oc-blink 1s steps(2,start) infinite;border-radius:1px}@keyframes oc-blink{to{opacity:0}}.oc-tool{border:1px solid var(--hairline);border-radius:var(--radius-md);background:var(--canvas-soft);overflow:hidden;animation:panel-in .16s ease;transition:border-color var(--transition-fast),background-color var(--transition-fast)}.oc-tool:hover{border-color:var(--hairline-strong);background:var(--surface)}.oc-tool.is-error{border-color:color-mix(in srgb,var(--red) 38%,var(--hairline))}.oc-tool.is-running{border-color:color-mix(in srgb,var(--orange) 40%,var(--hairline))}.oc-tool-head{display:flex;align-items:center;gap:var(--space-2);width:100%;padding:7px 12px;border:none;background:transparent;text-align:left;cursor:pointer;font:inherit;color:var(--ink)}.oc-tool-head:hover{background:var(--surface-muted)}.oc-tool-chevron{flex-shrink:0;width:12px;height:12px;transition:transform var(--transition-fast)}.oc-tool-head[aria-expanded=true] .oc-tool-chevron{transform:rotate(90deg)}.oc-tool-icon{display:grid;place-items:center;width:22px;height:22px;border-radius:6px;background:var(--surface-muted);color:var(--orange-active);flex-shrink:0}.oc-tool-name{font-family:JetBrains Mono,SFMono-Regular,Consolas,monospace;font-size:12.5px;font-weight:650;flex-shrink:0}.oc-tool-args{color:var(--muted);font-size:11.5px;font-family:JetBrains Mono,SFMono-Regular,Consolas,monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-right:8px;min-width:0}.oc-tool-status{margin-left:auto;flex-shrink:0;font-size:11px;font-weight:650;padding:2px 8px;border-radius:var(--radius-pill)}.oc-tool-waiting{color:var(--muted);font-size:12px;animation:pulse 1.5s infinite}.oc-tool-status.is-running{color:var(--orange-active);background:var(--orange-soft)}.oc-tool-status.is-ok{color:var(--green);background:color-mix(in srgb,var(--mint) 60%,transparent)}.oc-tool-status.is-error{color:var(--red);background:color-mix(in srgb,var(--red) 10%,transparent)}.oc-tool-body{padding:0 var(--space-4) var(--space-3);border-top:1px solid var(--hairline)}.oc-tool-section{display:flex;flex-direction:column;gap:4px;padding-top:var(--space-3)}.oc-tool-label{font-size:11px;font-weight:700;letter-spacing:.03em;text-transform:uppercase;color:var(--muted-soft)}.oc-tool-code{margin:0;padding:var(--space-3);border-radius:var(--radius-sm);background:var(--surface-muted);font-family:JetBrains Mono,SFMono-Regular,Consolas,monospace;font-size:12px;line-height:1.5;white-space:pre-wrap;word-break:break-word;max-height:260px;overflow-y:auto;color:var(--body)}.oc-composer{flex:0 0 auto;flex-shrink:0;border-top:1px solid var(--hairline);padding:var(--space-2) var(--space-3) var(--space-3);background:color-mix(in srgb,var(--canvas) 92%,transparent);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);z-index:2}.oc-composer-inner{display:flex;flex-direction:column;gap:var(--space-2);max-width:1080px;margin:0 auto;position:relative}.console-shell.is-chat-focus .oc-composer-inner{max-width:none}.oc-composer-shell{position:relative;display:flex;align-items:flex-end;gap:var(--space-2);padding:8px 8px 8px 14px;border:1px solid var(--hairline-strong);border-radius:var(--radius-lg);background:var(--surface);box-shadow:var(--shadow-panel);transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.oc-composer-shell:focus-within{border-color:var(--orange);box-shadow:0 0 0 3px var(--orange-soft)}.oc-composer-shell.is-busy{opacity:.78}.oc-textarea{flex:1 1 auto;min-width:0;min-height:52px;max-height:280px;padding:8px 0;border:none;background:transparent;color:var(--ink);font:inherit;font-size:14px;line-height:1.5;resize:none;outline:none}.oc-textarea::placeholder{color:var(--muted-soft)}.oc-send{appearance:none;display:grid;place-items:center;width:38px;height:38px;flex-shrink:0;padding:0;border:1px solid var(--orange);border-radius:50%;background:linear-gradient(180deg,var(--orange),var(--orange-active));color:#fff;cursor:pointer;box-shadow:inset 0 1px #fff3,0 4px 12px #f54e003d;transition:background var(--transition-fast),border-color var(--transition-fast),box-shadow var(--transition-fast),transform var(--transition-fast)}.oc-send:hover:not(:disabled){background:var(--orange-active);border-color:var(--orange-active);box-shadow:0 6px 16px #f54e004d;transform:translateY(-1px)}.oc-send:active:not(:disabled){transform:scale(.94)}.oc-send:disabled{opacity:.4;cursor:not-allowed}.oc-stop{appearance:none;display:grid;place-items:center;width:38px;height:38px;flex-shrink:0;padding:0;border:1px solid var(--hairline-strong);border-radius:50%;background:var(--surface);color:var(--red);cursor:pointer;transition:background var(--transition-fast),border-color var(--transition-fast)}.oc-stop:hover{background:color-mix(in srgb,var(--red) 8%,var(--surface));border-color:var(--red)}.oc-composer-foot{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap;font-size:11.5px;color:var(--muted)}.oc-composer-hint{display:inline-flex;align-items:center;gap:5px}.oc-kbd{display:inline-block;padding:1px 6px;border:1px solid var(--hairline-strong);border-bottom-width:2px;border-radius:4px;background:var(--surface);color:var(--body);font-family:JetBrains Mono,SFMono-Regular,Consolas,monospace;font-size:10.5px;line-height:1.4}.oc-operation-card{width:min(720px,calc(100% - 42px));margin:var(--space-3) auto;padding:var(--space-4) var(--space-5);border:1px solid var(--hairline-strong);border-left:4px solid var(--blue);border-radius:var(--radius-lg);background:color-mix(in srgb,var(--surface) 96%,var(--blue) 4%);box-shadow:var(--shadow-panel)}.oc-operation-card.is-succeeded{border-left-color:var(--green)}.oc-operation-card.is-failed,.oc-operation-card.is-timed-out{border-left-color:var(--red)}.oc-operation-card.is-needs-reconcile{border-left-color:var(--orange)}.oc-operation-head,.oc-operation-actions{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3)}.oc-operation-kicker{margin-bottom:2px;color:var(--muted);font-size:10px;font-weight:700;letter-spacing:.12em;text-transform:uppercase}.oc-operation-state{padding:3px 9px;border-radius:999px;background:color-mix(in srgb,var(--blue) 12%,transparent);color:var(--blue);font-size:11px;font-weight:700}.oc-operation-state.is-succeeded{background:color-mix(in srgb,var(--green) 12%,transparent);color:var(--green)}.oc-operation-state.is-failed,.oc-operation-state.is-timed-out{background:color-mix(in srgb,var(--red) 12%,transparent);color:var(--red)}.oc-operation-state.is-needs-reconcile{background:color-mix(in srgb,var(--orange) 14%,transparent);color:var(--orange-active)}.oc-operation-id,.oc-operation-controller{margin-top:var(--space-2);color:var(--muted);font-size:12px;overflow-wrap:anywhere}.oc-operation-identities{display:flex;flex-wrap:wrap;gap:6px;margin-top:var(--space-3)}.oc-operation-identities span{padding:3px 8px;border:1px solid var(--hairline);border-radius:var(--radius-pill);background:var(--surface);color:var(--muted);font-size:var(--text-xs);font-weight:600}.oc-operation-identities b{color:var(--body)}.oc-operation-preview{max-height:150px;margin:var(--space-3) 0 0;padding:var(--space-2) var(--space-3);overflow:auto;border:1px solid var(--hairline);border-radius:var(--radius-md);background:var(--canvas-soft);color:var(--body);font-family:var(--font-mono);font-size:var(--text-xs);line-height:1.5;white-space:pre-wrap;overflow-wrap:anywhere}.oc-operation-preview.is-error{border-color:color-mix(in srgb,var(--red) 30%,var(--hairline));color:var(--red)}.oc-operation-actions{justify-content:flex-start;margin-top:var(--space-3)}.oc-operation-actions time{margin-left:auto;color:var(--muted-soft);font-size:11px}.oc-interview-start{margin:var(--space-3) auto}.oc-draft-card{width:min(720px,calc(100% - 42px));margin:var(--space-3) auto;padding:var(--space-4) var(--space-5);border:1px solid var(--hairline);border-radius:var(--radius-lg);background:var(--surface);box-shadow:var(--shadow-panel)}.oc-draft-card>header{display:flex;align-items:center;gap:var(--space-3);justify-content:space-between}.oc-draft-card>header strong{font-size:15px;font-weight:700;letter-spacing:-.01em}.oc-draft-card>header span{padding:3px 10px;border-radius:var(--radius-pill);background:var(--surface-muted);color:var(--muted);font-size:var(--text-xs);font-weight:700;letter-spacing:.05em;text-transform:uppercase}.oc-interview-bubble{margin:var(--space-3) 0;padding:var(--space-3) var(--space-4);border-left:3px solid var(--orange);border-radius:0 var(--radius-md) var(--radius-md) 0;background:var(--canvas-soft)}.oc-interview-bubble textarea{width:100%;min-height:72px;margin:var(--space-2) 0;resize:vertical;border:1px solid var(--hairline-strong);border-radius:var(--radius-md);padding:var(--space-2) var(--space-3);font:inherit;font-size:var(--text-md)}.oc-interview-bubble textarea:focus-visible{outline:none;border-color:var(--orange);box-shadow:0 0 0 3px var(--orange-soft)}.oc-interview-bubble .btn+.btn{margin-left:var(--space-2)}.oc-draft-card pre{max-height:300px;overflow:auto;white-space:pre-wrap;font-size:var(--text-xs)}.oc-assessment{margin:var(--space-3) 0;color:var(--orange);font-size:var(--text-md)}.oc-assessment.is-fresh,.oc-task-kind-card.is-confirmed{color:var(--green)}.oc-task-kind-card{display:flex;align-items:center;gap:var(--space-3);justify-content:space-between;flex-wrap:wrap;margin-top:var(--space-3);padding:var(--space-3) var(--space-4);border:1px solid var(--hairline);border-radius:var(--radius-md);background:var(--canvas-soft)}.oc-task-kind-card small{color:var(--muted)}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-duration:.01ms!important}}.oc-human-gate-card{position:relative;width:min(720px,calc(100% - 42px));margin:var(--space-3) auto;padding:var(--space-4) var(--space-5);border:1px solid color-mix(in srgb,var(--orange) 38%,var(--hairline));border-left:4px solid var(--orange);border-radius:var(--radius-lg);background:linear-gradient(180deg,color-mix(in srgb,var(--orange) 4%,var(--surface)),var(--surface) 40%);box-shadow:var(--shadow-soft);animation:panel-in .2s var(--ease-out)}.oc-human-gate-card.is-prepared,.oc-human-gate-card.is-confirmed{position:sticky;bottom:var(--space-2);z-index:6}.oc-human-gate-card header,.oc-human-gate-card footer{display:flex;justify-content:space-between;align-items:center;gap:var(--space-3)}.oc-human-gate-card header div{display:grid;gap:3px}.oc-human-gate-card header small{color:var(--muted);font-size:var(--text-xs);font-weight:600;letter-spacing:.04em}.oc-human-gate-card header strong{font-size:15px;font-weight:700;letter-spacing:-.01em}.oc-human-gate-card header>span{flex-shrink:0;padding:3px 10px;border-radius:var(--radius-pill);font-size:var(--text-xs);font-weight:700;letter-spacing:.06em;text-transform:uppercase;border:1px solid transparent}.oc-human-gate-card.is-prepared header>span{color:var(--orange-active);background:var(--orange-soft);border-color:color-mix(in srgb,var(--orange) 35%,transparent)}.oc-human-gate-card.is-confirmed header>span,.oc-human-gate-card.is-dispatched header>span{color:var(--blue);background:color-mix(in srgb,var(--blue) 10%,transparent);border-color:color-mix(in srgb,var(--blue) 30%,transparent)}.oc-human-gate-card.is-consumed header>span{color:var(--green);background:color-mix(in srgb,var(--green) 10%,transparent);border-color:color-mix(in srgb,var(--green) 30%,transparent)}.oc-human-gate-card.is-stale header>span,.oc-human-gate-card.is-expired header>span,.oc-human-gate-card.is-error header>span{color:var(--red);background:color-mix(in srgb,var(--red) 8%,transparent);border-color:color-mix(in srgb,var(--red) 30%,transparent)}.oc-human-gate-card>p{margin:var(--space-3) 0 0;color:var(--body);font-size:var(--text-md);line-height:1.55}.oc-human-gate-card>div:has(>b){margin-top:var(--space-3);padding:var(--space-2) var(--space-3);border:1px solid var(--hairline);border-radius:var(--radius-md);background:var(--canvas-soft);font-size:var(--text-sm)}.oc-human-gate-challenges,.oc-human-gate-card ol{max-height:160px;overflow:auto}.oc-human-gate-card ul,.oc-human-gate-card ol{margin:var(--space-2) 0 0;padding-left:1.3em;color:var(--body)}.oc-human-gate-card footer{margin-top:var(--space-4);padding-top:var(--space-3);border-top:1px solid var(--hairline)}.oc-human-gate-card footer a{color:var(--muted);font-size:var(--text-sm);font-weight:600;text-decoration:none}.oc-human-gate-card footer a:hover{color:var(--orange-active);text-decoration:underline}.oc-human-gate-error{margin-top:var(--space-2);padding:var(--space-2) var(--space-3);border-radius:var(--radius-sm);background:color-mix(in srgb,var(--red) 8%,transparent);color:var(--red);font-size:var(--text-sm);font-weight:600}.oc-human-gate-card.is-confirmed{border-left-color:var(--blue)}.oc-human-gate-card.is-consumed{border-left-color:var(--green);box-shadow:var(--shadow-panel)}.oc-human-gate-card.is-stale,.oc-human-gate-card.is-expired,.oc-human-gate-card.is-error{border-left-color:var(--red)}.oc-task-context{margin:var(--space-3);padding:var(--space-3);border:1px solid var(--hairline);border-radius:var(--radius-lg);background:var(--surface)}.oc-task-context>header{display:flex;justify-content:space-between;gap:var(--space-2);align-items:center}.oc-task-context>header div{display:grid;gap:2px}.oc-task-context>header small,.oc-task-context>header span,.oc-task-context-empty{color:var(--muted)}.oc-task-context-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--space-2);margin-top:var(--space-3)}.oc-task-context-grid>div{display:grid;gap:4px;min-width:0;padding:var(--space-2);border:1px solid var(--hairline);border-radius:var(--radius-md);background:var(--canvas-soft)}.oc-task-context-grid span,.oc-task-context-grid small{overflow-wrap:anywhere}.oc-shortcut-palette{position:absolute;z-index:12;left:0;right:0;bottom:calc(100% + 8px);display:grid;padding:6px;border:1px solid var(--hairline);border-radius:var(--radius-lg);background:var(--surface);box-shadow:var(--shadow-soft)}.oc-shortcut-palette button{display:flex;gap:var(--space-3);align-items:center;border:0;border-radius:var(--radius-md);padding:9px 10px;color:inherit;background:transparent;text-align:left;min-height:0}.oc-shortcut-palette button:hover,.oc-shortcut-palette button.is-active{background:var(--surface-muted)}.oc-shortcut-palette button span{display:grid;gap:2px}.oc-shortcut-palette button small{color:var(--muted)}.oc-composer-inner{position:relative}@media(max-width:800px){.oc-task-context-grid{grid-template-columns:1fr}}.oc-file-palette{position:absolute;z-index:13;left:0;right:0;bottom:calc(100% + 8px);display:grid;max-height:240px;overflow:auto;padding:6px;border:1px solid var(--hairline);border-radius:var(--radius-lg);background:var(--surface);box-shadow:var(--shadow-soft)}.oc-file-palette button{border:0;padding:8px 10px;color:inherit;background:transparent;text-align:left;border-radius:var(--radius-md);min-height:0}.oc-file-palette button:hover{background:var(--surface-muted)}.oc-runtime-controls{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:8px}.oc-runtime-controls select{max-width:220px;min-height:30px;border:1px solid var(--hairline);border-radius:var(--radius-md);padding:0 var(--space-2);color:var(--body);background:var(--surface);font-size:var(--text-sm);transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.oc-runtime-controls select:hover{border-color:var(--hairline-strong)}.oc-runtime-controls select:focus-visible{outline:none;border-color:var(--orange);box-shadow:0 0 0 3px var(--orange-soft)}.oc-runtime-controls select.oc-model-select{max-width:min(100%,360px);font-family:var(--font-mono);font-size:var(--text-sm)}.oc-runtime-controls .oc-process-summary{margin-left:0}.oc-usage{color:var(--muted);font-size:var(--text-sm);font-variant-numeric:tabular-nums}.oc-runtime-context-menu{position:relative;margin-left:auto;flex-shrink:0}.oc-runtime-context-toggle.is-active{color:var(--orange-active);background:color-mix(in srgb,var(--orange) 10%,var(--surface))}.oc-runtime-context-panel{position:absolute;right:0;bottom:calc(100% + 8px);z-index:16;width:min(760px,calc(100vw - 24px));max-height:min(72vh,720px);display:flex;flex-direction:column;border:1px solid var(--hairline);border-radius:var(--radius-md);background:var(--surface);box-shadow:var(--shadow-soft);animation:panel-in .16s ease;overflow:hidden}.oc-runtime-context-head{display:flex;align-items:flex-start;gap:12px;flex-shrink:0;padding:12px 14px;border-bottom:1px solid var(--hairline);background:var(--surface-raised)}.oc-runtime-context-head-copy{flex:1;min-width:0;display:grid;gap:2px}.oc-runtime-context-head strong{font-size:14px}.oc-runtime-context-meta{font-size:11px;color:var(--muted)}.oc-runtime-context-close{flex-shrink:0;min-height:28px;padding:0 8px;font-size:12px}.oc-runtime-context-body{flex:1;min-height:0;overflow:auto;padding:12px 14px 14px;display:grid;gap:14px}.oc-runtime-context-chips{display:flex;flex-wrap:wrap;gap:6px}.oc-runtime-context-chip{display:inline-flex;align-items:center;gap:4px;max-width:100%;padding:4px 8px;border:1px solid var(--hairline);border-radius:999px;background:var(--canvas-soft);color:var(--body);font-size:11px;line-height:1.3}.oc-runtime-context-chip code{font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.oc-runtime-context-section{display:grid;gap:8px;min-width:0}.oc-runtime-context-section-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.oc-runtime-context-section-head strong{font-size:12px}.oc-runtime-context-hash{display:inline-block;margin-left:6px;font-size:11px;color:var(--muted)}.oc-runtime-context-text{margin:0;max-height:min(36vh,360px);overflow:auto;padding:10px 12px;border:1px solid var(--hairline);border-radius:var(--radius-sm);background:var(--canvas-soft);color:var(--body);font-size:12px;line-height:1.55;white-space:pre-wrap;overflow-wrap:anywhere}.oc-runtime-context-empty{margin:0;color:var(--muted);font-size:12px}.oc-runtime-context-skill-cards{margin:0;padding:0;list-style:none;display:grid;gap:8px}.oc-runtime-context-skill-cards details{border:1px solid var(--hairline);border-radius:var(--radius-sm);background:var(--surface-raised);overflow:hidden}.oc-runtime-context-skill-cards summary{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 10px;cursor:pointer;-webkit-user-select:none;user-select:none;font-size:12px}.oc-runtime-context-skill-cards summary span{color:var(--muted);font-variant-numeric:tabular-nums}.oc-runtime-context-skill-desc{margin:0;padding:0 10px 8px;color:var(--muted);font-size:12px;line-height:1.45}.oc-runtime-context-skill-cards .oc-runtime-context-text{max-height:min(28vh,280px);border-left:none;border-right:none;border-bottom:none;border-radius:0}.oc-runtime-context-tools{margin:0;padding:0;list-style:none;display:flex;flex-wrap:wrap;gap:6px}.oc-runtime-context-tools li code{display:inline-block;padding:3px 7px;border:1px solid var(--hairline);border-radius:6px;background:var(--canvas-soft);font-size:11px}.oc-runtime-context-raw{padding-top:10px;border-top:1px solid var(--hairline);font-size:12px;color:var(--muted)}.oc-runtime-context-raw summary{cursor:pointer;-webkit-user-select:none;user-select:none}.oc-runtime-context-raw pre{margin:8px 0 0;max-height:180px;overflow:auto;padding:8px;border:1px solid var(--hairline);border-radius:var(--radius-sm);background:var(--canvas-soft);font-size:11px;line-height:1.45;white-space:pre-wrap;overflow-wrap:anywhere}@media(max-width:800px){.oc-runtime-context-menu{margin-left:0;width:100%}.oc-runtime-context-panel{left:0;right:0;width:auto;max-height:min(78vh,680px)}}.oc-artifact-card{max-width:100%;margin:var(--space-3) 0;padding:var(--space-4);overflow:hidden;border:1px solid var(--hairline);border-radius:var(--radius-lg);background:var(--surface);box-shadow:var(--shadow-panel)}.oc-artifact-card header{display:flex;justify-content:space-between;align-items:center;gap:var(--space-3)}.oc-artifact-card header strong{font-size:var(--text-md);font-weight:700}.oc-artifact-card header>span{padding:2px 9px;border-radius:var(--radius-pill);background:var(--surface-muted);color:var(--muted);font-size:var(--text-xs);font-weight:700;letter-spacing:.05em;text-transform:uppercase}.oc-artifact-card pre{max-height:320px;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere;font-size:var(--text-xs)}.oc-artifact-card iframe{width:100%;min-height:280px;border:1px solid var(--hairline);border-radius:var(--radius-md);background:#fff}.oc-load-history{display:block;margin:var(--space-2) auto}.oc-attach-button{display:inline-flex;min-height:26px;align-items:center;padding:0 var(--space-2);border:1px solid var(--hairline);border-radius:var(--radius-pill);background:var(--surface);color:var(--muted);cursor:pointer;font-size:var(--text-sm);font-weight:600;transition:border-color var(--transition-fast),color var(--transition-fast),background-color var(--transition-fast)}.oc-attach-button:hover{border-color:var(--orange);color:var(--orange-active);background:var(--orange-soft)}.oc-composer-toolbar{display:flex;align-items:center;flex-wrap:wrap;gap:10px 14px;margin-bottom:6px;font-size:11.5px;color:var(--muted)}.oc-composer-toolbar .oc-attach-button{margin-bottom:0}.oc-attachment-list{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:6px}.oc-attachment-list span{display:inline-flex;align-items:center;gap:5px;max-width:100%;padding:4px 8px;border:1px solid var(--hairline);border-radius:999px;overflow-wrap:anywhere}.oc-attachment-list button{border:0;color:inherit;background:transparent;cursor:pointer}@media(max-width:640px){.oc-runtime-controls,.oc-composer-foot{align-items:stretch;flex-direction:column}.oc-runtime-controls select,.oc-runtime-controls button{width:100%;max-width:100%;min-height:44px}.oc-artifact-card{width:100%}.oc-composer{padding-inline:8px}}.night-workbench .night-health{margin:var(--space-4) 0;padding:var(--space-3) var(--space-4);border:1px solid var(--hairline);border-radius:var(--radius-lg);background:var(--surface);box-shadow:var(--shadow-sm)}.night-health-main{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2) var(--space-3)}.night-health-pill{display:inline-flex;align-items:center;gap:6px;padding:3px 12px;border-radius:var(--radius-pill);background:color-mix(in srgb,var(--green) 14%,white);color:var(--green);font-size:var(--text-sm);font-weight:700;letter-spacing:.02em}.night-health-pill:before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor}.night-health-pill.is-bad{background:color-mix(in srgb,var(--red) 14%,white);color:var(--red)}.night-health-hint{margin:var(--space-2) 0 0}.night-aux-ticker{margin-top:var(--space-3);padding-top:var(--space-3);border-top:1px solid var(--hairline)}.night-aux-ticker-label{margin:0;color:var(--body);font-size:var(--text-md)}.night-doctor-list{margin:var(--space-2) 0 0;padding-left:1.2em;color:var(--body);font-size:12.5px}.night-kpi{display:flex;flex-wrap:wrap;gap:var(--space-2);margin:var(--space-3) 0;color:var(--body);font-size:var(--text-md)}.night-kpi span{padding:4px 12px;border:1px solid var(--hairline);border-radius:var(--radius-pill);background:var(--canvas-soft);font-variant-numeric:tabular-nums;font-weight:600}.night-board,.night-wizard,.night-discard-card,.night-advanced{margin-top:var(--space-5)}.night-schedule-list{list-style:none;margin:0;padding:0;display:grid;gap:var(--space-3)}.night-schedule-row{padding:var(--space-3) var(--space-4);border:1px solid var(--hairline);border-radius:var(--radius-lg);background:var(--surface);transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.night-schedule-row:hover{border-color:var(--hairline-strong);box-shadow:var(--shadow-panel)}.night-schedule-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--space-2)}.night-status-chip{padding:2px 10px;border-radius:var(--radius-pill);background:color-mix(in srgb,var(--blue) 10%,transparent);border:1px solid color-mix(in srgb,var(--blue) 25%,transparent);font-size:var(--text-xs);color:var(--blue);font-weight:700;letter-spacing:.03em}.night-schedule-row[data-status=failed] .night-status-chip,.night-schedule-row[data-status=human_required] .night-status-chip{color:var(--red);background:color-mix(in srgb,var(--red) 8%,transparent);border-color:color-mix(in srgb,var(--red) 28%,transparent)}.night-schedule-row[data-status=succeeded] .night-status-chip{color:var(--green);background:color-mix(in srgb,var(--green) 10%,transparent);border-color:color-mix(in srgb,var(--green) 28%,transparent)}.night-schedule-row[data-status=running] .night-status-chip,.night-schedule-row[data-status=dispatching] .night-status-chip{color:var(--orange-active);background:var(--orange-soft);border-color:color-mix(in srgb,var(--orange) 30%,transparent)}.night-next-action{font-size:var(--text-sm);overflow-wrap:anywhere}.night-review-card,.night-discard-card{padding:var(--space-4) var(--space-5);border:1px solid var(--hairline-strong);border-radius:var(--radius-lg);background:var(--canvas-soft)}.night-writeset{margin:0;padding-left:1.1em}.night-advanced{border-top:1px solid var(--hairline);padding-top:var(--space-3)}.night-advanced summary{cursor:pointer;color:var(--body);font-weight:600}.checkbox-field{display:flex;align-items:center;gap:var(--space-2)}.models-page .panel-lead{margin-top:var(--space-2)}.models-header{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2) var(--space-3)}.models-header h2{margin:0}.models-status-pill{display:inline-flex;align-items:center;gap:6px;padding:4px 14px;border-radius:var(--radius-pill);font-size:var(--text-sm);font-weight:700;letter-spacing:.02em}.models-status-pill:before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor}.models-status-pill[data-state=ready]{background:color-mix(in srgb,var(--green) 14%,white);color:var(--green)}.models-status-pill[data-state=setup-required]{background:color-mix(in srgb,var(--red) 14%,white);color:var(--red)}.models-status-pill[data-state=degraded]{background:color-mix(in srgb,var(--orange) 16%,white);color:var(--orange-active)}.models-status-pill[data-state=unknown]{background:var(--canvas-soft);color:var(--muted)}.models-subtitle{margin:0 0 var(--space-2);font-size:var(--text-md);font-weight:700;color:var(--ink)}.models-probe-card,.models-setup-card,.models-blocked-card{margin-top:var(--space-4);padding:var(--space-3) var(--space-4);border:1px solid var(--hairline);border-radius:var(--radius-md);background:color-mix(in srgb,var(--surface) 55%,transparent)}.models-probe-list{list-style:none;margin:0;padding:0;display:grid;gap:var(--space-2)}.models-probe-item{display:grid;grid-template-columns:28px 1fr;gap:var(--space-2);align-items:start;padding:var(--space-2) 0;border-bottom:1px solid var(--hairline)}.models-probe-item:last-child{border-bottom:none;padding-bottom:0}.models-probe-badge{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:50%;font-size:14px;font-weight:800;line-height:1;background:var(--canvas-soft);color:var(--muted)}.models-probe-item.is-ok .models-probe-badge{background:color-mix(in srgb,var(--green) 16%,white);color:var(--green)}.models-probe-item.is-bad .models-probe-badge{background:color-mix(in srgb,var(--red) 14%,white);color:var(--red)}.models-probe-body{display:grid;gap:2px;min-width:0}.models-probe-body strong{font-size:var(--text-md);color:var(--ink)}.models-probe-body .muted{font-size:var(--text-sm)}.models-probe-detail{margin:var(--space-1) 0 0;font-size:var(--text-sm);color:var(--body);line-height:1.45}.models-setup-steps{margin:0 0 var(--space-3);padding-left:1.25em;color:var(--body);font-size:var(--text-md);line-height:1.5}.models-setup-steps li+li{margin-top:var(--space-2)}.models-degraded-note{margin:var(--space-4) 0 0;padding:var(--space-3) var(--space-4);border-radius:var(--radius-md);border:1px solid color-mix(in srgb,var(--orange) 35%,var(--hairline));background:color-mix(in srgb,var(--orange) 8%,white);color:var(--body);font-size:var(--text-md)}.models-blocked-list{margin:0;padding:0;list-style:none;display:flex;flex-wrap:wrap;gap:var(--space-2)}.models-blocked-list li{padding:4px 10px;border-radius:var(--radius-pill);border:1px solid var(--hairline);background:var(--surface)}.models-actions{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-3);margin-top:var(--space-4)}.models-generated-at{font-size:var(--text-sm)}.models-raw-details{margin-top:var(--space-4);font-size:var(--text-sm);color:var(--muted)}.models-raw-details summary{cursor:pointer;font-weight:600;color:var(--body)}.models-raw-json{margin-top:var(--space-2);max-height:240px;overflow:auto}