@trevonistrevon/pi-loop 0.5.8 → 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 (127) hide show
  1. package/.release-please-manifest.json +3 -0
  2. package/AGENTS.md +52 -12
  3. package/CHANGELOG.md +59 -0
  4. package/CONTRIBUTING.md +13 -3
  5. package/Dockerfile +17 -0
  6. package/README.md +47 -0
  7. package/coverage/coverage-final.json +35 -31
  8. package/coverage/index.html +64 -49
  9. package/coverage/src/api.ts.html +193 -0
  10. package/coverage/src/commands/index.html +32 -32
  11. package/coverage/src/commands/loop-command.ts.html +170 -170
  12. package/coverage/src/commands/tasks-command.ts.html +135 -135
  13. package/coverage/src/coordinator.ts.html +26 -26
  14. package/coverage/src/index.html +61 -106
  15. package/coverage/src/index.ts.html +280 -94
  16. package/coverage/src/loop-parse.ts.html +90 -57
  17. package/coverage/src/loop-reducer.ts.html +25 -25
  18. package/coverage/src/monitor-completion-coordinator.ts.html +1 -1
  19. package/coverage/src/monitor-manager.ts.html +95 -71
  20. package/coverage/src/monitor-reducer.ts.html +15 -15
  21. package/coverage/src/notification-reducer.ts.html +7 -7
  22. package/coverage/src/reducer-backed-store.ts.html +57 -57
  23. package/coverage/src/rpc/channels.ts.html +376 -0
  24. package/coverage/src/rpc/cross-extension-rpc.ts.html +541 -0
  25. package/coverage/src/rpc/index.html +131 -0
  26. package/coverage/src/runtime/index.html +89 -29
  27. package/coverage/src/{goal-coordinator.ts.html → runtime/loop-events.ts.html} +79 -73
  28. package/coverage/src/runtime/monitor-ondone-runtime.ts.html +5 -5
  29. package/coverage/src/runtime/native-task-rpc.ts.html +502 -0
  30. package/coverage/src/runtime/notification-runtime.ts.html +14 -14
  31. package/coverage/src/runtime/scope.ts.html +17 -17
  32. package/coverage/src/runtime/session-runtime.ts.html +40 -40
  33. package/coverage/src/runtime/task-backlog-runtime.ts.html +66 -24
  34. package/coverage/src/runtime/task-events.ts.html +208 -0
  35. package/coverage/src/runtime/task-mutations.ts.html +394 -0
  36. package/coverage/src/runtime/task-rpc.ts.html +106 -118
  37. package/coverage/src/scheduler.ts.html +12 -12
  38. package/coverage/src/store.ts.html +20 -20
  39. package/coverage/src/task-backlog-coordinator.ts.html +8 -8
  40. package/coverage/src/task-reducer.ts.html +42 -42
  41. package/coverage/src/task-store.ts.html +49 -49
  42. package/coverage/src/tools/index.html +39 -24
  43. package/coverage/src/tools/loop-tools.ts.html +12 -21
  44. package/coverage/src/tools/monitor-tools.ts.html +12 -21
  45. package/coverage/src/tools/native-task-tools.ts.html +52 -94
  46. package/coverage/src/tools/tool-result.ts.html +97 -0
  47. package/coverage/src/trigger-system.ts.html +12 -12
  48. package/coverage/src/ui/index.html +1 -1
  49. package/coverage/src/ui/widget.ts.html +23 -23
  50. package/dist/api.d.ts +11 -0
  51. package/dist/api.js +10 -0
  52. package/dist/commands/loop-command.js +2 -2
  53. package/dist/commands/tasks-command.js +3 -3
  54. package/dist/coordinator.d.ts +1 -1
  55. package/dist/index.js +80 -20
  56. package/dist/loop-parse.js +14 -5
  57. package/dist/monitor-manager.d.ts +4 -1
  58. package/dist/monitor-manager.js +5 -3
  59. package/dist/reducer-backed-store.d.ts +1 -1
  60. package/dist/reducer-backed-store.js +1 -1
  61. package/dist/rpc/channels.d.ts +73 -0
  62. package/dist/rpc/channels.js +30 -0
  63. package/dist/rpc/cross-extension-rpc.d.ts +59 -0
  64. package/dist/rpc/cross-extension-rpc.js +117 -0
  65. package/dist/runtime/loop-events.d.ts +26 -0
  66. package/dist/runtime/loop-events.js +26 -0
  67. package/dist/runtime/native-task-rpc.d.ts +22 -0
  68. package/dist/runtime/native-task-rpc.js +50 -0
  69. package/dist/runtime/task-backlog-runtime.d.ts +3 -0
  70. package/dist/runtime/task-backlog-runtime.js +4 -1
  71. package/dist/runtime/task-mutations.d.ts +39 -0
  72. package/dist/runtime/task-mutations.js +68 -0
  73. package/dist/runtime/task-rpc.d.ts +4 -0
  74. package/dist/runtime/task-rpc.js +40 -58
  75. package/dist/scheduler.js +1 -1
  76. package/dist/tools/loop-tools.js +1 -3
  77. package/dist/tools/monitor-tools.js +1 -3
  78. package/dist/tools/native-task-tools.d.ts +2 -6
  79. package/dist/tools/native-task-tools.js +25 -55
  80. package/dist/tools/tool-result.d.ts +8 -0
  81. package/dist/tools/tool-result.js +4 -0
  82. package/docker-compose.yml +12 -0
  83. package/docs/architecture/state-machine-migration.md +0 -44
  84. package/docs/architecture/state-machine-reducer-event-model.md +2 -3
  85. package/package.json +6 -1
  86. package/release-please-config.json +9 -0
  87. package/src/api.ts +36 -0
  88. package/src/commands/loop-command.ts +2 -2
  89. package/src/commands/tasks-command.ts +3 -3
  90. package/src/coordinator.ts +1 -1
  91. package/src/index.ts +84 -22
  92. package/src/loop-parse.ts +18 -7
  93. package/src/monitor-manager.ts +11 -3
  94. package/src/reducer-backed-store.ts +3 -3
  95. package/src/rpc/channels.ts +97 -0
  96. package/src/rpc/cross-extension-rpc.ts +152 -0
  97. package/src/runtime/loop-events.ts +60 -0
  98. package/src/runtime/native-task-rpc.ts +139 -0
  99. package/src/runtime/task-backlog-runtime.ts +14 -0
  100. package/src/runtime/task-mutations.ts +103 -0
  101. package/src/runtime/task-rpc.ts +48 -54
  102. package/src/scheduler.ts +1 -1
  103. package/src/tools/loop-tools.ts +1 -4
  104. package/src/tools/monitor-tools.ts +1 -4
  105. package/src/tools/native-task-tools.ts +31 -52
  106. package/src/tools/tool-result.ts +4 -0
  107. package/src/trigger-system.ts +4 -4
  108. package/vitest.config.ts +11 -7
  109. package/coverage/src/goal-reducer.ts.html +0 -982
  110. package/coverage/src/goal-store.ts.html +0 -742
  111. package/coverage/src/goal-verifier.ts.html +0 -808
  112. package/dist/goal-coordinator.d.ts +0 -22
  113. package/dist/goal-coordinator.js +0 -28
  114. package/dist/goal-reducer.d.ts +0 -98
  115. package/dist/goal-reducer.js +0 -190
  116. package/dist/goal-store.d.ts +0 -22
  117. package/dist/goal-store.js +0 -188
  118. package/dist/goal-types.d.ts +0 -82
  119. package/dist/goal-types.js +0 -1
  120. package/dist/goal-verifier.d.ts +0 -20
  121. package/dist/goal-verifier.js +0 -198
  122. package/docs/architecture/goal-state-schema.md +0 -505
  123. package/src/goal-coordinator.ts +0 -58
  124. package/src/goal-reducer.ts +0 -299
  125. package/src/goal-store.ts +0 -219
  126. package/src/goal-types.ts +0 -104
  127. 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">94.89% </span>
26
+ <span class="strong">94.4% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>130/137</span>
28
+ <span class='fraction'>152/161</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">88.63% </span>
33
+ <span class="strong">85.71% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>39/44</span>
35
+ <span class='fraction'>48/56</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">96.55% </span>
40
+ <span class="strong">98.55% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>56/58</span>
42
+ <span class='fraction'>68/69</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">96.72% </span>
47
+ <span class="strong">96.52% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>118/122</span>
49
+ <span class='fraction'>139/144</span>
50
50
  </div>
51
51
 
52
52
 
@@ -389,7 +389,70 @@
389
389
  <a name='L324'></a><a href='#L324'>324</a>
390
390
  <a name='L325'></a><a href='#L325'>325</a>
391
391
  <a name='L326'></a><a href='#L326'>326</a>
392
- <a name='L327'></a><a href='#L327'>327</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
455
+ <span class="cline-any cline-neutral">&nbsp;</span>
393
456
  <span class="cline-any cline-neutral">&nbsp;</span>
394
457
  <span class="cline-any cline-neutral">&nbsp;</span>
395
458
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -431,52 +494,68 @@
431
494
  <span class="cline-any cline-neutral">&nbsp;</span>
432
495
  <span class="cline-any cline-yes">3x</span>
433
496
  <span class="cline-any cline-neutral">&nbsp;</span>
434
- <span class="cline-any cline-yes">83x</span>
497
+ <span class="cline-any cline-yes">86x</span>
435
498
  <span class="cline-any cline-neutral">&nbsp;</span>
436
499
  <span class="cline-any cline-neutral">&nbsp;</span>
437
500
  <span class="cline-any cline-neutral">&nbsp;</span>
438
- <span class="cline-any cline-yes">61x</span>
439
- <span class="cline-any cline-yes">61x</span>
440
- <span class="cline-any cline-yes">61x</span>
501
+ <span class="cline-any cline-yes">1x</span>
441
502
  <span class="cline-any cline-neutral">&nbsp;</span>
442
- <span class="cline-any cline-yes">152x</span>
443
503
  <span class="cline-any cline-neutral">&nbsp;</span>
444
- <span class="cline-any cline-yes">61x</span>
445
- <span class="cline-any cline-yes">61x</span>
446
504
  <span class="cline-any cline-neutral">&nbsp;</span>
505
+ <span class="cline-any cline-yes">65x</span>
506
+ <span class="cline-any cline-yes">65x</span>
507
+ <span class="cline-any cline-yes">65x</span>
447
508
  <span class="cline-any cline-neutral">&nbsp;</span>
448
- <span class="cline-any cline-yes">61x</span>
509
+ <span class="cline-any cline-yes">160x</span>
449
510
  <span class="cline-any cline-neutral">&nbsp;</span>
511
+ <span class="cline-any cline-yes">65x</span>
512
+ <span class="cline-any cline-yes">65x</span>
450
513
  <span class="cline-any cline-neutral">&nbsp;</span>
451
- <span class="cline-any cline-yes">61x</span>
452
- <span class="cline-any cline-yes">61x</span>
453
- <span class="cline-any cline-yes">156x</span>
454
- <span class="cline-any cline-yes">234x</span>
455
- <span class="cline-any cline-yes">171x</span>
456
- <span class="cline-any cline-yes">123x</span>
457
- <span class="cline-any cline-yes">123x</span>
458
514
  <span class="cline-any cline-neutral">&nbsp;</span>
515
+ <span class="cline-any cline-yes">65x</span>
459
516
  <span class="cline-any cline-neutral">&nbsp;</span>
460
517
  <span class="cline-any cline-neutral">&nbsp;</span>
518
+ <span class="cline-any cline-yes">65x</span>
519
+ <span class="cline-any cline-yes">65x</span>
461
520
  <span class="cline-any cline-neutral">&nbsp;</span>
462
- <span class="cline-any cline-yes">156x</span>
463
521
  <span class="cline-any cline-neutral">&nbsp;</span>
522
+ <span class="cline-any cline-yes">160x</span>
523
+ <span class="cline-any cline-yes">237x</span>
524
+ <span class="cline-any cline-yes">173x</span>
525
+ <span class="cline-any cline-yes">126x</span>
526
+ <span class="cline-any cline-yes">126x</span>
464
527
  <span class="cline-any cline-neutral">&nbsp;</span>
465
- <span class="cline-any cline-yes">61x</span>
466
- <span class="cline-any cline-yes">61x</span>
467
528
  <span class="cline-any cline-neutral">&nbsp;</span>
468
529
  <span class="cline-any cline-neutral">&nbsp;</span>
469
- <span class="cline-any cline-yes">61x</span>
470
530
  <span class="cline-any cline-neutral">&nbsp;</span>
471
- <span class="cline-any cline-yes">61x</span>
531
+ <span class="cline-any cline-yes">160x</span>
472
532
  <span class="cline-any cline-neutral">&nbsp;</span>
473
- <span class="cline-any cline-yes">61x</span>
474
533
  <span class="cline-any cline-neutral">&nbsp;</span>
475
- <span class="cline-any cline-yes">39x</span>
534
+ <span class="cline-any cline-yes">65x</span>
535
+ <span class="cline-any cline-yes">65x</span>
476
536
  <span class="cline-any cline-neutral">&nbsp;</span>
477
- <span class="cline-any cline-yes">2x</span>
478
537
  <span class="cline-any cline-neutral">&nbsp;</span>
479
- <span class="cline-any cline-yes">36x</span>
538
+ <span class="cline-any cline-yes">65x</span>
539
+ <span class="cline-any cline-yes">65x</span>
540
+ <span class="cline-any cline-neutral">&nbsp;</span>
541
+ <span class="cline-any cline-yes">65x</span>
542
+ <span class="cline-any cline-neutral">&nbsp;</span>
543
+ <span class="cline-any cline-neutral">&nbsp;</span>
544
+ <span class="cline-any cline-neutral">&nbsp;</span>
545
+ <span class="cline-any cline-yes">49x</span>
546
+ <span class="cline-any cline-yes">49x</span>
547
+ <span class="cline-any cline-yes">48x</span>
548
+ <span class="cline-any cline-neutral">&nbsp;</span>
549
+ <span class="cline-any cline-yes">49x</span>
550
+ <span class="cline-any cline-neutral">&nbsp;</span>
551
+ <span class="cline-any cline-neutral">&nbsp;</span>
552
+ <span class="cline-any cline-yes">65x</span>
553
+ <span class="cline-any cline-neutral">&nbsp;</span>
554
+ <span class="cline-any cline-yes">41x</span>
555
+ <span class="cline-any cline-neutral">&nbsp;</span>
556
+ <span class="cline-any cline-yes">3x</span>
557
+ <span class="cline-any cline-neutral">&nbsp;</span>
558
+ <span class="cline-any cline-yes">38x</span>
480
559
  <span class="cline-any cline-neutral">&nbsp;</span>
481
560
  <span class="cline-any cline-yes">1x</span>
482
561
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -485,16 +564,41 @@
485
564
  <span class="cline-any cline-yes">3x</span>
486
565
  <span class="cline-any cline-neutral">&nbsp;</span>
487
566
  <span class="cline-any cline-neutral">&nbsp;</span>
567
+ <span class="cline-any cline-yes">66x</span>
568
+ <span class="cline-any cline-neutral">&nbsp;</span>
569
+ <span class="cline-any cline-neutral">&nbsp;</span>
570
+ <span class="cline-any cline-yes">52x</span>
571
+ <span class="cline-any cline-neutral">&nbsp;</span>
572
+ <span class="cline-any cline-neutral">&nbsp;</span>
573
+ <span class="cline-any cline-neutral">&nbsp;</span>
574
+ <span class="cline-any cline-neutral">&nbsp;</span>
488
575
  <span class="cline-any cline-neutral">&nbsp;</span>
489
576
  <span class="cline-any cline-neutral">&nbsp;</span>
490
- <span class="cline-any cline-yes">61x</span>
491
- <span class="cline-any cline-yes">61x</span>
492
577
  <span class="cline-any cline-neutral">&nbsp;</span>
493
- <span class="cline-any cline-yes">61x</span>
494
- <span class="cline-any cline-yes">61x</span>
495
- <span class="cline-any cline-yes">61x</span>
496
578
  <span class="cline-any cline-neutral">&nbsp;</span>
497
- <span class="cline-any cline-yes">61x</span>
579
+ <span class="cline-any cline-neutral">&nbsp;</span>
580
+ <span class="cline-any cline-neutral">&nbsp;</span>
581
+ <span class="cline-any cline-yes">65x</span>
582
+ <span class="cline-any cline-neutral">&nbsp;</span>
583
+ <span class="cline-any cline-neutral">&nbsp;</span>
584
+ <span class="cline-any cline-yes">66x</span>
585
+ <span class="cline-any cline-yes">2x</span>
586
+ <span class="cline-any cline-neutral">&nbsp;</span>
587
+ <span class="cline-any cline-yes">1x</span>
588
+ <span class="cline-any cline-neutral">&nbsp;</span>
589
+ <span class="cline-any cline-yes">1x</span>
590
+ <span class="cline-any cline-neutral">&nbsp;</span>
591
+ <span class="cline-any cline-neutral">&nbsp;</span>
592
+ <span class="cline-any cline-neutral">&nbsp;</span>
593
+ <span class="cline-any cline-neutral">&nbsp;</span>
594
+ <span class="cline-any cline-yes">65x</span>
595
+ <span class="cline-any cline-yes">65x</span>
596
+ <span class="cline-any cline-neutral">&nbsp;</span>
597
+ <span class="cline-any cline-yes">65x</span>
598
+ <span class="cline-any cline-yes">65x</span>
599
+ <span class="cline-any cline-yes">65x</span>
600
+ <span class="cline-any cline-neutral">&nbsp;</span>
601
+ <span class="cline-any cline-yes">65x</span>
498
602
  <span class="cline-any cline-neutral">&nbsp;</span>
499
603
  <span class="cline-any cline-yes">11x</span>
500
604
  <span class="cline-any cline-yes">2x</span>
@@ -502,7 +606,7 @@
502
606
  <span class="cline-any cline-neutral">&nbsp;</span>
503
607
  <span class="cline-any cline-neutral">&nbsp;</span>
504
608
  <span class="cline-any cline-neutral">&nbsp;</span>
505
- <span class="cline-any cline-yes">61x</span>
609
+ <span class="cline-any cline-yes">65x</span>
506
610
  <span class="cline-any cline-neutral">&nbsp;</span>
507
611
  <span class="cline-any cline-yes">6x</span>
508
612
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -542,8 +646,8 @@
542
646
  <span class="cline-any cline-yes">9x</span>
543
647
  <span class="cline-any cline-neutral">&nbsp;</span>
544
648
  <span class="cline-any cline-neutral">&nbsp;</span>
545
- <span class="cline-any cline-yes">61x</span>
546
- <span class="cline-any cline-yes">41x</span>
649
+ <span class="cline-any cline-yes">65x</span>
650
+ <span class="cline-any cline-yes">42x</span>
547
651
  <span class="cline-any cline-yes">6x</span>
548
652
  <span class="cline-any cline-neutral">&nbsp;</span>
549
653
  <span class="cline-any cline-yes">3x</span>
@@ -561,12 +665,18 @@
561
665
  <span class="cline-any cline-yes">6x</span>
562
666
  <span class="cline-any cline-neutral">&nbsp;</span>
563
667
  <span class="cline-any cline-neutral">&nbsp;</span>
668
+ <span class="cline-any cline-yes">3x</span>
669
+ <span class="cline-any cline-neutral">&nbsp;</span>
670
+ <span class="cline-any cline-neutral">&nbsp;</span>
671
+ <span class="cline-any cline-yes">3x</span>
672
+ <span class="cline-any cline-neutral">&nbsp;</span>
673
+ <span class="cline-any cline-neutral">&nbsp;</span>
564
674
  <span class="cline-any cline-neutral">&nbsp;</span>
565
675
  <span class="cline-any cline-neutral">&nbsp;</span>
566
- <span class="cline-any cline-yes">61x</span>
567
- <span class="cline-any cline-yes">61x</span>
568
- <span class="cline-any cline-yes">61x</span>
569
- <span class="cline-any cline-yes">61x</span>
676
+ <span class="cline-any cline-yes">65x</span>
677
+ <span class="cline-any cline-yes">65x</span>
678
+ <span class="cline-any cline-yes">65x</span>
679
+ <span class="cline-any cline-yes">65x</span>
570
680
  <span class="cline-any cline-neutral">&nbsp;</span>
571
681
  <span class="cline-any cline-neutral">&nbsp;</span>
572
682
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -602,28 +712,28 @@
602
712
  <span class="cline-any cline-neutral">&nbsp;</span>
603
713
  <span class="cline-any cline-neutral">&nbsp;</span>
604
714
  <span class="cline-any cline-neutral">&nbsp;</span>
605
- <span class="cline-any cline-yes">61x</span>
715
+ <span class="cline-any cline-yes">65x</span>
606
716
  <span class="cline-any cline-neutral">&nbsp;</span>
607
- <span class="cline-any cline-yes">51x</span>
608
- <span class="cline-any cline-yes">46x</span>
717
+ <span class="cline-any cline-yes">52x</span>
718
+ <span class="cline-any cline-yes">47x</span>
609
719
  <span class="cline-any cline-neutral">&nbsp;</span>
610
- <span class="cline-any cline-yes">46x</span>
611
- <span class="cline-any cline-yes">46x</span>
612
- <span class="cline-any cline-yes">46x</span>
613
- <span class="cline-any cline-yes">46x</span>
614
- <span class="cline-any cline-yes">46x</span>
720
+ <span class="cline-any cline-yes">47x</span>
721
+ <span class="cline-any cline-yes">47x</span>
722
+ <span class="cline-any cline-yes">47x</span>
723
+ <span class="cline-any cline-yes">47x</span>
724
+ <span class="cline-any cline-yes">47x</span>
615
725
  <span class="cline-any cline-neutral">&nbsp;</span>
616
726
  <span class="cline-any cline-neutral">&nbsp;</span>
617
727
  <span class="cline-any cline-yes">1x</span>
618
728
  <span class="cline-any cline-neutral">&nbsp;</span>
619
- <span class="cline-any cline-yes">169x</span>
620
- <span class="cline-any cline-yes">174x</span>
729
+ <span class="cline-any cline-yes">170x</span>
730
+ <span class="cline-any cline-yes">175x</span>
621
731
  <span class="cline-any cline-yes">3x</span>
622
732
  <span class="cline-any cline-neutral">&nbsp;</span>
623
- <span class="cline-any cline-yes">100x</span>
733
+ <span class="cline-any cline-yes">101x</span>
624
734
  <span class="cline-any cline-neutral">&nbsp;</span>
625
735
  <span class="cline-any cline-neutral">&nbsp;</span>
626
- <span class="cline-any cline-yes">48x</span>
736
+ <span class="cline-any cline-yes">49x</span>
627
737
  <span class="cline-any cline-neutral">&nbsp;</span>
628
738
  <span class="cline-any cline-neutral">&nbsp;</span>
629
739
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -635,7 +745,7 @@
635
745
  <span class="cline-any cline-neutral">&nbsp;</span>
636
746
  <span class="cline-any cline-neutral">&nbsp;</span>
637
747
  <span class="cline-any cline-neutral">&nbsp;</span>
638
- <span class="cline-any cline-yes">61x</span>
748
+ <span class="cline-any cline-yes">65x</span>
639
749
  <span class="cline-any cline-yes">33x</span>
640
750
  <span class="cline-any cline-neutral">&nbsp;</span>
641
751
  <span class="cline-any cline-yes">33x</span>
@@ -650,7 +760,7 @@
650
760
  <span class="cline-any cline-yes">32x</span>
651
761
  <span class="cline-any cline-neutral">&nbsp;</span>
652
762
  <span class="cline-any cline-neutral">&nbsp;</span>
653
- <span class="cline-any cline-yes">61x</span>
763
+ <span class="cline-any cline-yes">65x</span>
654
764
  <span class="cline-any cline-neutral">&nbsp;</span>
655
765
  <span class="cline-any cline-yes">38x</span>
656
766
  <span class="cline-any cline-yes">21x</span>
@@ -667,7 +777,7 @@
667
777
  <span class="cline-any cline-yes">7x</span>
668
778
  <span class="cline-any cline-neutral">&nbsp;</span>
669
779
  <span class="cline-any cline-neutral">&nbsp;</span>
670
- <span class="cline-any cline-yes">61x</span>
780
+ <span class="cline-any cline-yes">65x</span>
671
781
  <span class="cline-any cline-neutral">&nbsp;</span>
672
782
  <span class="cline-any cline-yes">7x</span>
673
783
  <span class="cline-any cline-yes">29x</span>
@@ -677,7 +787,7 @@
677
787
  <span class="cline-any cline-neutral">&nbsp;</span>
678
788
  <span class="cline-any cline-neutral">&nbsp;</span>
679
789
  <span class="cline-any cline-neutral">&nbsp;</span>
680
- <span class="cline-any cline-yes">61x</span>
790
+ <span class="cline-any cline-yes">65x</span>
681
791
  <span class="cline-any cline-neutral">&nbsp;</span>
682
792
  <span class="cline-any cline-yes">1x</span>
683
793
  <span class="cline-any cline-yes">1x</span>
@@ -688,13 +798,15 @@
688
798
  <span class="cline-any cline-neutral">&nbsp;</span>
689
799
  <span class="cline-any cline-neutral">&nbsp;</span>
690
800
  <span class="cline-any cline-neutral">&nbsp;</span>
691
- <span class="cline-any cline-yes">61x</span>
692
- <span class="cline-any cline-yes">46x</span>
693
- <span class="cline-any cline-yes">45x</span>
694
- <span class="cline-any cline-yes">45x</span>
695
- <span class="cline-any cline-yes">45x</span>
696
801
  <span class="cline-any cline-neutral">&nbsp;</span>
697
- <span class="cline-any cline-yes">45x</span>
802
+ <span class="cline-any cline-neutral">&nbsp;</span>
803
+ <span class="cline-any cline-yes">65x</span>
804
+ <span class="cline-any cline-yes">49x</span>
805
+ <span class="cline-any cline-yes">48x</span>
806
+ <span class="cline-any cline-yes">48x</span>
807
+ <span class="cline-any cline-neutral">&nbsp;</span>
808
+ <span class="cline-any cline-yes">48x</span>
809
+ <span class="cline-any cline-yes">48x</span>
698
810
  <span class="cline-any cline-neutral">&nbsp;</span>
699
811
  <span class="cline-any cline-yes">2x</span>
700
812
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -703,16 +815,28 @@
703
815
  <span class="cline-any cline-neutral">&nbsp;</span>
704
816
  <span class="cline-any cline-neutral">&nbsp;</span>
705
817
  <span class="cline-any cline-neutral">&nbsp;</span>
706
- <span class="cline-any cline-yes">45x</span>
818
+ <span class="cline-any cline-yes">48x</span>
707
819
  <span class="cline-any cline-neutral">&nbsp;</span>
708
820
  <span class="cline-any cline-neutral">&nbsp;</span>
709
821
  <span class="cline-any cline-neutral">&nbsp;</span>
710
822
  <span class="cline-any cline-neutral">&nbsp;</span>
711
- <span class="cline-any cline-yes">66x</span>
823
+ <span class="cline-any cline-yes">68x</span>
712
824
  <span class="cline-any cline-neutral">&nbsp;</span>
713
825
  <span class="cline-any cline-neutral">&nbsp;</span>
714
826
  <span class="cline-any cline-neutral">&nbsp;</span>
715
- <span class="cline-any cline-yes">45x</span>
827
+ <span class="cline-any cline-yes">1x</span>
828
+ <span class="cline-any cline-yes">1x</span>
829
+ <span class="cline-any cline-yes">1x</span>
830
+ <span class="cline-any cline-neutral">&nbsp;</span>
831
+ <span class="cline-any cline-no">&nbsp;</span>
832
+ <span class="cline-any cline-neutral">&nbsp;</span>
833
+ <span class="cline-any cline-neutral">&nbsp;</span>
834
+ <span class="cline-any cline-yes">47x</span>
835
+ <span class="cline-any cline-yes">47x</span>
836
+ <span class="cline-any cline-neutral">&nbsp;</span>
837
+ <span class="cline-any cline-neutral">&nbsp;</span>
838
+ <span class="cline-any cline-yes">65x</span>
839
+ <span class="cline-any cline-yes">3x</span>
716
840
  <span class="cline-any cline-neutral">&nbsp;</span>
717
841
  <span class="cline-any cline-neutral">&nbsp;</span>
718
842
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
@@ -737,6 +861,7 @@ import { registerTasksCommand } from "./commands/tasks-command.js";
737
861
  import { atMaxFires } from "./loop-reducer.js";
738
862
  import { MonitorManager } from "./monitor-manager.js";
739
863
  import { createMonitorOnDoneRuntime } from "./runtime/monitor-ondone-runtime.js";
864
+ import { registerNativeTaskRpc } from "./runtime/native-task-rpc.js";
740
865
  import {
741
866
  createNotificationRuntime,
742
867
  type LoopFireEvent,
@@ -760,6 +885,10 @@ function debug(...args: unknown[]) {
760
885
  <span class="missing-if-branch" title="if path not taken" >I</span>if (DEBUG) <span class="cstat-no" title="statement not covered" >console.error("[pi-loop]", ...args);</span>
761
886
  }
762
887
  &nbsp;
888
+ function isStaleExtensionContextError(error: unknown): boolean {
889
+ return error instanceof Error &amp;&amp; error.message.includes("extension ctx is stale");
890
+ }
891
+ &nbsp;
763
892
  export default function (pi: ExtensionAPI) {
764
893
  const piLoopEnv = process.env.PI_LOOP;
765
894
  const piLoopScope = process.env.PI_LOOP_SCOPE as "memory" | "session" | "project" | undefined;
@@ -776,7 +905,9 @@ export default function (pi: ExtensionAPI) {
776
905
  // call), so stale monitors don't linger in the count between turns.
777
906
  monitorManager.setOnChange(() =&gt; widget.update());
778
907
  widget.setTaskSummaryProvider(() =&gt; {
779
- if (!nativeTaskStore) return { count: 0 };
908
+ // Once pi-tasks owns the channels, any native store created during the
909
+ // detection window is a shadow — never surface it in the status line.
910
+ if (tasksAvailable || !nativeTaskStore) return { count: 0 };
780
911
  const tasks = nativeTaskStore.list().filter(t =&gt; t.status === "pending" || t.status === "in_progress");
781
912
  const active = tasks.find(t =&gt; t.status === "in_progress");
782
913
  const next = tasks.find(t =&gt; t.status === "pending");
@@ -793,8 +924,18 @@ export default function (pi: ExtensionAPI) {
793
924
  &nbsp;
794
925
  // ── pi-tasks integration ──
795
926
  let tasksAvailable = false;
927
+ let tasksDetectionSettled = false;
796
928
  let nativeTaskStore: TaskStore | undefined;
797
929
  let nativeTasksRegistered = false;
930
+ &nbsp;
931
+ function getOrCreateNativeTaskStore(): TaskStore | undefined {
932
+ // pi-tasks owns the task channels; don't create a shadow store.
933
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (tasksAvailable) <span class="cstat-no" title="statement not covered" >return undefined;</span>
934
+ if (!nativeTaskStore) {
935
+ nativeTaskStore = new TaskStore(resolveTaskStorePath(getScopeOptions(), _sessionId));
936
+ }
937
+ return nativeTaskStore;
938
+ }
798
939
  &nbsp;
799
940
  const taskRuntime = createTaskRuntimeBridge({
800
941
  pi,
@@ -810,11 +951,36 @@ export default function (pi: ExtensionAPI) {
810
951
  widget.update();
811
952
  await evaluateTaskBacklog(taskStore, taskStore.pendingCount());
812
953
  },
954
+ onDetectionStarted: () =&gt; {
955
+ tasksDetectionSettled = false;
956
+ },
957
+ onDetectionSettled: () =&gt; {
958
+ tasksDetectionSettled = true;
959
+ },
960
+ debug,
961
+ });
962
+ &nbsp;
963
+ // The RPC server registers at init (not behind the 6s tool-fallback timer) so
964
+ // early cross-extension calls never race the timer; it stands down via
965
+ // isEnabled once an external pi-tasks is detected. checkTasksVersion ignores
966
+ // this server's own ping reply via its provider field. Mutating verbs stay
967
+ // silent until the detection probe settles, so a co-resident pi-tasks can
968
+ // never race the native server into creating divergent task state.
969
+ registerNativeTaskRpc({
970
+ pi,
971
+ getNativeTaskStore: getOrCreateNativeTaskStore,
972
+ isEnabled: () =&gt; !tasksAvailable,
973
+ isDetectionSettled: () =&gt; tasksDetectionSettled,
974
+ evaluateTaskBacklog: (taskStore, pendingCount) =&gt;
975
+ evaluateTaskBacklog(taskStore, pendingCount),
976
+ updateWidget: () =&gt; {
977
+ widget.update();
978
+ },
813
979
  debug,
814
980
  });
815
981
  &nbsp;
816
982
  taskRuntime.checkTasksVersion();
817
- pi.events.on(<span class="fstat-no" title="function not covered" >"tasks:ready", () =&gt; <span class="cstat-no" title="statement not covered" >t</span>askRuntime.checkTasksVersion())</span>;
983
+ pi.events.on("tasks:ready", () =&gt; taskRuntime.checkTasksVersion());
818
984
  &nbsp;
819
985
  const autoCreateTask = taskRuntime.autoCreateTask;
820
986
  const hasPendingTasks = taskRuntime.hasPendingTasks;
@@ -886,6 +1052,12 @@ export default function (pi: ExtensionAPI) {
886
1052
  hasPendingTasks: () =&gt; hasPendingTasks(),
887
1053
  bootstrapTaskLoop: (entry) =&gt; maybeBootstrapTaskLoop(entry),
888
1054
  triggerHasEventSource,
1055
+ emitLoopAutodeleted: (payload) =&gt; {
1056
+ pi.events.emit("loops:autodeleted", payload);
1057
+ },
1058
+ emitTaskBacklogEmpty: (payload) =&gt; {
1059
+ pi.events.emit("tasks:backlog_empty", payload);
1060
+ },
889
1061
  debug,
890
1062
  });
891
1063
  &nbsp;
@@ -1014,32 +1186,46 @@ export default function (pi: ExtensionAPI) {
1014
1186
  &nbsp;
1015
1187
  // ── Native task tools (only when pi-tasks is absent) ──
1016
1188
  &nbsp;
1017
- setTimeout(async () =&gt; {
1189
+ // Only tool/command registration stays deferred: the tool names collide with
1190
+ // pi-tasks and cannot be unregistered. The RPC server is already live (above).
1191
+ const nativeTaskFallbackTimer = setTimeout(() =&gt; {
1018
1192
  if (tasksAvailable || nativeTasksRegistered) return;
1019
- nativeTaskStore = new TaskStore(resolveTaskStorePath(getScopeOptions(), _sessionId));
1020
- nativeTasksRegistered = true;
1021
- const taskStore = nativeTaskStore;
1193
+ const taskStore = getOrCreateNativeTaskStore();
1194
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!taskStore) <span class="cstat-no" title="statement not covered" >return;</span>
1022
1195
  &nbsp;
1023
- registerTasksCommand({
1024
- pi,
1025
- getNativeTaskStore: () =&gt; nativeTaskStore,
1026
- evaluateTaskBacklog,
1027
- updateWidget: () =&gt; {
1028
- widget.update();
1029
- },
1030
- });
1196
+ try {
1197
+ registerTasksCommand({
1198
+ pi,
1199
+ getNativeTaskStore: () =&gt; nativeTaskStore,
1200
+ evaluateTaskBacklog,
1201
+ updateWidget: () =&gt; {
1202
+ widget.update();
1203
+ },
1204
+ });
1031
1205
  &nbsp;
1032
- registerNativeTaskTools({
1033
- pi,
1034
- taskStore,
1035
- evaluateTaskBacklog,
1036
- updateWidget: () =&gt; {
1037
- widget.update();
1038
- },
1039
- });
1206
+ registerNativeTaskTools({
1207
+ pi,
1208
+ taskStore,
1209
+ evaluateTaskBacklog,
1210
+ updateWidget: () =&gt; {
1211
+ widget.update();
1212
+ },
1213
+ });
1214
+ } catch (error) {
1215
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (isStaleExtensionContextError(error)) {
1216
+ debug("native task fallback skipped: extension context went stale");
1217
+ return;
1218
+ }
1219
+ <span class="cstat-no" title="statement not covered" > throw error;</span>
1220
+ }
1040
1221
  &nbsp;
1222
+ nativeTasksRegistered = true;
1041
1223
  debug("native task tools registered (pi-tasks not detected)");
1042
1224
  }, 6000);
1225
+ &nbsp;
1226
+ pi.on("session_shutdown", () =&gt; {
1227
+ clearTimeout(nativeTaskFallbackTimer);
1228
+ });
1043
1229
  }
1044
1230
  &nbsp;</pre></td></tr></table></pre>
1045
1231
 
@@ -1048,7 +1234,7 @@ export default function (pi: ExtensionAPI) {
1048
1234
  <div class='footer quiet pad2 space-top1 center small'>
1049
1235
  Code coverage generated by
1050
1236
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1051
- at 2026-06-19T00:56:38.236Z
1237
+ at 2026-07-02T19:31:50.067Z
1052
1238
  </div>
1053
1239
  <script src="../prettify.js"></script>
1054
1240
  <script>