@njeybe/nativ 2.2.0 → 2.3.1

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 (141) hide show
  1. package/CHANGELOG.md +24 -1
  2. package/README.md +15 -0
  3. package/dist/runner/agent-supervisor.d.ts +5 -3
  4. package/dist/runner/agent-supervisor.js +17 -12
  5. package/dist/server/studio-server.js +1 -130
  6. package/dist/server/studio-ui/document.d.ts +3 -0
  7. package/dist/server/studio-ui/document.js +22 -0
  8. package/dist/server/studio-ui/pages/benchmarks/index.d.ts +2 -0
  9. package/dist/server/studio-ui/pages/benchmarks/index.js +11 -0
  10. package/dist/server/studio-ui/pages/benchmarks/script.d.ts +1 -0
  11. package/dist/server/studio-ui/pages/benchmarks/script.js +104 -0
  12. package/dist/server/studio-ui/pages/benchmarks/styles.d.ts +1 -0
  13. package/dist/server/studio-ui/pages/benchmarks/styles.js +30 -0
  14. package/dist/server/studio-ui/pages/database/browser.d.ts +1 -0
  15. package/dist/server/studio-ui/pages/database/browser.js +326 -0
  16. package/dist/server/studio-ui/pages/database/connection.d.ts +1 -0
  17. package/dist/server/studio-ui/pages/database/connection.js +158 -0
  18. package/dist/server/studio-ui/pages/database/data-shell.d.ts +1 -0
  19. package/dist/server/studio-ui/pages/database/data-shell.js +165 -0
  20. package/dist/server/studio-ui/pages/database/drift.d.ts +1 -0
  21. package/dist/server/studio-ui/pages/database/drift.js +301 -0
  22. package/dist/server/studio-ui/pages/database/events.d.ts +1 -0
  23. package/dist/server/studio-ui/pages/database/events.js +231 -0
  24. package/dist/server/studio-ui/pages/database/explorer.d.ts +1 -0
  25. package/dist/server/studio-ui/pages/database/explorer.js +183 -0
  26. package/dist/server/studio-ui/pages/database/index.d.ts +2 -0
  27. package/dist/server/studio-ui/pages/database/index.js +28 -0
  28. package/dist/server/studio-ui/pages/database/markup.d.ts +1 -0
  29. package/dist/server/studio-ui/pages/database/markup.js +32 -0
  30. package/dist/server/studio-ui/pages/database/state.d.ts +2 -0
  31. package/dist/server/studio-ui/pages/database/state.js +57 -0
  32. package/dist/server/studio-ui/pages/database/styles.d.ts +1 -0
  33. package/dist/server/studio-ui/pages/database/styles.js +118 -0
  34. package/dist/server/studio-ui/pages/flow/index.d.ts +2 -0
  35. package/dist/server/studio-ui/pages/flow/index.js +11 -0
  36. package/dist/server/studio-ui/pages/flow/layout.d.ts +1 -0
  37. package/dist/server/studio-ui/pages/flow/layout.js +105 -0
  38. package/dist/server/studio-ui/pages/flow/plan-view.d.ts +1 -0
  39. package/dist/server/studio-ui/pages/flow/plan-view.js +67 -0
  40. package/dist/server/studio-ui/pages/flow/script.d.ts +1 -0
  41. package/dist/server/studio-ui/pages/flow/script.js +61 -0
  42. package/dist/server/studio-ui/pages/flow/styles.d.ts +1 -0
  43. package/dist/server/studio-ui/pages/flow/styles.js +59 -0
  44. package/dist/server/studio-ui/pages/flow/timeline-model.d.ts +1 -0
  45. package/dist/server/studio-ui/pages/flow/timeline-model.js +95 -0
  46. package/dist/server/studio-ui/pages/flow/timeline-view.d.ts +1 -0
  47. package/dist/server/studio-ui/pages/flow/timeline-view.js +92 -0
  48. package/dist/server/studio-ui/pages/home/index.d.ts +2 -0
  49. package/dist/server/studio-ui/pages/home/index.js +11 -0
  50. package/dist/server/studio-ui/pages/home/script.d.ts +1 -0
  51. package/dist/server/studio-ui/pages/home/script.js +160 -0
  52. package/dist/server/studio-ui/pages/home/styles.d.ts +1 -0
  53. package/dist/server/studio-ui/pages/home/styles.js +48 -0
  54. package/dist/server/studio-ui/pages/index.d.ts +2 -0
  55. package/dist/server/studio-ui/pages/index.js +17 -0
  56. package/dist/server/studio-ui/pages/tasks/index.d.ts +2 -0
  57. package/dist/server/studio-ui/pages/tasks/index.js +11 -0
  58. package/dist/server/studio-ui/pages/tasks/script.d.ts +1 -0
  59. package/dist/server/studio-ui/pages/tasks/script.js +96 -0
  60. package/dist/server/studio-ui/pages/tasks/styles.d.ts +1 -0
  61. package/dist/server/studio-ui/pages/tasks/styles.js +37 -0
  62. package/dist/server/studio-ui/pages/team/index.d.ts +2 -0
  63. package/dist/server/studio-ui/pages/team/index.js +11 -0
  64. package/dist/server/studio-ui/pages/team/script.d.ts +1 -0
  65. package/dist/server/studio-ui/pages/team/script.js +112 -0
  66. package/dist/server/studio-ui/pages/team/styles.d.ts +1 -0
  67. package/dist/server/studio-ui/pages/team/styles.js +22 -0
  68. package/dist/server/studio-ui/pages/types.d.ts +13 -0
  69. package/dist/server/studio-ui/pages/types.js +1 -0
  70. package/dist/server/studio-ui/pages/worktrees/index.d.ts +2 -0
  71. package/dist/server/studio-ui/pages/worktrees/index.js +11 -0
  72. package/dist/server/studio-ui/pages/worktrees/script.d.ts +1 -0
  73. package/dist/server/studio-ui/pages/worktrees/script.js +104 -0
  74. package/dist/server/studio-ui/pages/worktrees/styles.d.ts +1 -0
  75. package/dist/server/studio-ui/pages/worktrees/styles.js +15 -0
  76. package/dist/server/studio-ui/shell/actions.d.ts +1 -0
  77. package/dist/server/studio-ui/shell/actions.js +49 -0
  78. package/dist/server/studio-ui/shell/boot.d.ts +2 -0
  79. package/dist/server/studio-ui/shell/boot.js +13 -0
  80. package/dist/server/studio-ui/shell/console.d.ts +1 -0
  81. package/dist/server/studio-ui/shell/console.js +194 -0
  82. package/dist/server/studio-ui/shell/core.d.ts +1 -0
  83. package/dist/server/studio-ui/shell/core.js +50 -0
  84. package/dist/server/studio-ui/shell/detail-view.d.ts +1 -0
  85. package/dist/server/studio-ui/shell/detail-view.js +80 -0
  86. package/dist/server/studio-ui/shell/detail.d.ts +1 -0
  87. package/dist/server/studio-ui/shell/detail.js +83 -0
  88. package/dist/server/studio-ui/shell/dispatch.d.ts +1 -0
  89. package/dist/server/studio-ui/shell/dispatch.js +150 -0
  90. package/dist/server/studio-ui/shell/events-tools.d.ts +1 -0
  91. package/dist/server/studio-ui/shell/events-tools.js +94 -0
  92. package/dist/server/studio-ui/shell/format.d.ts +1 -0
  93. package/dist/server/studio-ui/shell/format.js +151 -0
  94. package/dist/server/studio-ui/shell/icons.d.ts +2 -0
  95. package/dist/server/studio-ui/shell/icons.js +20 -0
  96. package/dist/server/studio-ui/shell/markup-head.d.ts +1 -0
  97. package/dist/server/studio-ui/shell/markup-head.js +43 -0
  98. package/dist/server/studio-ui/shell/markup-panels.d.ts +2 -0
  99. package/dist/server/studio-ui/shell/markup-panels.js +7 -0
  100. package/dist/server/studio-ui/shell/markup-tools.d.ts +1 -0
  101. package/dist/server/studio-ui/shell/markup-tools.js +222 -0
  102. package/dist/server/studio-ui/shell/model.d.ts +1 -0
  103. package/dist/server/studio-ui/shell/model.js +192 -0
  104. package/dist/server/studio-ui/shell/paint.d.ts +1 -0
  105. package/dist/server/studio-ui/shell/paint.js +154 -0
  106. package/dist/server/studio-ui/shell/palette-view.d.ts +1 -0
  107. package/dist/server/studio-ui/shell/palette-view.js +60 -0
  108. package/dist/server/studio-ui/shell/palette.d.ts +1 -0
  109. package/dist/server/studio-ui/shell/palette.js +80 -0
  110. package/dist/server/studio-ui/shell/pipeline-state.d.ts +1 -0
  111. package/dist/server/studio-ui/shell/pipeline-state.js +152 -0
  112. package/dist/server/studio-ui/shell/proposals.d.ts +1 -0
  113. package/dist/server/studio-ui/shell/proposals.js +197 -0
  114. package/dist/server/studio-ui/shell/pure.d.ts +3 -0
  115. package/dist/server/studio-ui/shell/pure.js +9 -0
  116. package/dist/server/studio-ui/shell/router.d.ts +1 -0
  117. package/dist/server/studio-ui/shell/router.js +95 -0
  118. package/dist/server/studio-ui/shell/sidebar-view.d.ts +1 -0
  119. package/dist/server/studio-ui/shell/sidebar-view.js +38 -0
  120. package/dist/server/studio-ui/shell/sync.d.ts +1 -0
  121. package/dist/server/studio-ui/shell/sync.js +120 -0
  122. package/dist/server/studio-ui/shell/toasts-format.d.ts +1 -0
  123. package/dist/server/studio-ui/shell/toasts-format.js +89 -0
  124. package/dist/server/studio-ui/shell/triage.d.ts +1 -0
  125. package/dist/server/studio-ui/shell/triage.js +210 -0
  126. package/dist/server/studio-ui/styles/console.d.ts +1 -0
  127. package/dist/server/studio-ui/styles/console.js +83 -0
  128. package/dist/server/studio-ui/styles/dialogs.d.ts +1 -0
  129. package/dist/server/studio-ui/styles/dialogs.js +118 -0
  130. package/dist/server/studio-ui/styles/responsive.d.ts +1 -0
  131. package/dist/server/studio-ui/styles/responsive.js +28 -0
  132. package/dist/server/studio-ui/styles/shell.d.ts +1 -0
  133. package/dist/server/studio-ui/styles/shell.js +117 -0
  134. package/dist/server/studio-ui/styles/strategist.d.ts +1 -0
  135. package/dist/server/studio-ui/styles/strategist.js +77 -0
  136. package/dist/server/studio-ui/styles/tokens-base.d.ts +1 -0
  137. package/dist/server/studio-ui/styles/tokens-base.js +131 -0
  138. package/dist/server/studio-ui.d.ts +1 -10
  139. package/dist/server/studio-ui.js +63 -5314
  140. package/package.json +2 -2
  141. package/plugin/.claude-plugin/plugin.json +1 -1
@@ -0,0 +1,77 @@
1
+ // Tier 1 strategist chip, verdicts and decision card styles.
2
+ export const strategistCss = String.raw `/* Tier 1 AI Strategist (ui_specs.md §5): header chip, triage verdicts, decision card. */
3
+ .t1 { position: relative; }
4
+ .t1-chip { display: inline-flex; align-items: center; gap: 7px; min-height: 32px; padding: 0 10px; font: 500 12.5px/1 var(--font); color: var(--text); background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-control); cursor: pointer; white-space: nowrap; transition: background .15s, border-color .15s; }
5
+ .t1-chip:hover { background: var(--bg); border-color: var(--chip-border); }
6
+ .t1-chip:focus-visible, .t1-switch:focus-visible, .t1-opt:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
7
+ .t1-chip .t1-spark { color: var(--primary); }
8
+ .t1-chip[data-state="triaging"] { border-color: var(--active-line); }
9
+ .t1-chip[data-state="triaging"] .t1-spark { color: var(--active); animation: blink 1s ease-in-out infinite; }
10
+ .t1-chip[data-state="attention"] { border-color: var(--proposal-line); }
11
+ .t1-chip[data-state="attention"] .t1-spark { color: var(--proposal); }
12
+ .t1-chip-label { color: var(--muted); }
13
+ .t1-caret { color: var(--muted); transition: transform .15s; }
14
+ .t1-chip[aria-expanded="true"] .t1-caret { transform: rotate(180deg); }
15
+ .t1-menu { position: absolute; top: calc(100% + 6px); right: 0; z-index: 30; width: 300px; padding: 12px; font-size: 12.5px; background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-card); box-shadow: var(--shadow-float); }
16
+ .t1-menu:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
17
+ .t1-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 28px; color: var(--muted); }
18
+ .t1-row b, .t1-row code { color: var(--text); font-weight: 500; font-variant-numeric: tabular-nums; }
19
+ .t1-row code { font-family: var(--mono); font-size: 12px; }
20
+ .t1-switch { position: relative; width: 54px; height: 24px; padding: 0 8px; font: 600 10.5px/22px var(--mono); color: var(--muted); text-align: right; background: var(--chip); border: 1px solid var(--chip-border); border-radius: 12px; cursor: pointer; transition: background .15s, border-color .15s; }
21
+ .t1-switch::before { content: ""; position: absolute; top: 3px; left: 3px; width: 16px; height: 16px; border-radius: 50%; background: var(--surface); box-shadow: var(--shadow); transition: transform .15s; }
22
+ .t1-switch[aria-checked="true"] { color: #fff; text-align: left; background: var(--success); border-color: var(--success); }
23
+ .t1-switch[aria-checked="true"]::before { transform: translateX(30px); }
24
+ .t1-switch:disabled { opacity: .5; cursor: not-allowed; }
25
+ .t1-policy { display: flex; gap: 6px; margin: 8px 0; padding: 8px; line-height: 1.45; color: var(--muted); background: var(--bg); border: 1px solid var(--border); border-radius: var(--r-control); }
26
+ .t1-policy .icon { flex: none; margin-top: 1px; color: var(--success); }
27
+ .t1-stats { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 6px; margin: 0; }
28
+ .t1-stats div { min-width: 0; padding: 6px 8px; border: 1px solid var(--border); border-radius: var(--r-control); }
29
+ .t1-stats dt { font-size: 11px; color: var(--muted); }
30
+ .t1-stats dd { margin: 2px 0 0; font: 600 15px/1.2 var(--mono); font-variant-numeric: tabular-nums; color: var(--text); }
31
+ .t1-strip { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; margin: 0 0 10px; padding: 8px 10px; color: var(--term-muted); border: 1px solid var(--term-line); border-radius: var(--r-control); }
32
+ .t1-strip > span { display: inline-flex; align-items: center; gap: 6px; }
33
+ .t1-strip strong { color: var(--term-text); font-weight: 600; }
34
+ .t1-strip.is-triaging { border-color: color-mix(in srgb, var(--active) 60%, transparent); background: color-mix(in srgb, var(--active) 14%, transparent); }
35
+ .rc-btn.t1-run { color: #fff; background: var(--active); border-color: var(--active); }
36
+ .rc-btn.t1-run:hover:not(:disabled) { background: color-mix(in srgb, var(--active) 88%, #000); }
37
+ .t1-banner { display: flex; align-items: center; gap: 8px; margin: 0 0 10px; padding: 8px 10px; font-weight: 600; border-radius: var(--r-control); }
38
+ .t1-banner.is-resolved { color: #fff; background: var(--success); }
39
+ .t1-banner.is-safe { color: var(--ok); border: 1px solid color-mix(in srgb, var(--ok) 45%, transparent); }
40
+ .t1-card { margin: 0 0 12px; padding: 12px 12px 12px 16px; border: 1px solid var(--term-line); border-left: 4px solid var(--proposal); border-radius: var(--r-card); }
41
+ .t1-card-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 10px; }
42
+ .t1-badge { font: 600 11.5px/20px var(--font); padding: 0 8px; color: var(--proposal); background: var(--proposal-bg); border-radius: var(--r-control); }
43
+ .t1-meta { margin-left: auto; font: 500 11px/18px var(--mono); color: var(--term-muted); }
44
+ .t1-parts { list-style: none; margin: 0; padding: 0; display: grid; gap: 10px; counter-reset: t1; }
45
+ .t1-parts > li { counter-increment: t1; }
46
+ .t1-parts h4 { margin: 0 0 3px; font-size: 12.5px; font-weight: 600; color: var(--term-text); }
47
+ .t1-parts h4::before { content: counter(t1) ". "; color: var(--proposal); }
48
+ .t1-parts p { margin: 0; color: var(--term-muted); overflow-wrap: anywhere; }
49
+ .t1-options { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 6px; }
50
+ .t1-opt { display: flex; flex-direction: column; align-items: flex-start; gap: 2px; flex: 1 1 200px; min-width: 0; padding: 8px 10px; font: inherit; text-align: left; color: var(--term-text); background: transparent; border: 1px solid var(--muted); border-radius: var(--r-control); cursor: pointer; transition: background .15s, border-color .15s, box-shadow .15s; }
51
+ .t1-opt b { font-weight: 600; }
52
+ .t1-opt span { font-size: 12px; color: var(--term-muted); }
53
+ .t1-opt:hover { border-color: var(--term-text); }
54
+ .t1-opt.is-recommended { background: var(--primary); border-color: var(--primary); }
55
+ .t1-opt.is-recommended:hover { background: var(--primary-hover); border-color: var(--primary-hover); }
56
+ .t1-opt.is-recommended span { color: color-mix(in srgb, #fff 82%, var(--primary)); }
57
+ .t1-opt[aria-checked="true"] { box-shadow: 0 0 0 2px var(--term-bg), 0 0 0 4px var(--proposal); }
58
+ .t1-custom { display: flex; flex-direction: column; gap: 4px; margin-top: 8px; font-size: 12px; color: var(--term-muted); }
59
+ .t1-custom textarea { width: 100%; box-sizing: border-box; min-height: 52px; padding: 6px 8px; font: 12.5px/1.45 var(--font); color: var(--term-text); background: rgb(148 163 184 / 0.08); border: 1px solid var(--term-line); border-radius: var(--r-control); resize: vertical; }
60
+ .t1-custom textarea:focus-visible { outline: 2px solid var(--primary); outline-offset: 1px; }
61
+ .t1-decided { margin: 8px 0 0; font-size: 12px; color: var(--term-muted); }
62
+ @media (prefers-reduced-motion: reduce) { .t1-chip[data-state="triaging"] .t1-spark { animation: none; } }
63
+ @media (max-width: 760px) {
64
+ .t1-chip-label, .t1-chip-model { display: none; }
65
+ .t1-menu { position: fixed; top: 56px; left: 16px; right: 16px; width: auto; }
66
+ }
67
+ .df-add { display: block; color: var(--ok); background: color-mix(in srgb, var(--ok) 12%, transparent); }
68
+ .df-del { display: block; color: color-mix(in srgb, var(--danger) 55%, #fff); background: color-mix(in srgb, var(--danger) 14%, transparent); }
69
+ .df-hunk { display: block; color: var(--accent); }
70
+ .df-file { display: block; margin-top: 8px; font-weight: 700; color: var(--term-text); }
71
+ .df-meta { display: block; color: var(--term-muted); }
72
+ @media (max-width: 760px) {
73
+ .rc-steps { order: 3; margin-left: 0; width: 100%; }
74
+ .rc-title { max-width: 100%; }
75
+ }
76
+
77
+ `;
@@ -0,0 +1 @@
1
+ export declare const tokensBaseCss: string;
@@ -0,0 +1,131 @@
1
+ // Design tokens (light, dark, old-name aliases), base rules and shared legacy components.
2
+ const DARK = `--bg: #0e0e13; --surface: #16161d; --surface-2: #1d1d26; --line: #2a2a36; --line-2: #383847;
3
+ --fg: #ececf2; --fg-2: #a4a4b7; --fg-3: #6e6e82;
4
+ --accent: #8e8aff; --accent-soft: #23224a; --accent-fg: #0e0e13;
5
+ --ok: #4ade80; --ok-soft: #13281b; --run: #60a5fa; --run-soft: #142238;
6
+ --bad: #f87171; --bad-soft: #341617; --warn: #fbbf24; --warn-soft: #2f2410;
7
+ --ag-backend: #38bdf8; --ag-frontend: #a78bfa; --ag-qa: #fbbf24; --ag-flutter: #2dd4bf;
8
+ --ag-architect: #8e8aff; --ag-devops: #94a3b8; --ag-database: #34d399; --ag-security: #f87171;
9
+ --shadow: 0 1px 2px rgba(0,0,0,.3), 0 6px 20px rgba(0,0,0,.35); color-scheme: dark;`;
10
+ export const tokensBaseCss = String.raw `:root {
11
+ --bg: #f6f6f9;
12
+ --surface: #ffffff;
13
+ --surface-2: #f0f0f5;
14
+ --line: #e3e3ea; --line-2: #d2d2dc;
15
+ --fg: #16161f; --fg-2: #54546a; --fg-3: #8b8b9e;
16
+ --accent: #4f46e5; --accent-soft: #eeeefe; --accent-fg: #ffffff;
17
+ --ok: #15803d; --ok-soft: #e7f5ec;
18
+ --run: #2563eb; --run-soft: #e7eefd;
19
+ --bad: #dc2626; --bad-soft: #fdecec;
20
+ --warn: #b45309; --warn-soft: #fcf2e1;
21
+ --ag-backend: #0284c7; --ag-frontend: #7c3aed; --ag-qa: #d97706; --ag-flutter: #0d9488;
22
+ --ag-architect: #4f46e5; --ag-devops: #64748b; --ag-database: #059669; --ag-security: #dc2626;
23
+ --shadow: 0 1px 2px rgba(22,22,40,.05), 0 4px 16px rgba(22,22,40,.06);
24
+ --font: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
25
+ --mono: ui-monospace, "Cascadia Mono", "SFMono-Regular", Consolas, Menlo, monospace;
26
+ color-scheme: light;
27
+ /* Old names used by Worktrees, Benchmarks, Database and the kept tools follow the new tokens. */
28
+ --border: var(--line); --text: var(--fg); --muted: var(--fg-2);
29
+ --primary: var(--accent); --primary-hover: color-mix(in srgb, var(--accent) 86%, var(--fg));
30
+ --primary-active: color-mix(in srgb, var(--accent) 72%, var(--fg));
31
+ --primary-tint: var(--accent-soft); --primary-line: color-mix(in srgb, var(--accent) 35%, var(--surface));
32
+ --success: var(--ok); --success-bg: var(--ok-soft); --success-line: color-mix(in srgb, var(--ok) 35%, var(--surface));
33
+ --active: var(--run); --active-bg: var(--run-soft); --active-line: color-mix(in srgb, var(--run) 35%, var(--surface));
34
+ --danger: var(--bad); --danger-bg: var(--bad-soft); --danger-line: color-mix(in srgb, var(--bad) 35%, var(--surface));
35
+ --warn-bg: var(--warn-soft);
36
+ --proposal: var(--warn); --proposal-bg: var(--warn-soft); --proposal-line: color-mix(in srgb, var(--warn) 40%, var(--surface));
37
+ --chip: var(--surface-2); --chip-border: var(--line-2);
38
+ --term-bg: #0f172a; --term-text: #f8fafc; --term-muted: #94a3b8; --term-line: rgb(148 163 184 / 0.28);
39
+ --r-control: 7px; --r-card: 12px;
40
+ --shadow-float: 0 12px 32px -8px rgb(15 23 42 / 0.25), 0 2px 6px -2px rgb(15 23 42 / 0.1);
41
+ --sidebar-w: 224px;
42
+ }
43
+ @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) {
44
+ ${DARK}
45
+ } }
46
+ :root[data-theme="dark"] {
47
+ ${DARK}
48
+ }
49
+ * { box-sizing: border-box; }
50
+ [hidden] { display: none !important; }
51
+ html, body { margin: 0; background: var(--bg); color: var(--fg); font-family: var(--font); font-size: 14px; line-height: 1.45; -webkit-font-smoothing: antialiased; }
52
+ body { min-height: 100vh; }
53
+ button, input, select, textarea { font: inherit; color: inherit; }
54
+ :focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
55
+ .sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
56
+ code, .mono { font-family: var(--mono); font-size: 12px; }
57
+ .muted { color: var(--fg-2); }
58
+ .text-danger { color: var(--bad); }
59
+ .icon { flex: none; display: block; }
60
+ .card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-card); box-shadow: var(--shadow); }
61
+ .count { display: inline-block; min-width: 20px; padding: 0 6px; font-size: 11px; font-weight: 600; line-height: 18px; text-align: center; color: var(--text); background: var(--chip); border: 1px solid var(--border); border-radius: var(--r-control); font-variant-numeric: tabular-nums; }
62
+
63
+
64
+ /* Panels */
65
+ .panel { min-width: 0; }
66
+ .panel:focus-visible { outline-offset: 6px; border-radius: var(--r-card); }
67
+ .panel-head { display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between; gap: 12px 16px; margin: 4px 0 20px; }
68
+ .panel-title { min-width: 0; }
69
+ .panel-head h1 { margin: 0; font-size: 22px; font-weight: 650; letter-spacing: -0.015em; }
70
+ .panel-head .lead { margin: 4px 0 0; color: var(--muted); font-size: 15.5px; line-height: 1.6; max-width: 860px; }
71
+ .panel-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
72
+ .panel-actions select.input { max-width: 260px; }
73
+ .panel-actions input.input { width: 240px; max-width: 100%; }
74
+
75
+ /* Buttons */
76
+ .btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-height: 32px; padding: 0 12px; border: 1px solid var(--border); background: var(--surface); color: var(--text); border-radius: var(--r-control); box-shadow: var(--shadow); cursor: pointer; font-size: 13.5px; font-weight: 500; white-space: nowrap; transition: background .15s, border-color .15s, color .15s; }
77
+ .btn:hover { background: var(--bg); border-color: var(--chip-border); }
78
+ .btn.primary { background: var(--primary); border-color: var(--primary); color: var(--accent-fg); }
79
+ .btn.primary:hover { background: var(--primary-hover); border-color: var(--primary-hover); }
80
+ .btn.danger, .btn-danger { color: var(--danger); border-color: var(--danger-line); }
81
+ .btn.danger:hover, .btn-danger:hover { background: var(--danger-bg); border-color: var(--danger); }
82
+ .btn.danger-solid { background: var(--danger); border-color: var(--danger); color: #fff; }
83
+ .btn.danger-solid:hover { background: color-mix(in srgb, var(--danger) 88%, #000); }
84
+ .btn.small { min-height: 28px; padding: 0 10px; font-size: 12.5px; }
85
+ .btn:disabled { opacity: .5; cursor: not-allowed; }
86
+ .btn.is-busy .icon { animation: spin .9s linear infinite; }
87
+ .spinner { width: 12px; height: 12px; border-radius: 50%; border: 2px solid currentColor; border-right-color: transparent; animation: spin .7s linear infinite; flex: none; }
88
+ @keyframes spin { to { transform: rotate(360deg); } }
89
+
90
+ /* Badges */
91
+ .badge { display: inline-flex; align-items: center; gap: 4px; font-size: 11px; font-weight: 600; line-height: 1.5; padding: 0 7px; border-radius: var(--r-control); border: 1px solid transparent; white-space: nowrap; }
92
+ button.badge { font: inherit; font-size: 11px; font-weight: 600; cursor: pointer; }
93
+ .badge-success, .badge-online, .badge-added { color: var(--success); background: var(--success-bg); border-color: var(--success-line); }
94
+ .badge-active, .badge-altered, .badge-fk { color: var(--active); background: var(--active-bg); border-color: var(--active-line); }
95
+ .badge-danger, .badge-offline, .badge-dropped, .badge-prod { color: var(--danger); background: var(--danger-bg); border-color: var(--danger-line); }
96
+ .badge-neutral, .badge-agent { color: var(--text); background: var(--chip); border-color: var(--chip-border); }
97
+ .badge-agent { font-family: var(--mono); font-weight: 500; font-size: 11.5px; }
98
+ .badge-accent, .badge-pk, .badge-collection { color: var(--primary); background: var(--primary-tint); border-color: var(--primary-line); }
99
+ .badge-subcol { color: var(--active); background: var(--active-bg); border: 1px dashed var(--active); }
100
+ .badge-media { color: var(--primary); background: var(--surface); border-color: var(--primary-line); cursor: zoom-in; }
101
+ button.badge-media:hover { background: var(--primary-tint); }
102
+ .badge-source { font-family: var(--mono); font-weight: 500; color: var(--active); background: var(--active-bg); border-color: var(--active-line); }
103
+ .badge-synth { font-family: var(--mono); font-weight: 500; color: var(--primary); background: var(--primary-tint); border-color: var(--primary-line); }
104
+
105
+ /* Shared states */
106
+ .skeleton { height: 42px; border-radius: var(--r-control); margin-bottom: 8px; background: linear-gradient(90deg, var(--chip) 0%, var(--border) 50%, var(--chip) 100%); background-size: 200% 100%; animation: shimmer 1.3s infinite linear; }
107
+ .skeleton.short { width: 60%; }
108
+ .skeleton.tall { height: 150px; margin: 0; }
109
+ @keyframes shimmer { from { background-position: 200% 0; } to { background-position: -200% 0; } }
110
+ .state { padding: 40px 24px; text-align: center; display: flex; flex-direction: column; align-items: center; gap: 6px; }
111
+ .state h2 { margin: 6px 0 0; font-size: 17px; font-weight: 600; }
112
+ .state p { margin: 0; color: var(--muted); max-width: 620px; font-size: 15px; line-height: 1.55; }
113
+ .state .btn { margin-top: 10px; }
114
+ .state-icon { color: var(--primary); }
115
+ .state-error .state-icon { color: var(--danger); }
116
+ .notice { margin: 0 0 14px; padding: 10px 14px; font-size: 13.5px; background: var(--danger-bg); border: 1px solid var(--danger-line); border-radius: var(--r-control); }
117
+ .section { padding: 20px; margin-bottom: 16px; }
118
+ .section > h3 { margin: 0 0 12px; font-size: 15px; display: flex; align-items: center; gap: 8px; }
119
+ .section-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 8px; }
120
+ .section-head h2 { margin: 0; font-size: 16px; font-weight: 600; }
121
+ .progress { height: 6px; border-radius: var(--r-control); background: var(--chip); overflow: hidden; }
122
+ .progress > span { display: block; height: 100%; border-radius: inherit; background: var(--primary); transition: width .5s cubic-bezier(.2, .8, .2, 1); }
123
+ .progress.success > span { background: var(--success); }
124
+ .progress.danger > span { background: var(--danger); }
125
+ .dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; flex: none; background: var(--chip-border); }
126
+ .dot.on, .dot-completed { background: var(--success); }
127
+ .dot.off, .dot-blocked { background: var(--danger); }
128
+ .dot-in_progress { background: var(--active); }
129
+ .dot-pending { background: var(--chip-border); }
130
+
131
+ `;
@@ -1,15 +1,6 @@
1
- /**
2
- * Nativ Mission Control Studio — self-contained single-page dashboard.
3
- * Implements .ai/ui_specs.md: modern minimalist light tokens, five primary views (Overview & Status,
4
- * Live Tasks kanban, Agent Worktrees, Benchmarks, embedded Database Studio) and a real-time
5
- * EventSource client on /api/events. No external assets: served inline by studio-server.
6
- *
7
- * The page is a String.raw template so client-side regexes keep their backslashes.
8
- * Client script must not contain backticks or "${" sequences.
9
- */
10
1
  export interface StudioUiOptions {
11
2
  version?: string;
12
- /** Project name shown in the header; filled from the pipeline API when omitted. */
3
+ /** Project name shown in the sidebar; filled from the pipeline API when omitted. */
13
4
  projectName?: string;
14
5
  }
15
6
  export declare function renderStudioHtml(options?: StudioUiOptions): string;