zelari-code 2.46.2 → 2.49.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 (102) hide show
  1. package/README.md +3 -3
  2. package/dist/cli/automations/browser/cookieDisk.js +56 -0
  3. package/dist/cli/automations/browser/cookieDisk.js.map +1 -0
  4. package/dist/cli/automations/browser/pageAdapter.js +130 -0
  5. package/dist/cli/automations/browser/pageAdapter.js.map +1 -0
  6. package/dist/cli/automations/browser/selectors.js +178 -0
  7. package/dist/cli/automations/browser/selectors.js.map +1 -0
  8. package/dist/cli/automations/browser/session.js +243 -0
  9. package/dist/cli/automations/browser/session.js.map +1 -0
  10. package/dist/cli/budget/budgetRuntime.js +9 -13
  11. package/dist/cli/budget/budgetRuntime.js.map +1 -1
  12. package/dist/cli/budget/essentialBashConfig.js +118 -0
  13. package/dist/cli/budget/essentialBashConfig.js.map +1 -0
  14. package/dist/cli/components/ChatStream.js +7 -2
  15. package/dist/cli/components/ChatStream.js.map +1 -1
  16. package/dist/cli/components/InputBar.js +8 -2
  17. package/dist/cli/components/InputBar.js.map +1 -1
  18. package/dist/cli/components/SelectList.js +5 -4
  19. package/dist/cli/components/SelectList.js.map +1 -1
  20. package/dist/cli/components/Sidebar.js +8 -7
  21. package/dist/cli/components/Sidebar.js.map +1 -1
  22. package/dist/cli/components/SplashScreen.js +3 -2
  23. package/dist/cli/components/SplashScreen.js.map +1 -1
  24. package/dist/cli/components/StartupBanner.js +6 -3
  25. package/dist/cli/components/StartupBanner.js.map +1 -1
  26. package/dist/cli/components/StatusBar.js +17 -14
  27. package/dist/cli/components/StatusBar.js.map +1 -1
  28. package/dist/cli/components/ToolOutput.js +6 -5
  29. package/dist/cli/components/ToolOutput.js.map +1 -1
  30. package/dist/cli/components/tuiPalette.js +56 -0
  31. package/dist/cli/components/tuiPalette.js.map +1 -0
  32. package/dist/cli/headless/runOneTurn.js +36 -6
  33. package/dist/cli/headless/runOneTurn.js.map +1 -1
  34. package/dist/cli/hooks/useChatTurn.js +30 -7
  35. package/dist/cli/hooks/useChatTurn.js.map +1 -1
  36. package/dist/cli/keyStore.js +2 -0
  37. package/dist/cli/keyStore.js.map +1 -1
  38. package/dist/cli/kraken/candidateRegistry.js +13 -0
  39. package/dist/cli/kraken/candidateRegistry.js.map +1 -1
  40. package/dist/cli/kraken/executor.js +200 -22
  41. package/dist/cli/kraken/executor.js.map +1 -1
  42. package/dist/cli/kraken/narrativeFloor.js +23 -0
  43. package/dist/cli/kraken/narrativeFloor.js.map +1 -0
  44. package/dist/cli/kraken/planner.js +27 -0
  45. package/dist/cli/kraken/planner.js.map +1 -1
  46. package/dist/cli/kraken/strictWaiver.js +22 -0
  47. package/dist/cli/kraken/strictWaiver.js.map +1 -0
  48. package/dist/cli/kraken/unresolvedGate.js +32 -0
  49. package/dist/cli/kraken/unresolvedGate.js.map +1 -0
  50. package/dist/cli/kraken/verificationBridge.js +67 -8
  51. package/dist/cli/kraken/verificationBridge.js.map +1 -1
  52. package/dist/cli/kraken/verifyHonestVerdict.js +30 -0
  53. package/dist/cli/kraken/verifyHonestVerdict.js.map +1 -0
  54. package/dist/cli/kraken/worktreeMergeRollback.js +277 -0
  55. package/dist/cli/kraken/worktreeMergeRollback.js.map +1 -0
  56. package/dist/cli/kraken/worktreeScheduling.js +11 -0
  57. package/dist/cli/kraken/worktreeScheduling.js.map +1 -1
  58. package/dist/cli/main.bundled.js +3375 -1511
  59. package/dist/cli/main.bundled.js.map +4 -4
  60. package/dist/cli/main.js +1 -1
  61. package/dist/cli/main.js.map +1 -1
  62. package/dist/cli/modelDiscovery.js +5 -1
  63. package/dist/cli/modelDiscovery.js.map +1 -1
  64. package/dist/cli/museOAuth.js +384 -0
  65. package/dist/cli/museOAuth.js.map +1 -0
  66. package/dist/cli/oauthDesktop.js +18 -1
  67. package/dist/cli/oauthDesktop.js.map +1 -1
  68. package/dist/cli/provider/openai-compatible.js +1 -0
  69. package/dist/cli/provider/openai-compatible.js.map +1 -1
  70. package/dist/cli/provider/resolveStream.js +2 -0
  71. package/dist/cli/provider/resolveStream.js.map +1 -1
  72. package/dist/cli/providerConfig.js +2 -0
  73. package/dist/cli/providerConfig.js.map +1 -1
  74. package/dist/cli/refreshRegistry.js +6 -0
  75. package/dist/cli/refreshRegistry.js.map +1 -1
  76. package/dist/cli/runHeadless.js +184 -100
  77. package/dist/cli/runHeadless.js.map +1 -1
  78. package/dist/cli/slashCommands.js +6 -6
  79. package/dist/cli/slashCommands.js.map +1 -1
  80. package/dist/cli/slashHandlers/krakenGraph.js +25 -7
  81. package/dist/cli/slashHandlers/krakenGraph.js.map +1 -1
  82. package/dist/cli/slashHandlers/provider.js +14 -4
  83. package/dist/cli/slashHandlers/provider.js.map +1 -1
  84. package/dist/cli/thinking.js +1 -0
  85. package/dist/cli/thinking.js.map +1 -1
  86. package/dist/cli/thinkingCapability.js +2 -0
  87. package/dist/cli/thinkingCapability.js.map +1 -1
  88. package/dist/cli/toolRegistry.js +22 -3
  89. package/dist/cli/toolRegistry.js.map +1 -1
  90. package/dist/cli/tools/bashWriteWatch.js +195 -0
  91. package/dist/cli/tools/bashWriteWatch.js.map +1 -0
  92. package/dist/cli/tools/krakenModel.js +50 -0
  93. package/dist/cli/tools/krakenModel.js.map +1 -1
  94. package/dist/cli/tools/krakenRadio.js +50 -5
  95. package/dist/cli/tools/krakenRadio.js.map +1 -1
  96. package/dist/cli/tools/krakenWorktree.js +35 -6
  97. package/dist/cli/tools/krakenWorktree.js.map +1 -1
  98. package/dist/cli/tools/taskTool.js +328 -34
  99. package/dist/cli/tools/taskTool.js.map +1 -1
  100. package/dist/cli/tools/verifyDebtSpine.js +117 -0
  101. package/dist/cli/tools/verifyDebtSpine.js.map +1 -0
  102. package/package.json +2 -2
@@ -0,0 +1,243 @@
1
+ /**
2
+ * automations/browser/session.ts — persistent-profile browser sessions (F3.1).
3
+ *
4
+ * Manual HUMAN login; cookies live under
5
+ * <os.homedir()>/.zelari-code/browser-profiles/<channel>/
6
+ * - openLoginSession: headed window → user logs in → close/timeout → headless confirm.
7
+ * - checkLogin: headless → is this profile currently logged in?
8
+ *
9
+ * Playwright is loaded lazily via the existing browser_check loader, so it stays
10
+ * an OPTIONAL dependency (no static import, no new dep). All access goes through
11
+ * the minimal seams in ./pageAdapter.ts, so the orchestration is unit-testable
12
+ * with a fake browser (tests never launch Chromium). The page/context seams are
13
+ * re-exported here for back-compat with existing importers.
14
+ */
15
+ import { mkdir } from 'node:fs/promises';
16
+ import { homedir } from 'node:os';
17
+ import path from 'node:path';
18
+ import { loadPlaywright } from '../../browser/driver.js';
19
+ import { probeSessionCookiesOnDisk } from './cookieDisk.js';
20
+ import { isSupportedChannel, loadSelectors, SUPPORTED_CHANNELS } from './selectors.js';
21
+ import { adaptContext, } from './pageAdapter.js';
22
+ export { SELECTOR_TIMEOUT_MS, } from './pageAdapter.js';
23
+ /** Navigation timeout for a login-state check (short on purpose). */
24
+ export const NAV_TIMEOUT_MS = 15_000;
25
+ /** Default window for the manual login before we give up (seconds). */
26
+ export const DEFAULT_LOGIN_TIMEOUT_SEC = 300;
27
+ /** Shown verbatim when Playwright is absent — same UX as the browser_check gate. */
28
+ export const PLAYWRIGHT_UNAVAILABLE_HINT = 'browser automation unavailable — Playwright is not installed in this workspace. ' +
29
+ 'Install it with: `zelari-code --plugins-install playwright --cwd .` ' +
30
+ '(or Desktop banner “Install”, or CLI `/plugins install playwright`, or ' +
31
+ '`npm i -D playwright && npx playwright install chromium`).';
32
+ /** `<os.homedir()>/.zelari-code/browser-profiles/<channel>/`. Throws if unknown. */
33
+ export function profileDir(channel) {
34
+ if (!isSupportedChannel(channel)) {
35
+ throw new Error(`unknown social channel: ${channel} (supported: ${SUPPORTED_CHANNELS.join(', ')})`);
36
+ }
37
+ return path.join(homedir(), '.zelari-code', 'browser-profiles', channel);
38
+ }
39
+ const nowIso = () => new Date().toISOString();
40
+ /** True when Playwright resolves in the given tree (never throws). */
41
+ export async function playwrightAvailable(cwd) {
42
+ try {
43
+ return (await loadPlaywright(cwd ?? process.cwd())) !== null;
44
+ }
45
+ catch {
46
+ return false;
47
+ }
48
+ }
49
+ /** Default opener: real Playwright persistent context on the channel profile. */
50
+ export const defaultContextOpener = async ({ channel, headless, cwd }) => {
51
+ const pw = (await loadPlaywright(cwd ?? process.cwd()));
52
+ if (!pw?.chromium || typeof pw.chromium.launchPersistentContext !== 'function')
53
+ return null;
54
+ const dir = profileDir(channel);
55
+ await mkdir(dir, { recursive: true });
56
+ // A headed login launched from a background process (Desktop IPC, OS
57
+ // scheduler) can open BEHIND the active window — Windows foreground lock.
58
+ // An explicit on-screen position/size makes the window impossible to miss.
59
+ const launchOpts = headless
60
+ ? { headless }
61
+ : { headless, args: ['--window-position=100,80', '--window-size=1180,880'] };
62
+ return adaptContext(await pw.chromium.launchPersistentContext(dir, launchOpts));
63
+ };
64
+ /** First entry of `entries` whose selector is present on `page` (or undefined). */
65
+ async function firstMatch(page, entries) {
66
+ for (const e of entries) {
67
+ if (await page.hasSelector(e.selector))
68
+ return e.label;
69
+ }
70
+ return undefined;
71
+ }
72
+ /**
73
+ * Headless login-state check against the on-disk profile. Returns a
74
+ * HealthReport; a technical failure (Playwright missing, launch/navigation
75
+ * error) THROWS — so "not logged in" is never confused with "could not check".
76
+ */
77
+ export async function checkLogin(channel, deps = {}) {
78
+ if (!isSupportedChannel(channel)) {
79
+ throw new Error(`unknown social channel: ${channel} (supported: ${SUPPORTED_CHANNELS.join(', ')})`);
80
+ }
81
+ const sel = await loadSelectors(channel);
82
+ const wanted = sel.sessionCookies ?? [];
83
+ // Skip the default disk probe when a test injects `opener` (otherwise we'd
84
+ // read the real user profile). An explicit `diskProbe` always runs first.
85
+ const probe = deps.diskProbe ?? (deps.opener ? undefined : probeSessionCookiesOnDisk);
86
+ if (probe && wanted.length > 0) {
87
+ const disk = await probe(profileDir(channel), wanted);
88
+ if (disk === 'present') {
89
+ return { channel, loggedIn: true, matched: `cookies:disk:${wanted.join('+')}`, checkedAt: nowIso() };
90
+ }
91
+ if (disk === 'locked') {
92
+ // Chromium already has the profile — not logged-out. Don't fight it.
93
+ return { channel, loggedIn: true, matched: 'profile-in-use', checkedAt: nowIso() };
94
+ }
95
+ if (disk === 'missing') {
96
+ return { channel, loggedIn: false, matched: 'cookies:missing-on-disk', checkedAt: nowIso() };
97
+ }
98
+ }
99
+ const ctx = await (deps.opener ?? defaultContextOpener)({ channel, headless: true, cwd: deps.cwd });
100
+ if (!ctx)
101
+ throw new Error(PLAYWRIGHT_UNAVAILABLE_HINT);
102
+ try {
103
+ const page = ctx.pages()[0] ?? (await ctx.newPage());
104
+ await page.goto(sel.loginUrl, {
105
+ timeout: deps.navTimeoutMs ?? NAV_TIMEOUT_MS,
106
+ waitUntil: 'domcontentloaded',
107
+ });
108
+ // PRIMARY signal — session cookies (locale-proof, A/B-proof). A profile
109
+ // holding ALL the channel's auth cookies IS logged in, whatever the
110
+ // (translated, shuffled) DOM renders. DOM chains remain the fallback for
111
+ // channels without sessionCookies or contexts without cookie access.
112
+ const wanted = sel.sessionCookies ?? [];
113
+ if (wanted.length > 0 && typeof ctx.cookies === 'function') {
114
+ const names = new Set((await ctx.cookies()).map((c) => c.name));
115
+ if (wanted.every((n) => names.has(n))) {
116
+ return {
117
+ channel,
118
+ loggedIn: true,
119
+ matched: `cookies:${wanted.join('+')}`,
120
+ checkedAt: nowIso(),
121
+ };
122
+ }
123
+ const missing = wanted.filter((n) => !names.has(n));
124
+ return {
125
+ channel,
126
+ loggedIn: false,
127
+ matched: `cookies:missing ${missing.join('+')}`,
128
+ checkedAt: nowIso(),
129
+ };
130
+ }
131
+ const inHit = await firstMatch(page, sel.loggedIn);
132
+ if (inHit)
133
+ return { channel, loggedIn: true, matched: inHit, checkedAt: nowIso() };
134
+ const outHit = await firstMatch(page, sel.loggedOut);
135
+ return { channel, loggedIn: false, matched: outHit, checkedAt: nowIso() };
136
+ }
137
+ finally {
138
+ await ctx.close().catch(() => undefined);
139
+ }
140
+ }
141
+ /**
142
+ * Resolve as soon as the profile gains ALL wanted cookies (login detected —
143
+ * the caller then closes the window), the context closes, or `timeoutMs`
144
+ * elapses — whichever comes first.
145
+ */
146
+ function waitForLoginCloseOrTimeout(ctx, timeoutMs, loginDetected, pollMs = 2_500) {
147
+ return new Promise((resolve) => {
148
+ let settled = false;
149
+ let timer;
150
+ let poller;
151
+ const done = (r) => {
152
+ if (settled)
153
+ return;
154
+ settled = true;
155
+ if (timer)
156
+ clearTimeout(timer);
157
+ if (poller)
158
+ clearInterval(poller);
159
+ resolve(r);
160
+ };
161
+ timer = setTimeout(() => done('timeout'), timeoutMs);
162
+ ctx.onClose(() => done('closed'));
163
+ poller = setInterval(() => {
164
+ void loginDetected()
165
+ .then((hit) => {
166
+ if (hit)
167
+ done('login');
168
+ })
169
+ .catch(() => undefined);
170
+ }, pollMs);
171
+ });
172
+ }
173
+ /**
174
+ * Open a HEADED window on the persistent profile for a manual login, then
175
+ * confirm headlessly. Returns { ok:false } (never throws) when the window closed
176
+ * without a logged-in state — that is "unproven" (exit 4), not a technical error.
177
+ */
178
+ export async function openLoginSession(channel, opts = {}) {
179
+ if (!isSupportedChannel(channel)) {
180
+ throw new Error(`unknown social channel: ${channel} (supported: ${SUPPORTED_CHANNELS.join(', ')})`);
181
+ }
182
+ const sel = await loadSelectors(channel);
183
+ const log = opts.log ?? ((line) => process.stdout.write(`${line}\n`));
184
+ const opener = opts.opener ?? defaultContextOpener;
185
+ const timeoutSec = opts.timeoutSec && opts.timeoutSec > 0 ? opts.timeoutSec : DEFAULT_LOGIN_TIMEOUT_SEC;
186
+ const ctx = await opener({ channel, headless: false, cwd: opts.cwd });
187
+ if (!ctx)
188
+ throw new Error(PLAYWRIGHT_UNAVAILABLE_HINT);
189
+ try {
190
+ const page = ctx.pages()[0] ?? (await ctx.newPage());
191
+ log(`Opening ${sel.loginUrl} …`);
192
+ log(`Log in to ${channel} manually, then close the window — or wait up to ${timeoutSec}s. ` +
193
+ `The profile is saved under ${profileDir(channel)}. ` +
194
+ `If you do not see the window, look for Chromium in the taskbar.`);
195
+ try {
196
+ await page.goto(sel.loginUrl, {
197
+ timeout: opts.navTimeoutMs ?? NAV_TIMEOUT_MS,
198
+ waitUntil: 'domcontentloaded',
199
+ });
200
+ }
201
+ catch (err) {
202
+ log(`Could not navigate to ${sel.loginUrl} (${err instanceof Error ? err.message : String(err)}) — ` +
203
+ 'if the window stays blank, type the address in it manually.');
204
+ }
205
+ // Best-effort foreground: raise the login window above the app that spawned
206
+ // us (e.g. the Desktop Automations tab). Noop on pages without the method.
207
+ if (typeof page.bringToFront === 'function') {
208
+ await page.bringToFront().catch(() => undefined);
209
+ }
210
+ // Poll the profile cookies WHILE the window is open: the moment all the
211
+ // channel's auth cookies land, the login is detected and the window closes
212
+ // itself — no guessing about when the user is done.
213
+ const wanted = sel.sessionCookies ?? [];
214
+ const cookieCheck = async () => {
215
+ if (wanted.length === 0 || typeof ctx.cookies !== 'function')
216
+ return false;
217
+ const names = new Set((await ctx.cookies()).map((c) => c.name));
218
+ return wanted.every((n) => names.has(n));
219
+ };
220
+ const outcome = await waitForLoginCloseOrTimeout(ctx, timeoutSec * 1000, cookieCheck, opts.loginPollMs);
221
+ if (outcome === 'login') {
222
+ log('Login detected (session cookies present) — closing the window…');
223
+ }
224
+ else {
225
+ log(outcome === 'closed' ? 'Window closed — verifying login…' : 'Timed out — verifying login…');
226
+ }
227
+ }
228
+ finally {
229
+ await ctx.close().catch(() => undefined);
230
+ }
231
+ const health = await checkLogin(channel, { opener, cwd: opts.cwd, navTimeoutMs: opts.navTimeoutMs });
232
+ if (health.loggedIn)
233
+ return { ok: true, loginUrl: sel.loginUrl, loggedIn: true };
234
+ return {
235
+ ok: false,
236
+ loggedIn: false,
237
+ loginUrl: sel.loginUrl,
238
+ reason: `no logged-in state detected — the profile lacks ${sel.sessionCookies?.join('+') ?? 'a login'}` +
239
+ (health.matched ? ` (${health.matched})` : '') +
240
+ ` — re-run \`automation login ${channel}\` and complete the login in the window`,
241
+ };
242
+ }
243
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../../src/cli/automations/browser/session.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,7 @@
24
24
  */
25
25
  import { computeBudget, defaultResourcePolicy } from '@zelari/core';
26
26
  import { ResourceLedger, rebuildLedgerFromEvents } from './resourceLedger.js';
27
+ import { loadEssentialBashPatterns } from './essentialBashConfig.js';
27
28
  import { buildResourceSnapshot, shouldEmitSnapshot, withResourceSnapshotContext, } from './resourceSnapshot.js';
28
29
  /**
29
30
  * §11.3 verification-essential tools: test/typecheck/build/diff/read
@@ -46,17 +47,6 @@ const DEFAULT_ESSENTIAL_TOOLS = [
46
47
  const ADVISORY_NOTICE = 'Resource advisory: verification reserve reached. Prioritize test/typecheck/build/diff and targeted repair; avoid broad exploration or delegation.';
47
48
  const PROTECTED_DENIAL = 'Resource protected: remaining tool calls are reserved for verification and targeted repair. Run the required checks (test/typecheck/build), read the failure, apply a minimal fix, retest — or report BLOCKED with the evidence you have.';
48
49
  const HARD_LIMIT_DENIAL = 'Resource exhausted: this turn\'s execution budget (maxToolCalls) is spent. No further billable tool calls are allowed in this turn — summarize what was verified and report BLOCKED/resource-exhausted with the evidence already collected. A later user turn starts a fresh execution budget.';
49
- /** bash commands that count as verification-essential (plan §13). */
50
- const ESSENTIAL_BASH = [
51
- /\b(npm|pnpm|yarn|bun)\s+(run\s+)?(test|vitest|jest)\b/,
52
- /\b(npm|pnpm|yarn|bun)\s+run\s+[\w:-]*(typecheck|lint|build)\b/,
53
- /\bnpx\s+(vitest|tsc|typescript|eslint)\b/,
54
- /\b(npx\s+)?tsc\b/,
55
- /\bvitest\b/,
56
- /\bjest\b/,
57
- /\bnode\s+--run\b/,
58
- /\bgit\s+(diff|status|log|show)\b/,
59
- ];
60
50
  /** Phase selector — advisory by default (§11.4), protected via env (Phase 3). */
61
51
  export function resolveResourceEnforcement(env = process.env) {
62
52
  return env.ZELARI_RESOURCE_ENFORCEMENT === 'protected' ? 'protected' : 'advisory';
@@ -77,13 +67,19 @@ function bashCommand(args) {
77
67
  * Essential = test/typecheck/build/lint, git diff/status, targeted
78
68
  * read/grep/repair. NOT essential = arbitrary bash, repo-wide speculative
79
69
  * grep, dependency install, delegation.
70
+ *
71
+ * K2.5 (F21): the bash matchers are now the built-in set ∪ repo-configured
72
+ * extras (`.zelari/zelari.config.json` → `essentialBash`) ∪ declared
73
+ * package.json scripts (`<pm> run <script>`), so cargo/pytest/mvn repos can
74
+ * run their own verification commands in protected mode. `root` defaults to
75
+ * the process cwd (the CLI project root) — see loadEssentialBashPatterns.
80
76
  */
81
- export function isVerificationEssential(toolName, args, _stage = 'implement') {
77
+ export function isVerificationEssential(toolName, args, _stage = 'implement', root = process.cwd()) {
82
78
  if (toolName === 'bash') {
83
79
  const cmd = bashCommand(args);
84
80
  if (!cmd)
85
81
  return false;
86
- return ESSENTIAL_BASH.some((re) => re.test(cmd));
82
+ return loadEssentialBashPatterns(root).some((re) => re.test(cmd));
87
83
  }
88
84
  if (toolName === 'grep_content') {
89
85
  // Targeted grep: bounded by an explicit path/pattern scope is essential;
@@ -1 +1 @@
1
- {"version":3,"file":"budgetRuntime.js","sourceRoot":"","sources":["../../../src/cli/budget/budgetRuntime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"budgetRuntime.js","sourceRoot":"","sources":["../../../src/cli/budget/budgetRuntime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * essentialBashConfig — extensible verification-essential bash classifier
3
+ * (plan K2.5, hardening F21).
4
+ *
5
+ * `isVerificationEssential` (budgetRuntime.ts) originally recognised only a
6
+ * hardcoded npm/tsc/vitest/git set, so a protected-mode run on a
7
+ * cargo/pytest/mvn repo could not execute its own verification commands — a
8
+ * forced BLOCKED. This module loads EXTRA matchers and merges them with the
9
+ * built-in list:
10
+ *
11
+ * 1. built-ins (BUILTIN_ESSENTIAL_BASH, plan §13) — always present;
12
+ * 2. `<root>/.zelari/zelari.config.json` → top-level `essentialBash` (an
13
+ * array of RegExp SOURCE strings). This is the project settings file
14
+ * userSettings.ts documents (`SETTINGS_FILE_NAME`); the key is read
15
+ * directly here because it only feeds the budget classifier;
16
+ * 3. `<root>/package.json` `scripts` — any `<pm> run <script>` whose
17
+ * `<script>` is declared is essential (repo-native verification entry
18
+ * points, e.g. a `native-test` script that shells out to cargo/pytest).
19
+ *
20
+ * Fail-open by contract: a missing/unreadable/corrupt config contributes
21
+ * nothing; an invalid user RegExp is IGNORED (warned once) and never breaks
22
+ * the built-in list. Loading is lazy + cached per resolved root; tests reset
23
+ * the cache with resetEssentialBashCache().
24
+ */
25
+ import { readFileSync } from 'node:fs';
26
+ import path from 'node:path';
27
+ import { SETTINGS_FILE_NAME } from '../userSettings.js';
28
+ /** bash commands that count as verification-essential out of the box (plan §13). */
29
+ export const BUILTIN_ESSENTIAL_BASH = [
30
+ /\b(npm|pnpm|yarn|bun)\s+(run\s+)?(test|vitest|jest)\b/,
31
+ /\b(npm|pnpm|yarn|bun)\s+run\s+[\w:-]*(typecheck|lint|build)\b/,
32
+ /\bnpx\s+(vitest|tsc|typescript|eslint)\b/,
33
+ /\b(npx\s+)?tsc\b/,
34
+ /\bvitest\b/,
35
+ /\bjest\b/,
36
+ /\bnode\s+--run\b/,
37
+ /\bgit\s+(diff|status|log|show)\b/,
38
+ ];
39
+ const PACKAGE_MANAGERS = 'npm|pnpm|yarn|bun';
40
+ /** Per-resolved-root memo of the merged list (never keyed by relative path). */
41
+ const cache = new Map();
42
+ let warnedInvalidRegex = false;
43
+ /** Drop the memo (tests, or a config edit mid-process). */
44
+ export function resetEssentialBashCache() {
45
+ cache.clear();
46
+ warnedInvalidRegex = false;
47
+ }
48
+ /** Best-effort JSON object read; absent/unreadable/corrupt → null (fail-open). */
49
+ function readJsonObject(file) {
50
+ try {
51
+ const parsed = JSON.parse(readFileSync(file, 'utf8'));
52
+ return parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)
53
+ ? parsed
54
+ : null;
55
+ }
56
+ catch {
57
+ return null;
58
+ }
59
+ }
60
+ /** RegExp-source strings from `<root>/.zelari/zelari.config.json` (project scope). */
61
+ function settingsExtraSources(root) {
62
+ const settings = readJsonObject(path.join(root, '.zelari', SETTINGS_FILE_NAME));
63
+ const raw = settings?.['essentialBash'];
64
+ if (!Array.isArray(raw))
65
+ return [];
66
+ return raw.filter((v) => typeof v === 'string' && v.trim() !== '');
67
+ }
68
+ /** Compile user RegExp sources; an invalid one is ignored (warned once). */
69
+ function compileUserSources(sources) {
70
+ const out = [];
71
+ for (const source of sources) {
72
+ try {
73
+ out.push(new RegExp(source));
74
+ }
75
+ catch {
76
+ if (!warnedInvalidRegex) {
77
+ warnedInvalidRegex = true;
78
+ console.warn(`[essential-bash] ignoring invalid regex in ${SETTINGS_FILE_NAME}.essentialBash: ${JSON.stringify(source)}`);
79
+ }
80
+ }
81
+ }
82
+ return out;
83
+ }
84
+ function escapeRegExp(literal) {
85
+ return literal.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
86
+ }
87
+ /** `<pm> run <script>` matchers for every declared package.json script. */
88
+ function scriptPatterns(root) {
89
+ const pkg = readJsonObject(path.join(root, 'package.json'));
90
+ const scripts = pkg?.['scripts'];
91
+ if (scripts === null || typeof scripts !== 'object' || Array.isArray(scripts))
92
+ return [];
93
+ const out = [];
94
+ for (const [name, body] of Object.entries(scripts)) {
95
+ if (typeof body !== 'string' || body === '')
96
+ continue;
97
+ out.push(new RegExp(`\\b(${PACKAGE_MANAGERS})\\s+run\\s+${escapeRegExp(name)}\\b`));
98
+ }
99
+ return out;
100
+ }
101
+ /**
102
+ * Merged essential-bash matchers for `root`: built-ins ∪ settings extras ∪
103
+ * package.json scripts. Lazy + cached per resolved root. Never throws.
104
+ */
105
+ export function loadEssentialBashPatterns(root = process.cwd()) {
106
+ const key = path.resolve(root);
107
+ const cached = cache.get(key);
108
+ if (cached)
109
+ return cached;
110
+ const merged = [
111
+ ...BUILTIN_ESSENTIAL_BASH,
112
+ ...compileUserSources(settingsExtraSources(key)),
113
+ ...scriptPatterns(key),
114
+ ];
115
+ cache.set(key, merged);
116
+ return merged;
117
+ }
118
+ //# sourceMappingURL=essentialBashConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"essentialBashConfig.js","sourceRoot":"","sources":["../../../src/cli/budget/essentialBashConfig.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import { Box, Text } from 'ink';
3
3
  import { ToolOutput } from './ToolOutput.js';
4
+ import { TUI_PALETTE } from './tuiPalette.js';
4
5
  /**
5
6
  * renderMessage — pure per-message renderer shared by `<Static>` (finalized
6
7
  * items, printed once into native scrollback) and the live region (the
@@ -23,11 +24,15 @@ export function renderMessage(m, live = false) {
23
24
  return (React.createElement(ToolOutput, { key: m.id, toolName: m.toolName ?? 'tool', summary: m.content, body: m.toolResult ?? m.content, ok: m.toolOk, durationMs: m.toolDurationMs, live: live }));
24
25
  }
25
26
  return (React.createElement(Box, { key: m.id, flexDirection: "column", marginBottom: 1 },
26
- React.createElement(Text, { color: m.role === 'user' ? 'cyan' : m.role === 'assistant' ? 'green' : 'yellow', bold: true },
27
+ React.createElement(Text, { color: m.role === 'user'
28
+ ? TUI_PALETTE.brand
29
+ : m.role === 'assistant'
30
+ ? TUI_PALETTE.success
31
+ : TUI_PALETTE.warn, bold: true },
27
32
  m.role === 'user' ? '❯' : m.role === 'assistant' ? '◆' : 'ℹ',
28
33
  " ",
29
34
  m.role,
30
- m.role === 'assistant' && m.memberName ? (React.createElement(Text, { color: "magenta" },
35
+ m.role === 'assistant' && m.memberName ? (React.createElement(Text, { color: TUI_PALETTE.brandAlt },
31
36
  " \u00B7 ",
32
37
  m.memberName)) : null),
33
38
  React.createElement(Box, { marginLeft: 2 },
@@ -1 +1 @@
1
- {"version":3,"file":"ChatStream.js","sourceRoot":"","sources":["../../../src/cli/components/ChatStream.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAwC7C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,aAAa,CAAC,CAAc,EAAE,IAAI,GAAG,KAAK;IACxD,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CACL,oBAAC,UAAU,IACT,GAAG,EAAE,CAAC,CAAC,EAAE,EACT,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,MAAM,EAC9B,OAAO,EAAE,CAAC,CAAC,OAAO,EAClB,IAAI,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,OAAO,EAC/B,EAAE,EAAE,CAAC,CAAC,MAAM,EACZ,UAAU,EAAE,CAAC,CAAC,cAAc,EAC5B,IAAI,EAAE,IAAI,GACV,CACH,CAAC;IACJ,CAAC;IACD,OAAO,CACL,oBAAC,GAAG,IAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC;QACpD,oBAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI;YACxF,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;;YAAG,CAAC,CAAC,IAAI;YACrE,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CACxC,oBAAC,IAAI,IAAC,KAAK,EAAC,SAAS;;gBAAK,CAAC,CAAC,UAAU,CAAQ,CAC/C,CAAC,CAAC,CAAC,IAAI,CACH;QACP,oBAAC,GAAG,IAAC,UAAU,EAAE,CAAC;YAChB,oBAAC,IAAI,QAAE,CAAC,CAAC,OAAO,CAAQ,CACpB,CACF,CACP,CAAC;AACJ,CAAC;AAiBD,SAAS,cAAc,CAAC,EAAE,QAAQ,EAAmB;IACnD,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,IACjD,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACvB,oBAAC,IAAI,IAAC,QAAQ,qEAAsE,CACrF,CAAC,CAAC,CAAC,CACF,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CACtC,CACG,CACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAErD,8EAA8E;AAC9E,4EAA4E;AAC5E,0EAA0E;AAC1E,8EAA8E;AAC9E,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAAgC,EAChC,OAAe,EACf,MAAc;IAEd,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"ChatStream.js","sourceRoot":"","sources":["../../../src/cli/components/ChatStream.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAwC9C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,aAAa,CAAC,CAAc,EAAE,IAAI,GAAG,KAAK;IACxD,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CACL,oBAAC,UAAU,IACT,GAAG,EAAE,CAAC,CAAC,EAAE,EACT,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,MAAM,EAC9B,OAAO,EAAE,CAAC,CAAC,OAAO,EAClB,IAAI,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,OAAO,EAC/B,EAAE,EAAE,CAAC,CAAC,MAAM,EACZ,UAAU,EAAE,CAAC,CAAC,cAAc,EAC5B,IAAI,EAAE,IAAI,GACV,CACH,CAAC;IACJ,CAAC;IACD,OAAO,CACL,oBAAC,GAAG,IAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC;QACpD,oBAAC,IAAI,IACH,KAAK,EACH,CAAC,CAAC,IAAI,KAAK,MAAM;gBACf,CAAC,CAAC,WAAW,CAAC,KAAK;gBACnB,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW;oBACtB,CAAC,CAAC,WAAW,CAAC,OAAO;oBACrB,CAAC,CAAC,WAAW,CAAC,IAAI,EAExB,IAAI;YAEH,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;;YAAG,CAAC,CAAC,IAAI;YACrE,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CACxC,oBAAC,IAAI,IAAC,KAAK,EAAE,WAAW,CAAC,QAAQ;;gBAAM,CAAC,CAAC,UAAU,CAAQ,CAC5D,CAAC,CAAC,CAAC,IAAI,CACH;QACP,oBAAC,GAAG,IAAC,UAAU,EAAE,CAAC;YAChB,oBAAC,IAAI,QAAE,CAAC,CAAC,OAAO,CAAQ,CACpB,CACF,CACP,CAAC;AACJ,CAAC;AAiBD,SAAS,cAAc,CAAC,EAAE,QAAQ,EAAmB;IACnD,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,IACjD,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACvB,oBAAC,IAAI,IAAC,QAAQ,qEAAsE,CACrF,CAAC,CAAC,CAAC,CACF,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CACtC,CACG,CACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAErD,8EAA8E;AAC9E,4EAA4E;AAC5E,0EAA0E;AAC1E,8EAA8E;AAC9E,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAAgC,EAChC,OAAe,EACf,MAAc;IAEd,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;AACvB,CAAC"}
@@ -2,6 +2,7 @@ import React from 'react';
2
2
  import { Box, Text } from 'ink';
3
3
  import TextInput from 'ink-text-input';
4
4
  import { useInputDraft } from './inputDraft.js';
5
+ import { TUI_PALETTE } from './tuiPalette.js';
5
6
  /**
6
7
  * Input bar — the user prompt editor at the bottom of the TUI.
7
8
  *
@@ -19,8 +20,13 @@ function InputBarImpl({ draft, onSubmit, disabled }) {
19
20
  const onSubmitRef = React.useRef(onSubmit);
20
21
  onSubmitRef.current = onSubmit;
21
22
  const stableSubmit = React.useCallback((v) => onSubmitRef.current(v), []);
22
- return (React.createElement(Box, { borderStyle: "single", borderColor: "gray", paddingX: 1 },
23
- React.createElement(Text, { color: "cyan", bold: true }, "\u276F "),
23
+ return (
24
+ // TUI palette: while mounted, this bar is the surface App routes keys to
25
+ // (the picker swaps in <SelectList> otherwise), so "focus" is the only
26
+ // signal available here — `disabled`, i.e. a run in flight. No new prop and
27
+ // no new state is introduced to compute it.
28
+ React.createElement(Box, { borderStyle: "single", borderColor: disabled ? TUI_PALETTE.border : TUI_PALETTE.borderFocus, paddingX: 1 },
29
+ React.createElement(Text, { color: TUI_PALETTE.brand, bold: true }, "\u276F "),
24
30
  React.createElement(TextInput, { value: value, onChange: draft.set, onSubmit: stableSubmit, placeholder: disabled ? '...' : 'Prompt, /skills, or @path' })));
25
31
  }
26
32
  /** Explicit comparator — exported so the contract is pinned by a test. */
@@ -1 +1 @@
1
- {"version":3,"file":"InputBar.js","sourceRoot":"","sources":["../../../src/cli/components/InputBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,aAAa,EAAwB,MAAM,iBAAiB,CAAC;AActE;;;;;;;;;;;GAWG;AACH,SAAS,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAiB;IAChE,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAEnC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC3C,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;IAC/B,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAElF,OAAO,CACL,oBAAC,GAAG,IAAC,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAC,MAAM,EAAC,QAAQ,EAAE,CAAC;QACtD,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,IAAI,oBAAU;QACjC,oBAAC,SAAS,IACR,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,KAAK,CAAC,GAAG,EACnB,QAAQ,EAAE,YAAY,EACtB,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,2BAA2B,GAC3D,CACE,CACP,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,kBAAkB,CAAC,IAAmB,EAAE,IAAmB;IACzE,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC"}
1
+ {"version":3,"file":"InputBar.js","sourceRoot":"","sources":["../../../src/cli/components/InputBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,aAAa,EAAwB,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAc9C;;;;;;;;;;;GAWG;AACH,SAAS,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAiB;IAChE,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAEnC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC3C,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;IAC/B,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAElF,OAAO;IACL,yEAAyE;IACzE,uEAAuE;IACvE,4EAA4E;IAC5E,4CAA4C;IAC5C,oBAAC,GAAG,IACF,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,EACpE,QAAQ,EAAE,CAAC;QAEX,oBAAC,IAAI,IAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,IAAI,oBAAU;QAC9C,oBAAC,SAAS,IACR,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,KAAK,CAAC,GAAG,EACnB,QAAQ,EAAE,YAAY,EACtB,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,2BAA2B,GAC3D,CACE,CACP,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,kBAAkB,CAAC,IAAmB,EAAE,IAAmB;IACzE,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import React, { useState } from 'react';
2
2
  import { Box, Text, useInput, useStdin } from 'ink';
3
+ import { TUI_PALETTE } from './tuiPalette.js';
3
4
  /**
4
5
  * Pure windowing helper (exported for tests): index of the first visible
5
6
  * item so the cursor stays roughly centered while the list scrolls.
@@ -42,18 +43,18 @@ export function SelectList({ title, items, onSelect, onCancel, maxVisible = 8, }
42
43
  const start = windowStart(index, items.length, maxVisible);
43
44
  const visible = items.slice(start, start + maxVisible);
44
45
  const below = items.length - (start + visible.length);
45
- return (React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1 },
46
- React.createElement(Text, { bold: true, color: "cyan" }, title),
46
+ return (React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: TUI_PALETTE.borderFocus, paddingX: 1 },
47
+ React.createElement(Text, { bold: true, color: TUI_PALETTE.brand }, title),
47
48
  start > 0 && React.createElement(Text, { dimColor: true },
48
49
  " \u2191 ",
49
50
  start,
50
51
  " more"),
51
52
  visible.map((item, i) => {
52
53
  const selected = start + i === index;
53
- return (React.createElement(Text, { key: item.value, wrap: "truncate", color: selected ? 'cyan' : undefined },
54
+ return (React.createElement(Text, { key: item.value, wrap: "truncate", color: selected ? TUI_PALETTE.brand : undefined },
54
55
  selected ? '❯ ' : ' ',
55
56
  React.createElement(Text, { bold: selected }, item.label),
56
- item.current ? React.createElement(Text, { color: "green" }, " \u2713") : null,
57
+ item.current ? React.createElement(Text, { color: TUI_PALETTE.success }, " \u2713") : null,
57
58
  item.hint ? React.createElement(Text, { dimColor: true },
58
59
  " ",
59
60
  item.hint) : null));
@@ -1 +1 @@
1
- {"version":3,"file":"SelectList.js","sourceRoot":"","sources":["../../../src/cli/components/SelectList.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SelectList.js","sourceRoot":"","sources":["../../../src/cli/components/SelectList.tsx"],"names":[],"mappings":"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"}