@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.
Files changed (115) hide show
  1. package/ARCHITECTURE.md +2 -1
  2. package/ARCHITECTURE.zh-CN.md +2 -1
  3. package/README.md +2 -0
  4. package/dist/cli/commandCatalog.js +344 -324
  5. package/dist/cli/commandDiscovery.js +69 -0
  6. package/dist/cli/completion.js +22 -227
  7. package/dist/cli/dynamicCompletion.js +12 -6
  8. package/dist/cli/invocationAuthority.js +2 -2
  9. package/dist/cli/invocationRouter.js +18 -7
  10. package/dist/cli/managedDiagnostics.js +2 -1
  11. package/dist/cli/updatePorts.js +0 -5
  12. package/dist/cli.js +184 -130
  13. package/dist/commands/capabilityCommands.js +5 -5
  14. package/dist/commands/controllerCommands.js +2 -1
  15. package/dist/commands/globalRoleCommands.js +86 -44
  16. package/dist/commands/grantCommands.js +48 -8
  17. package/dist/commands/taskCommands.js +157 -196
  18. package/dist/commands/taskContextCommand.js +29 -6
  19. package/dist/commands/taskFactCommands.js +10 -69
  20. package/dist/commands/taskInputCommands.js +26 -35
  21. package/dist/commands/taskPublicationCommands.js +2 -35
  22. package/dist/commands/taskPublicationVerifyCommand.js +1 -2
  23. package/dist/commands/taskUpstreamCommands.js +2 -1
  24. package/dist/context/runContextPack.js +8 -29
  25. package/dist/context/sessionBootstrapManifest.js +5 -101
  26. package/dist/context/taskContext.js +104 -41
  27. package/dist/controller/clientRuntime.js +16 -8
  28. package/dist/controller/fileSchedulerStoreAdapter.js +24 -0
  29. package/dist/controller/runtime.js +6 -0
  30. package/dist/core/controllerClient.js +46 -21
  31. package/dist/core/protocol.js +12 -7
  32. package/dist/doctor/doctor.js +4 -3
  33. package/dist/errors/cliError.js +4 -4
  34. package/dist/errors/cliFailure.js +213 -0
  35. package/dist/executor/fileRoleLaunchPlanner.js +1 -4
  36. package/dist/grant/capabilityGrant.js +13 -0
  37. package/dist/grant/taskAuthorization.js +127 -0
  38. package/dist/kernel/accessAssessment.js +1 -0
  39. package/dist/kernel/builtinCapabilities.js +88 -9
  40. package/dist/kernel/capabilityRegistry.js +64 -19
  41. package/dist/kernel/kernelPorts.js +2 -2
  42. package/dist/nativeAgent/agent.js +173 -0
  43. package/dist/nativeAgent/contracts.js +1 -0
  44. package/dist/nativeAgent/demo.js +29 -0
  45. package/dist/nativeAgent/index.js +3 -0
  46. package/dist/nativeAgent/mockProvider.js +43 -0
  47. package/dist/nativeAgent/textTools.js +156 -0
  48. package/dist/nativeAgent/validation.js +95 -0
  49. package/dist/output/boundedRead.js +118 -0
  50. package/dist/plugins/pluginService.js +98 -8
  51. package/dist/release/releaseWorkflowEngine.js +8 -1
  52. package/dist/resources/projectResourceService.js +23 -1
  53. package/dist/runtime/managedCaller.js +2 -2
  54. package/dist/runtime/managedIdentity.js +6 -0
  55. package/dist/runtime/runtimeCoherence.js +10 -8
  56. package/dist/storage/sqliteSchema.js +10 -0
  57. package/dist/storage/storageVersions.js +1 -1
  58. package/dist/storage/taskStore.js +3 -0
  59. package/dist/surface/surfaceContributions.js +3 -0
  60. package/dist/task/leaderArchive.js +111 -0
  61. package/dist/task/leaderArchiveAuthority.js +24 -0
  62. package/dist/task/taskAuthority.js +5 -10
  63. package/dist/tmux/commandExecutor.js +7 -5
  64. package/dist/web/assets/assetManifest.js +38 -22
  65. package/dist/web/assets/client/api.js +115 -0
  66. package/dist/web/assets/client/app.js +555 -863
  67. package/dist/web/assets/client/components.js +323 -897
  68. package/dist/web/assets/client/detail.js +333 -0
  69. package/dist/web/assets/client/dock.js +225 -0
  70. package/dist/web/assets/client/dom.js +55 -3
  71. package/dist/web/assets/client/evidence.js +172 -0
  72. package/dist/web/assets/client/format.js +25 -14
  73. package/dist/web/assets/client/forms.js +230 -0
  74. package/dist/web/assets/client/i18n.js +1020 -791
  75. package/dist/web/assets/client/overview.js +115 -0
  76. package/dist/web/assets/client/records.js +63 -0
  77. package/dist/web/assets/client/sections.js +313 -0
  78. package/dist/web/assets/client/sidebar.js +117 -0
  79. package/dist/web/assets/client/theme.js +61 -22
  80. package/dist/web/assets/icons.js +39 -0
  81. package/dist/web/assets/shell.js +124 -118
  82. package/dist/web/assets/styles/base.js +41 -0
  83. package/dist/web/assets/styles/components.js +167 -0
  84. package/dist/web/assets/styles/layout.js +49 -77
  85. package/dist/web/assets/styles/markdown.js +16 -24
  86. package/dist/web/assets/styles/responsive.js +33 -44
  87. package/dist/web/assets/styles/tokens.js +65 -89
  88. package/dist/web/assets/styles/views.js +289 -0
  89. package/dist/web/webServer.js +2 -1
  90. package/docs/architecture/README.md +1 -0
  91. package/docs/architecture/README.zh-CN.md +1 -0
  92. package/docs/cli-information-contract.md +107 -0
  93. package/docs/cli-information-contract.zh-CN.md +81 -0
  94. package/docs/managed-turn-and-session-runtime.md +9 -0
  95. package/docs/managed-turn-and-session-runtime.zh-CN.md +6 -0
  96. package/docs/plugin-sdk.md +7 -3
  97. package/docs/plugin-sdk.zh-CN.md +5 -2
  98. package/docs/release-workflow.md +42 -9
  99. package/docs/release-workflow.zh-CN.md +30 -7
  100. package/docs/storage-baseline.md +5 -0
  101. package/docs/testing/verification-levels.md +2 -2
  102. package/i18n/README.zh-CN.md +2 -0
  103. package/package.json +1 -1
  104. package/skills/yui-leader/SKILL.md +8 -1
  105. package/skills/yui-leader/references/authorization.md +64 -0
  106. package/skills/yui-leader/references/execution.md +18 -4
  107. package/skills/yui-leader/references/task-plugins.md +4 -2
  108. package/skills/yui-operator/SKILL.md +9 -2
  109. package/skills/yui-runtime/SKILL.md +77 -9
  110. package/skills/yui-runtime/references/publication.md +3 -1
  111. package/dist/web/assets/client/taskSummary.js +0 -350
  112. package/dist/web/assets/client/taskSurface.js +0 -616
  113. package/dist/web/assets/client/view.js +0 -608
  114. package/dist/web/assets/styles/cards.js +0 -247
  115. package/dist/web/assets/styles/widgets.js +0 -168
@@ -1,101 +1,77 @@
1
1
  /*
2
- * DESIGN TOKEN CONTRACT
3
- * ---------------------
4
- * Layout is fully decoupled from themes. Geometry, type, metrics, and motion
5
- * live once in the theme-independent :root block below and are shared by every
6
- * theme. A [data-theme="..."] block defines ONLY color / surface / effect
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
- * To add a theme: copy a color block, rename the selector, retune the color
12
- * values, then register the name in client/theme.ts (THEMES) and add an
13
- * <option> in shell.ts. Do NOT put layout tokens in a theme block; if a future
14
- * theme genuinely needs to affect layout, revisit this contract deliberately.
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
- * Theme-independent (:root, shared by all themes)
17
- * Geometry --radius --radius-lg --radius-pill
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
- --radius:10px;--radius-lg:16px;--radius-pill:999px;
35
- --font-mono:"JetBrains Mono","SFMono-Regular",Consolas,monospace;
36
- --font-display:"Inter",system-ui,-apple-system,"Segoe UI",sans-serif;
37
- --font-body:"Inter",system-ui,-apple-system,"Segoe UI",sans-serif;
38
- --page-space:clamp(18px,2.6vw,40px);--sidebar-w:clamp(232px,18vw,288px);--terminal-w:clamp(420px,34vw,640px);--pane-w:clamp(300px,29vw,500px);
39
- --motion-fast:150ms;--motion-slow:320ms;--ease:cubic-bezier(.16,.84,.44,1);
40
- }
41
- :root,[data-theme="control-room"]{
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="atlas"]{
29
+ :root,[data-theme="sumi"]{
62
30
  color-scheme:dark;
63
- --bg:#051221;--bg-1:#081a2c;--bg-2:#0c2436;--bg-3:#122d44;
64
- --border:#153349;--border-strong:#2a4a63;
65
- --text:#e6f2fb;--muted:#8ba9c2;--faint:#567184;
66
- --accent:#38e1d4;--accent-2:#7cabf2;--on-accent:#04131d;
67
- --accent-soft:rgba(56,225,212,.1);--accent-line:rgba(56,225,212,.32);
68
- --active:#38e1d4;--active-soft:rgba(56,225,212,.12);
69
- --success:#49db9e;--success-soft:rgba(73,219,158,.12);
70
- --warning:#ffc86b;--warning-soft:rgba(255,200,107,.12);
71
- --danger:#ff7a8f;--danger-soft:rgba(255,122,143,.12);
72
- --glow:0 0 18px rgba(56,225,212,.4);
73
- --shadow-card:0 1px 2px rgba(0,0,0,.32),0 4px 12px rgba(0,0,0,.18);
74
- --shadow-pop:0 18px 48px rgba(0,0,0,.5);
75
- --ambient:
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="paper"]{
45
+ [data-theme="washi"]{
82
46
  color-scheme:light;
83
- --bg:#e9eef6;--bg-1:#f2f6fc;--bg-2:#ffffff;--bg-3:#f7fafe;
84
- --border:#d4deec;--border-strong:#b2c0d6;
85
- --text:#132030;--muted:#54637a;--faint:#8493a8;
86
- --accent:#2563eb;--accent-2:#7c3aed;--on-accent:#ffffff;
87
- --accent-soft:rgba(37,99,235,.08);--accent-line:rgba(37,99,235,.3);
88
- --active:#2563eb;--active-soft:rgba(37,99,235,.1);
89
- --success:#0f9d68;--success-soft:rgba(15,157,104,.1);
90
- --warning:#b26a00;--warning-soft:rgba(178,106,0,.1);
91
- --danger:#d33a52;--danger-soft:rgba(211,58,82,.1);
92
- --glow:0 0 16px rgba(37,99,235,.28);
93
- --shadow-card:0 1px 2px rgba(24,45,78,.05),0 4px 14px rgba(24,45,78,.07);
94
- --shadow-pop:0 18px 44px rgba(24,45,78,.18);
95
- --ambient:
96
- radial-gradient(1000px 560px at 8% -12%,rgba(37,99,235,.09),transparent 58%),
97
- radial-gradient(900px 520px at 104% -6%,rgba(124,58,237,.08),transparent 55%),
98
- linear-gradient(rgba(24,45,78,.03) 1px,transparent 1px) 0 0/100% 44px,
99
- linear-gradient(90deg,rgba(24,45,78,.03) 1px,transparent 1px) 0 0/44px 100%;
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
+ `;
@@ -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.