@sapiom/harness 0.1.6 → 0.2.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 (185) hide show
  1. package/CHANGELOG.md +90 -0
  2. package/dist/cli/args.d.ts +16 -0
  3. package/dist/cli/args.d.ts.map +1 -0
  4. package/dist/cli/args.js +80 -0
  5. package/dist/cli/args.js.map +1 -0
  6. package/dist/cli/bin.js +12 -65
  7. package/dist/cli/bin.js.map +1 -1
  8. package/dist/cli/settings.d.ts.map +1 -1
  9. package/dist/cli/settings.js +33 -1
  10. package/dist/cli/settings.js.map +1 -1
  11. package/dist/core/adapters/claude-code.d.ts +60 -2
  12. package/dist/core/adapters/claude-code.d.ts.map +1 -1
  13. package/dist/core/adapters/claude-code.js +119 -32
  14. package/dist/core/adapters/claude-code.js.map +1 -1
  15. package/dist/core/adapters/codex.d.ts +21 -2
  16. package/dist/core/adapters/codex.d.ts.map +1 -1
  17. package/dist/core/adapters/codex.js +53 -2
  18. package/dist/core/adapters/codex.js.map +1 -1
  19. package/dist/core/adapters/detect.d.ts +9 -0
  20. package/dist/core/adapters/detect.d.ts.map +1 -1
  21. package/dist/core/adapters/detect.js +9 -0
  22. package/dist/core/adapters/detect.js.map +1 -1
  23. package/dist/core/canvas-body.d.ts +28 -28
  24. package/dist/core/canvas-body.d.ts.map +1 -1
  25. package/dist/core/canvas-body.js +117 -55
  26. package/dist/core/canvas-body.js.map +1 -1
  27. package/dist/core/canvas-derive.d.ts +43 -0
  28. package/dist/core/canvas-derive.d.ts.map +1 -0
  29. package/dist/core/canvas-derive.js +95 -0
  30. package/dist/core/canvas-derive.js.map +1 -0
  31. package/dist/core/canvas-enrichment.d.ts +52 -127
  32. package/dist/core/canvas-enrichment.d.ts.map +1 -1
  33. package/dist/core/canvas-enrichment.js +17 -178
  34. package/dist/core/canvas-enrichment.js.map +1 -1
  35. package/dist/core/canvas-graph.d.ts +40 -1
  36. package/dist/core/canvas-graph.d.ts.map +1 -1
  37. package/dist/core/canvas-graph.js +71 -9
  38. package/dist/core/canvas-graph.js.map +1 -1
  39. package/dist/core/canvas-interconnections.d.ts +26 -8
  40. package/dist/core/canvas-interconnections.d.ts.map +1 -1
  41. package/dist/core/canvas-interconnections.js +132 -24
  42. package/dist/core/canvas-interconnections.js.map +1 -1
  43. package/dist/core/canvas-manifest-check.d.ts.map +1 -1
  44. package/dist/core/canvas-manifest-check.js +15 -2
  45. package/dist/core/canvas-manifest-check.js.map +1 -1
  46. package/dist/core/canvas-render.d.ts +8 -15
  47. package/dist/core/canvas-render.d.ts.map +1 -1
  48. package/dist/core/canvas-render.js +29 -41
  49. package/dist/core/canvas-render.js.map +1 -1
  50. package/dist/core/canvas-run-state.d.ts +41 -0
  51. package/dist/core/canvas-run-state.d.ts.map +1 -1
  52. package/dist/core/canvas-run-state.js +136 -0
  53. package/dist/core/canvas-run-state.js.map +1 -1
  54. package/dist/core/canvas-svg.d.ts +9 -4
  55. package/dist/core/canvas-svg.d.ts.map +1 -1
  56. package/dist/core/canvas-svg.js +84 -13
  57. package/dist/core/canvas-svg.js.map +1 -1
  58. package/dist/core/canvas-template.d.ts +9 -10
  59. package/dist/core/canvas-template.d.ts.map +1 -1
  60. package/dist/core/canvas-template.js +57 -20
  61. package/dist/core/canvas-template.js.map +1 -1
  62. package/dist/core/canvas-watcher.d.ts +22 -1
  63. package/dist/core/canvas-watcher.d.ts.map +1 -1
  64. package/dist/core/canvas-watcher.js +111 -30
  65. package/dist/core/canvas-watcher.js.map +1 -1
  66. package/dist/core/collector/normalizer.d.ts +8 -0
  67. package/dist/core/collector/normalizer.d.ts.map +1 -1
  68. package/dist/core/collector/normalizer.js +8 -0
  69. package/dist/core/collector/normalizer.js.map +1 -1
  70. package/dist/core/collector/store.d.ts +75 -1
  71. package/dist/core/collector/store.d.ts.map +1 -1
  72. package/dist/core/collector/store.js +334 -2
  73. package/dist/core/collector/store.js.map +1 -1
  74. package/dist/core/errors.d.ts +10 -4
  75. package/dist/core/errors.d.ts.map +1 -1
  76. package/dist/core/errors.js +11 -5
  77. package/dist/core/errors.js.map +1 -1
  78. package/dist/core/example-seed.d.ts +8 -0
  79. package/dist/core/example-seed.d.ts.map +1 -1
  80. package/dist/core/example-seed.js +47 -10
  81. package/dist/core/example-seed.js.map +1 -1
  82. package/dist/core/inject/system-prompt.d.ts +8 -0
  83. package/dist/core/inject/system-prompt.d.ts.map +1 -1
  84. package/dist/core/inject/system-prompt.js +3 -1
  85. package/dist/core/inject/system-prompt.js.map +1 -1
  86. package/dist/core/macros.d.ts.map +1 -1
  87. package/dist/core/macros.js +5 -6
  88. package/dist/core/macros.js.map +1 -1
  89. package/dist/core/paths.d.ts +1 -0
  90. package/dist/core/paths.d.ts.map +1 -1
  91. package/dist/core/paths.js +1 -0
  92. package/dist/core/paths.js.map +1 -1
  93. package/dist/core/record-archive.d.ts +187 -0
  94. package/dist/core/record-archive.d.ts.map +1 -0
  95. package/dist/core/record-archive.js +465 -0
  96. package/dist/core/record-archive.js.map +1 -0
  97. package/dist/core/rehydration.d.ts +72 -0
  98. package/dist/core/rehydration.d.ts.map +1 -0
  99. package/dist/core/rehydration.js +72 -0
  100. package/dist/core/rehydration.js.map +1 -0
  101. package/dist/core/resume-brief.d.ts +130 -0
  102. package/dist/core/resume-brief.d.ts.map +1 -0
  103. package/dist/core/resume-brief.js +404 -0
  104. package/dist/core/resume-brief.js.map +1 -0
  105. package/dist/core/rolling-summary.d.ts +130 -0
  106. package/dist/core/rolling-summary.d.ts.map +1 -0
  107. package/dist/core/rolling-summary.js +227 -0
  108. package/dist/core/rolling-summary.js.map +1 -0
  109. package/dist/core/session-manager.d.ts +11 -3
  110. package/dist/core/session-manager.d.ts.map +1 -1
  111. package/dist/core/session-manager.js +56 -7
  112. package/dist/core/session-manager.js.map +1 -1
  113. package/dist/core/session-record.d.ts +165 -0
  114. package/dist/core/session-record.d.ts.map +1 -0
  115. package/dist/core/session-record.js +470 -0
  116. package/dist/core/session-record.js.map +1 -0
  117. package/dist/core/spawn-target.d.ts +12 -0
  118. package/dist/core/spawn-target.d.ts.map +1 -0
  119. package/dist/core/spawn-target.js +187 -0
  120. package/dist/core/spawn-target.js.map +1 -0
  121. package/dist/core/task-manager.d.ts.map +1 -1
  122. package/dist/core/task-manager.js +9 -1
  123. package/dist/core/task-manager.js.map +1 -1
  124. package/dist/core/template-catalog.d.ts +48 -0
  125. package/dist/core/template-catalog.d.ts.map +1 -0
  126. package/dist/core/template-catalog.js +338 -0
  127. package/dist/core/template-catalog.js.map +1 -0
  128. package/dist/core/workflow-registry.d.ts.map +1 -1
  129. package/dist/core/workflow-registry.js +2 -2
  130. package/dist/core/workflow-registry.js.map +1 -1
  131. package/dist/core/workspace-watcher.d.ts.map +1 -1
  132. package/dist/core/workspace-watcher.js +4 -3
  133. package/dist/core/workspace-watcher.js.map +1 -1
  134. package/dist/index.d.ts +12 -0
  135. package/dist/index.d.ts.map +1 -1
  136. package/dist/index.js +21 -0
  137. package/dist/index.js.map +1 -1
  138. package/dist/profiles/default.d.ts.map +1 -1
  139. package/dist/profiles/default.js +9 -14
  140. package/dist/profiles/default.js.map +1 -1
  141. package/dist/server/canvas.d.ts.map +1 -1
  142. package/dist/server/canvas.js +7 -7
  143. package/dist/server/canvas.js.map +1 -1
  144. package/dist/server/fs.d.ts.map +1 -1
  145. package/dist/server/fs.js +17 -1
  146. package/dist/server/fs.js.map +1 -1
  147. package/dist/server/index.d.ts +12 -3
  148. package/dist/server/index.d.ts.map +1 -1
  149. package/dist/server/index.js +321 -50
  150. package/dist/server/index.js.map +1 -1
  151. package/dist/server/ingest.d.ts +11 -0
  152. package/dist/server/ingest.d.ts.map +1 -1
  153. package/dist/server/ingest.js +1 -0
  154. package/dist/server/ingest.js.map +1 -1
  155. package/dist/server/macros.d.ts +4 -6
  156. package/dist/server/macros.d.ts.map +1 -1
  157. package/dist/server/macros.js.map +1 -1
  158. package/dist/server/rest.d.ts +18 -6
  159. package/dist/server/rest.d.ts.map +1 -1
  160. package/dist/server/rest.js +185 -48
  161. package/dist/server/rest.js.map +1 -1
  162. package/dist/server/templates.d.ts +24 -0
  163. package/dist/server/templates.d.ts.map +1 -0
  164. package/dist/server/templates.js +54 -0
  165. package/dist/server/templates.js.map +1 -0
  166. package/dist/shared/types.d.ts +477 -29
  167. package/dist/shared/types.d.ts.map +1 -1
  168. package/dist/shared/types.js +19 -11
  169. package/dist/shared/types.js.map +1 -1
  170. package/dist/web/assets/index-DC65cskq.js +446 -0
  171. package/dist/web/assets/index-xtD-3FFa.css +32 -0
  172. package/dist/web/index.html +2 -2
  173. package/package.json +5 -4
  174. package/dist/core/canvas-enrich.d.ts +0 -115
  175. package/dist/core/canvas-enrich.d.ts.map +0 -1
  176. package/dist/core/canvas-enrich.js +0 -186
  177. package/dist/core/canvas-enrich.js.map +0 -1
  178. package/dist/profiles/canvas-guidelines.d.ts +0 -20
  179. package/dist/profiles/canvas-guidelines.d.ts.map +0 -1
  180. package/dist/profiles/canvas-guidelines.js +0 -48
  181. package/dist/profiles/canvas-guidelines.js.map +0 -1
  182. package/dist/web/assets/index-DCtyI4VW.css +0 -32
  183. package/dist/web/assets/index-WSw5RvYR.js +0 -445
  184. package/dist/web/welcome-hero-dark.png +0 -0
  185. package/dist/web/welcome-hero-light.png +0 -0
@@ -1,186 +0,0 @@
1
- import { extractWorkflowGraphCached, invalidateExtractionCache } from "./canvas-cache.js";
2
- import { ENRICHMENT_LIMITS, normalizeCanvasEnrichmentCandidate, parseCanvasEnrichment, readEnrichmentCacheFile, removeEnrichmentCacheFile, writeEnrichmentCacheFile, } from "./canvas-enrichment.js";
3
- import { enrichmentCacheFileFor, renderWorkflowRenderFile, } from "./canvas-render.js";
4
- import { TaskAlreadyRunningError, TaskNotSupportedError } from "./task-manager.js";
5
- /** The macro identity enrichment tasks run under — the pane's Retry re-fires
6
- * this macro, which routes back through forceRefresh. */
7
- export const ENRICHMENT_MACRO_ID = "visualize";
8
- const ENRICHMENT_TASK_LABEL = "Visualize";
9
- /** Hard turn cap: read a few step files, answer. A run that needs more than
10
- * this is off the rails, not thorough. */
11
- const ENRICHMENT_MAX_TURNS = 8;
12
- const DEFAULT_ENRICHMENT_MODEL = "sonnet";
13
- /** Model the enrichment task runs on — overridable per install. */
14
- export function enrichmentModel(env = process.env) {
15
- return env.SAPIOM_HARNESS_VISUALIZE_MODEL || DEFAULT_ENRICHMENT_MODEL;
16
- }
17
- /**
18
- * Builds the one-shot enrichment prompt: the extracted graph inline (the AI
19
- * annotates THIS structure — it never invents nodes), pointed at the step
20
- * sources for semantics, with the JSON contract and its hard limits stated
21
- * verbatim so a well-behaved run needs no retry.
22
- */
23
- export function buildEnrichmentPrompt(graph, workflowDir) {
24
- const L = ENRICHMENT_LIMITS;
25
- return `You are annotating an already-rendered workflow diagram. The diagram's structure below is fixed — you only supply short text annotations, as one JSON object.
26
-
27
- Extracted workflow graph:
28
- ${JSON.stringify(graph, null, 2)}
29
-
30
- Read the step run() bodies in ${workflowDir} to understand what each step actually does (what it calls, what it decides, why it branches), then RETURN ONLY a JSON object matching this schema — no prose before or after, no markdown required, and DO NOT write or modify any files:
31
-
32
- {
33
- "summary": "what this workflow does, one line (max ${L.summary} chars)",
34
- "nodeDetails": { "<nodeId>": { "sublabel": "short annotation shown in the node (max ${L.sublabel} chars)", "description": "one sentence, shown on hover (max ${L.description} chars)" } },
35
- "edgeLabels": { "<fromNodeId>-><toNodeId>": "intent/condition name (max ${L.edgeLabel} chars)" },
36
- "notes": ["up to ${L.noteCount} facts worth knowing, each max ${L.note} chars"],
37
- "layoutHints": { "groups": [{ "label": "group name (max ${L.groupLabel} chars)", "nodeIds": ["..."] }], "laneOrder": { "<layerIndex>": ["nodeId", "..."] } },
38
- "crossWorkflow": "how this workflow ties into the project's other workflows, if it does (max ${L.crossWorkflow} chars)"
39
- }
40
-
41
- Rules:
42
- - Every field is optional — omit what you have nothing useful for (omit, don't write null). Empty strings are worse than omissions.
43
- - Use ONLY node ids that appear in the graph above.
44
- - Length limits are hard caps and oversize strings get truncated mid-sentence — aim comfortably under each limit.
45
- - Your final message must be exactly the JSON object.`;
46
- }
47
- /**
48
- * Pulls the JSON object out of a task's final result text — either fenced
49
- * (\`\`\`json ... \`\`\`) or raw, tolerating prose around it by falling back to
50
- * the outermost {...} span. Null when nothing parses.
51
- */
52
- export function extractEnrichmentJson(text) {
53
- const fenced = /```(?:json)?\s*([\s\S]*?)```/.exec(text);
54
- const candidates = [fenced?.[1], text];
55
- const first = text.indexOf("{");
56
- const last = text.lastIndexOf("}");
57
- if (first !== -1 && last > first)
58
- candidates.push(text.slice(first, last + 1));
59
- for (const candidate of candidates) {
60
- if (!candidate)
61
- continue;
62
- try {
63
- const parsed = JSON.parse(candidate.trim());
64
- if (typeof parsed === "object" && parsed !== null)
65
- return parsed;
66
- }
67
- catch {
68
- // Try the next candidate shape.
69
- }
70
- }
71
- return null;
72
- }
73
- export class CanvasEnrichmentCoordinator {
74
- constructor(options) {
75
- this.tasks = options.tasks;
76
- this.rerender = options.rerender ?? (async (cwd, workflow) => void (await renderWorkflowRenderFile(cwd, workflow)));
77
- this.extractCached = options.extractCached ?? extractWorkflowGraphCached;
78
- this.env = options.env ?? process.env;
79
- this.now = options.now ?? (() => new Date().toISOString());
80
- this.onError = options.onError ?? ((message) => console.error(`[harness] ${message}`));
81
- }
82
- /**
83
- * The bind/create trigger: spawn an enrichment task unless a cached
84
- * enrichment already matches the workflow's current sources. Silent on
85
- * every expected refusal — unbound session, failed extraction, fresh
86
- * cache, an enrichment already in flight for this workflow, a harness
87
- * with no headless mode, even a spawn failure (logged) — because nothing
88
- * here was user-initiated and a bind must never fail on enrichment's
89
- * account.
90
- */
91
- async ensureFresh(session, workflows) {
92
- const bound = this.resolveBound(session, workflows);
93
- if (!bound)
94
- return;
95
- try {
96
- const { result, fingerprint } = await this.extractCached(bound.path);
97
- if (!result.ok)
98
- return;
99
- const entry = await readEnrichmentCacheFile(enrichmentCacheFileFor(session.cwd, bound.path));
100
- if (entry && entry.sourceFingerprint === fingerprint)
101
- return;
102
- await this.spawn(session, bound, result.graph, fingerprint);
103
- }
104
- catch (err) {
105
- if (err instanceof TaskAlreadyRunningError || err instanceof TaskNotSupportedError)
106
- return;
107
- this.onError(`canvas enrichment (auto) failed to start: ${err.message}`);
108
- }
109
- }
110
- /**
111
- * The visualize macro: invalidate both caches, re-render the base diagram
112
- * immediately (instant feedback, honest content — no leftover enrichment
113
- * from sources that may have changed), then re-enrich. Refusals propagate
114
- * to the macros router (TaskAlreadyRunningError → 409,
115
- * TaskNotSupportedError → 400). Unbound session: just a no-op, matching
116
- * the deterministic render's own unbound contract.
117
- *
118
- * The already-running check happens BEFORE any cache destruction so that a
119
- * double-click Visualize is a true no-op: the second call rejects with
120
- * TaskAlreadyRunningError and the caches and render are left exactly as
121
- * the still-running enrichment will need them.
122
- */
123
- async forceRefresh(session, workflows) {
124
- const bound = this.resolveBound(session, workflows);
125
- if (!bound)
126
- return;
127
- if (this.tasks.isRunning(ENRICHMENT_MACRO_ID, bound.path)) {
128
- throw new TaskAlreadyRunningError(ENRICHMENT_TASK_LABEL);
129
- }
130
- invalidateExtractionCache(bound.path);
131
- await removeEnrichmentCacheFile(enrichmentCacheFileFor(session.cwd, bound.path));
132
- await this.rerender(session.cwd, bound);
133
- const { result, fingerprint } = await this.extractCached(bound.path);
134
- if (!result.ok)
135
- return;
136
- await this.spawn(session, bound, result.graph, fingerprint);
137
- }
138
- resolveBound(session, workflows) {
139
- return session.boundWorkflowPath ? workflows.find((w) => w.path === session.boundWorkflowPath) : undefined;
140
- }
141
- async spawn(session, workflow, graph, fingerprint) {
142
- const task = await this.tasks.run({
143
- macroId: ENRICHMENT_MACRO_ID,
144
- label: ENRICHMENT_TASK_LABEL,
145
- harnessSessionId: session.id,
146
- harness: session.harness,
147
- cwd: session.cwd,
148
- prompt: buildEnrichmentPrompt(graph, workflow.path),
149
- workflowPath: workflow.path,
150
- model: enrichmentModel(this.env),
151
- maxTurns: ENRICHMENT_MAX_TURNS,
152
- });
153
- // Subscribed synchronously right after run() resolves — the process's
154
- // exit can only arrive via a later event-loop turn, so the terminal
155
- // status can't be missed.
156
- const unsubscribe = this.tasks.onStatusChange((update) => {
157
- if (update.id !== task.id || update.status === "running")
158
- return;
159
- unsubscribe();
160
- if (update.status !== "completed")
161
- return; // pane shows the failure; nothing to persist
162
- void this.persist(session.cwd, workflow, graph, fingerprint, update.resultText).catch((err) => {
163
- this.onError(`canvas enrichment persist failed: ${err.message}`);
164
- });
165
- });
166
- }
167
- /** Completed task → parse → validate → cache file → re-render. Any parse
168
- * or validation failure discards the enrichment whole; the base render
169
- * already on disk stands untouched. */
170
- async persist(cwd, workflow, graph, fingerprint, resultText) {
171
- const candidate = resultText ? extractEnrichmentJson(resultText) : null;
172
- const enrichment = candidate ? parseCanvasEnrichment(normalizeCanvasEnrichmentCandidate(candidate)) : null;
173
- if (!enrichment) {
174
- this.onError(`canvas enrichment for ${workflow.path} returned invalid output — discarded, base render stands`);
175
- return;
176
- }
177
- await writeEnrichmentCacheFile(enrichmentCacheFileFor(cwd, workflow.path), {
178
- graph,
179
- enrichment,
180
- sourceFingerprint: fingerprint,
181
- enrichedAt: this.now(),
182
- });
183
- await this.rerender(cwd, workflow);
184
- }
185
- }
186
- //# sourceMappingURL=canvas-enrich.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"canvas-enrich.js","sourceRoot":"","sources":["../../src/core/canvas-enrich.ts"],"names":[],"mappings":"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"}
@@ -1,20 +0,0 @@
1
- /**
2
- * Canvas style contract: injected everywhere an agent is asked to write to
3
- * `.sapiom/canvas/index.html` (the Visualize macro's inject text, and the
4
- * system prompt's canvas paragraph for freeform "show me X" asks), so every
5
- * generated canvas looks Sapiom-native regardless of which prompt triggered
6
- * it. Kept prompt-sized on purpose — this rides in prompts, not docs.
7
- *
8
- * Colors are the harness's own dark-theme tokens (web/src/styles.css,
9
- * `[data-theme="dark"]`) — dark is the canonical canvas look. Structural
10
- * conventions (rounded nodes with a uniform glow, straight-then-curved
11
- * arrowed edges, stats header, legend footer) mirror what
12
- * scripts/seed-example.mjs's reference canvas already renders; this doesn't
13
- * change that seed, just documents its pattern for agents generating new
14
- * ones. Edge/glow/legend wording tightened after a live Visualize proof
15
- * (see PR history) surfaced ambiguities two different agent runs resolved
16
- * inconsistently — see git blame for the before/after if the wording here
17
- * ever seems oddly specific.
18
- */
19
- export declare const CANVAS_STYLE_GUIDELINES: string;
20
- //# sourceMappingURL=canvas-guidelines.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"canvas-guidelines.d.ts","sourceRoot":"","sources":["../../src/profiles/canvas-guidelines.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,uBAAuB,QA4B5B,CAAC"}
@@ -1,48 +0,0 @@
1
- /**
2
- * Canvas style contract: injected everywhere an agent is asked to write to
3
- * `.sapiom/canvas/index.html` (the Visualize macro's inject text, and the
4
- * system prompt's canvas paragraph for freeform "show me X" asks), so every
5
- * generated canvas looks Sapiom-native regardless of which prompt triggered
6
- * it. Kept prompt-sized on purpose — this rides in prompts, not docs.
7
- *
8
- * Colors are the harness's own dark-theme tokens (web/src/styles.css,
9
- * `[data-theme="dark"]`) — dark is the canonical canvas look. Structural
10
- * conventions (rounded nodes with a uniform glow, straight-then-curved
11
- * arrowed edges, stats header, legend footer) mirror what
12
- * scripts/seed-example.mjs's reference canvas already renders; this doesn't
13
- * change that seed, just documents its pattern for agents generating new
14
- * ones. Edge/glow/legend wording tightened after a live Visualize proof
15
- * (see PR history) surfaced ambiguities two different agent runs resolved
16
- * inconsistently — see git blame for the before/after if the wording here
17
- * ever seems oddly specific.
18
- */
19
- export const CANVAS_STYLE_GUIDELINES = `
20
- Canvas style contract (.sapiom/canvas/index.html):
21
- - One self-contained HTML file: inline all CSS/JS, no external stylesheets/
22
- scripts or CDN fonts (the CSP blocks them) — no build step, no dependencies.
23
- - Dark theme, Sapiom palette: background #0f0f0f, panel #1a1a1a, border
24
- #2e2e2e, text #fafafa, dim text #a1a1aa, accent/success #6be195, escalation
25
- #f59e0b, failure #f87171.
26
- - Monospace throughout: ui-monospace, "SF Mono", Menlo, Consolas, monospace.
27
- - Header: title + short status badge, one-line subtitle, and a stats row
28
- (e.g. step count, terminal-outcome count, branch count) as label/value pairs.
29
- - Render the workflow as an inline SVG graph, top-to-bottom: rounded-rect
30
- nodes (12-16px radius). Every node gets the same subtle glow on its
31
- border — never reserve the glow for entry/terminal nodes only; role and
32
- outcome are conveyed by border/stroke color, not by which nodes glow.
33
- - Edges: straight lines with arrowhead markers for a single-successor step,
34
- curved paths with arrowhead markers only where a step branches into
35
- multiple successors — don't curve every edge, that reads as noise on a
36
- simple linear chain.
37
- - Color-code terminal outcomes by meaning: accent/green = success, amber =
38
- escalation/needs-attention, red = failure. Reserve those colors for actual
39
- terminal branches, not regular steps.
40
- - Footer legend: one visually distinct marker per node kind used (shape
41
- and/or fill vs. outline — never reuse the identical marker for two
42
- different kinds just because they happen to share a color) + label, plus
43
- a short note that this is a static preview to regenerate after the
44
- workflow changes.
45
- - Prefer clarity over decoration: no motion, gradients, or ornamentation that
46
- doesn't help someone understand the graph's structure in a few seconds.
47
- `.trim();
48
- //# sourceMappingURL=canvas-guidelines.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"canvas-guidelines.js","sourceRoot":"","sources":["../../src/profiles/canvas-guidelines.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BtC,CAAC,IAAI,EAAE,CAAC"}
@@ -1,32 +0,0 @@
1
- /**
2
- * Copyright (c) 2014 The xterm.js authors. All rights reserved.
3
- * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
4
- * https://github.com/chjj/term.js
5
- * @license MIT
6
- *
7
- * Permission is hereby granted, free of charge, to any person obtaining a copy
8
- * of this software and associated documentation files (the "Software"), to deal
9
- * in the Software without restriction, including without limitation the rights
10
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
- * copies of the Software, and to permit persons to whom the Software is
12
- * furnished to do so, subject to the following conditions:
13
- *
14
- * The above copyright notice and this permission notice shall be included in
15
- * all copies or substantial portions of the Software.
16
- *
17
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
- * THE SOFTWARE.
24
- *
25
- * Originally forked from (with the author's permission):
26
- * Fabrice Bellard's javascript vt100 for jslinux:
27
- * http://bellard.org/jslinux/
28
- * Copyright (c) 2011 Fabrice Bellard
29
- * The original design remains. The terminal itself
30
- * has been extended to include xterm CSI codes, among
31
- * other features.
32
- */.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}:root,[data-theme=dark]{color-scheme:dark;--bg: #0c0c0e;--list: #0e0e11;--s1: #131316;--s2: #1a1a1e;--s3: #232327;--line: rgba(255, 255, 255, .08);--line-2: rgba(255, 255, 255, .14);--hl: rgba(255, 255, 255, .05);--hl-2: rgba(255, 255, 255, .1);--ink: #f3f3f5;--ink-muted: #a6a6ae;--ink-faint: #83838d;--btn: #f3f3f5;--btn-ink: #0c0c0e;--red: #e05a57;--red-text: #efa6a3;--amber: #d99a34;--amber-text: #e8c58a;--green: #3bb56f;--green-text: #8fdcac;--slate: #8a8a94;--shadow: 0 24px 64px -20px rgba(0, 0, 0, .6);--scrim-bg: rgba(4, 4, 6, .55)}[data-theme=light]{color-scheme:light;--bg: #fbfbfc;--list: #f3f3f5;--s1: #ffffff;--s2: #f2f2f4;--s3: #eaeaee;--line: rgba(18, 18, 22, .08);--line-2: rgba(18, 18, 22, .15);--hl: rgba(18, 18, 22, .04);--hl-2: rgba(18, 18, 22, .075);--ink: #16161a;--ink-muted: #55555f;--ink-faint: #6b6b75;--btn: #16161a;--btn-ink: #ffffff;--red: #cf3d39;--red-text: #ab2925;--amber: #b57a12;--amber-text: #855700;--green: #219d57;--green-text: #0f7740;--slate: #77777f;--shadow: 0 24px 64px -28px rgba(20, 20, 28, .28);--scrim-bg: rgba(24, 24, 30, .32)}:root,[data-theme=dark],[data-theme=light]{--background: var(--bg);--foreground: var(--ink);--card: var(--s1);--card-foreground: var(--ink);--popover: var(--s1);--popover-foreground: var(--ink);--muted: var(--s2);--muted-foreground: var(--ink-muted);--border-soft: var(--line);--border-strong: var(--line-2);--border: var(--border-soft);--input: var(--border-soft);--ring: var(--ink-muted);--primary: var(--btn);--primary-foreground: var(--btn-ink);--secondary: var(--s2);--secondary-foreground: var(--ink);--accent: var(--hl-2);--accent-foreground: var(--ink);--destructive: var(--red);--destructive-foreground: var(--btn-ink)}:root{--font: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--mono: ui-monospace, "SF Mono", Menlo, Consolas, monospace;--type-title: 1.5rem;--type-h2: 1rem;--type-metric: 1.5rem;--type-body: 14px;--type-ui: 13px;--type-label: 12px;--type-meta: 11px;--type-micro: 10px;--sp1: 4px;--sp2: 8px;--sp3: 12px;--sp4: 16px;--sp5: 24px;--sp6: 32px;--sp7: 48px;--sp8: 64px;--r-sm: 6px;--r: 10px;--r-lg: 14px;--r-xl: 16px;--radius: var(--r);--header-h: 56px;--pane-header-h: var(--header-h);--control-h: 40px;--control-h-sm: 36px;--control-h-xs: 32px;--row-h: 56px;--row-h-sm: 48px;--row-h-xs: 40px;--icon: 40px;--icon-sm: 32px;--icon-lg: 44px;--card-pad: clamp(20px, 2vw, 28px);--assistant-measure: 52rem;--assistant-measure-ide: 40.625rem;--assistant-textarea-min: 64px;--command-input-h: var(--row-h);--command-row-h: var(--row-h-sm);--overlay-radius: calc(var(--r-xl) + 12px);--ui-line: var(--border-soft);--ui-line-strong: var(--border-strong);--active-shade: color-mix(in srgb, var(--ink) 8%, transparent);--nested-shade: color-mix(in srgb, var(--ink) 11%, transparent);--surface-base: var(--bg);--surface-raised: var(--s1);--surface-inset: var(--s2);--surface-hover: var(--hl);--surface-selected: var(--active-shade);--flow-grid-dot: color-mix(in srgb, var(--ink) 22%, transparent);--table-indent: calc(var(--sp5) + 32px);--shadow-soft: 0 12px 32px -18px color-mix(in srgb, var(--ink) 28%, transparent);--ease: cubic-bezier(.16, 1, .3, 1);--fast: .13s;--base: .22s;--slow: .34s;--rail: 264px;--panel: 400px;--detail: min(520px, 40vw);--drawer: min(580px, 94vw)}:root,[data-theme=dark]{--brand: #6b7a90;--brand-hover: #869ab2;--brand-ink: #0c0f14;--brand-wash: color-mix(in srgb, var(--brand) 14%, transparent);--brand-line: color-mix(in srgb, var(--brand) 38%, transparent);--focus-ring: color-mix(in srgb, var(--brand) 54%, transparent);--focus: var(--focus-ring);--violet: #9b8fc4}[data-theme=light]{--brand: #566175;--brand-hover: #454e5f;--brand-ink: #ffffff;--brand-wash: color-mix(in srgb, var(--brand) 12%, transparent);--brand-line: color-mix(in srgb, var(--brand) 30%, transparent);--focus-ring: color-mix(in srgb, var(--brand) 38%, transparent);--focus: var(--focus-ring);--violet: #7a6ea6}:root{--radius: .5rem;--radius-sm: .5rem;--radius-md: .5rem;--radius-lg: .5rem;--radius-xl: .5rem;--radius-full: 9999px;--pane-pad-x: var(--sp4);--font-sans: var(--font);--font-mono: var(--mono);--type-micro: 11px;--type-ui: 14px;--type-label: 13px;--type-meta: 12px;--shadow-xs: 0 1px 2px 0 rgb(0 0 0 / .05);--shadow-sm: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--shadow-md: var(--shadow-soft);--shadow-lg: var(--shadow);--transition-fast: var(--fast) var(--ease);--chip-h: 28px}.status-tag{display:inline-flex;align-items:center;gap:var(--sp1);padding:0;border:0;background:none;color:var(--text-dim);font-size:var(--type-meta);font-weight:510;white-space:nowrap}.status-tag svg{flex:0 0 auto}.status-tag-dot{width:7px;height:7px;border-radius:50%;flex:0 0 auto;background:currentColor;opacity:.75}.status-tag-action{min-height:var(--chip-h);padding:0 var(--sp2);border-radius:var(--radius-sm);cursor:pointer;text-decoration:none;text-underline-offset:3px;transition:color var(--transition-fast)}.status-tag-action:hover{text-decoration:underline}.status-tag-action:active{color:var(--text)}.status-tag-action:focus-visible{outline:2px solid var(--focus);outline-offset:1px}@media(prefers-reduced-motion:reduce){.status-tag-action{transition:none}}:root,[data-theme=dark],[data-theme=light]{--bg-0: var(--bg);--bg-1: var(--s1);--bg-2: var(--s2);--bg-3: var(--s3);--bg-hover: var(--hl-2);--border: var(--line);--border-strong: var(--line-2);--text: var(--ink);--text-dim: var(--ink-muted);--text-faint: var(--ink-faint);--accent: var(--brand);--accent-hover: var(--brand-hover);--accent-dim: var(--brand-wash);--accent-border: var(--brand-line);--accent-foreground: var(--brand-ink);--toggle-knob-off: var(--s1);--toggle-knob-on: var(--brand-ink);--bg-warning: color-mix(in srgb, var(--amber) 12%, var(--bg));--border-warning: color-mix(in srgb, var(--amber) 38%, transparent);--text-warning: var(--amber-text)}:root,[data-theme=dark]{--brand: #6be195;--brand-hover: #8ceab0;--brand-ink: #062b16}[data-theme=light]{--brand: #167e3a;--brand-hover: #116930;--brand-ink: #ffffff}@keyframes pop-in{0%{opacity:.4;transform:scale(.96)}to{opacity:1;transform:scale(1)}}*{box-sizing:border-box}html,body,#root{height:100%;margin:0;overflow:hidden}body{background:var(--bg-0);color:var(--text);font:var(--type-ui)/1.45 var(--font-sans);-webkit-font-smoothing:antialiased}button{font:inherit;color:inherit;cursor:pointer}input{font:inherit;color:inherit}.app-status{display:flex;align-items:center;justify-content:center;height:100%;color:var(--text-dim)}.app-status-error{color:var(--red)}.connectivity-screen{padding:var(--sp6)}.connectivity-screen-inner{display:flex;flex-direction:column;align-items:center;text-align:center;gap:var(--sp3);max-width:34rem}.connectivity-screen-icon{display:inline-flex;color:var(--text-dim)}.connectivity-screen[data-status=auth] .connectivity-screen-icon{color:var(--accent)}.connectivity-screen[data-status=error] .connectivity-screen-icon{color:var(--red)}.connectivity-screen-title{color:var(--text);font-size:var(--type-h2);font-weight:560}.connectivity-screen-body{color:var(--text-dim);font-size:var(--type-ui);line-height:1.55}.connectivity-screen-detail{color:var(--text-faint);font-size:var(--type-meta);font-family:var(--mono, monospace);word-break:break-word}.connectivity-screen-retry{margin-top:var(--sp2)}.connectivity-banner{display:flex;align-items:center;gap:var(--sp2);padding:var(--sp2) var(--sp4);background:var(--bg-1);border-bottom:1px solid var(--line);font-size:var(--type-label);color:var(--text-dim)}.connectivity-banner-icon{display:inline-flex;flex:0 0 auto;color:var(--text-dim)}.connectivity-banner-text{flex:1;min-width:0;line-height:1.5}.connectivity-banner-dismiss{flex-shrink:0;background:none;border:none;color:var(--text-faint);font-size:var(--type-h2);line-height:1;cursor:pointer;padding:0 2px;transition:color var(--transition-fast)}.connectivity-banner-dismiss:hover{color:var(--text)}.connectivity-banner-dismiss:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.app-shell{position:relative;display:flex;height:100vh;overflow-x:auto}.workspace-main{flex:1;min-width:40rem;display:flex;flex-direction:column}.brand-header{flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;height:var(--pane-header-h);padding:0 var(--pane-pad-x);background:var(--surface-raised);border-bottom:1px solid var(--ui-line)}.brand-lockup{display:flex;align-items:center;gap:8px}.brand-header-tools{display:flex;align-items:center;gap:var(--sp1)}.brand-mark{width:18px;height:18px}.brand-name{font-size:var(--type-ui);font-weight:600;color:var(--text);letter-spacing:-.01em}.brand-divider{width:1px;height:14px;background:var(--border-strong)}.brand-product{font-size:var(--type-ui);font-weight:500;color:var(--text-dim)}.rail-search{flex:0 0 auto;display:flex;align-items:center;gap:var(--sp2);height:var(--pane-header-h);padding:0 var(--pane-pad-x);border-bottom:1px solid var(--ui-line)}.rail-search .palette-trigger{flex:1;min-width:0;width:auto}.palette-trigger{display:grid;grid-template-columns:1rem minmax(0,1fr) auto;align-items:center;gap:var(--sp2);width:100%;height:var(--control-h-xs);padding:0 var(--sp2) 0 var(--sp3);background:var(--surface-inset);border:1px solid var(--ui-line);border-radius:var(--radius);color:var(--text-dim);font-size:var(--type-label);text-align:left;transition:background-color var(--transition-fast),border-color var(--transition-fast),color var(--transition-fast)}.palette-trigger:hover{border-color:var(--ui-line-strong);color:var(--text)}.palette-trigger:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.palette-trigger-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.palette-trigger-hint{color:var(--text-faint);font-family:var(--font-mono);font-size:var(--type-micro);padding:1px 5px;border:1px solid var(--ui-line);border-radius:var(--radius);background:var(--bg-0)}.theme-toggle{width:var(--control-h-xs);height:var(--control-h-xs);display:flex;align-items:center;justify-content:center;background:transparent;border:1px solid transparent;border-radius:var(--radius-md);color:var(--text-dim);transition:background-color var(--transition-fast),color var(--transition-fast)}.theme-toggle:hover{background:var(--surface-hover);color:var(--text)}.theme-toggle:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.brand-identity{display:flex;align-items:center;gap:6px;font-size:var(--type-label);color:var(--text-dim)}.identity-dot{width:6px;height:6px;border-radius:50%;background:var(--text-faint)}.identity-dot[data-authenticated=true]{background:var(--green)}.telemetry-notice{display:flex;align-items:flex-start;gap:10px;padding:8px 14px;background:var(--accent-dim);border-bottom:1px solid var(--accent-border);font-size:var(--type-label);color:var(--text-dim)}.telemetry-notice-body{flex:1;min-width:0}.telemetry-notice-text{margin:0;line-height:1.5}.telemetry-notice-settings-link{background:none;border:none;padding:0;color:var(--accent);font-size:inherit;cursor:pointer;text-decoration:underline;text-underline-offset:2px}.telemetry-notice-settings-link:hover{color:var(--accent-hover)}.telemetry-notice-dismiss{flex-shrink:0;background:none;border:none;color:var(--text-faint);font-size:var(--type-h2);line-height:1;cursor:pointer;padding:0 2px;transition:color var(--transition-fast)}.telemetry-notice-dismiss:hover{color:var(--text)}.telemetry-notice-dismiss:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.app{position:relative;display:grid;grid-template-columns:minmax(20rem,1fr) minmax(20rem,1fr);flex:1;min-height:0;overflow-x:auto;overflow-y:hidden}.pane-resize-handle{position:absolute;top:0;bottom:0;width:7px;cursor:col-resize;z-index:20;touch-action:none}.pane-resize-handle:hover,.pane-resize-handle:active{background:var(--accent-dim)}.pane-resize-handle-rail{transform:translate(-50%)}.pane-resize-handle-canvas{transform:translate(50%)}.center-pane{display:flex;flex-direction:column;min-width:0;min-height:0;border-right:1px solid var(--border)}.rail{display:flex;flex-direction:column;background:var(--bg-1);min-width:0;min-height:0}.rail-workflows{flex:0 1 auto;height:100%;padding:0}.rail-header{position:relative;flex:0 0 auto;display:flex;align-items:center;gap:var(--sp2);height:var(--pane-header-h);padding:0 var(--sp2) 0 var(--pane-pad-x);font-size:var(--type-label);font-weight:510;color:var(--text-faint)}.rail-header-actions{margin-left:auto;display:flex;align-items:center;gap:2px}.rail-header-btn{position:relative}.rail-header-btn:hover{border-color:var(--ui-line-strong);background:var(--surface-hover)}.session-dropdown-new{color:var(--text-dim)}.session-dropdown-new:hover{color:var(--text)}.rail-tree{position:relative;flex:1;min-height:0;display:flex;flex-direction:column}.connect-card{background:var(--surface-inset);border:1px solid var(--ui-line-strong);border-radius:var(--radius);box-shadow:var(--shadow-md);overflow:hidden;z-index:30;animation:pop-in var(--transition-fast) ease-out}.connect-card-header{display:flex;align-items:center;gap:var(--sp2);height:var(--pane-header-h);padding:0 var(--sp2) 0 var(--sp3);border-bottom:1px solid var(--ui-line);font-size:var(--type-label);font-weight:510;color:var(--text-faint)}.connect-card-close{margin-left:auto}.connect-card-body{display:flex;flex-direction:column;gap:var(--sp2);padding:var(--sp3)}.history-card{width:min(320px,calc(100vw - var(--sp4)))}.history-card .connect-card-body{gap:var(--tree-row-gap);padding:6px;max-height:min(360px,60vh);overflow-y:auto}.rail-list{flex:1;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:var(--tree-row-gap);padding:var(--sp3) var(--sp2)}.rail-footer{flex:0 0 auto;border-top:1px solid var(--ui-line)}.rail-footer-row{display:flex;align-items:center;height:var(--pane-header-h);padding:0 var(--pane-pad-x)}.rail-footer-row+.rail-footer-row{border-top:1px solid var(--ui-line)}.rail-profile-wrap{position:relative}.rail-profile{display:flex;align-items:center;gap:var(--sp2);flex:1;min-width:0;height:100%;padding:0;border:0;background:transparent;color:var(--text-dim);text-align:left}.rail-profile:hover{color:var(--text)}.rail-profile:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.rail-profile-avatar{display:grid;place-items:center;flex:0 0 auto;width:var(--control-h-xs);height:var(--control-h-xs);border-radius:var(--radius);background:var(--surface-inset);border:1px solid var(--ui-line);color:var(--text);font-size:var(--type-ui);font-weight:590}.rail-profile-copy{display:grid;min-width:0;flex:1;gap:1px}.rail-profile-name{color:var(--text);font-size:var(--type-label);font-weight:510;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rail-profile-meta{color:var(--text-faint);font-size:var(--type-meta);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.canvas-detail-menu,.canvas-run-menu,.composer-library,.profile-menu,.session-menu,.settings-popover{display:flex;flex-direction:column;gap:var(--tree-row-gap);padding:6px;background:var(--bg-2);border:1px solid var(--border-strong);border-radius:var(--radius-md);box-shadow:var(--shadow-md);z-index:30;animation:pop-in var(--transition-fast) ease-out}@media(prefers-reduced-motion:reduce){.canvas-detail-menu,.canvas-run-menu,.composer-library,.connect-card,.profile-menu,.session-menu,.settings-popover{animation:none}}.profile-menu-item{display:flex;align-items:center;gap:var(--sp2);width:100%;height:var(--tree-row-h);padding:0 var(--sp2);border:0;background:transparent;border-radius:var(--radius);color:var(--text-dim);font-size:var(--type-label);text-align:left;transition:background-color var(--fast) var(--ease),color var(--fast) var(--ease)}.profile-menu-item:hover:not(:disabled){background:var(--surface-hover);color:var(--text)}.profile-menu-item:active:not(:disabled){background:var(--active-shade)}.profile-menu-item:disabled{opacity:.42;cursor:default}.profile-menu-item:focus-visible{outline:2px solid var(--focus);outline-offset:-2px}.profile-menu-item.is-selected{background:var(--active-shade);color:var(--text)}.provider-item-check{display:flex;align-items:center;justify-content:center;width:13px;flex:0 0 auto;color:var(--brand)}.provider-item.is-unavailable{opacity:.42;cursor:default}.provider-item.is-unavailable:hover,.provider-item.is-unavailable:active{background:transparent;color:var(--text-dim)}@media(prefers-reduced-motion:reduce){.profile-menu-item{transition:none}}.session-steps{display:flex;align-items:center;gap:var(--sp2);flex:0 0 auto;height:var(--pane-header-h);padding:0 var(--pane-pad-x);border-bottom:1px solid var(--border);background:var(--surface-raised);overflow-x:auto;scrollbar-width:none;container-type:inline-size}.session-lifecycle-label,.session-preview-label{display:contents}@container (max-width: 427px){.session-step:not(.session-action-primary) .session-step-label{display:none}}@container (max-width: 347px){.session-lifecycle-label,.session-preview-label{display:none}}.session-lifecycle-chip{flex:0 0 auto}.session-lifecycle-chip[data-deployed=true]{color:var(--brand)}.session-lifecycle-chip[data-deploy-error]{color:var(--text-warning)}.session-actions{display:flex;align-items:center;gap:var(--sp1);margin-left:auto}.session-step{display:inline-flex;align-items:center;gap:var(--sp2);flex:0 0 auto;height:var(--control-h-xs);padding:0 var(--sp2);border:0;background:transparent;border-radius:var(--radius);color:var(--text-dim);font-size:var(--type-label);font-weight:510;transition:background-color var(--transition-fast),color var(--transition-fast)}.session-step:hover:not(:disabled){background:var(--surface-hover);color:var(--text)}.session-step:disabled{color:var(--text-faint);opacity:.6}.session-step:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.session-action-primary{color:var(--brand);background:var(--accent-dim);box-shadow:inset 0 0 0 1px var(--accent-border)}.session-action-primary:hover:not(:disabled){color:var(--brand);background:var(--accent-dim)}.session-step[data-pending]{outline:1px dashed var(--accent-border);outline-offset:1px;animation:session-step-pending 1.6s ease-in-out infinite}@keyframes session-step-pending{0%,to{outline-color:var(--accent-border)}50%{outline-color:var(--accent)}}@media(prefers-reduced-motion:reduce){.session-step[data-pending]{animation:none}}.session-step svg{flex:0 0 auto}.app-tooltip{position:fixed;top:0;left:0;z-index:200;max-width:260px;width:max-content;padding:5px 9px;background:var(--bg-3);border:1px solid var(--border-strong);border-radius:var(--radius);box-shadow:var(--shadow-md);color:var(--text);font-size:var(--type-meta);line-height:1.45;white-space:normal;overflow-wrap:anywhere;pointer-events:none;opacity:0;transition:opacity var(--fast) var(--ease)}.app-tooltip[data-show=true]{opacity:1}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--sp1);padding:var(--sp5) var(--sp4);text-align:center}.empty-state-icon{display:grid;place-items:center;width:var(--control-h);height:var(--control-h);margin-bottom:var(--sp1);border-radius:var(--radius);border:1px dashed var(--ui-line-strong);color:var(--text-faint)}.empty-state-title{color:var(--text);font-family:var(--font-sans);font-size:var(--type-ui);font-weight:560}.empty-state-body{max-width:34ch;color:var(--text-faint);font-family:var(--font-sans);font-size:var(--type-label);line-height:1.6}.empty-state-eyebrow{color:var(--text-faint);font-family:var(--font-mono);font-size:var(--type-meta)}.empty-state-cta{display:flex;justify-content:center;margin-top:var(--sp2)}.session-step:disabled{cursor:default}.rail-empty{color:var(--text-faint);padding:6px;font-size:var(--type-label)}:root{--tree-row-h: 30px;--tree-row-gap: 3px;--tree-pad-x: 6px;--tree-indent: calc(var(--tree-pad-x) + 13px + 6px)}.workspace-group{display:flex;flex-direction:column;gap:var(--tree-row-gap);margin-bottom:var(--sp3)}.workspace-group:last-child{margin-bottom:0}.workspace-row{position:relative;display:flex;align-items:center;height:var(--tree-row-h);border-radius:var(--radius)}.workspace-row:hover{background:var(--bg-hover)}.workspace-row-main{flex:1;min-width:0;display:flex;align-items:center;gap:6px;height:100%;padding:0 var(--tree-pad-x);border:none;background:transparent;border-radius:var(--radius);font-size:var(--type-label);font-weight:560;color:var(--text-dim);text-align:left}.workspace-row-main:focus-visible{outline:2px solid var(--focus);outline-offset:-2px}.workspace-row-static{cursor:default}.workspace-row.is-selected,.workspace-row.is-selected:hover{background:var(--active-shade)}.workspace-row.is-selected .workspace-row-main{color:var(--text)}.workspace-row-trail{margin-right:var(--tree-pad-x)}.workspace-row.is-collapsed .workspace-row-action[aria-expanded]{opacity:1}.workspace-caret{display:flex;align-items:center;flex:0 0 auto;color:var(--text-faint);opacity:0;transition:opacity var(--transition-fast),transform var(--transition-fast)}.workspace-caret.is-open{transform:rotate(180deg)}.workspace-row:hover .workspace-caret,.workspace-row.is-collapsed .workspace-caret{opacity:1}.disclosure-caret{display:flex;align-items:center;transition:transform var(--transition-fast)}.disclosure-caret.is-open{transform:rotate(180deg)}@media(prefers-reduced-motion:reduce){.workspace-caret,.disclosure-caret,.canvas-step-caret{transition:none}}.workspace-row-action{display:flex;align-items:center;justify-content:center;flex:0 0 auto;width:22px;height:22px;border:none;background:transparent;border-radius:var(--radius);color:var(--text-faint);opacity:0;transition:opacity var(--transition-fast),background-color var(--transition-fast)}.workspace-row-action:last-child{margin-right:3px}.workspace-row:hover .workspace-row-action,.workspace-row-action:focus-visible{opacity:1}.workspace-row-action:hover{background:var(--surface-hover);color:var(--text)}.workspace-row-action:focus-visible{outline:2px solid var(--focus);outline-offset:-2px}.workspace-group-empty{height:var(--tree-row-h);display:flex;align-items:center;padding:0 var(--tree-pad-x) 0 var(--tree-indent);color:var(--text-faint);font-size:var(--type-meta)}.workspace-group{position:relative}.workspace-group:has(>.tree-row,>.workflow-item,>.workspace-group-empty):before{content:"";position:absolute;left:calc(var(--tree-pad-x) + 6px);top:calc(var(--tree-row-h) + var(--tree-row-gap));bottom:0;width:1px;background:var(--ui-line);pointer-events:none}.workspace-group>.tree-row,.workspace-group>.workflow-item,.workspace-group>.workspace-group-empty{position:relative}.workflow-row-actions{position:absolute;top:50%;right:calc(var(--tree-pad-x) + 32px);transform:translateY(-50%);display:flex;align-items:center;gap:2px;opacity:0;pointer-events:none;transition:opacity var(--transition-fast)}.workflow-item:hover .workflow-row-actions,.workflow-item:focus-within .workflow-row-actions{opacity:1;pointer-events:auto}.workflow-row-actions .workspace-row-action{opacity:1}.tree-row{display:flex;align-items:center;gap:6px;width:100%;height:var(--tree-row-h);padding:0 var(--tree-pad-x) 0 var(--tree-indent);border:none;background:transparent;border-radius:var(--radius);font-size:var(--type-label);color:var(--text-dim);text-align:left}.tree-row:focus-visible{outline:2px solid var(--focus);outline-offset:-2px}.tree-row-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree-row>svg{flex:0 0 auto;color:var(--text-faint)}.session-tree-row:hover{background:var(--bg-hover);color:var(--text)}.session-row-time{flex:0 0 auto;color:var(--text-faint);font-family:var(--font-mono);font-size:var(--type-meta);font-variant-numeric:tabular-nums}.session-tree-row.is-selected{background:var(--active-shade);color:var(--text)}.session-tree-row.is-current{color:var(--text)}.session-tree-row.is-current>svg:first-child{color:var(--brand)}.tree-trail{display:flex;align-items:center;justify-content:center;width:16px;flex:0 0 auto}.workflow-status{display:flex;align-items:center;justify-content:center;width:16px;flex:0 0 auto;color:var(--text-faint)}.workflow-status[data-deployed=true]{color:var(--green)}.workflow-item{position:relative;display:flex;align-items:center;border-radius:var(--radius);color:var(--text-dim)}.workflow-item:hover{background:var(--bg-hover);color:var(--text)}.workflow-item.is-focused{background:var(--active-shade);color:var(--text)}.workflow-item.is-focused .tree-row>svg:first-child{color:var(--brand)}.workflow-item-trigger{flex:1;min-width:0;color:inherit}.workflow-session-dot{width:7px;height:7px;border-radius:50%;flex:0 0 auto;background:transparent;box-shadow:inset 0 0 0 1px var(--text-faint)}.workflow-session-dot[data-live=true]{background:var(--green);box-shadow:none}.workflow-item .workflow-expander{opacity:1}.workflow-dot{width:6px;height:6px;border-radius:50%;background:var(--green);flex:0 0 auto}.workflow-dot-pinned{position:relative}.workflow-deployed-tag{flex:0 0 auto;color:var(--green-text, var(--green))}.workflow-row-menu-wrap{position:relative;display:flex;align-items:center;flex:0 0 auto;margin-right:3px}.workflow-item:hover .workflow-row-menu-wrap .workspace-row-action,.workflow-row-menu-wrap .workspace-row-action:focus-visible,.workflow-row-menu-wrap .workspace-row-action[aria-expanded=true]{opacity:1}.workspace-row-action:active{background:var(--surface-inset)}.workflow-row-menu{min-width:170px}.workflow-row-menu-section{padding:6px 8px 2px;font-size:var(--type-micro);font-weight:700;letter-spacing:.01em;color:var(--text-faint)}.group-name-input{flex:1;min-width:0;height:24px;margin:0 var(--sp1);padding:0 var(--sp2);border:1px solid var(--focus);border-radius:var(--radius-sm);background:var(--surface-inset);color:var(--text);font-size:var(--type-label)}.session-rename-input{flex:1;min-width:0}.session-context-rename{max-width:260px}.group-name-input:focus-visible{outline:none}@media(prefers-reduced-motion:reduce){.workspace-row-action,.group-name-input{transition:none}}.connect-trigger{display:inline-flex;align-items:center;justify-content:center;text-align:center;width:100%;height:var(--control-h-xs);border:1px dashed var(--border-strong);background:transparent;color:var(--text-faint);border-radius:var(--radius);padding:0 var(--sp3);text-align:left;font-size:var(--type-label)}.connect-trigger:hover{color:var(--text-dim);border-color:var(--text-faint)}.macro-icon-btn{position:relative;width:var(--control-h-xs);height:var(--control-h-xs);display:flex;align-items:center;justify-content:center;flex:0 0 auto;border:1px solid transparent;background:transparent;border-radius:var(--radius-md);color:var(--text-dim);transition:background-color var(--transition-fast),border-color var(--transition-fast),color var(--transition-fast)}.macro-icon-btn:hover:not(:disabled){background:var(--bg-hover);border-color:var(--border-strong);color:var(--text)}.macro-icon-btn:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.macro-icon-btn:disabled{color:var(--text-faint);cursor:default;opacity:.5}.session-bar{display:flex;align-items:center;gap:var(--sp2);height:var(--pane-header-h);flex:0 0 auto;padding:0 var(--pane-pad-x);border-bottom:1px solid var(--border);background:var(--bg-1);position:relative}.session-context{display:flex;align-items:center;gap:var(--sp2);flex:1;min-width:0}.session-context-title{flex:0 0 auto;max-width:24ch;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--type-label);font-weight:510;color:var(--text)}.session-context-none{font-size:var(--type-label);color:var(--text-faint)}.session-status-tag{flex:0 0 auto}.session-status-tag[data-status=running]{color:var(--green-text)}.session-menu-wrap{position:relative;flex:0 0 auto}.session-menu{min-width:180px}.session-menu-danger:hover:not(:disabled){color:var(--red-text);background:color-mix(in srgb,var(--red) 12%,transparent)}.dir-picker-item.is-selected{background:var(--surface-hover);color:var(--text)}.session-busy{width:6px;height:6px;border-radius:50%;flex:0 0 auto;background:var(--accent);animation:session-tab-busy-pulse 1.2s ease-in-out infinite}@keyframes session-tab-busy-pulse{0%,to{opacity:.35;transform:scale(.85)}50%{opacity:1;transform:scale(1.15)}}.session-history-badge{position:absolute;top:-3px;right:-3px;min-width:14px;height:14px;padding:0 3px;border-radius:var(--radius-full);background:var(--accent);color:var(--accent-foreground);font-size:var(--type-micro);font-weight:700;line-height:14px;text-align:center}.session-workflow-chip{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:2px 8px;border-radius:var(--radius-md);background:var(--accent-dim);border:1px solid var(--accent-border);color:var(--accent);font-size:var(--type-meta);font-weight:500}.session-context-status{margin-left:auto}.session-dot{width:7px;height:7px;border-radius:50%;flex:0 0 auto;background:var(--text-faint)}.session-dot[data-status=running]{background:var(--green)}.session-dot[data-status=starting]{background:var(--amber)}.session-dot[data-status=exited]{background:var(--text-faint)}.session-tabs{display:flex;align-items:center;gap:var(--sp1);flex:0 0 auto;min-width:0;padding:var(--sp1) var(--pane-pad-x);border-bottom:1px solid var(--border);background:var(--bg-1);overflow-x:auto;scrollbar-width:none}.session-tabs::-webkit-scrollbar{display:none}.session-tab{display:inline-flex;align-items:center;flex:0 0 auto;max-width:220px;height:28px;border-radius:var(--radius-md);border:1px solid transparent;color:var(--text-dim);transition:background-color var(--transition-fast),border-color var(--transition-fast),color var(--transition-fast)}.session-tab:hover{background:var(--bg-hover);color:var(--text)}.session-tab.is-active{background:var(--active-shade);border-color:var(--ui-line);color:var(--text)}.session-tab-main{display:inline-flex;align-items:center;gap:6px;min-width:0;height:100%;padding:0 var(--sp1) 0 var(--sp2);border:none;background:transparent;border-radius:var(--radius-md) 0 0 var(--radius-md);color:inherit;font-size:var(--type-label);text-align:left}.session-tab-main:focus-visible{outline:2px solid var(--focus);outline-offset:-2px}.session-tab-main>svg{flex:0 0 auto;color:var(--text-faint)}.session-tab.is-active .session-tab-main>svg{color:var(--brand)}.session-tab-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.session-tab-dot{width:7px;height:7px;border-radius:50%;flex:0 0 auto;background:var(--text-faint)}.session-tab-dot[data-status=running]{background:var(--green)}.session-tab-dot[data-status=starting]{background:var(--amber)}.session-tab-busy{width:6px;height:6px;border-radius:50%;flex:0 0 auto;background:var(--accent);animation:session-tab-busy-pulse 1.2s ease-in-out infinite}.session-tab-close{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:20px;height:20px;margin-right:4px;border:none;background:transparent;border-radius:var(--radius-sm);color:var(--text-faint);opacity:0;transition:opacity var(--transition-fast),background-color var(--transition-fast),color var(--transition-fast)}.session-tab:hover .session-tab-close,.session-tab.is-active .session-tab-close,.session-tab-close:focus-visible{opacity:1}.session-tab-close:hover{background:color-mix(in srgb,var(--red) 14%,transparent);color:var(--red-text)}.session-tab-close:active{background:color-mix(in srgb,var(--red) 22%,transparent)}.session-tab-close:focus-visible{outline:2px solid var(--focus);outline-offset:-2px}.session-tab-new{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:26px;height:26px;border:none;background:transparent;border-radius:var(--radius-md);color:var(--text-faint);transition:background-color var(--transition-fast),color var(--transition-fast)}.session-tab-new:hover{background:var(--bg-hover);color:var(--text)}.session-tab-new:active{background:var(--surface-inset)}.session-tab-new:focus-visible{outline:2px solid var(--focus);outline-offset:-2px}@media(prefers-reduced-motion:reduce){.session-tab,.session-tab-close,.session-tab-new{transition:none}.session-tab-busy{animation:none}}.session-dropdown-section{font-size:var(--type-micro);font-weight:700;letter-spacing:.01em;color:var(--text-faint);padding:4px 8px;margin-top:var(--sp2)}.session-dropdown-section:first-child{margin-top:0}.session-dropdown-empty{color:var(--text-faint);font-size:var(--type-label);padding:4px 6px 8px}.session-dropdown-item{display:flex;align-items:flex-start;gap:var(--sp2);width:100%;padding:6px 8px;border:none;background:transparent;border-radius:var(--radius-sm);text-align:left;transition:background-color var(--transition-fast)}.session-item-icon,.session-dropdown-item>.tree-trail{display:flex;align-items:center;justify-content:center;width:16px;flex:0 0 auto;height:18px;color:var(--text-faint)}.session-item-copy{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.session-item-copy>.session-item-title,.session-item-copy>.session-item-cwd,.session-item-copy>.session-item-meta{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.session-dropdown-item:hover,.session-dropdown-item.is-selected{background:var(--surface-hover)}.session-item-title{font-size:var(--type-label);color:var(--text)}.session-item-cwd,.session-item-meta{font-size:var(--type-meta);color:var(--text-faint)}.past-session-tag{flex:0 0 auto;align-self:flex-start;padding:1px 6px;border-radius:var(--radius-md);border:1px solid var(--ui-line);background:var(--surface-inset);color:var(--text-faint);font-size:var(--type-micro);font-weight:600}.past-session-tag[data-resumable=true]{color:var(--green-text);border-color:color-mix(in srgb,var(--green) 32%,transparent);background:color-mix(in srgb,var(--green) 10%,transparent)}.gear-btn{width:var(--control-h-xs);height:var(--control-h-xs);display:flex;align-items:center;justify-content:center;border:1px solid var(--border-strong);background:var(--bg-2);border-radius:var(--radius-md);box-shadow:var(--shadow-xs);color:var(--text-dim);transition:background-color var(--transition-fast),border-color var(--transition-fast),color var(--transition-fast)}.gear-btn:hover{background:var(--surface-hover);border-color:var(--ui-line-strong);color:var(--text)}.gear-btn:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.settings-popover{padding:var(--sp4)}.settings-identity{font-size:var(--type-label);font-weight:600;color:var(--text);padding-bottom:10px;margin-bottom:10px;border-bottom:1px solid var(--border)}.settings-toggle-row{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:var(--type-label);color:var(--text-dim)}.toggle-switch{flex:0 0 auto;width:34px;height:20px;border-radius:var(--radius-full);background:var(--bg-3);border:1px solid var(--border-strong);position:relative;padding:0;transition:background-color var(--transition-fast)}.toggle-switch.is-on{background:var(--accent);border-color:var(--accent)}.toggle-switch:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.toggle-switch:disabled{opacity:.42;cursor:default}.toggle-knob{position:absolute;top:1px;left:1px;width:16px;height:16px;border-radius:50%;background:var(--toggle-knob-off);transition:transform var(--transition-fast)}.toggle-switch.is-on .toggle-knob{background:var(--toggle-knob-on);transform:translate(14px)}.settings-note{margin:10px 0 12px;font-size:var(--type-meta);line-height:1.5;color:var(--text-faint)}.settings-note code{color:var(--text-dim);font-family:var(--font-mono);font-size:var(--type-meta)}.settings-env-note{color:var(--text-warning)}.terminal-slot{flex:1;min-height:0;display:flex;flex-direction:column;background:var(--bg-0)}.terminal-slot>.harness-terminal{flex:1;min-height:0}.terminal-slot>.image-composer{flex:1;min-height:0;display:flex;flex-direction:column;position:relative}.image-composer-pane{flex:1;min-height:0;display:flex;flex-direction:column}.image-composer-dropzone{position:absolute;top:0;right:0;bottom:0;left:0;z-index:5;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--sp2);border:2px dashed var(--accent-border);border-radius:var(--radius-lg);background:var(--accent-dim);color:var(--accent);font-size:var(--type-ui);font-weight:500;pointer-events:none}.image-composer-bar{flex-shrink:0;display:flex;align-items:center;gap:var(--sp2);padding:var(--sp2) var(--pane-pad-x);border-top:1px solid var(--border);background:var(--bg-1)}.image-composer-thumbs{display:flex;align-items:center;gap:var(--sp2);margin:0;padding:0;list-style:none;overflow-x:auto;flex:1;min-width:0}.image-composer-thumb{position:relative;flex-shrink:0;width:40px;height:40px;border-radius:var(--radius-md);border:1px solid var(--border-strong);overflow:hidden}.image-composer-thumb img{width:100%;height:100%;object-fit:cover;display:block}.image-composer-thumb-remove{position:absolute;top:2px;right:2px;width:16px;height:16px;display:flex;align-items:center;justify-content:center;padding:0;border:1px solid var(--border-strong);border-radius:var(--radius-full);background:var(--bg-0);color:var(--text-dim);cursor:pointer;transition:color var(--transition-fast),background-color var(--transition-fast)}.image-composer-thumb-remove:hover:not(:disabled){color:var(--text);background:var(--bg-2)}.image-composer-thumb-remove:active:not(:disabled){background:var(--bg-3)}.image-composer-thumb-remove:focus-visible{outline:2px solid var(--focus);outline-offset:1px}.image-composer-thumb-remove:disabled{opacity:.42;cursor:default}.image-composer-send{flex-shrink:0;font-size:var(--type-label)}@media(prefers-reduced-motion:reduce){.image-composer-thumb-remove{transition:none}}.harness-terminal{display:flex;flex-direction:column;height:100%;width:100%;min-height:0;background:var(--bg-0);overflow:hidden}.terminal-statusbar{display:flex;align-items:center;gap:var(--sp2);flex-shrink:0;height:var(--pane-header-h);padding:0 var(--pane-pad-x);border-bottom:1px solid var(--ui-line);font-family:var(--font-mono);font-size:var(--type-meta);font-variant-numeric:tabular-nums;color:var(--text-dim)}.terminal-status-dot{width:7px;height:7px;border-radius:999px;flex:0 0 auto;background:var(--text-faint)}.terminal-statusbar[data-status=connected] .terminal-status-dot{background:var(--green)}.terminal-statusbar[data-status=connecting] .terminal-status-dot{background:var(--amber);animation:session-tab-busy-pulse 1.2s ease-in-out infinite}.terminal-statusbar[data-status=error] .terminal-status-dot{background:var(--red)}.terminal-statusbar[data-status=error] .terminal-status-label{color:var(--red-text)}.terminal-screen{flex:1;min-height:0;overflow:hidden}.terminal-screen .xterm{height:100%;width:100%;padding:var(--pane-pad-x)}@media(prefers-reduced-motion:reduce){.terminal-statusbar[data-status=connecting] .terminal-status-dot{animation:none}}.terminal-empty{height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;color:var(--text-faint);font-family:var(--font-mono);font-size:var(--type-label)}.welcome-panel{height:100%;display:flex;align-items:center;justify-content:center;padding:var(--sp4);overflow-y:auto;container:welcome / inline-size}.welcome-card{display:flex;flex-direction:column;align-items:stretch;gap:12px;width:520px;max-width:100%;padding:28px;overflow:hidden;background:var(--bg-2);border:1px solid var(--border-strong);border-radius:var(--radius-xl);box-shadow:var(--shadow-sm)}.welcome-hero{margin:-28px -28px 0;height:200px;overflow:hidden;mask-image:linear-gradient(to bottom,black 60%,transparent 100%);-webkit-mask-image:linear-gradient(to bottom,black 60%,transparent 100%)}.welcome-hero img{display:block;width:100%;height:auto;object-fit:cover;object-position:82% 12%;transform:scale(1.25);transform-origin:82% 12%}.welcome-hero img.welcome-hero-light,[data-theme=light] .welcome-hero img.welcome-hero-dark{display:none}[data-theme=light] .welcome-hero img.welcome-hero-light{display:block}.welcome-copy{display:flex;flex-direction:column;align-items:center;gap:12px;text-align:center}.welcome-title{margin:0;font-size:var(--type-h2);font-weight:600;letter-spacing:-.01em;color:var(--text)}.welcome-intro{margin:0;font-size:var(--type-ui);line-height:1.6;color:var(--text-dim)}.welcome-footer{display:flex;align-items:center;gap:var(--sp2);align-self:stretch;margin:var(--sp2) -28px -28px;padding:var(--sp3) 28px;border-top:1px solid var(--border)}.welcome-docs{display:inline-flex;align-items:center;gap:var(--sp1);margin-right:auto;color:var(--text-faint);font-size:var(--type-meta);text-decoration:none;border-radius:var(--radius-sm);transition:color var(--transition-fast)}.welcome-docs:hover{color:var(--text-dim);text-decoration:underline}.welcome-docs:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.welcome-action{padding:0 var(--sp4);font-size:var(--type-ui);white-space:nowrap}.welcome-error{font-size:var(--type-label);color:var(--red)}.welcome-hints{display:flex;flex-direction:column;align-items:center;gap:var(--sp2);margin-top:2px}.welcome-hint-chips{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:var(--sp1) var(--sp3)}.welcome-hint-chip{display:inline-flex;align-items:center;gap:4px;color:var(--accent);font-size:var(--type-meta);font-weight:510;white-space:nowrap}.welcome-hints-kbd{display:block;text-align:center;font-size:var(--type-meta);color:var(--text-faint)}.welcome-hints-kbd kbd{font-family:var(--font-mono);font-size:var(--type-micro);color:var(--text-dim);padding:1px 5px;background:var(--bg-1);border:1px solid var(--border-strong);border-radius:var(--radius-sm);box-shadow:var(--shadow-xs)}@container welcome (max-width: 420px){.welcome-title{font-size:clamp(14px,4.6cqi,16px)}.welcome-footer{flex-wrap:wrap}.welcome-docs{flex:1 0 100%;justify-content:center;margin-right:0}.welcome-action{flex:1 1 auto}}.dead-session-pane{height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;padding:24px;text-align:center}.dead-session-title{color:var(--text);font-size:var(--type-ui);font-weight:600}.dead-session-meta{color:var(--text-faint);font-size:var(--type-label);font-family:var(--font-mono);margin-bottom:6px}.dead-session-actions{display:flex;gap:8px}.dead-session-resume-reason{color:var(--text-faint);font-size:var(--type-meta);max-width:300px;line-height:1.4;margin-top:4px}.canvas-pane{display:flex;flex-direction:column;background:var(--bg-1);min-width:0}.workflow-actions-header{display:flex;align-items:center;gap:var(--sp2);flex:0 0 auto;height:var(--pane-header-h);padding:0 var(--pane-pad-x);border-bottom:1px solid var(--border);background:var(--surface-raised);container-type:inline-size}@container (max-width: 347px){.canvas-detail-ask .canvas-detail-ask-label{display:none}}.workflow-actions-name{flex:1;min-width:0;font-size:var(--type-label);font-weight:600;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.canvas-refresh-btn{border-radius:var(--radius)}.canvas-frame-wrap{position:relative;flex:1;display:flex;flex-direction:column;min-height:0;overflow:clip}.canvas-visual{position:relative;flex:1;display:flex;min-height:0}.canvas-overview{position:relative;flex:0 0 auto;max-height:50%;display:flex;flex-direction:column;border-top:1px solid var(--ui-line);background:var(--surface-raised);overflow:hidden;transition:height var(--base) var(--ease)}.canvas-overview.is-resizing{transition:none}@media(prefers-reduced-motion:reduce){.canvas-overview{transition:none}}.canvas-overview-resize{position:absolute;top:-3px;left:0;right:0;height:6px;cursor:row-resize;z-index:4;touch-action:none}.canvas-overview-resize:before{content:"";position:absolute;inset:50% 0 auto 0;height:1px;transform:translateY(-50%);background:transparent;transition:height var(--fast) var(--ease),background-color var(--fast) var(--ease)}.canvas-overview-resize:hover:before,.canvas-overview-resize:active:before,.canvas-overview.is-resizing .canvas-overview-resize:before,.canvas-overview-resize:focus-visible:before{height:2px;background:var(--brand)}.canvas-overview-resize:focus-visible{outline:none}@media(prefers-reduced-motion:reduce){.canvas-overview-resize:before{transition:none}}.canvas-visual.is-offstage{display:none}.canvas-steps-surface{flex:1;min-height:0;overflow-y:auto;padding:var(--sp2) var(--pane-pad-x) var(--sp4);container-type:inline-size}@container (max-width: 420px){.canvas-step-meta{display:none}}.workflow-actions-count{font-family:var(--font-mono);font-size:var(--type-meta);color:var(--text-faint)}.canvas-slide-track{display:flex;width:200%;flex:1;min-height:0;transform:translate(0);transition:transform .26s var(--ease)}.canvas-frame-wrap[data-view=detail] .canvas-slide-track{transform:translate(-50%)}.canvas-slide-pane{width:50%;flex:0 0 50%;min-height:0;display:flex;flex-direction:column}@media(prefers-reduced-motion:reduce){.canvas-slide-track{transition:none}}.canvas-detail-ask{margin-left:auto;flex:0 0 auto}.canvas-detail-menu-wrap{position:relative;flex:0 0 auto}.canvas-detail-menu{min-width:200px}.canvas-step-item{border-radius:var(--radius)}.canvas-step-item.is-open{background:var(--surface-inset)}.canvas-step-caret{display:flex;align-items:center;flex:0 0 auto;color:var(--text-faint);transition:transform var(--transition-fast)}.canvas-step-caret.is-open{transform:rotate(180deg)}.canvas-step-expand{display:flex;flex-direction:column;gap:var(--sp2);padding:var(--sp1) var(--sp2) var(--sp3) calc(var(--sp2) + 7px + var(--sp2))}.canvas-step-desc{margin:0;font-size:var(--type-meta);line-height:1.55;color:var(--text-dim)}.canvas-step-transition{display:flex;align-items:center;gap:var(--sp2);font-size:var(--type-meta);color:var(--text-faint)}.canvas-step-transition-target{color:var(--text-dim)}.canvas-step-transition-cond{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:right;font-family:var(--font-mono);color:var(--brand)}.canvas-step-open{display:inline-flex;align-items:center;gap:var(--sp1);align-self:flex-start;padding:2px 0;border:0;background:transparent;font-size:var(--type-meta);font-weight:510;color:var(--text-dim);transition:color var(--transition-fast)}.canvas-step-open:hover{color:var(--text);text-decoration:underline}.canvas-step-open:active{color:var(--text-dim)}.canvas-steps-list{display:flex;flex-direction:column;gap:1px}.canvas-steps-label{display:flex;align-items:baseline;gap:var(--sp2);font-size:var(--type-micro);font-weight:700;letter-spacing:.01em;color:var(--text-faint);padding:var(--sp1) 0}.canvas-steps-run-note{margin-left:auto;font-family:var(--font-mono);font-weight:400;letter-spacing:0;color:var(--text-dim);white-space:nowrap}.canvas-step-band{position:relative;padding:0 0 var(--sp1);margin:var(--sp1) 0}.canvas-step-band:before{content:"";position:absolute;inset:0 calc(-1 * var(--sp1));border:1px dashed var(--ui-line-strong);background:var(--surface-raised);border-radius:var(--radius);pointer-events:none;z-index:-1}.canvas-step-group{font-family:var(--font-mono);font-size:var(--type-micro);letter-spacing:.04em;color:var(--text-faint);padding:var(--sp2) var(--sp2) var(--sp1)}.canvas-step-row{display:grid;grid-template-columns:20px 10px minmax(0,1fr) auto 16px;align-items:center;gap:var(--sp2);width:100%;min-height:44px;padding:var(--sp1) var(--sp2);border:0;background:transparent;border-radius:var(--radius);color:var(--text-dim);text-align:left;transition:background-color var(--transition-fast)}.canvas-step-row:hover{background:var(--surface-hover);color:var(--text)}.canvas-step-row:active{background:var(--surface-selected)}.canvas-step-row[aria-expanded=true]{background:var(--active-shade)}.canvas-step-row.is-static,.canvas-step-row.is-static:hover,.canvas-step-row.is-static:active{cursor:default;background:transparent;color:var(--text-dim)}.canvas-step-row.is-static:hover .canvas-step-name{color:inherit}.canvas-step-row:focus-visible,.canvas-step-open:focus-visible,.canvas-detail-edge:focus-visible{outline:1.5px solid var(--brand);outline-offset:1px}.canvas-step-index{font-family:var(--font-mono);font-size:var(--type-label);color:var(--text-faint)}.canvas-step-dot{width:7px;height:7px;border-radius:50%;flex:0 0 auto}.canvas-step-copy{display:flex;flex-direction:column;gap:1px;min-width:0}.canvas-step-name{font-size:var(--type-label);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.canvas-step-row:hover .canvas-step-name,.canvas-step-row[aria-expanded=true] .canvas-step-name{color:var(--text)}.canvas-step-role{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-mono);font-size:var(--type-micro);color:var(--text-faint)}.canvas-step-meta{font-family:var(--font-mono);font-size:var(--type-label);color:var(--text-faint);white-space:nowrap;max-width:35cqw;overflow:hidden;text-overflow:ellipsis}.canvas-input-card,.canvas-detail-contract{display:flex;align-items:baseline;gap:var(--sp2)}.canvas-input-label{flex:0 0 auto;min-width:52px;font-size:var(--type-micro);font-weight:590;letter-spacing:.02em;color:var(--text-faint)}.canvas-input-fields{display:flex;flex-wrap:wrap;gap:var(--sp1);min-width:0}.canvas-input-field{display:inline-flex;align-items:baseline;gap:var(--sp1);padding:2px var(--sp2);border:1px solid var(--ui-line-strong);border-radius:var(--radius);background:var(--surface-inset);font-family:var(--font-mono);font-size:var(--type-micro);color:var(--text-dim)}.canvas-input-field.is-required{color:var(--text)}.canvas-input-type{color:var(--text-faint)}.canvas-detail-timeout{font-family:var(--font-mono);font-size:var(--type-meta);color:var(--text-dim)}.canvas-run-status{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;flex:0 0 auto}.canvas-run-status.is-passed{color:var(--green)}.canvas-run-status.is-failed{color:var(--red, #e05a57)}.canvas-run-status.is-running{border:1.5px solid var(--brand);border-right-color:transparent;border-radius:50%;width:10px;height:10px;animation:canvas-run-spin .9s linear infinite}.canvas-run-status.is-pending{width:7px;height:7px;border:1px solid var(--text-faint);border-radius:50%}@keyframes canvas-run-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.canvas-run-status.is-running{animation:none;border-right-color:var(--brand);opacity:.6}}.canvas-run-text{display:inline-flex;align-items:center;gap:var(--sp1);font-family:var(--font-mono);font-size:var(--type-meta)}.canvas-run-text.is-passed{color:var(--green-text, var(--green))}.canvas-run-text.is-failed{color:var(--red-text, var(--red))}.canvas-run-text.is-running{color:var(--text-dim)}.canvas-run-text.is-pending{color:var(--text-faint)}.canvas-run-error{margin:0;padding:var(--sp2) var(--sp3);border:1px solid color-mix(in srgb,var(--red, #e05a57) 30%,var(--ui-line));border-radius:var(--radius);background:color-mix(in srgb,var(--red, #e05a57) 6%,transparent);font-family:var(--font-mono);font-size:var(--type-micro);color:var(--text-dim);white-space:pre-wrap;word-break:break-word}.canvas-run-logs summary{font-size:var(--type-micro);font-weight:590;color:var(--text-faint);cursor:pointer}.canvas-run-logs pre{margin:var(--sp1) 0 0;padding:var(--sp2) var(--sp3);border:1px solid var(--ui-line);border-radius:var(--radius);background:var(--surface-inset);font-size:var(--type-micro);max-height:200px;overflow:auto;white-space:pre-wrap;word-break:break-word}.canvas-run-chip{font-family:var(--font-mono)}.canvas-run-chip.is-completed{color:var(--green-text, var(--green))}.canvas-run-chip.is-failed{color:var(--red-text, var(--red))}.canvas-run-picker-wrap{position:relative;flex:0 0 auto}.canvas-run-menu{min-width:260px}.canvas-run-menu .profile-menu-item{font-family:var(--font-mono);font-size:var(--type-micro)}.canvas-run-option-meta{margin-left:auto;padding-left:var(--sp3);color:var(--text-faint)}.session-preview-chip{color:var(--brand)}.session-preview-chip:active{color:var(--brand-hover)}.canvas-detail{display:flex;flex-direction:column;flex:1;min-height:0}.canvas-detail-groups{margin:0;font-size:var(--type-meta);color:var(--text-faint)}.canvas-detail-warnings{list-style:disc;margin:0;padding-left:18px;display:flex;flex-direction:column;gap:var(--sp1);font-size:var(--type-meta);color:var(--amber-text)}.canvas-run-stub-chip{flex:0 0 auto;padding:1px 6px;border-radius:var(--radius-md);border:1px solid var(--border-warning);background:var(--bg-warning);color:var(--amber-text);font-family:var(--font-mono);font-size:var(--type-micro);font-weight:590;letter-spacing:.01em;white-space:nowrap}.canvas-stub-notice+.canvas-stub-notice{margin-top:var(--sp2)}.canvas-stub-notice-hint{margin:2px 0 var(--sp1);font-size:var(--type-micro);color:var(--text-faint)}.canvas-links-list{display:flex;flex-direction:column;gap:var(--sp2)}.canvas-link-thumb-wrap{display:inline-flex;align-items:flex-start;border:1px solid var(--ui-line);border-radius:var(--radius-md);overflow:hidden;text-decoration:none;transition:border-color var(--transition-fast);max-width:200px}.canvas-link-thumb-wrap:hover{border-color:var(--ui-line-strong)}.canvas-link-thumb-wrap:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.canvas-link-thumb{display:block;max-width:200px;max-height:120px;object-fit:cover}.canvas-link-item{display:inline-flex;align-items:center;gap:var(--sp1);font-size:var(--type-meta);color:var(--text-dim);text-decoration:none;transition:color var(--transition-fast);max-width:100%}.canvas-link-item:hover{color:var(--text);text-decoration:underline;text-underline-offset:3px}.canvas-link-item:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.canvas-link-url{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.canvas-capability-calls{display:flex;flex-direction:column;gap:var(--sp2)}.canvas-capability-call{display:flex;flex-direction:column;gap:var(--sp1);padding:var(--sp2) var(--sp3);border:1px solid var(--ui-line);border-radius:var(--radius-md);background:var(--surface-raised)}.canvas-capability-call-head{display:flex;align-items:center;gap:var(--sp2);flex-wrap:wrap}.canvas-capability-call-result{margin-top:var(--sp1)}.canvas-detail-kind{flex:0 0 auto;padding:2px 8px;border-radius:var(--radius-md);border:1px solid var(--ui-line);background:var(--surface-inset);font-size:var(--type-meta);color:var(--text-dim)}.canvas-detail-kind.node--entry,.canvas-detail-kind.node--terminal-success{color:var(--brand);border-color:var(--accent-border);background:var(--accent-dim)}.canvas-detail-kind.node--terminal-warn{color:var(--amber);border-color:var(--border-warning);background:var(--bg-warning)}.canvas-detail-body{flex:1;min-height:0;overflow-y:auto;padding:var(--sp3) var(--pane-pad-x) var(--sp4);display:flex;flex-direction:column;gap:var(--sp3)}.canvas-detail-role{margin:0;font-family:var(--font-mono);font-size:var(--type-meta);color:var(--text-faint)}.canvas-detail-desc{margin:0;font-size:var(--type-label);line-height:1.55;color:var(--text-dim)}.canvas-detail-section h4{display:flex;align-items:center;gap:var(--sp2);margin:0 0 var(--sp2);font-size:var(--type-micro);font-weight:700;letter-spacing:.01em;color:var(--text-dim)}.canvas-detail-count{padding:0 6px;border-radius:var(--radius-full);background:var(--surface-inset);color:var(--text-dim);font-variant-numeric:tabular-nums}.canvas-detail-empty{margin:0;font-size:var(--type-meta);color:var(--text-faint)}.canvas-detail-edges{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;border:1px solid var(--ui-line-strong);border-radius:var(--radius);background:var(--surface-raised);overflow:hidden}.canvas-detail-edges li+li{border-top:1px solid var(--ui-line)}.canvas-detail-edge{display:flex;align-items:center;gap:var(--sp2);width:100%;min-height:40px;padding:var(--sp1) var(--sp3);border:0;background:transparent;color:var(--text-dim);text-align:left;transition:background-color var(--transition-fast)}.canvas-detail-edge:hover{background:var(--surface-hover);color:var(--text)}.canvas-detail-edge:active{background:var(--surface-selected)}.canvas-detail-edge:focus-visible{outline-offset:-2px}.canvas-detail-edge>svg{flex:0 0 auto;color:var(--text-faint)}.canvas-detail-edge-target{flex:0 0 auto;font-size:var(--type-label)}.canvas-detail-edge-kind{flex:0 0 auto;padding:1px 6px;border-radius:var(--radius-full);border:1px solid var(--ui-line);background:var(--surface-inset);font-size:var(--type-micro);color:var(--text-faint)}.canvas-detail-edge:hover .canvas-detail-edge-target{text-decoration:underline}.canvas-detail-edge-cond{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:right;font-family:var(--font-mono);font-size:var(--type-meta);color:var(--brand)}.canvas-overview-head{display:flex;align-items:center;gap:var(--sp2);flex:0 0 auto;height:var(--pane-header-h);padding:0 var(--pane-pad-x);border-bottom:1px solid var(--ui-line);color:var(--text);font-size:var(--type-label);font-weight:510}.canvas-overview-head svg{color:var(--text-faint)}.canvas-overview-close{flex:0 0 auto;margin-left:var(--sp1)}.canvas-overview-stats{margin-left:auto;display:flex;align-items:baseline;gap:var(--sp2);font-size:var(--type-meta);font-weight:400;color:var(--text-faint)}.canvas-overview-stat strong{color:var(--text);font-weight:600;font-variant-numeric:tabular-nums}.canvas-overview-stat+.canvas-overview-stat:before{content:"·";margin-right:var(--sp2);color:var(--text-faint)}.canvas-overview-body{flex:1;min-height:0;overflow-y:auto;padding:var(--sp4) var(--pane-pad-x);font-size:var(--type-label);line-height:1.55;color:var(--text-dim)}.canvas-overview-content{display:flex;flex-direction:column;gap:var(--sp3)}.canvas-overview-title{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.canvas-overview-head .canvas-step-dot{flex:0 0 auto}.canvas-inspector-open-steps{margin-left:auto;color:var(--text-faint)}.canvas-inspector-open-steps:hover,.canvas-inspector-open-steps:focus-visible{color:var(--text-dim)}.canvas-inspector{display:flex;flex-direction:column;gap:var(--sp2)}.canvas-inspector .canvas-detail-role{margin:0}.canvas-step-transition.is-link{border:0;background:none;padding:2px var(--sp1);text-align:left;cursor:pointer;border-radius:var(--radius-sm);transition:background-color var(--transition-fast)}.canvas-step-transition.is-link:hover,.canvas-step-transition.is-link:active{background:var(--active-shade)}.canvas-step-transition.is-link:hover .canvas-step-transition-target,.canvas-step-transition.is-link:active .canvas-step-transition-target{color:var(--text);text-decoration:underline;text-underline-offset:3px}.canvas-step-transition.is-link:focus-visible{outline:2px solid var(--focus);outline-offset:1px}.canvas-inspector-run{display:flex;align-items:baseline;gap:var(--sp2);font-size:var(--type-meta)}.canvas-inspector-run-meta{color:var(--text-dim);font-variant-numeric:tabular-nums}.canvas-inspector-macros{display:flex;flex-direction:column;gap:var(--sp1);margin-top:var(--sp1);padding-top:var(--sp2);border-top:1px solid var(--ui-line)}.canvas-inspector-macro-btn{width:100%;text-align:left}.canvas-inspector-freeform{display:flex;flex-direction:column;gap:var(--sp1)}.canvas-inspector-freeform-input{width:100%;resize:vertical;padding:var(--sp1) var(--sp2);font:inherit;font-size:var(--type-label);color:var(--text);background:var(--surface-raised);border:1px solid var(--ui-line);border-radius:var(--radius-md)}.canvas-inspector-freeform-input:focus-visible{outline:2px solid var(--focus);outline-offset:1px;border-color:var(--ui-line-strong)}.canvas-inspector-freeform-ask{align-self:flex-end}.canvas-overview-desc{margin:0;color:var(--text)}.canvas-overview-notes{margin:0;padding-left:var(--sp4);display:flex;flex-direction:column;gap:var(--sp1)}.canvas-legend-row{display:flex;align-items:center;gap:var(--sp3);color:var(--text-faint);font-size:var(--type-meta)}.canvas-legend-row .dot{display:inline-block;width:7px;height:7px;border-radius:999px;margin-right:5px}.dot--entry{background:var(--brand)}.dot--step{border:1px solid var(--text-faint)}.dot--terminal{background:var(--text-faint)}.dot--pause{border:1px dashed var(--text-faint)}.dot--terminal-success{background:var(--green)}.dot--terminal-warn{background:var(--amber)}.dot--launched-workflow{border:1px dashed var(--brand)}.canvas-overview-open{position:absolute;right:var(--sp3);bottom:var(--sp3);z-index:3;background:var(--surface-raised);border:1px solid var(--ui-line);box-shadow:var(--shadow-soft);font-weight:590}.canvas-frame-wrap.is-expanded{position:fixed;top:0;right:0;bottom:0;left:0;z-index:90;background:var(--bg-0)}.canvas-view-controls{position:absolute;bottom:var(--sp3);left:var(--sp3);z-index:3;display:flex;align-items:center;gap:2px;padding:var(--sp1);background:var(--surface-raised);border:1px solid var(--ui-line);border-radius:var(--radius);box-shadow:var(--shadow-soft)}.canvas-view-controls .theme-toggle:disabled{opacity:.42;cursor:default}.canvas-zoom-reset{font-family:var(--font-mono);font-size:var(--type-micro);font-variant-numeric:tabular-nums}.canvas-iframe{flex:1;width:100%;border:none;background:#fff}.canvas-loading{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;color:var(--text-faint)}.canvas-loading--overlay{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;background:var(--bg-1)}@keyframes canvas-refresh-spin{to{transform:rotate(360deg)}}.canvas-refresh-btn.is-refreshing svg{animation:canvas-refresh-spin .9s linear infinite}.canvas-skeleton{display:flex;flex-direction:column;gap:var(--sp3);padding:var(--sp5);opacity:1;transition:opacity .32s ease-out}.canvas-skeleton.is-fading{opacity:0;pointer-events:none}.canvas-skeleton-row{display:flex;gap:var(--sp3)}@keyframes canvas-skeleton-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.canvas-skeleton-block{flex:1;height:44px;border-radius:var(--radius);background:linear-gradient(100deg,var(--surface-inset) 40%,var(--surface-hover) 50%,var(--surface-inset) 60%);background-size:200% 100%;animation:canvas-skeleton-shimmer 1.6s ease-in-out infinite}.canvas-skeleton-title{flex:0 0 auto;height:16px;max-width:40%}.canvas-skeleton-wide{flex:0 0 auto;height:24px}@media(prefers-reduced-motion:reduce){.canvas-refresh-btn.is-refreshing svg{animation:none;opacity:.6}.canvas-skeleton-block{animation:none}}.canvas-pan-layer{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;cursor:grab;touch-action:none}.canvas-pan-layer.is-panning{cursor:grabbing}.canvas-pan-layer[data-over-node]{cursor:pointer}.canvas-expand-exit{position:absolute;top:var(--sp3);right:var(--sp3);z-index:4;background:var(--surface-raised);box-shadow:var(--shadow-sm)}.canvas-render-error{position:absolute;top:0;right:0;bottom:0;left:0;z-index:2;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--sp3);padding:var(--sp5);text-align:center}.canvas-error-icon{display:flex;color:var(--amber)}.canvas-error-summary{margin:0;max-width:44ch;font-size:var(--type-label);line-height:1.55;color:var(--text-dim);overflow-wrap:anywhere}.canvas-error-actions{display:flex;gap:var(--sp2)}.canvas-error-details{max-width:52ch;font-size:var(--type-meta);color:var(--text-faint)}.canvas-error-details summary{cursor:pointer}.canvas-error-details pre{margin:var(--sp2) 0 0;padding:var(--sp2) var(--sp3);text-align:left;white-space:pre-wrap;overflow-wrap:anywhere;font-family:var(--font-mono);background:var(--surface-inset);border:1px solid var(--ui-line);border-radius:var(--radius)}.code-panel{flex:1;min-height:0;display:flex;flex-direction:column}.code-panel-empty{flex:1;min-height:0}.code-panel-body{flex:1;min-height:0;overflow-y:auto;padding:var(--sp2) var(--pane-pad-x) var(--sp4)}.code-panel-header .workflow-deployed-tag,.code-panel-draft-tag{flex:0 0 auto;margin-left:auto}.code-panel .snippet-panel{border:1px solid var(--ui-line);border-bottom:1px solid var(--ui-line);border-radius:var(--radius-md);background:var(--bg-1);padding-top:var(--sp1);padding-bottom:var(--sp1)}.code-panel .snippet-panel-header,.code-panel .snippet-slug-row,.code-panel .snippet-slug-inferred,.code-panel .snippet-tabs,.code-panel .snippet-hint{padding-left:var(--sp3);padding-right:var(--sp3)}.code-panel .snippet-code-wrap{margin-left:var(--sp3);margin-right:var(--sp3)}.code-panel .snippet-code{max-height:24rem}.snippet-panel{display:flex;flex-direction:column;flex:0 0 auto;border-bottom:1px solid var(--border);background:var(--surface-raised)}.snippet-panel-header{display:flex;align-items:center;padding:var(--sp2) var(--pane-pad-x) var(--sp1)}.snippet-panel-title{font-size:var(--type-micro);font-weight:700;letter-spacing:.01em;color:var(--text-faint)}.snippet-slug-row{display:flex;align-items:center;gap:var(--sp2);padding:0 var(--pane-pad-x) var(--sp1)}.snippet-slug-label{font-size:var(--type-micro);font-weight:600;color:var(--text-faint);white-space:nowrap;flex-shrink:0}.snippet-slug{flex:1;min-width:0;overflow-x:auto;background:var(--surface-inset);border:1px solid var(--ui-line);border-radius:var(--radius);padding:3px var(--sp2);color:var(--text);font-family:var(--font-mono);font-size:var(--type-meta);white-space:nowrap}.snippet-slug-inferred{margin:0;padding:0 var(--pane-pad-x) var(--sp1);font-size:var(--type-micro);line-height:1.4;color:var(--text-faint)}.snippet-tabs{display:flex;gap:2px;padding:0 var(--pane-pad-x) var(--sp1)}.snippet-tab{padding:3px var(--sp2);font-size:var(--type-meta);font-weight:510;color:var(--text-faint);background:transparent;border:1px solid transparent;border-radius:var(--radius);cursor:pointer;transition:background-color var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast)}.snippet-tab:hover{color:var(--text-dim);background:var(--bg-hover)}.snippet-tab:active{transform:translateY(.5px)}.snippet-tab.is-active{color:var(--text);background:var(--bg-1);border-color:var(--border-strong);box-shadow:var(--shadow-xs)}.snippet-tab:focus-visible{outline:2px solid var(--focus);outline-offset:1px}.snippet-code-wrap{position:relative;margin:0 var(--pane-pad-x) var(--sp1)}.snippet-code{margin:0;padding:var(--sp2) var(--sp3);padding-right:56px;background:var(--surface-inset);border:1px solid var(--ui-line);border-radius:var(--radius);font-family:var(--font-mono);font-size:var(--type-meta);line-height:1.55;color:var(--text-dim);overflow-x:auto;white-space:pre;max-height:10rem;overflow-y:auto}.snippet-copy{position:absolute;top:var(--sp1);right:var(--sp1);padding:2px var(--sp2);font-size:var(--type-micro);font-weight:510;color:var(--text-faint);background:var(--surface-raised);border:1px solid var(--border-strong);border-radius:var(--radius);box-shadow:var(--shadow-xs);cursor:pointer;transition:color var(--transition-fast),background-color var(--transition-fast),border-color var(--transition-fast)}.snippet-copy:hover:not(.is-copied){color:var(--text);border-color:var(--accent-border)}.snippet-copy:active:not(.is-copied){transform:translateY(.5px)}.snippet-copy:focus-visible{outline:2px solid var(--focus);outline-offset:1px}.snippet-copy.is-copied{color:var(--brand);border-color:var(--accent-border);background:var(--accent-dim);cursor:default}.snippet-hint{margin:0;padding:0 var(--pane-pad-x) var(--sp2);font-size:var(--type-micro);color:var(--text-faint);line-height:1.5}.snippet-hint code{font-family:var(--font-mono);font-size:var(--type-micro);color:var(--text-dim)}.snippet-link{color:var(--brand);text-decoration:none;font-weight:510}.snippet-link:hover{text-decoration:underline}.snippet-link:focus-visible{outline:2px solid var(--focus);outline-offset:1px;border-radius:2px}@media(prefers-reduced-motion:reduce){.snippet-tab,.snippet-copy{transition:none}.snippet-tab:active,.snippet-copy:active:not(.is-copied){transform:none}}.canvas-empty{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;text-align:center;padding:var(--sp5) var(--pane-pad-x);color:var(--text-faint);font-size:var(--type-label);line-height:1.6;background-image:radial-gradient(color-mix(in srgb,var(--text) 10%,transparent) 1px,transparent 1px);background-size:16px 16px}.canvas-empty code{color:var(--text-dim);font-family:var(--font-mono);font-size:var(--type-meta)}.canvas-empty-hint{max-width:320px;color:var(--text-faint);font-size:var(--type-meta)}.canvas-visualize-cta{position:relative;display:flex;align-items:center;gap:6px;margin:4px 0}.canvas-task-activity,.canvas-task-failed{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--sp3);text-align:center;padding:var(--sp5);color:var(--text-dim);font-size:var(--type-label);line-height:1.6}.canvas-task-activity--overlay{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;background:color-mix(in srgb,var(--bg-1) 88%,transparent);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.canvas-task-activity--overlay:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background-image:radial-gradient(color-mix(in srgb,var(--text) 10%,transparent) 1px,transparent 1px);background-size:16px 16px;animation:canvas-grid-shimmer 2.6s ease-in-out infinite;pointer-events:none}@keyframes canvas-grid-shimmer{0%,to{opacity:.45}50%{opacity:1}}.canvas-task-activity--overlay>*{position:relative}.canvas-task-icon{display:flex;align-items:center;justify-content:center;color:var(--brand);animation:canvas-task-breathe 2s ease-in-out infinite}@keyframes canvas-task-breathe{0%,to{opacity:.6;transform:translateY(0)}50%{opacity:1;transform:translateY(-2px)}}@media(prefers-reduced-motion:reduce){.canvas-task-activity--overlay:before,.canvas-task-icon{animation:none}}.canvas-task-title{display:flex;align-items:center;gap:var(--sp2);color:var(--text);font-size:var(--type-label);font-weight:510}.canvas-task-spinner{width:8px;height:8px;border-radius:50%;flex:0 0 auto;background:var(--accent);animation:session-tab-busy-pulse 1.2s ease-in-out infinite}.canvas-task-lines{list-style:none;margin:0;padding:0;max-width:340px;width:100%;display:flex;flex-direction:column;align-items:center;text-align:center;gap:2px;font-family:var(--font-mono);font-size:var(--type-meta);text-align:left;color:var(--text-faint)}.canvas-task-lines li{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.canvas-task-lines li:last-child{color:var(--text-dim)}.canvas-task-error{max-width:340px;max-height:160px;width:100%;overflow:auto;margin:0;padding:var(--sp2) var(--sp3);text-align:left;font-family:var(--font-mono);font-size:var(--type-meta);line-height:1.5;white-space:pre-wrap;word-break:break-word;color:var(--text-faint);background:var(--bg-inset, rgba(128, 128, 128, .08));border:1px solid var(--border);border-radius:var(--radius-md)}.canvas-task-actions{display:flex;align-items:center;gap:8px}.btn-ghost{background:transparent;border:1px solid var(--border-strong);color:var(--text-dim);border-radius:var(--radius-md);box-shadow:var(--shadow-xs);padding:5px 10px;font-size:var(--type-label);font-weight:500;transition:background-color var(--transition-fast),border-color var(--transition-fast),color var(--transition-fast)}.btn-ghost:hover:not(:disabled){background:var(--surface-hover);border-color:var(--ui-line-strong);color:var(--text)}.btn-ghost:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.btn-primary{background:var(--accent);border:1px solid transparent;color:var(--accent-foreground);font-weight:500;border-radius:var(--radius-md);box-shadow:var(--shadow-xs);padding:5px 10px;font-size:var(--type-label);transition:background-color var(--transition-fast)}.btn-primary:hover:not(:disabled){background:var(--accent-hover)}.btn-primary:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.btn-ghost:disabled,.btn-primary:disabled{opacity:.42;cursor:default}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--scrim-bg);display:flex;align-items:center;justify-content:center;z-index:100;animation:fade-in var(--transition-fast) ease-out}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.modal{background:var(--bg-2);border:1px solid var(--border-strong);border-radius:var(--radius-lg);padding:24px;width:380px;max-width:calc(100vw - 32px);box-shadow:var(--shadow-lg);animation:pop-in var(--transition-fast) ease-out}.command-palette{width:480px;padding:0;overflow:hidden}.command-palette-input{width:100%;height:var(--pane-header-h);padding:0 var(--pane-pad-x);border:none;border-bottom:1px solid var(--border);background:transparent;color:var(--text);font-size:var(--type-body);transition:border-color var(--transition-fast)}.command-palette-input:focus{outline:none;border-bottom-color:var(--accent)}.command-palette-list{max-height:320px;overflow-y:auto;padding:6px}.command-palette-empty{padding:12px 10px;color:var(--text-faint);font-size:var(--type-label)}.command-palette-item{display:flex;align-items:center;gap:8px;width:100%;padding:7px 10px;border:none;background:transparent;border-radius:var(--radius-sm);color:var(--text-dim);text-align:left;transition:background-color var(--transition-fast)}.command-palette-item.is-selected{background:var(--accent);color:var(--accent-foreground)}.command-palette-item-label{font-size:var(--type-ui);color:var(--text);flex:0 0 auto;max-width:40%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.command-palette-item-meta{font-size:var(--type-meta);color:var(--text-faint);font-family:var(--font-mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.command-palette-item.is-selected .command-palette-item-label,.command-palette-item.is-selected .command-palette-item-meta{color:var(--accent-foreground)}.modal-header{font-size:var(--type-ui);font-weight:600;padding-bottom:16px;margin-bottom:12px;border-bottom:1px solid var(--border)}.modal-input{width:100%;background:var(--bg-3);border:1px solid var(--border-strong);border-radius:var(--radius-md);box-shadow:var(--shadow-xs);height:var(--control-h-xs);padding:0 var(--sp2);color:var(--text);font-size:var(--type-ui);transition:border-color var(--transition-fast)}.modal-input:focus{outline:2px solid var(--focus);outline-offset:2px}.modal-error{color:var(--red);font-size:var(--type-label);margin-top:8px}.modal-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:20px;padding-top:16px;border-top:1px solid var(--border)}.recent-dirs{display:flex;align-items:center;flex-wrap:nowrap;gap:var(--sp1);height:var(--pane-header-h);margin-inline:calc(-1 * var(--modal-pad-x, var(--sp5)));padding-inline:var(--modal-pad-x, var(--sp5));border-bottom:1px solid var(--ui-line);overflow-x:auto;scrollbar-width:none}.recent-dirs::-webkit-scrollbar{display:none}.recent-dir-chip{display:inline-flex;align-items:center;flex:0 0 auto;height:var(--control-h-xs);background:var(--bg-3);border:1px solid var(--border-strong);color:var(--text-dim);border-radius:var(--radius-md);padding:0 var(--sp3);font-size:var(--type-meta);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transition:color var(--transition-fast),border-color var(--transition-fast)}.recent-dir-chip:hover{color:var(--text);border-color:var(--accent)}.recent-dir-chip:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.modal-new-session,.modal-add-workspace,.modal-confirm{--modal-pad-x: var(--pane-pad-x);width:440px;padding:0}.modal-confirm{width:400px}.modal-close{margin-left:auto}.modal-primary-cta{min-width:128px}.modal-confirm .modal-header{display:flex;align-items:center;min-height:var(--pane-header-h);padding:0 var(--modal-pad-x);margin-bottom:0}.modal-confirm .modal-body{padding:var(--sp4) var(--modal-pad-x)}.modal-copy{margin:0;color:var(--text-dim);font-size:var(--type-ui);line-height:1.55}.modal-confirm .modal-actions{margin-top:0;padding:var(--sp3) var(--modal-pad-x)}.btn-danger{display:inline-flex;align-items:center;justify-content:center;height:var(--control-h-xs);padding:0 var(--sp3);border:1px solid transparent;border-radius:var(--radius);background:var(--red);color:#fff;font-weight:510;font-size:var(--type-label);transition:background-color var(--transition-fast),transform var(--transition-fast)}.btn-danger:hover{transform:translateY(-1px)}.btn-danger:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.modal-new-session .modal-header,.modal-add-workspace .modal-header{display:flex;align-items:center;min-height:var(--pane-header-h);padding:0 var(--modal-pad-x);margin-bottom:0}.modal-body{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--sp4);padding:0 var(--modal-pad-x, var(--sp5))}.modal-field-hint{margin:0;padding-bottom:var(--sp2);font-size:var(--type-meta);color:var(--text-faint);line-height:1.5}.modal-section{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--sp1);min-width:0}.modal-new-session .modal-actions,.modal-add-workspace .modal-actions{margin-top:0;padding:var(--sp3) var(--modal-pad-x)}.harness-select{display:inline-flex;align-items:center;gap:var(--sp2);min-width:0;margin-right:auto;height:var(--control-h-xs);padding:0 var(--sp2);max-width:15rem;background:var(--surface-inset);border:1px solid var(--ui-line);border-radius:var(--radius);color:var(--text);font-size:var(--type-label);cursor:pointer;transition:background-color var(--transition-fast),color var(--transition-fast)}.harness-select:hover:not(:disabled),.harness-select[aria-expanded=true]{background:var(--surface-hover)}.harness-select:active:not(:disabled){background:var(--active-shade)}.harness-select:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.harness-select:disabled{opacity:.42;cursor:default}.harness-select-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media(prefers-reduced-motion:reduce){.harness-select{transition:none}}.harness-select-menu{min-width:230px;z-index:140}.dir-picker-inputrow{display:flex;align-items:center;gap:var(--sp2);height:var(--pane-header-h);margin-inline:calc(-1 * var(--modal-pad-x, var(--sp5)));padding-inline:var(--modal-pad-x, var(--sp5));border-bottom:1px solid var(--ui-line)}.dir-picker-up{flex:0 0 auto;width:var(--control-h-xs);height:var(--control-h-xs);display:flex;align-items:center;justify-content:center;background:var(--bg-3);border:1px solid var(--border-strong);border-radius:var(--radius-md);box-shadow:var(--shadow-xs);color:var(--text-dim);transition:background-color var(--transition-fast),border-color var(--transition-fast),color var(--transition-fast)}.dir-picker-up:hover:not(:disabled){background:var(--surface-hover);border-color:var(--ui-line-strong);color:var(--text)}.dir-picker-up:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.dir-picker-up:disabled{opacity:.42;cursor:default}.dir-picker-input{flex:1;font-family:var(--font-mono)}.dir-picker-listing{margin:0 calc(-1 * var(--modal-pad-x, var(--sp5)));border-top:0;border-block:1px solid var(--ui-line);background:var(--surface-inset);max-height:180px;overflow-y:auto}.dir-picker-path{position:sticky;top:0;padding:var(--sp1) var(--modal-pad-x, var(--sp5));font-size:var(--type-micro);font-family:var(--font-mono);color:var(--text-faint);background:var(--bg-3);border-bottom:1px solid var(--border)}.dir-picker-newdir{padding:var(--sp2) var(--modal-pad-x, var(--sp5));font-size:var(--type-label);color:var(--brand)}.dir-picker-empty{padding:var(--sp2) var(--modal-pad-x, var(--sp5));font-size:var(--type-label);color:var(--text-faint)}.dir-picker-item{display:flex;align-items:center;gap:var(--sp2);width:100%;height:var(--control-h-xs);padding:0 var(--modal-pad-x, var(--sp5));border:none;background:transparent;border-radius:0;color:var(--text-dim);font-size:var(--type-ui);text-align:left;transition:background-color var(--transition-fast)}.dir-picker-item:hover{background:var(--surface-hover);color:var(--text)}.toast{position:fixed;left:50%;bottom:24px;transform:translate(-50%);display:flex;align-items:center;gap:10px;max-width:480px;padding:10px 14px;background:var(--bg-2);border:1px solid var(--border-strong);border-left:3px solid var(--red);border-radius:var(--radius-md);box-shadow:var(--shadow-md);z-index:100;animation:pop-in var(--transition-fast) ease-out}.toast-message{color:var(--text);font-size:var(--type-ui);line-height:1.4}.toast-dismiss{border:none;background:transparent;color:var(--text-faint);font-size:var(--type-h2);line-height:1;cursor:pointer;padding:0 2px;border-radius:var(--radius-sm);transition:color var(--transition-fast)}.toast-dismiss:hover{color:var(--text)}.toast-dismiss:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.right-pane{display:flex;flex-direction:column;background:var(--bg-1);min-width:0;min-height:0;overflow:hidden;container:rightpane / inline-size}@container rightpane (max-width: 360px){.right-pane-tabs{gap:2px;padding:0 var(--sp2)}.right-pane-tab{padding:3px var(--sp2)}}.right-pane-tabs{display:flex;align-items:center;gap:var(--sp1);flex-shrink:0;height:var(--pane-header-h);padding:0 var(--pane-pad-x);border-bottom:1px solid var(--border);background:var(--surface-raised)}.right-pane-tab{padding:3px 10px;font-size:var(--type-label);font-weight:500;color:var(--text-faint);background:transparent;border:1px solid transparent;border-radius:var(--radius-md);cursor:pointer;transition:background-color var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast)}.right-pane-tab:hover{color:var(--text-dim);background:var(--bg-hover)}.right-pane-tab.is-active{color:var(--text);background:var(--bg-1);border-color:var(--border-strong);box-shadow:var(--shadow-xs)}.right-pane-tab:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.right-pane-panel{display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden}.right-pane-panel.is-hidden,.right-pane.is-collapsed{display:none}.right-pane-collapse{margin-left:auto}.right-pane-panel>.canvas-pane{flex:1;min-height:0}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#a1a1aabf;border-radius:var(--radius-sm)}::-webkit-scrollbar-thumb:hover{background:#a1a1aae6}*{scrollbar-width:thin;scrollbar-color:rgba(161,161,170,.75) transparent}.agent-view{position:relative;flex:1;min-height:0}.agent-view-panel{position:absolute;top:0;right:0;bottom:0;left:0;min-height:0}.shell-scrim{display:none}@media(max-width:768px){.workspace-main{min-width:0}.shell-scrim{display:block;position:fixed;top:0;right:0;bottom:0;left:0;z-index:79;background:var(--scrim-bg);animation:fade-in var(--transition-fast)}.rail-workflows{position:fixed;inset:0 auto 0 0;z-index:80;width:min(20rem,85vw)!important;min-width:0!important;border-right:1px solid var(--border-strong);box-shadow:var(--shadow-lg);animation:shell-drawer-in .3s var(--ease)}.right-pane{position:fixed;left:0;right:0;bottom:0;top:var(--pane-header-h);z-index:80;border-top:1px solid var(--border-strong);box-shadow:var(--shadow-lg);animation:shell-sheet-in .3s var(--ease)}}@keyframes shell-drawer-in{0%{transform:translate(-100%)}}@keyframes shell-sheet-in{0%{transform:translateY(100%)}}@media(prefers-reduced-motion:reduce){.rail-workflows,.right-pane,.shell-scrim{animation:none}}.command-palette-row{display:contents}.command-palette-section{font-size:var(--type-micro);font-weight:700;letter-spacing:.01em;color:var(--text-faint);padding:4px 10px;margin-top:var(--sp2)}.command-palette-row:first-child .command-palette-section{margin-top:0}.palette-match{font-weight:700;color:var(--text)}.command-palette-item-meta .palette-match{color:var(--text-dim)}.command-palette-item.is-selected .palette-match{color:var(--accent-foreground)}.command-palette-error{padding:12px 10px;color:var(--red);font-size:var(--type-label)}.modal-scaffold-cta{display:inline-flex;align-items:center;gap:var(--sp2);margin-bottom:var(--sp2)}.modal-scan-btn{display:inline-flex;align-items:center;gap:var(--sp2);margin-right:auto}.mcp-install{display:flex;flex-direction:column;gap:var(--sp2);margin:var(--sp2) 0 var(--sp3);padding:var(--sp3);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-2)}.mcp-install-title{font-size:var(--type-label);font-weight:600;color:var(--text)}.mcp-install-hint{margin:0;font-size:var(--type-meta);color:var(--text-faint);line-height:1.5}.mcp-install-actions{display:flex;flex-wrap:wrap;gap:var(--sp2)}.mcp-install-copy{display:inline-flex;align-items:center;gap:var(--sp2)}.recent-dirs[data-fade=right]{-webkit-mask-image:linear-gradient(to right,black calc(100% - 32px),transparent);mask-image:linear-gradient(to right,black calc(100% - 32px),transparent)}.recent-dirs[data-fade=left]{-webkit-mask-image:linear-gradient(to right,transparent,black 32px);mask-image:linear-gradient(to right,transparent,black 32px)}.recent-dirs[data-fade=both]{-webkit-mask-image:linear-gradient(to right,transparent,black 32px,black calc(100% - 32px),transparent);mask-image:linear-gradient(to right,transparent,black 32px,black calc(100% - 32px),transparent)}.dir-picker-error{display:flex;align-items:center;gap:var(--sp2);padding:var(--sp2) var(--modal-pad-x, var(--sp5));font-size:var(--type-label);color:var(--red)}.dir-picker-error>span{flex:1;min-width:0}.dir-picker-retry{flex:0 0 auto}.dead-session-detail{display:flex;flex-direction:column;gap:var(--sp1);min-width:240px;max-width:360px;margin:var(--sp2) 0 var(--sp3);padding:var(--sp2) var(--sp3);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-2);text-align:left}.dead-session-detail-row{display:flex;justify-content:space-between;gap:var(--sp4);font-size:var(--type-label)}.dead-session-detail-row dt{color:var(--text-faint);flex:0 0 auto}.dead-session-detail-row dd{margin:0;color:var(--text-dim);text-align:right;overflow-wrap:anywhere}.modal-templates{--modal-pad-x: var(--pane-pad-x);width:720px;max-width:calc(100vw - var(--sp6));max-height:min(600px,calc(100vh - var(--sp7)));padding:0;display:flex;flex-direction:column}.modal-templates .modal-header{display:flex;align-items:center;flex:0 0 auto;min-height:var(--pane-header-h);padding:0 var(--modal-pad-x);margin-bottom:0}.templates-layout{display:grid;grid-template-columns:232px minmax(0,1fr);flex:1;min-height:0}.templates-list{display:flex;flex-direction:column;gap:var(--sp1);padding:var(--sp2);border-right:1px solid var(--ui-line);overflow-y:auto}.templates-list-section{padding:var(--sp2) var(--sp2) 0;font-size:var(--type-micro);font-weight:700;letter-spacing:.01em;color:var(--text-faint)}.template-row{display:flex;flex-direction:column;align-items:stretch;gap:var(--sp1);padding:var(--sp2);border:none;border-radius:var(--radius-sm);background:transparent;text-align:left;transition:background-color var(--transition-fast)}.template-row:hover{background:var(--surface-hover)}.template-row:active{background:var(--active-shade)}.template-row:focus-visible{outline:2px solid var(--focus);outline-offset:-2px}.template-row.is-selected{background:var(--accent)}.template-row-name{font-size:var(--type-ui);font-weight:550;color:var(--text)}.template-row-desc{font-size:var(--type-meta);color:var(--text-faint);line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.template-row.is-selected .template-row-name,.template-row.is-selected .template-row-desc{color:var(--accent-foreground)}.template-detail{display:flex;flex-direction:column;gap:var(--sp3);padding:var(--sp4) var(--modal-pad-x);overflow-y:auto}.template-detail-head{display:flex;align-items:baseline;gap:var(--sp2);flex-wrap:wrap}.template-detail-name{margin:0;font-size:var(--type-body);font-weight:600;color:var(--text)}.template-tags{display:inline-flex;gap:var(--sp1)}.template-tag{padding:0 var(--sp1);border:1px solid var(--ui-line);border-radius:var(--radius-sm);font-size:var(--type-micro);color:var(--text-faint)}.template-byline{font-size:var(--type-meta);color:var(--text-faint)}.template-byline a{color:inherit}.template-byline a:focus-visible{outline:2px solid var(--focus);outline-offset:2px;border-radius:var(--radius-sm)}.template-lead{margin:0;font-size:var(--type-ui);color:var(--text-dim);line-height:1.55}.template-section{display:flex;flex-direction:column;gap:var(--sp2)}.template-section-title{margin:0;font-size:var(--type-micro);font-weight:700;letter-spacing:.01em;color:var(--text-faint)}.template-steps{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:var(--sp2)}.template-step{display:flex;align-items:baseline;gap:var(--sp2)}.template-step-index{flex:0 0 auto;font-family:var(--font-mono);font-size:var(--type-meta);color:var(--text-faint)}.template-step-copy{display:flex;flex-direction:column;gap:0;min-width:0;flex:1}.template-step-name{display:inline-flex;align-items:baseline;gap:var(--sp2);font-family:var(--font-mono);font-size:var(--type-label);color:var(--text)}.template-step-exit{padding:0 var(--sp1);border:1px solid var(--ui-line);border-radius:var(--radius-sm);font-family:var(--font);font-size:var(--type-micro);color:var(--text-faint)}.template-step-desc{font-size:var(--type-meta);color:var(--text-faint);line-height:1.4}.template-graph{display:flex;flex-direction:column;gap:var(--sp2);padding:var(--sp3);border:1px solid var(--ui-line);border-radius:var(--radius);background:var(--surface-inset)}.template-graph-item{display:flex;flex-direction:column;gap:var(--sp1)}.template-graph-node{display:flex;align-items:center;gap:var(--sp2);font-size:var(--type-meta);color:var(--text)}.template-graph-name{font-weight:510}.template-graph-edge{padding-left:var(--sp4)}.template-caps{display:flex;flex-wrap:wrap;gap:var(--sp1)}.template-cap{flex:0 0 auto;padding:0 var(--sp1);border:1px solid var(--ui-line);border-radius:var(--radius-sm);background:var(--surface-inset);font-family:var(--font-mono);font-size:var(--type-micro);color:var(--text-dim)}.template-note{margin:0;font-size:var(--type-meta);color:var(--text-faint);line-height:1.5}.template-usecases{margin:0;padding-left:var(--sp4);display:flex;flex-direction:column;gap:var(--sp1);font-size:var(--type-meta);color:var(--text-dim);line-height:1.5}.template-example{border:1px solid var(--ui-line);border-radius:var(--radius-sm)}.template-example-summary{padding:var(--sp2);font-size:var(--type-meta);color:var(--text-dim);cursor:pointer;border-radius:var(--radius-sm);transition:background-color var(--transition-fast)}.template-example-summary:hover{background:var(--surface-hover)}.template-example-summary:focus-visible{outline:2px solid var(--focus);outline-offset:-2px}.template-example-body{display:flex;flex-direction:column;gap:var(--sp1);padding:var(--sp2);border-top:1px solid var(--ui-line)}.template-example-label{font-size:var(--type-micro);font-weight:700;color:var(--text-faint)}.template-example-json{margin:0;padding:var(--sp2);border-radius:var(--radius-sm);background:var(--surface-inset);font-family:var(--font-mono);font-size:var(--type-micro);color:var(--text-dim);white-space:pre-wrap;overflow-wrap:anywhere}.template-notes{font-size:var(--type-meta);color:var(--text-dim);line-height:1.5}.template-notes p{margin:0 0 var(--sp2)}.template-notes p:last-child{margin-bottom:0}.template-handoff{margin:0;padding-top:var(--sp2);border-top:1px solid var(--ui-line);font-size:var(--type-meta);color:var(--text-faint);line-height:1.5}.templates-actions{flex:0 0 auto;align-items:center;margin-top:0;padding:var(--sp3) var(--modal-pad-x)}.templates-dest{flex:1;min-width:0;display:flex;flex-direction:column;gap:var(--sp1)}.templates-dest .modal-input{font-family:var(--font-mono);font-size:var(--type-label)}.templates-dest-hint,.templates-dest-error{font-size:var(--type-micro);line-height:1.4}.templates-dest-hint{color:var(--text-faint)}.templates-dest-error{margin-top:0}.modal-templates-cta{display:inline-flex;align-items:center;gap:var(--sp2);margin-bottom:var(--sp2);align-self:start}@media(max-width:768px){.modal-templates{max-height:calc(100dvh - var(--sp6))}.templates-layout{grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(0,1fr)}.templates-list{max-height:176px;border-right:none;border-bottom:1px solid var(--ui-line)}.templates-actions{flex-wrap:wrap}.templates-dest{flex:1 1 100%}}@media(prefers-reduced-motion:reduce){.template-row,.template-example-summary{transition:none}}body{font-size:var(--type-ui, 13px)}.session-item-meta,.session-item-cwd,.palette-trigger-hint,.session-history-badge{font-family:var(--font-mono);font-variant-numeric:tabular-nums}.brand-name{font-size:var(--type-body);font-weight:590;letter-spacing:-.03em}.brand-product{font-weight:510;letter-spacing:-.01em}.brand-divider{height:16px;background:var(--ui-line-strong, var(--border-strong))}.theme-toggle{width:var(--control-h-xs);height:var(--control-h-xs);border-radius:var(--radius)}.theme-toggle:active{transform:scale(.96)}.brand-identity{font-family:var(--font-mono);font-size:var(--type-meta);letter-spacing:-.01em}.rail{background:var(--surface-raised);border-right:1px solid var(--ui-line, var(--border))}.workflow-item{border-radius:var(--radius);border:1px solid transparent}.workflow-item:hover{background:var(--surface-hover, var(--bg-hover))}.pane-resize-handle{width:9px;background:transparent}.pane-resize-handle:before{content:"";position:absolute;inset:0 auto 0 50%;width:1px;transform:translate(-50%);background:var(--ui-line, var(--border));transition:width var(--fast, .13s) var(--ease),background-color var(--fast, .13s) var(--ease)}.pane-resize-handle:hover,.pane-resize-handle:active{background:transparent}.pane-resize-handle:hover:before,.pane-resize-handle:active:before,.pane-resize-handle:focus-visible:before{width:2px;background:var(--brand)}.pane-resize-handle:focus-visible{outline:none}.center-pane{border-right:1px solid var(--ui-line, var(--border));background:var(--surface-base, var(--bg-0))}.terminal-empty,.rail-empty{color:var(--text-faint)}.session-bar{background:var(--surface-raised);border-bottom:1px solid var(--ui-line, var(--border))}.session-workflow-chip{background:transparent;border:0;padding:0;color:var(--text-faint);font-size:var(--type-meta);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.btn-ghost,.btn-primary{display:inline-flex;align-items:center;justify-content:center;gap:var(--sp1);border-radius:var(--radius);height:var(--control-h-xs);padding:0 var(--sp3);font-weight:510;transition:background-color var(--fast, .13s) var(--ease),border-color var(--fast, .13s) var(--ease),color var(--fast, .13s) var(--ease),transform var(--fast, .13s) var(--ease)}.btn-ghost{border-color:var(--ui-line, var(--border));box-shadow:none}.btn-ghost:hover:not(:disabled){transform:translateY(-1px)}.btn-primary{background:var(--btn);color:var(--btn-ink);border-color:transparent;box-shadow:none}.btn-primary:hover:not(:disabled){background:var(--btn);transform:translateY(-1px);box-shadow:var(--shadow-soft)}.right-pane{background:var(--surface-raised)}.right-pane-tabs{background:var(--surface-raised);border-bottom:1px solid var(--ui-line, var(--border))}.right-pane-tab{display:inline-flex;align-items:center;border-radius:var(--radius);height:var(--control-h-xs);padding:0 var(--sp3);font-weight:510}.right-pane-tab:hover{background:var(--surface-hover, var(--bg-hover))}.right-pane-tab.is-active{background:var(--active-shade);border-color:var(--ui-line, var(--border));box-shadow:none;color:var(--text)}.canvas-pane,.right-pane-panel{background:var(--surface-raised)}.canvas-empty,.canvas-empty-hint{color:var(--text-dim)}.canvas-empty-hint code{font-family:var(--font-mono);font-size:var(--type-meta);padding:1px 5px;border-radius:var(--radius);background:var(--surface-inset, var(--bg-2))}.canvas-frame-wrap{animation:refine-content-in var(--base, .22s) var(--ease) both}.modal-backdrop{background:var(--scrim-bg, rgba(3, 3, 5, .55));-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.modal,.command-palette,.settings-popover{border:1px solid var(--ui-line-strong, var(--border-strong));border-radius:var(--radius);box-shadow:var(--shadow);animation:refine-dialog-in var(--base, .22s) var(--ease) both}.settings-popover{border-radius:var(--radius)}.rail-empty,.workspace-group-empty,.terminal-empty,.canvas-empty,.skills-empty,.skills-loading,.dir-picker-empty,.session-dropdown-empty,.command-palette-empty{color:var(--text-faint);font-size:var(--type-label, 12px);line-height:1.5}.skills-error,.modal-error,.welcome-error,.command-palette-error,.dir-picker-error{color:var(--red-text);font-size:var(--type-label, 12px);line-height:1.5}.command-palette-error,.dir-picker-error{padding:var(--sp2, 8px) var(--sp3, 12px);font-family:var(--font-mono);font-size:var(--type-meta, 11px)}.dir-picker-error{padding:var(--sp2, 8px) var(--sp5, 24px)}.workflow-dot,.session-dot{box-shadow:none}@keyframes refine-content-in{0%{opacity:.35;transform:translateY(5px)}to{opacity:1;transform:translateY(0)}}@keyframes refine-dialog-in{0%{opacity:0;transform:translateY(8px) scale(.985)}to{opacity:1;transform:translateY(0) scale(1)}}@media(prefers-reduced-motion:reduce){.btn-ghost:hover:not(:disabled),.btn-primary:hover:not(:disabled){transform:none}.canvas-frame-wrap,.modal,.command-palette,.settings-popover{animation-duration:1ms}}