@molecule/app-ide-react 1.19.8 → 1.19.10
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatPanel.d.ts","sourceRoot":"","sources":["../../src/components/ChatPanel.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ChatPanel.d.ts","sourceRoot":"","sources":["../../src/components/ChatPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1111,7 +1111,17 @@ const MessageItem = memo(function MessageItem(props) {
|
|
|
1111
1111
|
// 16px so the glyph reads at the username's optical size — the
|
|
1112
1112
|
// people glyph has internal viewBox padding, so a nominal 14px
|
|
1113
1113
|
// renders visibly smaller than the 14px text next to it.
|
|
1114
|
-
name: "people", size: 16, "aria-hidden": "true", style: { color: NOTICE_TONE.gold.accent } }) })),
|
|
1114
|
+
name: "people", size: 16, "aria-hidden": "true", style: { color: NOTICE_TONE.gold.accent } }) })), isUser && msg.viaDictation && (_jsx("span", { title: t('ide.chat.viaDictation.badge', undefined, {
|
|
1115
|
+
defaultValue: 'Dictated by voice',
|
|
1116
|
+
}), "aria-label": t('ide.chat.viaDictation.badge', undefined, {
|
|
1117
|
+
defaultValue: 'Dictated by voice',
|
|
1118
|
+
}), style: {
|
|
1119
|
+
display: 'inline-flex',
|
|
1120
|
+
alignSelf: 'center',
|
|
1121
|
+
flexShrink: 0,
|
|
1122
|
+
position: 'relative',
|
|
1123
|
+
top: -0.5,
|
|
1124
|
+
}, "data-mol-id": "chat-dictated-badge", children: _jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 16 16", width: "16", height: "16", style: { display: 'block', color: isLight ? '#cf222e' : '#f85149' }, "aria-hidden": "true", children: [_jsx("rect", { x: "6", y: "1", width: "4", height: "8", rx: "2", fill: "currentColor" }), _jsx("path", { d: "M4 7v1a4 4 0 008 0V7", fill: "none", stroke: "currentColor", strokeWidth: "1.25", strokeLinecap: "round" }), _jsx("line", { x1: "8", y1: "12", x2: "8", y2: "15", stroke: "currentColor", strokeWidth: "1.25", strokeLinecap: "round" }), _jsx("line", { x1: "6", y1: "15", x2: "10", y2: "15", stroke: "currentColor", strokeWidth: "1.25", strokeLinecap: "round" })] }) })), showTimestamp && typeof msg.timestamp === 'number' && (_jsx(ChatTimestamp, { timestamp: msg.timestamp }))] })), _jsx(CollapsibleUserMessage, { content: msg.content, isLight: isLight }), msg.attachments && msg.attachments.length > 0 && (_jsx("div", { style: { marginTop: 4, display: 'flex', gap: 4, flexWrap: 'wrap' }, children: msg.attachments.map((att, ai) => (_jsxs("span", { className: cm.cn(cm.textMuted, cm.textSize('xs')), style: { display: 'inline-flex', alignItems: 'center', gap: 2 }, children: [att.mediaType.startsWith('image/')
|
|
1115
1125
|
? '\uD83D\uDDBC\uFE0F'
|
|
1116
1126
|
: att.mediaType.startsWith('audio/')
|
|
1117
1127
|
? '\uD83C\uDFB5'
|
|
@@ -1747,6 +1757,20 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
1747
1757
|
})());
|
|
1748
1758
|
const [hasInput, setHasInput] = useState(() => Boolean(inputRef.current));
|
|
1749
1759
|
const textareaRef = useRef(null);
|
|
1760
|
+
// Transcripts the mic button's dictation inserted into the CURRENT draft —
|
|
1761
|
+
// one entry per final result, pruned on every draft edit so deleting the
|
|
1762
|
+
// dictated text (or clearing the composer by any path) un-marks it. At
|
|
1763
|
+
// submit, a send whose text still carries any entry is flagged
|
|
1764
|
+
// `viaDictation`: the mic badge in the conversation history.
|
|
1765
|
+
const dictatedSnippetsRef = useRef([]);
|
|
1766
|
+
/** Drop transcripts no longer present in the draft (called on every edit). */
|
|
1767
|
+
const pruneDictatedSnippets = useCallback(() => {
|
|
1768
|
+
const snippets = dictatedSnippetsRef.current;
|
|
1769
|
+
if (snippets.length === 0)
|
|
1770
|
+
return;
|
|
1771
|
+
const value = inputRef.current;
|
|
1772
|
+
dictatedSnippetsRef.current = value ? snippets.filter((s) => value.includes(s)) : [];
|
|
1773
|
+
}, []);
|
|
1750
1774
|
/** Auto-resize the textarea to fit its content (max 200px). */
|
|
1751
1775
|
const autoResize = useCallback(() => {
|
|
1752
1776
|
const ta = textareaRef.current;
|
|
@@ -1783,6 +1807,7 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
1783
1807
|
/** Update the ref, the DOM element, and the hasInput flag without re-rendering the parent. */
|
|
1784
1808
|
const setInputValue = useCallback((val) => {
|
|
1785
1809
|
inputRef.current = val;
|
|
1810
|
+
pruneDictatedSnippets();
|
|
1786
1811
|
const ta = textareaRef.current;
|
|
1787
1812
|
if (ta && ta.value !== val)
|
|
1788
1813
|
ta.value = val;
|
|
@@ -1800,7 +1825,7 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
1800
1825
|
/* sessionStorage unavailable — safe to ignore, draft simply persists */
|
|
1801
1826
|
}
|
|
1802
1827
|
}
|
|
1803
|
-
}, [draftKey, autoResize, canEdit]);
|
|
1828
|
+
}, [draftKey, autoResize, canEdit, pruneDictatedSnippets]);
|
|
1804
1829
|
// Persist draft text to sessionStorage so it survives refresh (debounced)
|
|
1805
1830
|
const draftTimerRef = useRef(null);
|
|
1806
1831
|
const persistDraft = useCallback(() => {
|
|
@@ -1935,6 +1960,7 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
1935
1960
|
return;
|
|
1936
1961
|
const prev = inputRef.current;
|
|
1937
1962
|
setInputValue(prev ? `${prev} ${event.transcript}` : event.transcript);
|
|
1963
|
+
dictatedSnippetsRef.current.push(event.transcript);
|
|
1938
1964
|
autoResize();
|
|
1939
1965
|
},
|
|
1940
1966
|
onStateChange: (state) => {
|
|
@@ -2052,6 +2078,7 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
2052
2078
|
if (transcript) {
|
|
2053
2079
|
const prev = inputRef.current;
|
|
2054
2080
|
setInputValue(prev ? `${prev} ${transcript}` : transcript);
|
|
2081
|
+
dictatedSnippetsRef.current.push(transcript);
|
|
2055
2082
|
autoResize();
|
|
2056
2083
|
}
|
|
2057
2084
|
};
|
|
@@ -3912,6 +3939,7 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
3912
3939
|
const handleInputChange = useCallback((e) => {
|
|
3913
3940
|
const val = e.target.value;
|
|
3914
3941
|
inputRef.current = val;
|
|
3942
|
+
pruneDictatedSnippets();
|
|
3915
3943
|
setHasInput(Boolean(val.trim()));
|
|
3916
3944
|
autoResize();
|
|
3917
3945
|
persistDraft();
|
|
@@ -3964,7 +3992,7 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
3964
3992
|
else {
|
|
3965
3993
|
setCommandMenu(null);
|
|
3966
3994
|
}
|
|
3967
|
-
}, [openFilePicker, autoResize, persistDraft, liveModelMode]);
|
|
3995
|
+
}, [openFilePicker, autoResize, persistDraft, liveModelMode, pruneDictatedSnippets]);
|
|
3968
3996
|
// ── Execute command ────────────────────────────────────────────────────────
|
|
3969
3997
|
/** Sets textarea value and moves cursor to the end. */
|
|
3970
3998
|
const setInputAndCursorEnd = useCallback((val) => {
|
|
@@ -4991,10 +5019,17 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
4991
5019
|
}
|
|
4992
5020
|
}
|
|
4993
5021
|
}
|
|
5022
|
+
// A send still carrying dictated text — any mic-button transcript survived
|
|
5023
|
+
// the live prune — is flagged `viaDictation` so history badges it with the
|
|
5024
|
+
// mic. Checked against the FINAL text (after /explain etc. rewrites it, the
|
|
5025
|
+
// synthesized prompt is not what was dictated, so no badge). The list is
|
|
5026
|
+
// consumed here; setInputValue('') below prunes it anyway.
|
|
5027
|
+
const viaDictation = dictatedSnippetsRef.current.some((s) => message.includes(s));
|
|
5028
|
+
dictatedSnippetsRef.current = [];
|
|
4994
5029
|
setInputValue('');
|
|
4995
5030
|
setAttachedFiles([]);
|
|
4996
5031
|
setAttachmentError(null);
|
|
4997
|
-
sendMessage(message, chatAttachments.length > 0 ? chatAttachments : undefined);
|
|
5032
|
+
sendMessage(message, chatAttachments.length > 0 ? chatAttachments : undefined, viaDictation ? { viaDictation: true } : undefined);
|
|
4998
5033
|
}, [
|
|
4999
5034
|
applyTimestampsVisible,
|
|
5000
5035
|
attachedFiles,
|
|
@@ -5503,7 +5538,13 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
5503
5538
|
const ta = textareaRef.current;
|
|
5504
5539
|
if (!ta)
|
|
5505
5540
|
return;
|
|
5506
|
-
|
|
5541
|
+
// A key that is part of an IME composition (Enter accepting a Japanese, Chinese or Korean
|
|
5542
|
+
// candidate) must reach the input method, not send the message.
|
|
5543
|
+
const handler = (e) => {
|
|
5544
|
+
if (e.isComposing || e.keyCode === 229)
|
|
5545
|
+
return;
|
|
5546
|
+
keyDownRef.current(e);
|
|
5547
|
+
};
|
|
5507
5548
|
ta.addEventListener('keydown', handler);
|
|
5508
5549
|
return () => ta.removeEventListener('keydown', handler);
|
|
5509
5550
|
}, []);
|
|
@@ -5913,7 +5954,13 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
5913
5954
|
background: themeMode === 'dark' ? 'rgba(255,255,255,0.9)' : 'rgba(0,0,0,0.75)',
|
|
5914
5955
|
color: themeMode === 'dark' ? '#1a1a1a' : '#fff',
|
|
5915
5956
|
boxShadow: '0 2px 12px rgba(0,0,0,0.2)',
|
|
5916
|
-
}, children: t('ide.chat.dropFilesHere', undefined, { defaultValue: 'Drop files here' }) }) })), _jsxs("div", { ref: messagesContainerRef,
|
|
5957
|
+
}, children: t('ide.chat.dropFilesHere', undefined, { defaultValue: 'Drop files here' }) }) })), _jsxs("div", { ref: messagesContainerRef,
|
|
5958
|
+
// A live log: a new message or card is announced as it is added. `additions` only, so a
|
|
5959
|
+
// reply that is still streaming (text changing inside an existing node) is not read out
|
|
5960
|
+
// token by token.
|
|
5961
|
+
role: "log", "aria-live": "polite", "aria-relevant": "additions", "aria-label": t('ide.chat.messagesLabel', undefined, {
|
|
5962
|
+
defaultValue: 'Conversation messages',
|
|
5963
|
+
}), className: cm.sp('p', 3),
|
|
5917
5964
|
// Symmetric padding on all four sides (P3-04) — the old asymmetric pr-1 hack
|
|
5918
5965
|
// is gone. No scrollbar-gutter:stable reservation (it made the right padding
|
|
5919
5966
|
// visibly larger than the left); the thin scrollbar just overlays when the
|
|
@@ -7575,7 +7622,7 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
7575
7622
|
if (!e.target.closest('button')) {
|
|
7576
7623
|
textareaRef.current?.focus();
|
|
7577
7624
|
}
|
|
7578
|
-
}, children: [_jsx("textarea", { ref: textareaRef, "data-mol-chat-input": "", defaultValue: inputRef.current, autoComplete: "off", onChange: handleInputChange, onPaste: handlePaste, placeholder: canEdit === false
|
|
7625
|
+
}, children: [_jsx("textarea", { ref: textareaRef, "data-mol-chat-input": "", "aria-label": t('ide.chat.inputLabel', undefined, { defaultValue: 'Write a message' }), defaultValue: inputRef.current, autoComplete: "off", onChange: handleInputChange, onPaste: handlePaste, placeholder: canEdit === false
|
|
7579
7626
|
? t('ide.chat.placeholderViewer', undefined, {
|
|
7580
7627
|
defaultValue: 'Message your team',
|
|
7581
7628
|
})
|
|
@@ -7900,7 +7947,7 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
7900
7947
|
display: 'flex',
|
|
7901
7948
|
gap: '4px',
|
|
7902
7949
|
alignItems: 'center',
|
|
7903
|
-
}, children: [canEdit !== false && (isLoading || isRemoteStreaming) && (_jsx("button", { type: "button", "data-mol-id": "chat-stop-button", onClick: handleAbort, title: t('ide.chat.stop', undefined, { defaultValue: 'Stop' }),
|
|
7950
|
+
}, children: [canEdit !== false && (isLoading || isRemoteStreaming) && (_jsx("button", { type: "button", "data-mol-id": "chat-stop-button", onClick: handleAbort, title: t('ide.chat.stop', undefined, { defaultValue: 'Stop' }), "aria-label": t('ide.chat.stop', undefined, { defaultValue: 'Stop' }),
|
|
7904
7951
|
// The composer's two action buttons (Stop, Send) are design-system
|
|
7905
7952
|
// buttons in the ERROR and PRIMARY semantics — same radius, height
|
|
7906
7953
|
// and states as every other action button in the panel. They were a
|
|
@@ -7913,7 +7960,7 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
7913
7960
|
// NOT cm.touchTargetCompact — a 36px floor would out-grow the
|
|
7914
7961
|
// neighbouring icon buttons.
|
|
7915
7962
|
...(isCoarse ? { minWidth: 40, minHeight: 32 } : {}),
|
|
7916
|
-
}, children: _jsx("svg", { width: "12", height: "12", viewBox: "0 0 12 12", style: { display: 'block' }, children: _jsx("rect", { x: "2", y: "2", width: "8", height: "8", rx: "1.5", fill: "currentColor" }) }) })), _jsx("button", { type: "button", "data-mol-id": "chat-send-button", onClick: () => void handleSubmit(), title: t('ide.chat.send', undefined, { defaultValue: 'Send' }), disabled: !hasInput && attachedFiles.length === 0,
|
|
7963
|
+
}, children: _jsx("svg", { width: "12", height: "12", viewBox: "0 0 12 12", style: { display: 'block' }, children: _jsx("rect", { x: "2", y: "2", width: "8", height: "8", rx: "1.5", fill: "currentColor" }) }) })), _jsx("button", { type: "button", "data-mol-id": "chat-send-button", onClick: () => void handleSubmit(), title: t('ide.chat.send', undefined, { defaultValue: 'Send' }), "aria-label": t('ide.chat.send', undefined, { defaultValue: 'Send' }), disabled: !hasInput && attachedFiles.length === 0,
|
|
7917
7964
|
// Stop's twin in the PRIMARY semantic. The real `disabled`
|
|
7918
7965
|
// attribute above carries the muted/inert look via the CVA
|
|
7919
7966
|
// (`disabled:opacity-50 disabled:pointer-events-none`), so the
|