@molecule/app-ide-react 1.14.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.
- package/README.md +75 -1
- package/dist/components/ChatPanel.d.ts.map +1 -1
- package/dist/components/ChatPanel.js +38 -3
- package/dist/components/ChatPanel.js.map +1 -1
- package/dist/components/TestsCard.d.ts +13 -2
- package/dist/components/TestsCard.d.ts.map +1 -1
- package/dist/components/TestsCard.js +83 -21
- package/dist/components/TestsCard.js.map +1 -1
- package/dist/components/tests-card-utilities.d.ts +30 -0
- package/dist/components/tests-card-utilities.d.ts.map +1 -1
- package/dist/components/tests-card-utilities.js +71 -0
- package/dist/components/tests-card-utilities.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-15T18:15:48.521Z
|
|
7
7
|
-->
|
|
8
8
|
|
|
9
9
|
# @molecule/app-ide-react
|
|
@@ -1470,6 +1470,17 @@ interface TabBarProps {
|
|
|
1470
1470
|
}
|
|
1471
1471
|
```
|
|
1472
1472
|
|
|
1473
|
+
#### `TestFailure`
|
|
1474
|
+
|
|
1475
|
+
One failing test and the output that explains it.
|
|
1476
|
+
|
|
1477
|
+
```typescript
|
|
1478
|
+
interface TestFailure {
|
|
1479
|
+
item: TestItem
|
|
1480
|
+
output?: string | undefined
|
|
1481
|
+
}
|
|
1482
|
+
```
|
|
1483
|
+
|
|
1473
1484
|
#### `TestGroup`
|
|
1474
1485
|
|
|
1475
1486
|
One rendered group of rows: a kind within a project directory.
|
|
@@ -1580,6 +1591,17 @@ interface TestsCardProps {
|
|
|
1580
1591
|
onRun: (selection: TestSelection) => void
|
|
1581
1592
|
/** Stops the run in flight. */
|
|
1582
1593
|
onCancel: () => void
|
|
1594
|
+
/**
|
|
1595
|
+
* Hands the failing tests to the agent as ONE chat message — a real turn it
|
|
1596
|
+
* answers, exactly like the editor’s “Fix with AI”.
|
|
1597
|
+
*/
|
|
1598
|
+
onFix: (failures: TestFailure[]) => void
|
|
1599
|
+
/**
|
|
1600
|
+
* Why fixing is unavailable (a viewer, a turn already streaming), already
|
|
1601
|
+
* translated by the host — `null` when it is available. The card states the
|
|
1602
|
+
* reason on the disabled button rather than letting a click do nothing.
|
|
1603
|
+
*/
|
|
1604
|
+
fixDisabledReason: string | null
|
|
1583
1605
|
/** Light theme (drives the same row border + field inset the sibling cards use). */
|
|
1584
1606
|
isLight: boolean
|
|
1585
1607
|
/** Chrome-less inside the command overlay; full card chrome in the timeline. */
|
|
@@ -2139,6 +2161,23 @@ function buildShareUrl(result: ShareLinkResult, origin: string): string
|
|
|
2139
2161
|
|
|
2140
2162
|
**Returns:** The absolute, copyable share URL.
|
|
2141
2163
|
|
|
2164
|
+
#### `buildTestFixMessage(failures)`
|
|
2165
|
+
|
|
2166
|
+
Compose the ONE user message the card's “Fix with Synthase” action sends.
|
|
2167
|
+
|
|
2168
|
+
It is a real turn the executor answers, so it reads like something a person
|
|
2169
|
+
would type: which test failed, where it lives, what the runner said, and to
|
|
2170
|
+
re-run it. This is a PROMPT, not UI copy — it is not translated, exactly like
|
|
2171
|
+
the auto-fix loop’s own `Fix these issues:` message.
|
|
2172
|
+
|
|
2173
|
+
```typescript
|
|
2174
|
+
function buildTestFixMessage(failures: readonly TestFailure[]): string
|
|
2175
|
+
```
|
|
2176
|
+
|
|
2177
|
+
- `failures` — The failing tests, in the order the card lists them.
|
|
2178
|
+
|
|
2179
|
+
**Returns:** The message, or `` when there is nothing to fix.
|
|
2180
|
+
|
|
2142
2181
|
#### `ChatPanel(props)`
|
|
2143
2182
|
|
|
2144
2183
|
AI chat panel with conversation history dropdown and Claude Code-style tool display.
|
|
@@ -2352,6 +2391,23 @@ function EditorPanel({
|
|
|
2352
2391
|
|
|
2353
2392
|
**Returns:** The rendered editor panel element.
|
|
2354
2393
|
|
|
2394
|
+
#### `failedTests(tests, results)`
|
|
2395
|
+
|
|
2396
|
+
Every listed test whose last verdict was a failure, with its output — what
|
|
2397
|
+
the card's fix actions send.
|
|
2398
|
+
|
|
2399
|
+
```typescript
|
|
2400
|
+
function failedTests(
|
|
2401
|
+
tests: readonly TestItem[],
|
|
2402
|
+
results: Record<string, TestResultEntry>,
|
|
2403
|
+
): TestFailure[]
|
|
2404
|
+
```
|
|
2405
|
+
|
|
2406
|
+
- `tests` — The currently listed (and filtered) tests.
|
|
2407
|
+
- `results` — The per-id outcomes.
|
|
2408
|
+
|
|
2409
|
+
**Returns:** The failures, in list order.
|
|
2410
|
+
|
|
2355
2411
|
#### `failRun(state, message)`
|
|
2356
2412
|
|
|
2357
2413
|
The state after a run that never produced a `done` event — the host's stream
|
|
@@ -3235,6 +3291,8 @@ function TestsCard({
|
|
|
3235
3291
|
canRun,
|
|
3236
3292
|
onRun,
|
|
3237
3293
|
onCancel,
|
|
3294
|
+
onFix,
|
|
3295
|
+
fixDisabledReason,
|
|
3238
3296
|
isLight,
|
|
3239
3297
|
embedded,
|
|
3240
3298
|
}: TestsCardProps): JSX.Element
|
|
@@ -3524,6 +3582,22 @@ Maximum avatar source length we will render inline (~256 KB data-URI).
|
|
|
3524
3582
|
const MAX_AVATAR_SRC_LENGTH: 262144
|
|
3525
3583
|
```
|
|
3526
3584
|
|
|
3585
|
+
#### `MAX_FIX_MESSAGE_OUTPUT_CHARS`
|
|
3586
|
+
|
|
3587
|
+
Total output kept across a batched fix message, so one click cannot send a novel.
|
|
3588
|
+
|
|
3589
|
+
```typescript
|
|
3590
|
+
const MAX_FIX_MESSAGE_OUTPUT_CHARS: 12000
|
|
3591
|
+
```
|
|
3592
|
+
|
|
3593
|
+
#### `MAX_FIX_OUTPUT_CHARS`
|
|
3594
|
+
|
|
3595
|
+
Output kept per failure when several are batched into one fix message.
|
|
3596
|
+
|
|
3597
|
+
```typescript
|
|
3598
|
+
const MAX_FIX_OUTPUT_CHARS: 2000
|
|
3599
|
+
```
|
|
3600
|
+
|
|
3527
3601
|
#### `MAX_OUTPUT_LINES`
|
|
3528
3602
|
|
|
3529
3603
|
Live output lines retained — enough to read, bounded so a chatty run cannot grow forever.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatPanel.d.ts","sourceRoot":"","sources":["../../src/components/ChatPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAa,MAAM,OAAO,CAAA;AAY3C,OAAO,KAAK,EAAa,WAAW,EAAmB,MAAM,uBAAuB,CAAA;AAwCpF,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,eAAe,EAIhB,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAevD,OAAO,EAEL,KAAK,UAAU,EAGhB,MAAM,oBAAoB,CAAA;AAY3B,OAAO,KAAK,EAAsB,SAAS,EAAE,MAAM,gCAAgC,CAAA;
|
|
1
|
+
{"version":3,"file":"ChatPanel.d.ts","sourceRoot":"","sources":["../../src/components/ChatPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -44,7 +44,7 @@ import { SettingsCard } from './SettingsCard.js';
|
|
|
44
44
|
import { ShareModal } from './ShareModal.js';
|
|
45
45
|
import { SkillsCard } from './SkillsCard.js';
|
|
46
46
|
import { StreamingIndicator } from './StreamingIndicator.js';
|
|
47
|
-
import { applyTestRunEvent, EMPTY_RUN_STATE, failRun, parseTestCommand, } from './tests-card-utilities.js';
|
|
47
|
+
import { applyTestRunEvent, buildTestFixMessage, EMPTY_RUN_STATE, failRun, parseTestCommand, } from './tests-card-utilities.js';
|
|
48
48
|
import { TestsCard } from './TestsCard.js';
|
|
49
49
|
import { TipCard } from './TipCard.js';
|
|
50
50
|
import { ToolCallCard } from './ToolCallCard.js';
|
|
@@ -2641,6 +2641,8 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
2641
2641
|
// would eventually capture stale.
|
|
2642
2642
|
const testsRunningRef = useRef(false);
|
|
2643
2643
|
testsRunningRef.current = testsRun.running;
|
|
2644
|
+
// Whether a TURN is in flight — a fix is a real message, so it waits its turn.
|
|
2645
|
+
const testsBusyRef = useRef(false);
|
|
2644
2646
|
// Live for the async callbacks, so a list resolving after an unmount, or a
|
|
2645
2647
|
// run event arriving then, never sets state on a dead tree.
|
|
2646
2648
|
const testsMountedRef = useRef(true);
|
|
@@ -2721,6 +2723,21 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
2721
2723
|
})));
|
|
2722
2724
|
}
|
|
2723
2725
|
}, [runTests, canRunTests, canEdit, testsAvailable, refreshTests]);
|
|
2726
|
+
// Hand the failing tests to the agent as ONE ordinary user message — the same
|
|
2727
|
+
// move as the editor’s "Fix with AI" and the auto-fix loop: compose the
|
|
2728
|
+
// problem, send it through the normal path, let the turn answer. The overlay
|
|
2729
|
+
// closes so the person watches the turn they just started.
|
|
2730
|
+
const fixTests = useCallback((failures) => {
|
|
2731
|
+
if (canEdit === false || failures.length === 0)
|
|
2732
|
+
return;
|
|
2733
|
+
if (testsBusyRef.current)
|
|
2734
|
+
return;
|
|
2735
|
+
const message = buildTestFixMessage(failures);
|
|
2736
|
+
if (!message)
|
|
2737
|
+
return;
|
|
2738
|
+
setPanelOverlay(null);
|
|
2739
|
+
sendMessageRef.current(message);
|
|
2740
|
+
}, [canEdit]);
|
|
2724
2741
|
const cancelTestsRun = useCallback(() => {
|
|
2725
2742
|
testsRunHandleRef.current?.cancel();
|
|
2726
2743
|
testsRunHandleRef.current = null;
|
|
@@ -3144,6 +3161,8 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
3144
3161
|
// last file change and the turn's end, never mid-turn.
|
|
3145
3162
|
const autoCommitArmed = isAutoCommitArmed(autoCommit);
|
|
3146
3163
|
const autoCommitHeld = isLoading || isRemoteStreaming || autoFixCountdown !== null;
|
|
3164
|
+
// Keep the tests-card fix gate live (declared above, where the run state is).
|
|
3165
|
+
testsBusyRef.current = isLoading || isRemoteStreaming;
|
|
3147
3166
|
useEffect(() => {
|
|
3148
3167
|
if (!autoCommitArmed || autoCommitHeld)
|
|
3149
3168
|
return;
|
|
@@ -5823,7 +5842,15 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
5823
5842
|
return (_jsx(ScriptsCard, { projectId: projectId, initialQuery: item.card.query ?? '', isLight: isLight, agentName: agentName }, item.card.id));
|
|
5824
5843
|
}
|
|
5825
5844
|
if (item.card.variant === 'tests') {
|
|
5826
|
-
return (_jsx(TestsCard, { tests: testsList, status: testsStatus, run: testsRun, initialQuery: item.card.query ?? '', canRun: (canRunTests ?? canEdit !== false) && canEdit !== false, onRun: startTestsRun, onCancel: cancelTestsRun,
|
|
5845
|
+
return (_jsx(TestsCard, { tests: testsList, status: testsStatus, run: testsRun, initialQuery: item.card.query ?? '', canRun: (canRunTests ?? canEdit !== false) && canEdit !== false, onRun: startTestsRun, onCancel: cancelTestsRun, onFix: fixTests, fixDisabledReason: canEdit === false
|
|
5846
|
+
? t('ide.tests.viewerCannotRun', undefined, {
|
|
5847
|
+
defaultValue: 'Only editors can run this project’s tests.',
|
|
5848
|
+
})
|
|
5849
|
+
: isLoading || isRemoteStreaming
|
|
5850
|
+
? t('ide.tests.fixBusy', undefined, {
|
|
5851
|
+
defaultValue: 'Wait for the current turn to finish.',
|
|
5852
|
+
})
|
|
5853
|
+
: null, isLight: isLight }, item.card.id));
|
|
5827
5854
|
}
|
|
5828
5855
|
if (item.card.variant === 'help') {
|
|
5829
5856
|
// The plan/upgrade blurb is app-specific (pricing, plan names), so the
|
|
@@ -7061,7 +7088,15 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
7061
7088
|
minHeight: 36,
|
|
7062
7089
|
}
|
|
7063
7090
|
: {}),
|
|
7064
|
-
}, children: '✕' })] }), _jsxs("div", { style: { overflowY: 'auto', flex: 1 }, children: [panelOverlay === 'settings' && (_jsx(SettingsCard, { settings: computeSettingsList(), onRunCommand: (commandId) => void executeCommand(commandId), onPrefillInput: (input) => setInputAndCursorEnd(`${input} `), isLight: isLight, agentName: agentName, embedded: true })), panelOverlay === 'skills' && (_jsx(SkillsCard, { projectId: projectId, initialQuery: panelOverlayQuery, onLoad: loadSkill, onCreate: createSkill, loadedSkillPaths: loadedSkillPaths, defaultSkillPaths: defaultSkillPaths, onToggleDefault: toggleDefaultSkill, onResetDefault: resetDefaultSkills, defaultsExplicit: defaultSkillsExplicitRef.current, isLight: isLight, embedded: true })), panelOverlay === 'scripts' && (_jsx(ScriptsCard, { projectId: projectId, initialQuery: panelOverlayQuery, isLight: isLight, agentName: agentName, embedded: true })), panelOverlay === 'tests' && (_jsx(TestsCard, { tests: testsList, status: testsStatus, run: testsRun, initialQuery: panelOverlayQuery, canRun: (canRunTests ?? canEdit !== false) && canEdit !== false, onRun: startTestsRun, onCancel: cancelTestsRun,
|
|
7091
|
+
}, children: '✕' })] }), _jsxs("div", { style: { overflowY: 'auto', flex: 1 }, children: [panelOverlay === 'settings' && (_jsx(SettingsCard, { settings: computeSettingsList(), onRunCommand: (commandId) => void executeCommand(commandId), onPrefillInput: (input) => setInputAndCursorEnd(`${input} `), isLight: isLight, agentName: agentName, embedded: true })), panelOverlay === 'skills' && (_jsx(SkillsCard, { projectId: projectId, initialQuery: panelOverlayQuery, onLoad: loadSkill, onCreate: createSkill, loadedSkillPaths: loadedSkillPaths, defaultSkillPaths: defaultSkillPaths, onToggleDefault: toggleDefaultSkill, onResetDefault: resetDefaultSkills, defaultsExplicit: defaultSkillsExplicitRef.current, isLight: isLight, embedded: true })), panelOverlay === 'scripts' && (_jsx(ScriptsCard, { projectId: projectId, initialQuery: panelOverlayQuery, isLight: isLight, agentName: agentName, embedded: true })), panelOverlay === 'tests' && (_jsx(TestsCard, { tests: testsList, status: testsStatus, run: testsRun, initialQuery: panelOverlayQuery, canRun: (canRunTests ?? canEdit !== false) && canEdit !== false, onRun: startTestsRun, onCancel: cancelTestsRun, onFix: fixTests, fixDisabledReason: canEdit === false
|
|
7092
|
+
? t('ide.tests.viewerCannotRun', undefined, {
|
|
7093
|
+
defaultValue: 'Only editors can run this project’s tests.',
|
|
7094
|
+
})
|
|
7095
|
+
: isLoading || isRemoteStreaming
|
|
7096
|
+
? t('ide.tests.fixBusy', undefined, {
|
|
7097
|
+
defaultValue: 'Wait for the current turn to finish.',
|
|
7098
|
+
})
|
|
7099
|
+
: null, isLight: isLight, embedded: true }))] })] })), filePicker &&
|
|
7065
7100
|
filteredEntries.length > 0 &&
|
|
7066
7101
|
(() => {
|
|
7067
7102
|
const normalizeTabPath = (p) => p.startsWith('/workspace/')
|