@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 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
- (`@percena/weft-node` `weft.sessions.create(...)`). Re-exports the full
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 && event.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 }` (e.g. with `@percena/weft-node`) and the
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 }` (e.g. with `@percena/weft-node`) and the
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 && event.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.0",
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.1.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",