@trevonistrevon/pi-loop 0.5.7 → 0.5.9

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.
Files changed (61) hide show
  1. package/.release-please-manifest.json +3 -0
  2. package/Dockerfile +17 -0
  3. package/coverage/coverage-final.json +28 -27
  4. package/coverage/index.html +47 -47
  5. package/coverage/src/commands/index.html +15 -15
  6. package/coverage/src/commands/loop-command.ts.html +3 -3
  7. package/coverage/src/commands/tasks-command.ts.html +23 -23
  8. package/coverage/src/coordinator.ts.html +20 -20
  9. package/coverage/src/goal-coordinator.ts.html +1 -1
  10. package/coverage/src/goal-reducer.ts.html +1 -1
  11. package/coverage/src/goal-store.ts.html +1 -1
  12. package/coverage/src/goal-verifier.ts.html +1 -1
  13. package/coverage/src/index.html +42 -42
  14. package/coverage/src/index.ts.html +122 -74
  15. package/coverage/src/loop-parse.ts.html +61 -61
  16. package/coverage/src/loop-reducer.ts.html +25 -25
  17. package/coverage/src/monitor-completion-coordinator.ts.html +3 -3
  18. package/coverage/src/monitor-manager.ts.html +73 -67
  19. package/coverage/src/monitor-reducer.ts.html +27 -27
  20. package/coverage/src/notification-reducer.ts.html +7 -7
  21. package/coverage/src/reducer-backed-store.ts.html +53 -53
  22. package/coverage/src/runtime/index.html +66 -51
  23. package/coverage/src/runtime/monitor-ondone-runtime.ts.html +39 -39
  24. package/coverage/src/runtime/notification-runtime.ts.html +14 -14
  25. package/coverage/src/runtime/scope.ts.html +34 -34
  26. package/coverage/src/runtime/session-runtime.ts.html +63 -57
  27. package/coverage/src/runtime/task-backlog-runtime.ts.html +48 -48
  28. package/coverage/src/runtime/task-events.ts.html +208 -0
  29. package/coverage/src/runtime/task-rpc.ts.html +88 -82
  30. package/coverage/src/scheduler.ts.html +34 -34
  31. package/coverage/src/store.ts.html +21 -21
  32. package/coverage/src/task-backlog-coordinator.ts.html +8 -8
  33. package/coverage/src/task-reducer.ts.html +39 -39
  34. package/coverage/src/task-store.ts.html +55 -55
  35. package/coverage/src/tools/index.html +43 -43
  36. package/coverage/src/tools/loop-tools.ts.html +94 -94
  37. package/coverage/src/tools/monitor-tools.ts.html +53 -53
  38. package/coverage/src/tools/native-task-tools.ts.html +99 -78
  39. package/coverage/src/trigger-system.ts.html +8 -8
  40. package/coverage/src/ui/index.html +1 -1
  41. package/coverage/src/ui/widget.ts.html +5 -5
  42. package/dist/commands/tasks-command.js +12 -9
  43. package/dist/index.js +34 -19
  44. package/dist/monitor-manager.d.ts +4 -1
  45. package/dist/monitor-manager.js +8 -4
  46. package/dist/runtime/session-runtime.js +3 -1
  47. package/dist/runtime/task-events.d.ts +15 -0
  48. package/dist/runtime/task-events.js +13 -0
  49. package/dist/runtime/task-rpc.js +2 -0
  50. package/dist/tools/native-task-tools.js +20 -9
  51. package/docker-compose.yml +12 -0
  52. package/package.json +1 -1
  53. package/release-please-config.json +9 -0
  54. package/src/commands/tasks-command.ts +9 -9
  55. package/src/index.ts +37 -21
  56. package/src/monitor-manager.ts +14 -4
  57. package/src/runtime/session-runtime.ts +3 -1
  58. package/src/runtime/task-events.ts +41 -0
  59. package/src/runtime/task-rpc.ts +2 -0
  60. package/src/tools/native-task-tools.ts +16 -9
  61. package/vitest.config.ts +11 -7
@@ -23,16 +23,16 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">76.92% </span>
26
+ <span class="strong">100% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>20/26</span>
28
+ <span class='fraction'>26/26</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">78.57% </span>
33
+ <span class="strong">100% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>22/28</span>
35
+ <span class='fraction'>28/28</span>
36
36
  </div>
37
37
 
38
38
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">88.88% </span>
47
+ <span class="strong">100% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>16/18</span>
49
+ <span class='fraction'>18/18</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line medium'></div>
64
+ <div class='status-line high'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -111,31 +111,31 @@
111
111
  <span class="cline-any cline-neutral">&nbsp;</span>
112
112
  <span class="cline-any cline-neutral">&nbsp;</span>
113
113
  <span class="cline-any cline-neutral">&nbsp;</span>
114
- <span class="cline-any cline-yes">107x</span>
115
- <span class="cline-any cline-yes">107x</span>
114
+ <span class="cline-any cline-yes">118x</span>
115
+ <span class="cline-any cline-yes">118x</span>
116
116
  <span class="cline-any cline-neutral">&nbsp;</span>
117
- <span class="cline-any cline-yes">107x</span>
118
- <span class="cline-any cline-yes">107x</span>
119
- <span class="cline-any cline-yes">107x</span>
120
- <span class="cline-any cline-yes">107x</span>
121
- <span class="cline-any cline-yes">107x</span>
122
- <span class="cline-any cline-yes">106x</span>
123
- <span class="cline-any cline-yes">46x</span>
117
+ <span class="cline-any cline-yes">118x</span>
118
+ <span class="cline-any cline-yes">117x</span>
119
+ <span class="cline-any cline-yes">115x</span>
120
+ <span class="cline-any cline-yes">114x</span>
121
+ <span class="cline-any cline-yes">113x</span>
122
+ <span class="cline-any cline-yes">111x</span>
123
+ <span class="cline-any cline-yes">47x</span>
124
124
  <span class="cline-any cline-neutral">&nbsp;</span>
125
- <span class="cline-any cline-yes">60x</span>
126
- <span class="cline-any cline-no">&nbsp;</span>
125
+ <span class="cline-any cline-yes">64x</span>
126
+ <span class="cline-any cline-yes">1x</span>
127
127
  <span class="cline-any cline-neutral">&nbsp;</span>
128
128
  <span class="cline-any cline-neutral">&nbsp;</span>
129
129
  <span class="cline-any cline-neutral">&nbsp;</span>
130
- <span class="cline-any cline-yes">45x</span>
131
- <span class="cline-any cline-yes">45x</span>
130
+ <span class="cline-any cline-yes">51x</span>
131
+ <span class="cline-any cline-yes">51x</span>
132
132
  <span class="cline-any cline-neutral">&nbsp;</span>
133
- <span class="cline-any cline-yes">45x</span>
134
- <span class="cline-any cline-yes">44x</span>
135
- <span class="cline-any cline-yes">15x</span>
133
+ <span class="cline-any cline-yes">51x</span>
134
+ <span class="cline-any cline-yes">49x</span>
135
+ <span class="cline-any cline-yes">16x</span>
136
136
  <span class="cline-any cline-neutral">&nbsp;</span>
137
- <span class="cline-any cline-yes">29x</span>
138
- <span class="cline-any cline-no">&nbsp;</span>
137
+ <span class="cline-any cline-yes">33x</span>
138
+ <span class="cline-any cline-yes">2x</span>
139
139
  <span class="cline-any cline-neutral">&nbsp;</span>
140
140
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { join, resolve } from "node:path";
141
141
  &nbsp;
@@ -151,16 +151,16 @@ export function resolveLoopStorePath(options: ScopeOptions, sessionId?: string):
151
151
  const cwd = options.cwd ?? process.cwd();
152
152
  const { piLoopEnv, loopScope } = options;
153
153
  &nbsp;
154
- <span class="missing-if-branch" title="if path not taken" >I</span>if (piLoopEnv === "off") <span class="cstat-no" title="statement not covered" >return undefined;</span>
155
- <span class="missing-if-branch" title="if path not taken" >I</span>if (piLoopEnv?.startsWith("/")) <span class="cstat-no" title="statement not covered" >return piLoopEnv;</span>
156
- <span class="missing-if-branch" title="if path not taken" >I</span>if (piLoopEnv?.startsWith(".")) <span class="cstat-no" title="statement not covered" >return resolve(piLoopEnv);</span>
157
- <span class="missing-if-branch" title="if path not taken" >I</span>if (piLoopEnv) <span class="cstat-no" title="statement not covered" >return piLoopEnv;</span>
154
+ if (piLoopEnv === "off") return undefined;
155
+ if (piLoopEnv?.startsWith("/")) return piLoopEnv;
156
+ if (piLoopEnv?.startsWith(".")) return resolve(piLoopEnv);
157
+ if (piLoopEnv) return piLoopEnv;
158
158
  if (loopScope === "memory") return undefined;
159
159
  if (loopScope === "session" &amp;&amp; sessionId) {
160
160
  return join(cwd, ".pi", "loops", `loops-${sessionId}.json`);
161
161
  }
162
- <span class="missing-if-branch" title="else path not taken" >E</span>if (loopScope === "session") return undefined;
163
- <span class="cstat-no" title="statement not covered" > return join(cwd, ".pi", "loops", "loops.json");</span>
162
+ if (loopScope === "session") return undefined;
163
+ return join(cwd, ".pi", "loops", "loops.json");
164
164
  }
165
165
  &nbsp;
166
166
  export function resolveTaskStorePath(options: ScopeOptions, sessionId?: string): string | undefined {
@@ -171,8 +171,8 @@ export function resolveTaskStorePath(options: ScopeOptions, sessionId?: string):
171
171
  if (loopScope === "session" &amp;&amp; sessionId) {
172
172
  return join(cwd, ".pi", "tasks", `tasks-${sessionId}.json`);
173
173
  }
174
- <span class="missing-if-branch" title="else path not taken" >E</span>if (loopScope === "session") return undefined;
175
- <span class="cstat-no" title="statement not covered" > return join(cwd, ".pi", "tasks", "tasks.json");</span>
174
+ if (loopScope === "session") return undefined;
175
+ return join(cwd, ".pi", "tasks", "tasks.json");
176
176
  }
177
177
  &nbsp;</pre></td></tr></table></pre>
178
178
 
@@ -181,7 +181,7 @@ export function resolveTaskStorePath(options: ScopeOptions, sessionId?: string):
181
181
  <div class='footer quiet pad2 space-top1 center small'>
182
182
  Code coverage generated by
183
183
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
184
- at 2026-06-18T20:54:08.775Z
184
+ at 2026-06-23T21:49:18.784Z
185
185
  </div>
186
186
  <script src="../../prettify.js"></script>
187
187
  <script>
@@ -23,23 +23,23 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">90.09% </span>
26
+ <span class="strong">91.08% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>91/101</span>
28
+ <span class='fraction'>92/101</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">79.06% </span>
33
+ <span class="strong">81.39% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>34/43</span>
35
+ <span class='fraction'>35/43</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
40
  <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>15/15</span>
42
+ <span class='fraction'>16/16</span>
43
43
  </div>
44
44
 
45
45
 
@@ -259,7 +259,9 @@
259
259
  <a name='L194'></a><a href='#L194'>194</a>
260
260
  <a name='L195'></a><a href='#L195'>195</a>
261
261
  <a name='L196'></a><a href='#L196'>196</a>
262
- <a name='L197'></a><a href='#L197'>197</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
263
265
  <span class="cline-any cline-neutral">&nbsp;</span>
264
266
  <span class="cline-any cline-neutral">&nbsp;</span>
265
267
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -270,7 +272,9 @@
270
272
  <span class="cline-any cline-neutral">&nbsp;</span>
271
273
  <span class="cline-any cline-neutral">&nbsp;</span>
272
274
  <span class="cline-any cline-neutral">&nbsp;</span>
273
- <span class="cline-any cline-yes">3x</span>
275
+ <span class="cline-any cline-yes">4x</span>
276
+ <span class="cline-any cline-neutral">&nbsp;</span>
277
+ <span class="cline-any cline-neutral">&nbsp;</span>
274
278
  <span class="cline-any cline-neutral">&nbsp;</span>
275
279
  <span class="cline-any cline-neutral">&nbsp;</span>
276
280
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -307,46 +311,46 @@
307
311
  <span class="cline-any cline-neutral">&nbsp;</span>
308
312
  <span class="cline-any cline-neutral">&nbsp;</span>
309
313
  <span class="cline-any cline-neutral">&nbsp;</span>
314
+ <span class="cline-any cline-yes">67x</span>
310
315
  <span class="cline-any cline-neutral">&nbsp;</span>
316
+ <span class="cline-any cline-yes">67x</span>
317
+ <span class="cline-any cline-yes">67x</span>
311
318
  <span class="cline-any cline-neutral">&nbsp;</span>
312
- <span class="cline-any cline-yes">61x</span>
313
319
  <span class="cline-any cline-neutral">&nbsp;</span>
314
- <span class="cline-any cline-yes">61x</span>
315
- <span class="cline-any cline-yes">61x</span>
316
320
  <span class="cline-any cline-neutral">&nbsp;</span>
317
321
  <span class="cline-any cline-neutral">&nbsp;</span>
318
322
  <span class="cline-any cline-neutral">&nbsp;</span>
319
323
  <span class="cline-any cline-neutral">&nbsp;</span>
320
324
  <span class="cline-any cline-neutral">&nbsp;</span>
325
+ <span class="cline-any cline-yes">56x</span>
326
+ <span class="cline-any cline-yes">49x</span>
321
327
  <span class="cline-any cline-neutral">&nbsp;</span>
322
328
  <span class="cline-any cline-neutral">&nbsp;</span>
323
- <span class="cline-any cline-yes">50x</span>
324
- <span class="cline-any cline-yes">45x</span>
325
- <span class="cline-any cline-yes">70x</span>
329
+ <span class="cline-any cline-yes">93x</span>
326
330
  <span class="cline-any cline-neutral">&nbsp;</span>
327
- <span class="cline-any cline-yes">45x</span>
331
+ <span class="cline-any cline-yes">49x</span>
328
332
  <span class="cline-any cline-neutral">&nbsp;</span>
329
333
  <span class="cline-any cline-neutral">&nbsp;</span>
330
334
  <span class="cline-any cline-neutral">&nbsp;</span>
331
- <span class="cline-any cline-yes">5x</span>
332
- <span class="cline-any cline-yes">5x</span>
333
- <span class="cline-any cline-yes">5x</span>
335
+ <span class="cline-any cline-yes">7x</span>
336
+ <span class="cline-any cline-yes">6x</span>
337
+ <span class="cline-any cline-yes">6x</span>
334
338
  <span class="cline-any cline-neutral">&nbsp;</span>
335
339
  <span class="cline-any cline-neutral">&nbsp;</span>
336
340
  <span class="cline-any cline-neutral">&nbsp;</span>
337
- <span class="cline-any cline-yes">53x</span>
338
- <span class="cline-any cline-yes">48x</span>
341
+ <span class="cline-any cline-yes">59x</span>
342
+ <span class="cline-any cline-yes">52x</span>
339
343
  <span class="cline-any cline-yes">46x</span>
340
344
  <span class="cline-any cline-neutral">&nbsp;</span>
341
- <span class="cline-any cline-yes">48x</span>
345
+ <span class="cline-any cline-yes">52x</span>
342
346
  <span class="cline-any cline-neutral">&nbsp;</span>
343
347
  <span class="cline-any cline-neutral">&nbsp;</span>
344
348
  <span class="cline-any cline-neutral">&nbsp;</span>
345
- <span class="cline-any cline-yes">8x</span>
346
- <span class="cline-any cline-yes">8x</span>
347
- <span class="cline-any cline-yes">8x</span>
348
- <span class="cline-any cline-yes">8x</span>
349
- <span class="cline-any cline-yes">8x</span>
349
+ <span class="cline-any cline-yes">10x</span>
350
+ <span class="cline-any cline-yes">10x</span>
351
+ <span class="cline-any cline-yes">10x</span>
352
+ <span class="cline-any cline-yes">10x</span>
353
+ <span class="cline-any cline-yes">10x</span>
350
354
  <span class="cline-any cline-no">&nbsp;</span>
351
355
  <span class="cline-any cline-no">&nbsp;</span>
352
356
  <span class="cline-any cline-no">&nbsp;</span>
@@ -356,39 +360,39 @@
356
360
  <span class="cline-any cline-neutral">&nbsp;</span>
357
361
  <span class="cline-any cline-neutral">&nbsp;</span>
358
362
  <span class="cline-any cline-neutral">&nbsp;</span>
359
- <span class="cline-any cline-yes">139x</span>
360
- <span class="cline-any cline-yes">139x</span>
361
- <span class="cline-any cline-yes">76x</span>
362
- <span class="cline-any cline-yes">76x</span>
363
+ <span class="cline-any cline-yes">166x</span>
364
+ <span class="cline-any cline-yes">166x</span>
365
+ <span class="cline-any cline-yes">66x</span>
366
+ <span class="cline-any cline-yes">66x</span>
363
367
  <span class="cline-any cline-yes">13x</span>
364
368
  <span class="cline-any cline-yes">13x</span>
365
369
  <span class="cline-any cline-yes">13x</span>
366
- <span class="cline-any cline-yes">10x</span>
367
- <span class="cline-any cline-yes">10x</span>
370
+ <span class="cline-any cline-yes">11x</span>
371
+ <span class="cline-any cline-yes">11x</span>
368
372
  <span class="cline-any cline-neutral">&nbsp;</span>
369
- <span class="cline-any cline-yes">139x</span>
373
+ <span class="cline-any cline-yes">166x</span>
370
374
  <span class="cline-any cline-neutral">&nbsp;</span>
371
375
  <span class="cline-any cline-neutral">&nbsp;</span>
372
- <span class="cline-any cline-yes">61x</span>
373
- <span class="cline-any cline-yes">45x</span>
374
- <span class="cline-any cline-yes">45x</span>
375
- <span class="cline-any cline-yes">45x</span>
376
- <span class="cline-any cline-yes">45x</span>
377
- <span class="cline-any cline-yes">45x</span>
378
- <span class="cline-any cline-yes">45x</span>
379
- <span class="cline-any cline-yes">45x</span>
376
+ <span class="cline-any cline-yes">67x</span>
377
+ <span class="cline-any cline-yes">49x</span>
378
+ <span class="cline-any cline-yes">49x</span>
379
+ <span class="cline-any cline-yes">49x</span>
380
+ <span class="cline-any cline-yes">49x</span>
381
+ <span class="cline-any cline-yes">49x</span>
382
+ <span class="cline-any cline-yes">49x</span>
383
+ <span class="cline-any cline-yes">49x</span>
380
384
  <span class="cline-any cline-neutral">&nbsp;</span>
381
385
  <span class="cline-any cline-neutral">&nbsp;</span>
382
- <span class="cline-any cline-yes">61x</span>
383
- <span class="cline-any cline-yes">5x</span>
384
- <span class="cline-any cline-yes">5x</span>
385
- <span class="cline-any cline-yes">5x</span>
386
- <span class="cline-any cline-yes">5x</span>
387
- <span class="cline-any cline-yes">5x</span>
388
- <span class="cline-any cline-yes">5x</span>
386
+ <span class="cline-any cline-yes">67x</span>
387
+ <span class="cline-any cline-yes">7x</span>
388
+ <span class="cline-any cline-yes">7x</span>
389
+ <span class="cline-any cline-yes">7x</span>
390
+ <span class="cline-any cline-yes">7x</span>
391
+ <span class="cline-any cline-yes">7x</span>
392
+ <span class="cline-any cline-yes">7x</span>
389
393
  <span class="cline-any cline-neutral">&nbsp;</span>
390
394
  <span class="cline-any cline-neutral">&nbsp;</span>
391
- <span class="cline-any cline-yes">61x</span>
395
+ <span class="cline-any cline-yes">67x</span>
392
396
  <span class="cline-any cline-yes">20x</span>
393
397
  <span class="cline-any cline-neutral">&nbsp;</span>
394
398
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -397,7 +401,7 @@
397
401
  <span class="cline-any cline-yes">20x</span>
398
402
  <span class="cline-any cline-neutral">&nbsp;</span>
399
403
  <span class="cline-any cline-neutral">&nbsp;</span>
400
- <span class="cline-any cline-yes">61x</span>
404
+ <span class="cline-any cline-yes">67x</span>
401
405
  <span class="cline-any cline-yes">24x</span>
402
406
  <span class="cline-any cline-yes">24x</span>
403
407
  <span class="cline-any cline-yes">24x</span>
@@ -409,12 +413,12 @@
409
413
  <span class="cline-any cline-yes">24x</span>
410
414
  <span class="cline-any cline-neutral">&nbsp;</span>
411
415
  <span class="cline-any cline-neutral">&nbsp;</span>
412
- <span class="cline-any cline-yes">61x</span>
413
- <span class="cline-any cline-yes">2x</span>
414
- <span class="cline-any cline-yes">2x</span>
416
+ <span class="cline-any cline-yes">67x</span>
417
+ <span class="cline-any cline-yes">4x</span>
418
+ <span class="cline-any cline-yes">4x</span>
415
419
  <span class="cline-any cline-neutral">&nbsp;</span>
416
420
  <span class="cline-any cline-neutral">&nbsp;</span>
417
- <span class="cline-any cline-yes">61x</span>
421
+ <span class="cline-any cline-yes">67x</span>
418
422
  <span class="cline-any cline-yes">3x</span>
419
423
  <span class="cline-any cline-yes">3x</span>
420
424
  <span class="cline-any cline-yes">3x</span>
@@ -435,7 +439,7 @@
435
439
  <span class="cline-any cline-yes">3x</span>
436
440
  <span class="cline-any cline-neutral">&nbsp;</span>
437
441
  <span class="cline-any cline-neutral">&nbsp;</span>
438
- <span class="cline-any cline-yes">61x</span>
442
+ <span class="cline-any cline-yes">67x</span>
439
443
  <span class="cline-any cline-yes">3x</span>
440
444
  <span class="cline-any cline-yes">3x</span>
441
445
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -518,13 +522,15 @@ export function registerSessionRuntimeHooks(options: SessionRuntimeOptions): voi
518
522
  function ensureHeartbeat(): void {
519
523
  if (heartbeatTimer) return;
520
524
  heartbeatTimer = setInterval(() =&gt; {
521
- void pumpLoops();
525
+ // Swallow pump failures so a transient error never surfaces as an
526
+ // unhandled rejection; the next tick retries.
527
+ void pumpLoops().catch(() =&gt; {});
522
528
  }, HEARTBEAT_MS);
523
529
  heartbeatTimer.unref?.();
524
530
  }
525
531
  &nbsp;
526
532
  function stopHeartbeat(): void {
527
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!heartbeatTimer) <span class="cstat-no" title="statement not covered" >return;</span>
533
+ if (!heartbeatTimer) return;
528
534
  clearInterval(heartbeatTimer);
529
535
  heartbeatTimer = undefined;
530
536
  }
@@ -658,7 +664,7 @@ export function registerSessionRuntimeHooks(options: SessionRuntimeOptions): voi
658
664
  <div class='footer quiet pad2 space-top1 center small'>
659
665
  Code coverage generated by
660
666
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
661
- at 2026-06-18T20:54:08.775Z
667
+ at 2026-06-23T21:49:18.784Z
662
668
  </div>
663
669
  <script src="../../prettify.js"></script>
664
670
  <script>
@@ -23,16 +23,16 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">93.75% </span>
26
+ <span class="strong">95.83% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>45/48</span>
28
+ <span class='fraction'>46/48</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">76% </span>
33
+ <span class="strong">80% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>19/25</span>
35
+ <span class='fraction'>20/25</span>
36
36
  </div>
37
37
 
38
38
 
@@ -238,8 +238,8 @@
238
238
  <span class="cline-any cline-neutral">&nbsp;</span>
239
239
  <span class="cline-any cline-neutral">&nbsp;</span>
240
240
  <span class="cline-any cline-neutral">&nbsp;</span>
241
- <span class="cline-any cline-yes">3x</span>
242
- <span class="cline-any cline-yes">3x</span>
241
+ <span class="cline-any cline-yes">4x</span>
242
+ <span class="cline-any cline-yes">4x</span>
243
243
  <span class="cline-any cline-neutral">&nbsp;</span>
244
244
  <span class="cline-any cline-neutral">&nbsp;</span>
245
245
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -279,92 +279,92 @@
279
279
  <span class="cline-any cline-neutral">&nbsp;</span>
280
280
  <span class="cline-any cline-neutral">&nbsp;</span>
281
281
  <span class="cline-any cline-neutral">&nbsp;</span>
282
- <span class="cline-any cline-yes">61x</span>
282
+ <span class="cline-any cline-yes">75x</span>
283
283
  <span class="cline-any cline-neutral">&nbsp;</span>
284
284
  <span class="cline-any cline-neutral">&nbsp;</span>
285
- <span class="cline-any cline-yes">2x</span>
285
+ <span class="cline-any cline-yes">15x</span>
286
286
  <span class="cline-any cline-neutral">&nbsp;</span>
287
287
  <span class="cline-any cline-neutral">&nbsp;</span>
288
288
  <span class="cline-any cline-neutral">&nbsp;</span>
289
289
  <span class="cline-any cline-neutral">&nbsp;</span>
290
290
  <span class="cline-any cline-neutral">&nbsp;</span>
291
- <span class="cline-any cline-yes">10x</span>
291
+ <span class="cline-any cline-yes">16x</span>
292
292
  <span class="cline-any cline-neutral">&nbsp;</span>
293
293
  <span class="cline-any cline-neutral">&nbsp;</span>
294
294
  <span class="cline-any cline-neutral">&nbsp;</span>
295
295
  <span class="cline-any cline-neutral">&nbsp;</span>
296
296
  <span class="cline-any cline-neutral">&nbsp;</span>
297
- <span class="cline-any cline-yes">7x</span>
297
+ <span class="cline-any cline-yes">11x</span>
298
298
  <span class="cline-any cline-neutral">&nbsp;</span>
299
299
  <span class="cline-any cline-neutral">&nbsp;</span>
300
300
  <span class="cline-any cline-neutral">&nbsp;</span>
301
- <span class="cline-any cline-yes">34x</span>
302
- <span class="cline-any cline-yes">34x</span>
301
+ <span class="cline-any cline-yes">39x</span>
302
+ <span class="cline-any cline-yes">39x</span>
303
303
  <span class="cline-any cline-neutral">&nbsp;</span>
304
- <span class="cline-any cline-yes">4x</span>
305
- <span class="cline-any cline-yes">4x</span>
304
+ <span class="cline-any cline-yes">8x</span>
305
+ <span class="cline-any cline-yes">8x</span>
306
306
  <span class="cline-any cline-neutral">&nbsp;</span>
307
- <span class="cline-any cline-yes">3x</span>
308
- <span class="cline-any cline-yes">3x</span>
309
- <span class="cline-any cline-yes">3x</span>
310
- <span class="cline-any cline-yes">3x</span>
307
+ <span class="cline-any cline-yes">5x</span>
308
+ <span class="cline-any cline-yes">5x</span>
309
+ <span class="cline-any cline-yes">5x</span>
310
+ <span class="cline-any cline-yes">5x</span>
311
311
  <span class="cline-any cline-neutral">&nbsp;</span>
312
- <span class="cline-any cline-yes">3x</span>
313
- <span class="cline-any cline-yes">3x</span>
312
+ <span class="cline-any cline-yes">5x</span>
313
+ <span class="cline-any cline-yes">5x</span>
314
314
  <span class="cline-any cline-neutral">&nbsp;</span>
315
315
  <span class="cline-any cline-neutral">&nbsp;</span>
316
316
  <span class="cline-any cline-neutral">&nbsp;</span>
317
- <span class="cline-any cline-yes">7x</span>
317
+ <span class="cline-any cline-yes">11x</span>
318
318
  <span class="cline-any cline-neutral">&nbsp;</span>
319
- <span class="cline-any cline-yes">7x</span>
320
- <span class="cline-any cline-yes">7x</span>
319
+ <span class="cline-any cline-yes">10x</span>
320
+ <span class="cline-any cline-yes">10x</span>
321
321
  <span class="cline-any cline-neutral">&nbsp;</span>
322
- <span class="cline-any cline-yes">6x</span>
322
+ <span class="cline-any cline-yes">8x</span>
323
323
  <span class="cline-any cline-neutral">&nbsp;</span>
324
324
  <span class="cline-any cline-neutral">&nbsp;</span>
325
325
  <span class="cline-any cline-neutral">&nbsp;</span>
326
326
  <span class="cline-any cline-neutral">&nbsp;</span>
327
327
  <span class="cline-any cline-neutral">&nbsp;</span>
328
- <span class="cline-any cline-yes">6x</span>
328
+ <span class="cline-any cline-yes">8x</span>
329
329
  <span class="cline-any cline-neutral">&nbsp;</span>
330
330
  <span class="cline-any cline-neutral">&nbsp;</span>
331
331
  <span class="cline-any cline-neutral">&nbsp;</span>
332
332
  <span class="cline-any cline-neutral">&nbsp;</span>
333
- <span class="cline-any cline-yes">6x</span>
334
- <span class="cline-any cline-yes">6x</span>
335
- <span class="cline-any cline-yes">6x</span>
336
- <span class="cline-any cline-yes">6x</span>
333
+ <span class="cline-any cline-yes">8x</span>
334
+ <span class="cline-any cline-yes">8x</span>
335
+ <span class="cline-any cline-yes">8x</span>
336
+ <span class="cline-any cline-yes">8x</span>
337
337
  <span class="cline-any cline-neutral">&nbsp;</span>
338
338
  <span class="cline-any cline-neutral">&nbsp;</span>
339
339
  <span class="cline-any cline-neutral">&nbsp;</span>
340
- <span class="cline-any cline-yes">61x</span>
341
- <span class="cline-any cline-yes">61x</span>
340
+ <span class="cline-any cline-yes">75x</span>
341
+ <span class="cline-any cline-yes">75x</span>
342
342
  <span class="cline-any cline-neutral">&nbsp;</span>
343
- <span class="cline-any cline-yes">61x</span>
344
- <span class="cline-any cline-yes">70x</span>
345
- <span class="cline-any cline-yes">70x</span>
343
+ <span class="cline-any cline-yes">75x</span>
344
+ <span class="cline-any cline-yes">72x</span>
345
+ <span class="cline-any cline-yes">72x</span>
346
346
  <span class="cline-any cline-neutral">&nbsp;</span>
347
347
  <span class="cline-any cline-neutral">&nbsp;</span>
348
- <span class="cline-any cline-yes">61x</span>
348
+ <span class="cline-any cline-yes">75x</span>
349
349
  <span class="cline-any cline-neutral">&nbsp;</span>
350
350
  <span class="cline-any cline-neutral">&nbsp;</span>
351
351
  <span class="cline-any cline-neutral">&nbsp;</span>
352
- <span class="cline-any cline-yes">7x</span>
353
- <span class="cline-any cline-yes">7x</span>
352
+ <span class="cline-any cline-yes">8x</span>
353
+ <span class="cline-any cline-yes">8x</span>
354
354
  <span class="cline-any cline-neutral">&nbsp;</span>
355
355
  <span class="cline-any cline-neutral">&nbsp;</span>
356
- <span class="cline-any cline-yes">10x</span>
356
+ <span class="cline-any cline-yes">11x</span>
357
357
  <span class="cline-any cline-neutral">&nbsp;</span>
358
358
  <span class="cline-any cline-neutral">&nbsp;</span>
359
359
  <span class="cline-any cline-neutral">&nbsp;</span>
360
360
  <span class="cline-any cline-neutral">&nbsp;</span>
361
361
  <span class="cline-any cline-neutral">&nbsp;</span>
362
- <span class="cline-any cline-yes">70x</span>
363
- <span class="cline-any cline-yes">70x</span>
364
- <span class="cline-any cline-yes">70x</span>
365
- <span class="cline-any cline-yes">70x</span>
362
+ <span class="cline-any cline-yes">72x</span>
363
+ <span class="cline-any cline-yes">72x</span>
364
+ <span class="cline-any cline-yes">72x</span>
365
+ <span class="cline-any cline-yes">72x</span>
366
366
  <span class="cline-any cline-neutral">&nbsp;</span>
367
- <span class="cline-any cline-yes">70x</span>
367
+ <span class="cline-any cline-yes">72x</span>
368
368
  <span class="cline-any cline-neutral">&nbsp;</span>
369
369
  <span class="cline-any cline-neutral">&nbsp;</span>
370
370
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -372,15 +372,15 @@
372
372
  <span class="cline-any cline-neutral">&nbsp;</span>
373
373
  <span class="cline-any cline-neutral">&nbsp;</span>
374
374
  <span class="cline-any cline-neutral">&nbsp;</span>
375
- <span class="cline-any cline-yes">70x</span>
376
- <span class="cline-any cline-yes">70x</span>
375
+ <span class="cline-any cline-yes">72x</span>
376
+ <span class="cline-any cline-yes">72x</span>
377
377
  <span class="cline-any cline-neutral">&nbsp;</span>
378
378
  <span class="cline-any cline-neutral">&nbsp;</span>
379
379
  <span class="cline-any cline-neutral">&nbsp;</span>
380
380
  <span class="cline-any cline-neutral">&nbsp;</span>
381
381
  <span class="cline-any cline-neutral">&nbsp;</span>
382
382
  <span class="cline-any cline-neutral">&nbsp;</span>
383
- <span class="cline-any cline-yes">61x</span>
383
+ <span class="cline-any cline-yes">75x</span>
384
384
  <span class="cline-any cline-neutral">&nbsp;</span>
385
385
  <span class="cline-any cline-neutral">&nbsp;</span>
386
386
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -477,7 +477,7 @@ export function createTaskBacklogRuntime(options: TaskBacklogRuntimeOptions): Ta
477
477
  }
478
478
  &nbsp;
479
479
  async function ensureAutoTaskWorkerLoop(taskStore: TaskStore): Promise&lt;{ entry?: LoopEntry; created: boolean }&gt; {
480
- <span class="missing-if-branch" title="if path not taken" >I</span>if (taskStore.pendingCount() &lt; AUTO_TASK_WORKER_THRESHOLD) <span class="cstat-no" title="statement not covered" >return { created: false };</span>
480
+ if (taskStore.pendingCount() &lt; AUTO_TASK_WORKER_THRESHOLD) return { created: false };
481
481
  &nbsp;
482
482
  const existing = findAutoTaskWorkerLoop();
483
483
  if (existing) return { entry: existing, created: false };
@@ -559,7 +559,7 @@ export function createTaskBacklogRuntime(options: TaskBacklogRuntimeOptions): Ta
559
559
  <div class='footer quiet pad2 space-top1 center small'>
560
560
  Code coverage generated by
561
561
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
562
- at 2026-06-18T20:54:08.775Z
562
+ at 2026-06-23T21:49:18.784Z
563
563
  </div>
564
564
  <script src="../../prettify.js"></script>
565
565
  <script>