@trevonistrevon/pi-loop 0.5.9 → 0.6.0

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 (121) hide show
  1. package/.release-please-manifest.json +1 -1
  2. package/AGENTS.md +52 -12
  3. package/CHANGELOG.md +59 -0
  4. package/CONTRIBUTING.md +13 -3
  5. package/README.md +47 -0
  6. package/coverage/coverage-final.json +35 -32
  7. package/coverage/index.html +64 -49
  8. package/coverage/src/api.ts.html +193 -0
  9. package/coverage/src/commands/index.html +32 -32
  10. package/coverage/src/commands/loop-command.ts.html +170 -170
  11. package/coverage/src/commands/tasks-command.ts.html +129 -129
  12. package/coverage/src/coordinator.ts.html +26 -26
  13. package/coverage/src/index.html +61 -106
  14. package/coverage/src/index.ts.html +224 -86
  15. package/coverage/src/loop-parse.ts.html +106 -73
  16. package/coverage/src/loop-reducer.ts.html +21 -21
  17. package/coverage/src/monitor-completion-coordinator.ts.html +1 -1
  18. package/coverage/src/monitor-manager.ts.html +95 -71
  19. package/coverage/src/monitor-reducer.ts.html +15 -15
  20. package/coverage/src/notification-reducer.ts.html +6 -6
  21. package/coverage/src/reducer-backed-store.ts.html +57 -57
  22. package/coverage/src/rpc/channels.ts.html +376 -0
  23. package/coverage/src/rpc/cross-extension-rpc.ts.html +541 -0
  24. package/coverage/src/rpc/index.html +131 -0
  25. package/coverage/src/runtime/index.html +68 -23
  26. package/coverage/src/{goal-coordinator.ts.html → runtime/loop-events.ts.html} +79 -73
  27. package/coverage/src/runtime/monitor-ondone-runtime.ts.html +5 -5
  28. package/coverage/src/runtime/native-task-rpc.ts.html +502 -0
  29. package/coverage/src/runtime/notification-runtime.ts.html +22 -22
  30. package/coverage/src/runtime/scope.ts.html +14 -14
  31. package/coverage/src/runtime/session-runtime.ts.html +32 -32
  32. package/coverage/src/runtime/task-backlog-runtime.ts.html +65 -23
  33. package/coverage/src/runtime/task-events.ts.html +2 -2
  34. package/coverage/src/runtime/task-mutations.ts.html +394 -0
  35. package/coverage/src/runtime/task-rpc.ts.html +102 -120
  36. package/coverage/src/scheduler.ts.html +29 -29
  37. package/coverage/src/store.ts.html +27 -27
  38. package/coverage/src/task-backlog-coordinator.ts.html +8 -8
  39. package/coverage/src/task-reducer.ts.html +42 -42
  40. package/coverage/src/task-store.ts.html +49 -49
  41. package/coverage/src/tools/index.html +39 -24
  42. package/coverage/src/tools/loop-tools.ts.html +12 -21
  43. package/coverage/src/tools/monitor-tools.ts.html +12 -21
  44. package/coverage/src/tools/native-task-tools.ts.html +57 -120
  45. package/coverage/src/tools/tool-result.ts.html +97 -0
  46. package/coverage/src/trigger-system.ts.html +12 -12
  47. package/coverage/src/ui/index.html +1 -1
  48. package/coverage/src/ui/widget.ts.html +23 -23
  49. package/dist/api.d.ts +11 -0
  50. package/dist/api.js +10 -0
  51. package/dist/commands/loop-command.js +2 -2
  52. package/dist/commands/tasks-command.js +3 -3
  53. package/dist/coordinator.d.ts +1 -1
  54. package/dist/index.js +48 -3
  55. package/dist/loop-parse.js +14 -5
  56. package/dist/reducer-backed-store.d.ts +1 -1
  57. package/dist/reducer-backed-store.js +1 -1
  58. package/dist/rpc/channels.d.ts +73 -0
  59. package/dist/rpc/channels.js +30 -0
  60. package/dist/rpc/cross-extension-rpc.d.ts +59 -0
  61. package/dist/rpc/cross-extension-rpc.js +117 -0
  62. package/dist/runtime/loop-events.d.ts +26 -0
  63. package/dist/runtime/loop-events.js +26 -0
  64. package/dist/runtime/native-task-rpc.d.ts +22 -0
  65. package/dist/runtime/native-task-rpc.js +50 -0
  66. package/dist/runtime/task-backlog-runtime.d.ts +3 -0
  67. package/dist/runtime/task-backlog-runtime.js +4 -1
  68. package/dist/runtime/task-mutations.d.ts +39 -0
  69. package/dist/runtime/task-mutations.js +68 -0
  70. package/dist/runtime/task-rpc.d.ts +4 -0
  71. package/dist/runtime/task-rpc.js +40 -58
  72. package/dist/scheduler.js +1 -1
  73. package/dist/tools/loop-tools.js +1 -3
  74. package/dist/tools/monitor-tools.js +1 -3
  75. package/dist/tools/native-task-tools.d.ts +2 -6
  76. package/dist/tools/native-task-tools.js +25 -55
  77. package/dist/tools/tool-result.d.ts +8 -0
  78. package/dist/tools/tool-result.js +4 -0
  79. package/docs/architecture/state-machine-migration.md +0 -44
  80. package/docs/architecture/state-machine-reducer-event-model.md +2 -3
  81. package/package.json +6 -1
  82. package/src/api.ts +36 -0
  83. package/src/commands/loop-command.ts +2 -2
  84. package/src/commands/tasks-command.ts +3 -3
  85. package/src/coordinator.ts +1 -1
  86. package/src/index.ts +49 -3
  87. package/src/loop-parse.ts +18 -7
  88. package/src/reducer-backed-store.ts +3 -3
  89. package/src/rpc/channels.ts +97 -0
  90. package/src/rpc/cross-extension-rpc.ts +152 -0
  91. package/src/runtime/loop-events.ts +60 -0
  92. package/src/runtime/native-task-rpc.ts +139 -0
  93. package/src/runtime/task-backlog-runtime.ts +14 -0
  94. package/src/runtime/task-mutations.ts +103 -0
  95. package/src/runtime/task-rpc.ts +48 -54
  96. package/src/scheduler.ts +1 -1
  97. package/src/tools/loop-tools.ts +1 -4
  98. package/src/tools/monitor-tools.ts +1 -4
  99. package/src/tools/native-task-tools.ts +31 -52
  100. package/src/tools/tool-result.ts +4 -0
  101. package/src/trigger-system.ts +4 -4
  102. package/vitest.config.ts +7 -7
  103. package/coverage/src/goal-reducer.ts.html +0 -982
  104. package/coverage/src/goal-store.ts.html +0 -742
  105. package/coverage/src/goal-verifier.ts.html +0 -808
  106. package/dist/goal-coordinator.d.ts +0 -22
  107. package/dist/goal-coordinator.js +0 -28
  108. package/dist/goal-reducer.d.ts +0 -98
  109. package/dist/goal-reducer.js +0 -190
  110. package/dist/goal-store.d.ts +0 -22
  111. package/dist/goal-store.js +0 -188
  112. package/dist/goal-types.d.ts +0 -82
  113. package/dist/goal-types.js +0 -1
  114. package/dist/goal-verifier.d.ts +0 -20
  115. package/dist/goal-verifier.js +0 -198
  116. package/docs/architecture/goal-state-schema.md +0 -505
  117. package/src/goal-coordinator.ts +0 -58
  118. package/src/goal-reducer.ts +0 -299
  119. package/src/goal-store.ts +0 -219
  120. package/src/goal-types.ts +0 -104
  121. package/src/goal-verifier.ts +0 -241
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">86.11% </span>
26
+ <span class="strong">80.9% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>93/108</span>
28
+ <span class='fraction'>89/110</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">81.08% </span>
33
+ <span class="strong">76.92% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>30/37</span>
35
+ <span class='fraction'>30/39</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">95.83% </span>
40
+ <span class="strong">92% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>23/24</span>
42
+ <span class='fraction'>23/25</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">90.72% </span>
47
+ <span class="strong">85.71% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>88/97</span>
49
+ <span class='fraction'>84/98</span>
50
50
  </div>
51
51
 
52
52
 
@@ -348,7 +348,15 @@
348
348
  <a name='L283'></a><a href='#L283'>283</a>
349
349
  <a name='L284'></a><a href='#L284'>284</a>
350
350
  <a name='L285'></a><a href='#L285'>285</a>
351
- <a name='L286'></a><a href='#L286'>286</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
352
360
  <span class="cline-any cline-neutral">&nbsp;</span>
353
361
  <span class="cline-any cline-neutral">&nbsp;</span>
354
362
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -359,48 +367,56 @@
359
367
  <span class="cline-any cline-neutral">&nbsp;</span>
360
368
  <span class="cline-any cline-neutral">&nbsp;</span>
361
369
  <span class="cline-any cline-neutral">&nbsp;</span>
362
- <span class="cline-any cline-yes">83x</span>
363
- <span class="cline-any cline-yes">83x</span>
364
370
  <span class="cline-any cline-neutral">&nbsp;</span>
365
371
  <span class="cline-any cline-neutral">&nbsp;</span>
366
- <span class="cline-any cline-yes">83x</span>
372
+ <span class="cline-any cline-yes">85x</span>
373
+ <span class="cline-any cline-yes">85x</span>
367
374
  <span class="cline-any cline-neutral">&nbsp;</span>
368
375
  <span class="cline-any cline-neutral">&nbsp;</span>
369
376
  <span class="cline-any cline-neutral">&nbsp;</span>
370
377
  <span class="cline-any cline-neutral">&nbsp;</span>
378
+ <span class="cline-any cline-yes">85x</span>
371
379
  <span class="cline-any cline-neutral">&nbsp;</span>
372
380
  <span class="cline-any cline-neutral">&nbsp;</span>
381
+ <span class="cline-any cline-yes">85x</span>
373
382
  <span class="cline-any cline-neutral">&nbsp;</span>
374
383
  <span class="cline-any cline-neutral">&nbsp;</span>
375
- <span class="cline-any cline-yes">64x</span>
376
384
  <span class="cline-any cline-neutral">&nbsp;</span>
377
385
  <span class="cline-any cline-neutral">&nbsp;</span>
378
386
  <span class="cline-any cline-neutral">&nbsp;</span>
379
- <span class="cline-any cline-yes">93x</span>
380
387
  <span class="cline-any cline-neutral">&nbsp;</span>
381
388
  <span class="cline-any cline-neutral">&nbsp;</span>
382
- <span class="cline-any cline-yes">67x</span>
383
389
  <span class="cline-any cline-neutral">&nbsp;</span>
384
390
  <span class="cline-any cline-neutral">&nbsp;</span>
391
+ <span class="cline-any cline-yes">66x</span>
385
392
  <span class="cline-any cline-neutral">&nbsp;</span>
386
393
  <span class="cline-any cline-neutral">&nbsp;</span>
387
394
  <span class="cline-any cline-neutral">&nbsp;</span>
388
- <span class="cline-any cline-yes">63x</span>
389
- <span class="cline-any cline-yes">63x</span>
390
- <span class="cline-any cline-yes">63x</span>
391
- <span class="cline-any cline-yes">66x</span>
395
+ <span class="cline-any cline-yes">91x</span>
396
+ <span class="cline-any cline-neutral">&nbsp;</span>
397
+ <span class="cline-any cline-neutral">&nbsp;</span>
392
398
  <span class="cline-any cline-yes">66x</span>
393
- <span class="cline-any cline-yes">6x</span>
394
- <span class="cline-any cline-yes">6x</span>
395
399
  <span class="cline-any cline-neutral">&nbsp;</span>
396
- <span class="cline-any cline-yes">60x</span>
397
400
  <span class="cline-any cline-neutral">&nbsp;</span>
398
401
  <span class="cline-any cline-neutral">&nbsp;</span>
399
402
  <span class="cline-any cline-neutral">&nbsp;</span>
400
- <span class="cline-any cline-yes">63x</span>
401
- <span class="cline-any cline-yes">35x</span>
402
403
  <span class="cline-any cline-neutral">&nbsp;</span>
403
- <span class="cline-any cline-yes">63x</span>
404
+ <span class="cline-any cline-yes">61x</span>
405
+ <span class="cline-any cline-yes">61x</span>
406
+ <span class="cline-any cline-yes">61x</span>
407
+ <span class="cline-any cline-yes">65x</span>
408
+ <span class="cline-any cline-yes">65x</span>
409
+ <span class="cline-any cline-yes">4x</span>
410
+ <span class="cline-any cline-yes">4x</span>
411
+ <span class="cline-any cline-neutral">&nbsp;</span>
412
+ <span class="cline-any cline-yes">61x</span>
413
+ <span class="cline-any cline-neutral">&nbsp;</span>
414
+ <span class="cline-any cline-neutral">&nbsp;</span>
415
+ <span class="cline-any cline-neutral">&nbsp;</span>
416
+ <span class="cline-any cline-yes">61x</span>
417
+ <span class="cline-any cline-yes">33x</span>
418
+ <span class="cline-any cline-neutral">&nbsp;</span>
419
+ <span class="cline-any cline-yes">61x</span>
404
420
  <span class="cline-any cline-neutral">&nbsp;</span>
405
421
  <span class="cline-any cline-neutral">&nbsp;</span>
406
422
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -410,7 +426,7 @@
410
426
  <span class="cline-any cline-neutral">&nbsp;</span>
411
427
  <span class="cline-any cline-neutral">&nbsp;</span>
412
428
  <span class="cline-any cline-yes">29x</span>
413
- <span class="cline-any cline-yes">6x</span>
429
+ <span class="cline-any cline-yes">4x</span>
414
430
  <span class="cline-any cline-neutral">&nbsp;</span>
415
431
  <span class="cline-any cline-neutral">&nbsp;</span>
416
432
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -456,10 +472,10 @@
456
472
  <span class="cline-any cline-neutral">&nbsp;</span>
457
473
  <span class="cline-any cline-neutral">&nbsp;</span>
458
474
  <span class="cline-any cline-yes">30x</span>
459
- <span class="cline-any cline-yes">15x</span>
460
- <span class="cline-any cline-yes">15x</span>
461
- <span class="cline-any cline-yes">32x</span>
462
- <span class="cline-any cline-yes">17x</span>
475
+ <span class="cline-any cline-yes">18x</span>
476
+ <span class="cline-any cline-yes">18x</span>
477
+ <span class="cline-any cline-yes">38x</span>
478
+ <span class="cline-any cline-yes">20x</span>
463
479
  <span class="cline-any cline-neutral">&nbsp;</span>
464
480
  <span class="cline-any cline-neutral">&nbsp;</span>
465
481
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -467,7 +483,7 @@
467
483
  <span class="cline-any cline-neutral">&nbsp;</span>
468
484
  <span class="cline-any cline-neutral">&nbsp;</span>
469
485
  <span class="cline-any cline-neutral">&nbsp;</span>
470
- <span class="cline-any cline-yes">17x</span>
486
+ <span class="cline-any cline-yes">20x</span>
471
487
  <span class="cline-any cline-neutral">&nbsp;</span>
472
488
  <span class="cline-any cline-neutral">&nbsp;</span>
473
489
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -476,10 +492,10 @@
476
492
  <span class="cline-any cline-neutral">&nbsp;</span>
477
493
  <span class="cline-any cline-neutral">&nbsp;</span>
478
494
  <span class="cline-any cline-yes">30x</span>
479
- <span class="cline-any cline-yes">3x</span>
480
- <span class="cline-any cline-yes">3x</span>
481
- <span class="cline-any cline-yes">6x</span>
482
- <span class="cline-any cline-yes">3x</span>
495
+ <span class="cline-any cline-no">&nbsp;</span>
496
+ <span class="cline-any cline-no">&nbsp;</span>
497
+ <span class="cline-any cline-no">&nbsp;</span>
498
+ <span class="cline-any cline-no">&nbsp;</span>
483
499
  <span class="cline-any cline-neutral">&nbsp;</span>
484
500
  <span class="cline-any cline-neutral">&nbsp;</span>
485
501
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -487,7 +503,7 @@
487
503
  <span class="cline-any cline-neutral">&nbsp;</span>
488
504
  <span class="cline-any cline-neutral">&nbsp;</span>
489
505
  <span class="cline-any cline-neutral">&nbsp;</span>
490
- <span class="cline-any cline-yes">3x</span>
506
+ <span class="cline-any cline-no">&nbsp;</span>
491
507
  <span class="cline-any cline-neutral">&nbsp;</span>
492
508
  <span class="cline-any cline-neutral">&nbsp;</span>
493
509
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -496,7 +512,7 @@
496
512
  <span class="cline-any cline-neutral">&nbsp;</span>
497
513
  <span class="cline-any cline-neutral">&nbsp;</span>
498
514
  <span class="cline-any cline-yes">30x</span>
499
- <span class="cline-any cline-yes">15x</span>
515
+ <span class="cline-any cline-yes">16x</span>
500
516
  <span class="cline-any cline-neutral">&nbsp;</span>
501
517
  <span class="cline-any cline-neutral">&nbsp;</span>
502
518
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -507,22 +523,22 @@
507
523
  <span class="cline-any cline-neutral">&nbsp;</span>
508
524
  <span class="cline-any cline-neutral">&nbsp;</span>
509
525
  <span class="cline-any cline-neutral">&nbsp;</span>
510
- <span class="cline-any cline-yes">15x</span>
511
- <span class="cline-any cline-yes">15x</span>
526
+ <span class="cline-any cline-yes">16x</span>
527
+ <span class="cline-any cline-yes">16x</span>
512
528
  <span class="cline-any cline-neutral">&nbsp;</span>
513
529
  <span class="cline-any cline-neutral">&nbsp;</span>
514
530
  <span class="cline-any cline-neutral">&nbsp;</span>
515
531
  <span class="cline-any cline-neutral">&nbsp;</span>
516
- <span class="cline-any cline-yes">15x</span>
517
- <span class="cline-any cline-yes">15x</span>
518
- <span class="cline-any cline-yes">15x</span>
519
- <span class="cline-any cline-yes">15x</span>
520
- <span class="cline-any cline-yes">15x</span>
532
+ <span class="cline-any cline-yes">16x</span>
533
+ <span class="cline-any cline-yes">16x</span>
534
+ <span class="cline-any cline-yes">16x</span>
535
+ <span class="cline-any cline-yes">16x</span>
536
+ <span class="cline-any cline-yes">16x</span>
521
537
  <span class="cline-any cline-neutral">&nbsp;</span>
522
538
  <span class="cline-any cline-neutral">&nbsp;</span>
523
539
  <span class="cline-any cline-yes">30x</span>
524
- <span class="cline-any cline-yes">29x</span>
525
- <span class="cline-any cline-yes">15x</span>
540
+ <span class="cline-any cline-yes">27x</span>
541
+ <span class="cline-any cline-yes">16x</span>
526
542
  <span class="cline-any cline-neutral">&nbsp;</span>
527
543
  <span class="cline-any cline-neutral">&nbsp;</span>
528
544
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -563,12 +579,12 @@
563
579
  <span class="cline-any cline-neutral">&nbsp;</span>
564
580
  <span class="cline-any cline-neutral">&nbsp;</span>
565
581
  <span class="cline-any cline-neutral">&nbsp;</span>
566
- <span class="cline-any cline-yes">30x</span>
567
- <span class="cline-any cline-yes">30x</span>
582
+ <span class="cline-any cline-yes">31x</span>
583
+ <span class="cline-any cline-yes">31x</span>
568
584
  <span class="cline-any cline-neutral">&nbsp;</span>
569
585
  <span class="cline-any cline-neutral">&nbsp;</span>
570
586
  <span class="cline-any cline-neutral">&nbsp;</span>
571
- <span class="cline-any cline-yes">193x</span>
587
+ <span class="cline-any cline-yes">197x</span>
572
588
  <span class="cline-any cline-yes">28x</span>
573
589
  <span class="cline-any cline-yes">2x</span>
574
590
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -577,7 +593,7 @@
577
593
  <span class="cline-any cline-yes">17x</span>
578
594
  <span class="cline-any cline-yes">17x</span>
579
595
  <span class="cline-any cline-neutral">&nbsp;</span>
580
- <span class="cline-any cline-yes">14x</span>
596
+ <span class="cline-any cline-yes">13x</span>
581
597
  <span class="cline-any cline-neutral">&nbsp;</span>
582
598
  <span class="cline-any cline-neutral">&nbsp;</span>
583
599
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -588,25 +604,25 @@
588
604
  <span class="cline-any cline-neutral">&nbsp;</span>
589
605
  <span class="cline-any cline-neutral">&nbsp;</span>
590
606
  <span class="cline-any cline-neutral">&nbsp;</span>
591
- <span class="cline-any cline-yes">14x</span>
592
- <span class="cline-any cline-yes">14x</span>
607
+ <span class="cline-any cline-yes">13x</span>
608
+ <span class="cline-any cline-yes">13x</span>
593
609
  <span class="cline-any cline-neutral">&nbsp;</span>
594
- <span class="cline-any cline-yes">14x</span>
595
- <span class="cline-any cline-yes">14x</span>
610
+ <span class="cline-any cline-yes">13x</span>
611
+ <span class="cline-any cline-yes">13x</span>
596
612
  <span class="cline-any cline-yes">1x</span>
597
613
  <span class="cline-any cline-yes">1x</span>
598
614
  <span class="cline-any cline-neutral">&nbsp;</span>
599
615
  <span class="cline-any cline-neutral">&nbsp;</span>
600
- <span class="cline-any cline-yes">14x</span>
601
- <span class="cline-any cline-yes">14x</span>
602
- <span class="cline-any cline-yes">14x</span>
616
+ <span class="cline-any cline-yes">13x</span>
617
+ <span class="cline-any cline-yes">11x</span>
618
+ <span class="cline-any cline-yes">11x</span>
603
619
  <span class="cline-any cline-neutral">&nbsp;</span>
604
620
  <span class="cline-any cline-neutral">&nbsp;</span>
605
621
  <span class="cline-any cline-neutral">&nbsp;</span>
606
- <span class="cline-any cline-yes">14x</span>
607
- <span class="cline-any cline-yes">14x</span>
608
- <span class="cline-any cline-yes">14x</span>
609
- <span class="cline-any cline-yes">14x</span>
622
+ <span class="cline-any cline-yes">11x</span>
623
+ <span class="cline-any cline-yes">11x</span>
624
+ <span class="cline-any cline-yes">11x</span>
625
+ <span class="cline-any cline-yes">11x</span>
610
626
  <span class="cline-any cline-neutral">&nbsp;</span>
611
627
  <span class="cline-any cline-neutral">&nbsp;</span>
612
628
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -634,7 +650,7 @@
634
650
  <span class="cline-any cline-neutral">&nbsp;</span>
635
651
  <span class="cline-any cline-neutral">&nbsp;</span>
636
652
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">&nbsp;
637
- import { spawn } from "node:child_process";
653
+ import { type ChildProcess, spawn as nodeSpawn, type SpawnOptions } from "node:child_process";
638
654
  import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
639
655
  import {
640
656
  type MonitorReducerEvent,
@@ -643,12 +659,20 @@ import {
643
659
  } from "./monitor-reducer.js";
644
660
  import type { MonitorEntry, MonitorProcess } from "./types.js";
645
661
  &nbsp;
662
+ export type SpawnFn = (command: string, args: string[], options: SpawnOptions) =&gt; ChildProcess;
663
+ &nbsp;
646
664
  export class MonitorManager {
647
665
  private processes = new Map&lt;string, MonitorProcess&gt;();
648
666
  private nextId = 1;
649
667
  private onChange: (() =&gt; void) | undefined;
668
+ private spawnFn: SpawnFn;
650
669
  &nbsp;
651
- constructor(private pi: ExtensionAPI) {}
670
+ constructor(
671
+ private pi: ExtensionAPI,
672
+ spawnFn?: SpawnFn,
673
+ ) {
674
+ this.spawnFn = spawnFn ?? ((cmd, args, opts) =&gt; nodeSpawn(cmd, args, opts));
675
+ }
652
676
  &nbsp;
653
677
  /**
654
678
  * Register a callback fired when a monitor's status changes or it is pruned
@@ -725,7 +749,7 @@ export class MonitorManager {
725
749
  const entry = result.state.monitorsById[id]!;
726
750
  &nbsp;
727
751
  const abortController = new AbortController();
728
- const child = spawn("sh", ["-c", command], {
752
+ const child = this.spawnFn("sh", ["-c", command], {
729
753
  stdio: ["ignore", "pipe", "pipe"],
730
754
  signal: abortController.signal,
731
755
  env: { ...process.env },
@@ -760,11 +784,11 @@ export class MonitorManager {
760
784
  }
761
785
  });
762
786
  &nbsp;
763
- child.stderr?.on("data", (data: Buffer) =&gt; {
764
- const lines = data.toString().split("\n");
765
- for (const line of lines) {
766
- if (line.length === 0) continue;
767
- this.applyReducerEvent({
787
+ child.stderr?.on(<span class="fstat-no" title="function not covered" >"data", (d</span>ata: Buffer) =&gt; {
788
+ const lines = <span class="cstat-no" title="statement not covered" >data.toString().split("\n");</span>
789
+ <span class="cstat-no" title="statement not covered" > for (const line of lines) {</span>
790
+ <span class="cstat-no" title="statement not covered" > if (line.length === 0) <span class="cstat-no" title="statement not covered" >continue;</span></span>
791
+ <span class="cstat-no" title="statement not covered" > this.applyReducerEvent({</span>
768
792
  type: "MONITOR_OUTPUT",
769
793
  at: Date.now(),
770
794
  source: "monitor",
@@ -772,7 +796,7 @@ export class MonitorManager {
772
796
  entityId: id,
773
797
  payload: { id, line },
774
798
  });
775
- this.pi.events.emit("monitor:output", {
799
+ <span class="cstat-no" title="statement not covered" > this.pi.events.emit("monitor:output", {</span>
776
800
  monitorId: id,
777
801
  line,
778
802
  timestamp: Date.now(),
@@ -925,7 +949,7 @@ export class MonitorManager {
925
949
  <div class='footer quiet pad2 space-top1 center small'>
926
950
  Code coverage generated by
927
951
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
928
- at 2026-06-23T21:49:18.784Z
952
+ at 2026-07-02T19:31:50.067Z
929
953
  </div>
930
954
  <script src="../prettify.js"></script>
931
955
  <script>
@@ -320,14 +320,14 @@
320
320
  <span class="cline-any cline-neutral">&nbsp;</span>
321
321
  <span class="cline-any cline-neutral">&nbsp;</span>
322
322
  <span class="cline-any cline-neutral">&nbsp;</span>
323
- <span class="cline-any cline-yes">101x</span>
323
+ <span class="cline-any cline-yes">99x</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
328
  <span class="cline-any cline-neutral">&nbsp;</span>
329
329
  <span class="cline-any cline-neutral">&nbsp;</span>
330
- <span class="cline-any cline-yes">102x</span>
330
+ <span class="cline-any cline-yes">100x</span>
331
331
  <span class="cline-any cline-yes">31x</span>
332
332
  <span class="cline-any cline-yes">31x</span>
333
333
  <span class="cline-any cline-yes">31x</span>
@@ -347,14 +347,14 @@
347
347
  <span class="cline-any cline-neutral">&nbsp;</span>
348
348
  <span class="cline-any cline-neutral">&nbsp;</span>
349
349
  <span class="cline-any cline-neutral">&nbsp;</span>
350
- <span class="cline-any cline-yes">71x</span>
351
- <span class="cline-any cline-yes">71x</span>
352
- <span class="cline-any cline-yes">71x</span>
350
+ <span class="cline-any cline-yes">69x</span>
351
+ <span class="cline-any cline-yes">69x</span>
352
+ <span class="cline-any cline-yes">69x</span>
353
353
  <span class="cline-any cline-neutral">&nbsp;</span>
354
- <span class="cline-any cline-yes">70x</span>
355
- <span class="cline-any cline-yes">7x</span>
356
- <span class="cline-any cline-yes">7x</span>
357
- <span class="cline-any cline-yes">7x</span>
354
+ <span class="cline-any cline-yes">68x</span>
355
+ <span class="cline-any cline-yes">5x</span>
356
+ <span class="cline-any cline-yes">5x</span>
357
+ <span class="cline-any cline-yes">5x</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>
@@ -369,9 +369,9 @@
369
369
  <span class="cline-any cline-neutral">&nbsp;</span>
370
370
  <span class="cline-any cline-neutral">&nbsp;</span>
371
371
  <span class="cline-any cline-yes">63x</span>
372
- <span class="cline-any cline-yes">14x</span>
373
- <span class="cline-any cline-yes">14x</span>
374
- <span class="cline-any cline-yes">14x</span>
372
+ <span class="cline-any cline-yes">15x</span>
373
+ <span class="cline-any cline-yes">15x</span>
374
+ <span class="cline-any cline-yes">15x</span>
375
375
  <span class="cline-any cline-neutral">&nbsp;</span>
376
376
  <span class="cline-any cline-neutral">&nbsp;</span>
377
377
  <span class="cline-any cline-yes">63x</span>
@@ -381,8 +381,8 @@
381
381
  <span class="cline-any cline-neutral">&nbsp;</span>
382
382
  <span class="cline-any cline-neutral">&nbsp;</span>
383
383
  <span class="cline-any cline-yes">63x</span>
384
- <span class="cline-any cline-yes">15x</span>
385
- <span class="cline-any cline-yes">15x</span>
384
+ <span class="cline-any cline-yes">14x</span>
385
+ <span class="cline-any cline-yes">14x</span>
386
386
  <span class="cline-any cline-neutral">&nbsp;</span>
387
387
  <span class="cline-any cline-neutral">&nbsp;</span>
388
388
  <span class="cline-any cline-yes">63x</span>
@@ -568,7 +568,7 @@ export function reduceMonitorState(state: MonitorReducerState, event: MonitorRed
568
568
  <div class='footer quiet pad2 space-top1 center small'>
569
569
  Code coverage generated by
570
570
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
571
- at 2026-06-23T21:49:18.784Z
571
+ at 2026-07-02T19:31:50.067Z
572
572
  </div>
573
573
  <script src="../prettify.js"></script>
574
574
  <script>
@@ -300,7 +300,7 @@
300
300
  <span class="cline-any cline-neutral">&nbsp;</span>
301
301
  <span class="cline-any cline-neutral">&nbsp;</span>
302
302
  <span class="cline-any cline-neutral">&nbsp;</span>
303
- <span class="cline-any cline-yes">88x</span>
303
+ <span class="cline-any cline-yes">87x</span>
304
304
  <span class="cline-any cline-neutral">&nbsp;</span>
305
305
  <span class="cline-any cline-neutral">&nbsp;</span>
306
306
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -311,10 +311,10 @@
311
311
  <span class="cline-any cline-neutral">&nbsp;</span>
312
312
  <span class="cline-any cline-neutral">&nbsp;</span>
313
313
  <span class="cline-any cline-neutral">&nbsp;</span>
314
- <span class="cline-any cline-yes">273x</span>
315
- <span class="cline-any cline-yes">49x</span>
316
- <span class="cline-any cline-yes">49x</span>
317
- <span class="cline-any cline-yes">49x</span>
314
+ <span class="cline-any cline-yes">272x</span>
315
+ <span class="cline-any cline-yes">48x</span>
316
+ <span class="cline-any cline-yes">48x</span>
317
+ <span class="cline-any cline-yes">48x</span>
318
318
  <span class="cline-any cline-neutral">&nbsp;</span>
319
319
  <span class="cline-any cline-neutral">&nbsp;</span>
320
320
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -535,7 +535,7 @@ export function reduceNotificationState(
535
535
  <div class='footer quiet pad2 space-top1 center small'>
536
536
  Code coverage generated by
537
537
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
538
- at 2026-06-23T21:49:18.784Z
538
+ at 2026-07-02T19:31:50.067Z
539
539
  </div>
540
540
  <script src="../prettify.js"></script>
541
541
  <script>