@nextclaw/ui 0.27.1 → 0.27.2

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 (32) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/.vite/manifest.json +45 -45
  3. package/dist/assets/{account-panel-BVNV8XqM.js → account-panel-svU9I6E6.js} +1 -1
  4. package/dist/assets/{agents-CfpN8PQc.js → agents-CtI89gpb.js} +1 -1
  5. package/dist/assets/agents-DWygCmAK.js +1 -0
  6. package/dist/assets/{app-presenter-provider-2DwHRRle.js → app-presenter-provider-_UK6sArj.js} +5 -5
  7. package/dist/assets/{appearance-settings-page-Cn9w3F-K.js → appearance-settings-page-BhedtMx9.js} +1 -1
  8. package/dist/assets/apps-C4c4NXqB.js +1 -0
  9. package/dist/assets/cron-DkYSmE-f.js +1 -0
  10. package/dist/assets/doc-browser-B0zg0EXA.js +1 -0
  11. package/dist/assets/inbox-CJBCLB1X.js +1 -0
  12. package/dist/assets/{keyboard-shortcuts-settings-page-BqfbbKir.js → keyboard-shortcuts-settings-page-B5oxyPS2.js} +1 -1
  13. package/dist/assets/{main-CWYF9QU_.js → main-gFUvLF57.js} +2 -2
  14. package/dist/assets/{marketplace-CnQ5USfr.js → marketplace-DsAf_rnt.js} +1 -1
  15. package/dist/assets/mcp-marketplace-page-BqUz09cj.js +1 -0
  16. package/dist/assets/panel-apps-Bg5Fzm3T.js +1 -0
  17. package/dist/assets/{projects-CzBaTOTL.js → projects-DvHyoKIF.js} +1 -1
  18. package/dist/assets/remote-Dhr4K1oK.js +1 -0
  19. package/dist/assets/{runtime-config-page-BF1wxvzR.js → runtime-config-page-FI2pk3HH.js} +1 -1
  20. package/dist/assets/{service-apps-panel-D3wwPRzV.js → service-apps-panel-BTqXn0pg.js} +1 -1
  21. package/dist/index.html +3 -3
  22. package/package.json +3 -3
  23. package/src/features/chat/features/conversation/hooks/__tests__/use-session-conversation-controller.test.tsx +41 -0
  24. package/src/features/chat/features/conversation/hooks/use-session-conversation-controller.ts +4 -1
  25. package/dist/assets/agents-E4nu-17c.js +0 -1
  26. package/dist/assets/apps-YFlJirpx.js +0 -1
  27. package/dist/assets/cron-CH5c55CR.js +0 -1
  28. package/dist/assets/doc-browser-ClDUWo9V.js +0 -1
  29. package/dist/assets/inbox-BjBZIbgx.js +0 -1
  30. package/dist/assets/mcp-marketplace-page-Dor6H9IC.js +0 -1
  31. package/dist/assets/panel-apps-C-izvtu9.js +0 -1
  32. package/dist/assets/remote-DvCdHjzA.js +0 -1
@@ -143,6 +143,47 @@ function createControllerParams(params: {
143
143
  };
144
144
  }
145
145
 
146
+ describe('useSessionConversationController HTTP message identity', () => {
147
+ it.each(['send', 'sendSteering', 'sendPresetMessage'] as const)(
148
+ 'supports %s over HTTP without randomUUID and keeps submission identities distinct',
149
+ async (action) => {
150
+ const params = createControllerParams({ isRunning: false });
151
+ const { result } = renderHook(() => useSessionConversationController(params));
152
+ const getRandomValues = globalThis.crypto.getRandomValues.bind(globalThis.crypto);
153
+ const now = vi.spyOn(Date, 'now').mockReturnValue(1780000000000);
154
+ vi.stubGlobal('crypto', { getRandomValues });
155
+ try {
156
+ await act(async () => {
157
+ if (action === 'sendPresetMessage') {
158
+ await result.current.sendPresetMessage('Update this session title');
159
+ await result.current.sendPresetMessage('Update this session title again');
160
+ } else {
161
+ await result.current[action]();
162
+ await result.current[action]();
163
+ }
164
+ });
165
+ } finally {
166
+ now.mockRestore();
167
+ vi.unstubAllGlobals();
168
+ }
169
+
170
+ expect(params.agent.send).toHaveBeenCalledTimes(2);
171
+ const envelopes = params.agent.send.mock.calls.map(([envelope]) => envelope);
172
+ expect(envelopes[0].message.id).not.toBe(envelopes[1].message.id);
173
+ for (const envelope of envelopes) {
174
+ expect(envelope.message.id).toMatch(/^user-/);
175
+ expect(envelope.idempotencyKey).toBe(envelope.message.id);
176
+ expect(envelope.sessionId).toBe('session-1');
177
+ if (action !== 'sendPresetMessage') {
178
+ expect(params.beginSubmission).toHaveBeenCalledWith(envelope, expect.any(Object));
179
+ expect(params.acceptSubmission).toHaveBeenCalledWith(envelope.message.id);
180
+ }
181
+ }
182
+ if (action === 'sendPresetMessage') expect(params.beginSubmission).not.toHaveBeenCalled();
183
+ },
184
+ );
185
+ });
186
+
146
187
  describe('useSessionConversationController backend run queue', () => {
147
188
  it('preallocates one stable session identity for the first root message', async () => {
148
189
  const send = vi.fn<TestAgentSend>(async (envelope) => {
@@ -191,9 +191,12 @@ function buildSubmissionEnvelope(
191
191
  sessionKey: string | null,
192
192
  delivery: NcpAgentSendEnvelope['delivery'] = 'queue',
193
193
  ): NcpAgentSendEnvelope | null {
194
+ // getRandomValues is also available on HTTP origins, unlike randomUUID.
195
+ const messageIdBytes = crypto.getRandomValues(new Uint8Array(16));
196
+ const messageId = `user-${Array.from(messageIdBytes, (byte) => byte.toString(16).padStart(2, '0')).join('')}`;
194
197
  const envelope = buildNcpRequestEnvelope({
195
198
  sessionId: sessionKey ?? undefined,
196
- messageId: `user-${crypto.randomUUID()}`,
199
+ messageId,
197
200
  text: draft.composerSnapshot.text.trim(),
198
201
  attachments: [...draft.composerSnapshot.attachments],
199
202
  parts: deriveNcpMessagePartsFromComposer(
@@ -1 +0,0 @@
1
- import{t as e}from"./agents-CfpN8PQc.js";export{e as AgentsPage};
@@ -1 +0,0 @@
1
- import{st as e}from"./app-presenter-provider-2DwHRRle.js";export{e as AppsPanel};
@@ -1 +0,0 @@
1
- import{K as e}from"./app-presenter-provider-2DwHRRle.js";export{e as CronJobResource};
@@ -1 +0,0 @@
1
- import{Ct as e}from"./app-presenter-provider-2DwHRRle.js";export{e as DocBrowser};
@@ -1 +0,0 @@
1
- import{z as e}from"./app-presenter-provider-2DwHRRle.js";export{e as InboxPage};
@@ -1 +0,0 @@
1
- import{ct as e}from"./app-presenter-provider-2DwHRRle.js";export{e as McpMarketplacePage};
@@ -1 +0,0 @@
1
- import{s as e,v as t}from"./theme-provider-BToFZGZG.js";import"./app-presenter-provider-2DwHRRle.js";export{t as PanelAppHostProvider,e as PanelAppRuntimeSurface};
@@ -1 +0,0 @@
1
- import{F as e}from"./app-presenter-provider-2DwHRRle.js";export{e as RemoteAccessPage};