pi-herdr-agents 2.0.3 → 2.0.4

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 CHANGED
@@ -7,11 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
9
9
 
10
- ## [v2.0.3](https://github.com/giuseppecrj/pi-herdr-agents/compare/v2.0.2...v2.0.3)
10
+ ## [v2.0.4](https://github.com/giuseppecrj/pi-herdr-agents/compare/v2.0.3...v2.0.4)
11
+
12
+ ### Merged
13
+
14
+ - perf: batch persistent delivery ledger reads [`#58`](https://github.com/giuseppecrj/pi-herdr-agents/pull/58)
15
+
16
+ ## [v2.0.3](https://github.com/giuseppecrj/pi-herdr-agents/compare/v2.0.2...v2.0.3) - 2026-09-21
11
17
 
12
18
  ### Commits
13
19
 
14
20
  - fix: skip startup worktree inventory outside Herdr [`34800d7`](https://github.com/giuseppecrj/pi-herdr-agents/commit/34800d79464575063a61ad6f240cd49cc8acd730)
21
+ - chore: release v2.0.3 [`60888f2`](https://github.com/giuseppecrj/pi-herdr-agents/commit/60888f2dea48317257909abbcd0dd374ed861d77)
15
22
 
16
23
  ## [v2.0.2](https://github.com/giuseppecrj/pi-herdr-agents/compare/v2.0.1...v2.0.2) - 2026-09-19
17
24
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-herdr-agents",
3
- "version": "2.0.3",
3
+ "version": "2.0.4",
4
4
  "description": "Asynchronous Pi subagents in Herdr, with optional isolated Git worktrees",
5
5
  "keywords": [
6
6
  "pi-package",
@@ -2422,6 +2422,7 @@ export const __test__ = {
2422
2422
  resolveUnexpectedErrorPresentation,
2423
2423
  shouldAdvanceToFallback,
2424
2424
  deliverPersistentTaskEvent,
2425
+ drainPersistentTaskEvents,
2425
2426
  notifyPersistentCrash,
2426
2427
  sendSubagentResult,
2427
2428
  shouldRetainSubagentSurface,
@@ -2657,11 +2658,13 @@ function deliverPersistentTaskEvent(
2657
2658
  running: RunningSubagent,
2658
2659
  event: ReturnType<typeof readPersistentTaskEvents>[number],
2659
2660
  api: Pick<ExtensionAPI, "sendMessage">,
2661
+ ledgerSnapshot?: ReturnType<typeof readPersistentDeliveryLedger>,
2660
2662
  ): void {
2661
2663
  if (!running.persistent || event.generation !== running.generationId) return;
2662
2664
  const deliveryKey = `${running.id}:${event.type}:${event.task}`;
2663
2665
  if (inFlightPersistentTaskDeliveries.has(deliveryKey)) return;
2664
- const ledger = readPersistentDeliveryLedger(running.sessionFile);
2666
+ const ledger =
2667
+ ledgerSnapshot ?? readPersistentDeliveryLedger(running.sessionFile);
2665
2668
  if (event.type === "help-request") {
2666
2669
  if (
2667
2670
  ledger.some(
@@ -2685,13 +2688,15 @@ function deliverPersistentTaskEvent(
2685
2688
  },
2686
2689
  { triggerTurn: true, deliverAs: "steer" },
2687
2690
  );
2688
- appendPersistentDeliveryLedger(running.sessionFile, {
2689
- task: event.task,
2690
- outcome: "help-requested",
2691
- generation: running.generationId!,
2692
- logicalId: running.logicalId!,
2693
- policyHash: running.policyHash!,
2694
- });
2691
+ ledger.push(
2692
+ appendPersistentDeliveryLedger(running.sessionFile, {
2693
+ task: event.task,
2694
+ outcome: "help-requested",
2695
+ generation: running.generationId!,
2696
+ logicalId: running.logicalId!,
2697
+ policyHash: running.policyHash!,
2698
+ }),
2699
+ );
2695
2700
  if (running.taskId === event.task) running.taskId = undefined;
2696
2701
  } finally {
2697
2702
  inFlightPersistentTaskDeliveries.delete(deliveryKey);
@@ -2724,13 +2729,15 @@ function deliverPersistentTaskEvent(
2724
2729
  policyHash: running.policyHash!,
2725
2730
  },
2726
2731
  );
2727
- appendPersistentDeliveryLedger(running.sessionFile, {
2728
- task: event.task,
2729
- outcome: "delivered",
2730
- generation: running.generationId!,
2731
- logicalId: running.logicalId!,
2732
- policyHash: running.policyHash!,
2733
- });
2732
+ ledger.push(
2733
+ appendPersistentDeliveryLedger(running.sessionFile, {
2734
+ task: event.task,
2735
+ outcome: "delivered",
2736
+ generation: running.generationId!,
2737
+ logicalId: running.logicalId!,
2738
+ policyHash: running.policyHash!,
2739
+ }),
2740
+ );
2734
2741
  running.tasksCompleted = completed;
2735
2742
  if (running.taskId === event.task) running.taskId = undefined;
2736
2743
  if (running.stopState === "pending")
@@ -2743,13 +2750,25 @@ function deliverPersistentTaskEvent(
2743
2750
  function drainPersistentTaskEvents(
2744
2751
  running: RunningSubagent,
2745
2752
  api: Pick<ExtensionAPI, "sendMessage">,
2753
+ readLedger = readPersistentDeliveryLedger,
2746
2754
  ): void {
2747
2755
  const events = readPersistentTaskEvents(running.sessionFile);
2756
+ let ledger: ReturnType<typeof readPersistentDeliveryLedger> | undefined;
2748
2757
  for (const event of events.slice(running.observedTaskEvents ?? 0)) {
2758
+ if (!running.persistent || event.generation !== running.generationId)
2759
+ continue;
2760
+ if (
2761
+ inFlightPersistentTaskDeliveries.has(
2762
+ `${running.id}:${event.type}:${event.task}`,
2763
+ )
2764
+ )
2765
+ continue;
2766
+ ledger ??= readLedger(running.sessionFile);
2749
2767
  deliverPersistentTaskEvent(
2750
2768
  running,
2751
2769
  event,
2752
2770
  selectCompletionApi(api, runtime.pi),
2771
+ ledger,
2753
2772
  );
2754
2773
  }
2755
2774
  running.observedTaskEvents = events.length;