@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,16 +23,16 @@
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
 
@@ -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">65x</span>
314
+ <span class="cline-any cline-yes">69x</span>
315
315
  <span class="cline-any cline-neutral">&nbsp;</span>
316
- <span class="cline-any cline-yes">65x</span>
317
- <span class="cline-any cline-yes">65x</span>
316
+ <span class="cline-any cline-yes">69x</span>
317
+ <span class="cline-any cline-yes">69x</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>
@@ -322,27 +322,27 @@
322
322
  <span class="cline-any cline-neutral">&nbsp;</span>
323
323
  <span class="cline-any cline-neutral">&nbsp;</span>
324
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>
325
+ <span class="cline-any cline-yes">57x</span>
326
+ <span class="cline-any cline-yes">50x</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-yes">93x</span>
330
330
  <span class="cline-any cline-neutral">&nbsp;</span>
331
- <span class="cline-any cline-yes">49x</span>
331
+ <span class="cline-any cline-yes">50x</span>
332
332
  <span class="cline-any cline-neutral">&nbsp;</span>
333
333
  <span class="cline-any cline-neutral">&nbsp;</span>
334
334
  <span class="cline-any cline-neutral">&nbsp;</span>
335
- <span class="cline-any cline-yes">6x</span>
335
+ <span class="cline-any cline-yes">7x</span>
336
336
  <span class="cline-any cline-yes">6x</span>
337
337
  <span class="cline-any cline-yes">6x</span>
338
338
  <span class="cline-any cline-neutral">&nbsp;</span>
339
339
  <span class="cline-any cline-neutral">&nbsp;</span>
340
340
  <span class="cline-any cline-neutral">&nbsp;</span>
341
- <span class="cline-any cline-yes">59x</span>
342
- <span class="cline-any cline-yes">52x</span>
343
- <span class="cline-any cline-yes">46x</span>
341
+ <span class="cline-any cline-yes">60x</span>
342
+ <span class="cline-any cline-yes">53x</span>
343
+ <span class="cline-any cline-yes">47x</span>
344
344
  <span class="cline-any cline-neutral">&nbsp;</span>
345
- <span class="cline-any cline-yes">52x</span>
345
+ <span class="cline-any cline-yes">53x</span>
346
346
  <span class="cline-any cline-neutral">&nbsp;</span>
347
347
  <span class="cline-any cline-neutral">&nbsp;</span>
348
348
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -360,30 +360,30 @@
360
360
  <span class="cline-any cline-neutral">&nbsp;</span>
361
361
  <span class="cline-any cline-neutral">&nbsp;</span>
362
362
  <span class="cline-any cline-neutral">&nbsp;</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">72x</span>
366
- <span class="cline-any cline-yes">72x</span>
363
+ <span class="cline-any cline-yes">167x</span>
364
+ <span class="cline-any cline-yes">167x</span>
365
+ <span class="cline-any cline-yes">70x</span>
366
+ <span class="cline-any cline-yes">70x</span>
367
367
  <span class="cline-any cline-yes">13x</span>
368
368
  <span class="cline-any cline-yes">13x</span>
369
369
  <span class="cline-any cline-yes">13x</span>
370
- <span class="cline-any cline-yes">5x</span>
371
- <span class="cline-any cline-yes">5x</span>
370
+ <span class="cline-any cline-yes">7x</span>
371
+ <span class="cline-any cline-yes">7x</span>
372
372
  <span class="cline-any cline-neutral">&nbsp;</span>
373
- <span class="cline-any cline-yes">166x</span>
373
+ <span class="cline-any cline-yes">167x</span>
374
374
  <span class="cline-any cline-neutral">&nbsp;</span>
375
375
  <span class="cline-any cline-neutral">&nbsp;</span>
376
- <span class="cline-any cline-yes">65x</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>
376
+ <span class="cline-any cline-yes">69x</span>
377
+ <span class="cline-any cline-yes">50x</span>
378
+ <span class="cline-any cline-yes">50x</span>
379
+ <span class="cline-any cline-yes">50x</span>
380
+ <span class="cline-any cline-yes">50x</span>
381
+ <span class="cline-any cline-yes">50x</span>
382
+ <span class="cline-any cline-yes">50x</span>
383
+ <span class="cline-any cline-yes">50x</span>
384
384
  <span class="cline-any cline-neutral">&nbsp;</span>
385
385
  <span class="cline-any cline-neutral">&nbsp;</span>
386
- <span class="cline-any cline-yes">65x</span>
386
+ <span class="cline-any cline-yes">69x</span>
387
387
  <span class="cline-any cline-yes">7x</span>
388
388
  <span class="cline-any cline-yes">7x</span>
389
389
  <span class="cline-any cline-yes">7x</span>
@@ -392,7 +392,7 @@
392
392
  <span class="cline-any cline-yes">7x</span>
393
393
  <span class="cline-any cline-neutral">&nbsp;</span>
394
394
  <span class="cline-any cline-neutral">&nbsp;</span>
395
- <span class="cline-any cline-yes">65x</span>
395
+ <span class="cline-any cline-yes">69x</span>
396
396
  <span class="cline-any cline-yes">20x</span>
397
397
  <span class="cline-any cline-neutral">&nbsp;</span>
398
398
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -401,7 +401,7 @@
401
401
  <span class="cline-any cline-yes">20x</span>
402
402
  <span class="cline-any cline-neutral">&nbsp;</span>
403
403
  <span class="cline-any cline-neutral">&nbsp;</span>
404
- <span class="cline-any cline-yes">65x</span>
404
+ <span class="cline-any cline-yes">69x</span>
405
405
  <span class="cline-any cline-yes">24x</span>
406
406
  <span class="cline-any cline-yes">24x</span>
407
407
  <span class="cline-any cline-yes">24x</span>
@@ -413,12 +413,12 @@
413
413
  <span class="cline-any cline-yes">24x</span>
414
414
  <span class="cline-any cline-neutral">&nbsp;</span>
415
415
  <span class="cline-any cline-neutral">&nbsp;</span>
416
- <span class="cline-any cline-yes">65x</span>
417
- <span class="cline-any cline-yes">3x</span>
418
- <span class="cline-any cline-yes">3x</span>
416
+ <span class="cline-any cline-yes">69x</span>
417
+ <span class="cline-any cline-yes">4x</span>
418
+ <span class="cline-any cline-yes">4x</span>
419
419
  <span class="cline-any cline-neutral">&nbsp;</span>
420
420
  <span class="cline-any cline-neutral">&nbsp;</span>
421
- <span class="cline-any cline-yes">65x</span>
421
+ <span class="cline-any cline-yes">69x</span>
422
422
  <span class="cline-any cline-yes">3x</span>
423
423
  <span class="cline-any cline-yes">3x</span>
424
424
  <span class="cline-any cline-yes">3x</span>
@@ -439,7 +439,7 @@
439
439
  <span class="cline-any cline-yes">3x</span>
440
440
  <span class="cline-any cline-neutral">&nbsp;</span>
441
441
  <span class="cline-any cline-neutral">&nbsp;</span>
442
- <span class="cline-any cline-yes">65x</span>
442
+ <span class="cline-any cline-yes">69x</span>
443
443
  <span class="cline-any cline-yes">3x</span>
444
444
  <span class="cline-any cline-yes">3x</span>
445
445
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -530,7 +530,7 @@ export function registerSessionRuntimeHooks(options: SessionRuntimeOptions): voi
530
530
  }
531
531
  &nbsp;
532
532
  function stopHeartbeat(): void {
533
- <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;
534
534
  clearInterval(heartbeatTimer);
535
535
  heartbeatTimer = undefined;
536
536
  }
@@ -664,7 +664,7 @@ export function registerSessionRuntimeHooks(options: SessionRuntimeOptions): voi
664
664
  <div class='footer quiet pad2 space-top1 center small'>
665
665
  Code coverage generated by
666
666
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
667
- at 2026-06-19T00:56:38.236Z
667
+ at 2026-07-02T19:31:50.067Z
668
668
  </div>
669
669
  <script src="../../prettify.js"></script>
670
670
  <script>
@@ -23,9 +23,9 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">95.83% </span>
26
+ <span class="strong">96.07% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>46/48</span>
28
+ <span class='fraction'>49/51</span>
29
29
  </div>
30
30
 
31
31
 
@@ -39,14 +39,14 @@
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'>10/10</span>
42
+ <span class='fraction'>11/11</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">100% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>42/42</span>
49
+ <span class='fraction'>45/45</span>
50
50
  </div>
51
51
 
52
52
 
@@ -226,7 +226,27 @@
226
226
  <a name='L161'></a><a href='#L161'>161</a>
227
227
  <a name='L162'></a><a href='#L162'>162</a>
228
228
  <a name='L163'></a><a href='#L163'>163</a>
229
- <a name='L164'></a><a href='#L164'>164</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
244
+ <span class="cline-any cline-neutral">&nbsp;</span>
245
+ <span class="cline-any cline-neutral">&nbsp;</span>
246
+ <span class="cline-any cline-neutral">&nbsp;</span>
247
+ <span class="cline-any cline-neutral">&nbsp;</span>
248
+ <span class="cline-any cline-neutral">&nbsp;</span>
249
+ <span class="cline-any cline-neutral">&nbsp;</span>
230
250
  <span class="cline-any cline-neutral">&nbsp;</span>
231
251
  <span class="cline-any cline-neutral">&nbsp;</span>
232
252
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -279,7 +299,11 @@
279
299
  <span class="cline-any cline-neutral">&nbsp;</span>
280
300
  <span class="cline-any cline-neutral">&nbsp;</span>
281
301
  <span class="cline-any cline-neutral">&nbsp;</span>
282
- <span class="cline-any cline-yes">73x</span>
302
+ <span class="cline-any cline-neutral">&nbsp;</span>
303
+ <span class="cline-any cline-neutral">&nbsp;</span>
304
+ <span class="cline-any cline-neutral">&nbsp;</span>
305
+ <span class="cline-any cline-neutral">&nbsp;</span>
306
+ <span class="cline-any cline-yes">77x</span>
283
307
  <span class="cline-any cline-neutral">&nbsp;</span>
284
308
  <span class="cline-any cline-neutral">&nbsp;</span>
285
309
  <span class="cline-any cline-yes">15x</span>
@@ -298,14 +322,18 @@
298
322
  <span class="cline-any cline-neutral">&nbsp;</span>
299
323
  <span class="cline-any cline-neutral">&nbsp;</span>
300
324
  <span class="cline-any cline-neutral">&nbsp;</span>
301
- <span class="cline-any cline-yes">39x</span>
302
- <span class="cline-any cline-yes">39x</span>
325
+ <span class="cline-any cline-yes">40x</span>
326
+ <span class="cline-any cline-yes">40x</span>
303
327
  <span class="cline-any cline-neutral">&nbsp;</span>
304
328
  <span class="cline-any cline-yes">8x</span>
305
329
  <span class="cline-any cline-yes">8x</span>
306
330
  <span class="cline-any cline-neutral">&nbsp;</span>
307
331
  <span class="cline-any cline-yes">5x</span>
308
332
  <span class="cline-any cline-yes">5x</span>
333
+ <span class="cline-any cline-neutral">&nbsp;</span>
334
+ <span class="cline-any cline-yes">40x</span>
335
+ <span class="cline-any cline-yes">5x</span>
336
+ <span class="cline-any cline-yes">5x</span>
309
337
  <span class="cline-any cline-yes">5x</span>
310
338
  <span class="cline-any cline-yes">5x</span>
311
339
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -337,15 +365,15 @@
337
365
  <span class="cline-any cline-neutral">&nbsp;</span>
338
366
  <span class="cline-any cline-neutral">&nbsp;</span>
339
367
  <span class="cline-any cline-neutral">&nbsp;</span>
340
- <span class="cline-any cline-yes">73x</span>
341
- <span class="cline-any cline-yes">73x</span>
368
+ <span class="cline-any cline-yes">77x</span>
369
+ <span class="cline-any cline-yes">77x</span>
342
370
  <span class="cline-any cline-neutral">&nbsp;</span>
343
- <span class="cline-any cline-yes">73x</span>
344
- <span class="cline-any cline-yes">72x</span>
345
- <span class="cline-any cline-yes">72x</span>
371
+ <span class="cline-any cline-yes">77x</span>
372
+ <span class="cline-any cline-yes">75x</span>
373
+ <span class="cline-any cline-yes">75x</span>
346
374
  <span class="cline-any cline-neutral">&nbsp;</span>
347
375
  <span class="cline-any cline-neutral">&nbsp;</span>
348
- <span class="cline-any cline-yes">73x</span>
376
+ <span class="cline-any cline-yes">77x</span>
349
377
  <span class="cline-any cline-neutral">&nbsp;</span>
350
378
  <span class="cline-any cline-neutral">&nbsp;</span>
351
379
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -353,18 +381,18 @@
353
381
  <span class="cline-any cline-yes">8x</span>
354
382
  <span class="cline-any cline-neutral">&nbsp;</span>
355
383
  <span class="cline-any cline-neutral">&nbsp;</span>
356
- <span class="cline-any cline-yes">11x</span>
384
+ <span class="cline-any cline-yes">12x</span>
357
385
  <span class="cline-any cline-neutral">&nbsp;</span>
358
386
  <span class="cline-any cline-neutral">&nbsp;</span>
359
387
  <span class="cline-any cline-neutral">&nbsp;</span>
360
388
  <span class="cline-any cline-neutral">&nbsp;</span>
361
389
  <span class="cline-any cline-neutral">&nbsp;</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>
390
+ <span class="cline-any cline-yes">75x</span>
391
+ <span class="cline-any cline-yes">75x</span>
392
+ <span class="cline-any cline-yes">75x</span>
393
+ <span class="cline-any cline-yes">75x</span>
366
394
  <span class="cline-any cline-neutral">&nbsp;</span>
367
- <span class="cline-any cline-yes">72x</span>
395
+ <span class="cline-any cline-yes">75x</span>
368
396
  <span class="cline-any cline-neutral">&nbsp;</span>
369
397
  <span class="cline-any cline-neutral">&nbsp;</span>
370
398
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -372,15 +400,15 @@
372
400
  <span class="cline-any cline-neutral">&nbsp;</span>
373
401
  <span class="cline-any cline-neutral">&nbsp;</span>
374
402
  <span class="cline-any cline-neutral">&nbsp;</span>
375
- <span class="cline-any cline-yes">72x</span>
376
- <span class="cline-any cline-yes">72x</span>
403
+ <span class="cline-any cline-yes">75x</span>
404
+ <span class="cline-any cline-yes">75x</span>
377
405
  <span class="cline-any cline-neutral">&nbsp;</span>
378
406
  <span class="cline-any cline-neutral">&nbsp;</span>
379
407
  <span class="cline-any cline-neutral">&nbsp;</span>
380
408
  <span class="cline-any cline-neutral">&nbsp;</span>
381
409
  <span class="cline-any cline-neutral">&nbsp;</span>
382
410
  <span class="cline-any cline-neutral">&nbsp;</span>
383
- <span class="cline-any cline-yes">73x</span>
411
+ <span class="cline-any cline-yes">77x</span>
384
412
  <span class="cline-any cline-neutral">&nbsp;</span>
385
413
  <span class="cline-any cline-neutral">&nbsp;</span>
386
414
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -400,6 +428,12 @@ import {
400
428
  } from "../task-backlog-coordinator.js";
401
429
  import type { TaskStore } from "../task-store.js";
402
430
  import type { LoopEntry, Trigger } from "../types.js";
431
+ import {
432
+ buildLoopAutodeletedPayload,
433
+ buildTaskBacklogEmptyPayload,
434
+ type LoopAutodeletedPayload,
435
+ type TaskBacklogEmptyPayload,
436
+ } from "./loop-events.js";
403
437
  &nbsp;
404
438
  export const AUTO_TASK_WORKER_THRESHOLD = 5;
405
439
  export const AUTO_TASK_WORKER_PROMPT = "Run TaskList, pick next pending task, mark it in_progress, implement it, run validation, complete it. If no pending tasks remain, call LoopDelete on your own loop ID.";
@@ -418,6 +452,8 @@ export interface TaskBacklogRuntimeOptions {
418
452
  hasPendingTasks: () =&gt; Promise&lt;number&gt;;
419
453
  bootstrapTaskLoop: (entry: LoopEntry) =&gt; Promise&lt;boolean&gt;;
420
454
  triggerHasEventSource: (trigger: Trigger | string, source: string) =&gt; boolean;
455
+ emitLoopAutodeleted?: (payload: LoopAutodeletedPayload) =&gt; void;
456
+ emitTaskBacklogEmpty?: (payload: TaskBacklogEmptyPayload) =&gt; void;
421
457
  debug?: (...args: unknown[]) =&gt; void;
422
458
  }
423
459
  &nbsp;
@@ -441,6 +477,8 @@ export function createTaskBacklogRuntime(options: TaskBacklogRuntimeOptions): Ta
441
477
  hasPendingTasks,
442
478
  bootstrapTaskLoop,
443
479
  triggerHasEventSource,
480
+ emitLoopAutodeleted,
481
+ emitTaskBacklogEmpty,
444
482
  debug,
445
483
  } = options;
446
484
  &nbsp;
@@ -467,10 +505,14 @@ export function createTaskBacklogRuntime(options: TaskBacklogRuntimeOptions): Ta
467
505
  const pending = await hasPendingTasks();
468
506
  if (pending &lt; 0 || pending &gt; 0) return 0;
469
507
  &nbsp;
508
+ emitTaskBacklogEmpty?.(
509
+ buildTaskBacklogEmptyPayload(backlogLoops.map((entry) =&gt; entry.id)),
510
+ );
470
511
  for (const entry of backlogLoops) {
471
512
  debug?.(`task backlog loop #${entry.id} — no pending tasks remain, deleting`);
472
513
  removeTrigger(entry.id);
473
514
  deleteLoop(entry.id);
515
+ emitLoopAutodeleted?.(buildLoopAutodeletedPayload(entry, pending));
474
516
  }
475
517
  updateWidget();
476
518
  return backlogLoops.length;
@@ -559,7 +601,7 @@ export function createTaskBacklogRuntime(options: TaskBacklogRuntimeOptions): Ta
559
601
  <div class='footer quiet pad2 space-top1 center small'>
560
602
  Code coverage generated by
561
603
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
562
- at 2026-06-19T00:56:38.236Z
604
+ at 2026-07-02T19:31:50.067Z
563
605
  </div>
564
606
  <script src="../../prettify.js"></script>
565
607
  <script>
@@ -0,0 +1,208 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/runtime/task-events.ts</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../prettify.css" />
9
+ <link rel="stylesheet" href="../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">src/runtime</a> task-events.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">100% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>1/1</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">100% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>0/0</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>1/1</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">100% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>1/1</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
108
+ <span class="cline-any cline-neutral">&nbsp;</span>
109
+ <span class="cline-any cline-neutral">&nbsp;</span>
110
+ <span class="cline-any cline-neutral">&nbsp;</span>
111
+ <span class="cline-any cline-neutral">&nbsp;</span>
112
+ <span class="cline-any cline-neutral">&nbsp;</span>
113
+ <span class="cline-any cline-neutral">&nbsp;</span>
114
+ <span class="cline-any cline-neutral">&nbsp;</span>
115
+ <span class="cline-any cline-neutral">&nbsp;</span>
116
+ <span class="cline-any cline-neutral">&nbsp;</span>
117
+ <span class="cline-any cline-neutral">&nbsp;</span>
118
+ <span class="cline-any cline-neutral">&nbsp;</span>
119
+ <span class="cline-any cline-neutral">&nbsp;</span>
120
+ <span class="cline-any cline-neutral">&nbsp;</span>
121
+ <span class="cline-any cline-neutral">&nbsp;</span>
122
+ <span class="cline-any cline-neutral">&nbsp;</span>
123
+ <span class="cline-any cline-neutral">&nbsp;</span>
124
+ <span class="cline-any cline-neutral">&nbsp;</span>
125
+ <span class="cline-any cline-neutral">&nbsp;</span>
126
+ <span class="cline-any cline-neutral">&nbsp;</span>
127
+ <span class="cline-any cline-neutral">&nbsp;</span>
128
+ <span class="cline-any cline-neutral">&nbsp;</span>
129
+ <span class="cline-any cline-neutral">&nbsp;</span>
130
+ <span class="cline-any cline-neutral">&nbsp;</span>
131
+ <span class="cline-any cline-neutral">&nbsp;</span>
132
+ <span class="cline-any cline-neutral">&nbsp;</span>
133
+ <span class="cline-any cline-neutral">&nbsp;</span>
134
+ <span class="cline-any cline-neutral">&nbsp;</span>
135
+ <span class="cline-any cline-neutral">&nbsp;</span>
136
+ <span class="cline-any cline-yes">96x</span>
137
+ <span class="cline-any cline-neutral">&nbsp;</span>
138
+ <span class="cline-any cline-neutral">&nbsp;</span>
139
+ <span class="cline-any cline-neutral">&nbsp;</span>
140
+ <span class="cline-any cline-neutral">&nbsp;</span>
141
+ <span class="cline-any cline-neutral">&nbsp;</span>
142
+ <span class="cline-any cline-neutral">&nbsp;</span>
143
+ <span class="cline-any cline-neutral">&nbsp;</span>
144
+ <span class="cline-any cline-neutral">&nbsp;</span>
145
+ <span class="cline-any cline-neutral">&nbsp;</span>
146
+ <span class="cline-any cline-neutral">&nbsp;</span>
147
+ <span class="cline-any cline-neutral">&nbsp;</span>
148
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
149
+ import type { TaskEntry, TaskStatus } from "../task-types.js";
150
+ &nbsp;
151
+ export type NativeTaskEventName =
152
+ | "tasks:created"
153
+ | "tasks:started"
154
+ | "tasks:completed"
155
+ | "tasks:reopened"
156
+ | "tasks:updated"
157
+ | "tasks:deleted";
158
+ &nbsp;
159
+ export interface NativeTaskEventPayload {
160
+ taskId: string;
161
+ subject: string;
162
+ description: string;
163
+ status: TaskStatus;
164
+ previousStatus?: TaskStatus;
165
+ createdAt: number;
166
+ updatedAt: number;
167
+ completedAt?: number;
168
+ metadata?: Record&lt;string, unknown&gt;;
169
+ }
170
+ &nbsp;
171
+ export function emitNativeTaskEvent(
172
+ pi: ExtensionAPI,
173
+ name: NativeTaskEventName,
174
+ entry: TaskEntry,
175
+ previousStatus?: TaskStatus,
176
+ ): void {
177
+ pi.events.emit(name, {
178
+ taskId: entry.id,
179
+ subject: entry.subject,
180
+ description: entry.description,
181
+ status: entry.status,
182
+ previousStatus,
183
+ createdAt: entry.createdAt,
184
+ updatedAt: entry.updatedAt,
185
+ completedAt: entry.completedAt,
186
+ metadata: entry.metadata,
187
+ } satisfies NativeTaskEventPayload);
188
+ }
189
+ &nbsp;</pre></td></tr></table></pre>
190
+
191
+ <div class='push'></div><!-- for sticky footer -->
192
+ </div><!-- /wrapper -->
193
+ <div class='footer quiet pad2 space-top1 center small'>
194
+ Code coverage generated by
195
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
196
+ at 2026-07-02T19:31:50.067Z
197
+ </div>
198
+ <script src="../../prettify.js"></script>
199
+ <script>
200
+ window.onload = function () {
201
+ prettyPrint();
202
+ };
203
+ </script>
204
+ <script src="../../sorter.js"></script>
205
+ <script src="../../block-navigation.js"></script>
206
+ </body>
207
+ </html>
208
+