@iblai/web-containers 1.47.0 → 1.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/canvas/canvas-export-handlers.js +3 -1
- package/dist/cjs/components/canvas/canvas-export-handlers.js.map +1 -1
- package/dist/cjs/components/chat/ai-message-bubble.js +1 -1
- package/dist/cjs/components/chat/ai-message-bubble.js.map +1 -1
- package/dist/cjs/components/chat/ai-message-download.js +4 -40
- package/dist/cjs/components/chat/ai-message-download.js.map +1 -1
- package/dist/cjs/components/chat/chat-download-dialog.js +146 -0
- package/dist/cjs/components/chat/chat-download-dialog.js.map +1 -0
- package/dist/cjs/components/chat/chat-export.js +63 -0
- package/dist/cjs/components/chat/chat-export.js.map +1 -0
- package/dist/cjs/components/chat/chat-host-context.js.map +1 -1
- package/dist/cjs/components/chat/chat-transcript.js +14 -9
- package/dist/cjs/components/chat/chat-transcript.js.map +1 -1
- package/dist/cjs/components/chat/code-permission-card.js +38 -1
- package/dist/cjs/components/chat/code-permission-card.js.map +1 -1
- package/dist/cjs/components/chat/use-whole-chat.js +67 -0
- package/dist/cjs/components/chat/use-whole-chat.js.map +1 -0
- package/dist/cjs/components/chat-input-form/approvals-mode-button.js +182 -0
- package/dist/cjs/components/chat-input-form/approvals-mode-button.js.map +1 -0
- package/dist/cjs/components/chat-input-form/composer-canvas-pill.js +32 -0
- package/dist/cjs/components/chat-input-form/composer-canvas-pill.js.map +1 -0
- package/dist/cjs/components/chat-input-form/composer-model-chip.js +25 -0
- package/dist/cjs/components/chat-input-form/composer-model-chip.js.map +1 -0
- package/dist/cjs/components/chat-input-form/composer-plus-menu.js +3 -3
- package/dist/cjs/components/chat-input-form/composer-plus-menu.js.map +1 -1
- package/dist/cjs/components/chat-input-form/composer-tool-row.js +95 -0
- package/dist/cjs/components/chat-input-form/composer-tool-row.js.map +1 -0
- package/dist/cjs/components/chat-input-form/cowork-control.js +7 -4
- package/dist/cjs/components/chat-input-form/cowork-control.js.map +1 -1
- package/dist/cjs/components/chat-input-form.js +8 -30
- package/dist/cjs/components/chat-input-form.js.map +1 -1
- package/dist/cjs/components/profile/admin/tabs/applications/applications-tab.js +4 -1
- package/dist/cjs/components/profile/admin/tabs/applications/applications-tab.js.map +1 -1
- package/dist/cjs/i18n/messages/en.json.js +31 -2
- package/dist/cjs/i18n/messages/en.json.js.map +1 -1
- package/dist/cjs/i18n/messages/es.json.js +31 -2
- package/dist/cjs/i18n/messages/es.json.js.map +1 -1
- package/dist/cjs/i18n/messages/fr.json.js +31 -2
- package/dist/cjs/i18n/messages/fr.json.js.map +1 -1
- package/dist/cjs/i18n/messages/zh.json.js +31 -2
- package/dist/cjs/i18n/messages/zh.json.js.map +1 -1
- package/dist/cjs/next/index.js +13 -0
- package/dist/cjs/next/index.js.map +1 -1
- package/dist/cjs/web-containers/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/components/canvas/canvas-export-handlers.js +3 -1
- package/dist/esm/components/canvas/canvas-export-handlers.js.map +1 -1
- package/dist/esm/components/chat/ai-message-bubble.js +1 -1
- package/dist/esm/components/chat/ai-message-bubble.js.map +1 -1
- package/dist/esm/components/chat/ai-message-download.js +3 -39
- package/dist/esm/components/chat/ai-message-download.js.map +1 -1
- package/dist/esm/components/chat/chat-download-dialog.js +144 -0
- package/dist/esm/components/chat/chat-download-dialog.js.map +1 -0
- package/dist/esm/components/chat/chat-export.js +57 -0
- package/dist/esm/components/chat/chat-export.js.map +1 -0
- package/dist/esm/components/chat/chat-host-context.js.map +1 -1
- package/dist/esm/components/chat/chat-transcript.js +13 -9
- package/dist/esm/components/chat/chat-transcript.js.map +1 -1
- package/dist/esm/components/chat/code-permission-card.js +39 -2
- package/dist/esm/components/chat/code-permission-card.js.map +1 -1
- package/dist/esm/components/chat/use-whole-chat.js +63 -0
- package/dist/esm/components/chat/use-whole-chat.js.map +1 -0
- package/dist/esm/components/chat-input-form/approvals-mode-button.js +177 -0
- package/dist/esm/components/chat-input-form/approvals-mode-button.js.map +1 -0
- package/dist/esm/components/chat-input-form/composer-canvas-pill.js +30 -0
- package/dist/esm/components/chat-input-form/composer-canvas-pill.js.map +1 -0
- package/dist/esm/components/chat-input-form/composer-model-chip.js +23 -0
- package/dist/esm/components/chat-input-form/composer-model-chip.js.map +1 -0
- package/dist/esm/components/chat-input-form/composer-plus-menu.js +3 -3
- package/dist/esm/components/chat-input-form/composer-plus-menu.js.map +1 -1
- package/dist/esm/components/chat-input-form/composer-tool-row.js +91 -0
- package/dist/esm/components/chat-input-form/composer-tool-row.js.map +1 -0
- package/dist/esm/components/chat-input-form/cowork-control.js +7 -4
- package/dist/esm/components/chat-input-form/cowork-control.js.map +1 -1
- package/dist/esm/components/chat-input-form.js +8 -30
- package/dist/esm/components/chat-input-form.js.map +1 -1
- package/dist/esm/components/profile/admin/tabs/applications/applications-tab.js +5 -2
- package/dist/esm/components/profile/admin/tabs/applications/applications-tab.js.map +1 -1
- package/dist/esm/i18n/messages/en.json.js +31 -2
- package/dist/esm/i18n/messages/en.json.js.map +1 -1
- package/dist/esm/i18n/messages/es.json.js +31 -2
- package/dist/esm/i18n/messages/es.json.js.map +1 -1
- package/dist/esm/i18n/messages/fr.json.js +31 -2
- package/dist/esm/i18n/messages/fr.json.js.map +1 -1
- package/dist/esm/i18n/messages/zh.json.js +31 -2
- package/dist/esm/i18n/messages/zh.json.js.map +1 -1
- package/dist/esm/next/index.js +4 -0
- package/dist/esm/next/index.js.map +1 -1
- package/dist/esm/web-containers/tsconfig.tsbuildinfo +1 -1
- package/dist/next/index.d.ts +136 -3
- package/dist/package.json +2 -1
- package/package.json +4 -3
|
@@ -7,8 +7,10 @@ const SEPARATOR = '----';
|
|
|
7
7
|
* Links keep their URL — a plain-text transcript has nowhere else to put it.
|
|
8
8
|
*/
|
|
9
9
|
const flattenInlineSegment = (segment) => segment
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
// No brackets inside the groups: a scan can't run past the next `[` or
|
|
11
|
+
// `(`, which keeps these linear on input like `![\![\…` (CodeQL ReDoS).
|
|
12
|
+
.replace(/!\[([^[\]]*)\]\([^()]*\)/g, '$1')
|
|
13
|
+
.replace(/\[([^[\]]*)\]\(([^()]*)\)/g, '$1 ($2)')
|
|
12
14
|
.replace(/(\*\*|__)(.*?)\1/g, '$2')
|
|
13
15
|
.replace(/(\*|_)(.*?)\1/g, '$2');
|
|
14
16
|
/**
|
|
@@ -51,21 +53,24 @@ const flattenMarkdown = (content) => {
|
|
|
51
53
|
.filter((line) => line !== null)
|
|
52
54
|
.join('\n');
|
|
53
55
|
};
|
|
54
|
-
/**
|
|
55
|
-
|
|
56
|
+
/**
|
|
57
|
+
* Messages that belong in a transcript: visible, non-system, with text. Saved
|
|
58
|
+
* history carries tool-call-only assistant turns whose content is empty.
|
|
59
|
+
*/
|
|
60
|
+
const isTranscribable = (message) => { var _a; return message.visible !== false && message.role !== 'system' && !!((_a = message.content) === null || _a === void 0 ? void 0 : _a.trim()); };
|
|
61
|
+
const speakerLabel = (message, labels) => message.role === 'user' ? labels.roleUser : labels.roleAi;
|
|
56
62
|
const renderMessage = (message, labels) => {
|
|
57
|
-
const
|
|
58
|
-
return `[${
|
|
63
|
+
const time = message.timestamp ? ` ${message.timestamp}` : '';
|
|
64
|
+
return `[${speakerLabel(message, labels)}]${time}\n${flattenMarkdown(message.content)}\n\n${SEPARATOR}\n`;
|
|
59
65
|
};
|
|
60
66
|
/** Build the plain-text transcript for a whole conversation. */
|
|
61
67
|
const buildTranscript = (messages, labels) => `${labels.header}\n\n${messages
|
|
62
68
|
.filter(isTranscribable)
|
|
63
69
|
.map((message) => renderMessage(message, labels))
|
|
64
70
|
.join('\n')}`;
|
|
65
|
-
/** Build the plain-text transcript for a single message. */
|
|
66
|
-
const buildMessageTranscript = (message, labels) => buildTranscript([message], labels);
|
|
67
71
|
|
|
68
|
-
exports.buildMessageTranscript = buildMessageTranscript;
|
|
69
72
|
exports.buildTranscript = buildTranscript;
|
|
70
73
|
exports.flattenMarkdown = flattenMarkdown;
|
|
74
|
+
exports.isTranscribable = isTranscribable;
|
|
75
|
+
exports.speakerLabel = speakerLabel;
|
|
71
76
|
//# sourceMappingURL=chat-transcript.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-transcript.js","sources":["../../../../../../../src/components/chat/chat-transcript.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAeA,MAAM,SAAS,GAAG,MAAM;AAExB;;;;AAIG;AACH,MAAM,oBAAoB,GAAG,CAAC,OAAe,KAC3C
|
|
1
|
+
{"version":3,"file":"chat-transcript.js","sources":["../../../../../../../src/components/chat/chat-transcript.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAeA,MAAM,SAAS,GAAG,MAAM;AAExB;;;;AAIG;AACH,MAAM,oBAAoB,GAAG,CAAC,OAAe,KAC3C;;;AAGG,KAAA,OAAO,CAAC,2BAA2B,EAAE,IAAI;AACzC,KAAA,OAAO,CAAC,4BAA4B,EAAE,SAAS;AAC/C,KAAA,OAAO,CAAC,mBAAmB,EAAE,IAAI;AACjC,KAAA,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC;AAEpC;;;;AAIG;AACH,MAAM,aAAa,GAAG,CAAC,IAAY,KACjC;KACG,KAAK,CAAC,YAAY;KAClB,GAAG,CAAC,CAAC,OAAO,KACX,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG;MAClE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE;AACrB,MAAE,oBAAoB,CAAC,OAAO,CAAC;KAElC,IAAI,CAAC,EAAE,CAAC;AAEb,MAAM,gBAAgB,GAAG,CAAC,IAAY,KAAY;IAChD,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC;IAC/C,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC;IAC1C,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC;AAC3C,IAAA,OAAO,aAAa,CAAC,GAAG,CAAC;AAC3B,CAAC;AAED;;;;;AAKG;AACI,MAAM,eAAe,GAAG,CAAC,OAAe,KAAY;IACzD,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,OAAO,EAAE;IACX;IACA,IAAI,OAAO,GAAG,KAAK;AACnB,IAAA,OAAO;SACJ,KAAK,CAAC,IAAI;AACV,SAAA,GAAG,CAAC,CAAC,IAAI,KAAI;AACZ,QAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAChC,OAAO,GAAG,CAAC,OAAO;AAClB,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,OAAO,GAAG,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC;AAChD,IAAA,CAAC;SACA,MAAM,CAAC,CAAC,IAAI,KAAqB,IAAI,KAAK,IAAI;SAC9C,IAAI,CAAC,IAAI,CAAC;AACf;AAEA;;;AAGG;AACI,MAAM,eAAe,GAAG,CAAC,OAAgB,KAAa,EAAA,IAAA,EAAA,CAAA,CAC3D,OAAA,OAAO,CAAC,OAAO,KAAK,KAAK,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,EAAC,CAAA,EAAA,GAAA,OAAO,CAAC,OAAO,0CAAE,IAAI,EAAE,CAAA,CAAA;AAE9E,MAAM,YAAY,GAAG,CAAC,OAAgB,EAAE,MAAwB,KACrE,OAAO,CAAC,IAAI,KAAK,MAAM,GAAG,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC;AAErD,MAAM,aAAa,GAAG,CAAC,OAAgB,EAAE,MAAwB,KAAY;AAC3E,IAAA,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,GAAG,CAAA,CAAA,EAAI,OAAO,CAAC,SAAS,CAAA,CAAE,GAAG,EAAE;AAC7D,IAAA,OAAO,IAAI,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA,CAAA,EAAI,IAAI,KAAK,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA,IAAA,EAAO,SAAS,IAAI;AAC3G,CAAC;AAED;AACO,MAAM,eAAe,GAAG,CAAC,QAAmB,EAAE,MAAwB,KAC3E,CAAA,EAAG,MAAM,CAAC,MAAM,OAAO;KACpB,MAAM,CAAC,eAAe;AACtB,KAAA,GAAG,CAAC,CAAC,OAAO,KAAK,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC;AAC/C,KAAA,IAAI,CAAC,IAAI,CAAC,CAAA;;;;;;;"}
|
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
var React = require('react');
|
|
5
5
|
var chatHostContext = require('./chat-host-context.js');
|
|
6
|
+
var sonner = require('sonner');
|
|
6
7
|
var button = require('./ui/button.js');
|
|
7
8
|
var codeActivity = require('./code-activity.js');
|
|
8
9
|
var shieldCheck = require('../../node_modules/.pnpm/lucide-react@0.528.0_react@19.1.0/node_modules/lucide-react/dist/esm/icons/shield-check.js');
|
|
10
|
+
var zap = require('../../node_modules/.pnpm/lucide-react@0.528.0_react@19.1.0/node_modules/lucide-react/dist/esm/icons/zap.js');
|
|
9
11
|
|
|
10
12
|
function isTauriApp() {
|
|
11
13
|
return typeof window !== 'undefined' && '__TAURI__' in window;
|
|
@@ -117,10 +119,15 @@ function legacyToolCall(request) {
|
|
|
117
119
|
locations: value === null || value === void 0 ? void 0 : value.split(/\s+/).map((path) => ({ path })),
|
|
118
120
|
};
|
|
119
121
|
}
|
|
122
|
+
// Past this the card's action is allowed without waiting, well before the desktop
|
|
123
|
+
// gives up on it (180s). Not a failure: a live Codex session can take this long.
|
|
124
|
+
const SWITCH_TO_AUTOMATIC_TIMEOUT_MS = 10000;
|
|
120
125
|
function CodePermissionCards({ generationId, }) {
|
|
126
|
+
var _a;
|
|
121
127
|
const all = useCodePermissionRequests();
|
|
122
128
|
const requests = all.filter((r) => r.generation_id === generationId);
|
|
123
129
|
const t = chatHostContext.useChatT();
|
|
130
|
+
const onSwitchToAutomatic = (_a = chatHostContext.useChatHost().config) === null || _a === void 0 ? void 0 : _a.onSwitchToAutomatic;
|
|
124
131
|
const answer = async (request, optionId) => {
|
|
125
132
|
// Drop it first: the answer is one-way and a second click would resolve an id
|
|
126
133
|
// Rust has already forgotten.
|
|
@@ -140,6 +147,32 @@ function CodePermissionCards({ generationId, }) {
|
|
|
140
147
|
console.error('[code-permission] respond failed', e);
|
|
141
148
|
}
|
|
142
149
|
};
|
|
150
|
+
// Automatic is saved BEFORE this card is answered: in the desktop app saving it
|
|
151
|
+
// answers every waiting card, this one included. The action is allowed whatever the
|
|
152
|
+
// save does — the card is already gone, so nothing else would answer it.
|
|
153
|
+
const switchToAutomatic = onSwitchToAutomatic &&
|
|
154
|
+
(async (request) => {
|
|
155
|
+
drop(request.request_id);
|
|
156
|
+
const saving = new Promise((resolve) => resolve(onSwitchToAutomatic())).then((saved) => {
|
|
157
|
+
if (saved === false)
|
|
158
|
+
sonner.toast.error(t('chat.chatCodePermissionCard.switchToAutomaticFailed'));
|
|
159
|
+
}, (e) => {
|
|
160
|
+
console.error('[code-permission] could not switch to Automatic', e);
|
|
161
|
+
sonner.toast.error(t('chat.chatCodePermissionCard.switchToAutomaticFailed'));
|
|
162
|
+
});
|
|
163
|
+
let timer;
|
|
164
|
+
await Promise.race([
|
|
165
|
+
saving,
|
|
166
|
+
new Promise((resolve) => {
|
|
167
|
+
timer = setTimeout(() => {
|
|
168
|
+
console.error('[code-permission] switching to Automatic is taking too long');
|
|
169
|
+
resolve();
|
|
170
|
+
}, SWITCH_TO_AUTOMATIC_TIMEOUT_MS);
|
|
171
|
+
}),
|
|
172
|
+
]);
|
|
173
|
+
clearTimeout(timer);
|
|
174
|
+
await answer(request, request.allow_option_id);
|
|
175
|
+
});
|
|
143
176
|
return (
|
|
144
177
|
// Mounted empty for the whole turn, so the first card is a mutation screen
|
|
145
178
|
// readers announce rather than content they never see arrive.
|
|
@@ -154,13 +187,17 @@ function CodePermissionCards({ generationId, }) {
|
|
|
154
187
|
// A Browse run (own responder) keeps its own title; anything else described gets a sentence.
|
|
155
188
|
const named = !request.respond && step.action !== 'other';
|
|
156
189
|
const shown = (_c = codeActivity.safeDetail((_b = request.command) !== null && _b !== void 0 ? _b : undefined)) !== null && _c !== void 0 ? _c : (named ? step.details : undefined);
|
|
190
|
+
// Code prompts only: a Browse run follows Cowork's own Approvals setting,
|
|
191
|
+
// and a prompt with nothing to allow can't be approved.
|
|
192
|
+
const canSwitch = !!switchToAutomatic && !request.respond && !!request.allow_option_id;
|
|
193
|
+
const automaticHintId = `code-permission-automatic-hint-${request.request_id}`;
|
|
157
194
|
return (jsxRuntime.jsxs("div", { children: [jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-1.5 text-gray-600 dark:text-gray-300", children: [jsxRuntime.jsx(shieldCheck.default, { className: "h-3 w-3 shrink-0 text-gray-400" }), jsxRuntime.jsx("span", { className: "font-medium", children: t('chat.chatCodePermissionCard.title') })] }), jsxRuntime.jsx("div", { className: "mt-0.5 ml-[18px] text-gray-400 dark:text-gray-500", children: named
|
|
158
195
|
? codeActivity.stepSentence(t, step, 'want')
|
|
159
196
|
: codeActivity.safeDetail((_d = request.title) !== null && _d !== void 0 ? _d : undefined) ||
|
|
160
197
|
t('chat.chatCodePermissionCard.unnamedAction') }), shown && (
|
|
161
198
|
// bg-gray-200 is what the bubble already uses for inline code and pre
|
|
162
199
|
// blocks, so the command sits on the same surface as the reply's own.
|
|
163
|
-
jsxRuntime.jsx("code", { className: "mt-1 ml-[18px] block rounded bg-gray-200 px-1.5 py-1 font-mono break-all whitespace-pre-wrap text-gray-700", children: shown })), jsxRuntime.jsxs("div", { className: "mt-2 ml-[18px] flex items-center gap-2", children: [jsxRuntime.jsx(button.Button, { size: "sm", type: "button", className: "ibl-button-primary h-7 text-xs", onClick: () => answer(request, request.allow_option_id), children: t('chat.chatCodePermissionCard.allow') }), jsxRuntime.jsx(button.Button, { variant: "outline", size: "sm", type: "button", className: "h-7 text-xs", onClick: () => answer(request, request.reject_option_id), children: t('chat.chatCodePermissionCard.deny') })] })] }, request.request_id));
|
|
200
|
+
jsxRuntime.jsx("code", { className: "mt-1 ml-[18px] block rounded bg-gray-200 px-1.5 py-1 font-mono break-all whitespace-pre-wrap text-gray-700", children: shown })), jsxRuntime.jsxs("div", { className: "mt-2 ml-[18px] flex flex-wrap items-center gap-2", children: [jsxRuntime.jsx(button.Button, { size: "sm", type: "button", className: "ibl-button-primary h-7 text-xs", onClick: () => answer(request, request.allow_option_id), children: t('chat.chatCodePermissionCard.allow') }), jsxRuntime.jsx(button.Button, { variant: "outline", size: "sm", type: "button", className: "h-7 text-xs", onClick: () => answer(request, request.reject_option_id), children: t('chat.chatCodePermissionCard.deny') }), canSwitch && (jsxRuntime.jsxs(button.Button, { variant: "ghost", size: "sm", type: "button", "data-testid": "code-permission-switch-to-automatic", "aria-describedby": automaticHintId, className: "h-7 gap-1 text-xs text-[#38A1E5] hover:bg-[#F5F8FF] hover:text-[#38A1E5]", onClick: () => void (switchToAutomatic === null || switchToAutomatic === void 0 ? void 0 : switchToAutomatic(request)), children: [jsxRuntime.jsx(zap.default, { className: "h-3 w-3", "aria-hidden": "true" }), t('chat.chatCodePermissionCard.switchToAutomatic')] }))] }), canSwitch && (jsxRuntime.jsx("p", { id: automaticHintId, "data-testid": "code-permission-automatic-hint", className: "mt-1 ml-[18px] text-gray-500 dark:text-gray-400", children: t('chat.chatCodePermissionCard.switchToAutomaticHint') }))] }, request.request_id));
|
|
164
201
|
}) })) }));
|
|
165
202
|
}
|
|
166
203
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-permission-card.js","sources":["../../../../../../../src/components/chat/code-permission-card.tsx"],"sourcesContent":[null],"names":["useSyncExternalStore","useChatT","_jsx","describeStep","mergeToolCall","safeDetail","_jsxs","ShieldCheck","stepSentence","Button"],"mappings":"
|
|
1
|
+
{"version":3,"file":"code-permission-card.js","sources":["../../../../../../../src/components/chat/code-permission-card.tsx"],"sourcesContent":[null],"names":["useSyncExternalStore","useChatT","useChatHost","toast","_jsx","describeStep","mergeToolCall","safeDetail","_jsxs","ShieldCheck","stepSentence","Button","Zap"],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var dataLayer = require('@iblai/data-layer');
|
|
5
|
+
var chatExport = require('./chat-export.js');
|
|
6
|
+
|
|
7
|
+
const WHOLE_CHAT_PAGE_SIZE = 100;
|
|
8
|
+
// A runaway `next` link must not loop forever; 50 pages is 5000 messages.
|
|
9
|
+
const WHOLE_CHAT_MAX_PAGES = 50;
|
|
10
|
+
const IDLE = { status: 'idle', messages: [] };
|
|
11
|
+
/**
|
|
12
|
+
* Every saved message of a session. The chat only holds the pages the user
|
|
13
|
+
* scrolled to, so an export reads the whole history itself. A session the
|
|
14
|
+
* backend has never saved (404) or an anonymous chat yields `ready` with no
|
|
15
|
+
* messages — the caller then falls back to what it already has on screen.
|
|
16
|
+
*/
|
|
17
|
+
function useWholeChat({ enabled, org, username, sessionId }) {
|
|
18
|
+
const [readSession] = dataLayer.useLazyGetSessionIdQuery();
|
|
19
|
+
const [state, setState] = React.useState(IDLE);
|
|
20
|
+
React.useEffect(() => {
|
|
21
|
+
if (!org || !username || !sessionId) {
|
|
22
|
+
setState({ status: 'ready', messages: [] });
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
let cancelled = false;
|
|
26
|
+
setState({ status: 'loading', messages: [] });
|
|
27
|
+
const load = async () => {
|
|
28
|
+
var _a, _b, _c;
|
|
29
|
+
// The endpoint pages newest-first, and each page lists newest-first.
|
|
30
|
+
const newestFirst = [];
|
|
31
|
+
for (let page = 1; page <= WHOLE_CHAT_MAX_PAGES; page++) {
|
|
32
|
+
const result = (await readSession({
|
|
33
|
+
org,
|
|
34
|
+
userId: username,
|
|
35
|
+
sessionId,
|
|
36
|
+
page,
|
|
37
|
+
pageSize: WHOLE_CHAT_PAGE_SIZE,
|
|
38
|
+
}));
|
|
39
|
+
if (result.error) {
|
|
40
|
+
if (result.error.status === 404)
|
|
41
|
+
break;
|
|
42
|
+
throw result.error;
|
|
43
|
+
}
|
|
44
|
+
newestFirst.push(...((_b = (_a = result.data) === null || _a === void 0 ? void 0 : _a.results) !== null && _b !== void 0 ? _b : []));
|
|
45
|
+
if (!((_c = result.data) === null || _c === void 0 ? void 0 : _c.next))
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
return newestFirst.reverse().map(chatExport.historyResultToMessage);
|
|
49
|
+
};
|
|
50
|
+
load().then((messages) => {
|
|
51
|
+
if (!cancelled)
|
|
52
|
+
setState({ status: 'ready', messages });
|
|
53
|
+
}, () => {
|
|
54
|
+
if (!cancelled)
|
|
55
|
+
setState({ status: 'error', messages: [] });
|
|
56
|
+
});
|
|
57
|
+
return () => {
|
|
58
|
+
cancelled = true;
|
|
59
|
+
};
|
|
60
|
+
}, [enabled, org, username, sessionId, readSession]);
|
|
61
|
+
return state;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
exports.WHOLE_CHAT_MAX_PAGES = WHOLE_CHAT_MAX_PAGES;
|
|
65
|
+
exports.WHOLE_CHAT_PAGE_SIZE = WHOLE_CHAT_PAGE_SIZE;
|
|
66
|
+
exports.useWholeChat = useWholeChat;
|
|
67
|
+
//# sourceMappingURL=use-whole-chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-whole-chat.js","sources":["../../../../../../../src/components/chat/use-whole-chat.ts"],"sourcesContent":[null],"names":["useLazyGetSessionIdQuery","useState","useEffect","historyResultToMessage"],"mappings":";;;;;;AAQO,MAAM,oBAAoB,GAAG;AACpC;AACO,MAAM,oBAAoB,GAAG;AAkBpC,MAAM,IAAI,GAAc,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;AAOxD;;;;;AAKG;AACG,SAAU,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAoB,EAAA;AAClF,IAAA,MAAM,CAAC,WAAW,CAAC,GAAGA,kCAAwB,EAAE;IAChD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAGC,cAAQ,CAAY,IAAI,CAAC;IAEnDC,eAAS,CAAC,MAAK;QAKb,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,EAAE;YACnC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;YAC3C;QACF;QACA,IAAI,SAAS,GAAG,KAAK;QACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAC7C,QAAA,MAAM,IAAI,GAAG,YAAW;;;YAEtB,MAAM,WAAW,GAA0B,EAAE;AAC7C,YAAA,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,oBAAoB,EAAE,IAAI,EAAE,EAAE;AACvD,gBAAA,MAAM,MAAM,IAAI,MAAM,WAAW,CAAC;oBAChC,GAAG;AACH,oBAAA,MAAM,EAAE,QAAQ;oBAChB,SAAS;oBACT,IAAI;AACJ,oBAAA,QAAQ,EAAE,oBAAoB;AAC/B,iBAAA,CAAC,CAAgB;AAClB,gBAAA,IAAI,MAAM,CAAC,KAAK,EAAE;AAChB,oBAAA,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,GAAG;wBAAE;oBACjC,MAAM,MAAM,CAAC,KAAK;gBACpB;AACA,gBAAA,WAAW,CAAC,IAAI,CAAC,IAAI,MAAA,CAAA,EAAA,GAAA,MAAM,CAAC,IAAI,0CAAE,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,EAAE,CAAC,CAAC;gBACjD,IAAI,EAAC,CAAA,EAAA,GAAA,MAAM,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,IAAI,CAAA;oBAAE;YAC1B;YACA,OAAO,WAAW,CAAC,OAAO,EAAE,CAAC,GAAG,CAACC,iCAAsB,CAAC;AAC1D,QAAA,CAAC;AACD,QAAA,IAAI,EAAE,CAAC,IAAI,CACT,CAAC,QAAQ,KAAI;AACX,YAAA,IAAI,CAAC,SAAS;gBAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QACzD,CAAC,EACD,MAAK;AACH,YAAA,IAAI,CAAC,SAAS;gBAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAC7D,QAAA,CAAC,CACF;AACD,QAAA,OAAO,MAAK;YACV,SAAS,GAAG,IAAI;AAClB,QAAA,CAAC;AACH,IAAA,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;AAEpD,IAAA,OAAO,KAAK;AACd;;;;;;"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var chatHostContext = require('../chat/chat-host-context.js');
|
|
6
|
+
var popover = require('../ui/popover.js');
|
|
7
|
+
var zap = require('../../node_modules/.pnpm/lucide-react@0.528.0_react@19.1.0/node_modules/lucide-react/dist/esm/icons/zap.js');
|
|
8
|
+
var hand = require('../../node_modules/.pnpm/lucide-react@0.528.0_react@19.1.0/node_modules/lucide-react/dist/esm/icons/hand.js');
|
|
9
|
+
var check = require('../../node_modules/.pnpm/lucide-react@0.528.0_react@19.1.0/node_modules/lucide-react/dist/esm/icons/check.js');
|
|
10
|
+
|
|
11
|
+
const PERMISSION_MODES = ['manual', 'auto'];
|
|
12
|
+
const PERMISSION_MODE_ICONS = {
|
|
13
|
+
manual: hand.default,
|
|
14
|
+
auto: zap.default,
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* One approval-mode store per call, so each surface that has its own mode
|
|
18
|
+
* (Code today, Cowork later) keeps its own.
|
|
19
|
+
*/
|
|
20
|
+
function createApprovalModeStore() {
|
|
21
|
+
// `picks` and `seeds` count the user's choices and the profile's mode taking
|
|
22
|
+
// effect, so a read that started before either never overwrites it. Seeded to
|
|
23
|
+
// Ask Me, NOT the saved default: until the desktop answers, claiming Automatic
|
|
24
|
+
// would tell a user who chose Ask Me that Code may act unasked.
|
|
25
|
+
let approvalMode = 'manual';
|
|
26
|
+
let picks = 0;
|
|
27
|
+
let seeds = 0;
|
|
28
|
+
// Code pills that currently offer the approvals button. Counted, not flagged:
|
|
29
|
+
// the canvas split mounts a composer, and so a pill, on each side.
|
|
30
|
+
let offers = 0;
|
|
31
|
+
const subscribers = new Set();
|
|
32
|
+
function notifySubscribers() {
|
|
33
|
+
subscribers.forEach((notify) => notify());
|
|
34
|
+
}
|
|
35
|
+
function publish(mode) {
|
|
36
|
+
approvalMode = mode;
|
|
37
|
+
notifySubscribers();
|
|
38
|
+
}
|
|
39
|
+
function subscribe(notify) {
|
|
40
|
+
subscribers.add(notify);
|
|
41
|
+
return () => {
|
|
42
|
+
subscribers.delete(notify);
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function useApprovalMode() {
|
|
46
|
+
return React.useSyncExternalStore(subscribe, () => approvalMode, () => 'manual');
|
|
47
|
+
}
|
|
48
|
+
function useOfferApprovals(offer) {
|
|
49
|
+
React.useEffect(() => {
|
|
50
|
+
if (!offer)
|
|
51
|
+
return;
|
|
52
|
+
offers += 1;
|
|
53
|
+
notifySubscribers();
|
|
54
|
+
return () => {
|
|
55
|
+
offers -= 1;
|
|
56
|
+
notifySubscribers();
|
|
57
|
+
};
|
|
58
|
+
}, [offer]);
|
|
59
|
+
}
|
|
60
|
+
/** Whether any Code pill on screen offers the approvals button. */
|
|
61
|
+
function useApprovalsOffered() {
|
|
62
|
+
return React.useSyncExternalStore(subscribe, () => offers > 0, () => false);
|
|
63
|
+
}
|
|
64
|
+
function setApprovalMode(mode) {
|
|
65
|
+
picks += 1;
|
|
66
|
+
publish(mode);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Show a chosen mode at once and save it on the desktop. A failed save puts
|
|
70
|
+
* back the mode the desktop still enforces (a newer pick is kept), reports it,
|
|
71
|
+
* asks `reread` (the mode put back may be the placeholder) and resolves `false`.
|
|
72
|
+
*/
|
|
73
|
+
async function applyApprovalMode(mode, save, onFailure, reread) {
|
|
74
|
+
const previous = approvalMode;
|
|
75
|
+
setApprovalMode(mode);
|
|
76
|
+
try {
|
|
77
|
+
await save(mode);
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
if (approvalMode === mode) {
|
|
82
|
+
setApprovalMode(previous);
|
|
83
|
+
if (reread)
|
|
84
|
+
void loadApprovalMode(reread);
|
|
85
|
+
}
|
|
86
|
+
onFailure(error);
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Show the mode the desktop has saved. Anything but `"auto"` is Ask Me: an
|
|
92
|
+
* older desktop answers null when nothing was chosen, and one older still has
|
|
93
|
+
* no such command — both ask at every step.
|
|
94
|
+
*/
|
|
95
|
+
async function loadApprovalMode(read) {
|
|
96
|
+
const picksBefore = picks;
|
|
97
|
+
const seedsBefore = seeds;
|
|
98
|
+
const saved = await read().catch(() => null);
|
|
99
|
+
if (picks === picksBefore && seeds === seedsBefore) {
|
|
100
|
+
publish(saved === 'auto' ? 'auto' : 'manual');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Show the mode the desktop reports in force after offering it the profile's
|
|
105
|
+
* copy; only a real answer is shown. Never offered once the user has picked:
|
|
106
|
+
* the desktop may run the seed ahead of that pick's save.
|
|
107
|
+
*/
|
|
108
|
+
async function seedApprovalMode(seed) {
|
|
109
|
+
if (picks > 0)
|
|
110
|
+
return;
|
|
111
|
+
const inForce = await seed().catch(() => undefined);
|
|
112
|
+
if (picks > 0 || (inForce !== 'auto' && inForce !== 'manual'))
|
|
113
|
+
return;
|
|
114
|
+
seeds += 1;
|
|
115
|
+
publish(inForce);
|
|
116
|
+
}
|
|
117
|
+
/** Test support only: the mode outlives every component by design. */
|
|
118
|
+
function resetApprovalModeForTests() {
|
|
119
|
+
picks = 0;
|
|
120
|
+
seeds = 0;
|
|
121
|
+
publish('manual');
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
useApprovalMode,
|
|
125
|
+
setApprovalMode,
|
|
126
|
+
applyApprovalMode,
|
|
127
|
+
loadApprovalMode,
|
|
128
|
+
seedApprovalMode,
|
|
129
|
+
useOfferApprovals,
|
|
130
|
+
useApprovalsOffered,
|
|
131
|
+
resetApprovalModeForTests,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Code's approval mode: an icon that widens to the mode's name and opens the
|
|
136
|
+
* choice. It grows over the tool row, not into it, so the row never re-fits its
|
|
137
|
+
* pills on hover; the delay keeps a passing pointer from widening it.
|
|
138
|
+
*/
|
|
139
|
+
function ApprovalsModeButton({ mode, onChange, labels }) {
|
|
140
|
+
var _a;
|
|
141
|
+
const t = chatHostContext.useChatT();
|
|
142
|
+
const [open, setOpen] = React.useState(false);
|
|
143
|
+
const menuRef = React.useRef(null);
|
|
144
|
+
const Icon = PERMISSION_MODE_ICONS[mode];
|
|
145
|
+
const name = (m) => {
|
|
146
|
+
var _a, _b;
|
|
147
|
+
return m === 'auto'
|
|
148
|
+
? ((_a = labels === null || labels === void 0 ? void 0 : labels.permissionModeAuto) !== null && _a !== void 0 ? _a : t('chat.chatInputFormApprovalsModeButton.permissionModeAuto'))
|
|
149
|
+
: ((_b = labels === null || labels === void 0 ? void 0 : labels.permissionModeManual) !== null && _b !== void 0 ? _b : t('chat.chatInputFormApprovalsModeButton.permissionModeManual'));
|
|
150
|
+
};
|
|
151
|
+
const hint = (m) => {
|
|
152
|
+
var _a, _b;
|
|
153
|
+
return m === 'auto'
|
|
154
|
+
? ((_a = labels === null || labels === void 0 ? void 0 : labels.permissionModeAutoHint) !== null && _a !== void 0 ? _a : t('chat.chatInputFormApprovalsModeButton.permissionModeAutoHint'))
|
|
155
|
+
: ((_b = labels === null || labels === void 0 ? void 0 : labels.permissionModeManualHint) !== null && _b !== void 0 ? _b : t('chat.chatInputFormApprovalsModeButton.permissionModeManualHint'));
|
|
156
|
+
};
|
|
157
|
+
const heading = (_a = labels === null || labels === void 0 ? void 0 : labels.permissionModeLabel) !== null && _a !== void 0 ? _a : t('chat.chatInputFormApprovalsModeButton.permissionModeLabel');
|
|
158
|
+
const ariaLabel = (labels === null || labels === void 0 ? void 0 : labels.approvalsAria)
|
|
159
|
+
? labels.approvalsAria(name(mode))
|
|
160
|
+
: t('chat.chatInputFormApprovalsModeButton.approvalsAria', { mode: name(mode) });
|
|
161
|
+
return (jsxRuntime.jsxs(popover.Popover, { open: open, onOpenChange: setOpen, children: [jsxRuntime.jsx("span", { className: "relative flex h-8 w-8 shrink-0", children: jsxRuntime.jsx(popover.PopoverTrigger, { asChild: true, children: jsxRuntime.jsxs("button", { type: "button", "data-testid": "code-approvals-button", "aria-label": ariaLabel, className: "group absolute top-0 right-0 z-10 flex h-8 cursor-pointer items-center rounded-lg border border-transparent px-[7px] text-sm font-medium text-[#38A1E5] transition-colors duration-200 hover:border-[#D0E0FF] hover:bg-[#F5F8FF] hover:delay-150 focus-visible:border-[#D0E0FF] focus-visible:bg-[#F5F8FF] focus-visible:outline-none data-[state=open]:border-[#D0E0FF] data-[state=open]:bg-[#F5F8FF]", children: [jsxRuntime.jsx(Icon, { className: "size-4 shrink-0", "aria-hidden": "true" }), jsxRuntime.jsx("span", { className: "max-w-0 overflow-hidden whitespace-nowrap opacity-0 transition-all duration-200 ease-out group-hover:ml-1.5 group-hover:max-w-28 group-hover:opacity-100 group-hover:delay-150 group-focus-visible:ml-1.5 group-focus-visible:max-w-28 group-focus-visible:opacity-100 group-data-[state=open]:ml-1.5 group-data-[state=open]:max-w-28 group-data-[state=open]:opacity-100", children: name(mode) })] }) }) }), jsxRuntime.jsxs(popover.PopoverContent, { ref: menuRef, side: "top", align: "end", collisionPadding: 8, tabIndex: -1, "aria-label": heading,
|
|
162
|
+
// Radix focuses the first option on open, ringing "Ask Me" whichever
|
|
163
|
+
// mode is on; the menu takes focus instead, so Tab still reaches both.
|
|
164
|
+
onOpenAutoFocus: (event) => {
|
|
165
|
+
var _a;
|
|
166
|
+
event.preventDefault();
|
|
167
|
+
(_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
168
|
+
}, className: "w-72 max-w-[calc(100vw-2rem)] rounded-lg border border-gray-200 bg-white p-1.5 shadow-xl outline-none", children: [jsxRuntime.jsx("div", { className: "px-2 pt-1 pb-1.5 text-xs font-medium text-gray-500", children: heading }), jsxRuntime.jsx("div", { role: "radiogroup", "aria-label": heading, className: "flex flex-col gap-0.5", children: PERMISSION_MODES.map((m) => {
|
|
169
|
+
const ModeIcon = PERMISSION_MODE_ICONS[m];
|
|
170
|
+
const selected = m === mode;
|
|
171
|
+
return (jsxRuntime.jsxs("button", { type: "button", role: "radio", "aria-checked": selected, "data-testid": `code-approvals-option-${m}`, onClick: () => {
|
|
172
|
+
onChange(m);
|
|
173
|
+
setOpen(false);
|
|
174
|
+
}, className: `flex w-full cursor-pointer items-start gap-2.5 rounded-md px-2 py-2 text-left transition-colors ${selected ? 'bg-[#F5F8FF]' : 'hover:bg-gray-50'}`, children: [jsxRuntime.jsx(ModeIcon, { className: `mt-0.5 h-4 w-4 shrink-0 ${selected ? 'text-[#38A1E5]' : 'text-gray-500'}`, "aria-hidden": "true" }), jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [jsxRuntime.jsx("span", { className: `text-sm font-medium ${selected ? 'text-[#38A1E5]' : 'text-gray-900'}`, children: name(m) }), jsxRuntime.jsx("span", { className: "text-xs text-gray-500", children: hint(m) })] }), selected && (jsxRuntime.jsx(check.default, { className: "mt-0.5 h-4 w-4 shrink-0 text-[#38A1E5]", "aria-hidden": "true" }))] }, m));
|
|
175
|
+
}) })] })] }));
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
exports.ApprovalsModeButton = ApprovalsModeButton;
|
|
179
|
+
exports.PERMISSION_MODES = PERMISSION_MODES;
|
|
180
|
+
exports.PERMISSION_MODE_ICONS = PERMISSION_MODE_ICONS;
|
|
181
|
+
exports.createApprovalModeStore = createApprovalModeStore;
|
|
182
|
+
//# sourceMappingURL=approvals-mode-button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approvals-mode-button.js","sources":["../../../../../../../src/components/chat-input-form/approvals-mode-button.tsx"],"sourcesContent":[null],"names":["Hand","Zap","useSyncExternalStore","useEffect","useChatT","useState","useRef","_jsxs","Popover","_jsx","PopoverTrigger","PopoverContent","Check"],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var chatHostContext = require('../chat/chat-host-context.js');
|
|
5
|
+
var utils = require('../../lib/utils.js');
|
|
6
|
+
var svgIcons = require('../icons/svg-icons.js');
|
|
7
|
+
var composerToolRow = require('./composer-tool-row.js');
|
|
8
|
+
var x = require('../../node_modules/.pnpm/lucide-react@0.528.0_react@19.1.0/node_modules/lucide-react/dist/esm/icons/x.js');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* The redesigned composer's Canvas pill. On, it reads as an active tool chip
|
|
12
|
+
* (same pill) with a "Turn off Canvas" ×; off, a one-click toggle.
|
|
13
|
+
*/
|
|
14
|
+
function ComposerCanvasPill({ on, disabled, onToggle, }) {
|
|
15
|
+
const t = chatHostContext.useChatT();
|
|
16
|
+
const { showName: rowShowsName } = composerToolRow.useComposerToolPill(on);
|
|
17
|
+
const cramped = composerToolRow.useComposerToolRowCramped();
|
|
18
|
+
const showName = rowShowsName && !cramped;
|
|
19
|
+
const name = t('chat.chatInputFormInsideButtons.canvas');
|
|
20
|
+
return (jsxRuntime.jsxs("span", { className: utils.cn('flex h-8 min-w-0 items-center overflow-hidden rounded-[10px] border text-sm leading-5 font-medium transition-colors', on
|
|
21
|
+
? 'gap-1.5 border-[#D0E0FF] bg-[#F5F8FF] pr-2 pl-2.5 text-[#38A1E5] hover:bg-[#EAF1FF]'
|
|
22
|
+
: 'border-transparent text-gray-600 hover:bg-gray-100'), "data-testid": "composer-canvas-pill", children: [jsxRuntime.jsxs("button", { type: "button", disabled: disabled, "aria-pressed": on, onClick: (e) => {
|
|
23
|
+
e.preventDefault();
|
|
24
|
+
onToggle();
|
|
25
|
+
}, title: showName ? undefined : name, className: utils.cn('flex h-full min-w-0 items-center gap-1.5 disabled:cursor-not-allowed disabled:opacity-50', !on && 'px-2'), children: [jsxRuntime.jsx(svgIcons.CanvasIcon, { className: "h-4 w-4 shrink-0", "aria-hidden": "true" }), jsxRuntime.jsx("span", { className: utils.cn('truncate', !showName && 'sr-only'), children: name })] }), on && (jsxRuntime.jsx("button", { type: "button", disabled: disabled, "aria-label": t('chat.chatComposer.turnOff', { name }), "data-testid": "composer-canvas-off", onClick: (e) => {
|
|
26
|
+
e.preventDefault();
|
|
27
|
+
onToggle();
|
|
28
|
+
}, className: "flex h-full shrink-0 items-center disabled:cursor-not-allowed disabled:opacity-50", children: jsxRuntime.jsx(x.default, { className: "h-3 w-3", "aria-hidden": "true" }) }))] }));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
exports.ComposerCanvasPill = ComposerCanvasPill;
|
|
32
|
+
//# sourceMappingURL=composer-canvas-pill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composer-canvas-pill.js","sources":["../../../../../../../src/components/chat-input-form/composer-canvas-pill.tsx"],"sourcesContent":[null],"names":["useChatT","useComposerToolPill","useComposerToolRowCramped","_jsxs","cn","_jsx","CanvasIcon","X"],"mappings":";;;;;;;;;AAQA;;;AAGG;AACG,SAAU,kBAAkB,CAAC,EACjC,EAAE,EACF,QAAQ,EACR,QAAQ,GAKT,EAAA;AACC,IAAA,MAAM,CAAC,GAAGA,wBAAQ,EAAE;IACpB,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAGC,mCAAmB,CAAC,EAAE,CAAC;AAC1D,IAAA,MAAM,OAAO,GAAGC,yCAAyB,EAAE;AAC3C,IAAA,MAAM,QAAQ,GAAG,YAAY,IAAI,CAAC,OAAO;AACzC,IAAA,MAAM,IAAI,GAAG,CAAC,CAAC,wCAAwC,CAAC;IAExD,QACEC,0BACE,SAAS,EAAEC,QAAE,CACX,qHAAqH,EACrH;AACE,cAAE;cACA,oDAAoD,CACzD,EAAA,aAAA,EACW,sBAAsB,EAAA,QAAA,EAAA,CAElCD,eAAA,CAAA,QAAA,EAAA,EACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,QAAQ,kBACJ,EAAE,EAChB,OAAO,EAAE,CAAC,CAAC,KAAI;oBACb,CAAC,CAAC,cAAc,EAAE;AAClB,oBAAA,QAAQ,EAAE;AACZ,gBAAA,CAAC,EACD,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI,EAClC,SAAS,EAAEC,QAAE,CACX,0FAA0F,EAC1F,CAAC,EAAE,IAAI,MAAM,CACd,EAAA,QAAA,EAAA,CAEDC,cAAA,CAACC,mBAAU,EAAA,EAAC,SAAS,EAAC,kBAAkB,iBAAa,MAAM,EAAA,CAAG,EAC9DD,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAED,QAAE,CAAC,UAAU,EAAE,CAAC,QAAQ,IAAI,SAAS,CAAC,YAAG,IAAI,EAAA,CAAQ,CAAA,EAAA,CAC/D,EACR,EAAE,KACDC,2BACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,QAAQ,gBACN,CAAC,CAAC,2BAA2B,EAAE,EAAE,IAAI,EAAE,CAAC,EAAA,aAAA,EACxC,qBAAqB,EACjC,OAAO,EAAE,CAAC,CAAC,KAAI;oBACb,CAAC,CAAC,cAAc,EAAE;AAClB,oBAAA,QAAQ,EAAE;AACZ,gBAAA,CAAC,EACD,SAAS,EAAC,mFAAmF,EAAA,QAAA,EAE7FA,cAAA,CAACE,SAAC,EAAA,EAAC,SAAS,EAAC,SAAS,iBAAa,MAAM,EAAA,CAAG,GACrC,CACV,CAAA,EAAA,CACI;AAEX;;;;"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var chatHostContext = require('../chat/chat-host-context.js');
|
|
5
|
+
var composerToolRow = require('./composer-tool-row.js');
|
|
6
|
+
var cpu = require('../../node_modules/.pnpm/lucide-react@0.528.0_react@19.1.0/node_modules/lucide-react/dist/esm/icons/cpu.js');
|
|
7
|
+
var x = require('../../node_modules/.pnpm/lucide-react@0.528.0_react@19.1.0/node_modules/lucide-react/dist/esm/icons/x.js');
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The model picked for this chat, shown only while it isn't the agent's own
|
|
11
|
+
* model, so it counts as a tool pill that is on. Its × goes back to the
|
|
12
|
+
* agent's model.
|
|
13
|
+
*/
|
|
14
|
+
function ComposerModelChip({ label, defaultLabel, onReset, }) {
|
|
15
|
+
const t = chatHostContext.useChatT();
|
|
16
|
+
const { showName } = composerToolRow.useComposerToolPill(true);
|
|
17
|
+
const backToDefault = t('chat.chatComposer.backToDefaultModel', { model: defaultLabel });
|
|
18
|
+
return (jsxRuntime.jsxs("span", { className: "flex h-8 min-w-0 items-center gap-1.5 overflow-hidden rounded-[10px] border border-[#D0E0FF] bg-[#F5F8FF] pr-2 pl-2.5 text-sm leading-5 font-medium text-[#38A1E5] transition-colors hover:bg-[#EAF1FF]", "data-testid": "composer-model-chip", title: showName ? undefined : label, children: [jsxRuntime.jsx(cpu.default, { className: "h-3.5 w-3.5 shrink-0", "aria-hidden": "true" }), jsxRuntime.jsx("span", { className: showName ? 'truncate' : 'sr-only', children: label }), jsxRuntime.jsx("button", { type: "button", "aria-label": backToDefault, title: backToDefault, "data-testid": "composer-model-reset", onClick: (e) => {
|
|
19
|
+
e.preventDefault();
|
|
20
|
+
onReset();
|
|
21
|
+
}, className: "flex h-full shrink-0 items-center", children: jsxRuntime.jsx(x.default, { className: "h-3 w-3", "aria-hidden": "true" }) })] }));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
exports.ComposerModelChip = ComposerModelChip;
|
|
25
|
+
//# sourceMappingURL=composer-model-chip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composer-model-chip.js","sources":["../../../../../../../src/components/chat-input-form/composer-model-chip.tsx"],"sourcesContent":[null],"names":["useChatT","useComposerToolPill","_jsxs","_jsx","Cpu","X"],"mappings":";;;;;;;;AAMA;;;;AAIG;AACG,SAAU,iBAAiB,CAAC,EAChC,KAAK,EACL,YAAY,EACZ,OAAO,GAKR,EAAA;AACC,IAAA,MAAM,CAAC,GAAGA,wBAAQ,EAAE;IACpB,MAAM,EAAE,QAAQ,EAAE,GAAGC,mCAAmB,CAAC,IAAI,CAAC;AAC9C,IAAA,MAAM,aAAa,GAAG,CAAC,CAAC,sCAAsC,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;AAExF,IAAA,QACEC,eAAA,CAAA,MAAA,EAAA,EACE,SAAS,EAAC,yMAAyM,EAAA,aAAA,EACvM,qBAAqB,EACjC,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,KAAK,EAAA,QAAA,EAAA,CAEnCC,cAAA,CAACC,WAAG,EAAA,EAAC,SAAS,EAAC,sBAAsB,EAAA,aAAA,EAAa,MAAM,EAAA,CAAG,EAC3DD,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,EAAA,QAAA,EAAG,KAAK,EAAA,CAAQ,EAClEA,2BACE,IAAI,EAAC,QAAQ,EAAA,YAAA,EACD,aAAa,EACzB,KAAK,EAAE,aAAa,EAAA,aAAA,EACR,sBAAsB,EAClC,OAAO,EAAE,CAAC,CAAC,KAAI;oBACb,CAAC,CAAC,cAAc,EAAE;AAClB,oBAAA,OAAO,EAAE;AACX,gBAAA,CAAC,EACD,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAE7CA,eAACE,SAAC,EAAA,EAAC,SAAS,EAAC,SAAS,EAAA,aAAA,EAAa,MAAM,GAAG,EAAA,CACrC,CAAA,EAAA,CACJ;AAEX;;;;"}
|
|
@@ -20,7 +20,7 @@ var chevronRight = require('../../node_modules/.pnpm/lucide-react@0.528.0_react@
|
|
|
20
20
|
var camera = require('../../node_modules/.pnpm/lucide-react@0.528.0_react@19.1.0/node_modules/lucide-react/dist/esm/icons/camera.js');
|
|
21
21
|
var paperclip = require('../../node_modules/.pnpm/lucide-react@0.528.0_react@19.1.0/node_modules/lucide-react/dist/esm/icons/paperclip.js');
|
|
22
22
|
var slidersHorizontal = require('../../node_modules/.pnpm/lucide-react@0.528.0_react@19.1.0/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js');
|
|
23
|
-
var
|
|
23
|
+
var sparkles = require('../../node_modules/.pnpm/lucide-react@0.528.0_react@19.1.0/node_modules/lucide-react/dist/esm/icons/sparkles.js');
|
|
24
24
|
var cpu = require('../../node_modules/.pnpm/lucide-react@0.528.0_react@19.1.0/node_modules/lucide-react/dist/esm/icons/cpu.js');
|
|
25
25
|
var terminal = require('../../node_modules/.pnpm/lucide-react@0.528.0_react@19.1.0/node_modules/lucide-react/dist/esm/icons/terminal.js');
|
|
26
26
|
var archive = require('../../node_modules/.pnpm/lucide-react@0.528.0_react@19.1.0/node_modules/lucide-react/dist/esm/icons/archive.js');
|
|
@@ -106,7 +106,7 @@ function ComposerPlusMenu({ isMobile, disabled = false, attachDisabled = false,
|
|
|
106
106
|
}, children: [jsxRuntime.jsx(camera.default, { className: "h-5 w-5 text-gray-600", "aria-hidden": "true" }), t('chat.chatInputFormUploadMenu.camera')] })), showUpload && (jsxRuntime.jsxs("button", { type: "button", className: tile, disabled: attachDisabled, onClick: () => {
|
|
107
107
|
closeSheet();
|
|
108
108
|
onUploadFile();
|
|
109
|
-
}, children: [jsxRuntime.jsx(paperclip.default, { className: "h-5 w-5 text-gray-600", "aria-hidden": "true" }), t('chat.chatInputFormUploadMenu.uploadFile')] }))] })), showTools && (jsxRuntime.jsxs("button", { type: "button", className: sheetRow, onClick: () => setSheetPage('tools'), children: [jsxRuntime.jsx(slidersHorizontal.default, { className: "h-[18px] w-[18px] text-gray-600", "aria-hidden": "true" }), jsxRuntime.jsx("span", { className: "flex-1", children: t('chat.chatComposer.tools') }), jsxRuntime.jsx(CountBadge, { count: activeToolCount, label: t('chat.chatComposer.activeCount', { count: activeToolCount }) }), chevron] })), showSkills && (jsxRuntime.jsxs("button", { type: "button", className: sheetRow, "data-testid": "skills-menu-trigger", onClick: () => setSheetPage('skills'), children: [jsxRuntime.jsx(
|
|
109
|
+
}, children: [jsxRuntime.jsx(paperclip.default, { className: "h-5 w-5 text-gray-600", "aria-hidden": "true" }), t('chat.chatInputFormUploadMenu.uploadFile')] }))] })), showTools && (jsxRuntime.jsxs("button", { type: "button", className: sheetRow, onClick: () => setSheetPage('tools'), children: [jsxRuntime.jsx(slidersHorizontal.default, { className: "h-[18px] w-[18px] text-gray-600", "aria-hidden": "true" }), jsxRuntime.jsx("span", { className: "flex-1", children: t('chat.chatComposer.tools') }), jsxRuntime.jsx(CountBadge, { count: activeToolCount, label: t('chat.chatComposer.activeCount', { count: activeToolCount }) }), chevron] })), showSkills && (jsxRuntime.jsxs("button", { type: "button", className: sheetRow, "data-testid": "skills-menu-trigger", onClick: () => setSheetPage('skills'), children: [jsxRuntime.jsx(sparkles.default, { className: "h-[18px] w-[18px] text-gray-600", "aria-hidden": "true" }), jsxRuntime.jsx("span", { className: "flex-1", children: t('chat.chatInputFormInsideButtons.skills') }), jsxRuntime.jsx(CountBadge, { count: activeSkillCount, label: t('chat.chatComposer.activeCount', { count: activeSkillCount }) }), chevron] })), models && (jsxRuntime.jsxs("button", { type: "button", className: sheetRow, "data-testid": "composer-model-trigger", onClick: () => setSheetPage('model'), children: [jsxRuntime.jsx(cpu.default, { className: "h-[18px] w-[18px] text-gray-600", "aria-hidden": "true" }), jsxRuntime.jsx("span", { className: "flex-1", children: t('chat.chatComposer.model') }), jsxRuntime.jsx("span", { className: "max-w-[45%] truncate text-[13px] text-gray-500", children: models.current.label }), chevron] })), showPrompts && (jsxRuntime.jsxs("button", { type: "button", className: sheetRow, onClick: () => {
|
|
110
110
|
closeSheet();
|
|
111
111
|
onOpenPrompts();
|
|
112
112
|
}, children: [jsxRuntime.jsx(terminal.default, { className: "h-[18px] w-[18px] text-gray-600", "aria-hidden": "true" }), jsxRuntime.jsx("span", { className: "flex-1", children: t('chat.chatInputFormInsideButtons.prompts') }), chevron] })), showMemory && (jsxRuntime.jsxs("button", { type: "button", className: sheetRow, "data-testid": "chat-memory-button", onClick: () => setSheetPage('memory'), children: [jsxRuntime.jsx(archive.default, { className: "h-[18px] w-[18px] text-gray-600", "aria-hidden": "true" }), jsxRuntime.jsx("span", { className: "flex-1", children: t('chat.chatInputFormInsideButtons.memory') })] }))] })), sheetPage === 'tools' && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [modes.map((tool) => (jsxRuntime.jsx(MobileToolRow, { tool: tool, label: toolLabel(tool) }, tool.key))), modes.length > 0 && plainTools.length > 0 && (jsxRuntime.jsx("div", { role: "separator", className: "mx-1.5 my-1.5 h-px shrink-0 bg-gray-200" })), plainTools.map((tool) => (jsxRuntime.jsx(MobileToolRow, { tool: tool, label: toolLabel(tool) }, tool.key)))] })), sheetPage === 'skills' && (jsxRuntime.jsxs("div", { "data-testid": "skills-menu-content", className: "flex flex-col", children: [skills.map((skill) => {
|
|
@@ -133,7 +133,7 @@ function ComposerPlusMenu({ isMobile, disabled = false, attachDisabled = false,
|
|
|
133
133
|
onCamera();
|
|
134
134
|
}, children: [showUpload && (jsxRuntime.jsxs(dropdownMenu.DropdownMenuItem, { className: ROW_CLASS, disabled: attachDisabled, onSelect: onUploadFile, children: [jsxRuntime.jsx(paperclip.default, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), jsxRuntime.jsx("span", { className: "flex-1", children: t('chat.chatInputFormUploadMenu.uploadFile') })] })), showCamera && (jsxRuntime.jsxs(dropdownMenu.DropdownMenuItem, { className: ROW_CLASS, disabled: attachDisabled, onSelect: () => {
|
|
135
135
|
cameraPickedRef.current = true;
|
|
136
|
-
}, children: [jsxRuntime.jsx(camera.default, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), jsxRuntime.jsx("span", { className: "flex-1", children: t('chat.chatInputFormUploadMenu.camera') })] })), showAttach && hasListAfterAttach && (jsxRuntime.jsx(dropdownMenu.DropdownMenuSeparator, { className: "mx-1.5 my-1 bg-gray-200" })), showTools && (jsxRuntime.jsxs(dropdownMenu.DropdownMenuSub, { children: [jsxRuntime.jsx(SubTrigger, { icon: jsxRuntime.jsx(slidersHorizontal.default, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), label: t('chat.chatComposer.tools'), count: activeToolCount, countLabel: t('chat.chatComposer.activeCount', { count: activeToolCount }), testId: "composer-tools-trigger" }), jsxRuntime.jsx(index.Portal, { container: portalContainer !== null && portalContainer !== void 0 ? portalContainer : undefined, children: jsxRuntime.jsxs(dropdownMenu.DropdownMenuSubContent, { sideOffset: 6, alignOffset: -7, collisionPadding: 8, "data-testid": "composer-tools-menu", "aria-label": t('chat.chatComposer.tools'), className: utils.cn(POP_CLASS, 'flex max-h-[min(70vh,30rem)] w-56 flex-col gap-0.5 overflow-y-auto'), children: [modes.map((tool) => (jsxRuntime.jsx(ToolCheckboxItem, { tool: tool, label: toolLabel(tool) }, tool.key))), modes.length > 0 && plainTools.length > 0 && (jsxRuntime.jsx(dropdownMenu.DropdownMenuSeparator, { className: "mx-1.5 my-1 bg-gray-200" })), plainTools.map((tool) => (jsxRuntime.jsx(ToolCheckboxItem, { tool: tool, label: toolLabel(tool) }, tool.key)))] }) })] })), showSkills && (jsxRuntime.jsxs(dropdownMenu.DropdownMenuSub, { children: [jsxRuntime.jsx(SubTrigger, { icon: jsxRuntime.jsx(
|
|
136
|
+
}, children: [jsxRuntime.jsx(camera.default, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), jsxRuntime.jsx("span", { className: "flex-1", children: t('chat.chatInputFormUploadMenu.camera') })] })), showAttach && hasListAfterAttach && (jsxRuntime.jsx(dropdownMenu.DropdownMenuSeparator, { className: "mx-1.5 my-1 bg-gray-200" })), showTools && (jsxRuntime.jsxs(dropdownMenu.DropdownMenuSub, { children: [jsxRuntime.jsx(SubTrigger, { icon: jsxRuntime.jsx(slidersHorizontal.default, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), label: t('chat.chatComposer.tools'), count: activeToolCount, countLabel: t('chat.chatComposer.activeCount', { count: activeToolCount }), testId: "composer-tools-trigger" }), jsxRuntime.jsx(index.Portal, { container: portalContainer !== null && portalContainer !== void 0 ? portalContainer : undefined, children: jsxRuntime.jsxs(dropdownMenu.DropdownMenuSubContent, { sideOffset: 6, alignOffset: -7, collisionPadding: 8, "data-testid": "composer-tools-menu", "aria-label": t('chat.chatComposer.tools'), className: utils.cn(POP_CLASS, 'flex max-h-[min(70vh,30rem)] w-56 flex-col gap-0.5 overflow-y-auto'), children: [modes.map((tool) => (jsxRuntime.jsx(ToolCheckboxItem, { tool: tool, label: toolLabel(tool) }, tool.key))), modes.length > 0 && plainTools.length > 0 && (jsxRuntime.jsx(dropdownMenu.DropdownMenuSeparator, { className: "mx-1.5 my-1 bg-gray-200" })), plainTools.map((tool) => (jsxRuntime.jsx(ToolCheckboxItem, { tool: tool, label: toolLabel(tool) }, tool.key)))] }) })] })), showSkills && (jsxRuntime.jsxs(dropdownMenu.DropdownMenuSub, { children: [jsxRuntime.jsx(SubTrigger, { icon: jsxRuntime.jsx(sparkles.default, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), label: t('chat.chatInputFormInsideButtons.skills'), count: activeSkillCount, countLabel: t('chat.chatComposer.activeCount', { count: activeSkillCount }), testId: "skills-menu-trigger" }), jsxRuntime.jsx(index.Portal, { container: portalContainer !== null && portalContainer !== void 0 ? portalContainer : undefined, children: jsxRuntime.jsxs(dropdownMenu.DropdownMenuSubContent, { sideOffset: 6, alignOffset: -7, collisionPadding: 8, "data-testid": "skills-menu-content", "aria-label": t('chat.chatInputFormInsideButtons.skills'), onScroll: handleSkillsScroll, className: utils.cn(POP_CLASS, 'flex max-h-[min(60vh,20rem)] w-56 flex-col gap-0.5 overflow-y-auto'), children: [skills.map((skill) => {
|
|
137
137
|
const armed = activeSkillSlugs.has(skill.slug);
|
|
138
138
|
return (jsxRuntime.jsxs(index.CheckboxItem, { checked: armed, "data-testid": `skills-menu-item-${skill.slug}`, title: `/${skill.slug}`, className: utils.cn(ROW_CLASS, 'h-auto min-h-9 py-1.5'), onSelect: () => onToggleSkill(skill), children: [jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [jsxRuntime.jsx("span", { "data-testid": "skills-menu-item-name", className: "break-words", children: skill.name }), jsxRuntime.jsxs("span", { "data-testid": "skills-menu-item-slug", className: "text-xs break-all text-gray-500", children: ["/", skill.slug] })] }), armed && (jsxRuntime.jsx(check.default, { className: "h-4 w-4 text-[#2563eb]", "aria-hidden": "true" }))] }, skill.unique_id));
|
|
139
139
|
}), loadingMoreRow] }) })] })), models && (jsxRuntime.jsxs(dropdownMenu.DropdownMenuSub, { children: [jsxRuntime.jsxs(dropdownMenu.DropdownMenuSubTrigger, { "data-testid": "composer-model-trigger", className: utils.cn(ROW_CLASS, '[&>svg:last-child]:h-3.5 [&>svg:last-child]:w-3.5 [&>svg:last-child]:text-gray-500'), children: [jsxRuntime.jsx(cpu.default, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), jsxRuntime.jsx("span", { className: "flex-1", children: t('chat.chatComposer.model') }), jsxRuntime.jsx("span", { className: "max-w-[96px] truncate text-[13px] text-gray-500", children: models.current.label })] }), jsxRuntime.jsx(index.Portal, { container: portalContainer !== null && portalContainer !== void 0 ? portalContainer : undefined, children: jsxRuntime.jsxs(dropdownMenu.DropdownMenuSubContent, { sideOffset: 6, alignOffset: -7, collisionPadding: 8, "data-testid": "composer-model-providers", "aria-label": t('chat.chatComposer.modelForThisChat'), className: utils.cn(POP_CLASS, 'flex max-h-[min(70vh,30rem)] w-[272px] flex-col gap-0.5 overflow-y-auto'), children: [jsxRuntime.jsxs("div", { className: "shrink-0 px-2.5 pt-2 pb-1.5", children: [jsxRuntime.jsx("div", { className: "text-sm font-semibold text-gray-900", children: t('chat.chatComposer.modelForThisChat') }), jsxRuntime.jsx("div", { className: "text-xs text-gray-600", children: t('chat.chatComposer.newChatsUseDefault', {
|