@blade-hq/agent-react 2612.0.0-beta.27 → 2612.0.0-beta.29
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/chat/AgentLoopBlock.d.ts +0 -2
- package/dist/chat/AssistantTurnBlock.d.ts +0 -8
- package/dist/chat/AttachmentPreviewDialog.d.ts +0 -1
- package/dist/chat/CurrentPlanPanel.d.ts +0 -3
- package/dist/chat/FileDeliveryCards.d.ts +0 -4
- package/dist/chat/FinalArtifactCards.d.ts +0 -1
- package/dist/chat/LiteMessageList.d.ts +1 -3
- package/dist/chat/MessageFileAttachmentList.d.ts +0 -5
- package/dist/chat/SessionReplayBar.d.ts +0 -1
- package/dist/chat/TextAttachmentPills.d.ts +0 -3
- package/dist/chat/TurnNavRail.d.ts +0 -3
- package/dist/chat/WorkflowRunBlock.d.ts +0 -2
- package/dist/chat/ai-elements/shimmer.d.ts +0 -4
- package/dist/chat/message-list-blocks.d.ts +0 -1
- package/dist/chat/runtime/actions.d.ts +1 -2
- package/dist/chat/runtime/background-task-dismissals.d.ts +0 -1
- package/dist/chat/runtime/composer-channels.d.ts +0 -3
- package/dist/chat/runtime/input-cache-reset.d.ts +0 -5
- package/dist/chat/runtime/session-source.d.ts +0 -5
- package/dist/chat/runtime/use-chat-actions.d.ts +0 -4
- package/dist/{chat-OCLOVB3H.css → chat-IHPRU35X.css} +5 -18
- package/dist/chat.css +5 -18
- package/dist/{chunk-66V4EOSO.js → chunk-M5NAFIU4.js} +340 -399
- package/dist/chunk-M5NAFIU4.js.map +1 -0
- package/dist/{chunk-PAZSK73V.js → chunk-PHWYZP6F.js} +3 -8
- package/dist/chunk-PHWYZP6F.js.map +1 -0
- package/dist/{chunk-PPREDKQ2.js → chunk-XTYNDVUV.js} +15 -3
- package/dist/chunk-XTYNDVUV.js.map +1 -0
- package/dist/components/ChatInput.d.ts +1 -15
- package/dist/components/LlmAdvancedSettings.d.ts +0 -1
- package/dist/components/PlanUpdateBlock.d.ts +0 -1
- package/dist/embed/blade-chat-element.d.ts +0 -8
- package/dist/embed/entry.d.ts +1 -13
- package/dist/hooks/use-message-pin.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/internal.js +4 -6
- package/dist/internal.js.map +1 -1
- package/dist/lib/message-shortcuts.d.ts +5 -0
- package/dist/rich-input/ConnectButton.d.ts +0 -2
- package/dist/rich-input/SkillStatusBar.d.ts +0 -6
- package/dist/rich-input/lib/reference-candidates.d.ts +0 -1
- package/dist/rich-input/voice/VoiceWaveform.d.ts +0 -3
- package/dist/rich-input.js +90 -110
- package/dist/rich-input.js.map +1 -1
- package/dist/style.css +16 -55
- package/dist/style.full.css +23 -77
- package/package.json +2 -2
- package/dist/chunk-66V4EOSO.js.map +0 -1
- package/dist/chunk-PAZSK73V.js.map +0 -1
- package/dist/chunk-PPREDKQ2.js.map +0 -1
package/dist/rich-input.js
CHANGED
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
PluginTriggerStack,
|
|
4
4
|
selectionFromItem,
|
|
5
5
|
triggerSummary
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-PHWYZP6F.js";
|
|
7
7
|
import {
|
|
8
8
|
Archive,
|
|
9
9
|
BookOpen,
|
|
@@ -49,9 +49,11 @@ import {
|
|
|
49
49
|
dist_exports2 as dist_exports,
|
|
50
50
|
getInputHistoryGeneration,
|
|
51
51
|
getPluginSuggestionItems,
|
|
52
|
+
isQueueShortcut,
|
|
52
53
|
notifyChat,
|
|
53
54
|
onInputCachesReset,
|
|
54
55
|
pluginRefsForSend,
|
|
56
|
+
queueShortcutLabel,
|
|
55
57
|
sendToSession,
|
|
56
58
|
useBladeClient,
|
|
57
59
|
useChatEnvironment,
|
|
@@ -62,7 +64,7 @@ import {
|
|
|
62
64
|
usePortalContainer,
|
|
63
65
|
useSessionHandle,
|
|
64
66
|
useSessionState
|
|
65
|
-
} from "./chunk-
|
|
67
|
+
} from "./chunk-XTYNDVUV.js";
|
|
66
68
|
import {
|
|
67
69
|
__commonJS,
|
|
68
70
|
__require,
|
|
@@ -249,7 +251,6 @@ var backgroundTaskDismissals = {
|
|
|
249
251
|
state = { ...state, [sessionId]: [...existing, taskId] };
|
|
250
252
|
emit();
|
|
251
253
|
},
|
|
252
|
-
/** 换身份:清空。 */
|
|
253
254
|
reset() {
|
|
254
255
|
state = {};
|
|
255
256
|
emit();
|
|
@@ -476,7 +477,6 @@ function useClientModelCatalog() {
|
|
|
476
477
|
const { data, isLoading, isFetching, refetch } = useClientQuery(
|
|
477
478
|
CATALOG_KEY,
|
|
478
479
|
(client) => client.json("GET", "/api/config/models"),
|
|
479
|
-
// 模型服务在设置里随时可改:打开选择器时总是重新拉一次(见 ModelSelector)
|
|
480
480
|
{ staleMs: 0 }
|
|
481
481
|
);
|
|
482
482
|
return {
|
|
@@ -599,7 +599,6 @@ var STATUS_LABELS = {
|
|
|
599
599
|
succeeded: "\u5DF2\u5B8C\u6210",
|
|
600
600
|
cancelled: "\u5DF2\u505C\u6B62",
|
|
601
601
|
failed: "\u5931\u8D25",
|
|
602
|
-
// 不是失败:平台只是不再能追踪这个进程,它可能还在跑。
|
|
603
602
|
lost: "\u72B6\u6001\u672A\u77E5"
|
|
604
603
|
};
|
|
605
604
|
function statusLabel(status) {
|
|
@@ -758,7 +757,6 @@ function BackgroundTasksPill({ sessionId }) {
|
|
|
758
757
|
title,
|
|
759
758
|
output: "",
|
|
760
759
|
loading: false,
|
|
761
|
-
// 跟丢或过期的任务,控制目录可能已经被回收,报错串对用户没有意义。
|
|
762
760
|
error: "\u65E5\u5FD7\u5DF2\u65E0\u6CD5\u8BFB\u53D6\uFF0C\u53EF\u80FD\u5DF2\u88AB\u6E05\u7406"
|
|
763
761
|
});
|
|
764
762
|
}
|
|
@@ -832,64 +830,59 @@ function BackgroundTasksPill({ sessionId }) {
|
|
|
832
830
|
]
|
|
833
831
|
}
|
|
834
832
|
),
|
|
835
|
-
open ? (
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
833
|
+
open ? /* @__PURE__ */ jsx2("div", { className: "absolute bottom-full left-0 z-40 mb-2 w-[min(24rem,calc(100vw-2rem))] rounded-xl border border-[hsl(var(--border))] bg-[hsl(var(--popover))] p-2 text-xs text-[hsl(var(--popover-foreground))] shadow-[var(--swf-shadow-overlay)] before:absolute before:inset-x-0 before:top-full before:h-2 before:content-['']", children: /* @__PURE__ */ jsxs("div", { className: "max-h-72 space-y-2 overflow-y-auto", children: [
|
|
834
|
+
activeTasks.map((task) => /* @__PURE__ */ jsx2(
|
|
835
|
+
TaskCard,
|
|
836
|
+
{
|
|
837
|
+
task,
|
|
838
|
+
onOpenLog: () => void openTaskLog(task),
|
|
839
|
+
onStop: () => requestStopTask(task),
|
|
840
|
+
onDismiss: ATTENTION_STATUSES.has(task.status) ? () => hideTask(task.id) : null
|
|
841
|
+
},
|
|
842
|
+
task.id
|
|
843
|
+
)),
|
|
844
|
+
historyTasks.length > 0 ? /* @__PURE__ */ jsxs(
|
|
845
|
+
"div",
|
|
846
|
+
{
|
|
847
|
+
className: cn(
|
|
848
|
+
activeTasks.length > 0 && "border-t border-[hsl(var(--border))] pt-2"
|
|
849
|
+
),
|
|
850
|
+
children: [
|
|
851
|
+
/* @__PURE__ */ jsxs(
|
|
852
|
+
"button",
|
|
853
|
+
{
|
|
854
|
+
type: "button",
|
|
855
|
+
onClick: () => setHistoryOverride(!historyOpen),
|
|
856
|
+
"aria-expanded": historyOpen,
|
|
857
|
+
className: "flex w-full items-center gap-1 px-1 py-1 text-[11px] text-[hsl(var(--muted-foreground))] transition-colors hover:text-[hsl(var(--foreground))]",
|
|
858
|
+
children: [
|
|
859
|
+
/* @__PURE__ */ jsx2(
|
|
860
|
+
ChevronDown,
|
|
861
|
+
{
|
|
862
|
+
size: 12,
|
|
863
|
+
className: cn("transition-transform", historyOpen ? "" : "-rotate-90")
|
|
864
|
+
}
|
|
865
|
+
),
|
|
866
|
+
"\u5386\u53F2\u540E\u53F0\u4EFB\u52A1\uFF08",
|
|
867
|
+
historyTasks.length,
|
|
868
|
+
"\uFF09"
|
|
869
|
+
]
|
|
870
|
+
}
|
|
855
871
|
),
|
|
856
|
-
children:
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
}
|
|
871
|
-
),
|
|
872
|
-
"\u5386\u53F2\u540E\u53F0\u4EFB\u52A1\uFF08",
|
|
873
|
-
historyTasks.length,
|
|
874
|
-
"\uFF09"
|
|
875
|
-
]
|
|
876
|
-
}
|
|
877
|
-
),
|
|
878
|
-
historyOpen ? /* @__PURE__ */ jsx2("div", { className: "mt-2 space-y-2", children: historyTasks.map((task) => /* @__PURE__ */ jsx2(
|
|
879
|
-
TaskCard,
|
|
880
|
-
{
|
|
881
|
-
task,
|
|
882
|
-
onOpenLog: () => void openTaskLog(task),
|
|
883
|
-
onStop: () => requestStopTask(task),
|
|
884
|
-
onDismiss: null
|
|
885
|
-
},
|
|
886
|
-
task.id
|
|
887
|
-
)) }) : null
|
|
888
|
-
]
|
|
889
|
-
}
|
|
890
|
-
) : null
|
|
891
|
-
] }) })
|
|
892
|
-
) : null
|
|
872
|
+
historyOpen ? /* @__PURE__ */ jsx2("div", { className: "mt-2 space-y-2", children: historyTasks.map((task) => /* @__PURE__ */ jsx2(
|
|
873
|
+
TaskCard,
|
|
874
|
+
{
|
|
875
|
+
task,
|
|
876
|
+
onOpenLog: () => void openTaskLog(task),
|
|
877
|
+
onStop: () => requestStopTask(task),
|
|
878
|
+
onDismiss: null
|
|
879
|
+
},
|
|
880
|
+
task.id
|
|
881
|
+
)) }) : null
|
|
882
|
+
]
|
|
883
|
+
}
|
|
884
|
+
) : null
|
|
885
|
+
] }) }) : null
|
|
893
886
|
]
|
|
894
887
|
}
|
|
895
888
|
)
|
|
@@ -19234,13 +19227,11 @@ var composerChannels = {
|
|
|
19234
19227
|
clearModelDraft(sessionId) {
|
|
19235
19228
|
setState((current) => ({ ...current, modelDrafts: withoutKey(current.modelDrafts, sessionId) }));
|
|
19236
19229
|
},
|
|
19237
|
-
/** 回退到某一步后,把那一步的用户原话放回输入框(null 清除)。 */
|
|
19238
19230
|
setRewindDraft(sessionId, text) {
|
|
19239
19231
|
setState(
|
|
19240
19232
|
(current) => text === null ? { ...current, rewindDrafts: withoutKey(current.rewindDrafts, sessionId) } : { ...current, rewindDrafts: { ...current.rewindDrafts, [sessionId]: text } }
|
|
19241
19233
|
);
|
|
19242
19234
|
},
|
|
19243
|
-
/** 会话被关闭 / 删除:清掉它还没被取走的信号。 */
|
|
19244
19235
|
clearSession(sessionId) {
|
|
19245
19236
|
setState((current) => ({
|
|
19246
19237
|
...current,
|
|
@@ -19250,7 +19241,6 @@ var composerChannels = {
|
|
|
19250
19241
|
sendRequests: withoutKey(current.sendRequests, sessionId)
|
|
19251
19242
|
}));
|
|
19252
19243
|
},
|
|
19253
|
-
/** 换身份:清空全部通道。 */
|
|
19254
19244
|
reset() {
|
|
19255
19245
|
setState(() => ({ topicAssetReferences: {}, pendingContexts: {}, draftAppends: {}, sendRequests: {}, modelDrafts: {}, rewindDrafts: {} }));
|
|
19256
19246
|
}
|
|
@@ -25639,9 +25629,6 @@ function useResolvedModel(activeSessionModel) {
|
|
|
25639
25629
|
reasoningLevels: selectedModel?.reasoningLevels ?? [],
|
|
25640
25630
|
defaultReasoningLevel: selectedModel?.defaultReasoningLevel ?? "",
|
|
25641
25631
|
modelAvailabilityMessage,
|
|
25642
|
-
// Undefined means the catalog is still loading or the model does not
|
|
25643
|
-
// publish this optional capability. In either case keep existing upload
|
|
25644
|
-
// behavior until the server has explicitly said images are unsupported.
|
|
25645
25632
|
supportsImage: selectedModel?.supportsImage ?? selectedModel?.inputModalities?.includes("image")
|
|
25646
25633
|
};
|
|
25647
25634
|
}
|
|
@@ -25841,10 +25828,7 @@ function ModelSelector({
|
|
|
25841
25828
|
className: `flex min-w-0 items-center gap-1 rounded-lg py-[5px] text-muted-foreground ${compact ? "ml-auto px-1.5" : "px-2.5"}`,
|
|
25842
25829
|
title: selectorTitle,
|
|
25843
25830
|
children: [
|
|
25844
|
-
isLoading ? /* @__PURE__ */ jsx12(LoaderCircle, { size: 14, className: "animate-spin", "aria-hidden": "true" }) : compact ? null : (
|
|
25845
|
-
// compact 用于「+」菜单的「模型」行,行首已有图标,触发器内不再重复。
|
|
25846
|
-
/* @__PURE__ */ jsx12(Sparkles, { size: 14, "aria-hidden": "true" })
|
|
25847
|
-
),
|
|
25831
|
+
isLoading ? /* @__PURE__ */ jsx12(LoaderCircle, { size: 14, className: "animate-spin", "aria-hidden": "true" }) : compact ? null : /* @__PURE__ */ jsx12(Sparkles, { size: 14, "aria-hidden": "true" }),
|
|
25848
25832
|
/* @__PURE__ */ jsx12(
|
|
25849
25833
|
"span",
|
|
25850
25834
|
{
|
|
@@ -26218,20 +26202,16 @@ function SkillStatusBar({
|
|
|
26218
26202
|
/* @__PURE__ */ jsx14("span", { className: "mt-1.5 inline-block h-2 w-2 shrink-0 rounded-full border border-[hsl(var(--swf-success))] bg-transparent" }),
|
|
26219
26203
|
/* @__PURE__ */ jsx14("span", { className: "break-words", children: skillDisplayName(skill) })
|
|
26220
26204
|
] }, skill.skill_id)) }) : null }) : null
|
|
26221
|
-
] }) : (
|
|
26222
|
-
|
|
26223
|
-
|
|
26224
|
-
|
|
26225
|
-
|
|
26226
|
-
|
|
26227
|
-
|
|
26228
|
-
|
|
26229
|
-
|
|
26230
|
-
|
|
26231
|
-
children: item.text
|
|
26232
|
-
}
|
|
26233
|
-
) : /* @__PURE__ */ jsx14("span", { className: "font-mono", children: item.text })
|
|
26234
|
-
)
|
|
26205
|
+
] }) : onOpenSkills ? /* @__PURE__ */ jsx14(
|
|
26206
|
+
"button",
|
|
26207
|
+
{
|
|
26208
|
+
type: "button",
|
|
26209
|
+
onClick: onOpenSkills,
|
|
26210
|
+
title: "\u67E5\u770B\u5DF2\u5B89\u88C5\u7684\u6280\u80FD",
|
|
26211
|
+
className: "cursor-pointer font-mono underline decoration-dotted underline-offset-2 transition-colors hover:text-[hsl(var(--foreground))]",
|
|
26212
|
+
children: item.text
|
|
26213
|
+
}
|
|
26214
|
+
) : /* @__PURE__ */ jsx14("span", { className: "font-mono", children: item.text })
|
|
26235
26215
|
]
|
|
26236
26216
|
},
|
|
26237
26217
|
item.key
|
|
@@ -26251,8 +26231,6 @@ function toItem(skill) {
|
|
|
26251
26231
|
displayName: skill.display_name,
|
|
26252
26232
|
description: skill.description,
|
|
26253
26233
|
local: skill.local,
|
|
26254
|
-
// 本地技能天然可用。搜索结果带后端算好的安装状态,列表接口没有这个字段
|
|
26255
|
-
// 时按 local 推断。
|
|
26256
26234
|
installed: "installed" in skill ? skill.installed : skill.local,
|
|
26257
26235
|
hasFlow: skill.has_flow === true
|
|
26258
26236
|
};
|
|
@@ -26848,7 +26826,6 @@ function createReferenceCandidateController(getScope, sources, timeoutMs = 300)
|
|
|
26848
26826
|
}
|
|
26849
26827
|
return result;
|
|
26850
26828
|
},
|
|
26851
|
-
/** Bind by result identity, never by label/query: closing and reopening @ is a new request. */
|
|
26852
26829
|
observe(items, listener) {
|
|
26853
26830
|
const request = requests.get(items);
|
|
26854
26831
|
if (!request || !isCurrent(request)) {
|
|
@@ -28540,7 +28517,7 @@ function ChatInput({
|
|
|
28540
28517
|
}
|
|
28541
28518
|
};
|
|
28542
28519
|
const stableAppendFiles = useEffectEvent((files) => appendFiles(files));
|
|
28543
|
-
const stableHandleSubmit = useEffectEvent(() => handleSubmit());
|
|
28520
|
+
const stableHandleSubmit = useEffectEvent((queueWhenRunning = false) => handleSubmit(queueWhenRunning));
|
|
28544
28521
|
const getEditorState = useEffectEvent(() => ({
|
|
28545
28522
|
input,
|
|
28546
28523
|
connectionStatus,
|
|
@@ -28571,7 +28548,6 @@ function ChatInput({
|
|
|
28571
28548
|
gapcursor: false,
|
|
28572
28549
|
heading: false,
|
|
28573
28550
|
horizontalRule: false,
|
|
28574
|
-
// 输入框是纯文本输入区,关掉自动识别链接,避免点击输入的网址直接跳转
|
|
28575
28551
|
link: false,
|
|
28576
28552
|
orderedList: false
|
|
28577
28553
|
}),
|
|
@@ -28816,7 +28792,7 @@ function ChatInput({
|
|
|
28816
28792
|
if (state3.connectionStatus !== "connected") {
|
|
28817
28793
|
return true;
|
|
28818
28794
|
}
|
|
28819
|
-
void state3.handleSubmit();
|
|
28795
|
+
void state3.handleSubmit(isQueueShortcut(event));
|
|
28820
28796
|
return true;
|
|
28821
28797
|
}
|
|
28822
28798
|
return false;
|
|
@@ -28979,7 +28955,11 @@ ${append2.text}` : append2.text;
|
|
|
28979
28955
|
}
|
|
28980
28956
|
}
|
|
28981
28957
|
}, [activeSessionId, isRecording]);
|
|
28982
|
-
const
|
|
28958
|
+
const hasRunningSendBlockers = () => {
|
|
28959
|
+
const json = editor?.getJSON();
|
|
28960
|
+
return composerAttachments.length > 0 || collectMessageMentions(json).length > 0 || collectTopicAssetMentions(json).length > 0;
|
|
28961
|
+
};
|
|
28962
|
+
const handleSubmit = async (queueWhenRunning = false) => {
|
|
28983
28963
|
if (connectionStatus !== "connected") {
|
|
28984
28964
|
return;
|
|
28985
28965
|
}
|
|
@@ -28994,12 +28974,9 @@ ${append2.text}` : append2.text;
|
|
|
28994
28974
|
notifyChat(environment, "info", "\u5F53\u524D\u56DE\u590D\u5C1A\u672A\u7ED3\u675F\uFF0C\u8BF7\u7B49\u5F85\u672C\u8F6E\u7ED3\u675F\u540E\u518D\u53D1\u9001");
|
|
28995
28975
|
return;
|
|
28996
28976
|
}
|
|
28997
|
-
if (isStreaming) {
|
|
28998
|
-
|
|
28999
|
-
|
|
29000
|
-
notifyChat(environment, "info", "\u5F53\u524D\u56DE\u590D\u5C1A\u672A\u7ED3\u675F\uFF0C\u5E26\u9644\u4EF6\u6216\u5F15\u7528\u7684\u6D88\u606F\u8BF7\u7B49\u5F85\u672C\u8F6E\u7ED3\u675F\u540E\u518D\u53D1\u9001");
|
|
29001
|
-
return;
|
|
29002
|
-
}
|
|
28977
|
+
if (isStreaming && hasRunningSendBlockers()) {
|
|
28978
|
+
notifyChat(environment, "info", "\u5F53\u524D\u56DE\u590D\u5C1A\u672A\u7ED3\u675F\uFF0C\u5E26\u9644\u4EF6\u6216\u5F15\u7528\u7684\u6D88\u606F\u8BF7\u7B49\u5F85\u672C\u8F6E\u7ED3\u675F\u540E\u518D\u53D1\u9001");
|
|
28979
|
+
return;
|
|
29003
28980
|
}
|
|
29004
28981
|
if (!isStreaming) {
|
|
29005
28982
|
const modelGate = gateSendWhileModelLoading(isModelLoading, hasComposerContent);
|
|
@@ -29170,10 +29147,10 @@ ${append2.text}` : append2.text;
|
|
|
29170
29147
|
try {
|
|
29171
29148
|
accepted = await onSend(nextPayload, {
|
|
29172
29149
|
targetSessionId: uploadTargetSessionId,
|
|
29150
|
+
queueWhenRunning,
|
|
29173
29151
|
model: submitModels.sendModel,
|
|
29174
29152
|
thinkingOverride: thinkingAvailable && selectedReasoningLevel ? true : void 0,
|
|
29175
29153
|
reasoningLevel: thinkingAvailable ? selectedReasoningLevel || void 0 : void 0,
|
|
29176
|
-
// 只有用户显式 @ 知识库才传选择;纯文本不附加知识库指令。
|
|
29177
29154
|
refs: pluginRefsForSend(refs, sessionHandle?.getState().turns),
|
|
29178
29155
|
topicAssetRefs: topicAssetRefs.length > 0 ? topicAssetRefs : void 0
|
|
29179
29156
|
});
|
|
@@ -29267,6 +29244,7 @@ ${append2.text}` : append2.text;
|
|
|
29267
29244
|
const submitWhileRunning = isStreaming && !isStopping && queueWhileRunning;
|
|
29268
29245
|
const hasComposerContent = Boolean(input.trim()) || hasValidAttachments || hasRenderedAttachments || hasPendingContexts;
|
|
29269
29246
|
const isSendDisabled = connectionStatus !== "connected" || isCompacting || !submitWhileRunning && isModelLoading || !submitWhileRunning && !hasAvailableModel || isSubmitting || hasUploadingFiles || !input.trim() && !hasValidAttachments && !hasRenderedAttachments && !hasPendingContexts;
|
|
29247
|
+
const showQueueShortcut = Boolean(input.trim()) && !isSendDisabled && !isStopping && !isRecording && (!isStreaming || queueWhileRunning && !hasRunningSendBlockers());
|
|
29270
29248
|
return /* @__PURE__ */ jsxs12(Fragment5, { children: [
|
|
29271
29249
|
/* @__PURE__ */ jsx23("div", { className: `px-5 pb-3 pt-0 ${className ?? ""}`, children: /* @__PURE__ */ jsxs12("div", { className: `mx-auto ${maxWidthClassName} ${innerClassName ?? ""}`, children: [
|
|
29272
29250
|
statusBarAddon ? /* @__PURE__ */ jsx23("div", { className: "mb-2 flex flex-wrap items-center gap-2", children: statusBarAddon }) : null,
|
|
@@ -29308,9 +29286,7 @@ ${append2.text}` : append2.text;
|
|
|
29308
29286
|
children: /* @__PURE__ */ jsxs12(
|
|
29309
29287
|
"div",
|
|
29310
29288
|
{
|
|
29311
|
-
className: `overflow-visible border bg-[hsl(var(--card))] transition-[box-shadow,border-color] duration-300 ${
|
|
29312
|
-
// 22px 圆弧的话,这两段弧会从面板两侧露出来,就是截图里的尖角。
|
|
29313
|
-
mergesWithPanelAbove ? "rounded-b-[22px]" : "rounded-[22px]"} ${isRecording ? "border-[hsl(var(--swf-success))]!" : isPlanning ? dragging || isEditorFocused ? "border-[hsl(var(--swf-warning)/0.6)]" : "border-[hsl(var(--swf-warning)/0.3)]" : dragging || isEditorFocused ? "border-[hsl(213_94%_60%/0.55)] shadow-[0_0_0_3px_hsl(213_94%_60%/0.16),0_8px_24px_-6px_hsl(213_94%_60%/0.3)]" : "border-[hsl(213_94%_60%/0.28)] shadow-[0_0_0_2px_hsl(213_94%_60%/0.08),0_4px_14px_-6px_hsl(213_94%_60%/0.16)]"}`,
|
|
29289
|
+
className: `overflow-visible border bg-[hsl(var(--card))] transition-[box-shadow,border-color] duration-300 ${mergesWithPanelAbove ? "rounded-b-[22px]" : "rounded-[22px]"} ${isRecording ? "border-[hsl(var(--swf-success))]!" : isPlanning ? dragging || isEditorFocused ? "border-[hsl(var(--swf-warning)/0.6)]" : "border-[hsl(var(--swf-warning)/0.3)]" : dragging || isEditorFocused ? "border-[hsl(213_94%_60%/0.55)] shadow-[0_0_0_3px_hsl(213_94%_60%/0.16),0_8px_24px_-6px_hsl(213_94%_60%/0.3)]" : "border-[hsl(213_94%_60%/0.28)] shadow-[0_0_0_2px_hsl(213_94%_60%/0.08),0_4px_14px_-6px_hsl(213_94%_60%/0.16)]"}`,
|
|
29314
29290
|
children: [
|
|
29315
29291
|
dragging && /* @__PURE__ */ jsx23("div", { className: `pointer-events-none absolute inset-0 z-10 flex items-center justify-center bg-[hsl(var(--primary)/0.06)] ${mergesWithPanelAbove ? "rounded-b-[22px]" : "rounded-2xl"}`, children: /* @__PURE__ */ jsx23("span", { className: "rounded-full bg-[hsl(var(--primary)/0.12)] px-4 py-2 text-sm font-medium text-[hsl(var(--primary))]", children: "\u677E\u624B\u5F15\u7528\u6587\u4EF6" }) }),
|
|
29316
29292
|
planPanel,
|
|
@@ -29683,6 +29659,10 @@ ${append2.text}` : append2.text;
|
|
|
29683
29659
|
!lite && activeSessionId ? /* @__PURE__ */ jsx23(BackgroundTasksPill, { sessionId: activeSessionId }) : null
|
|
29684
29660
|
] }),
|
|
29685
29661
|
/* @__PURE__ */ jsxs12("div", { className: "flex min-h-10 items-center gap-1.5", children: [
|
|
29662
|
+
showQueueShortcut && /* @__PURE__ */ jsxs12("span", { className: "mr-1 text-[11px] text-[hsl(var(--muted-foreground))]", children: [
|
|
29663
|
+
queueShortcutLabel(),
|
|
29664
|
+
" \xB7 \u6392\u961F\u6D88\u606F"
|
|
29665
|
+
] }),
|
|
29686
29666
|
slotBeforeSend,
|
|
29687
29667
|
!isStreaming && !isCompacting && asrEnabled && (isRecording || isVoiceStarting || !hasComposerContent) ? /* @__PURE__ */ jsx23(
|
|
29688
29668
|
"button",
|
|
@@ -29700,10 +29680,10 @@ ${append2.text}` : append2.text;
|
|
|
29700
29680
|
"button",
|
|
29701
29681
|
{
|
|
29702
29682
|
type: "button",
|
|
29703
|
-
onClick: handleSubmit,
|
|
29683
|
+
onClick: () => void handleSubmit(),
|
|
29704
29684
|
disabled: isSendDisabled || isRecording,
|
|
29705
|
-
"aria-label": "\
|
|
29706
|
-
title: "\
|
|
29685
|
+
"aria-label": "\u53D1\u9001\u5F15\u5BFC\u6D88\u606F",
|
|
29686
|
+
title: "\u53D1\u9001\u5F15\u5BFC\u6D88\u606F",
|
|
29707
29687
|
className: "flex h-10 w-10 items-center justify-center rounded-full bg-[hsl(213_94%_55%)] text-white disabled:opacity-25",
|
|
29708
29688
|
children: isSubmitting ? /* @__PURE__ */ jsx23(LoaderCircle, { size: 16, className: "animate-spin" }) : /* @__PURE__ */ jsx23(Send, { size: 16 })
|
|
29709
29689
|
}
|
|
@@ -29734,10 +29714,10 @@ ${append2.text}` : append2.text;
|
|
|
29734
29714
|
"button",
|
|
29735
29715
|
{
|
|
29736
29716
|
type: "button",
|
|
29737
|
-
onClick: handleSubmit,
|
|
29717
|
+
onClick: () => void handleSubmit(),
|
|
29738
29718
|
disabled: isSendDisabled,
|
|
29739
|
-
"aria-label": "\u53D1\u9001\u6D88\u606F",
|
|
29740
|
-
title: isModelLoading ? "\u6B63\u5728\u52A0\u8F7D\u6A21\u578B\u914D\u7F6E" : !hasAvailableModel ? modelAvailabilityMessage : "\u53D1\u9001\u6D88\u606F",
|
|
29719
|
+
"aria-label": "\u53D1\u9001\u5F15\u5BFC\u6D88\u606F",
|
|
29720
|
+
title: isModelLoading ? "\u6B63\u5728\u52A0\u8F7D\u6A21\u578B\u914D\u7F6E" : !hasAvailableModel ? modelAvailabilityMessage : "\u53D1\u9001\u5F15\u5BFC\u6D88\u606F",
|
|
29741
29721
|
className: "flex h-10 w-10 items-center justify-center rounded-full bg-[hsl(213_94%_55%)] text-white transition-colors duration-[120ms] ease-out hover:bg-[hsl(213_94%_48%)] disabled:opacity-25",
|
|
29742
29722
|
children: isSubmitting ? /* @__PURE__ */ jsx23(LoaderCircle, { size: 16, className: "animate-spin" }) : /* @__PURE__ */ jsx23(Send, { size: 16 })
|
|
29743
29723
|
}
|