@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.
- package/CHANGELOG.md +7 -0
- package/dist/.vite/manifest.json +45 -45
- package/dist/assets/{account-panel-BVNV8XqM.js → account-panel-svU9I6E6.js} +1 -1
- package/dist/assets/{agents-CfpN8PQc.js → agents-CtI89gpb.js} +1 -1
- package/dist/assets/agents-DWygCmAK.js +1 -0
- package/dist/assets/{app-presenter-provider-2DwHRRle.js → app-presenter-provider-_UK6sArj.js} +5 -5
- package/dist/assets/{appearance-settings-page-Cn9w3F-K.js → appearance-settings-page-BhedtMx9.js} +1 -1
- package/dist/assets/apps-C4c4NXqB.js +1 -0
- package/dist/assets/cron-DkYSmE-f.js +1 -0
- package/dist/assets/doc-browser-B0zg0EXA.js +1 -0
- package/dist/assets/inbox-CJBCLB1X.js +1 -0
- package/dist/assets/{keyboard-shortcuts-settings-page-BqfbbKir.js → keyboard-shortcuts-settings-page-B5oxyPS2.js} +1 -1
- package/dist/assets/{main-CWYF9QU_.js → main-gFUvLF57.js} +2 -2
- package/dist/assets/{marketplace-CnQ5USfr.js → marketplace-DsAf_rnt.js} +1 -1
- package/dist/assets/mcp-marketplace-page-BqUz09cj.js +1 -0
- package/dist/assets/panel-apps-Bg5Fzm3T.js +1 -0
- package/dist/assets/{projects-CzBaTOTL.js → projects-DvHyoKIF.js} +1 -1
- package/dist/assets/remote-Dhr4K1oK.js +1 -0
- package/dist/assets/{runtime-config-page-BF1wxvzR.js → runtime-config-page-FI2pk3HH.js} +1 -1
- package/dist/assets/{service-apps-panel-D3wwPRzV.js → service-apps-panel-BTqXn0pg.js} +1 -1
- package/dist/index.html +3 -3
- package/package.json +3 -3
- package/src/features/chat/features/conversation/hooks/__tests__/use-session-conversation-controller.test.tsx +41 -0
- package/src/features/chat/features/conversation/hooks/use-session-conversation-controller.ts +4 -1
- package/dist/assets/agents-E4nu-17c.js +0 -1
- package/dist/assets/apps-YFlJirpx.js +0 -1
- package/dist/assets/cron-CH5c55CR.js +0 -1
- package/dist/assets/doc-browser-ClDUWo9V.js +0 -1
- package/dist/assets/inbox-BjBZIbgx.js +0 -1
- package/dist/assets/mcp-marketplace-page-Dor6H9IC.js +0 -1
- package/dist/assets/panel-apps-C-izvtu9.js +0 -1
- 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) => {
|
package/src/features/chat/features/conversation/hooks/use-session-conversation-controller.ts
CHANGED
|
@@ -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
|
|
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};
|