@zq-silk/yui 1.1.2 → 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.
- package/ARCHITECTURE.md +2 -1
- package/ARCHITECTURE.zh-CN.md +2 -1
- package/README.md +2 -0
- package/dist/cli/commandCatalog.js +344 -324
- package/dist/cli/commandDiscovery.js +69 -0
- package/dist/cli/completion.js +22 -227
- package/dist/cli/dynamicCompletion.js +12 -6
- package/dist/cli/invocationAuthority.js +2 -2
- package/dist/cli/invocationRouter.js +18 -7
- package/dist/cli/managedDiagnostics.js +2 -1
- package/dist/cli/updatePorts.js +0 -5
- package/dist/cli.js +184 -130
- package/dist/commands/capabilityCommands.js +5 -5
- package/dist/commands/controllerCommands.js +2 -1
- package/dist/commands/globalRoleCommands.js +86 -44
- package/dist/commands/grantCommands.js +48 -8
- package/dist/commands/taskCommands.js +157 -196
- package/dist/commands/taskContextCommand.js +29 -6
- package/dist/commands/taskFactCommands.js +10 -69
- package/dist/commands/taskInputCommands.js +26 -35
- package/dist/commands/taskPublicationCommands.js +2 -35
- package/dist/commands/taskPublicationVerifyCommand.js +1 -2
- package/dist/commands/taskUpstreamCommands.js +2 -1
- package/dist/context/runContextPack.js +8 -29
- package/dist/context/sessionBootstrapManifest.js +5 -101
- package/dist/context/taskContext.js +104 -41
- package/dist/controller/clientRuntime.js +16 -8
- package/dist/controller/fileSchedulerStoreAdapter.js +24 -0
- package/dist/controller/runtime.js +6 -0
- package/dist/core/controllerClient.js +46 -21
- package/dist/core/protocol.js +12 -7
- package/dist/doctor/doctor.js +4 -3
- package/dist/errors/cliError.js +4 -4
- package/dist/errors/cliFailure.js +213 -0
- package/dist/executor/fileRoleLaunchPlanner.js +1 -4
- package/dist/grant/capabilityGrant.js +13 -0
- package/dist/grant/taskAuthorization.js +127 -0
- package/dist/kernel/accessAssessment.js +1 -0
- package/dist/kernel/builtinCapabilities.js +88 -9
- package/dist/kernel/capabilityRegistry.js +64 -19
- package/dist/kernel/kernelPorts.js +2 -2
- package/dist/nativeAgent/agent.js +173 -0
- package/dist/nativeAgent/contracts.js +1 -0
- package/dist/nativeAgent/demo.js +29 -0
- package/dist/nativeAgent/index.js +3 -0
- package/dist/nativeAgent/mockProvider.js +43 -0
- package/dist/nativeAgent/textTools.js +156 -0
- package/dist/nativeAgent/validation.js +95 -0
- package/dist/output/boundedRead.js +118 -0
- package/dist/plugins/pluginService.js +98 -8
- package/dist/release/releaseWorkflowEngine.js +8 -1
- package/dist/resources/projectResourceService.js +23 -1
- package/dist/runtime/managedCaller.js +2 -2
- package/dist/runtime/managedIdentity.js +6 -0
- package/dist/runtime/runtimeCoherence.js +10 -8
- package/dist/storage/sqliteSchema.js +10 -0
- package/dist/storage/storageVersions.js +1 -1
- package/dist/storage/taskStore.js +3 -0
- package/dist/surface/surfaceContributions.js +3 -0
- package/dist/task/leaderArchive.js +111 -0
- package/dist/task/leaderArchiveAuthority.js +24 -0
- package/dist/task/taskAuthority.js +5 -10
- package/dist/tmux/commandExecutor.js +7 -5
- package/dist/web/assets/assetManifest.js +38 -22
- package/dist/web/assets/client/api.js +115 -0
- package/dist/web/assets/client/app.js +555 -863
- package/dist/web/assets/client/components.js +323 -897
- package/dist/web/assets/client/detail.js +333 -0
- package/dist/web/assets/client/dock.js +225 -0
- package/dist/web/assets/client/dom.js +55 -3
- package/dist/web/assets/client/evidence.js +172 -0
- package/dist/web/assets/client/format.js +25 -14
- package/dist/web/assets/client/forms.js +230 -0
- package/dist/web/assets/client/i18n.js +1020 -791
- package/dist/web/assets/client/overview.js +115 -0
- package/dist/web/assets/client/records.js +63 -0
- package/dist/web/assets/client/sections.js +313 -0
- package/dist/web/assets/client/sidebar.js +117 -0
- package/dist/web/assets/client/theme.js +61 -22
- package/dist/web/assets/icons.js +39 -0
- package/dist/web/assets/shell.js +124 -118
- package/dist/web/assets/styles/base.js +41 -0
- package/dist/web/assets/styles/components.js +167 -0
- package/dist/web/assets/styles/layout.js +49 -77
- package/dist/web/assets/styles/markdown.js +16 -24
- package/dist/web/assets/styles/responsive.js +33 -44
- package/dist/web/assets/styles/tokens.js +65 -89
- package/dist/web/assets/styles/views.js +289 -0
- package/dist/web/webServer.js +2 -1
- package/docs/architecture/README.md +1 -0
- package/docs/architecture/README.zh-CN.md +1 -0
- package/docs/cli-information-contract.md +107 -0
- package/docs/cli-information-contract.zh-CN.md +81 -0
- package/docs/managed-turn-and-session-runtime.md +9 -0
- package/docs/managed-turn-and-session-runtime.zh-CN.md +6 -0
- package/docs/plugin-sdk.md +7 -3
- package/docs/plugin-sdk.zh-CN.md +5 -2
- package/docs/release-workflow.md +42 -9
- package/docs/release-workflow.zh-CN.md +30 -7
- package/docs/storage-baseline.md +5 -0
- package/docs/testing/verification-levels.md +2 -2
- package/i18n/README.zh-CN.md +2 -0
- package/package.json +1 -1
- package/skills/yui-leader/SKILL.md +8 -1
- package/skills/yui-leader/references/authorization.md +64 -0
- package/skills/yui-leader/references/execution.md +18 -4
- package/skills/yui-leader/references/task-plugins.md +4 -2
- package/skills/yui-operator/SKILL.md +9 -2
- package/skills/yui-runtime/SKILL.md +77 -9
- package/skills/yui-runtime/references/publication.md +3 -1
- package/dist/web/assets/client/taskSummary.js +0 -350
- package/dist/web/assets/client/taskSurface.js +0 -616
- package/dist/web/assets/client/view.js +0 -608
- package/dist/web/assets/styles/cards.js +0 -247
- package/dist/web/assets/styles/widgets.js +0 -168
|
@@ -1,101 +1,77 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* DESIGN
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* theme
|
|
7
|
-
* tokens, so switching (or adding) a theme can never change layout, sizing, or
|
|
8
|
-
* position. Layout / component / responsive styles reference these variables
|
|
9
|
-
* only — never hardcode a color outside a theme block.
|
|
2
|
+
* DESIGN TOKENS
|
|
3
|
+
* -------------
|
|
4
|
+
* Geometry, type, spacing and motion are theme-independent and live once on
|
|
5
|
+
* :root. A theme block defines colour and effect tokens only, so switching a
|
|
6
|
+
* theme can never move or resize anything.
|
|
10
7
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
8
|
+
* Themes
|
|
9
|
+
* sumi (墨) graphite dark, vermilion accent — default dark
|
|
10
|
+
* washi (和紙) warm paper light, vermilion accent — default light
|
|
11
|
+
* ai (藍) deep indigo dark, periwinkle accent
|
|
12
|
+
* "system" is not a token block: client/theme.ts resolves it to sumi or washi
|
|
13
|
+
* from prefers-color-scheme and stamps the resolved name on <html>.
|
|
15
14
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* Type --font-mono --font-display --font-body
|
|
19
|
-
* Metrics --page-space --sidebar-w --terminal-w
|
|
20
|
-
* Motion --motion-fast --motion-slow --ease
|
|
21
|
-
*
|
|
22
|
-
* Per-theme ([data-theme="..."], color only)
|
|
23
|
-
* Surfaces --bg --bg-1 --bg-2 --bg-3 (page → elevated layers)
|
|
24
|
-
* Lines --border --border-strong
|
|
25
|
-
* Text --text --muted --faint
|
|
26
|
-
* Accent --accent --accent-2 --on-accent --accent-soft --accent-line
|
|
27
|
-
* Semantic --active/--success/--warning/--danger (+ matching --*-soft)
|
|
28
|
-
* Effects --glow --shadow-card --shadow-pop --ambient
|
|
15
|
+
* To add a theme: add a [data-theme="name"] block defining every colour token
|
|
16
|
+
* below, then register the name in client/theme.ts and the settings menu.
|
|
29
17
|
*/
|
|
30
18
|
export const TOKEN_STYLES = `
|
|
31
|
-
/* Theme-independent layout tokens — shared by every theme (see contract above).
|
|
32
|
-
Never move these into a [data-theme] block. */
|
|
33
19
|
:root{
|
|
34
|
-
--
|
|
35
|
-
--font-mono:"JetBrains Mono","SFMono-Regular",Consolas,monospace;
|
|
36
|
-
--
|
|
37
|
-
--
|
|
38
|
-
--
|
|
39
|
-
--
|
|
40
|
-
|
|
41
|
-
:
|
|
42
|
-
color-scheme:dark;
|
|
43
|
-
--bg:#080b11;--bg-1:#0c111a;--bg-2:#111826;--bg-3:#182132;
|
|
44
|
-
--border:#1e2836;--border-strong:#2f3d50;
|
|
45
|
-
--text:#e8eef6;--muted:#8b99ad;--faint:#5a6779;
|
|
46
|
-
--accent:#49d6ff;--accent-2:#a78bfa;--on-accent:#05121b;
|
|
47
|
-
--accent-soft:rgba(73,214,255,.1);--accent-line:rgba(73,214,255,.34);
|
|
48
|
-
--active:#49d6ff;--active-soft:rgba(73,214,255,.12);
|
|
49
|
-
--success:#43d98d;--success-soft:rgba(67,217,141,.12);
|
|
50
|
-
--warning:#ffca6b;--warning-soft:rgba(255,202,107,.12);
|
|
51
|
-
--danger:#ff6b81;--danger-soft:rgba(255,107,129,.12);
|
|
52
|
-
--glow:0 0 18px rgba(73,214,255,.45);
|
|
53
|
-
--shadow-card:0 1px 2px rgba(0,0,0,.32),0 4px 12px rgba(0,0,0,.18);
|
|
54
|
-
--shadow-pop:0 18px 48px rgba(0,0,0,.5);
|
|
55
|
-
--ambient:
|
|
56
|
-
radial-gradient(1000px 560px at 8% -12%,rgba(73,214,255,.12),transparent 58%),
|
|
57
|
-
radial-gradient(900px 520px at 104% -6%,rgba(167,139,250,.12),transparent 55%),
|
|
58
|
-
linear-gradient(rgba(255,255,255,.022) 1px,transparent 1px) 0 0/100% 44px,
|
|
59
|
-
linear-gradient(90deg,rgba(255,255,255,.022) 1px,transparent 1px) 0 0/44px 100%;
|
|
20
|
+
--font-sans:"Inter",ui-sans-serif,system-ui,-apple-system,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
|
|
21
|
+
--font-mono:"JetBrains Mono",ui-monospace,"SFMono-Regular",Menlo,Consolas,monospace;
|
|
22
|
+
--fs-2xs:10.5px;--fs-xs:11.5px;--fs-sm:12.5px;--fs-md:13.5px;--fs-lg:15px;--fs-xl:19px;--fs-2xl:24px;
|
|
23
|
+
--sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:16px;--sp-5:20px;--sp-6:24px;--sp-8:32px;
|
|
24
|
+
--r-xs:5px;--r-sm:7px;--r-md:10px;--r-lg:14px;--r-pill:999px;
|
|
25
|
+
--sidebar-w:clamp(260px,21vw,312px);--dock-w:440px;--dock-min:320px;--divider-w:9px;
|
|
26
|
+
--center-max:980px;--header-h:56px;
|
|
27
|
+
--t-fast:120ms;--t-med:220ms;--ease:cubic-bezier(.2,.8,.2,1);
|
|
60
28
|
}
|
|
61
|
-
[data-theme="
|
|
29
|
+
:root,[data-theme="sumi"]{
|
|
62
30
|
color-scheme:dark;
|
|
63
|
-
--
|
|
64
|
-
--
|
|
65
|
-
--
|
|
66
|
-
--accent:#
|
|
67
|
-
--
|
|
68
|
-
--
|
|
69
|
-
--
|
|
70
|
-
--
|
|
71
|
-
--
|
|
72
|
-
--
|
|
73
|
-
--shadow-
|
|
74
|
-
--
|
|
75
|
-
--
|
|
76
|
-
radial-gradient(1000px 560px at 10% -14%,rgba(56,225,212,.11),transparent 58%),
|
|
77
|
-
radial-gradient(900px 520px at 106% -6%,rgba(124,171,242,.1),transparent 55%),
|
|
78
|
-
linear-gradient(rgba(230,242,251,.018) 1px,transparent 1px) 0 0/100% 44px,
|
|
79
|
-
linear-gradient(90deg,rgba(230,242,251,.018) 1px,transparent 1px) 0 0/44px 100%;
|
|
31
|
+
--canvas:#0e0f11;--surface:#141518;--surface-2:#191a1e;--surface-3:#202126;--sunken:#0b0c0d;
|
|
32
|
+
--line:rgba(255,255,255,.065);--line-2:rgba(255,255,255,.11);--line-3:rgba(255,255,255,.18);
|
|
33
|
+
--ink:#ececee;--ink-2:#b4b5bb;--ink-3:#85868e;--ink-4:#5c5d64;
|
|
34
|
+
--accent:#ff7a52;--accent-ink:#1a0c06;--accent-soft:rgba(255,122,82,.12);--accent-line:rgba(255,122,82,.38);
|
|
35
|
+
--info:#6cb6ff;--info-soft:rgba(108,182,255,.13);
|
|
36
|
+
--ok:#4fd18b;--ok-soft:rgba(79,209,139,.13);
|
|
37
|
+
--warn:#f5c065;--warn-soft:rgba(245,192,101,.14);
|
|
38
|
+
--bad:#ff6b7a;--bad-soft:rgba(255,107,122,.13);
|
|
39
|
+
--idle:#8e8f97;--idle-soft:rgba(142,143,151,.14);
|
|
40
|
+
--shadow-1:0 1px 0 rgba(255,255,255,.03) inset,0 1px 2px rgba(0,0,0,.35);
|
|
41
|
+
--shadow-2:0 12px 40px rgba(0,0,0,.5),0 2px 8px rgba(0,0,0,.35);
|
|
42
|
+
--focus:0 0 0 2px var(--canvas),0 0 0 4px var(--accent-line);
|
|
43
|
+
--term-bg:#0b0c0d;--term-fg:#e6e6e8;--term-cursor:#ff7a52;--term-sel:#3a2a24;
|
|
80
44
|
}
|
|
81
|
-
[data-theme="
|
|
45
|
+
[data-theme="washi"]{
|
|
82
46
|
color-scheme:light;
|
|
83
|
-
--
|
|
84
|
-
--
|
|
85
|
-
--
|
|
86
|
-
--accent:#
|
|
87
|
-
--
|
|
88
|
-
--
|
|
89
|
-
--
|
|
90
|
-
--
|
|
91
|
-
--
|
|
92
|
-
--
|
|
93
|
-
--shadow-
|
|
94
|
-
--
|
|
95
|
-
--
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
47
|
+
--canvas:#f4f2ed;--surface:#fbfaf7;--surface-2:#ffffff;--surface-3:#f1eee7;--sunken:#ebe8e0;
|
|
48
|
+
--line:rgba(40,32,20,.08);--line-2:rgba(40,32,20,.13);--line-3:rgba(40,32,20,.22);
|
|
49
|
+
--ink:#1d1b18;--ink-2:#45413b;--ink-3:#77726a;--ink-4:#a39e95;
|
|
50
|
+
--accent:#d24a26;--accent-ink:#ffffff;--accent-soft:rgba(210,74,38,.09);--accent-line:rgba(210,74,38,.34);
|
|
51
|
+
--info:#1f6fd1;--info-soft:rgba(31,111,209,.09);
|
|
52
|
+
--ok:#17844f;--ok-soft:rgba(23,132,79,.1);
|
|
53
|
+
--warn:#a86500;--warn-soft:rgba(168,101,0,.1);
|
|
54
|
+
--bad:#c72f45;--bad-soft:rgba(199,47,69,.09);
|
|
55
|
+
--idle:#7a756c;--idle-soft:rgba(122,117,108,.11);
|
|
56
|
+
--shadow-1:0 1px 2px rgba(40,32,20,.06);
|
|
57
|
+
--shadow-2:0 16px 40px rgba(40,32,20,.16),0 2px 8px rgba(40,32,20,.08);
|
|
58
|
+
--focus:0 0 0 2px var(--canvas),0 0 0 4px var(--accent-line);
|
|
59
|
+
--term-bg:#1b1a18;--term-fg:#efece6;--term-cursor:#ff8a63;--term-sel:#4a3a32;
|
|
60
|
+
}
|
|
61
|
+
[data-theme="ai"]{
|
|
62
|
+
color-scheme:dark;
|
|
63
|
+
--canvas:#0a0e1a;--surface:#0f1424;--surface-2:#141a2e;--surface-3:#1a2139;--sunken:#080b15;
|
|
64
|
+
--line:rgba(160,180,255,.08);--line-2:rgba(160,180,255,.13);--line-3:rgba(160,180,255,.22);
|
|
65
|
+
--ink:#e7eaf6;--ink-2:#b0b7d2;--ink-3:#8088a8;--ink-4:#565e7d;
|
|
66
|
+
--accent:#8fa8ff;--accent-ink:#0a0e1a;--accent-soft:rgba(143,168,255,.13);--accent-line:rgba(143,168,255,.4);
|
|
67
|
+
--info:#6fd3ff;--info-soft:rgba(111,211,255,.12);
|
|
68
|
+
--ok:#5ad6a0;--ok-soft:rgba(90,214,160,.12);
|
|
69
|
+
--warn:#f2c46d;--warn-soft:rgba(242,196,109,.13);
|
|
70
|
+
--bad:#ff7d93;--bad-soft:rgba(255,125,147,.13);
|
|
71
|
+
--idle:#8a91ad;--idle-soft:rgba(138,145,173,.14);
|
|
72
|
+
--shadow-1:0 1px 0 rgba(255,255,255,.03) inset,0 1px 2px rgba(0,0,0,.4);
|
|
73
|
+
--shadow-2:0 14px 44px rgba(0,0,0,.55),0 2px 8px rgba(0,0,0,.4);
|
|
74
|
+
--focus:0 0 0 2px var(--canvas),0 0 0 4px var(--accent-line);
|
|
75
|
+
--term-bg:#080b15;--term-fg:#e2e6f5;--term-cursor:#8fa8ff;--term-sel:#26305a;
|
|
100
76
|
}
|
|
101
77
|
`;
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* VIEWS — styling for the concrete surfaces: sidebar index, overview, task
|
|
3
|
+
* page (header, tabs, sections, records) and the session dock.
|
|
4
|
+
*/
|
|
5
|
+
export const VIEW_STYLES = `
|
|
6
|
+
/* ---------- Sidebar ---------- */
|
|
7
|
+
.brand-mark{display:grid;place-items:center;width:28px;height:28px;flex:none;border-radius:8px;background:var(--accent);color:var(--accent-ink);font-size:15px;font-weight:700;line-height:1}
|
|
8
|
+
.brand-name{font-size:var(--fs-lg);font-weight:650;letter-spacing:-.02em}
|
|
9
|
+
.sync{display:inline-flex;align-items:center;gap:6px;height:24px;padding:0 8px;border-radius:var(--r-pill);background:var(--surface-3);color:var(--ink-3);font-size:var(--fs-2xs);font-variant-numeric:tabular-nums}
|
|
10
|
+
.sync i{width:6px;height:6px;border-radius:50%;background:var(--ink-4)}
|
|
11
|
+
.sync[data-state="ok"] i{background:var(--ok);box-shadow:0 0 0 3px var(--ok-soft)}
|
|
12
|
+
.sync[data-state="syncing"] i{background:var(--info);animation:blink 1s ease-in-out infinite}
|
|
13
|
+
.sync[data-state="error"] i{background:var(--bad);box-shadow:0 0 0 3px var(--bad-soft)}
|
|
14
|
+
.sync[data-state="error"]{color:var(--bad)}
|
|
15
|
+
@keyframes blink{50%{opacity:.35}}
|
|
16
|
+
.search-field{position:relative;display:flex;align-items:center}
|
|
17
|
+
.search-field>.icon{position:absolute;left:10px;color:var(--ink-4);pointer-events:none}
|
|
18
|
+
.search-field input{height:34px;padding:0 34px 0 32px;border-radius:var(--r-md);background:var(--surface-2)}
|
|
19
|
+
.search-field input::-webkit-search-cancel-button{display:none}
|
|
20
|
+
.search-field kbd{position:absolute;right:8px}
|
|
21
|
+
.attention-list{display:flex;flex-wrap:wrap;gap:6px}
|
|
22
|
+
.attention-pill{display:inline-flex;align-items:center;gap:6px;height:26px;padding:0 9px;border:1px solid transparent;border-radius:var(--r-pill);background:var(--tone-soft);color:var(--tone);font-size:var(--fs-xs);font-weight:500}
|
|
23
|
+
.attention-pill b{font-weight:700;font-variant-numeric:tabular-nums}
|
|
24
|
+
.attention-pill:hover{border-color:var(--tone)}
|
|
25
|
+
.attention-pill[aria-pressed="true"]{background:var(--tone);color:var(--canvas)}
|
|
26
|
+
.attention-clear{display:flex;align-items:center;gap:6px;color:var(--ink-4);font-size:var(--fs-xs)}
|
|
27
|
+
.attention-clear .icon{color:var(--ok)}
|
|
28
|
+
.tabs-row{display:flex;gap:2px;overflow-x:auto;scrollbar-width:none;padding-bottom:2px;border-bottom:1px solid var(--line)}
|
|
29
|
+
.tabs-row::-webkit-scrollbar{display:none}
|
|
30
|
+
.status-tab{position:relative;display:inline-flex;align-items:center;gap:5px;flex:none;height:32px;padding:0 8px;border:0;background:transparent;color:var(--ink-3);font-size:var(--fs-xs);font-weight:500;white-space:nowrap}
|
|
31
|
+
.status-tab:hover{color:var(--ink)}
|
|
32
|
+
.status-tab[aria-pressed="true"]{color:var(--ink)}
|
|
33
|
+
.status-tab[aria-pressed="true"]::after{content:"";position:absolute;left:6px;right:6px;bottom:-3px;height:2px;border-radius:2px;background:var(--accent)}
|
|
34
|
+
.status-tab-count{color:var(--ink-4);font-size:var(--fs-2xs);font-variant-numeric:tabular-nums}
|
|
35
|
+
.task-group{margin-top:10px}
|
|
36
|
+
.task-group-head{display:flex;align-items:center;gap:6px;padding:4px 8px 6px;color:var(--ink-4);font-size:var(--fs-2xs);font-weight:600;text-transform:uppercase;letter-spacing:.07em}
|
|
37
|
+
.task-group-head .count{background:transparent;padding:0;min-width:0}
|
|
38
|
+
.task-row{position:relative;display:flex;align-items:flex-start;gap:10px;width:100%;padding:9px 10px;border:0;border-radius:var(--r-md);background:transparent;text-align:left;transition:background var(--t-fast)}
|
|
39
|
+
.task-row>.dot{margin-top:6px}
|
|
40
|
+
.task-row:hover{background:var(--surface-3)}
|
|
41
|
+
.task-row[aria-current="true"]{background:var(--surface-3);box-shadow:inset 0 0 0 1px var(--line-2)}
|
|
42
|
+
.task-row[aria-current="true"]::before{content:"";position:absolute;left:-8px;top:10px;bottom:10px;width:3px;border-radius:0 3px 3px 0;background:var(--accent)}
|
|
43
|
+
.task-body{display:grid;gap:3px;flex:1;min-width:0}
|
|
44
|
+
.task-line{display:flex;align-items:center;gap:8px;min-width:0}
|
|
45
|
+
.task-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink);font-size:var(--fs-md);font-weight:500}
|
|
46
|
+
.task-time{flex:none;color:var(--ink-4);font-size:var(--fs-2xs);font-variant-numeric:tabular-nums}
|
|
47
|
+
.task-sub{gap:8px;height:18px;color:var(--ink-4);font-size:var(--fs-2xs)}
|
|
48
|
+
.task-id{font-size:var(--fs-2xs);line-height:1;color:var(--ink-3)}
|
|
49
|
+
.task-meta{display:inline-flex;align-items:center;gap:3px;line-height:1;white-space:nowrap}
|
|
50
|
+
.task-meta .icon{width:11px;height:11px}
|
|
51
|
+
.task-signals{display:inline-flex;gap:4px;margin-left:auto}
|
|
52
|
+
.signal{display:inline-flex;align-items:center;gap:3px;height:18px;padding:0 6px;border-radius:var(--r-pill);background:var(--tone-soft);color:var(--tone);font-size:10.5px;font-weight:600;font-variant-numeric:tabular-nums}
|
|
53
|
+
.signal .icon{width:11px;height:11px;stroke-width:2}
|
|
54
|
+
.list-empty{display:grid;justify-items:center;gap:8px;padding:36px 16px;color:var(--ink-4);font-size:var(--fs-sm);text-align:center}
|
|
55
|
+
.list-empty.is-error{color:var(--bad)}
|
|
56
|
+
.pager-btn{height:28px;padding:0 10px;border:1px solid var(--line-2);border-radius:var(--r-sm);background:transparent;color:var(--ink-2);font-size:var(--fs-xs)}
|
|
57
|
+
.pager-btn:hover:not(:disabled){border-color:var(--line-3);color:var(--ink)}
|
|
58
|
+
.pager-btn:disabled{opacity:.4}
|
|
59
|
+
.pager-count{grid-column:2;text-align:center;color:var(--ink-4);font-size:var(--fs-2xs);font-variant-numeric:tabular-nums}
|
|
60
|
+
.pager-clear{height:28px;border:1px dashed var(--line-3);border-radius:var(--r-sm);background:transparent;color:var(--ink-3);font-size:var(--fs-xs)}
|
|
61
|
+
.pager-clear:hover{color:var(--accent);border-color:var(--accent-line)}
|
|
62
|
+
.foot-btn{display:inline-flex;align-items:center;gap:7px;height:32px;padding:0 10px;border:1px solid var(--line-2);border-radius:var(--r-sm);background:transparent;color:var(--ink-2);font-size:var(--fs-xs);font-weight:500;min-width:0}
|
|
63
|
+
.foot-btn span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
64
|
+
.foot-btn:hover{color:var(--ink);border-color:var(--line-3);background:var(--surface-3)}
|
|
65
|
+
.foot-btn[aria-pressed="true"]{color:var(--accent);border-color:var(--accent-line);background:var(--accent-soft)}
|
|
66
|
+
.foot-btn kbd{margin-left:2px}
|
|
67
|
+
.side-foot .foot-btn:first-child{flex:1}
|
|
68
|
+
.side-foot .icon-btn{margin-left:auto}
|
|
69
|
+
|
|
70
|
+
/* ---------- Page scaffolding ---------- */
|
|
71
|
+
.page-head{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;padding:36px 0 24px}
|
|
72
|
+
.kicker{color:var(--accent);font-size:var(--fs-2xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em}
|
|
73
|
+
.page-title{margin-top:6px;font-size:var(--fs-2xl);font-weight:650;letter-spacing:-.025em}
|
|
74
|
+
.page-sub{margin-top:4px;color:var(--ink-3)}
|
|
75
|
+
.page-foot{margin-top:20px;color:var(--ink-4);font-size:var(--fs-xs);text-align:center}
|
|
76
|
+
.section{margin-top:28px;min-width:0}
|
|
77
|
+
.section-title{display:flex;align-items:center;gap:10px;margin-bottom:12px}
|
|
78
|
+
.section-title h2{display:flex;align-items:center;gap:8px;font-size:var(--fs-lg);font-weight:600}
|
|
79
|
+
.section-actions{margin-left:auto}
|
|
80
|
+
.sub-head{display:flex;align-items:center;gap:8px;margin-top:6px;font-size:var(--fs-sm);font-weight:600}
|
|
81
|
+
|
|
82
|
+
/* ---------- Overview ---------- */
|
|
83
|
+
.metric-strip{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:10px;margin-bottom:14px}
|
|
84
|
+
.metric-strip .metric{padding:14px 16px;border-radius:var(--r-lg)}
|
|
85
|
+
.metric-strip .metric-value{font-size:var(--fs-2xl)}
|
|
86
|
+
.overview-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;margin-bottom:14px;align-items:start}
|
|
87
|
+
.overview>.card{margin-bottom:14px}
|
|
88
|
+
.row-list{display:grid;gap:2px;margin:-4px -8px}
|
|
89
|
+
.list-row{display:flex;align-items:center;gap:10px;width:100%;min-height:38px;padding:7px 8px;border:0;border-radius:var(--r-sm);background:transparent;color:var(--ink);text-align:left;font-size:var(--fs-sm)}
|
|
90
|
+
.list-row:hover:not(:disabled){background:var(--surface-3)}
|
|
91
|
+
.list-row:disabled{opacity:.45;cursor:default}
|
|
92
|
+
.list-row[aria-pressed="true"]{background:var(--accent-soft)}
|
|
93
|
+
.list-row-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
94
|
+
.list-row-count{font-weight:600;font-variant-numeric:tabular-nums}
|
|
95
|
+
.list-row-go{display:inline-flex;align-items:center;gap:2px;color:var(--accent);font-size:var(--fs-xs);font-weight:500}
|
|
96
|
+
.list-row-wrap{flex-wrap:wrap}
|
|
97
|
+
.list-row-wrap .chip-row{flex-basis:100%}
|
|
98
|
+
|
|
99
|
+
/* ---------- Task page ---------- */
|
|
100
|
+
.task-header{position:sticky;top:0;z-index:10;margin:0 calc(-1 * clamp(16px,3vw,40px));padding:0 clamp(16px,3vw,40px);background:color-mix(in srgb,var(--canvas) 88%,transparent);backdrop-filter:saturate(1.4) blur(10px);-webkit-backdrop-filter:saturate(1.4) blur(10px)}
|
|
101
|
+
.task-bar{display:flex;align-items:center;gap:6px;height:var(--header-h)}
|
|
102
|
+
.back-btn{display:none}
|
|
103
|
+
.crumbs{display:flex;align-items:center;gap:6px;min-width:0;font-size:var(--fs-sm)}
|
|
104
|
+
.crumb{padding:3px 6px;border:0;border-radius:var(--r-xs);background:transparent;color:var(--ink-3)}
|
|
105
|
+
.crumb:hover{color:var(--ink);background:var(--surface-3)}
|
|
106
|
+
.crumb-sep{color:var(--ink-4)}
|
|
107
|
+
.crumb-current{color:var(--ink-2);font-size:var(--fs-xs)}
|
|
108
|
+
.dock-toggle{height:30px}
|
|
109
|
+
.task-hero{padding:14px 0 18px}
|
|
110
|
+
.task-title{font-size:var(--fs-2xl);font-weight:650;letter-spacing:-.025em;line-height:1.25;overflow-wrap:anywhere}
|
|
111
|
+
.task-meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:12px;color:var(--ink-3);font-size:var(--fs-xs)}
|
|
112
|
+
.task-meta:empty{display:none}
|
|
113
|
+
.meta-item{display:inline-flex;align-items:center;gap:5px}
|
|
114
|
+
.meta-item .when{font-size:inherit}
|
|
115
|
+
.tabs-wrap{position:sticky;top:var(--header-h);z-index:9;margin:0 calc(-1 * clamp(16px,3vw,40px));padding:0 clamp(16px,3vw,40px);background:color-mix(in srgb,var(--canvas) 88%,transparent);backdrop-filter:saturate(1.4) blur(10px);-webkit-backdrop-filter:saturate(1.4) blur(10px);border-bottom:1px solid var(--line)}
|
|
116
|
+
.tabs{display:flex;gap:4px;overflow-x:auto;scrollbar-width:none}
|
|
117
|
+
.tabs::-webkit-scrollbar{display:none}
|
|
118
|
+
.tab{position:relative;display:inline-flex;align-items:center;gap:7px;flex:none;height:42px;padding:0 10px;border:0;background:transparent;color:var(--ink-3);font-size:var(--fs-sm);font-weight:500}
|
|
119
|
+
.tab:hover{color:var(--ink)}
|
|
120
|
+
.tab[aria-selected="true"]{color:var(--ink)}
|
|
121
|
+
.tab[aria-selected="true"]::after{content:"";position:absolute;left:8px;right:8px;bottom:-1px;height:2px;border-radius:2px;background:var(--accent)}
|
|
122
|
+
.tab .icon{color:var(--ink-4)}
|
|
123
|
+
.tab[aria-selected="true"] .icon{color:var(--accent)}
|
|
124
|
+
.tab:focus-visible{box-shadow:inset var(--focus)}
|
|
125
|
+
.tab-panel{padding-top:20px;min-width:0}
|
|
126
|
+
.tab-panel>.card{margin-bottom:14px}
|
|
127
|
+
.tab-panel>.section:first-child{margin-top:4px}
|
|
128
|
+
|
|
129
|
+
/* Now card */
|
|
130
|
+
.now-card{border-color:var(--line-2);background:linear-gradient(180deg,var(--surface-2),var(--surface))}
|
|
131
|
+
.now-head{display:flex;flex-wrap:wrap;align-items:center;gap:8px}
|
|
132
|
+
.now-owner{color:var(--ink-2);font-size:var(--fs-sm);font-weight:500}
|
|
133
|
+
.now-summary{margin-top:10px;font-size:var(--fs-lg);line-height:1.45;color:var(--ink)}
|
|
134
|
+
.now-reason{margin-top:4px;color:var(--ink-3);font-size:var(--fs-sm)}
|
|
135
|
+
.now-note{margin-top:8px;color:var(--ink-3);font-size:var(--fs-sm)}
|
|
136
|
+
.signal-list{list-style:none;display:grid;gap:6px;margin:12px 0 0;padding:0}
|
|
137
|
+
.signal-row{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 8px;padding:8px 10px;border-radius:var(--r-sm);background:var(--tone-soft);font-size:var(--fs-sm)}
|
|
138
|
+
.signal-row>.icon{align-self:center;color:var(--tone)}
|
|
139
|
+
.signal-kind{color:var(--tone);font-weight:600}
|
|
140
|
+
.next-line{display:flex;flex-wrap:wrap;align-items:center;gap:4px;color:var(--ink-3);font-size:var(--fs-xs)}
|
|
141
|
+
.next-line:empty{display:none}
|
|
142
|
+
.next-line .icon{color:var(--accent)}
|
|
143
|
+
.next-line strong{color:var(--ink)}
|
|
144
|
+
|
|
145
|
+
/* Needs you / input requests */
|
|
146
|
+
.needs-card{border-color:var(--warn);box-shadow:0 0 0 3px var(--warn-soft)}
|
|
147
|
+
.needs-card .card-title .icon{color:var(--warn)}
|
|
148
|
+
.input-card{display:grid;gap:10px;padding:14px;border:1px solid var(--line-2);border-radius:var(--r-md);background:var(--surface-2)}
|
|
149
|
+
.input-head{display:flex;flex-wrap:wrap;align-items:center;gap:8px;color:var(--ink-3);font-size:var(--fs-xs)}
|
|
150
|
+
.input-kicker{display:inline-flex;align-items:center;gap:5px;color:var(--warn);font-weight:600;text-transform:uppercase;letter-spacing:.06em;font-size:var(--fs-2xs)}
|
|
151
|
+
.input-timeout{display:inline-flex;align-items:center;gap:4px}
|
|
152
|
+
.input-head .when{margin-left:auto}
|
|
153
|
+
.input-question{font-size:var(--fs-lg);font-weight:500;line-height:1.45;white-space:pre-wrap;overflow-wrap:anywhere}
|
|
154
|
+
.input-facts{color:var(--ink-3);font-size:var(--fs-xs);overflow-wrap:anywhere}
|
|
155
|
+
.input-choices{display:flex;flex-wrap:wrap;gap:8px}
|
|
156
|
+
.choice{display:inline-flex;align-items:center;gap:8px;min-height:36px;padding:6px 14px;border:1px solid var(--line-3);border-radius:var(--r-md);background:var(--surface);color:var(--ink);font-weight:500;text-align:left}
|
|
157
|
+
.choice:hover:not(:disabled){border-color:var(--accent);background:var(--accent-soft)}
|
|
158
|
+
.choice.is-recommended{border-color:var(--accent-line)}
|
|
159
|
+
.choice:disabled{opacity:.5}
|
|
160
|
+
.input-form{display:flex;gap:8px}
|
|
161
|
+
.input-form input{flex:1}
|
|
162
|
+
|
|
163
|
+
/* Decisions, sessions, planning */
|
|
164
|
+
.decision{display:grid;gap:4px;padding-top:10px;border-top:1px solid var(--line)}
|
|
165
|
+
.decision:first-child{padding-top:0;border-top:0}
|
|
166
|
+
.decision-head{display:flex;align-items:center;gap:8px;font-size:var(--fs-sm)}
|
|
167
|
+
.decision-head strong{flex:1;min-width:0;font-weight:600}
|
|
168
|
+
.session-list{list-style:none;display:grid;gap:8px;margin:0;padding:0}
|
|
169
|
+
.session-row{display:grid;gap:3px;padding:9px 11px;border-radius:var(--r-sm);background:var(--surface-2);border:1px solid var(--line)}
|
|
170
|
+
.session-row-head{display:flex;align-items:center;gap:8px;font-size:var(--fs-sm)}
|
|
171
|
+
.session-row p{color:var(--ink-2)}
|
|
172
|
+
.planning-card .kv{font-size:var(--fs-xs)}
|
|
173
|
+
|
|
174
|
+
/* Work items */
|
|
175
|
+
.work-card{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--surface);box-shadow:var(--shadow-1);min-width:0}
|
|
176
|
+
.work-head{display:flex;align-items:center;gap:10px;padding:13px 16px;list-style:none}
|
|
177
|
+
summary.work-head{cursor:pointer}
|
|
178
|
+
summary.work-head::-webkit-details-marker{display:none}
|
|
179
|
+
.work-title{flex:1;min-width:0;font-weight:600;font-size:var(--fs-md);overflow-wrap:anywhere}
|
|
180
|
+
.work-body{display:grid;gap:12px;padding:0 16px 16px 34px}
|
|
181
|
+
.work-card.is-settled .work-title{color:var(--ink-2);font-weight:500}
|
|
182
|
+
.meta-line{display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px;color:var(--ink-3);font-size:var(--fs-xs)}
|
|
183
|
+
.meta-strong{display:inline-flex;align-items:center;gap:4px;color:var(--ink-2);font-weight:500}
|
|
184
|
+
.meta-label{color:var(--ink-4)}
|
|
185
|
+
.candidates{margin:0;padding:0;list-style:none;display:grid;gap:4px;font-size:var(--fs-xs)}
|
|
186
|
+
.candidates li{display:flex;flex-wrap:wrap;gap:8px;align-items:baseline}
|
|
187
|
+
.candidate-seq{font-family:var(--font-mono);color:var(--accent)}
|
|
188
|
+
|
|
189
|
+
/* Records, runs, roles */
|
|
190
|
+
.record,.run-card,.review-card{display:grid;gap:8px;min-width:0;padding:12px 14px;border:1px solid var(--line);border-radius:var(--r-md);background:var(--surface)}
|
|
191
|
+
.record.is-compact{padding:9px 12px;background:var(--surface-2)}
|
|
192
|
+
.record-head,.run-head{display:flex;flex-wrap:wrap;align-items:center;gap:8px;min-width:0;font-size:var(--fs-sm)}
|
|
193
|
+
.record-store{color:var(--ink-3);font-size:var(--fs-2xs);font-weight:600;text-transform:uppercase;letter-spacing:.06em}
|
|
194
|
+
.record-actions{display:flex;gap:8px}
|
|
195
|
+
.run-card[data-status="failed"]{border-color:color-mix(in srgb,var(--bad) 35%,var(--line))}
|
|
196
|
+
.run-role{font-weight:600}
|
|
197
|
+
.role-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px}
|
|
198
|
+
.role-card{display:grid;gap:10px;align-content:start;min-width:0;padding:14px;border:1px solid var(--line);border-radius:var(--r-lg);background:var(--surface);box-shadow:var(--shadow-1)}
|
|
199
|
+
.role-head{display:flex;align-items:center;gap:10px}
|
|
200
|
+
.role-title{display:grid;flex:1;min-width:0;line-height:1.3}
|
|
201
|
+
.role-title .faint{font-size:var(--fs-xs)}
|
|
202
|
+
.avatar{display:grid;place-items:center;width:32px;height:32px;flex:none;border-radius:9px;background:var(--surface-3);color:var(--ink-2);font-weight:650;font-size:var(--fs-sm)}
|
|
203
|
+
.role-card .kv{font-size:var(--fs-xs)}
|
|
204
|
+
.role-actions{display:flex;justify-content:flex-end;margin:-4px -6px -6px}
|
|
205
|
+
|
|
206
|
+
/* History timeline */
|
|
207
|
+
.timeline{list-style:none;margin:0;padding:0;position:relative;display:grid;gap:0}
|
|
208
|
+
.timeline::before{content:"";position:absolute;left:13px;top:6px;bottom:6px;width:1px;background:var(--line-2)}
|
|
209
|
+
.timeline-item{position:relative;display:grid;grid-template-columns:28px minmax(0,1fr);gap:12px;padding:0 0 18px}
|
|
210
|
+
.timeline-mark{position:relative;z-index:1;display:grid;place-items:center;width:28px;height:28px;border-radius:50%;background:var(--surface-2);border:1px solid var(--line-2);color:var(--ink-3)}
|
|
211
|
+
.kind-decision .timeline-mark{color:var(--ok);border-color:var(--ok-soft);background:var(--ok-soft)}
|
|
212
|
+
.kind-milestone .timeline-mark{color:var(--accent);border-color:var(--accent-soft);background:var(--accent-soft)}
|
|
213
|
+
.timeline-body{display:grid;gap:6px;min-width:0;padding-top:3px}
|
|
214
|
+
.timeline-head{display:flex;flex-wrap:wrap;align-items:center;gap:8px;font-size:var(--fs-sm)}
|
|
215
|
+
.timeline-empty{list-style:none}
|
|
216
|
+
.timeline .show-more{margin-left:40px}
|
|
217
|
+
|
|
218
|
+
/* Evidence */
|
|
219
|
+
.file-list{display:grid;gap:2px}
|
|
220
|
+
.file-list:empty{display:none}
|
|
221
|
+
.file-row{display:flex;align-items:center;gap:8px;min-height:32px;padding:5px 8px;border:0;border-radius:var(--r-sm);background:transparent;text-align:left;font-size:var(--fs-sm);color:var(--ink-2)}
|
|
222
|
+
.file-row:hover{background:var(--surface-3);color:var(--ink)}
|
|
223
|
+
.file-row[aria-current="true"]{background:var(--accent-soft);color:var(--ink)}
|
|
224
|
+
.file-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-mono);font-size:var(--fs-xs)}
|
|
225
|
+
.file-viewer{display:grid;gap:8px}
|
|
226
|
+
.file-viewer:empty{display:none}
|
|
227
|
+
.viewer-head{display:flex;align-items:center;gap:8px;font-size:var(--fs-sm)}
|
|
228
|
+
.viewer-ref code{white-space:normal;overflow-wrap:anywhere}
|
|
229
|
+
.artifact-text{max-height:480px;color:var(--ink)}
|
|
230
|
+
|
|
231
|
+
/* ---------- Dock ---------- */
|
|
232
|
+
.dock-sub{flex:none;display:flex;align-items:baseline;flex-wrap:wrap;gap:4px 10px;padding:12px 16px 10px;border-bottom:1px solid var(--line)}
|
|
233
|
+
.dock-sub-title{font-weight:600;font-size:var(--fs-sm)}
|
|
234
|
+
.dock-sub-note{color:var(--ink-4);font-size:var(--fs-2xs)}
|
|
235
|
+
.feed{flex:1;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:14px;padding:16px;scrollbar-gutter:stable}
|
|
236
|
+
.feed:focus-visible{box-shadow:inset var(--focus)}
|
|
237
|
+
.feed>.empty{margin:auto 0}
|
|
238
|
+
.feed-note{color:var(--ink-4);font-size:var(--fs-2xs);text-align:center}
|
|
239
|
+
.feed-day{display:flex;align-items:center;gap:10px;color:var(--ink-4);font-size:var(--fs-2xs);font-weight:500}
|
|
240
|
+
.feed-day::before,.feed-day::after{content:"";flex:1;height:1px;background:var(--line)}
|
|
241
|
+
.msg{display:flex;gap:10px;max-width:100%;min-width:0}
|
|
242
|
+
.msg-avatar{display:grid;place-items:center;width:28px;height:28px;flex:none;border-radius:8px;background:var(--surface-3);color:var(--ink-2);font-size:var(--fs-xs);font-weight:650}
|
|
243
|
+
.msg-main{display:grid;gap:5px;min-width:0;flex:1}
|
|
244
|
+
.msg-head{display:flex;flex-wrap:wrap;align-items:center;gap:6px;font-size:var(--fs-xs)}
|
|
245
|
+
.msg-head strong{font-weight:600}
|
|
246
|
+
.msg-head time{margin-left:auto;color:var(--ink-4);font-size:var(--fs-2xs)}
|
|
247
|
+
.msg-bubble{padding:10px 12px;border-radius:4px var(--r-lg) var(--r-lg) var(--r-lg);background:var(--surface-2);border:1px solid var(--line);min-width:0;overflow-wrap:anywhere}
|
|
248
|
+
.msg.from-user{flex-direction:row-reverse}
|
|
249
|
+
.msg.from-user .msg-head{flex-direction:row-reverse}
|
|
250
|
+
.msg.from-user .msg-head time{margin-left:0;margin-right:auto}
|
|
251
|
+
.msg.from-user .msg-avatar{background:var(--accent);color:var(--accent-ink)}
|
|
252
|
+
.msg.from-user .msg-bubble{border-radius:var(--r-lg) 4px var(--r-lg) var(--r-lg);background:var(--accent-soft);border-color:var(--accent-line)}
|
|
253
|
+
.msg.from-system .msg-bubble{background:transparent;border-style:dashed}
|
|
254
|
+
.composer-wrap{flex:none;padding:10px 12px 12px;border-top:1px solid var(--line);background:var(--surface)}
|
|
255
|
+
.composer{display:grid;gap:6px}
|
|
256
|
+
.composer-box{border:1px solid var(--line-2);border-radius:var(--r-lg);background:var(--sunken);transition:border-color var(--t-fast),box-shadow var(--t-fast)}
|
|
257
|
+
.composer-box:focus-within{border-color:var(--accent-line);box-shadow:0 0 0 3px var(--accent-soft)}
|
|
258
|
+
.composer-input{display:block;min-height:64px;max-height:240px;padding:10px 12px 4px;border:0;background:transparent;resize:none}
|
|
259
|
+
.composer-input:focus,.composer-input:hover{border:0;box-shadow:none;background:transparent}
|
|
260
|
+
.composer-bar{display:flex;align-items:center;gap:8px;padding:6px 6px 6px 8px}
|
|
261
|
+
.composer-send{height:30px}
|
|
262
|
+
.facets:empty{display:none}
|
|
263
|
+
.facets{display:grid;gap:6px;padding:8px 10px;border-radius:var(--r-sm);background:var(--surface-2)}
|
|
264
|
+
.next-step{display:flex;gap:6px;align-items:flex-start;font-size:var(--fs-xs);color:var(--ink-2)}
|
|
265
|
+
.next-step .icon{margin-top:2px;color:var(--accent)}
|
|
266
|
+
|
|
267
|
+
/* Live session (always dark: it renders a native terminal) */
|
|
268
|
+
.dock-session{color:#e6e6e8}
|
|
269
|
+
.target-chip{display:inline-flex;align-items:center;gap:6px;flex:none;height:26px;padding:0 10px;border:1px solid rgba(255,255,255,.12);border-radius:var(--r-pill);background:transparent;color:rgba(255,255,255,.72);font-size:var(--fs-xs);font-weight:500}
|
|
270
|
+
.target-chip:hover{color:#fff;border-color:rgba(255,255,255,.3)}
|
|
271
|
+
.target-chip[aria-pressed="true"]{background:rgba(255,255,255,.12);border-color:rgba(255,255,255,.3);color:#fff}
|
|
272
|
+
.target-chip .dot{width:7px;height:7px;box-shadow:none}
|
|
273
|
+
.dock-session .faint{color:rgba(255,255,255,.4)}
|
|
274
|
+
.conn{display:inline-flex;align-items:center;gap:6px;flex:none;color:rgba(255,255,255,.6);font-size:var(--fs-xs);font-weight:500}
|
|
275
|
+
.conn i{width:7px;height:7px;border-radius:50%;background:rgba(255,255,255,.3)}
|
|
276
|
+
.conn[data-state="connecting"] i{background:var(--warn);animation:blink 1s infinite}
|
|
277
|
+
.conn[data-state="writable"] i{background:#4fd18b;box-shadow:0 0 0 3px rgba(79,209,139,.2)}
|
|
278
|
+
.conn[data-state="readonly"] i{background:#6cb6ff}
|
|
279
|
+
.conn[data-state="error"] i{background:#ff6b7a}
|
|
280
|
+
.conn[data-state="error"]{color:#ff9aa5}
|
|
281
|
+
.terminal-empty{color:rgba(255,255,255,.55)}
|
|
282
|
+
.terminal-empty .icon{color:rgba(255,255,255,.35)}
|
|
283
|
+
.terminal-empty-title{color:#fff;font-weight:600}
|
|
284
|
+
.terminal-empty-text{max-width:300px;font-size:var(--fs-xs);line-height:1.5}
|
|
285
|
+
.session-foot{color:rgba(255,255,255,.45);font-size:var(--fs-2xs)}
|
|
286
|
+
.session-foot code{color:rgba(255,255,255,.8);user-select:all}
|
|
287
|
+
.terminal-host .xterm{height:100%}
|
|
288
|
+
.terminal-host .xterm-viewport{background:transparent!important}
|
|
289
|
+
`;
|
package/dist/web/webServer.js
CHANGED
|
@@ -219,7 +219,8 @@ async function handleHttpRequest(request, response, store, dependencies, token,
|
|
|
219
219
|
else if (method === "GET" && action === "inspect") {
|
|
220
220
|
value = dependencies.surface.inspect(taskId, {
|
|
221
221
|
store: query.get("store") ?? "", refId: query.get("ref") ?? "",
|
|
222
|
-
...(query.has("digest") ? { digest: query.get("digest") } : {})
|
|
222
|
+
...(query.has("digest") ? { digest: query.get("digest") } : {}),
|
|
223
|
+
...(query.has("cursor") ? { cursor: query.get("cursor") } : {})
|
|
223
224
|
});
|
|
224
225
|
}
|
|
225
226
|
else if (method === "POST" && action === "messages") {
|
|
@@ -24,6 +24,7 @@ not a claim that every real Provider scenario has been validated.
|
|
|
24
24
|
| Who consumes results, synthesis and review? | [Result consumption](../agent-result-consumption.md) |
|
|
25
25
|
| When is a WorkItem dependency satisfied? | [Task dependencies](../task-dag-semantics.md) |
|
|
26
26
|
| How are records referenced inside a Task? | [Task-local identity](../task-local-identity.md) |
|
|
27
|
+
| How do bounded discovery, full originals and mutation receipts work? | [CLI information contract](../cli-information-contract.md) |
|
|
27
28
|
| How do Roles, Profiles and run configuration take effect? | [Roles and configuration](../roles-and-configuration.md) |
|
|
28
29
|
| How do delivery, integration and archive work? | [Task delivery](../task-delivery.md) |
|
|
29
30
|
| What does Project refresh synchronize, and how are partial failures reported? | [Project refresh](../project-refresh.md) |
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
| 谁消费结果、综合与审查? | [结果消费](../agent-result-consumption.zh-CN.md) |
|
|
21
21
|
| WorkItem 依赖何时满足? | [Task 依赖](../task-dag-semantics.zh-CN.md) |
|
|
22
22
|
| Task 内记录如何引用? | [局部身份](../task-local-identity.zh-CN.md) |
|
|
23
|
+
| 有界发现、完整原文与变更回执如何配合? | [CLI 信息契约](../cli-information-contract.zh-CN.md) |
|
|
23
24
|
| Role、Profile 与运行配置如何生效? | [角色与配置](../roles-and-configuration.zh-CN.md) |
|
|
24
25
|
| 怎样交付、集成和归档? | [交付生命周期](../task-delivery.zh-CN.md) |
|
|
25
26
|
| Project refresh 同步什么,怎样报告部分失败? | [Project refresh](../project-refresh.zh-CN.md) |
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# CLI information contracts
|
|
2
|
+
|
|
3
|
+
Yui separates a command's effect from discovery and full evidence. Queries
|
|
4
|
+
never consume Messages or start subsequent work. Mutation receipts describe
|
|
5
|
+
saved/requested/accepted/unknown facts; `ok: true` means the CLI invocation
|
|
6
|
+
succeeded, not that a Task, native Turn or remote delivery completed.
|
|
7
|
+
|
|
8
|
+
This is the current wire contract, not a compatibility mode. Stored Tasks,
|
|
9
|
+
Messages, results, Snapshots and Session histories are unchanged. No persistent
|
|
10
|
+
schema migration or new snapshot/cache store is introduced.
|
|
11
|
+
|
|
12
|
+
## Daily read path
|
|
13
|
+
|
|
14
|
+
| Question | Entry | Default information / further reading |
|
|
15
|
+
| --- | --- | --- |
|
|
16
|
+
| Which Task? | `task list` | Existing bounded catalog, filters, attention and cursor |
|
|
17
|
+
| What is current? | `task context <task>` | Current Task/Brief/Role/Project/workspace facts, active work and Runs, open inputs, active decisions, unresolved jobs, recent Message references; no event or terminal-Run dump |
|
|
18
|
+
| What records exist? | `task context list <task> --store <family>` | One authorized family, summaries and exact digest-bearing references |
|
|
19
|
+
| What does it actually say? | `task context inspect <task> --store <family> --ref <id> --digest <digest>` | Exact current record, including original result expansion; long documents are paged |
|
|
20
|
+
| What changed? | `task context delta <task> --after <cursor>` | Immutable events with a fixed upper bound, not a snapshot of current mutable state |
|
|
21
|
+
| Which Global input? | `session context <role>` | Identity, profile, authority, current native Turn/retry and separate bounded pending/recent Message pages |
|
|
22
|
+
| Read Global input | `role message list <role> [--pending]`, `role message show <role> <id>` | Scoped discovery, then exact original; queue acceptance never erases history |
|
|
23
|
+
| What arrived in this wake? | `task wake show <task> <wake>` | Fixed window and Message/Run/Event read pointers, not duplicated bodies |
|
|
24
|
+
| What was assigned? | `task run context <task>/<run>` | Frozen authority and a single `pointers` inventory with summaries; changed identities in `deltaRefs`; current observations remain separate |
|
|
25
|
+
| Which configuration is real? | `task role session inspect <task> <role>` | Task/Role identity, desired binding, frozen Session, current Provider binding, retry and explicit Host observation; no full Task/Role copies or Provider conversation history |
|
|
26
|
+
|
|
27
|
+
Domain lists for Task Messages, events, WorkItems, Runs, decisions, milestones,
|
|
28
|
+
publications and InputRequests use the same summary/reference paging contract.
|
|
29
|
+
Task Role-status and wake-history lists also page, with explicit detail commands.
|
|
30
|
+
Role discovery reports `recordedHealth` and `hostObservation: "not-requested"`,
|
|
31
|
+
not live Host health. Even a normal recorded status cannot rule out a failed Host
|
|
32
|
+
or unacknowledged terminal; follow the row's `task role status` read to inspect it.
|
|
33
|
+
Context lists additionally expose candidates, reviews, jobs, Project Knowledge,
|
|
34
|
+
workspaces and other authorized record families. `--status`, `--after` and
|
|
35
|
+
`--work-item` narrow Context discovery; every continuation must retain filters.
|
|
36
|
+
Run listing accepts a Task or `task/work` target.
|
|
37
|
+
|
|
38
|
+
Current Context's `attention.messages` counts all authorized Messages, not only
|
|
39
|
+
undelivered input. `collections` counts and `omitted` explicitly describe
|
|
40
|
+
incomplete discovery. Recent samples are not proof that no older pending or
|
|
41
|
+
relevant input exists. Read the relevant fixed wake and original Messages;
|
|
42
|
+
use family discovery when a broader requirement/history audit is needed.
|
|
43
|
+
|
|
44
|
+
## Budgets and continuations
|
|
45
|
+
|
|
46
|
+
- Discovery pages default to 20 items, accept 1–100, and reserve a 32 KiB
|
|
47
|
+
compact-JSON budget. Items contain summaries, never full Message/report bodies.
|
|
48
|
+
- Current Task Context has at most 64 records, with a 24 KiB record/attention
|
|
49
|
+
budget inside a 32 KiB response budget. Single inline values are at most
|
|
50
|
+
2 KiB; large values and Message/Run/WorkItem/Knowledge bodies use references.
|
|
51
|
+
Each collection contributes at most eight sampled records at entry.
|
|
52
|
+
- Global entry samples up to eight pending and eight recent Messages separately.
|
|
53
|
+
They have independent continuations, so a long historical list cannot crowd
|
|
54
|
+
pending input out of the entry view.
|
|
55
|
+
- Detail documents up to 16 KiB remain ordinary JSON. Larger documents return
|
|
56
|
+
`contentPage`: exact source, SHA-256 digest, JSON-character offset, total bytes
|
|
57
|
+
and characters, text, completeness and a next cursor. Chunks contain at most
|
|
58
|
+
4096 UTF-16 code units without splitting surrogate pairs, keeping escaped
|
|
59
|
+
wire output below 32 KiB. There is no 4 MiB cutoff that makes a legal original
|
|
60
|
+
permanently unreadable.
|
|
61
|
+
- Task metadata/next-action/remote-delivery, Brief, WorkItem, Message, Run,
|
|
62
|
+
decision/milestone/event, Role show/status/Session inspection, wake detail,
|
|
63
|
+
InputRequest, Run context and frozen expansion use bounded detail reads.
|
|
64
|
+
|
|
65
|
+
Use `--json` and read the top-level `data`. Run context and expansion use
|
|
66
|
+
`data.context`; Run Context delta uses `data.contextDelta`. For a long detail, repeat that same read with
|
|
67
|
+
`--cursor <contentPage.nextCursor>`. Concatenate `text` in offset order, checking
|
|
68
|
+
the same source and digest, and parse the combined JSON once. Do not parse
|
|
69
|
+
chunks individually or treat a first chunk as the complete report.
|
|
70
|
+
|
|
71
|
+
List responses carry `items`, `total`, `complete`, and `nextCursor`. Counts,
|
|
72
|
+
items and cursor validation occur inside the same authorized scope. Cursors
|
|
73
|
+
are opaque positions, not access tokens: every page reauthorizes. A changed
|
|
74
|
+
collection or document returns an explicit source-changed error; restart rather
|
|
75
|
+
than mix versions. No persisted pagination session is needed. Mutable collection
|
|
76
|
+
continuations intentionally do not promise uninterrupted traversal during
|
|
77
|
+
concurrent writes. For append-only event traversal use fixed-bound Context delta.
|
|
78
|
+
Discovery currently scans the selected authorized family to fingerprint it;
|
|
79
|
+
its output, not total storage-reading cost, is bounded.
|
|
80
|
+
|
|
81
|
+
## Effects and exceptions
|
|
82
|
+
|
|
83
|
+
Message send/queue/steer receipts preserve identity, digest, body byte count and
|
|
84
|
+
the original submission/delivery/control states without echoing the body.
|
|
85
|
+
Brief updates return a saved reference. No new wait, retry, acknowledgement or
|
|
86
|
+
approval phase is added. Repeating a read cursor must never repeat a mutation.
|
|
87
|
+
|
|
88
|
+
Whole-transaction operations (activation, completion, integration and input
|
|
89
|
+
control) remain atomic business operations even when their mechanics have
|
|
90
|
+
several steps. Their state-specific receipts and existing unknown-effect
|
|
91
|
+
diagnostics are retained; they are not flattened into a generic “executed” flag.
|
|
92
|
+
|
|
93
|
+
This change covers daily Agent context, collaboration discovery and original
|
|
94
|
+
evidence reads, not every diagnostic or export in the product. Existing
|
|
95
|
+
specialized log-tail/artifact limits, Task catalog pagination and bounded error
|
|
96
|
+
diagnostics retain their contracts. Configuration catalogs, Project/config
|
|
97
|
+
administration, resource inventories, archive diagnostics, release operations,
|
|
98
|
+
and specialized integration/changeset reads remain purpose-specific; this
|
|
99
|
+
document does not claim a universal 32 KiB cap for them. Full-detail Web
|
|
100
|
+
projections are separate consumers, not silently replaced with CLI summaries.
|
|
101
|
+
Use targeted Context discovery for large Project Knowledge and Task evidence.
|
|
102
|
+
|
|
103
|
+
For a typical notification, read current Context once, read the fixed wake once,
|
|
104
|
+
then read each relevant original once (or its complete document pages).
|
|
105
|
+
Do not reread an aggregate to obtain a detail it intentionally omits.
|
|
106
|
+
Full-original reading costs additional calls only when the original exceeds
|
|
107
|
+
the inline budget; it is never replaced by a summary.
|