@zq-silk/yui 2.0.0 → 2.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 (138) hide show
  1. package/README.md +4 -0
  2. package/dist/cli/commandCatalog.js +318 -289
  3. package/dist/cli/commandDiscovery.js +72 -0
  4. package/dist/cli/completion.js +22 -227
  5. package/dist/cli/dynamicCompletion.js +12 -6
  6. package/dist/cli/invocationAuthority.js +2 -2
  7. package/dist/cli/invocationRouter.js +18 -7
  8. package/dist/cli.js +23 -3030
  9. package/dist/commands/capabilityCommands.js +5 -5
  10. package/dist/commands/globalRoleCommands.js +2 -1
  11. package/dist/commands/taskCommands.js +90 -21
  12. package/dist/commands/taskIntegrationCommands.js +3 -1
  13. package/dist/commands/taskUpstreamCommands.js +3 -1
  14. package/dist/context/runContextPack.js +132 -5
  15. package/dist/context/sourceRunContext.js +4 -2
  16. package/dist/context/taskContext.js +12 -3
  17. package/dist/controlPlaneCli.js +3092 -0
  18. package/dist/controller/fileSchedulerStoreAdapter.js +19 -6
  19. package/dist/controller/jobControl.js +21 -0
  20. package/dist/executor/agentExecutor.js +1 -1
  21. package/dist/executor/effectiveLaunch.js +18 -5
  22. package/dist/executor/fileRoleLaunchPlanner.js +15 -19
  23. package/dist/integration/gitIntegrationService.js +50 -15
  24. package/dist/kernel/accessAssessment.js +1 -0
  25. package/dist/kernel/builtinCapabilities.js +28 -1
  26. package/dist/kernel/capabilityRegistry.js +64 -19
  27. package/dist/message/messageContinuation.js +7 -2
  28. package/dist/nativeAgent/agent.js +275 -0
  29. package/dist/nativeAgent/cliDemo.js +37 -0
  30. package/dist/nativeAgent/codingTools.js +11 -0
  31. package/dist/nativeAgent/commandTool.js +215 -0
  32. package/dist/nativeAgent/compactionDemo.js +158 -0
  33. package/dist/nativeAgent/composition.js +71 -0
  34. package/dist/nativeAgent/context/budget.js +44 -0
  35. package/dist/nativeAgent/context/index.js +339 -0
  36. package/dist/nativeAgent/context/providerCompressor.js +103 -0
  37. package/dist/nativeAgent/contracts.js +1 -0
  38. package/dist/nativeAgent/demo.js +40 -0
  39. package/dist/nativeAgent/evaluation/cases.js +38 -0
  40. package/dist/nativeAgent/evaluation/checks.js +91 -0
  41. package/dist/nativeAgent/evaluation/demo.js +19 -0
  42. package/dist/nativeAgent/evaluation/files.js +54 -0
  43. package/dist/nativeAgent/evaluation/fixture.js +36 -0
  44. package/dist/nativeAgent/evaluation/index.js +239 -0
  45. package/dist/nativeAgent/executionOwner.js +209 -0
  46. package/dist/nativeAgent/filePatterns.js +170 -0
  47. package/dist/nativeAgent/fileToolsSupport.js +202 -0
  48. package/dist/nativeAgent/index.js +16 -0
  49. package/dist/nativeAgent/interaction/cli.js +358 -0
  50. package/dist/nativeAgent/interaction/contracts.js +1 -0
  51. package/dist/nativeAgent/interaction/index.js +3 -0
  52. package/dist/nativeAgent/interaction/memoryDemo.js +115 -0
  53. package/dist/nativeAgent/interaction/renderer.js +34 -0
  54. package/dist/nativeAgent/localSafety.js +258 -0
  55. package/dist/nativeAgent/mockProvider.js +43 -0
  56. package/dist/nativeAgent/model/anthropicMessages.js +204 -0
  57. package/dist/nativeAgent/model/chatCompletions.js +210 -0
  58. package/dist/nativeAgent/model/errors.js +47 -0
  59. package/dist/nativeAgent/model/gateway.js +423 -0
  60. package/dist/nativeAgent/model/index.js +7 -0
  61. package/dist/nativeAgent/model/observationAdapter.js +21 -0
  62. package/dist/nativeAgent/model/protocols.js +19 -0
  63. package/dist/nativeAgent/model/responses.js +263 -0
  64. package/dist/nativeAgent/model/types.js +1 -0
  65. package/dist/nativeAgent/model/wire.js +73 -0
  66. package/dist/nativeAgent/observability/index.js +220 -0
  67. package/dist/nativeAgent/product/catalog.js +82 -0
  68. package/dist/nativeAgent/product/config.js +295 -0
  69. package/dist/nativeAgent/product/facts.js +30 -0
  70. package/dist/nativeAgent/product/index.js +62 -0
  71. package/dist/nativeAgent/product/location.js +44 -0
  72. package/dist/nativeAgent/product/runtime.js +276 -0
  73. package/dist/nativeAgent/product/storage.js +49 -0
  74. package/dist/nativeAgent/product/tools.js +47 -0
  75. package/dist/nativeAgent/product/transport.js +54 -0
  76. package/dist/nativeAgent/projectGuidance/index.js +425 -0
  77. package/dist/nativeAgent/searchTools.js +305 -0
  78. package/dist/nativeAgent/session/backends.js +293 -0
  79. package/dist/nativeAgent/session/catalog.js +97 -0
  80. package/dist/nativeAgent/session/catalogDemo.js +87 -0
  81. package/dist/nativeAgent/session/contracts.js +1 -0
  82. package/dist/nativeAgent/session/format.js +269 -0
  83. package/dist/nativeAgent/session/index.js +5 -0
  84. package/dist/nativeAgent/session/location.js +36 -0
  85. package/dist/nativeAgent/session/sqliteFormat.js +134 -0
  86. package/dist/nativeAgent/session/store.js +248 -0
  87. package/dist/nativeAgent/textTools.js +293 -0
  88. package/dist/nativeAgent/toolManager/executor.js +290 -0
  89. package/dist/nativeAgent/toolManager/index.js +4 -0
  90. package/dist/nativeAgent/validation.js +95 -0
  91. package/dist/plugins/pluginService.js +98 -8
  92. package/dist/resources/projectResourceService.js +23 -1
  93. package/dist/runtime/managedIdentity.js +6 -0
  94. package/dist/surface/surfaceContributions.js +3 -0
  95. package/dist/task/taskAuthority.js +61 -10
  96. package/dist/web/assets/assetManifest.js +38 -22
  97. package/dist/web/assets/client/api.js +115 -0
  98. package/dist/web/assets/client/app.js +615 -862
  99. package/dist/web/assets/client/components.js +323 -897
  100. package/dist/web/assets/client/detail.js +333 -0
  101. package/dist/web/assets/client/dock.js +225 -0
  102. package/dist/web/assets/client/dom.js +55 -3
  103. package/dist/web/assets/client/evidence.js +172 -0
  104. package/dist/web/assets/client/format.js +25 -14
  105. package/dist/web/assets/client/forms.js +230 -0
  106. package/dist/web/assets/client/i18n.js +1024 -791
  107. package/dist/web/assets/client/overview.js +118 -0
  108. package/dist/web/assets/client/records.js +63 -0
  109. package/dist/web/assets/client/sections.js +313 -0
  110. package/dist/web/assets/client/sidebar.js +146 -0
  111. package/dist/web/assets/client/theme.js +61 -22
  112. package/dist/web/assets/icons.js +39 -0
  113. package/dist/web/assets/shell.js +125 -118
  114. package/dist/web/assets/styles/base.js +41 -0
  115. package/dist/web/assets/styles/components.js +169 -0
  116. package/dist/web/assets/styles/layout.js +56 -77
  117. package/dist/web/assets/styles/markdown.js +16 -24
  118. package/dist/web/assets/styles/responsive.js +41 -44
  119. package/dist/web/assets/styles/tokens.js +65 -89
  120. package/dist/web/assets/styles/views.js +292 -0
  121. package/dist/web/webServer.js +2 -1
  122. package/docs/agent-result-consumption.md +16 -0
  123. package/docs/agent-result-consumption.zh-CN.md +13 -0
  124. package/docs/examples/agent-offline.mjs +194 -0
  125. package/docs/native-agent.md +283 -0
  126. package/docs/release-workflow.md +61 -0
  127. package/docs/release-workflow.zh-CN.md +46 -0
  128. package/docs/roles-and-configuration.md +32 -0
  129. package/docs/roles-and-configuration.zh-CN.md +26 -0
  130. package/package.json +1 -1
  131. package/skills/yui-leader/SKILL.md +9 -0
  132. package/skills/yui-reviewer/SKILL.md +5 -0
  133. package/skills/yui-runtime/SKILL.md +33 -0
  134. package/dist/web/assets/client/taskSummary.js +0 -350
  135. package/dist/web/assets/client/taskSurface.js +0 -616
  136. package/dist/web/assets/client/view.js +0 -608
  137. package/dist/web/assets/styles/cards.js +0 -247
  138. package/dist/web/assets/styles/widgets.js +0 -168
@@ -0,0 +1,169 @@
1
+ /*
2
+ * COMPONENTS — reusable controls and primitives: buttons, segmented
3
+ * controls, badges, dots, chips, cards, disclosures, key/value lists, empty
4
+ * states, metrics, dialogs and the toast. Colour comes only from tokens.
5
+ */
6
+ export const COMPONENT_STYLES = `
7
+ /* Tones: one semantic colour per tone, used by dots, badges and signals */
8
+ .tone-info{--tone:var(--info);--tone-soft:var(--info-soft)}
9
+ .tone-ok{--tone:var(--ok);--tone-soft:var(--ok-soft)}
10
+ .tone-warn{--tone:var(--warn);--tone-soft:var(--warn-soft)}
11
+ .tone-bad{--tone:var(--bad);--tone-soft:var(--bad-soft)}
12
+ .tone-idle{--tone:var(--idle);--tone-soft:var(--idle-soft)}
13
+ .tone-accent{--tone:var(--accent);--tone-soft:var(--accent-soft)}
14
+
15
+ /* Buttons */
16
+ .btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:32px;padding:0 12px;border:1px solid var(--line-2);border-radius:var(--r-sm);background:var(--surface-2);color:var(--ink);font-size:var(--fs-sm);font-weight:500;white-space:nowrap;transition:background var(--t-fast),border-color var(--t-fast),color var(--t-fast),transform var(--t-fast)}
17
+ .btn:hover:not(:disabled){border-color:var(--line-3);background:var(--surface-3)}
18
+ .btn:active:not(:disabled){transform:translateY(1px)}
19
+ .btn:disabled{opacity:.45}
20
+ .btn .icon{width:15px;height:15px}
21
+ .btn-primary{background:var(--accent);border-color:transparent;color:var(--accent-ink);font-weight:600}
22
+ .btn-primary:hover:not(:disabled){background:var(--accent);border-color:transparent;filter:brightness(1.08)}
23
+ .btn-ghost{background:transparent;border-color:transparent;color:var(--ink-2)}
24
+ .btn-ghost:hover:not(:disabled){background:var(--surface-3);border-color:transparent;color:var(--ink)}
25
+ .btn-ghost[aria-pressed="true"]{background:var(--accent-soft);color:var(--accent)}
26
+ .btn-link{height:auto;padding:2px 0;border:0;background:transparent;color:var(--accent);font-weight:500}
27
+ .btn-link:hover:not(:disabled){background:transparent;text-decoration:underline;text-underline-offset:3px}
28
+ .link-btn{justify-self:start;padding:0;border:0;background:none;color:var(--accent);font-size:var(--fs-xs);font-weight:500}
29
+ .link-btn:hover{text-decoration:underline;text-underline-offset:3px}
30
+ .icon-btn{display:inline-grid;place-items:center;width:32px;height:32px;flex:none;padding:0;border:0;border-radius:var(--r-sm);background:transparent;color:var(--ink-3);transition:background var(--t-fast),color var(--t-fast)}
31
+ .icon-btn:hover:not(:disabled){background:var(--surface-3);color:var(--ink)}
32
+ .icon-btn[aria-pressed="true"]{background:var(--accent-soft);color:var(--accent)}
33
+ .icon-btn:disabled{opacity:.4}
34
+ .icon-btn .icon{width:17px;height:17px}
35
+
36
+ /* Segmented control */
37
+ .seg{display:inline-flex;gap:2px;padding:3px;border-radius:var(--r-md);background:var(--sunken);border:1px solid var(--line)}
38
+ .seg-btn{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 11px;border:0;border-radius:var(--r-sm);background:transparent;color:var(--ink-3);font-size:var(--fs-sm);font-weight:500;white-space:nowrap;transition:background var(--t-fast),color var(--t-fast),box-shadow var(--t-fast)}
39
+ .seg-btn:hover:not(:disabled){color:var(--ink)}
40
+ .seg-btn[aria-selected="true"],.seg-btn[aria-checked="true"]{background:var(--surface-2);color:var(--ink);box-shadow:var(--shadow-1),0 0 0 1px var(--line-2)}
41
+ .seg-btn:disabled{opacity:.4}
42
+ .seg-btn .icon{width:15px;height:15px}
43
+ .seg-sm .seg-btn{height:24px;padding:0 9px;font-size:var(--fs-xs)}
44
+
45
+ /* Badges, dots, chips */
46
+ .badge{display:inline-flex;align-items:center;gap:6px;height:22px;padding:0 8px;border-radius:var(--r-pill);background:var(--tone-soft,var(--idle-soft));color:var(--tone,var(--ink-2));font-size:var(--fs-xs);font-weight:600;white-space:nowrap;line-height:1}
47
+ .badge-dot{width:6px;height:6px;border-radius:50%;background:currentColor;flex:none}
48
+ .dot{display:inline-block;width:8px;height:8px;flex:none;border-radius:50%;background:var(--tone,var(--idle));box-shadow:0 0 0 3px var(--tone-soft,transparent)}
49
+ .chip{display:inline-flex;align-items:center;height:20px;padding:0 7px;border-radius:var(--r-xs);background:var(--surface-3);color:var(--ink-2);font-size:var(--fs-2xs);font-weight:500;white-space:nowrap}
50
+ .chip-strong{color:var(--ink);background:var(--line-2)}
51
+ .chip-row{display:inline-flex;flex-wrap:wrap;align-items:center;gap:4px}
52
+ code.id{padding:1px 6px;border-radius:var(--r-xs);background:var(--surface-3);color:var(--ink-2);font-size:var(--fs-2xs);white-space:nowrap}
53
+ .when{color:var(--ink-3);font-size:var(--fs-xs);white-space:nowrap}
54
+ .count{display:inline-grid;place-items:center;min-width:18px;height:18px;padding:0 5px;border-radius:var(--r-pill);background:var(--surface-3);color:var(--ink-3);font-size:10.5px;font-weight:600;line-height:1}
55
+ .spacer{flex:1}
56
+ .small{font-size:var(--fs-xs)}
57
+ .mono-line{font-family:var(--font-mono);font-size:var(--fs-2xs);overflow-wrap:anywhere}
58
+
59
+ /* Chip tabs (local filters) */
60
+ .chip-tabs{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:12px}
61
+ .chip-tab{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 10px;border:1px solid var(--line-2);border-radius:var(--r-pill);background:transparent;color:var(--ink-3);font-size:var(--fs-xs);font-weight:500}
62
+ .chip-tab:hover{color:var(--ink);border-color:var(--line-3)}
63
+ .chip-tab[aria-pressed="true"]{background:var(--ink);border-color:var(--ink);color:var(--canvas)}
64
+ .chip-tab[aria-pressed="true"] .count{background:rgba(127,127,127,.25);color:inherit}
65
+
66
+ /* Cards */
67
+ .card{display:flex;flex-direction:column;min-width:0;border:1px solid var(--line);border-radius:var(--r-lg);background:var(--surface);box-shadow:var(--shadow-1)}
68
+ .card-head{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:4px 10px;padding:14px 16px 0}
69
+ .card-title{display:flex;align-items:center;gap:8px;flex:1;min-width:0;font-size:var(--fs-md);font-weight:600;color:var(--ink)}
70
+ .card-title .icon{color:var(--ink-3)}
71
+ .card-actions{grid-row:1;grid-column:2;display:flex;gap:6px;margin:-4px -6px -4px 0}
72
+ .card-hint{grid-column:1/-1;color:var(--ink-3);font-size:var(--fs-xs);line-height:1.45}
73
+ .card-body{display:grid;gap:12px;padding:14px 16px 16px;min-width:0}
74
+ .card-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;align-items:start}
75
+ .card-grid-1{grid-template-columns:minmax(0,1fr)}
76
+ .card-columns{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;align-items:start}
77
+ .card-column{display:flex;flex-direction:column;gap:14px;min-width:0}
78
+ .stack{display:grid;gap:10px;min-width:0}
79
+
80
+ /* Disclosure */
81
+ .disclosure{min-width:0;border-top:1px solid var(--line)}
82
+ .disclosure>summary{display:flex;align-items:center;gap:8px;padding:10px 0;list-style:none;cursor:pointer;color:var(--ink-2);font-size:var(--fs-sm);font-weight:500;user-select:none}
83
+ .disclosure>summary::-webkit-details-marker{display:none}
84
+ .disclosure>summary:hover{color:var(--ink)}
85
+ .disclosure-chevron{width:14px;height:14px;color:var(--ink-4);transition:transform var(--t-med) var(--ease)}
86
+ details[open]>summary .disclosure-chevron{transform:rotate(90deg)}
87
+ .disclosure-meta{margin-left:auto;color:var(--ink-4);font-size:var(--fs-xs);font-weight:400}
88
+ .disclosure-body{display:grid;gap:10px;padding:0 0 12px 22px;min-width:0}
89
+ .card-disclosure{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--surface);box-shadow:var(--shadow-1)}
90
+ .card-disclosure>summary{padding:14px 16px;color:var(--ink);font-weight:600;font-size:var(--fs-md)}
91
+ .card-disclosure>.disclosure-body{padding:0 16px 16px}
92
+
93
+ /* Key/value */
94
+ .kv{display:grid;grid-template-columns:minmax(96px,max-content) minmax(0,1fr);gap:7px 16px;margin:0;font-size:var(--fs-sm)}
95
+ .kv dt{color:var(--ink-3)}
96
+ .kv dd{margin:0;min-width:0;color:var(--ink);overflow-wrap:anywhere}
97
+ .kv-compact{gap:3px 12px;font-size:var(--fs-xs)}
98
+
99
+ /* Prose */
100
+ .prose-block{display:grid;gap:5px;min-width:0}
101
+ .prose-label{color:var(--ink-3);font-size:var(--fs-2xs);font-weight:600;text-transform:uppercase;letter-spacing:.06em}
102
+ .prose-block.is-collapsed .md{max-height:180px;overflow:hidden;-webkit-mask-image:linear-gradient(#000 65%,transparent);mask-image:linear-gradient(#000 65%,transparent)}
103
+ .callout{padding:10px 12px;border-radius:var(--r-md);background:var(--tone-soft,var(--surface-3));border-left:2px solid var(--tone,var(--line-3))}
104
+ .bullets{margin:0;padding-left:18px;display:grid;gap:3px;font-size:var(--fs-sm);color:var(--ink-2)}
105
+ .checklist{list-style:none;margin:0;padding:0;display:grid;gap:5px;font-size:var(--fs-sm)}
106
+ .checklist li{display:flex;gap:8px;align-items:flex-start;color:var(--ink-2)}
107
+ .checklist li .icon{margin-top:3px;color:var(--ink-4)}
108
+ .checklist li.is-done .icon{color:var(--ok)}
109
+
110
+ /* Notes, empty states, receipts */
111
+ .note{padding:8px 11px;border-radius:var(--r-sm);background:var(--tone-soft,var(--surface-3));color:var(--ink-2);font-size:var(--fs-xs);line-height:1.5}
112
+ .note.tone-bad{color:var(--bad)}
113
+ .note.tone-warn{color:var(--ink)}
114
+ .empty{display:flex;align-items:center;gap:10px;padding:14px;border:1px dashed var(--line-2);border-radius:var(--r-md);color:var(--ink-3);font-size:var(--fs-sm)}
115
+ .empty .icon{color:var(--ink-4)}
116
+ .receipt{color:var(--ink-3);font-size:var(--fs-xs);overflow-wrap:anywhere}
117
+ .receipt[data-state="pending"]{color:var(--info)}
118
+ .receipt[data-state="ok"]{color:var(--ok)}
119
+ .receipt[data-state="warn"]{color:var(--warn)}
120
+ .receipt[data-state="bad"]{color:var(--bad)}
121
+ .code-block{margin:0;max-height:360px;overflow:auto;padding:10px 12px;border:1px solid var(--line);border-radius:var(--r-md);background:var(--sunken);color:var(--ink-2);font-size:var(--fs-2xs);line-height:1.55;white-space:pre-wrap;overflow-wrap:anywhere}
122
+ .show-more{justify-self:start;display:inline-flex;align-items:center;height:30px;padding:0 12px;border:1px dashed var(--line-3);border-radius:var(--r-sm);background:transparent;color:var(--ink-3);font-size:var(--fs-xs);font-weight:500}
123
+ .show-more:hover{color:var(--accent);border-color:var(--accent-line)}
124
+ .loading-block{display:flex;align-items:center;gap:10px;padding:32px 8px;color:var(--ink-3)}
125
+ .spinner{width:14px;height:14px;border-radius:50%;border:2px solid var(--line-3);border-top-color:var(--accent);animation:spin .8s linear infinite}
126
+ @keyframes spin{to{transform:rotate(360deg)}}
127
+
128
+ /* Metrics */
129
+ .metric{display:grid;gap:4px;align-content:start;min-width:0;padding:12px 14px;border:1px solid var(--line);border-radius:var(--r-md);background:var(--surface)}
130
+ .metric-label{color:var(--ink-3);font-size:var(--fs-xs)}
131
+ .metric-value{font-size:var(--fs-xl);font-weight:600;letter-spacing:-.02em;color:var(--tone,var(--ink));font-variant-numeric:tabular-nums;line-height:1.2}
132
+ .metric-note{color:var(--ink-4);font-size:var(--fs-2xs);line-height:1.4}
133
+ .metric-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:8px}
134
+ .usage{display:grid;gap:10px}
135
+ .usage-meta{display:flex;flex-wrap:wrap;gap:4px 16px;color:var(--ink-3);font-size:var(--fs-2xs)}
136
+
137
+ /* Forms */
138
+ .field{display:grid;gap:6px;min-width:0;margin:0;padding:0;border:0;font-size:var(--fs-sm)}
139
+ .field>span,.field>legend{color:var(--ink-2);font-size:var(--fs-xs);font-weight:500;padding:0}
140
+ .field-row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
141
+ .form-actions{display:flex;gap:8px;justify-content:flex-end}
142
+ .inline-form{display:grid;gap:8px}
143
+ .inline-row{display:flex;gap:8px}
144
+ .inline-row input{flex:1}
145
+
146
+ /* Dialogs */
147
+ .dialog{width:min(560px,calc(100vw - 32px));max-height:calc(100dvh - 48px);padding:0;overflow:auto;border:1px solid var(--line-2);border-radius:var(--r-lg);background:var(--surface);color:var(--ink);box-shadow:var(--shadow-2)}
148
+ .dialog::backdrop{background:rgba(0,0,0,.45);backdrop-filter:blur(2px)}
149
+ .dialog-body{display:grid;gap:16px;padding:20px}
150
+ .dialog-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
151
+ .dialog-head h2{font-size:var(--fs-lg)}
152
+ .dialog-sub{margin-top:4px;color:var(--ink-3);font-size:var(--fs-xs)}
153
+ .dialog-actions{display:flex;gap:8px;justify-content:flex-end}
154
+ .settings-dialog{width:min(460px,calc(100vw - 32px))}
155
+ .theme-options{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
156
+ .theme-option{display:grid;gap:8px;padding:8px;border:1px solid var(--line-2);border-radius:var(--r-md);background:var(--surface-2);text-align:left;font-size:var(--fs-sm);font-weight:500}
157
+ .theme-option:hover{border-color:var(--line-3)}
158
+ .theme-option[aria-pressed="true"]{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}
159
+ .theme-swatch{display:flex;height:34px;overflow:hidden;border-radius:var(--r-sm);border:1px solid var(--line)}
160
+ .theme-swatch i{flex:2}
161
+ .theme-swatch i[data-part="2"]{flex:1}
162
+ .shortcut-list{display:grid;grid-template-columns:max-content 1fr;gap:6px 14px;margin:0;font-size:var(--fs-sm);color:var(--ink-2)}
163
+ .shortcut-list dt{display:flex;gap:3px;align-items:center}
164
+ .shortcut-list dd{margin:0}
165
+
166
+ /* Toast */
167
+ .toast{position:fixed;left:50%;bottom:24px;z-index:90;max-width:min(520px,calc(100vw - 32px));padding:10px 16px;border:1px solid var(--line-2);border-radius:var(--r-md);background:var(--surface-2);color:var(--ink);box-shadow:var(--shadow-2);font-size:var(--fs-sm);opacity:0;transform:translate(-50%,8px);pointer-events:none;transition:opacity var(--t-med),transform var(--t-med) var(--ease)}
168
+ .toast.show{opacity:1;transform:translate(-50%,0)}
169
+ `;
@@ -1,81 +1,60 @@
1
1
  /*
2
- * LAYOUT — geometry and structure only.
3
- * Grid shells, sticky bars, scrolling regions. Colors live in widgets/cards.
2
+ * LAYOUT — the three-region workspace.
3
+ * sidebar | center (task details) | divider | dock (session)
4
+ * body.dock-open shows the dock; body.dock-center swaps the dock into the
5
+ * middle so the order becomes sidebar | dock | divider | center. The sidebar's
6
+ * own divider overlays its right edge, so it adds no grid column; --sidebar-w
7
+ * is the default width and a stored preference overrides it inline.
4
8
  */
5
9
  export const LAYOUT_STYLES = `
6
- *{box-sizing:border-box}
7
- html{min-width:320px;font-family:var(--font-body)}
8
- body{margin:0;min-width:320px;height:100vh;overflow:hidden;font-size:14px}
9
- .app-shell{display:grid;grid-template-areas:"sidebar main divider pane";grid-template-columns:var(--sidebar-w) minmax(0,1fr) 0 0;grid-template-rows:100vh;height:100vh;transition:grid-template-columns var(--motion-slow) var(--ease)}
10
- body.conversation-active .app-shell{grid-template-columns:var(--sidebar-w) minmax(0,1fr) 8px var(--pane-w)}
11
- body.conversation-active.pane-left .app-shell{grid-template-areas:"sidebar pane divider main";grid-template-columns:var(--sidebar-w) var(--pane-w) 8px minmax(0,1fr)}
12
- body.terminal-active .app-shell,body.terminal-active.pane-left .app-shell{grid-template-areas:"sidebar main divider pane";grid-template-columns:var(--sidebar-w) minmax(0,1fr) 0 var(--terminal-w)}
13
- body.pane-resizing .app-shell{transition:none}
14
- /* Sidebar = persistent work index */
15
- .sidebar{grid-area:sidebar;display:flex;flex-direction:column;min-width:0;min-height:0;height:100vh;padding:16px 14px 14px}
16
- .sidebar-brand{display:flex;gap:10px;align-items:center;flex:none;margin-bottom:14px}
17
- .brand-text{display:grid;gap:3px;min-width:0;flex:1}
18
- .sidebar .search{flex:none;margin-bottom:10px}
19
- .filters{display:block;flex:none;margin-bottom:10px}
20
- .task-list{flex:1;min-height:0;overflow-y:auto;display:grid;gap:3px;align-content:start;margin:0 -4px;padding:2px 4px}
21
- .task-group{display:grid;gap:7px}
22
- .task-group-head{display:flex;align-items:baseline;gap:8px;padding:3px 4px 2px}
23
- .sidebar-foot{flex:none;padding-top:10px;margin-top:8px;display:grid;gap:8px}
24
- .sidebar-controls{display:grid;grid-template-columns:1fr 1fr;gap:8px;align-items:center}
25
- .catalog-pager{display:grid;grid-template-columns:1fr 1fr;gap:6px;flex:none;padding-top:10px}
26
- .catalog-pager span{grid-column:1/-1;grid-row:1;text-align:center;font-size:11px;color:var(--muted)}
27
- .catalog-pager button{min-height:32px;min-width:0;border:1px solid var(--border);border-radius:6px;background:var(--bg);color:var(--text);font:inherit;font-size:11px;cursor:pointer}
28
- .catalog-pager button:hover:not(:disabled){border-color:var(--accent)}
29
- .catalog-pager button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
30
- .catalog-pager button:disabled{opacity:.45;cursor:default}
31
- #catalog-attention-reset{grid-column:1/-1}
32
- /* Main column = top bar + optional section nav + reading surface */
33
- .main-col{grid-area:main;display:flex;flex-direction:column;min-width:0;min-height:0;height:100vh;overflow-y:auto;scrollbar-gutter:stable}
34
- .topbar{position:sticky;top:0;z-index:30;flex:none;display:flex;align-items:center;justify-content:space-between;gap:18px;padding:11px max(var(--page-space),calc((100% - 1100px) / 2));background:color-mix(in srgb,var(--bg) 92%,transparent);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border-bottom:1px solid var(--border)}
35
- .topbar-leading{display:flex;align-items:center;gap:14px;min-width:0}
36
- .breadcrumb{display:flex;align-items:baseline;gap:8px;min-width:0}
37
- .crumb-current{margin:0;min-width:0;font-family:var(--font-display);font-weight:600;font-size:clamp(14px,1.3vw,17px);letter-spacing:-.01em;line-height:1.25;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
38
- .topbar-actions{display:flex;align-items:center;gap:14px;flex:none}
39
- .clock{display:grid;justify-items:end;gap:2px;text-align:right;line-height:1.2}
40
- /* Sticky section navigation, only meaningful while a task is open */
41
- .detail-tabs{position:sticky;top:var(--topbar-h,44px);z-index:20;flex:none;display:none;gap:0;padding:0 max(var(--page-space),calc((100% - 1100px) / 2));background:color-mix(in srgb,var(--bg) 92%,transparent);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border-bottom:1px solid var(--border);overflow-x:auto;scrollbar-width:none}
42
- body.detail-active .detail-tabs{display:flex}
43
- .tab{flex:none;padding:11px 13px;color:var(--muted);font-family:var(--font-mono);font-size:10px;text-transform:uppercase;letter-spacing:.09em;background:transparent;border:0;border-bottom:2px solid transparent;cursor:pointer;white-space:nowrap;transition:color var(--motion-fast),border-color var(--motion-fast)}
44
- .tab:hover{color:var(--text)}
45
- .tab.is-active{color:var(--accent);border-bottom-color:var(--accent)}
46
- .detail{flex:1;min-height:0;padding:16px max(var(--page-space),calc((100% - 1100px) / 2)) 72px;min-width:0}
47
- .detail:focus-visible{outline:none}
48
- .anchor{scroll-margin-top:calc(var(--topbar-h,44px) + var(--tabs-h,38px))}
49
- /* Adjustable discussion panel; the separator belongs to the task view, not Task state. */
50
- .pane-divider{grid-area:divider;align-self:stretch;width:8px;min-width:0;cursor:col-resize;position:relative;touch-action:none;z-index:31}
51
- .pane-divider[hidden]{display:none}
52
- .pane-divider span{position:absolute;inset:0 3px;background:var(--border-strong);transition:background var(--motion-fast)}
53
- .pane-divider:hover span,.pane-divider:focus-visible span,body.pane-resizing .pane-divider span{background:var(--accent)}
54
- .pane-divider:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}
55
- .conversation-panel{grid-area:pane;min-width:0;height:100vh;min-height:0;display:flex;flex-direction:column;overflow:hidden}
56
- .conversation-panel[hidden]{display:none}
57
- .conversation-head{flex:none;min-height:72px;display:flex;align-items:center;justify-content:space-between;gap:10px;padding:13px 16px}
58
- .conversation-head>div:first-child{min-width:0}
59
- .conversation-eyebrow{display:block;font-size:10px;line-height:1.4}
60
- .conversation-head h2{margin:4px 0 0;font-size:16px;font-family:var(--font-display);line-height:1.25}
61
- .conversation-head-actions{display:flex;gap:4px;align-items:center}
62
- .conversation-content{display:flex;flex:1;flex-direction:column;min-height:0;padding:14px;gap:14px}
63
- .conversation-feed{display:flex;flex:1;flex-direction:column;gap:10px;min-height:0;overflow-y:auto;scrollbar-gutter:stable;padding:2px 2px 12px}
64
- .conversation-item{flex:none;padding:11px 12px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-2);min-width:0;overflow-wrap:anywhere}
65
- .conversation-item.is-user{border-color:var(--accent-line);background:var(--accent-soft)}
66
- .conversation-item-head{display:flex;justify-content:space-between;gap:10px;color:var(--muted);font-size:11px;margin-bottom:8px}
67
- .conversation-item-head time{white-space:nowrap}
68
- .conversation-item .rich-text{font-size:13px}
69
- .conversation-compose{flex:none;max-height:55%;overflow-y:auto}
70
- .conversation-compose h3{margin:2px 0;font-size:13px}
71
- .conversation-compose form{display:grid;gap:9px}
72
- .conversation-compose textarea{min-height:76px}
73
- /* Native Session occupies the pane temporarily; it is not the Task message feed. */
74
- .terminal-panel{grid-area:pane;min-width:0;height:100vh;display:flex;flex-direction:column;overflow:hidden}
75
- .terminal-panel[hidden]{display:none}
76
- .terminal-head{flex:none;height:62px;display:flex;align-items:center;justify-content:space-between;gap:14px;padding:10px 14px}
77
- .terminal-head>div{display:flex;align-items:center;gap:12px;min-width:0}
78
- .terminal-head h2{margin:0}
79
- .terminal-host{flex:1;min-height:0;padding:8px 10px;overflow:hidden;position:relative}
80
- .terminal-hint{position:absolute;inset:0;display:grid;place-content:center;gap:8px;text-align:center;padding:20px}
10
+ .app{display:grid;height:100vh;height:100dvh;grid-template-rows:minmax(0,1fr);
11
+ grid-template-areas:"sidebar center divider dock";
12
+ grid-template-columns:var(--sidebar-w) minmax(0,1fr) 0 0}
13
+ body.dock-open .app{grid-template-columns:var(--sidebar-w) minmax(0,1fr) var(--divider-w) var(--dock-w)}
14
+ body.dock-open.dock-center .app{grid-template-areas:"sidebar dock divider center";grid-template-columns:var(--sidebar-w) var(--dock-w) var(--divider-w) minmax(0,1fr)}
15
+
16
+ /* Sidebar */
17
+ .sidebar{grid-area:sidebar;display:flex;flex-direction:column;min-width:0;min-height:0;background:var(--surface);border-right:1px solid var(--line);container:sidebar/inline-size}
18
+ .sidebar-divider{grid-area:sidebar;justify-self:end;position:relative;z-index:20;width:9px;margin-right:-5px;cursor:col-resize;touch-action:none}
19
+ .sidebar-divider span{position:absolute;top:0;bottom:0;left:3px;width:1px;background:transparent;transition:background var(--t-fast),box-shadow var(--t-fast)}
20
+ .sidebar-divider:hover span,.sidebar-divider:focus-visible span,body.sidebar-resizing .sidebar-divider span{background:var(--accent);box-shadow:0 0 0 1px var(--accent)}
21
+ .sidebar-divider:focus-visible{box-shadow:none}
22
+ body.sidebar-resizing{cursor:col-resize;user-select:none}
23
+ .side-head{flex:none;display:flex;align-items:center;gap:10px;height:var(--header-h);padding:0 12px 0 16px;border-bottom:1px solid var(--line)}
24
+ .brand{display:flex;align-items:center;gap:10px;flex:1;min-width:0}
25
+ .search-field{flex:none;margin:12px 12px 0}
26
+ .attention-bar{flex:none;margin:10px 12px 0}
27
+ .status-tabs{flex:none;margin:10px 0 0;padding:0 12px}
28
+ .task-list{flex:1;min-height:0;overflow-y:auto;padding:4px 8px 12px;scrollbar-gutter:stable}
29
+ .pager{flex:none;display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:6px;padding:8px 12px;border-top:1px solid var(--line)}
30
+ .pager .pager-clear{grid-column:1/-1}
31
+ .side-foot{flex:none;display:flex;align-items:center;gap:4px;padding:10px;border-top:1px solid var(--line)}
32
+
33
+ /* Center */
34
+ .center{grid-area:center;min-width:0;min-height:0;overflow-y:auto;scrollbar-gutter:stable;background:var(--canvas)}
35
+ .center:focus-visible{box-shadow:none}
36
+ .detail{min-height:100%}
37
+ .page{max-width:var(--center-max);margin:0 auto;padding:0 clamp(16px,3vw,40px) 64px}
38
+
39
+ /* Dock divider */
40
+ .dock-divider{grid-area:divider;position:relative;cursor:col-resize;touch-action:none;background:var(--canvas);z-index:5}
41
+ .dock-divider span{position:absolute;top:0;bottom:0;left:4px;width:1px;background:var(--line-2);transition:background var(--t-fast),box-shadow var(--t-fast)}
42
+ .dock-divider:hover span,.dock-divider:focus-visible span,body.dock-resizing .dock-divider span{background:var(--accent);box-shadow:0 0 0 1px var(--accent)}
43
+ .dock-divider:focus-visible{box-shadow:none}
44
+ body.dock-resizing{cursor:col-resize;user-select:none}
45
+
46
+ /* Dock */
47
+ .dock{grid-area:dock;display:flex;flex-direction:column;min-width:0;min-height:0;background:var(--surface)}
48
+ body.dock-open:not(.dock-center) .dock{border-left:0}
49
+ .dock-head{flex:none;display:flex;align-items:center;justify-content:space-between;gap:8px;height:var(--header-h);padding:0 10px 0 12px;border-bottom:1px solid var(--line)}
50
+ .dock-actions{display:flex;gap:2px}
51
+ .dock-pane{flex:1;min-height:0;display:flex;flex-direction:column}
52
+ .dock-discussion{position:relative}
53
+ .dock-session{background:var(--term-bg)}
54
+ .session-bar{flex:none;display:flex;align-items:center;gap:8px;min-height:44px;padding:6px 10px;border-bottom:1px solid rgba(255,255,255,.07)}
55
+ .session-targets{display:flex;gap:4px;flex:1;min-width:0;overflow-x:auto;scrollbar-width:none}
56
+ .terminal-host{flex:1;min-height:0;padding:10px 4px 6px 12px;overflow:hidden}
57
+ .terminal-host:empty{display:none}
58
+ .terminal-empty{flex:1;display:grid;place-content:center;justify-items:center;gap:8px;padding:24px;text-align:center}
59
+ .session-foot{flex:none;display:flex;align-items:center;gap:8px;padding:8px 12px;border-top:1px solid rgba(255,255,255,.07)}
81
60
  `;
@@ -1,29 +1,21 @@
1
1
  /*
2
- * MARKDOWN — rendered rich text inside cards.
3
- * .md is produced by client/markdown.ts (escaped HTML + inline tags only).
4
- * Also owns the collapse affordances (.md-toggle, .show-more) that long
5
- * blocks and paged lists share.
2
+ * MARKDOWN — rendered Agent/user prose. .md is produced by client/markdown.ts
3
+ * (escaped HTML plus a small set of our own inline and block tags).
6
4
  */
7
5
  export const MARKDOWN_STYLES = `
8
- .md{display:grid;gap:6px;font-family:var(--font-body);font-size:12px;line-height:1.6;color:var(--text)}
6
+ .md{display:grid;gap:7px;min-width:0;font-size:var(--fs-sm);line-height:1.62;color:var(--ink);overflow-wrap:anywhere}
9
7
  .md p{margin:0}
10
- .md h4,.md h5,.md h6{margin:4px 0 0;font-family:var(--font-display);font-weight:700;line-height:1.3;color:var(--text)}
11
- .md h4{font-size:13px}
12
- .md h5{font-size:12.5px}
13
- .md h6{font-size:12px}
14
- .md ul,.md ol{margin:0;padding-left:18px;display:grid;gap:3px}
15
- .md li{padding-left:2px}
16
- .md code{font-family:var(--font-mono);font-size:11px;background:var(--bg-3);border:1px solid var(--border);border-radius:4px;padding:0 4px}
17
- .md pre{margin:0;padding:8px 10px;background:var(--bg-3);border:1px solid var(--border);border-radius:var(--radius);overflow-x:auto}
18
- .md pre code{background:transparent;border:0;padding:0;font-size:11px;line-height:1.5}
19
- .md a{color:var(--accent);text-decoration:none;border-bottom:1px solid var(--accent-line)}
20
- .md a:hover{color:var(--text);border-bottom-color:var(--text)}
21
- .md.muted,.md .muted{color:var(--muted)}
22
- /* Collapse: clamp long blocks with a fade, toggle reveals the full text */
23
- .record-block.is-collapsed .md,
24
- .execute-io.is-collapsed .md{max-height:200px;overflow:hidden;mask-image:linear-gradient(#000 70%,transparent);-webkit-mask-image:linear-gradient(#000 70%,transparent)}
25
- .md-toggle{justify-self:start;display:inline-flex;align-items:center;padding:3px 11px;color:var(--muted);background:transparent;border:1px solid var(--border);border-radius:var(--radius-pill);font-family:var(--font-body);font-size:11px;line-height:1.4;transition:color var(--motion-fast),border-color var(--motion-fast),background var(--motion-fast)}
26
- .md-toggle:hover{color:var(--accent);border-color:var(--accent-line);background:var(--accent-soft)}
27
- .show-more{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:7px 13px;color:var(--muted);background:transparent;border:1px dashed var(--border);border-radius:var(--radius);font-family:var(--font-body);font-size:12px;font-weight:600;transition:color var(--motion-fast),border-color var(--motion-fast),background var(--motion-fast)}
28
- .show-more:hover{color:var(--accent);border-color:var(--accent-line);background:var(--accent-soft)}
8
+ .md h4,.md h5,.md h6{margin:6px 0 0;font-weight:600;line-height:1.35}
9
+ .md h4{font-size:var(--fs-md)}
10
+ .md h5{font-size:var(--fs-sm)}
11
+ .md h6{font-size:var(--fs-sm);color:var(--ink-2)}
12
+ .md ul,.md ol{margin:0;padding-left:20px;display:grid;gap:3px}
13
+ .md li::marker{color:var(--ink-4)}
14
+ .md code{padding:1px 5px;border-radius:var(--r-xs);background:var(--surface-3);font-size:.88em}
15
+ .md pre{margin:0;padding:10px 12px;border:1px solid var(--line);border-radius:var(--r-md);background:var(--sunken);overflow-x:auto}
16
+ .md pre code{padding:0;background:transparent;font-size:var(--fs-2xs);line-height:1.55}
17
+ .md a{color:var(--accent);text-decoration:underline;text-decoration-color:var(--accent-line);text-underline-offset:3px}
18
+ .md a:hover{text-decoration-color:currentColor}
19
+ .md strong{font-weight:600}
20
+ .md.muted{color:var(--ink-2)}
29
21
  `;
@@ -1,54 +1,51 @@
1
1
  /*
2
2
  * RESPONSIVE — breakpoints only.
3
- * Back button is hidden by default; only the narrow master-detail layout
4
- * reveals it while a task is open.
3
+ * ≤1200px narrower sidebar and dock defaults
4
+ * ≤900px master–detail: task list OR task page; the dock becomes a
5
+ * full-screen sheet over the task page
6
+ * Sidebar container queries adapt its footer to the width the user chose.
5
7
  */
6
8
  export const RESPONSIVE_STYLES = `
7
- .detail-back{display:none}
8
- @media(max-width:1080px){
9
- .metric-value{font-size:27px}
9
+ @container sidebar (max-width:299px){
10
+ .foot-btn kbd{display:none}
11
+ }
12
+ @container sidebar (max-width:259px){
13
+ .foot-btn{gap:0;padding:0 9px}
14
+ .foot-btn span{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
15
+ }
16
+ @media(max-width:1200px){
17
+ :root{--sidebar-w:264px}
18
+ .card-grid,.card-columns{grid-template-columns:minmax(0,1fr)}
19
+ .metric-strip{grid-template-columns:repeat(3,minmax(0,1fr))}
20
+ }
21
+ @media(max-width:1040px){
22
+ body.dock-open .overview-layout{grid-template-columns:minmax(0,1fr)}
10
23
  }
11
24
  @media(max-width:900px){
12
- /* Master-detail: sidebar list by default; selecting a task swaps to detail */
13
- body{overflow:auto}
14
- .app-shell,body.conversation-active .app-shell,body.conversation-active.pane-left .app-shell,body.terminal-active .app-shell,body.terminal-active.pane-left .app-shell{grid-template-areas:"sidebar" "main";grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto;height:auto;min-height:100vh}
15
- .sidebar{height:auto;min-height:100vh;border-right:0;border-bottom:1px solid var(--border)}
16
- .task-list{overflow:visible}
17
- .main-col{display:none;height:auto;min-height:100vh}
18
- body.detail-active .sidebar{display:none}
19
- body.detail-active .main-col{display:flex}
20
- body.detail-active .detail-back{display:grid}
21
- .detail{overflow:visible}
22
- .pane-divider{display:none}
23
- .conversation-panel{position:fixed;inset:0;z-index:70;height:100dvh;border-left:0}
24
- .conversation-feed{min-height:0}
25
- .conversation-head-actions #conversation-swap{display:none}
26
- body.conversation-active .main-col{display:none}
27
- body.conversation-active .conversation-panel{display:flex}
28
- .overview-duo{grid-template-columns:1fr}
29
- .observability-metrics{grid-template-columns:repeat(3,minmax(0,1fr))}
30
- /* Terminal panel overlays full-screen instead of occupying a grid column */
31
- .terminal-panel{position:fixed;inset:0;z-index:80;height:100dvh;border-left:0}
25
+ .app,body.dock-open .app,body.dock-open.dock-center .app{grid-template-areas:"main";grid-template-columns:minmax(0,1fr)}
26
+ .sidebar{grid-area:main;border-right:0}
27
+ .center{grid-area:main;display:none}
28
+ body.task-open .sidebar{display:none}
29
+ body.task-open .center{display:block}
30
+ .back-btn{display:inline-grid}
31
+ .crumbs .crumb,.crumbs .crumb-sep{display:none}
32
+ .dock-divider,.sidebar-divider{display:none}
33
+ .dock{position:fixed;inset:0;z-index:60;padding-top:env(safe-area-inset-top,0px);padding-bottom:env(safe-area-inset-bottom,0px)}
34
+ #dock-swap{display:none}
35
+ .overview-layout{grid-template-columns:minmax(0,1fr)}
36
+ .dock-toggle span{display:none}
37
+ .dock-toggle{width:32px;padding:0}
32
38
  }
33
39
  @media(max-width:620px){
34
- .command-rail{grid-template-columns:repeat(2,1fr)}
35
- .metric{min-height:80px;padding:13px 15px}
36
- .metric-value{font-size:26px}
37
- /* Keep the topbar on one line: clock and key hints are expendable */
38
- .clock{display:none}
39
- .topbar{flex-wrap:nowrap;gap:8px;padding:10px 14px}
40
- .topbar-leading{flex:1;gap:8px}
41
- .breadcrumb .crumb,.breadcrumb .crumb-sep{display:none}
42
- .topbar-actions{gap:6px}
43
- #conversation-toggle,#operator-terminal,#refresh{width:38px;height:38px;min-width:38px;justify-content:center;padding:0}
44
- #conversation-toggle{font-size:0}
45
- #conversation-toggle::before{content:"▤";font-size:19px}
46
- #operator-terminal .operator-title,#operator-terminal .operator-shortcuts,#refresh span,#refresh kbd{display:none}
47
- #operator-terminal::before{content:">_";font-family:var(--font-mono);font-size:15px}
48
- #refresh::before{content:"↻";font-size:20px}
49
- .detail-tabs{mask-image:linear-gradient(90deg,#000 calc(100% - 28px),transparent);-webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 28px),transparent)}
50
- .record-cols{grid-template-columns:1fr}
51
- .observability-metrics{grid-template-columns:repeat(2,minmax(0,1fr))}
40
+ .metric-strip{grid-template-columns:repeat(2,minmax(0,1fr))}
41
+ .page-head{padding-top:24px;flex-wrap:wrap}
42
+ .task-title{font-size:var(--fs-xl)}
43
+ .tab:not([aria-selected="true"]) span:not(.count){display:none}
44
+ .tab{padding:0 12px}
45
+ .field-row{grid-template-columns:minmax(0,1fr)}
46
+ .work-body{padding-left:16px}
47
+ .kv{grid-template-columns:minmax(0,1fr)}
48
+ .kv dt{margin-top:4px}
49
+ .foot-btn kbd{display:none}
52
50
  }
53
- @media(prefers-reduced-motion:reduce){*{scroll-behavior:auto!important;transition:none!important;animation:none!important}}
54
51
  `;