@blade-hq/agent-react 2612.0.0-beta.28 → 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.
Files changed (50) hide show
  1. package/dist/chat/AgentLoopBlock.d.ts +0 -2
  2. package/dist/chat/AssistantTurnBlock.d.ts +0 -8
  3. package/dist/chat/AttachmentPreviewDialog.d.ts +0 -1
  4. package/dist/chat/CurrentPlanPanel.d.ts +0 -3
  5. package/dist/chat/FileDeliveryCards.d.ts +0 -4
  6. package/dist/chat/FinalArtifactCards.d.ts +0 -1
  7. package/dist/chat/LiteMessageList.d.ts +1 -3
  8. package/dist/chat/MessageFileAttachmentList.d.ts +0 -5
  9. package/dist/chat/SessionReplayBar.d.ts +0 -1
  10. package/dist/chat/TextAttachmentPills.d.ts +0 -3
  11. package/dist/chat/TurnNavRail.d.ts +0 -3
  12. package/dist/chat/WorkflowRunBlock.d.ts +0 -2
  13. package/dist/chat/ai-elements/shimmer.d.ts +0 -4
  14. package/dist/chat/message-list-blocks.d.ts +0 -1
  15. package/dist/chat/runtime/actions.d.ts +1 -2
  16. package/dist/chat/runtime/background-task-dismissals.d.ts +0 -1
  17. package/dist/chat/runtime/composer-channels.d.ts +0 -3
  18. package/dist/chat/runtime/input-cache-reset.d.ts +0 -5
  19. package/dist/chat/runtime/session-source.d.ts +0 -5
  20. package/dist/chat/runtime/use-chat-actions.d.ts +0 -4
  21. package/dist/{chat-OCLOVB3H.css → chat-IHPRU35X.css} +5 -18
  22. package/dist/chat.css +5 -18
  23. package/dist/{chunk-66V4EOSO.js → chunk-M5NAFIU4.js} +340 -399
  24. package/dist/chunk-M5NAFIU4.js.map +1 -0
  25. package/dist/{chunk-PAZSK73V.js → chunk-PHWYZP6F.js} +3 -8
  26. package/dist/chunk-PHWYZP6F.js.map +1 -0
  27. package/dist/{chunk-PPREDKQ2.js → chunk-XTYNDVUV.js} +15 -3
  28. package/dist/chunk-XTYNDVUV.js.map +1 -0
  29. package/dist/components/ChatInput.d.ts +1 -15
  30. package/dist/components/LlmAdvancedSettings.d.ts +0 -1
  31. package/dist/components/PlanUpdateBlock.d.ts +0 -1
  32. package/dist/embed/blade-chat-element.d.ts +0 -8
  33. package/dist/embed/entry.d.ts +1 -13
  34. package/dist/hooks/use-message-pin.d.ts +1 -1
  35. package/dist/index.js +2 -2
  36. package/dist/internal.js +4 -6
  37. package/dist/internal.js.map +1 -1
  38. package/dist/lib/message-shortcuts.d.ts +5 -0
  39. package/dist/rich-input/ConnectButton.d.ts +0 -2
  40. package/dist/rich-input/SkillStatusBar.d.ts +0 -6
  41. package/dist/rich-input/lib/reference-candidates.d.ts +0 -1
  42. package/dist/rich-input/voice/VoiceWaveform.d.ts +0 -3
  43. package/dist/rich-input.js +90 -110
  44. package/dist/rich-input.js.map +1 -1
  45. package/dist/style.css +16 -55
  46. package/dist/style.full.css +23 -77
  47. package/package.json +2 -2
  48. package/dist/chunk-66V4EOSO.js.map +0 -1
  49. package/dist/chunk-PAZSK73V.js.map +0 -1
  50. package/dist/chunk-PPREDKQ2.js.map +0 -1
@@ -3,7 +3,7 @@ import {
3
3
  PluginTriggerStack,
4
4
  selectionFromItem,
5
5
  triggerSummary
6
- } from "./chunk-PAZSK73V.js";
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-PPREDKQ2.js";
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
- // before 那层透明桥接盖住浮层和按钮之间 mb-2 的空隙:没有它,鼠标从按钮
837
- // 移向浮层会先穿过一段"两者都不在"的空白,onMouseLeave 立刻收起浮层,
838
- // 里面的日志/停止按钮根本点不到。
839
- /* @__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: [
840
- activeTasks.map((task) => /* @__PURE__ */ jsx2(
841
- TaskCard,
842
- {
843
- task,
844
- onOpenLog: () => void openTaskLog(task),
845
- onStop: () => requestStopTask(task),
846
- onDismiss: ATTENTION_STATUSES.has(task.status) ? () => hideTask(task.id) : null
847
- },
848
- task.id
849
- )),
850
- historyTasks.length > 0 ? /* @__PURE__ */ jsxs(
851
- "div",
852
- {
853
- className: cn(
854
- activeTasks.length > 0 && "border-t border-[hsl(var(--border))] pt-2"
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
- /* @__PURE__ */ jsxs(
858
- "button",
859
- {
860
- type: "button",
861
- onClick: () => setHistoryOverride(!historyOpen),
862
- "aria-expanded": historyOpen,
863
- 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))]",
864
- children: [
865
- /* @__PURE__ */ jsx2(
866
- ChevronDown,
867
- {
868
- size: 12,
869
- className: cn("transition-transform", historyOpen ? "" : "-rotate-90")
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
- onOpenSkills ? /* @__PURE__ */ jsx14(
26225
- "button",
26226
- {
26227
- type: "button",
26228
- onClick: onOpenSkills,
26229
- title: "\u67E5\u770B\u5DF2\u5B89\u88C5\u7684\u6280\u80FD",
26230
- className: "cursor-pointer font-mono underline decoration-dotted underline-offset-2 transition-colors hover:text-[hsl(var(--foreground))]",
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 handleSubmit = async () => {
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
- const json = editor?.getJSON();
28999
- if (composerAttachments.length > 0 || collectMessageMentions(json).length > 0 || collectTopicAssetMentions(json).length > 0) {
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": "\u52A0\u5165\u6392\u961F",
29706
- title: "\u52A0\u5165\u6392\u961F",
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
  }