@nextclaw/ui 0.12.14 → 0.12.15

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 (88) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/assets/{api-C51456xV.js → api-HsS9C7l0.js} +1 -1
  3. package/dist/assets/{app-manager-provider-D_cKqqRG.js → app-manager-provider-CNa6cmOk.js} +1 -1
  4. package/dist/assets/{app-navigation.config-Dve1W20Y.js → app-navigation.config-Dy69P_3O.js} +1 -1
  5. package/dist/assets/{book-open-B4mOKdz8.js → book-open-DJSe9YLj.js} +1 -1
  6. package/dist/assets/{channels-list-page-WJ7d4zMI.js → channels-list-page-DtjYJ1FX.js} +1 -1
  7. package/dist/assets/chat-Rmwi-kQn.js +58 -0
  8. package/dist/assets/{chat-page-DLFTPfmu.js → chat-page-Cslvp6SG.js} +1 -1
  9. package/dist/assets/{chunk-JZWAC4HX-ptDyT_1C.js → chunk-JZWAC4HX-CMPxE3BJ.js} +1 -1
  10. package/dist/assets/{config-split-page-B3PRA_AV.js → config-split-page-v7p1CQjU.js} +1 -1
  11. package/dist/assets/{createLucideIcon-C_GFKVuW.js → createLucideIcon-Y1cWg3R9.js} +1 -1
  12. package/dist/assets/{desktop-update-config-CzGi43xw.js → desktop-update-config-CqJmmpjR.js} +1 -1
  13. package/dist/assets/{dialog-BHcaU6NE.js → dialog-CYis0wx_.js} +1 -1
  14. package/dist/assets/{dist-DtBFqZ6_.js → dist-DIWOVzPY.js} +1 -1
  15. package/dist/assets/{doc-browser-CwgI7ipB.js → doc-browser-BQT0fa3g.js} +1 -1
  16. package/dist/assets/{doc-browser-CoKIUCJj.js → doc-browser-CP6kjGaF.js} +1 -1
  17. package/dist/assets/doc-browser-DK2tXLi_.js +1 -0
  18. package/dist/assets/{doc-browser-context-Dib9sS83.js → doc-browser-context-BacwCbOG.js} +1 -1
  19. package/dist/assets/{es2015-BlNhrQUG.js → es2015-3VnZDFPs.js} +1 -1
  20. package/dist/assets/{external-link-DP2IJ7AM.js → external-link-CPhZo92k.js} +1 -1
  21. package/dist/assets/{folder-BPwc278w.js → folder-orBwjR8h.js} +1 -1
  22. package/dist/assets/{hash-CvcvtMBq.js → hash-BvWW8Scd.js} +1 -1
  23. package/dist/assets/i18n-BhoFaF7E.js +1 -0
  24. package/dist/assets/{index-CAYF44Dz.js → index-D0_J-bk_.js} +2 -2
  25. package/dist/assets/index-OrUEVLgT.css +1 -0
  26. package/dist/assets/{key-round-BQXmPSxD.js → key-round-B5u2XQwa.js} +1 -1
  27. package/dist/assets/loader-circle-DotuB8NZ.js +1 -0
  28. package/dist/assets/{logo-badge-uB4SwANR.js → logo-badge-BLQdO_th.js} +1 -1
  29. package/dist/assets/{logos-BcELLmYh.js → logos-WPtZ1joO.js} +1 -1
  30. package/dist/assets/marketplace-page-CJHkdgv_.js +1 -0
  31. package/dist/assets/{marketplace-page-DiqqX25V.js → marketplace-page-It54wla_.js} +1 -1
  32. package/dist/assets/{mcp-marketplace-page-C_akqPwv.js → mcp-marketplace-page-C64VUmni.js} +1 -1
  33. package/dist/assets/mcp-marketplace-page-DIItTRy_.js +1 -0
  34. package/dist/assets/message-square-CO_7rU-N.js +1 -0
  35. package/dist/assets/{model-config-B0L43HTL.js → model-config-Cu6zLI8a.js} +1 -1
  36. package/dist/assets/{notice-card-C9PFAR67.js → notice-card-DDVM6IFQ.js} +1 -1
  37. package/dist/assets/play-kSfmJAme.js +1 -0
  38. package/dist/assets/plus-BNaF7Wq5.js +1 -0
  39. package/dist/assets/{popover-B8msg2FQ.js → popover-Dliq2K8O.js} +1 -1
  40. package/dist/assets/{provider-scoped-model-input-DeAo2Y65.js → provider-scoped-model-input-D0oXIrWA.js} +1 -1
  41. package/dist/assets/{providers-list-5_VShcn7.js → providers-list-CrwTWzge.js} +1 -1
  42. package/dist/assets/{refresh-ccw-CeG203yU.js → refresh-ccw-pX3BUxPF.js} +1 -1
  43. package/dist/assets/remote-BpAw88FR.js +1 -0
  44. package/dist/assets/{rotate-cw-F7aThvYj.js → rotate-cw-Bm8W8iaF.js} +1 -1
  45. package/dist/assets/{runtime-config-page-B-y_0HIS.js → runtime-config-page-CYZyCr04.js} +1 -1
  46. package/dist/assets/{save-7ztImRj7.js → save-CZ9zvmBJ.js} +1 -1
  47. package/dist/assets/{search-DZSNKEGp.js → search-DpxqxcpP.js} +1 -1
  48. package/dist/assets/{search-config-DJTm9Fno.js → search-config-D_H6cr07.js} +1 -1
  49. package/dist/assets/{secrets-config-DKFeFii1.js → secrets-config-BG9fic_R.js} +1 -1
  50. package/dist/assets/{select-DRDejPLk.js → select-D-gjRjhr.js} +1 -1
  51. package/dist/assets/{sessions-config-page-CZGqS32n.js → sessions-config-page-DzSOCrQt.js} +1 -1
  52. package/dist/assets/{setting-row-BcF6eTW0.js → setting-row-Cl4_XpIR.js} +1 -1
  53. package/dist/assets/{settings-DjvNMJde.js → settings-C9WgQdGW.js} +1 -1
  54. package/dist/assets/skeleton-BN6fOana.js +1 -0
  55. package/dist/assets/{sparkles-CyDTgTM4.js → sparkles-gvRilA9f.js} +1 -1
  56. package/dist/assets/{status-dot-aQU9Mia4.js → status-dot-W2TPs1Zf.js} +1 -1
  57. package/dist/assets/{tabs-custom-C4P7g4vR.js → tabs-custom-BxZfWeD1.js} +1 -1
  58. package/dist/assets/{tag-chip-CVIqyMv7.js → tag-chip-DfmhmN50.js} +1 -1
  59. package/dist/assets/{theme-provider-dHqcWU-j.js → theme-provider-CajCgE_N.js} +1 -1
  60. package/dist/assets/{tooltip-C6VPreZ7.js → tooltip-C1XVx_h1.js} +1 -1
  61. package/dist/assets/{trash-2-C1cdqL6V.js → trash-2-WC4Dlakj.js} +1 -1
  62. package/dist/assets/{use-config-DFja1sda.js → use-config-BIErdQNR.js} +1 -1
  63. package/dist/assets/{use-confirm-dialog-DvIbSUX3.js → use-confirm-dialog-B3ZsM4V-.js} +1 -1
  64. package/dist/assets/{use-infinite-scroll-loader-D8h0k-iL.js → use-infinite-scroll-loader-rO55YHGO.js} +1 -1
  65. package/dist/assets/{use-viewport-layout-D-pjxsyz.js → use-viewport-layout-zLAsjh3A.js} +1 -1
  66. package/dist/assets/x-D1867E7F.js +1 -0
  67. package/dist/index.html +39 -39
  68. package/package.json +3 -3
  69. package/src/features/chat/components/chat-sidebar-session-item.tsx +22 -24
  70. package/src/features/chat/managers/ncp-chat-input.manager.test.ts +29 -0
  71. package/src/features/chat/utils/chat-input-bar.utils.test.ts +27 -1
  72. package/src/features/chat/utils/chat-input-toolbar.utils.ts +20 -19
  73. package/src/features/chat/utils/ncp-chat-input-availability.utils.test.ts +35 -3
  74. package/src/features/chat/utils/ncp-chat-input-availability.utils.ts +4 -6
  75. package/src/shared/lib/i18n/chat.ts +1 -1
  76. package/dist/assets/chat-BxA-mw53.js +0 -58
  77. package/dist/assets/doc-browser-DYKpRqe-.js +0 -1
  78. package/dist/assets/i18n-BnNAQpVM.js +0 -1
  79. package/dist/assets/index-mRmSAB-e.css +0 -1
  80. package/dist/assets/loader-circle-C6gg2m2a.js +0 -1
  81. package/dist/assets/marketplace-page-0sEdt5sA.js +0 -1
  82. package/dist/assets/mcp-marketplace-page-B8vmu9xe.js +0 -1
  83. package/dist/assets/message-square-CLVODA23.js +0 -1
  84. package/dist/assets/play-DeNVUA5C.js +0 -1
  85. package/dist/assets/plus-BptLViq1.js +0 -1
  86. package/dist/assets/remote-pzp4oLcL.js +0 -1
  87. package/dist/assets/skeleton-5Mg6vZHN.js +0 -1
  88. package/dist/assets/x-BjMO7v8q.js +0 -1
@@ -41,7 +41,7 @@ function createSnapshot(
41
41
  }
42
42
 
43
43
  describe('ncp-chat-input-availability.utils', () => {
44
- it('keeps the composer editable during cold start while send remains blocked', () => {
44
+ it('keeps the composer editable during cold start while runtime blocking still prevents send', () => {
45
45
  const snapshot = createSnapshot({
46
46
  isProviderStateResolved: false,
47
47
  modelOptions: [],
@@ -60,6 +60,22 @@ describe('ncp-chat-input-availability.utils', () => {
60
60
  ).toBe(true);
61
61
  });
62
62
 
63
+ it('does not block send only because model options have not loaded yet', () => {
64
+ const snapshot = createSnapshot({
65
+ isProviderStateResolved: false,
66
+ modelOptions: [],
67
+ sessionTypeUnavailable: false,
68
+ });
69
+
70
+ expect(
71
+ isNcpChatSendDisabled({
72
+ snapshot,
73
+ hasSendableDraft: true,
74
+ isRuntimeBlocked: false,
75
+ })
76
+ ).toBe(false);
77
+ });
78
+
63
79
  it('marks model options as empty only after provider state resolves', () => {
64
80
  const loadingSnapshot = createSnapshot({
65
81
  isProviderStateResolved: false,
@@ -74,19 +90,35 @@ describe('ncp-chat-input-availability.utils', () => {
74
90
  expect(isNcpChatModelOptionsEmpty(emptySnapshot)).toBe(true);
75
91
  });
76
92
 
77
- it('disables both editing and sending when the session type is unavailable', () => {
93
+ it('keeps editing and sending available when the selected session type reports unavailable', () => {
78
94
  const snapshot = createSnapshot({
79
95
  isProviderStateResolved: true,
80
96
  sessionTypeUnavailable: true,
81
97
  });
82
98
 
83
- expect(isNcpChatComposerDisabled(snapshot)).toBe(true);
99
+ expect(isNcpChatComposerDisabled(snapshot)).toBe(false);
84
100
  expect(
85
101
  isNcpChatSendDisabled({
86
102
  snapshot,
87
103
  hasSendableDraft: true,
88
104
  isRuntimeBlocked: false,
89
105
  })
106
+ ).toBe(false);
107
+ });
108
+
109
+ it('blocks send when there is no sendable draft', () => {
110
+ const snapshot = createSnapshot({
111
+ isProviderStateResolved: true,
112
+ modelOptions: [],
113
+ sessionTypeUnavailable: true,
114
+ });
115
+
116
+ expect(
117
+ isNcpChatSendDisabled({
118
+ snapshot,
119
+ hasSendableDraft: false,
120
+ isRuntimeBlocked: false,
121
+ })
90
122
  ).toBe(true);
91
123
  });
92
124
  });
@@ -24,9 +24,9 @@ export function isNcpChatModelOptionsEmpty(
24
24
  }
25
25
 
26
26
  export function isNcpChatComposerDisabled(
27
- snapshot: NcpChatInputAvailabilitySnapshot
27
+ _snapshot: NcpChatInputAvailabilitySnapshot
28
28
  ): boolean {
29
- return snapshot.sessionTypeUnavailable;
29
+ return false;
30
30
  }
31
31
 
32
32
  export function isNcpChatSendDisabled(params: {
@@ -34,12 +34,10 @@ export function isNcpChatSendDisabled(params: {
34
34
  snapshot: NcpChatInputAvailabilitySnapshot;
35
35
  isRuntimeBlocked: boolean;
36
36
  }): boolean {
37
- const { hasSendableDraft, isRuntimeBlocked, snapshot } = params;
37
+ const { hasSendableDraft, isRuntimeBlocked } = params;
38
38
 
39
39
  return (
40
40
  isRuntimeBlocked ||
41
- !hasSendableDraft ||
42
- !hasNcpChatModelOptions(snapshot) ||
43
- snapshot.sessionTypeUnavailable
41
+ !hasSendableDraft
44
42
  );
45
43
  }
@@ -67,7 +67,7 @@ export const CHAT_LABELS: Record<string, { zh: string; en: string }> = {
67
67
  zh: '聊天能力启动失败,请稍后重试或检查服务日志。',
68
68
  en: 'Chat startup failed. Please retry in a moment or inspect the service logs.'
69
69
  },
70
- chatInputPlaceholder: { zh: '输入消息,输入 / 选择技能,Enter 发送,Shift + Enter 换行', en: 'Type a message, type / to select skills, Enter to send, Shift + Enter for newline' },
70
+ chatInputPlaceholder: { zh: '发消息...', en: 'Message NextClaw...' },
71
71
  chatInputHint: { zh: '支持多轮上下文,默认走当前会话。', en: 'Multi-turn context is preserved in the current session.' },
72
72
  chatSlashSectionCommands: { zh: '命令', en: 'Commands' },
73
73
  chatSlashSectionSkills: { zh: '技能', en: 'Skills' },