@hermespilot/link 0.8.1 → 0.8.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.
@@ -7721,7 +7721,7 @@ function isConversationMissingError(error) {
7721
7721
  }
7722
7722
 
7723
7723
  // src/constants.ts
7724
- var LINK_VERSION = "0.8.1";
7724
+ var LINK_VERSION = "0.8.2";
7725
7725
  var LINK_COMMAND = "hermeslink";
7726
7726
  var LINK_DEFAULT_PORT = 52379;
7727
7727
  var LINK_RUNTIME_DIR_NAME = ".hermeslink";
@@ -29186,7 +29186,13 @@ ${details.join("\n")}` : localizedEmptyHermesResponseMessage(language);
29186
29186
  });
29187
29187
  if (messageId) {
29188
29188
  if (isReasoningEvent) {
29189
- await this.appendThinkingDelta(conversationId, runId, messageId, event);
29189
+ await this.appendThinkingDelta(
29190
+ conversationId,
29191
+ runId,
29192
+ messageId,
29193
+ event,
29194
+ conversationEvent.created_at
29195
+ );
29190
29196
  } else {
29191
29197
  await this.persistAgentEventProjection(
29192
29198
  conversationId,
@@ -29452,7 +29458,7 @@ ${details.join("\n")}` : localizedEmptyHermesResponseMessage(language);
29452
29458
  extracted.references
29453
29459
  );
29454
29460
  }
29455
- async appendThinkingDelta(conversationId, runId, messageId, event) {
29461
+ async appendThinkingDelta(conversationId, runId, messageId, event, updatedAt) {
29456
29462
  const delta = readDelta(event.payload);
29457
29463
  if (!delta) {
29458
29464
  return;
@@ -29463,7 +29469,27 @@ ${details.join("\n")}` : localizedEmptyHermesResponseMessage(language);
29463
29469
  );
29464
29470
  const hasAssistantText = assistant != null && messageText2(assistant).trim().length > 0;
29465
29471
  const run = snapshot.runs.find((item) => item.id === runId);
29466
- if (!assistant || hasAssistantText || run?.status !== "running") {
29472
+ if (!assistant || run?.status !== "running") {
29473
+ return;
29474
+ }
29475
+ const occurredAt = updatedAt ?? (/* @__PURE__ */ new Date()).toISOString();
29476
+ if (isInlineReasoningDeltaEvent(event.payloadType)) {
29477
+ appendThinkingEventBlock(
29478
+ assistant,
29479
+ {
29480
+ id: `reasoning_${this.reasoningDeltaSegmentId(event) ?? "delta"}`,
29481
+ kind: "thinking_delta",
29482
+ title: "Thinking",
29483
+ status: "running",
29484
+ created_at: occurredAt,
29485
+ text: delta
29486
+ },
29487
+ occurredAt
29488
+ );
29489
+ assistant.updated_at = occurredAt;
29490
+ await this.deps.writeSnapshot(conversationId, snapshot);
29491
+ }
29492
+ if (hasAssistantText) {
29467
29493
  return;
29468
29494
  }
29469
29495
  await this.deps.appendEvent(conversationId, {
@@ -29483,8 +29509,11 @@ ${details.join("\n")}` : localizedEmptyHermesResponseMessage(language);
29483
29509
  });
29484
29510
  }
29485
29511
  thinkingSegmentId(runId, event) {
29512
+ return this.reasoningDeltaSegmentId(event) ?? `${event.payloadType}:${runId}`;
29513
+ }
29514
+ reasoningDeltaSegmentId(event) {
29486
29515
  const payload = event.payload;
29487
- return readString20(payload, "segment_id") ?? readString20(payload, "segmentId") ?? readString20(payload, "id") ?? readString20(payload, "tool_call_id") ?? readString20(payload, "tool_id") ?? `${event.payloadType}:${runId}`;
29516
+ return readString20(payload, "segment_id") ?? readString20(payload, "segmentId") ?? readString20(payload, "id") ?? readString20(payload, "tool_call_id") ?? readString20(payload, "tool_id") ?? null;
29488
29517
  }
29489
29518
  async runRequestsAppDelivery(conversationId, runId) {
29490
29519
  const snapshot = await this.deps.readSnapshot(conversationId).catch(() => null);
@@ -30499,9 +30528,12 @@ function appendAgentEventBlock2(message, event, updatedAt) {
30499
30528
  if (block.type !== "agent_events") {
30500
30529
  return false;
30501
30530
  }
30531
+ if (!agentEventBlockAcceptsEvent(block, event)) {
30532
+ return false;
30533
+ }
30502
30534
  return upsertAgentEventProjection(block.events, event).length === block.events.length;
30503
30535
  });
30504
- const targetIndex = matchingIndex >= 0 ? matchingIndex : blocks.at(-1)?.type === "agent_events" ? blocks.length - 1 : -1;
30536
+ const targetIndex = matchingIndex >= 0 ? matchingIndex : blocks.at(-1)?.type === "agent_events" && agentEventBlockAcceptsEvent(blocks.at(-1), event) ? blocks.length - 1 : -1;
30505
30537
  if (targetIndex >= 0) {
30506
30538
  const block = blocks[targetIndex];
30507
30539
  if (block.type === "agent_events") {
@@ -30522,6 +30554,68 @@ function appendAgentEventBlock2(message, event, updatedAt) {
30522
30554
  }
30523
30555
  message.blocks = blocks;
30524
30556
  }
30557
+ function appendThinkingEventBlock(message, event, updatedAt) {
30558
+ const blocks = [...message.blocks ?? []];
30559
+ const lastBlock = blocks.at(-1);
30560
+ const targetIndex = lastBlock?.type === "agent_events" && agentEventBlockAcceptsEvent(lastBlock, event) ? blocks.length - 1 : -1;
30561
+ if (targetIndex >= 0) {
30562
+ const block = blocks[targetIndex];
30563
+ if (block.type === "agent_events") {
30564
+ blocks[targetIndex] = {
30565
+ ...block,
30566
+ events: upsertThinkingDeltaEvent(block.events, event),
30567
+ updated_at: updatedAt
30568
+ };
30569
+ }
30570
+ } else {
30571
+ blocks.push({
30572
+ id: `thinking_${blocks.length + 1}`,
30573
+ type: "agent_events",
30574
+ events: [event],
30575
+ created_at: updatedAt,
30576
+ updated_at: updatedAt
30577
+ });
30578
+ }
30579
+ message.blocks = blocks;
30580
+ }
30581
+ function agentEventBlockAcceptsEvent(block, event) {
30582
+ if (block.type !== "agent_events" || block.events.length === 0) {
30583
+ return true;
30584
+ }
30585
+ return block.events.every(
30586
+ (item) => isThinkingAgentEvent(item) === isThinkingAgentEvent(event)
30587
+ );
30588
+ }
30589
+ function upsertThinkingDeltaEvent(events, event) {
30590
+ const index = events.findIndex((item) => item.id === event.id);
30591
+ if (index < 0) {
30592
+ return [...events, event];
30593
+ }
30594
+ const previous = events[index];
30595
+ const copy = [...events];
30596
+ copy[index] = {
30597
+ ...previous,
30598
+ ...event,
30599
+ text: mergeThinkingText(previous.text ?? "", event.text ?? ""),
30600
+ created_at: previous.created_at
30601
+ };
30602
+ return copy;
30603
+ }
30604
+ function mergeThinkingText(previous, delta) {
30605
+ if (!delta) {
30606
+ return previous;
30607
+ }
30608
+ if (!previous || delta === previous) {
30609
+ return delta;
30610
+ }
30611
+ if (delta.startsWith(previous)) {
30612
+ return delta;
30613
+ }
30614
+ return `${previous}${delta}`;
30615
+ }
30616
+ function isThinkingAgentEvent(event) {
30617
+ return event.kind === "thinking_delta";
30618
+ }
30525
30619
  function contextUsagePayloadForSnapshot(snapshot) {
30526
30620
  const run = latestContextUsageRun(snapshot);
30527
30621
  return run ? contextUsagePayload2(run) : null;
@@ -30577,7 +30671,10 @@ function reasoningEffortForRun(run) {
30577
30671
  return effort;
30578
30672
  }
30579
30673
  function isReasoningStreamEvent(payloadType) {
30580
- return payloadType === "reasoning.available" || payloadType === "reasoning.delta" || payloadType === "thinking.delta";
30674
+ return payloadType === "reasoning.delta" || payloadType === "thinking.delta";
30675
+ }
30676
+ function isInlineReasoningDeltaEvent(payloadType) {
30677
+ return payloadType === "reasoning.delta";
30581
30678
  }
30582
30679
  function mergeRunUsage(previous, next) {
30583
30680
  const nextContextWindow = next.context_window ?? previous?.context_window;
package/dist/cli/index.js CHANGED
@@ -55,7 +55,7 @@ import {
55
55
  stopDaemonProcess,
56
56
  summarizeUsageProbeEnsure,
57
57
  translate
58
- } from "../chunk-UI43QFRT.js";
58
+ } from "../chunk-SQ2VMFNE.js";
59
59
 
60
60
  // src/cli/index.ts
61
61
  import { Command } from "commander";
package/dist/http/app.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createApp
3
- } from "../chunk-UI43QFRT.js";
3
+ } from "../chunk-SQ2VMFNE.js";
4
4
  export {
5
5
  createApp
6
6
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hermespilot/link",
3
- "version": "0.8.1",
3
+ "version": "0.8.2",
4
4
  "private": false,
5
5
  "description": "Hermes Link companion service and CLI for connecting hermes-agent through HermesPilot",
6
6
  "license": "MIT",