@molecule/app-ide-react 1.13.0 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +504 -1
- package/dist/command-metadata.d.ts.map +1 -1
- package/dist/command-metadata.js +7 -2
- package/dist/command-metadata.js.map +1 -1
- package/dist/components/ChatPanel.d.ts +9 -1
- package/dist/components/ChatPanel.d.ts.map +1 -1
- package/dist/components/ChatPanel.js +142 -18
- package/dist/components/ChatPanel.js.map +1 -1
- package/dist/components/TestsBar.d.ts +55 -0
- package/dist/components/TestsBar.d.ts.map +1 -0
- package/dist/components/TestsBar.js +296 -0
- package/dist/components/TestsBar.js.map +1 -0
- package/dist/components/TestsCard.d.ts +67 -0
- package/dist/components/TestsCard.d.ts.map +1 -0
- package/dist/components/TestsCard.js +185 -0
- package/dist/components/TestsCard.js.map +1 -0
- package/dist/components/index.d.ts +3 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +2 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/tests-bar-utilities.d.ts +129 -0
- package/dist/components/tests-bar-utilities.d.ts.map +1 -0
- package/dist/components/tests-bar-utilities.js +236 -0
- package/dist/components/tests-bar-utilities.js.map +1 -0
- package/dist/components/tests-card-utilities.d.ts +145 -0
- package/dist/components/tests-card-utilities.d.ts.map +1 -0
- package/dist/components/tests-card-utilities.js +262 -0
- package/dist/components/tests-card-utilities.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +136 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@ AUTO-GENERATED — DO NOT EDIT THIS FILE.
|
|
|
3
3
|
Generated by `mlcl sync-docs` from the package's src/index.ts JSDoc + mlcl/registry.json.
|
|
4
4
|
Edits here are overwritten on the next commit (molecule's pre-commit hook regenerates).
|
|
5
5
|
To change this document, edit the module-level JSDoc in src/index.ts.
|
|
6
|
-
Generated: 2026-09-
|
|
6
|
+
Generated: 2026-09-15T17:29:48.867Z
|
|
7
7
|
-->
|
|
8
8
|
|
|
9
9
|
# @molecule/app-ide-react
|
|
@@ -479,9 +479,33 @@ interface ChatPanelProps {
|
|
|
479
479
|
* `null`/`undefined` (the default) to render the nudge text with no button.
|
|
480
480
|
* `requiresSignup`, when set, is the backend's flag that the user must sign up
|
|
481
481
|
* rather than upgrade an existing plan; when unset the host's own auth state decides.
|
|
482
|
+
*
|
|
483
|
+
* The rest of the context is the backend's own description of the limit that
|
|
484
|
+
* fired, forwarded verbatim so the host never has to guess the right button:
|
|
485
|
+
*
|
|
486
|
+
* - `limitType` — the RULE the backend enforced (e.g. `usage_balance`,
|
|
487
|
+
* `spend_cap`, `ai_cost`, `max_tool_loops`).
|
|
488
|
+
* - `billingAction` — the REMEDY the backend resolved (e.g. `sign_up`,
|
|
489
|
+
* `upgrade`, `add_payment_method`, `add_funds`, `raise_spend_cap`,
|
|
490
|
+
* `enable_extra_usage`, `contact_support`, `owner_only`, `none`). Prefer this
|
|
491
|
+
* over `limitType` when both are present: one limit can need different
|
|
492
|
+
* buttons per account (an empty balance is "Add funds" with a card on file
|
|
493
|
+
* and "Add a payment method" without one), and `none` means there is nothing
|
|
494
|
+
* the user can do — render no button.
|
|
495
|
+
* - `upgradeTier` — the plan an upgrade would move to, explicitly `null` when
|
|
496
|
+
* there is no higher tier, so a top-tier user is never sent to a plans page
|
|
497
|
+
* with nothing to sell them.
|
|
498
|
+
*
|
|
499
|
+
* Both vocabularies belong to the host's API, so they are plain strings here —
|
|
500
|
+
* the shared IDE never interprets them. Every field is optional and may be
|
|
501
|
+
* absent (a backend that sends none of them keeps the old behavior), so the
|
|
502
|
+
* host must have a fallback.
|
|
482
503
|
*/
|
|
483
504
|
buildUpgradeCta?: (context: {
|
|
484
505
|
requiresSignup?: boolean
|
|
506
|
+
limitType?: string
|
|
507
|
+
billingAction?: string
|
|
508
|
+
upgradeTier?: string | null
|
|
485
509
|
}) => ChatEventCardAction | ChatEventCardAction[] | null | undefined
|
|
486
510
|
/**
|
|
487
511
|
* Optional app-specific section appended to the `/help` output — e.g. a plan /
|
|
@@ -544,6 +568,45 @@ interface ChatPanelProps {
|
|
|
544
568
|
* modal — which POSTs to the project's own backend — is unaffected.
|
|
545
569
|
*/
|
|
546
570
|
feedbackUrl?: string
|
|
571
|
+
/**
|
|
572
|
+
* Lists the project's tests for the `/test` browser. Omit it (the default)
|
|
573
|
+
* and `/test` has nothing to show — the shared IDE owns no test-discovery
|
|
574
|
+
* route of its own.
|
|
575
|
+
*
|
|
576
|
+
* molecule.dev implements it over `GET /projects/:id/tests`. It is called
|
|
577
|
+
* on every `/test` invocation and once more when a run finishes, so a spec
|
|
578
|
+
* the agent just wrote shows up the next time the browser is opened.
|
|
579
|
+
*/
|
|
580
|
+
listTests?: () => Promise<TestList>
|
|
581
|
+
/**
|
|
582
|
+
* Runs the selected tests, streaming {@link TestRunEvent}s back as they
|
|
583
|
+
* happen. Required alongside {@link ChatPanelProps.listTests} for the
|
|
584
|
+
* browser's run controls to work.
|
|
585
|
+
*
|
|
586
|
+
* The returned handle's `cancel()` must stop the run (molecule.dev aborts the
|
|
587
|
+
* SSE request, and the server kills the process tree on disconnect). The host
|
|
588
|
+
* is responsible for running the e2e specs through the preview bond chain —
|
|
589
|
+
* in a sandbox that means `npx playwright test` with
|
|
590
|
+
* `@molecule/app-e2e-preview` as the browser, so the spec drives the live
|
|
591
|
+
* preview rather than a browser binary that is not installed there.
|
|
592
|
+
*
|
|
593
|
+
* The run is owned by `ChatPanel`, not by the card, so it keeps streaming
|
|
594
|
+
* while the browser is closed and is still there when it is re-opened.
|
|
595
|
+
*/
|
|
596
|
+
runTests?: (selection: TestSelection, onEvent: (event: TestRunEvent) => void) => TestRunHandle
|
|
597
|
+
/**
|
|
598
|
+
* Whether this viewer may RUN tests. `false` still lets them open `/test`
|
|
599
|
+
* and read what the project tests (the platform serves the listing to
|
|
600
|
+
* viewers) but disables every run control and shows why. Defaults to
|
|
601
|
+
* `canEdit !== false`.
|
|
602
|
+
*/
|
|
603
|
+
canRunTests?: boolean
|
|
604
|
+
/**
|
|
605
|
+
* Whether the environment the tests run in is up — a running sandbox.
|
|
606
|
+
* `false` makes `/test` say to start the project instead of listing an empty
|
|
607
|
+
* browser or letting a Run click fail. Defaults to `true`.
|
|
608
|
+
*/
|
|
609
|
+
testsAvailable?: boolean
|
|
547
610
|
className?: string
|
|
548
611
|
}
|
|
549
612
|
```
|
|
@@ -1407,6 +1470,161 @@ interface TabBarProps {
|
|
|
1407
1470
|
}
|
|
1408
1471
|
```
|
|
1409
1472
|
|
|
1473
|
+
#### `TestGroup`
|
|
1474
|
+
|
|
1475
|
+
One rendered group of rows: a kind within a project directory.
|
|
1476
|
+
|
|
1477
|
+
```typescript
|
|
1478
|
+
interface TestGroup {
|
|
1479
|
+
kind: TestKind
|
|
1480
|
+
workspace: TestWorkspace
|
|
1481
|
+
/** The directory's name for the heading; `null` for the workspace root. */
|
|
1482
|
+
label: string | null
|
|
1483
|
+
items: TestItem[]
|
|
1484
|
+
}
|
|
1485
|
+
```
|
|
1486
|
+
|
|
1487
|
+
#### `TestItem`
|
|
1488
|
+
|
|
1489
|
+
One test file the host discovered in the project.
|
|
1490
|
+
|
|
1491
|
+
```typescript
|
|
1492
|
+
interface TestItem {
|
|
1493
|
+
/** Stable id, unique across workspaces — used as the row key and to select by. */
|
|
1494
|
+
id: string
|
|
1495
|
+
/** Path relative to its workspace, e.g. `e2e/home.spec.ts`. */
|
|
1496
|
+
file: string
|
|
1497
|
+
kind: TestKind
|
|
1498
|
+
workspace: TestWorkspace
|
|
1499
|
+
/**
|
|
1500
|
+
* The group's project name, ready to render: the same path as `workspace`,
|
|
1501
|
+
* or `null` for the workspace root, which has no name of its own. Hosts that
|
|
1502
|
+
* omit it get the path itself (and the translated "Project" for the root).
|
|
1503
|
+
*/
|
|
1504
|
+
workspaceLabel?: string | null
|
|
1505
|
+
/** Human label for the row; the bar falls back to the file path without one. */
|
|
1506
|
+
title?: string
|
|
1507
|
+
}
|
|
1508
|
+
```
|
|
1509
|
+
|
|
1510
|
+
#### `TestList`
|
|
1511
|
+
|
|
1512
|
+
What {@link ChatPanelProps.listTests} resolves with.
|
|
1513
|
+
|
|
1514
|
+
```typescript
|
|
1515
|
+
interface TestList {
|
|
1516
|
+
tests: TestItem[]
|
|
1517
|
+
/**
|
|
1518
|
+
* Per project directory (keyed like {@link TestItem.workspace}), the runners
|
|
1519
|
+
* the host found. Only directories that hold a listed test appear.
|
|
1520
|
+
*/
|
|
1521
|
+
runners: Record<string, TestRunners>
|
|
1522
|
+
}
|
|
1523
|
+
```
|
|
1524
|
+
|
|
1525
|
+
#### `TestResultEntry`
|
|
1526
|
+
|
|
1527
|
+
What one test file ended as in the last run.
|
|
1528
|
+
|
|
1529
|
+
```typescript
|
|
1530
|
+
interface TestResultEntry {
|
|
1531
|
+
status: TestStatus
|
|
1532
|
+
durationMs?: number
|
|
1533
|
+
passed: number
|
|
1534
|
+
failed: number
|
|
1535
|
+
skipped: number
|
|
1536
|
+
/** The runner's output, kept for a FAILURE so the row can keep showing it. */
|
|
1537
|
+
output?: string
|
|
1538
|
+
}
|
|
1539
|
+
```
|
|
1540
|
+
|
|
1541
|
+
#### `TestRunHandle`
|
|
1542
|
+
|
|
1543
|
+
Handle to a run in flight, so the bar can stop it.
|
|
1544
|
+
|
|
1545
|
+
```typescript
|
|
1546
|
+
interface TestRunHandle {
|
|
1547
|
+
/** Stop the run — the host aborts its stream, which cancels the work. */
|
|
1548
|
+
cancel(): void
|
|
1549
|
+
}
|
|
1550
|
+
```
|
|
1551
|
+
|
|
1552
|
+
#### `TestRunners`
|
|
1553
|
+
|
|
1554
|
+
Which runner drives each kind in one workspace (`null` = none installed).
|
|
1555
|
+
|
|
1556
|
+
```typescript
|
|
1557
|
+
interface TestRunners {
|
|
1558
|
+
e2e: string | null
|
|
1559
|
+
unit: string | null
|
|
1560
|
+
}
|
|
1561
|
+
```
|
|
1562
|
+
|
|
1563
|
+
#### `TestsCardProps`
|
|
1564
|
+
|
|
1565
|
+
Props for {@link TestsCard}.
|
|
1566
|
+
|
|
1567
|
+
```typescript
|
|
1568
|
+
interface TestsCardProps {
|
|
1569
|
+
/** Every discovered test (unfiltered). */
|
|
1570
|
+
tests: TestItem[]
|
|
1571
|
+
/** How the listing went. */
|
|
1572
|
+
status: TestsStatus
|
|
1573
|
+
/** The run this card is showing — owned by the panel, so it survives a close. */
|
|
1574
|
+
run: TestsRunState
|
|
1575
|
+
/** Seeds the search box from `/test <query>`. */
|
|
1576
|
+
initialQuery: string
|
|
1577
|
+
/** Whether this viewer may run tests at all (a viewer may not). */
|
|
1578
|
+
canRun: boolean
|
|
1579
|
+
/** Runs a selection. */
|
|
1580
|
+
onRun: (selection: TestSelection) => void
|
|
1581
|
+
/** Stops the run in flight. */
|
|
1582
|
+
onCancel: () => void
|
|
1583
|
+
/** Light theme (drives the same row border + field inset the sibling cards use). */
|
|
1584
|
+
isLight: boolean
|
|
1585
|
+
/** Chrome-less inside the command overlay; full card chrome in the timeline. */
|
|
1586
|
+
embedded?: boolean
|
|
1587
|
+
}
|
|
1588
|
+
```
|
|
1589
|
+
|
|
1590
|
+
#### `TestSelection`
|
|
1591
|
+
|
|
1592
|
+
What the bar asks the host to run.
|
|
1593
|
+
|
|
1594
|
+
```typescript
|
|
1595
|
+
interface TestSelection {
|
|
1596
|
+
/** Specific {@link TestItem.id}s. Takes precedence over `kind`. */
|
|
1597
|
+
ids?: string[]
|
|
1598
|
+
/** Everything of this kind when no `ids` are given. */
|
|
1599
|
+
kind?: TestKind | 'all'
|
|
1600
|
+
}
|
|
1601
|
+
```
|
|
1602
|
+
|
|
1603
|
+
#### `TestsRunState`
|
|
1604
|
+
|
|
1605
|
+
Everything the card knows about the run it is showing.
|
|
1606
|
+
|
|
1607
|
+
```typescript
|
|
1608
|
+
interface TestsRunState {
|
|
1609
|
+
runId: string | null
|
|
1610
|
+
running: boolean
|
|
1611
|
+
/** The ids this run covers, in run order. */
|
|
1612
|
+
queued: string[]
|
|
1613
|
+
/** The id whose output is streaming right now, when the host says which. */
|
|
1614
|
+
currentId: string | null
|
|
1615
|
+
/** The live output lines, newest last, capped at {@link MAX_OUTPUT_LINES}. */
|
|
1616
|
+
output: string[]
|
|
1617
|
+
/** Per-id outcome from this run (and from earlier runs, until re-run). */
|
|
1618
|
+
results: Record<string, TestResultEntry>
|
|
1619
|
+
/** How the run ended, once it has. */
|
|
1620
|
+
outcome: TestRunOutcome | null
|
|
1621
|
+
/** A run-level failure message (timeout, transport error) shown in the card. */
|
|
1622
|
+
error: string | null
|
|
1623
|
+
startedAt: number | null
|
|
1624
|
+
durationMs: number | null
|
|
1625
|
+
}
|
|
1626
|
+
```
|
|
1627
|
+
|
|
1410
1628
|
#### `ToolCallCardProps`
|
|
1411
1629
|
|
|
1412
1630
|
Properties for tool call card.
|
|
@@ -1649,6 +1867,86 @@ A role granted by a share link.
|
|
|
1649
1867
|
type ShareRole = (typeof SHARE_ROLES)[number]
|
|
1650
1868
|
```
|
|
1651
1869
|
|
|
1870
|
+
#### `TestKind`
|
|
1871
|
+
|
|
1872
|
+
What a test file is: an end-to-end spec driven against the LIVE PREVIEW (the
|
|
1873
|
+
`@molecule/app-e2e-preview` bond every scaffolded app carries), or a plain
|
|
1874
|
+
unit test run by the project's own runner.
|
|
1875
|
+
|
|
1876
|
+
```typescript
|
|
1877
|
+
type TestKind = 'e2e' | 'unit'
|
|
1878
|
+
```
|
|
1879
|
+
|
|
1880
|
+
#### `TestRunEvent`
|
|
1881
|
+
|
|
1882
|
+
One event from a run in progress. The host streams these to the bar (over SSE
|
|
1883
|
+
in molecule.dev) in the order the run produces them: one `start`, then
|
|
1884
|
+
interleaved `output`/`result`, then exactly one `done`.
|
|
1885
|
+
|
|
1886
|
+
```typescript
|
|
1887
|
+
type TestRunEvent =
|
|
1888
|
+
| { type: 'start'; runId: string; ids: string[]; startedAt?: string }
|
|
1889
|
+
| { type: 'output'; id?: string; stream?: 'stdout' | 'stderr'; chunk: string }
|
|
1890
|
+
| {
|
|
1891
|
+
type: 'result'
|
|
1892
|
+
id: string
|
|
1893
|
+
status: TestStatus
|
|
1894
|
+
durationMs?: number
|
|
1895
|
+
passed?: number
|
|
1896
|
+
failed?: number
|
|
1897
|
+
skipped?: number
|
|
1898
|
+
/** The runner's output for a FAILURE, which the bar keeps visible. */
|
|
1899
|
+
output?: string
|
|
1900
|
+
}
|
|
1901
|
+
| {
|
|
1902
|
+
type: 'done'
|
|
1903
|
+
runId?: string
|
|
1904
|
+
outcome: TestRunOutcome
|
|
1905
|
+
passed?: number
|
|
1906
|
+
failed?: number
|
|
1907
|
+
skipped?: number
|
|
1908
|
+
durationMs?: number
|
|
1909
|
+
error?: string
|
|
1910
|
+
}
|
|
1911
|
+
```
|
|
1912
|
+
|
|
1913
|
+
#### `TestRunOutcome`
|
|
1914
|
+
|
|
1915
|
+
How a whole run ended.
|
|
1916
|
+
|
|
1917
|
+
```typescript
|
|
1918
|
+
type TestRunOutcome = 'completed' | 'cancelled' | 'timeout' | 'error'
|
|
1919
|
+
```
|
|
1920
|
+
|
|
1921
|
+
#### `TestsStatus`
|
|
1922
|
+
|
|
1923
|
+
Discovery status for the tests list — mirrors {@link ScriptsCard}'s.
|
|
1924
|
+
|
|
1925
|
+
```typescript
|
|
1926
|
+
type TestsStatus = 'loading' | 'ready' | 'error' | 'unavailable'
|
|
1927
|
+
```
|
|
1928
|
+
|
|
1929
|
+
#### `TestStatus`
|
|
1930
|
+
|
|
1931
|
+
How one test file ended.
|
|
1932
|
+
|
|
1933
|
+
```typescript
|
|
1934
|
+
type TestStatus = 'passed' | 'failed' | 'skipped'
|
|
1935
|
+
```
|
|
1936
|
+
|
|
1937
|
+
#### `TestWorkspace`
|
|
1938
|
+
|
|
1939
|
+
Which project directory a test file belongs to: the directory that OWNS the
|
|
1940
|
+
file (the nearest ancestor holding the runner's config or a `package.json`),
|
|
1941
|
+
as a path relative to the workspace root — `app`, `api`, `my-app/app`,
|
|
1942
|
+
`packages/web` — or `.` for the workspace root itself. Nothing guarantees
|
|
1943
|
+
`app/` or `api/` at the root: the executor names its project directory, so
|
|
1944
|
+
the value is a path, not an enum.
|
|
1945
|
+
|
|
1946
|
+
```typescript
|
|
1947
|
+
type TestWorkspace = 'app' | 'api' | '.' | (string & {})
|
|
1948
|
+
```
|
|
1949
|
+
|
|
1652
1950
|
#### `TimestampsCommand`
|
|
1653
1951
|
|
|
1654
1952
|
Parsed `/timestamps` invocation: toggle, explicit on/off, or an unrecognized argument.
|
|
@@ -1766,6 +2064,23 @@ function activityTypeLabel(type: ActivityType): string
|
|
|
1766
2064
|
|
|
1767
2065
|
**Returns:** The translated channel label.
|
|
1768
2066
|
|
|
2067
|
+
#### `applyTestRunEvent(state, event)`
|
|
2068
|
+
|
|
2069
|
+
Fold one streamed event into the run state.
|
|
2070
|
+
|
|
2071
|
+
Deliberately total: an event for an id the card no longer lists is recorded
|
|
2072
|
+
anyway (a re-list may be in flight), and an unknown event type leaves the
|
|
2073
|
+
state untouched rather than throwing inside a stream handler.
|
|
2074
|
+
|
|
2075
|
+
```typescript
|
|
2076
|
+
function applyTestRunEvent(state: TestsRunState, event: TestRunEvent): TestsRunState
|
|
2077
|
+
```
|
|
2078
|
+
|
|
2079
|
+
- `state` — The current state.
|
|
2080
|
+
- `event` — The event just received.
|
|
2081
|
+
|
|
2082
|
+
**Returns:** The next state (a new object whenever anything changed).
|
|
2083
|
+
|
|
1769
2084
|
#### `autoCommitReducer(state, action)`
|
|
1770
2085
|
|
|
1771
2086
|
Pure reducer for the auto-commit countdown. Deterministic and side-effect
|
|
@@ -1885,6 +2200,10 @@ function ChatPanel({
|
|
|
1885
2200
|
version,
|
|
1886
2201
|
extraCommands,
|
|
1887
2202
|
feedbackUrl,
|
|
2203
|
+
listTests,
|
|
2204
|
+
runTests,
|
|
2205
|
+
canRunTests,
|
|
2206
|
+
testsAvailable,
|
|
1888
2207
|
className,
|
|
1889
2208
|
}: ChatPanelProps): JSX.Element
|
|
1890
2209
|
```
|
|
@@ -1963,6 +2282,18 @@ function CommandPalette({ commands, onDismiss }: CommandPaletteProps): JSX.Eleme
|
|
|
1963
2282
|
|
|
1964
2283
|
**Returns:** The command palette element.
|
|
1965
2284
|
|
|
2285
|
+
#### `countByKind(tests)`
|
|
2286
|
+
|
|
2287
|
+
How many tests there are of each kind.
|
|
2288
|
+
|
|
2289
|
+
```typescript
|
|
2290
|
+
function countByKind(tests: readonly TestItem[]): Record<TestKind, number>
|
|
2291
|
+
```
|
|
2292
|
+
|
|
2293
|
+
- `tests` — Every discovered test.
|
|
2294
|
+
|
|
2295
|
+
**Returns:** The per-kind counts.
|
|
2296
|
+
|
|
1966
2297
|
#### `DeviceFrameSelector(props)`
|
|
1967
2298
|
|
|
1968
2299
|
A dropdown that selects the preview device frame and hosts the Rotate +
|
|
@@ -2021,6 +2352,20 @@ function EditorPanel({
|
|
|
2021
2352
|
|
|
2022
2353
|
**Returns:** The rendered editor panel element.
|
|
2023
2354
|
|
|
2355
|
+
#### `failRun(state, message)`
|
|
2356
|
+
|
|
2357
|
+
The state after a run that never produced a `done` event — the host's stream
|
|
2358
|
+
died, or its request failed before the server could answer.
|
|
2359
|
+
|
|
2360
|
+
```typescript
|
|
2361
|
+
function failRun(state: TestsRunState, message: string): TestsRunState
|
|
2362
|
+
```
|
|
2363
|
+
|
|
2364
|
+
- `state` — The current state.
|
|
2365
|
+
- `message` — What to show in the card.
|
|
2366
|
+
|
|
2367
|
+
**Returns:** The next state, no longer running.
|
|
2368
|
+
|
|
2024
2369
|
#### `FileExplorer(props)`
|
|
2025
2370
|
|
|
2026
2371
|
Tree-view file explorer component with multi-select, keyboard navigation, and drag-and-drop.
|
|
@@ -2064,6 +2409,21 @@ function filterActivitiesByType(activities: Activity[], type: ActivityType | nul
|
|
|
2064
2409
|
|
|
2065
2410
|
**Returns:** The filtered list (a new array unless `type` is null).
|
|
2066
2411
|
|
|
2412
|
+
#### `filterTests(tests, query)`
|
|
2413
|
+
|
|
2414
|
+
Filters tests by a free-text query, matching (case-insensitively) against the
|
|
2415
|
+
file path, the row title, and the project directory. A blank query returns
|
|
2416
|
+
every test in input order — the same contract as `filterScripts`.
|
|
2417
|
+
|
|
2418
|
+
```typescript
|
|
2419
|
+
function filterTests(tests: readonly TestItem[], query: string): TestItem[]
|
|
2420
|
+
```
|
|
2421
|
+
|
|
2422
|
+
- `tests` — The tests to filter.
|
|
2423
|
+
- `query` — The search query.
|
|
2424
|
+
|
|
2425
|
+
**Returns:** The matching tests, in input order.
|
|
2426
|
+
|
|
2067
2427
|
#### `formatAutoCommitBadge(state)`
|
|
2068
2428
|
|
|
2069
2429
|
Formats the countdown's remaining seconds for the compact badge (e.g. `"12s"`).
|
|
@@ -2169,6 +2529,20 @@ function groupCommandsByCategory(
|
|
|
2169
2529
|
|
|
2170
2530
|
**Returns:** One {@link CommandGroup} per non-empty category, in category order.
|
|
2171
2531
|
|
|
2532
|
+
#### `groupTests(tests)`
|
|
2533
|
+
|
|
2534
|
+
Group tests for display: by kind (end-to-end first), then by project
|
|
2535
|
+
directory (whatever directories are present — `app`, `my-app/app`,
|
|
2536
|
+
`packages/web`, the root last), with the files sorted inside each group.
|
|
2537
|
+
|
|
2538
|
+
```typescript
|
|
2539
|
+
function groupTests(tests: readonly TestItem[]): TestGroup[]
|
|
2540
|
+
```
|
|
2541
|
+
|
|
2542
|
+
- `tests` — Every discovered test.
|
|
2543
|
+
|
|
2544
|
+
**Returns:** The groups, in display order. Empty groups are never produced.
|
|
2545
|
+
|
|
2172
2546
|
#### `hasRenderableAvatar(avatar)`
|
|
2173
2547
|
|
|
2174
2548
|
Whether a stored avatar value is renderable (vs. needing the icon fallback).
|
|
@@ -2298,6 +2672,20 @@ function isReportFormValid(form: ReportFormState): boolean
|
|
|
2298
2672
|
|
|
2299
2673
|
**Returns:** `true` when the form can be submitted.
|
|
2300
2674
|
|
|
2675
|
+
#### `isRowRunning(state, id)`
|
|
2676
|
+
|
|
2677
|
+
Whether a row should render as "running": the run is live and either the host
|
|
2678
|
+
named this row as current, or it is in the queue and has no verdict yet.
|
|
2679
|
+
|
|
2680
|
+
```typescript
|
|
2681
|
+
function isRowRunning(state: TestsRunState, id: string): boolean
|
|
2682
|
+
```
|
|
2683
|
+
|
|
2684
|
+
- `state` — The run state.
|
|
2685
|
+
- `id` — The row's test id.
|
|
2686
|
+
|
|
2687
|
+
**Returns:** True when the row is part of the live run and still undecided.
|
|
2688
|
+
|
|
2301
2689
|
#### `isShareRole(value)`
|
|
2302
2690
|
|
|
2303
2691
|
Type guard for a valid {@link ShareRole} (case-insensitive callers should
|
|
@@ -2429,6 +2817,24 @@ function parseShareCommand(input: string): ShareCommand | null
|
|
|
2429
2817
|
|
|
2430
2818
|
**Returns:** The parsed {@link ShareCommand}, or `null`.
|
|
2431
2819
|
|
|
2820
|
+
#### `parseTestCommand(input)`
|
|
2821
|
+
|
|
2822
|
+
Parses a `/test [query | all]` command (`/tests` is the registered alias).
|
|
2823
|
+
|
|
2824
|
+
`all` is the one argument that ACTS: it runs everything immediately. Every
|
|
2825
|
+
other argument only filters the list, exactly the way `/scripts <query>` seeds
|
|
2826
|
+
the scripts browser — running ONE test by name is what the per-row Run button
|
|
2827
|
+
is for, and giving the argument a second meaning would make `/test <thing>`
|
|
2828
|
+
sometimes list and sometimes execute.
|
|
2829
|
+
|
|
2830
|
+
```typescript
|
|
2831
|
+
function parseTestCommand(input: string): { query: string; runAll: boolean } | null
|
|
2832
|
+
```
|
|
2833
|
+
|
|
2834
|
+
- `input` — The raw chat input.
|
|
2835
|
+
|
|
2836
|
+
**Returns:** `{ query, runAll }` when it is a `/test` command, else `null`.
|
|
2837
|
+
|
|
2432
2838
|
#### `parseTimestampsCommand(input)`
|
|
2433
2839
|
|
|
2434
2840
|
Parses `/timestamps [on | off]`. `show`/`hide` are accepted as synonyms.
|
|
@@ -2767,6 +3173,23 @@ function SidebarTabs({ activeTab, onTabChange, children, className }: SidebarTab
|
|
|
2767
3173
|
|
|
2768
3174
|
**Returns:** The sidebar tabs element.
|
|
2769
3175
|
|
|
3176
|
+
#### `summarizeResults(tests, results)`
|
|
3177
|
+
|
|
3178
|
+
The tallies of the last run, over the tests that are still listed. Counted
|
|
3179
|
+
per FILE (one row, one verdict) so the collapsed summary matches the rows.
|
|
3180
|
+
|
|
3181
|
+
```typescript
|
|
3182
|
+
function summarizeResults(
|
|
3183
|
+
tests: readonly TestItem[],
|
|
3184
|
+
results: Record<string, TestResultEntry>,
|
|
3185
|
+
): { passed: number; failed: number; skipped: number; reported: number }
|
|
3186
|
+
```
|
|
3187
|
+
|
|
3188
|
+
- `tests` — The currently listed tests.
|
|
3189
|
+
- `results` — The per-id outcomes.
|
|
3190
|
+
|
|
3191
|
+
**Returns:** Passed/failed/skipped file counts.
|
|
3192
|
+
|
|
2770
3193
|
#### `TabBar(props)`
|
|
2771
3194
|
|
|
2772
3195
|
Horizontally scrollable tab bar for open editor files.
|
|
@@ -2787,6 +3210,40 @@ function TabBar({
|
|
|
2787
3210
|
|
|
2788
3211
|
**Returns:** The rendered tab bar element, or null if no tabs are open.
|
|
2789
3212
|
|
|
3213
|
+
#### `testRowLabel(item)`
|
|
3214
|
+
|
|
3215
|
+
The label for a row: the host's title when it gave one, else the file path.
|
|
3216
|
+
|
|
3217
|
+
```typescript
|
|
3218
|
+
function testRowLabel(item: TestItem): string
|
|
3219
|
+
```
|
|
3220
|
+
|
|
3221
|
+
- `item` — The test.
|
|
3222
|
+
|
|
3223
|
+
**Returns:** The label to render.
|
|
3224
|
+
|
|
3225
|
+
#### `TestsCard(props)`
|
|
3226
|
+
|
|
3227
|
+
The tests browser shown by `/test`.
|
|
3228
|
+
|
|
3229
|
+
```typescript
|
|
3230
|
+
function TestsCard({
|
|
3231
|
+
tests,
|
|
3232
|
+
status,
|
|
3233
|
+
run,
|
|
3234
|
+
initialQuery,
|
|
3235
|
+
canRun,
|
|
3236
|
+
onRun,
|
|
3237
|
+
onCancel,
|
|
3238
|
+
isLight,
|
|
3239
|
+
embedded,
|
|
3240
|
+
}: TestsCardProps): JSX.Element
|
|
3241
|
+
```
|
|
3242
|
+
|
|
3243
|
+
- `props` — See {@link TestsCardProps}.
|
|
3244
|
+
|
|
3245
|
+
**Returns:** The rendered tests card.
|
|
3246
|
+
|
|
2790
3247
|
#### `useChatTimestampsVisible()`
|
|
2791
3248
|
|
|
2792
3249
|
Whether chat timestamps are turned on for every item on this device. Re-renders
|
|
@@ -3043,6 +3500,14 @@ An empty report form (the modal's initial state).
|
|
|
3043
3500
|
const EMPTY_REPORT_FORM: ReportFormState
|
|
3044
3501
|
```
|
|
3045
3502
|
|
|
3503
|
+
#### `EMPTY_RUN_STATE`
|
|
3504
|
+
|
|
3505
|
+
A run that has not started.
|
|
3506
|
+
|
|
3507
|
+
```typescript
|
|
3508
|
+
const EMPTY_RUN_STATE: TestsRunState
|
|
3509
|
+
```
|
|
3510
|
+
|
|
3046
3511
|
#### `IS_MAC`
|
|
3047
3512
|
|
|
3048
3513
|
Detect macOS / iOS for Cmd vs Ctrl.
|
|
@@ -3059,6 +3524,14 @@ Maximum avatar source length we will render inline (~256 KB data-URI).
|
|
|
3059
3524
|
const MAX_AVATAR_SRC_LENGTH: 262144
|
|
3060
3525
|
```
|
|
3061
3526
|
|
|
3527
|
+
#### `MAX_OUTPUT_LINES`
|
|
3528
|
+
|
|
3529
|
+
Live output lines retained — enough to read, bounded so a chatty run cannot grow forever.
|
|
3530
|
+
|
|
3531
|
+
```typescript
|
|
3532
|
+
const MAX_OUTPUT_LINES: 400
|
|
3533
|
+
```
|
|
3534
|
+
|
|
3062
3535
|
#### `MAX_PANEL_PERCENT`
|
|
3063
3536
|
|
|
3064
3537
|
Largest a panel may grow to, as a percentage of the container.
|
|
@@ -3232,6 +3705,36 @@ Peer dependencies:
|
|
|
3232
3705
|
- A custom card is a critical event only when its factory sets
|
|
3233
3706
|
`critical: true` (a failure, a blocked action, a limit that stopped work) —
|
|
3234
3707
|
the package never infers it from tone or copy.
|
|
3708
|
+
- `ChatPanel` owns no pricing or auth routes, so every limit/upgrade button
|
|
3709
|
+
comes from the host's `buildUpgradeCta(context)`. The context forwards the
|
|
3710
|
+
backend's whole description of the refusal: `requiresSignup`, `limitType`
|
|
3711
|
+
(the rule that fired), `billingAction` (the remedy it resolved — e.g.
|
|
3712
|
+
`add_funds`, `add_payment_method`, `raise_spend_cap`, `upgrade`, `none`) and
|
|
3713
|
+
`upgradeTier` (`null` = no higher plan). Branch on `billingAction` first;
|
|
3714
|
+
every field is optional, so keep a fallback. A live limit banner and a
|
|
3715
|
+
recorded card that declares the same `coversLimitType` state one fact, so
|
|
3716
|
+
the card steps aside while the banner is up — which only reads as one
|
|
3717
|
+
consistent message if the banner's button is resolved from the same
|
|
3718
|
+
`billingAction` the card used.
|
|
3719
|
+
- **`/test` lists and runs the project's tests** (`TestsCard`, opened by the
|
|
3720
|
+
`/test` command — `/tests` is a registered alias — in the same closeable
|
|
3721
|
+
overlay as `/scripts` and `/skills`, and renderable in the timeline as the
|
|
3722
|
+
`tests` system card). It owns no routes: pass `listTests` and `runTests`
|
|
3723
|
+
and the command works; omit either and it has nothing to run.
|
|
3724
|
+
`runTests(selection, onEvent)` returns a handle whose `cancel()` must
|
|
3725
|
+
really stop the run, and it must deliver exactly one `done` event however
|
|
3726
|
+
the run ends — including when the request never opened — or the card spins
|
|
3727
|
+
forever. `canRunTests` (a viewer: false) and `testsAvailable` (the
|
|
3728
|
+
environment is up) each disable the run controls and state their own
|
|
3729
|
+
reason in the card. The RUN is owned by `ChatPanel`, not the card, so it
|
|
3730
|
+
keeps streaming while the overlay is closed. `/test all` runs everything;
|
|
3731
|
+
any other argument only filters the list.
|
|
3732
|
+
- **End-to-end specs are meant to run against the LIVE PREVIEW.** The host
|
|
3733
|
+
should drive them through `@molecule/app-e2e-preview` (what every
|
|
3734
|
+
`mlcl create` app already bonds in `e2e/bonds.ts`), not a browser binary —
|
|
3735
|
+
in a sandbox there is none. That bond drives the page the person is
|
|
3736
|
+
actually looking at, so **a preview must be open** somewhere or the driver
|
|
3737
|
+
waits and fails; the card says so next to the end-to-end group.
|
|
3235
3738
|
- Text routes through `t('ide.*')` — `@molecule/app-locales-ide` supplies
|
|
3236
3739
|
translations.
|
|
3237
3740
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-metadata.d.ts","sourceRoot":"","sources":["../src/command-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,uEAAuE;AACvE,MAAM,MAAM,kBAAkB,GAC5B,SAAS,GAAG,MAAM,GAAG,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAA;AAEvE,iDAAiD;AACjD,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,GAAG,EAAE,kBAAkB,CAAA;IACvB,qFAAqF;IACrF,KAAK,EAAE,MAAM,CAAA;CACd;AAED,mEAAmE;AACnE,eAAO,MAAM,kBAAkB,EAAE,SAAS,eAAe,EAO/C,CAAA;AAEV,kDAAkD;AAClD,MAAM,WAAW,UAAU;IACzB,4DAA4D;IAC5D,EAAE,EAAE,MAAM,CAAA;IACV,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAA;IACb;;;;;OAKG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB,8CAA8C;IAC9C,QAAQ,EAAE,kBAAkB,CAAA;IAC5B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED;;;;GAIG;AACH,eAAO,MAAM,QAAQ,EAAE,SAAS,UAAU,
|
|
1
|
+
{"version":3,"file":"command-metadata.d.ts","sourceRoot":"","sources":["../src/command-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,uEAAuE;AACvE,MAAM,MAAM,kBAAkB,GAC5B,SAAS,GAAG,MAAM,GAAG,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAA;AAEvE,iDAAiD;AACjD,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,GAAG,EAAE,kBAAkB,CAAA;IACvB,qFAAqF;IACrF,KAAK,EAAE,MAAM,CAAA;CACd;AAED,mEAAmE;AACnE,eAAO,MAAM,kBAAkB,EAAE,SAAS,eAAe,EAO/C,CAAA;AAEV,kDAAkD;AAClD,MAAM,WAAW,UAAU;IACzB,4DAA4D;IAC5D,EAAE,EAAE,MAAM,CAAA;IACV,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAA;IACb;;;;;OAKG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB,8CAA8C;IAC9C,QAAQ,EAAE,kBAAkB,CAAA;IAC5B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED;;;;GAIG;AACH,eAAO,MAAM,QAAQ,EAAE,SAAS,UAAU,EA0MhC,CAAA;AAEV,4FAA4F;AAC5F,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;AAExC,6DAA6D;AAC7D,MAAM,WAAW,YAAY;IAC3B,2CAA2C;IAC3C,QAAQ,EAAE,eAAe,CAAA;IACzB,oDAAoD;IACpD,QAAQ,EAAE,UAAU,EAAE,CAAA;CACvB;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,GAAE,SAAS,UAAU,EAAa,EAC1C,UAAU,GAAE,SAAS,eAAe,EAAuB,GAC1D,YAAY,EAAE,CAOhB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,SAAS,UAAU,EAAE,GAAG,SAAS,EACvC,IAAI,EAAE,MAAM,GACX,OAAO,CAST"}
|
package/dist/command-metadata.js
CHANGED
|
@@ -72,9 +72,14 @@ export const COMMANDS = [
|
|
|
72
72
|
{
|
|
73
73
|
id: 'test',
|
|
74
74
|
label: '/test',
|
|
75
|
-
description:
|
|
75
|
+
description: "List and run the project's tests",
|
|
76
76
|
category: 'code',
|
|
77
|
-
usage: '/test [
|
|
77
|
+
usage: '/test [query | all]',
|
|
78
|
+
aliases: ['tests'],
|
|
79
|
+
// Listing is a read (the platform serves it to viewers too); RUNNING is an
|
|
80
|
+
// editor action, refused by the server and disabled in the card with its
|
|
81
|
+
// reason shown. So a viewer opens the browser and sees what is tested.
|
|
82
|
+
viewerSafe: true,
|
|
78
83
|
},
|
|
79
84
|
{
|
|
80
85
|
id: 'undo',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-metadata.js","sourceRoot":"","sources":["../src/command-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAcH,mEAAmE;AACnE,MAAM,CAAC,MAAM,kBAAkB,GAA+B;IAC5D,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;IACpC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;IAC9B,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE;IAC5C,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;IAChC,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;IACtC,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;CAC5B,CAAA;AAmDV;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAA0B;IAC7C,UAAU;IACV,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE,QAAQ,EAAE,SAAS,EAAE;IACxF;QACE,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,gCAAgC;QAC7C,QAAQ,EAAE,SAAS;KACpB;IACD;QACE,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,wDAAwD;QACrE,QAAQ,EAAE,SAAS;QACnB,UAAU,EAAE,IAAI;KACjB;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,8BAA8B;QAC3C,QAAQ,EAAE,SAAS;QACnB,KAAK,EAAE,iBAAiB;KACzB;IAED,OAAO;IACP,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,wBAAwB,EAAE,QAAQ,EAAE,MAAM,EAAE;IAC3F;QACE,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,oCAAoC;QACjD,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,0BAA0B;KAClC;IACD;QACE,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,2BAA2B;QACxC,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,cAAc;KACtB;IACD;QACE,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"command-metadata.js","sourceRoot":"","sources":["../src/command-metadata.ts"],"names":[],"mappings":"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"}
|