@zq-silk/yui 2.0.0 → 2.1.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 (61) hide show
  1. package/dist/cli/commandCatalog.js +294 -286
  2. package/dist/cli/commandDiscovery.js +69 -0
  3. package/dist/cli/completion.js +22 -227
  4. package/dist/cli/dynamicCompletion.js +12 -6
  5. package/dist/cli/invocationAuthority.js +2 -2
  6. package/dist/cli/invocationRouter.js +18 -7
  7. package/dist/cli.js +71 -23
  8. package/dist/commands/capabilityCommands.js +5 -5
  9. package/dist/commands/globalRoleCommands.js +2 -1
  10. package/dist/commands/taskCommands.js +11 -0
  11. package/dist/context/taskContext.js +6 -2
  12. package/dist/kernel/accessAssessment.js +1 -0
  13. package/dist/kernel/builtinCapabilities.js +28 -1
  14. package/dist/kernel/capabilityRegistry.js +64 -19
  15. package/dist/nativeAgent/agent.js +173 -0
  16. package/dist/nativeAgent/contracts.js +1 -0
  17. package/dist/nativeAgent/demo.js +29 -0
  18. package/dist/nativeAgent/index.js +3 -0
  19. package/dist/nativeAgent/mockProvider.js +43 -0
  20. package/dist/nativeAgent/textTools.js +156 -0
  21. package/dist/nativeAgent/validation.js +95 -0
  22. package/dist/plugins/pluginService.js +98 -8
  23. package/dist/resources/projectResourceService.js +23 -1
  24. package/dist/runtime/managedIdentity.js +6 -0
  25. package/dist/surface/surfaceContributions.js +3 -0
  26. package/dist/task/taskAuthority.js +5 -10
  27. package/dist/web/assets/assetManifest.js +38 -22
  28. package/dist/web/assets/client/api.js +115 -0
  29. package/dist/web/assets/client/app.js +555 -863
  30. package/dist/web/assets/client/components.js +323 -897
  31. package/dist/web/assets/client/detail.js +333 -0
  32. package/dist/web/assets/client/dock.js +225 -0
  33. package/dist/web/assets/client/dom.js +55 -3
  34. package/dist/web/assets/client/evidence.js +172 -0
  35. package/dist/web/assets/client/format.js +25 -14
  36. package/dist/web/assets/client/forms.js +230 -0
  37. package/dist/web/assets/client/i18n.js +1020 -791
  38. package/dist/web/assets/client/overview.js +115 -0
  39. package/dist/web/assets/client/records.js +63 -0
  40. package/dist/web/assets/client/sections.js +313 -0
  41. package/dist/web/assets/client/sidebar.js +117 -0
  42. package/dist/web/assets/client/theme.js +61 -22
  43. package/dist/web/assets/icons.js +39 -0
  44. package/dist/web/assets/shell.js +124 -118
  45. package/dist/web/assets/styles/base.js +41 -0
  46. package/dist/web/assets/styles/components.js +167 -0
  47. package/dist/web/assets/styles/layout.js +49 -77
  48. package/dist/web/assets/styles/markdown.js +16 -24
  49. package/dist/web/assets/styles/responsive.js +33 -44
  50. package/dist/web/assets/styles/tokens.js +65 -89
  51. package/dist/web/assets/styles/views.js +289 -0
  52. package/dist/web/webServer.js +2 -1
  53. package/docs/release-workflow.md +23 -0
  54. package/docs/release-workflow.zh-CN.md +16 -0
  55. package/package.json +1 -1
  56. package/skills/yui-runtime/SKILL.md +26 -0
  57. package/dist/web/assets/client/taskSummary.js +0 -350
  58. package/dist/web/assets/client/taskSurface.js +0 -616
  59. package/dist/web/assets/client/view.js +0 -608
  60. package/dist/web/assets/styles/cards.js +0 -247
  61. package/dist/web/assets/styles/widgets.js +0 -168
@@ -0,0 +1,167 @@
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
+ .stack{display:grid;gap:10px;min-width:0}
77
+
78
+ /* Disclosure */
79
+ .disclosure{min-width:0;border-top:1px solid var(--line)}
80
+ .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}
81
+ .disclosure>summary::-webkit-details-marker{display:none}
82
+ .disclosure>summary:hover{color:var(--ink)}
83
+ .disclosure-chevron{width:14px;height:14px;color:var(--ink-4);transition:transform var(--t-med) var(--ease)}
84
+ details[open]>summary .disclosure-chevron{transform:rotate(90deg)}
85
+ .disclosure-meta{margin-left:auto;color:var(--ink-4);font-size:var(--fs-xs);font-weight:400}
86
+ .disclosure-body{display:grid;gap:10px;padding:0 0 12px 22px;min-width:0}
87
+ .card-disclosure{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--surface);box-shadow:var(--shadow-1)}
88
+ .card-disclosure>summary{padding:14px 16px;color:var(--ink);font-weight:600;font-size:var(--fs-md)}
89
+ .card-disclosure>.disclosure-body{padding:0 16px 16px}
90
+
91
+ /* Key/value */
92
+ .kv{display:grid;grid-template-columns:minmax(96px,max-content) minmax(0,1fr);gap:7px 16px;margin:0;font-size:var(--fs-sm)}
93
+ .kv dt{color:var(--ink-3)}
94
+ .kv dd{margin:0;min-width:0;color:var(--ink);overflow-wrap:anywhere}
95
+ .kv-compact{gap:3px 12px;font-size:var(--fs-xs)}
96
+
97
+ /* Prose */
98
+ .prose-block{display:grid;gap:5px;min-width:0}
99
+ .prose-label{color:var(--ink-3);font-size:var(--fs-2xs);font-weight:600;text-transform:uppercase;letter-spacing:.06em}
100
+ .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)}
101
+ .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))}
102
+ .bullets{margin:0;padding-left:18px;display:grid;gap:3px;font-size:var(--fs-sm);color:var(--ink-2)}
103
+ .checklist{list-style:none;margin:0;padding:0;display:grid;gap:5px;font-size:var(--fs-sm)}
104
+ .checklist li{display:flex;gap:8px;align-items:flex-start;color:var(--ink-2)}
105
+ .checklist li .icon{margin-top:3px;color:var(--ink-4)}
106
+ .checklist li.is-done .icon{color:var(--ok)}
107
+
108
+ /* Notes, empty states, receipts */
109
+ .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}
110
+ .note.tone-bad{color:var(--bad)}
111
+ .note.tone-warn{color:var(--ink)}
112
+ .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)}
113
+ .empty .icon{color:var(--ink-4)}
114
+ .receipt{color:var(--ink-3);font-size:var(--fs-xs);overflow-wrap:anywhere}
115
+ .receipt[data-state="pending"]{color:var(--info)}
116
+ .receipt[data-state="ok"]{color:var(--ok)}
117
+ .receipt[data-state="warn"]{color:var(--warn)}
118
+ .receipt[data-state="bad"]{color:var(--bad)}
119
+ .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}
120
+ .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}
121
+ .show-more:hover{color:var(--accent);border-color:var(--accent-line)}
122
+ .loading-block{display:flex;align-items:center;gap:10px;padding:32px 8px;color:var(--ink-3)}
123
+ .spinner{width:14px;height:14px;border-radius:50%;border:2px solid var(--line-3);border-top-color:var(--accent);animation:spin .8s linear infinite}
124
+ @keyframes spin{to{transform:rotate(360deg)}}
125
+
126
+ /* Metrics */
127
+ .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)}
128
+ .metric-label{color:var(--ink-3);font-size:var(--fs-xs)}
129
+ .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}
130
+ .metric-note{color:var(--ink-4);font-size:var(--fs-2xs);line-height:1.4}
131
+ .metric-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:8px}
132
+ .usage{display:grid;gap:10px}
133
+ .usage-meta{display:flex;flex-wrap:wrap;gap:4px 16px;color:var(--ink-3);font-size:var(--fs-2xs)}
134
+
135
+ /* Forms */
136
+ .field{display:grid;gap:6px;min-width:0;margin:0;padding:0;border:0;font-size:var(--fs-sm)}
137
+ .field>span,.field>legend{color:var(--ink-2);font-size:var(--fs-xs);font-weight:500;padding:0}
138
+ .field-row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
139
+ .form-actions{display:flex;gap:8px;justify-content:flex-end}
140
+ .inline-form{display:grid;gap:8px}
141
+ .inline-row{display:flex;gap:8px}
142
+ .inline-row input{flex:1}
143
+
144
+ /* Dialogs */
145
+ .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)}
146
+ .dialog::backdrop{background:rgba(0,0,0,.45);backdrop-filter:blur(2px)}
147
+ .dialog-body{display:grid;gap:16px;padding:20px}
148
+ .dialog-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
149
+ .dialog-head h2{font-size:var(--fs-lg)}
150
+ .dialog-sub{margin-top:4px;color:var(--ink-3);font-size:var(--fs-xs)}
151
+ .dialog-actions{display:flex;gap:8px;justify-content:flex-end}
152
+ .settings-dialog{width:min(460px,calc(100vw - 32px))}
153
+ .theme-options{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
154
+ .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}
155
+ .theme-option:hover{border-color:var(--line-3)}
156
+ .theme-option[aria-pressed="true"]{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}
157
+ .theme-swatch{display:flex;height:34px;overflow:hidden;border-radius:var(--r-sm);border:1px solid var(--line)}
158
+ .theme-swatch i{flex:2}
159
+ .theme-swatch i[data-part="2"]{flex:1}
160
+ .shortcut-list{display:grid;grid-template-columns:max-content 1fr;gap:6px 14px;margin:0;font-size:var(--fs-sm);color:var(--ink-2)}
161
+ .shortcut-list dt{display:flex;gap:3px;align-items:center}
162
+ .shortcut-list dd{margin:0}
163
+
164
+ /* Toast */
165
+ .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)}
166
+ .toast.show{opacity:1;transform:translate(-50%,0)}
167
+ `;
@@ -1,81 +1,53 @@
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.
4
6
  */
5
7
  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}
8
+ .app{display:grid;height:100vh;height:100dvh;grid-template-rows:minmax(0,1fr);
9
+ grid-template-areas:"sidebar center divider dock";
10
+ grid-template-columns:var(--sidebar-w) minmax(0,1fr) 0 0}
11
+ body.dock-open .app{grid-template-columns:var(--sidebar-w) minmax(0,1fr) var(--divider-w) var(--dock-w)}
12
+ 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)}
13
+
14
+ /* Sidebar */
15
+ .sidebar{grid-area:sidebar;display:flex;flex-direction:column;min-width:0;min-height:0;background:var(--surface);border-right:1px solid var(--line)}
16
+ .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)}
17
+ .brand{display:flex;align-items:center;gap:10px;flex:1;min-width:0}
18
+ .search-field{flex:none;margin:12px 12px 0}
19
+ .attention-bar{flex:none;margin:10px 12px 0}
20
+ .status-tabs{flex:none;margin:10px 0 0;padding:0 12px}
21
+ .task-list{flex:1;min-height:0;overflow-y:auto;padding:6px 8px 12px;scrollbar-gutter:stable}
22
+ .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)}
23
+ .pager .pager-clear{grid-column:1/-1}
24
+ .side-foot{flex:none;display:flex;align-items:center;gap:6px;padding:10px 12px;border-top:1px solid var(--line)}
25
+
26
+ /* Center */
27
+ .center{grid-area:center;min-width:0;min-height:0;overflow-y:auto;scrollbar-gutter:stable;background:var(--canvas)}
28
+ .center:focus-visible{box-shadow:none}
29
+ .detail{min-height:100%}
30
+ .page{max-width:var(--center-max);margin:0 auto;padding:0 clamp(16px,3vw,40px) 64px}
31
+
32
+ /* Dock divider */
33
+ .dock-divider{grid-area:divider;position:relative;cursor:col-resize;touch-action:none;background:var(--canvas);z-index:5}
34
+ .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)}
35
+ .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)}
36
+ .dock-divider:focus-visible{box-shadow:none}
37
+ body.dock-resizing{cursor:col-resize;user-select:none}
38
+
39
+ /* Dock */
40
+ .dock{grid-area:dock;display:flex;flex-direction:column;min-width:0;min-height:0;background:var(--surface)}
41
+ body.dock-open:not(.dock-center) .dock{border-left:0}
42
+ .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)}
43
+ .dock-actions{display:flex;gap:2px}
44
+ .dock-pane{flex:1;min-height:0;display:flex;flex-direction:column}
45
+ .dock-discussion{position:relative}
46
+ .dock-session{background:var(--term-bg)}
47
+ .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)}
48
+ .session-targets{display:flex;gap:4px;flex:1;min-width:0;overflow-x:auto;scrollbar-width:none}
49
+ .terminal-host{flex:1;min-height:0;padding:10px 4px 6px 12px;overflow:hidden}
50
+ .terminal-host:empty{display:none}
51
+ .terminal-empty{flex:1;display:grid;place-content:center;justify-items:center;gap:8px;padding:24px;text-align:center}
52
+ .session-foot{flex:none;display:flex;align-items:center;gap:8px;padding:8px 12px;border-top:1px solid rgba(255,255,255,.07)}
81
53
  `;
@@ -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,43 @@
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
5
6
  */
6
7
  export const RESPONSIVE_STYLES = `
7
- .detail-back{display:none}
8
- @media(max-width:1080px){
9
- .metric-value{font-size:27px}
8
+ @media(max-width:1200px){
9
+ :root{--sidebar-w:264px}
10
+ .card-grid{grid-template-columns:minmax(0,1fr)}
11
+ .metric-strip{grid-template-columns:repeat(3,minmax(0,1fr))}
12
+ }
13
+ @media(max-width:1040px){
14
+ body.dock-open .overview-grid{grid-template-columns:minmax(0,1fr)}
10
15
  }
11
16
  @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}
17
+ .app,body.dock-open .app,body.dock-open.dock-center .app{grid-template-areas:"main";grid-template-columns:minmax(0,1fr)}
18
+ .sidebar{grid-area:main;border-right:0}
19
+ .center{grid-area:main;display:none}
20
+ body.task-open .sidebar{display:none}
21
+ body.task-open .center{display:block}
22
+ .back-btn{display:inline-grid}
23
+ .crumbs .crumb,.crumbs .crumb-sep{display:none}
24
+ .dock-divider{display:none}
25
+ .dock{position:fixed;inset:0;z-index:60;padding-top:env(safe-area-inset-top,0px);padding-bottom:env(safe-area-inset-bottom,0px)}
26
+ #dock-swap{display:none}
27
+ .overview-grid{grid-template-columns:minmax(0,1fr)}
28
+ .dock-toggle span{display:none}
29
+ .dock-toggle{width:32px;padding:0}
32
30
  }
33
31
  @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))}
32
+ .metric-strip{grid-template-columns:repeat(2,minmax(0,1fr))}
33
+ .page-head{padding-top:24px;flex-wrap:wrap}
34
+ .task-title{font-size:var(--fs-xl)}
35
+ .tab:not([aria-selected="true"]) span:not(.count){display:none}
36
+ .tab{padding:0 12px}
37
+ .field-row{grid-template-columns:minmax(0,1fr)}
38
+ .work-body{padding-left:16px}
39
+ .kv{grid-template-columns:minmax(0,1fr)}
40
+ .kv dt{margin-top:4px}
41
+ .foot-btn kbd{display:none}
52
42
  }
53
- @media(prefers-reduced-motion:reduce){*{scroll-behavior:auto!important;transition:none!important;animation:none!important}}
54
43
  `;