@percena/weft-react 0.1.5-next.0 → 0.1.5-next.1
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/README.md +1 -1
- package/dist/index.cjs +32 -6
- package/dist/index.d.cts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +32 -6
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -19,6 +19,6 @@ function Support({ boot }: { boot: { server: string; token: string; sessionId: s
|
|
|
19
19
|
```
|
|
20
20
|
|
|
21
21
|
`{ server, token, sessionId }` comes from your backend's embed bootstrap
|
|
22
|
-
(
|
|
22
|
+
(`POST /v1/embed/sessions` via direct `fetch()`). Re-exports the full
|
|
23
23
|
`@weft/ui` + `@weft/local-chat` surface (including `EN_FALLBACK` and
|
|
24
24
|
`createFlitroEmbedRuntime`). Peers: `react`, `react-dom`.
|
package/dist/index.cjs
CHANGED
|
@@ -5438,6 +5438,24 @@ function handleTextDelta(state, event) {
|
|
|
5438
5438
|
const streamingIndex = findStreamingMessage(session.messages, event.turnId);
|
|
5439
5439
|
if (streamingIndex !== -1) {
|
|
5440
5440
|
const currentMsg = session.messages[streamingIndex];
|
|
5441
|
+
if (currentMsg.isIntermediate && !event.isIntermediate) {
|
|
5442
|
+
const closedSession = updateMessageAt(session, streamingIndex, {
|
|
5443
|
+
isStreaming: false
|
|
5444
|
+
});
|
|
5445
|
+
const newMessage2 = {
|
|
5446
|
+
id: generateMessageId2(),
|
|
5447
|
+
role: "assistant",
|
|
5448
|
+
content: event.delta,
|
|
5449
|
+
timestamp: event.timestamp ?? Date.now(),
|
|
5450
|
+
isStreaming: true,
|
|
5451
|
+
isPending: true,
|
|
5452
|
+
turnId: event.turnId
|
|
5453
|
+
};
|
|
5454
|
+
return {
|
|
5455
|
+
session: appendMessage(closedSession, newMessage2, false),
|
|
5456
|
+
streaming: { content: event.delta, turnId: event.turnId }
|
|
5457
|
+
};
|
|
5458
|
+
}
|
|
5441
5459
|
const updatedSession = updateMessageAt(session, streamingIndex, {
|
|
5442
5460
|
content: currentMsg.content + event.delta
|
|
5443
5461
|
});
|
|
@@ -5450,7 +5468,8 @@ function handleTextDelta(state, event) {
|
|
|
5450
5468
|
timestamp: event.timestamp ?? Date.now(),
|
|
5451
5469
|
isStreaming: true,
|
|
5452
5470
|
isPending: true,
|
|
5453
|
-
turnId: event.turnId
|
|
5471
|
+
turnId: event.turnId,
|
|
5472
|
+
...event.isIntermediate ? { isIntermediate: true } : {}
|
|
5454
5473
|
};
|
|
5455
5474
|
return {
|
|
5456
5475
|
session: appendMessage(session, newMessage, false),
|
|
@@ -5460,12 +5479,15 @@ function handleTextDelta(state, event) {
|
|
|
5460
5479
|
function handleTextComplete(state, event) {
|
|
5461
5480
|
const { session, streaming } = state;
|
|
5462
5481
|
let msgIndex = findStreamingMessage(session.messages, event.turnId);
|
|
5482
|
+
if (msgIndex !== -1 && event.isIntermediate && !session.messages[msgIndex].isIntermediate) {
|
|
5483
|
+
msgIndex = -1;
|
|
5484
|
+
}
|
|
5463
5485
|
if (msgIndex === -1) {
|
|
5464
5486
|
msgIndex = findAssistantMessage(session.messages, event.turnId);
|
|
5465
5487
|
}
|
|
5466
5488
|
if (msgIndex !== -1) {
|
|
5467
5489
|
const existingMsg = session.messages[msgIndex];
|
|
5468
|
-
if (!existingMsg.isStreaming && existingMsg.isIntermediate &&
|
|
5490
|
+
if (!existingMsg.isStreaming && existingMsg.isIntermediate && !existingMsg.isPending) {
|
|
5469
5491
|
msgIndex = -1;
|
|
5470
5492
|
}
|
|
5471
5493
|
}
|
|
@@ -6533,14 +6555,16 @@ function mapCoreEventToProcessorEvent(coreEvent, sessionId) {
|
|
|
6533
6555
|
type: "text_delta",
|
|
6534
6556
|
sessionId,
|
|
6535
6557
|
delta: coreEvent.text,
|
|
6536
|
-
turnId: coreEvent.turnId
|
|
6558
|
+
turnId: coreEvent.turnId,
|
|
6559
|
+
isIntermediate: true
|
|
6537
6560
|
};
|
|
6538
6561
|
case "reasoning":
|
|
6539
6562
|
return {
|
|
6540
6563
|
type: "text_complete",
|
|
6541
6564
|
sessionId,
|
|
6542
6565
|
text: coreEvent.text,
|
|
6543
|
-
turnId: coreEvent.turnId
|
|
6566
|
+
turnId: coreEvent.turnId,
|
|
6567
|
+
isIntermediate: true
|
|
6544
6568
|
};
|
|
6545
6569
|
case "permission_response":
|
|
6546
6570
|
return {
|
|
@@ -6580,7 +6604,8 @@ function mapTimelineEnvelopeToProcessorEvent(envelope) {
|
|
|
6580
6604
|
sessionId,
|
|
6581
6605
|
delta: item.text,
|
|
6582
6606
|
turnId: item.turnId,
|
|
6583
|
-
timestamp
|
|
6607
|
+
timestamp,
|
|
6608
|
+
...item.type === "reasoning_delta" && { isIntermediate: true }
|
|
6584
6609
|
};
|
|
6585
6610
|
case "assistant_message":
|
|
6586
6611
|
case "reasoning":
|
|
@@ -6590,7 +6615,8 @@ function mapTimelineEnvelopeToProcessorEvent(envelope) {
|
|
|
6590
6615
|
text: item.text,
|
|
6591
6616
|
turnId: item.turnId,
|
|
6592
6617
|
timestamp,
|
|
6593
|
-
messageId: item.messageId
|
|
6618
|
+
messageId: item.messageId,
|
|
6619
|
+
...item.type === "reasoning" && { isIntermediate: true }
|
|
6594
6620
|
};
|
|
6595
6621
|
case "tool_call":
|
|
6596
6622
|
return {
|
package/dist/index.d.cts
CHANGED
|
@@ -5,7 +5,7 @@ export { CreateFlitroEmbedRuntimeOptions, createFlitroEmbedRuntime };
|
|
|
5
5
|
* useAgentSession — the official L1 runtime-configuration API.
|
|
6
6
|
*
|
|
7
7
|
* Wraps `createFlitroEmbedRuntime` in a hook: the host backend mints
|
|
8
|
-
* `{ server, token, sessionId }`
|
|
8
|
+
* `{ server, token, sessionId }` via `POST /v1/embed/sessions` and the
|
|
9
9
|
* component renders `<TimelineAgentChatPanel runtime={session.runtime} />`.
|
|
10
10
|
*/
|
|
11
11
|
|
|
@@ -3261,6 +3261,8 @@ interface TextDeltaEvent {
|
|
|
3261
3261
|
turnId?: string;
|
|
3262
3262
|
/** Timestamp from canonical timeline for stable ordering */
|
|
3263
3263
|
timestamp?: number;
|
|
3264
|
+
/** When true, this delta belongs to a reasoning/thinking block (intermediate content). */
|
|
3265
|
+
isIntermediate?: boolean;
|
|
3264
3266
|
}
|
|
3265
3267
|
/**
|
|
3266
3268
|
* Text complete event - finalizes streaming text
|
package/dist/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export { CreateFlitroEmbedRuntimeOptions, createFlitroEmbedRuntime };
|
|
|
5
5
|
* useAgentSession — the official L1 runtime-configuration API.
|
|
6
6
|
*
|
|
7
7
|
* Wraps `createFlitroEmbedRuntime` in a hook: the host backend mints
|
|
8
|
-
* `{ server, token, sessionId }`
|
|
8
|
+
* `{ server, token, sessionId }` via `POST /v1/embed/sessions` and the
|
|
9
9
|
* component renders `<TimelineAgentChatPanel runtime={session.runtime} />`.
|
|
10
10
|
*/
|
|
11
11
|
|
|
@@ -3261,6 +3261,8 @@ interface TextDeltaEvent {
|
|
|
3261
3261
|
turnId?: string;
|
|
3262
3262
|
/** Timestamp from canonical timeline for stable ordering */
|
|
3263
3263
|
timestamp?: number;
|
|
3264
|
+
/** When true, this delta belongs to a reasoning/thinking block (intermediate content). */
|
|
3265
|
+
isIntermediate?: boolean;
|
|
3264
3266
|
}
|
|
3265
3267
|
/**
|
|
3266
3268
|
* Text complete event - finalizes streaming text
|
package/dist/index.js
CHANGED
|
@@ -5361,6 +5361,24 @@ function handleTextDelta(state, event) {
|
|
|
5361
5361
|
const streamingIndex = findStreamingMessage(session.messages, event.turnId);
|
|
5362
5362
|
if (streamingIndex !== -1) {
|
|
5363
5363
|
const currentMsg = session.messages[streamingIndex];
|
|
5364
|
+
if (currentMsg.isIntermediate && !event.isIntermediate) {
|
|
5365
|
+
const closedSession = updateMessageAt(session, streamingIndex, {
|
|
5366
|
+
isStreaming: false
|
|
5367
|
+
});
|
|
5368
|
+
const newMessage2 = {
|
|
5369
|
+
id: generateMessageId2(),
|
|
5370
|
+
role: "assistant",
|
|
5371
|
+
content: event.delta,
|
|
5372
|
+
timestamp: event.timestamp ?? Date.now(),
|
|
5373
|
+
isStreaming: true,
|
|
5374
|
+
isPending: true,
|
|
5375
|
+
turnId: event.turnId
|
|
5376
|
+
};
|
|
5377
|
+
return {
|
|
5378
|
+
session: appendMessage(closedSession, newMessage2, false),
|
|
5379
|
+
streaming: { content: event.delta, turnId: event.turnId }
|
|
5380
|
+
};
|
|
5381
|
+
}
|
|
5364
5382
|
const updatedSession = updateMessageAt(session, streamingIndex, {
|
|
5365
5383
|
content: currentMsg.content + event.delta
|
|
5366
5384
|
});
|
|
@@ -5373,7 +5391,8 @@ function handleTextDelta(state, event) {
|
|
|
5373
5391
|
timestamp: event.timestamp ?? Date.now(),
|
|
5374
5392
|
isStreaming: true,
|
|
5375
5393
|
isPending: true,
|
|
5376
|
-
turnId: event.turnId
|
|
5394
|
+
turnId: event.turnId,
|
|
5395
|
+
...event.isIntermediate ? { isIntermediate: true } : {}
|
|
5377
5396
|
};
|
|
5378
5397
|
return {
|
|
5379
5398
|
session: appendMessage(session, newMessage, false),
|
|
@@ -5383,12 +5402,15 @@ function handleTextDelta(state, event) {
|
|
|
5383
5402
|
function handleTextComplete(state, event) {
|
|
5384
5403
|
const { session, streaming } = state;
|
|
5385
5404
|
let msgIndex = findStreamingMessage(session.messages, event.turnId);
|
|
5405
|
+
if (msgIndex !== -1 && event.isIntermediate && !session.messages[msgIndex].isIntermediate) {
|
|
5406
|
+
msgIndex = -1;
|
|
5407
|
+
}
|
|
5386
5408
|
if (msgIndex === -1) {
|
|
5387
5409
|
msgIndex = findAssistantMessage(session.messages, event.turnId);
|
|
5388
5410
|
}
|
|
5389
5411
|
if (msgIndex !== -1) {
|
|
5390
5412
|
const existingMsg = session.messages[msgIndex];
|
|
5391
|
-
if (!existingMsg.isStreaming && existingMsg.isIntermediate &&
|
|
5413
|
+
if (!existingMsg.isStreaming && existingMsg.isIntermediate && !existingMsg.isPending) {
|
|
5392
5414
|
msgIndex = -1;
|
|
5393
5415
|
}
|
|
5394
5416
|
}
|
|
@@ -6456,14 +6478,16 @@ function mapCoreEventToProcessorEvent(coreEvent, sessionId) {
|
|
|
6456
6478
|
type: "text_delta",
|
|
6457
6479
|
sessionId,
|
|
6458
6480
|
delta: coreEvent.text,
|
|
6459
|
-
turnId: coreEvent.turnId
|
|
6481
|
+
turnId: coreEvent.turnId,
|
|
6482
|
+
isIntermediate: true
|
|
6460
6483
|
};
|
|
6461
6484
|
case "reasoning":
|
|
6462
6485
|
return {
|
|
6463
6486
|
type: "text_complete",
|
|
6464
6487
|
sessionId,
|
|
6465
6488
|
text: coreEvent.text,
|
|
6466
|
-
turnId: coreEvent.turnId
|
|
6489
|
+
turnId: coreEvent.turnId,
|
|
6490
|
+
isIntermediate: true
|
|
6467
6491
|
};
|
|
6468
6492
|
case "permission_response":
|
|
6469
6493
|
return {
|
|
@@ -6503,7 +6527,8 @@ function mapTimelineEnvelopeToProcessorEvent(envelope) {
|
|
|
6503
6527
|
sessionId,
|
|
6504
6528
|
delta: item.text,
|
|
6505
6529
|
turnId: item.turnId,
|
|
6506
|
-
timestamp
|
|
6530
|
+
timestamp,
|
|
6531
|
+
...item.type === "reasoning_delta" && { isIntermediate: true }
|
|
6507
6532
|
};
|
|
6508
6533
|
case "assistant_message":
|
|
6509
6534
|
case "reasoning":
|
|
@@ -6513,7 +6538,8 @@ function mapTimelineEnvelopeToProcessorEvent(envelope) {
|
|
|
6513
6538
|
text: item.text,
|
|
6514
6539
|
turnId: item.turnId,
|
|
6515
6540
|
timestamp,
|
|
6516
|
-
messageId: item.messageId
|
|
6541
|
+
messageId: item.messageId,
|
|
6542
|
+
...item.type === "reasoning" && { isIntermediate: true }
|
|
6517
6543
|
};
|
|
6518
6544
|
case "tool_call":
|
|
6519
6545
|
return {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@percena/weft-react",
|
|
3
|
-
"version": "0.1.5-next.
|
|
3
|
+
"version": "0.1.5-next.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Weft React — TimelineAgentChatPanel + headless hooks (useAgentSession) with precompiled CSS; no Tailwind setup required in the host",
|
|
6
6
|
"type": "module",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"remark-gfm": "^4.0.0",
|
|
48
48
|
"remark-math": "^6.0.0",
|
|
49
49
|
"zod": "^3.0.0",
|
|
50
|
-
"@percena/weft-client": "^0.
|
|
50
|
+
"@percena/weft-client": "^0.2.0-next.0"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@tailwindcss/cli": "^4.0.0",
|
|
@@ -55,9 +55,9 @@
|
|
|
55
55
|
"@types/react": "^19.2.14",
|
|
56
56
|
"tailwindcss": "^4.0.0",
|
|
57
57
|
"@weft/provider-flitro": "0.1.0",
|
|
58
|
-
"@weft/ui": "0.1.0",
|
|
59
58
|
"@weft/local-chat": "0.1.0",
|
|
60
|
-
"@weft/runtime-core": "0.1.0"
|
|
59
|
+
"@weft/runtime-core": "0.1.0",
|
|
60
|
+
"@weft/ui": "0.1.0"
|
|
61
61
|
},
|
|
62
62
|
"keywords": [
|
|
63
63
|
"weft",
|