@molecule/app-ide-react 1.13.0 → 1.15.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 (36) hide show
  1. package/README.md +578 -1
  2. package/dist/command-metadata.d.ts.map +1 -1
  3. package/dist/command-metadata.js +7 -2
  4. package/dist/command-metadata.js.map +1 -1
  5. package/dist/components/ChatPanel.d.ts +9 -1
  6. package/dist/components/ChatPanel.d.ts.map +1 -1
  7. package/dist/components/ChatPanel.js +177 -18
  8. package/dist/components/ChatPanel.js.map +1 -1
  9. package/dist/components/TestsBar.d.ts +55 -0
  10. package/dist/components/TestsBar.d.ts.map +1 -0
  11. package/dist/components/TestsBar.js +296 -0
  12. package/dist/components/TestsBar.js.map +1 -0
  13. package/dist/components/TestsCard.d.ts +78 -0
  14. package/dist/components/TestsCard.d.ts.map +1 -0
  15. package/dist/components/TestsCard.js +247 -0
  16. package/dist/components/TestsCard.js.map +1 -0
  17. package/dist/components/index.d.ts +3 -0
  18. package/dist/components/index.d.ts.map +1 -1
  19. package/dist/components/index.js +2 -0
  20. package/dist/components/index.js.map +1 -1
  21. package/dist/components/tests-bar-utilities.d.ts +129 -0
  22. package/dist/components/tests-bar-utilities.d.ts.map +1 -0
  23. package/dist/components/tests-bar-utilities.js +236 -0
  24. package/dist/components/tests-bar-utilities.js.map +1 -0
  25. package/dist/components/tests-card-utilities.d.ts +175 -0
  26. package/dist/components/tests-card-utilities.d.ts.map +1 -0
  27. package/dist/components/tests-card-utilities.js +333 -0
  28. package/dist/components/tests-card-utilities.js.map +1 -0
  29. package/dist/index.d.ts +19 -0
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +19 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/types.d.ts +136 -0
  34. package/dist/types.d.ts.map +1 -1
  35. package/dist/types.js.map +1 -1
  36. package/package.json +2 -2
@@ -0,0 +1,247 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useRef, useState } from 'react';
3
+ import { t } from '@molecule/app-i18n';
4
+ import { getClassMap } from '@molecule/app-ui';
5
+ import { chatCardStyle } from './chat-card-style.js';
6
+ import { countByKind, failedTests, filterTests, groupTests, isRowRunning, summarizeResults, testRowLabel, } from './tests-card-utilities.js';
7
+ /**
8
+ * The card's button vocabulary, which is the command cards' vocabulary (see
9
+ * molecule DESIGN.md → Command cards). Every ACTION is a button that LOOKS
10
+ * like a button — a filled or bordered box, never text on transparent:
11
+ *
12
+ * - {@link PRIMARY_ACTION} — the one headline action (Run all).
13
+ * - {@link SECONDARY_ACTION} — every other action (Run e2e/unit/group, a
14
+ * row Run, Fix with Synthase). The SAME filled box as the headline action:
15
+ * `outline` at `xs` on the card surface is a 60%-alpha hairline that reads
16
+ * as plain text (the first restyle shipped that way and was rejected), and
17
+ * ScriptsCard renders every one of its Run buttons filled.
18
+ * - {@link DESTRUCTIVE_ACTION} — Stop, in the design system's error colour.
19
+ * - {@link QUIET_TOGGLE} — `ghost` is reserved for dismiss/disclosure
20
+ * controls (the Show/Hide output toggle), the only place the sibling cards
21
+ * use it. An action rendered ghost is the bug this vocabulary exists to
22
+ * prevent: it reads as a text link.
23
+ *
24
+ * @param cm - The active ClassMap.
25
+ * @returns The resolved class string.
26
+ */
27
+ const PRIMARY_ACTION = (cm) => cm.button({ variant: 'solid', color: 'primary', size: 'xs' });
28
+ /**
29
+ * A secondary action — the same filled `xs` button ScriptsCard uses for every
30
+ * action, so a row of Run buttons reads as a row of buttons.
31
+ *
32
+ * @param cm - The active ClassMap.
33
+ * @returns The resolved class string.
34
+ */
35
+ const SECONDARY_ACTION = (cm) => cm.button({ variant: 'solid', color: 'primary', size: 'xs' });
36
+ /**
37
+ * The destructive action (Stop), in the design system's error colour.
38
+ *
39
+ * @param cm - The active ClassMap.
40
+ * @returns The resolved class string.
41
+ */
42
+ const DESTRUCTIVE_ACTION = (cm) => cm.button({ variant: 'solid', color: 'error', size: 'xs' });
43
+ /**
44
+ * A disclosure toggle — the one place `ghost` belongs.
45
+ *
46
+ * @param cm - The active ClassMap.
47
+ * @returns The resolved class string.
48
+ */
49
+ const QUIET_TOGGLE = (cm) => cm.button({ variant: 'ghost', size: 'xs' });
50
+ /**
51
+ * Human label for a kind.
52
+ *
53
+ * @param kind - The kind.
54
+ * @returns The translated label.
55
+ */
56
+ function kindLabel(kind) {
57
+ return kind === 'e2e'
58
+ ? t('ide.tests.kind.e2e', undefined, { defaultValue: 'End-to-end' })
59
+ : t('ide.tests.kind.unit', undefined, { defaultValue: 'Unit' });
60
+ }
61
+ /**
62
+ * The heading for one group: its kind and the directory that owns it. The
63
+ * workspace ROOT has no name of its own, so it gets the generic word.
64
+ *
65
+ * @param group - The group.
66
+ * @returns The heading text.
67
+ */
68
+ function groupHeading(group) {
69
+ const where = group.label ?? t('ide.tests.workspace.root', undefined, { defaultValue: 'Project' });
70
+ return `${kindLabel(group.kind)} · ${where}`;
71
+ }
72
+ /**
73
+ * The short label a status pill shows.
74
+ *
75
+ * @param status - The status.
76
+ * @returns The translated label.
77
+ */
78
+ function statusLabel(status) {
79
+ if (status === 'passed')
80
+ return t('ide.tests.statusPassed', undefined, { defaultValue: 'Passed' });
81
+ if (status === 'failed')
82
+ return t('ide.tests.statusFailed', undefined, { defaultValue: 'Failed' });
83
+ return t('ide.tests.statusSkipped', undefined, { defaultValue: 'Skipped' });
84
+ }
85
+ /**
86
+ * The tests browser shown by `/test`.
87
+ *
88
+ * @param props - See {@link TestsCardProps}.
89
+ * @returns The rendered tests card.
90
+ */
91
+ export function TestsCard({ tests, status, run, initialQuery, canRun, onRun, onCancel, onFix, fixDisabledReason, isLight, embedded, }) {
92
+ const cm = getClassMap();
93
+ const [query, setQuery] = useState(initialQuery);
94
+ // The run output starts COLLAPSED. ScriptsCard auto-expands nothing while a
95
+ // script runs, so neither does this; the status pills carry the state and the
96
+ // output is one click away when someone wants it.
97
+ const [showOutput, setShowOutput] = useState(false);
98
+ const outputRef = useRef(null);
99
+ // Keep the live output pinned to the newest line unless the reader scrolled up
100
+ // inside the block themselves. No-ops while it is collapsed (no element).
101
+ useEffect(() => {
102
+ const el = outputRef.current;
103
+ if (!el)
104
+ return;
105
+ if (el.scrollHeight - el.scrollTop - el.clientHeight > 40)
106
+ return;
107
+ el.scrollTop = el.scrollHeight;
108
+ }, [run.output, showOutput]);
109
+ const filtered = useMemo(() => filterTests(tests, query), [tests, query]);
110
+ const groups = useMemo(() => groupTests(filtered), [filtered]);
111
+ const counts = useMemo(() => countByKind(filtered), [filtered]);
112
+ const summary = useMemo(() => summarizeResults(filtered, run.results), [filtered, run.results]);
113
+ const failures = useMemo(() => failedTests(filtered, run.results), [filtered, run.results]);
114
+ const rowBorder = isLight ? 'rgba(0,0,0,0.08)' : 'rgba(255,255,255,0.08)';
115
+ // The same neutral inset the sibling cards give their fields, so the search
116
+ // box READS as a field on the clean overlay surface.
117
+ const fieldBg = isLight ? 'rgba(0,0,0,0.05)' : 'rgba(255,255,255,0.06)';
118
+ const fieldStyle = {
119
+ width: '100%',
120
+ padding: '4px 6px',
121
+ borderRadius: 4,
122
+ border: `1px solid ${rowBorder}`,
123
+ background: fieldBg,
124
+ color: 'inherit',
125
+ outline: 'none',
126
+ };
127
+ const disabledReason = !canRun
128
+ ? t('ide.tests.viewerCannotRun', undefined, {
129
+ defaultValue: 'Only editors can run this project’s tests.',
130
+ })
131
+ : status === 'unavailable'
132
+ ? t('ide.tests.needsSandbox', undefined, {
133
+ defaultValue: 'Start the project to run its tests.',
134
+ })
135
+ : null;
136
+ const runnable = canRun && status === 'ready' && !run.running;
137
+ const fixable = fixDisabledReason === null;
138
+ return (_jsxs("div", { "data-mol-id": "tests-card", className: cm.textSize('xs'), style: embedded ? { padding: '10px 12px' } : { ...chatCardStyle(), marginBottom: 16 }, children: [_jsxs("div", { style: {
139
+ display: 'flex',
140
+ alignItems: 'center',
141
+ justifyContent: 'space-between',
142
+ gap: 8,
143
+ marginBottom: 6,
144
+ flexWrap: 'wrap',
145
+ }, children: [_jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 8, flexShrink: 0 }, children: [!embedded && (_jsx("div", { className: cm.cn(cm.fontWeight('medium'), cm.textSize('sm')), style: { flexShrink: 0 }, children: t('ide.tests.heading', undefined, { defaultValue: 'Tests' }) })), run.running ? (_jsxs("span", { "data-mol-id": "tests-card-running", className: cm.cn(cm.textMuted, cm.textSize('xs')), style: { display: 'inline-flex', alignItems: 'center', gap: 4 }, children: [_jsx("span", { className: cm.spinner({ size: 'xs' }), "aria-hidden": "true" }), t('ide.tests.running', undefined, { defaultValue: 'Running…' })] })) : (summary.reported > 0 && (_jsxs("span", { "data-mol-id": "tests-card-summary", className: cm.textSize('xs'), style: { display: 'inline-flex', alignItems: 'center', gap: 6 }, children: [summary.passed > 0 && (_jsx("span", { className: cm.textSuccess, children: t('ide.tests.passedCount', { count: summary.passed }, { defaultValue: '{{count}} passed' }) })), summary.failed > 0 && (_jsx("span", { className: cm.textError, children: t('ide.tests.failedCount', { count: summary.failed }, { defaultValue: '{{count}} failed' }) }))] })))] }), _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' }, children: [counts.e2e > 0 && counts.unit > 0 && (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", "data-mol-id": "tests-card-run-e2e", onClick: () => onRun({ ids: idsOfKind(filtered, 'e2e') }), disabled: !runnable, title: disabledReason ?? undefined, className: cm.cn(SECONDARY_ACTION(cm)), style: { flexShrink: 0 }, children: t('ide.tests.runE2e', undefined, { defaultValue: 'Run e2e' }) }), _jsx("button", { type: "button", "data-mol-id": "tests-card-run-unit", onClick: () => onRun({ ids: idsOfKind(filtered, 'unit') }), disabled: !runnable, title: disabledReason ?? undefined, className: cm.cn(SECONDARY_ACTION(cm)), style: { flexShrink: 0 }, children: t('ide.tests.runUnit', undefined, { defaultValue: 'Run unit' }) })] })), !run.running && failures.length > 0 && (_jsx("button", { type: "button", "data-mol-id": "tests-card-fix-all", onClick: () => onFix(failures), disabled: !fixable, title: fixDisabledReason ?? undefined, className: cm.cn(SECONDARY_ACTION(cm)), style: { flexShrink: 0 }, children: failures.length === 1
146
+ ? t('ide.tests.fixWithSynthase', undefined, {
147
+ defaultValue: 'Fix with Synthase',
148
+ })
149
+ : t('ide.tests.fixFailures', { count: failures.length }, { defaultValue: 'Fix {{count}} failures' }) })), run.running ? (_jsx("button", { type: "button", "data-mol-id": "tests-card-cancel", onClick: onCancel, className: cm.cn(DESTRUCTIVE_ACTION(cm)), style: { flexShrink: 0 }, children: t('ide.tests.stop', undefined, { defaultValue: 'Stop' }) })) : (filtered.length > 0 && (_jsx("button", { type: "button", "data-mol-id": "tests-card-run-all", onClick: () => onRun({ ids: filtered.map((test) => test.id) }), disabled: !runnable, title: disabledReason ?? undefined, className: cm.cn(PRIMARY_ACTION(cm)), style: { flexShrink: 0 }, children: t('ide.tests.runAll', undefined, { defaultValue: 'Run all' }) })))] })] }), _jsx("input", { value: query, "data-mol-id": "tests-card-search", onChange: (e) => setQuery(e.target.value), placeholder: t('ide.tests.searchPlaceholder', undefined, {
150
+ defaultValue: 'Filter tests…',
151
+ }), className: cm.textSize('xs'), style: { ...fieldStyle, marginBottom: 6 } }), disabledReason && status !== 'loading' && (_jsx("div", { "data-mol-id": "tests-card-disabled-reason", className: cm.textMuted, children: disabledReason })), status === 'loading' && (_jsx("div", { className: cm.textMuted, style: { padding: '6px 0' }, children: t('ide.tests.loading', undefined, { defaultValue: 'Loading tests…' }) })), status === 'unavailable' && (_jsx("div", { "data-mol-id": "tests-card-unavailable", className: cm.textMuted, style: { padding: '6px 0' }, children: t('ide.tests.waitingForSandbox', undefined, {
152
+ defaultValue: 'Start the project to see its tests.',
153
+ }) })), status === 'error' && (_jsx("div", { "data-mol-id": "tests-card-error", className: cm.textMuted, style: { padding: '6px 0' }, children: t('ide.tests.listError', undefined, {
154
+ defaultValue: 'Could not list this project’s tests.',
155
+ }) })), status === 'ready' && filtered.length === 0 && (_jsx("div", { "data-mol-id": "tests-card-empty", className: cm.textMuted, style: { padding: '6px 0' }, children: query.trim()
156
+ ? t('ide.tests.noMatch', undefined, {
157
+ defaultValue: 'No tests match your search.',
158
+ })
159
+ : t('ide.tests.empty', undefined, {
160
+ defaultValue: 'No tests in this project yet.',
161
+ }) })), status === 'ready' &&
162
+ groups.map((group) => (_jsx(TestsCardGroup, { group: group, run: run, runnable: runnable, disabledReason: disabledReason, rowBorder: rowBorder, onRun: onRun, onFix: onFix, fixable: fixable, fixDisabledReason: fixDisabledReason }, `${group.kind}:${group.workspace}`))), run.output.length > 0 && (_jsxs("div", { "data-mol-id": "tests-card-output-area", style: { marginTop: 6 }, children: [_jsx("button", { type: "button", "data-mol-id": "tests-card-output-toggle", "aria-expanded": showOutput, onClick: () => setShowOutput((v) => !v), className: cm.cn(QUIET_TOGGLE(cm)), style: { flexShrink: 0 }, children: showOutput
163
+ ? t('ide.tests.hideOutput', undefined, { defaultValue: 'Hide output' })
164
+ : t('ide.tests.showOutput', undefined, { defaultValue: 'Show output' }) }), showOutput && (_jsx("pre", { ref: outputRef, "data-mol-id": "tests-card-output", className: cm.textSize('xs'), style: {
165
+ margin: 0,
166
+ padding: '6px 8px',
167
+ borderRadius: 4,
168
+ border: `1px solid ${rowBorder}`,
169
+ whiteSpace: 'pre-wrap',
170
+ wordBreak: 'break-word',
171
+ maxHeight: 200,
172
+ overflow: 'auto',
173
+ fontFamily: 'var(--mol-font-mono, monospace)',
174
+ }, children: run.output.join('\n') }))] })), run.error && (_jsx("div", { "data-mol-id": "tests-card-run-error", className: cm.textError, style: { marginTop: 6 }, children: run.error })), !run.running && run.outcome === 'cancelled' && !run.error && (_jsx("div", { "data-mol-id": "tests-card-cancelled", className: cm.textMuted, style: { marginTop: 6 }, children: t('ide.tests.cancelled', undefined, { defaultValue: 'Run stopped.' }) }))] }));
175
+ }
176
+ TestsCard.displayName = 'TestsCard';
177
+ /**
178
+ * The ids of every listed test of one kind.
179
+ *
180
+ * @param tests - The (filtered) tests.
181
+ * @param kind - The kind to select.
182
+ * @returns Their ids.
183
+ */
184
+ function idsOfKind(tests, kind) {
185
+ return tests.filter((test) => test.kind === kind).map((test) => test.id);
186
+ }
187
+ /**
188
+ * One group of rows — a heading ("End-to-end · my-app/app"), a Run for the
189
+ * whole group, and a row per test file.
190
+ *
191
+ * @param props - See {@link TestsCardGroupProps}.
192
+ * @returns The rendered group.
193
+ */
194
+ function TestsCardGroup({ group, run, runnable, disabledReason, rowBorder, onRun, onFix, fixable, fixDisabledReason, }) {
195
+ const cm = getClassMap();
196
+ const groupId = `${group.kind}-${group.workspace}`;
197
+ return (_jsxs("div", { "data-mol-id": `tests-card-group-${groupId}`, className: cm.borderT, style: { padding: '6px 0', borderColor: rowBorder }, children: [_jsxs("div", { style: {
198
+ display: 'flex',
199
+ alignItems: 'center',
200
+ justifyContent: 'space-between',
201
+ gap: 8,
202
+ flexWrap: 'wrap',
203
+ }, children: [_jsx("div", { className: cm.cn(cm.fontWeight('medium')), style: { minWidth: 0 }, children: groupHeading(group) }), _jsx("button", { type: "button", "data-mol-id": `tests-card-run-group-${groupId}`, onClick: () => onRun({ ids: group.items.map((item) => item.id) }), disabled: !runnable, title: disabledReason ?? undefined, className: cm.cn(SECONDARY_ACTION(cm)), style: { flexShrink: 0 }, children: t('ide.tests.runGroup', undefined, { defaultValue: 'Run group' }) })] }), group.kind === 'e2e' && (_jsx("div", { "data-mol-id": "tests-card-e2e-hint", className: cm.textMuted, style: { lineHeight: 1.4 }, children: t('ide.tests.e2eHint', undefined, {
204
+ defaultValue: 'These run against the live preview, so keep the preview open.',
205
+ }) })), group.items.map((item) => (_jsx(TestsCardRow, { item: item, result: run.results[item.id], running: isRowRunning(run, item.id), runnable: runnable, disabledReason: disabledReason, rowBorder: rowBorder, onRun: onRun, onFix: onFix, fixable: fixable, fixDisabledReason: fixDisabledReason }, item.id)))] }));
206
+ }
207
+ /**
208
+ * One test file: its label, its last status pill, a Run button, and — when it
209
+ * FAILED — the runner's output kept underneath, the same inline output
210
+ * ScriptsCard shows for a script that exited non-zero.
211
+ *
212
+ * @param props - See {@link TestsCardRowProps}.
213
+ * @returns The rendered row.
214
+ */
215
+ function TestsCardRow({ item, result, running, runnable, disabledReason, rowBorder, onRun, onFix, fixable, fixDisabledReason, }) {
216
+ const cm = getClassMap();
217
+ // A failure's output starts COLLAPSED too — the row's status pill says what
218
+ // happened; the detail is one click away for whoever wants it.
219
+ const [showFailure, setShowFailure] = useState(false);
220
+ return (_jsxs("div", { "data-mol-id": `tests-card-row-${item.id}`, style: { padding: '4px 0' }, children: [_jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap' }, children: [_jsx("div", { className: cm.textMuted, title: item.file, style: {
221
+ flex: '1 1 140px',
222
+ minWidth: 0,
223
+ overflow: 'hidden',
224
+ textOverflow: 'ellipsis',
225
+ whiteSpace: 'nowrap',
226
+ fontFamily: 'var(--mol-font-mono, monospace)',
227
+ }, children: testRowLabel(item) }), running ? (_jsxs("span", { "data-mol-id": `tests-card-status-${item.id}`, className: cm.textMuted, style: { display: 'inline-flex', alignItems: 'center', gap: 4, flexShrink: 0 }, children: [_jsx("span", { className: cm.spinner({ size: 'xs' }), "aria-hidden": "true" }), t('ide.tests.running', undefined, { defaultValue: 'Running…' })] })) : (result && (_jsx("span", { "data-mol-id": `tests-card-status-${item.id}`, className: result.status === 'passed'
228
+ ? cm.textSuccess
229
+ : result.status === 'failed'
230
+ ? cm.textError
231
+ : cm.textMuted, style: { flexShrink: 0 }, children: statusLabel(result.status) }))), _jsx("button", { type: "button", "data-mol-id": `tests-card-run-${item.id}`, onClick: () => onRun({ ids: [item.id] }), disabled: !runnable, title: disabledReason ?? undefined, className: cm.cn(SECONDARY_ACTION(cm)), style: { flexShrink: 0 }, children: t('ide.tests.run', undefined, { defaultValue: 'Run' }) })] }), result?.status === 'failed' && (_jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' }, children: [result.output && (_jsx("button", { type: "button", "data-mol-id": `tests-card-failure-toggle-${item.id}`, "aria-expanded": showFailure, onClick: () => setShowFailure((v) => !v), className: cm.cn(QUIET_TOGGLE(cm)), style: { flexShrink: 0 }, children: showFailure
232
+ ? t('ide.tests.hideOutput', undefined, { defaultValue: 'Hide output' })
233
+ : t('ide.tests.showOutput', undefined, { defaultValue: 'Show output' }) })), _jsx("button", { type: "button", "data-mol-id": `tests-card-fix-${item.id}`, onClick: () => onFix([{ item, output: result.output }]), disabled: !fixable, title: fixDisabledReason ?? undefined, className: cm.cn(SECONDARY_ACTION(cm)), style: { flexShrink: 0 }, children: t('ide.tests.fixWithSynthase', undefined, {
234
+ defaultValue: 'Fix with Synthase',
235
+ }) })] })), result?.status === 'failed' && result.output && showFailure && (_jsx("pre", { "data-mol-id": `tests-card-failure-${item.id}`, className: cm.textSize('xs'), style: {
236
+ margin: '4px 0 0',
237
+ padding: '6px 8px',
238
+ borderRadius: 4,
239
+ border: `1px solid ${rowBorder}`,
240
+ whiteSpace: 'pre-wrap',
241
+ wordBreak: 'break-word',
242
+ maxHeight: 200,
243
+ overflow: 'auto',
244
+ fontFamily: 'var(--mol-font-mono, monospace)',
245
+ }, children: result.output }))] }));
246
+ }
247
+ //# sourceMappingURL=TestsCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestsCard.js","sourceRoot":"","sources":["../../src/components/TestsCard.tsx"],"names":[],"mappings":"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"}
@@ -30,6 +30,9 @@ export { ShareLinkManager } from './ShareLinkManager.js';
30
30
  export { ShareModal } from './ShareModal.js';
31
31
  export { SidebarTabs } from './SidebarTabs.js';
32
32
  export { TabBar } from './TabBar.js';
33
+ export * from './tests-card-utilities.js';
34
+ export type { TestsCardProps, TestsStatus } from './TestsCard.js';
35
+ export { TestsCard } from './TestsCard.js';
33
36
  export { ToolCallCard } from './ToolCallCard.js';
34
37
  export * from './user-avatar-utilities.js';
35
38
  export type { UserAvatarProps } from './UserAvatar.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,yBAAyB,CAAA;AACvC,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,2BAA2B,CAAA;AACzC,cAAc,gCAAgC,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,cAAc,oBAAoB,CAAA;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,cAAc,mBAAmB,CAAA;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,YAAY,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,cAAc,4BAA4B,CAAA;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,cAAc,iCAAiC,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,yBAAyB,CAAA;AACvC,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,2BAA2B,CAAA;AACzC,cAAc,gCAAgC,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,cAAc,oBAAoB,CAAA;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,cAAc,mBAAmB,CAAA;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,YAAY,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,cAAc,2BAA2B,CAAA;AACzC,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,cAAc,4BAA4B,CAAA;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,cAAc,iCAAiC,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA"}
@@ -28,6 +28,8 @@ export { ShareLinkManager } from './ShareLinkManager.js';
28
28
  export { ShareModal } from './ShareModal.js';
29
29
  export { SidebarTabs } from './SidebarTabs.js';
30
30
  export { TabBar } from './TabBar.js';
31
+ export * from './tests-card-utilities.js';
32
+ export { TestsCard } from './TestsCard.js';
31
33
  export { ToolCallCard } from './ToolCallCard.js';
32
34
  export * from './user-avatar-utilities.js';
33
35
  export { UserAvatar } from './UserAvatar.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,yBAAyB,CAAA;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,2BAA2B,CAAA;AACzC,cAAc,gCAAgC,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,cAAc,oBAAoB,CAAA;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,cAAc,mBAAmB,CAAA;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,cAAc,4BAA4B,CAAA;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,cAAc,iCAAiC,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,yBAAyB,CAAA;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,2BAA2B,CAAA;AACzC,cAAc,gCAAgC,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,cAAc,oBAAoB,CAAA;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,cAAc,mBAAmB,CAAA;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,cAAc,2BAA2B,CAAA;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,cAAc,4BAA4B,CAAA;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,cAAc,iCAAiC,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Pure state + grouping helpers for the {@link TestsBar}.
3
+ *
4
+ * Everything here is a plain function over plain data, so the bar's behaviour
5
+ * (which rows a group runs, how a streamed event moves the run forward, what
6
+ * the collapsed summary says) is unit-testable without rendering anything.
7
+ *
8
+ * @module
9
+ */
10
+ import type { TestItem, TestKind, TestRunEvent, TestRunOutcome, TestStatus, TestWorkspace } from '../types.js';
11
+ /** One rendered group of rows: a kind within a project directory. */
12
+ export interface TestGroup {
13
+ kind: TestKind;
14
+ workspace: TestWorkspace;
15
+ /** The directory's name for the heading; `null` for the workspace root. */
16
+ label: string | null;
17
+ items: TestItem[];
18
+ }
19
+ /** What one test file ended as in the last run. */
20
+ export interface TestResultEntry {
21
+ status: TestStatus;
22
+ durationMs?: number;
23
+ passed: number;
24
+ failed: number;
25
+ skipped: number;
26
+ /** The runner's output, kept for a FAILURE so the row can keep showing it. */
27
+ output?: string;
28
+ }
29
+ /** Everything the bar knows about the run it is showing. */
30
+ export interface TestsRunState {
31
+ runId: string | null;
32
+ running: boolean;
33
+ /** The ids this run covers, in run order. */
34
+ queued: string[];
35
+ /** The id whose output is streaming right now, when the host says which. */
36
+ currentId: string | null;
37
+ /** The live output lines, newest last, capped at {@link MAX_OUTPUT_LINES}. */
38
+ output: string[];
39
+ /** Per-id outcome from this run (and from earlier runs, until re-run). */
40
+ results: Record<string, TestResultEntry>;
41
+ /** How the run ended, once it has. */
42
+ outcome: TestRunOutcome | null;
43
+ /** A run-level failure message (timeout, transport error) shown in the bar. */
44
+ error: string | null;
45
+ startedAt: number | null;
46
+ durationMs: number | null;
47
+ }
48
+ /** Live output lines retained — enough to read, bounded so a chatty run cannot grow forever. */
49
+ export declare const MAX_OUTPUT_LINES = 400;
50
+ /** A run that has not started. */
51
+ export declare const EMPTY_RUN_STATE: TestsRunState;
52
+ /**
53
+ * Group tests for display: by kind (end-to-end first), then by project
54
+ * directory (whatever directories are present — `app`, `my-app/app`,
55
+ * `packages/web`, the root last), with the files sorted inside each group.
56
+ *
57
+ * @param tests - Every discovered test.
58
+ * @returns The groups, in display order. Empty groups are never produced.
59
+ */
60
+ export declare function groupTests(tests: readonly TestItem[]): TestGroup[];
61
+ /**
62
+ * How many tests there are of each kind.
63
+ *
64
+ * @param tests - Every discovered test.
65
+ * @returns The per-kind counts.
66
+ */
67
+ export declare function countByKind(tests: readonly TestItem[]): Record<TestKind, number>;
68
+ /**
69
+ * The tallies of the last run, over the tests that are still listed. Counted
70
+ * per FILE (one row, one verdict) so the collapsed summary matches the rows.
71
+ *
72
+ * @param tests - The currently listed tests.
73
+ * @param results - The per-id outcomes.
74
+ * @returns Passed/failed/skipped file counts.
75
+ */
76
+ export declare function summarizeResults(tests: readonly TestItem[], results: Record<string, TestResultEntry>): {
77
+ passed: number;
78
+ failed: number;
79
+ skipped: number;
80
+ reported: number;
81
+ };
82
+ /**
83
+ * Fold one streamed event into the run state.
84
+ *
85
+ * Deliberately total: an event for an id the bar no longer lists is recorded
86
+ * anyway (a re-list may be in flight), and an unknown event type leaves the
87
+ * state untouched rather than throwing inside a stream handler.
88
+ *
89
+ * @param state - The current state.
90
+ * @param event - The event just received.
91
+ * @returns The next state (a new object whenever anything changed).
92
+ */
93
+ export declare function applyTestRunEvent(state: TestsRunState, event: TestRunEvent): TestsRunState;
94
+ /**
95
+ * The state after a run that never produced a `done` event — the host's stream
96
+ * died, or its request failed before the server could answer.
97
+ *
98
+ * @param state - The current state.
99
+ * @param message - What to show in the bar.
100
+ * @returns The next state, no longer running.
101
+ */
102
+ export declare function failRun(state: TestsRunState, message: string): TestsRunState;
103
+ /**
104
+ * Whether a row should render as "running": the run is live and either the host
105
+ * named this row as current, or it is in the queue and has no verdict yet.
106
+ *
107
+ * @param state - The run state.
108
+ * @param id - The row's test id.
109
+ * @returns True when the row is part of the live run and still undecided.
110
+ */
111
+ export declare function isRowRunning(state: TestsRunState, id: string): boolean;
112
+ /**
113
+ * The label for a row: the host's title when it gave one, else the file path.
114
+ *
115
+ * @param item - The test.
116
+ * @returns The label to render.
117
+ */
118
+ export declare function testRowLabel(item: TestItem): string;
119
+ /**
120
+ * Whether a written path is a test file, so the bar can re-list the moment the
121
+ * agent writes a NEW spec instead of only on the next run or reload. Matches
122
+ * the same `*.spec.*` / `*.test.*` shape the host's discovery looks for, so a
123
+ * write that cannot change the list never costs a listing.
124
+ *
125
+ * @param path - The path that changed (absolute or workspace-relative).
126
+ * @returns True when the path is a spec or test file.
127
+ */
128
+ export declare function isTestFilePath(path: string): boolean;
129
+ //# sourceMappingURL=tests-bar-utilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tests-bar-utilities.d.ts","sourceRoot":"","sources":["../../src/components/tests-bar-utilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,UAAU,EACV,aAAa,EACd,MAAM,aAAa,CAAA;AAEpB,qEAAqE;AACrE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,QAAQ,CAAA;IACd,SAAS,EAAE,aAAa,CAAA;IACxB,2EAA2E;IAC3E,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,KAAK,EAAE,QAAQ,EAAE,CAAA;CAClB;AAED,mDAAmD;AACnD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,UAAU,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,4EAA4E;IAC5E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,8EAA8E;IAC9E,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;IACxC,sCAAsC;IACtC,OAAO,EAAE,cAAc,GAAG,IAAI,CAAA;IAC9B,+EAA+E;IAC/E,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,gGAAgG;AAChG,eAAO,MAAM,gBAAgB,MAAM,CAAA;AAgCnC,kCAAkC;AAClC,eAAO,MAAM,eAAe,EAAE,aAW7B,CAAA;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,SAAS,EAAE,CAelE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAKhF;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,QAAQ,EAAE,EAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GACvC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAYvE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,GAAG,aAAa,CA0D1F;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CAE5E;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAItE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAEnD;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD"}