@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.
- package/.release-please-manifest.json +1 -1
- package/AGENTS.md +52 -12
- package/CHANGELOG.md +59 -0
- package/CONTRIBUTING.md +13 -3
- package/README.md +47 -0
- package/coverage/coverage-final.json +35 -32
- package/coverage/index.html +64 -49
- package/coverage/src/api.ts.html +193 -0
- package/coverage/src/commands/index.html +32 -32
- package/coverage/src/commands/loop-command.ts.html +170 -170
- package/coverage/src/commands/tasks-command.ts.html +129 -129
- package/coverage/src/coordinator.ts.html +26 -26
- package/coverage/src/index.html +61 -106
- package/coverage/src/index.ts.html +224 -86
- package/coverage/src/loop-parse.ts.html +106 -73
- package/coverage/src/loop-reducer.ts.html +21 -21
- package/coverage/src/monitor-completion-coordinator.ts.html +1 -1
- package/coverage/src/monitor-manager.ts.html +95 -71
- package/coverage/src/monitor-reducer.ts.html +15 -15
- package/coverage/src/notification-reducer.ts.html +6 -6
- package/coverage/src/reducer-backed-store.ts.html +57 -57
- package/coverage/src/rpc/channels.ts.html +376 -0
- package/coverage/src/rpc/cross-extension-rpc.ts.html +541 -0
- package/coverage/src/rpc/index.html +131 -0
- package/coverage/src/runtime/index.html +68 -23
- package/coverage/src/{goal-coordinator.ts.html → runtime/loop-events.ts.html} +79 -73
- package/coverage/src/runtime/monitor-ondone-runtime.ts.html +5 -5
- package/coverage/src/runtime/native-task-rpc.ts.html +502 -0
- package/coverage/src/runtime/notification-runtime.ts.html +22 -22
- package/coverage/src/runtime/scope.ts.html +14 -14
- package/coverage/src/runtime/session-runtime.ts.html +32 -32
- package/coverage/src/runtime/task-backlog-runtime.ts.html +65 -23
- package/coverage/src/runtime/task-events.ts.html +2 -2
- package/coverage/src/runtime/task-mutations.ts.html +394 -0
- package/coverage/src/runtime/task-rpc.ts.html +102 -120
- package/coverage/src/scheduler.ts.html +29 -29
- package/coverage/src/store.ts.html +27 -27
- package/coverage/src/task-backlog-coordinator.ts.html +8 -8
- package/coverage/src/task-reducer.ts.html +42 -42
- package/coverage/src/task-store.ts.html +49 -49
- package/coverage/src/tools/index.html +39 -24
- package/coverage/src/tools/loop-tools.ts.html +12 -21
- package/coverage/src/tools/monitor-tools.ts.html +12 -21
- package/coverage/src/tools/native-task-tools.ts.html +57 -120
- package/coverage/src/tools/tool-result.ts.html +97 -0
- package/coverage/src/trigger-system.ts.html +12 -12
- package/coverage/src/ui/index.html +1 -1
- package/coverage/src/ui/widget.ts.html +23 -23
- package/dist/api.d.ts +11 -0
- package/dist/api.js +10 -0
- package/dist/commands/loop-command.js +2 -2
- package/dist/commands/tasks-command.js +3 -3
- package/dist/coordinator.d.ts +1 -1
- package/dist/index.js +48 -3
- package/dist/loop-parse.js +14 -5
- package/dist/reducer-backed-store.d.ts +1 -1
- package/dist/reducer-backed-store.js +1 -1
- package/dist/rpc/channels.d.ts +73 -0
- package/dist/rpc/channels.js +30 -0
- package/dist/rpc/cross-extension-rpc.d.ts +59 -0
- package/dist/rpc/cross-extension-rpc.js +117 -0
- package/dist/runtime/loop-events.d.ts +26 -0
- package/dist/runtime/loop-events.js +26 -0
- package/dist/runtime/native-task-rpc.d.ts +22 -0
- package/dist/runtime/native-task-rpc.js +50 -0
- package/dist/runtime/task-backlog-runtime.d.ts +3 -0
- package/dist/runtime/task-backlog-runtime.js +4 -1
- package/dist/runtime/task-mutations.d.ts +39 -0
- package/dist/runtime/task-mutations.js +68 -0
- package/dist/runtime/task-rpc.d.ts +4 -0
- package/dist/runtime/task-rpc.js +40 -58
- package/dist/scheduler.js +1 -1
- package/dist/tools/loop-tools.js +1 -3
- package/dist/tools/monitor-tools.js +1 -3
- package/dist/tools/native-task-tools.d.ts +2 -6
- package/dist/tools/native-task-tools.js +25 -55
- package/dist/tools/tool-result.d.ts +8 -0
- package/dist/tools/tool-result.js +4 -0
- package/docs/architecture/state-machine-migration.md +0 -44
- package/docs/architecture/state-machine-reducer-event-model.md +2 -3
- package/package.json +6 -1
- package/src/api.ts +36 -0
- package/src/commands/loop-command.ts +2 -2
- package/src/commands/tasks-command.ts +3 -3
- package/src/coordinator.ts +1 -1
- package/src/index.ts +49 -3
- package/src/loop-parse.ts +18 -7
- package/src/reducer-backed-store.ts +3 -3
- package/src/rpc/channels.ts +97 -0
- package/src/rpc/cross-extension-rpc.ts +152 -0
- package/src/runtime/loop-events.ts +60 -0
- package/src/runtime/native-task-rpc.ts +139 -0
- package/src/runtime/task-backlog-runtime.ts +14 -0
- package/src/runtime/task-mutations.ts +103 -0
- package/src/runtime/task-rpc.ts +48 -54
- package/src/scheduler.ts +1 -1
- package/src/tools/loop-tools.ts +1 -4
- package/src/tools/monitor-tools.ts +1 -4
- package/src/tools/native-task-tools.ts +31 -52
- package/src/tools/tool-result.ts +4 -0
- package/src/trigger-system.ts +4 -4
- package/vitest.config.ts +7 -7
- package/coverage/src/goal-reducer.ts.html +0 -982
- package/coverage/src/goal-store.ts.html +0 -742
- package/coverage/src/goal-verifier.ts.html +0 -808
- package/dist/goal-coordinator.d.ts +0 -22
- package/dist/goal-coordinator.js +0 -28
- package/dist/goal-reducer.d.ts +0 -98
- package/dist/goal-reducer.js +0 -190
- package/dist/goal-store.d.ts +0 -22
- package/dist/goal-store.js +0 -188
- package/dist/goal-types.d.ts +0 -82
- package/dist/goal-types.js +0 -1
- package/dist/goal-verifier.d.ts +0 -20
- package/dist/goal-verifier.js +0 -198
- package/docs/architecture/goal-state-schema.md +0 -505
- package/src/goal-coordinator.ts +0 -58
- package/src/goal-reducer.ts +0 -299
- package/src/goal-store.ts +0 -219
- package/src/goal-types.ts +0 -104
- 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">
|
|
26
|
+
<span class="strong">86.66% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>91/105</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">70% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>42/60</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
<div class='fl pad1y space-right2'>
|
|
40
|
-
<span class="strong">
|
|
40
|
+
<span class="strong">87.5% </span>
|
|
41
41
|
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>
|
|
42
|
+
<span class='fraction'>7/8</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">
|
|
47
|
+
<span class="strong">92.3% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>84/91</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
</div>
|
|
62
62
|
</template>
|
|
63
63
|
</div>
|
|
64
|
-
<div class='status-line
|
|
64
|
+
<div class='status-line high'></div>
|
|
65
65
|
<pre><table class="coverage">
|
|
66
66
|
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
67
|
<a name='L2'></a><a href='#L2'>2</a>
|
|
@@ -276,156 +276,156 @@
|
|
|
276
276
|
<span class="cline-any cline-neutral"> </span>
|
|
277
277
|
<span class="cline-any cline-neutral"> </span>
|
|
278
278
|
<span class="cline-any cline-neutral"> </span>
|
|
279
|
-
<span class="cline-any cline-yes">
|
|
279
|
+
<span class="cline-any cline-yes">78x</span>
|
|
280
280
|
<span class="cline-any cline-neutral"> </span>
|
|
281
281
|
<span class="cline-any cline-neutral"> </span>
|
|
282
|
-
<span class="cline-any cline-
|
|
283
|
-
<span class="cline-any cline-
|
|
282
|
+
<span class="cline-any cline-yes">3x</span>
|
|
283
|
+
<span class="cline-any cline-yes">2x</span>
|
|
284
284
|
<span class="cline-any cline-neutral"> </span>
|
|
285
|
-
<span class="cline-any cline-
|
|
286
|
-
<span class="cline-any cline-
|
|
285
|
+
<span class="cline-any cline-yes">3x</span>
|
|
286
|
+
<span class="cline-any cline-yes">3x</span>
|
|
287
287
|
<span class="cline-any cline-neutral"> </span>
|
|
288
|
-
<span class="cline-any cline-
|
|
289
|
-
<span class="cline-any cline-
|
|
290
|
-
<span class="cline-any cline-
|
|
291
|
-
<span class="cline-any cline-
|
|
292
|
-
<span class="cline-any cline-
|
|
293
|
-
<span class="cline-any cline-
|
|
294
|
-
<span class="cline-any cline-
|
|
288
|
+
<span class="cline-any cline-yes">3x</span>
|
|
289
|
+
<span class="cline-any cline-yes">3x</span>
|
|
290
|
+
<span class="cline-any cline-yes">3x</span>
|
|
291
|
+
<span class="cline-any cline-yes">3x</span>
|
|
292
|
+
<span class="cline-any cline-yes">3x</span>
|
|
293
|
+
<span class="cline-any cline-yes">3x</span>
|
|
294
|
+
<span class="cline-any cline-yes">3x</span>
|
|
295
295
|
<span class="cline-any cline-neutral"> </span>
|
|
296
|
-
<span class="cline-any cline-
|
|
296
|
+
<span class="cline-any cline-yes">1x</span>
|
|
297
297
|
<span class="cline-any cline-neutral"> </span>
|
|
298
298
|
<span class="cline-any cline-neutral"> </span>
|
|
299
299
|
<span class="cline-any cline-neutral"> </span>
|
|
300
300
|
<span class="cline-any cline-neutral"> </span>
|
|
301
|
-
<span class="cline-any cline-
|
|
302
|
-
<span class="cline-any cline-
|
|
301
|
+
<span class="cline-any cline-yes">2x</span>
|
|
302
|
+
<span class="cline-any cline-yes">1x</span>
|
|
303
303
|
<span class="cline-any cline-neutral"> </span>
|
|
304
|
-
<span class="cline-any cline-
|
|
305
|
-
<span class="cline-any cline-
|
|
304
|
+
<span class="cline-any cline-yes">2x</span>
|
|
305
|
+
<span class="cline-any cline-yes">2x</span>
|
|
306
306
|
<span class="cline-any cline-neutral"> </span>
|
|
307
|
-
<span class="cline-any cline-
|
|
308
|
-
<span class="cline-any cline-
|
|
309
|
-
<span class="cline-any cline-
|
|
310
|
-
<span class="cline-any cline-
|
|
311
|
-
<span class="cline-any cline-
|
|
307
|
+
<span class="cline-any cline-yes">2x</span>
|
|
308
|
+
<span class="cline-any cline-yes">2x</span>
|
|
309
|
+
<span class="cline-any cline-yes">2x</span>
|
|
310
|
+
<span class="cline-any cline-yes">2x</span>
|
|
311
|
+
<span class="cline-any cline-yes">2x</span>
|
|
312
312
|
<span class="cline-any cline-neutral"> </span>
|
|
313
313
|
<span class="cline-any cline-neutral"> </span>
|
|
314
314
|
<span class="cline-any cline-neutral"> </span>
|
|
315
|
-
<span class="cline-any cline-
|
|
316
|
-
<span class="cline-any cline-
|
|
317
|
-
<span class="cline-any cline-
|
|
318
|
-
<span class="cline-any cline-
|
|
315
|
+
<span class="cline-any cline-yes">5x</span>
|
|
316
|
+
<span class="cline-any cline-yes">5x</span>
|
|
317
|
+
<span class="cline-any cline-yes">2x</span>
|
|
318
|
+
<span class="cline-any cline-yes">2x</span>
|
|
319
319
|
<span class="cline-any cline-neutral"> </span>
|
|
320
320
|
<span class="cline-any cline-neutral"> </span>
|
|
321
|
-
<span class="cline-any cline-
|
|
322
|
-
<span class="cline-any cline-
|
|
323
|
-
<span class="cline-any cline-
|
|
321
|
+
<span class="cline-any cline-yes">3x</span>
|
|
322
|
+
<span class="cline-any cline-yes">3x</span>
|
|
323
|
+
<span class="cline-any cline-yes">3x</span>
|
|
324
324
|
<span class="cline-any cline-neutral"> </span>
|
|
325
325
|
<span class="cline-any cline-neutral"> </span>
|
|
326
326
|
<span class="cline-any cline-neutral"> </span>
|
|
327
327
|
<span class="cline-any cline-neutral"> </span>
|
|
328
|
-
<span class="cline-any cline-
|
|
328
|
+
<span class="cline-any cline-yes">3x</span>
|
|
329
329
|
<span class="cline-any cline-neutral"> </span>
|
|
330
|
-
<span class="cline-any cline-
|
|
330
|
+
<span class="cline-any cline-yes">3x</span>
|
|
331
331
|
<span class="cline-any cline-neutral"> </span>
|
|
332
|
-
<span class="cline-any cline-
|
|
333
|
-
<span class="cline-any cline-
|
|
332
|
+
<span class="cline-any cline-yes">3x</span>
|
|
333
|
+
<span class="cline-any cline-yes">3x</span>
|
|
334
334
|
<span class="cline-any cline-neutral"> </span>
|
|
335
|
+
<span class="cline-any cline-yes">2x</span>
|
|
336
|
+
<span class="cline-any cline-yes">2x</span>
|
|
337
|
+
<span class="cline-any cline-yes">2x</span>
|
|
338
|
+
<span class="cline-any cline-yes">2x</span>
|
|
339
|
+
<span class="cline-any cline-yes">2x</span>
|
|
340
|
+
<span class="cline-any cline-yes">2x</span>
|
|
335
341
|
<span class="cline-any cline-no"> </span>
|
|
336
|
-
<span class="cline-any cline-
|
|
337
|
-
<span class="cline-any cline-no"> </span>
|
|
338
|
-
<span class="cline-any cline-no"> </span>
|
|
339
|
-
<span class="cline-any cline-no"> </span>
|
|
340
|
-
<span class="cline-any cline-no"> </span>
|
|
341
|
-
<span class="cline-any cline-no"> </span>
|
|
342
|
-
<span class="cline-any cline-no"> </span>
|
|
342
|
+
<span class="cline-any cline-yes">2x</span>
|
|
343
343
|
<span class="cline-any cline-neutral"> </span>
|
|
344
|
-
<span class="cline-any cline-
|
|
344
|
+
<span class="cline-any cline-yes">2x</span>
|
|
345
345
|
<span class="cline-any cline-neutral"> </span>
|
|
346
346
|
<span class="cline-any cline-neutral"> </span>
|
|
347
347
|
<span class="cline-any cline-neutral"> </span>
|
|
348
348
|
<span class="cline-any cline-neutral"> </span>
|
|
349
|
+
<span class="cline-any cline-yes">2x</span>
|
|
350
|
+
<span class="cline-any cline-yes">1x</span>
|
|
351
|
+
<span class="cline-any cline-yes">1x</span>
|
|
352
|
+
<span class="cline-any cline-yes">1x</span>
|
|
353
|
+
<span class="cline-any cline-yes">1x</span>
|
|
354
|
+
<span class="cline-any cline-yes">1x</span>
|
|
355
|
+
<span class="cline-any cline-yes">1x</span>
|
|
356
|
+
<span class="cline-any cline-yes">1x</span>
|
|
357
|
+
<span class="cline-any cline-yes">1x</span>
|
|
358
|
+
<span class="cline-any cline-yes">1x</span>
|
|
349
359
|
<span class="cline-any cline-no"> </span>
|
|
350
360
|
<span class="cline-any cline-no"> </span>
|
|
351
361
|
<span class="cline-any cline-no"> </span>
|
|
352
362
|
<span class="cline-any cline-no"> </span>
|
|
353
363
|
<span class="cline-any cline-no"> </span>
|
|
354
|
-
<span class="cline-any cline-no"> </span>
|
|
355
|
-
<span class="cline-any cline-no"> </span>
|
|
356
|
-
<span class="cline-any cline-no"> </span>
|
|
357
|
-
<span class="cline-any cline-no"> </span>
|
|
358
|
-
<span class="cline-any cline-no"> </span>
|
|
359
|
-
<span class="cline-any cline-no"> </span>
|
|
360
|
-
<span class="cline-any cline-no"> </span>
|
|
361
|
-
<span class="cline-any cline-no"> </span>
|
|
362
|
-
<span class="cline-any cline-no"> </span>
|
|
363
|
-
<span class="cline-any cline-no"> </span>
|
|
364
|
-
<span class="cline-any cline-neutral"> </span>
|
|
365
|
-
<span class="cline-any cline-neutral"> </span>
|
|
366
|
-
<span class="cline-any cline-neutral"> </span>
|
|
367
|
-
<span class="cline-any cline-neutral"> </span>
|
|
368
|
-
<span class="cline-any cline-no"> </span>
|
|
369
364
|
<span class="cline-any cline-neutral"> </span>
|
|
370
365
|
<span class="cline-any cline-neutral"> </span>
|
|
371
366
|
<span class="cline-any cline-neutral"> </span>
|
|
372
|
-
<span class="cline-any cline-no"> </span>
|
|
373
|
-
<span class="cline-any cline-no"> </span>
|
|
374
|
-
<span class="cline-any cline-no"> </span>
|
|
375
367
|
<span class="cline-any cline-neutral"> </span>
|
|
368
|
+
<span class="cline-any cline-yes">2x</span>
|
|
376
369
|
<span class="cline-any cline-neutral"> </span>
|
|
377
|
-
<span class="cline-any cline-yes">63x</span>
|
|
378
370
|
<span class="cline-any cline-neutral"> </span>
|
|
379
371
|
<span class="cline-any cline-neutral"> </span>
|
|
380
372
|
<span class="cline-any cline-yes">1x</span>
|
|
381
373
|
<span class="cline-any cline-yes">1x</span>
|
|
382
|
-
<span class="cline-any cline-neutral"> </span>
|
|
383
374
|
<span class="cline-any cline-yes">1x</span>
|
|
384
|
-
<span class="cline-any cline-no"> </span>
|
|
385
375
|
<span class="cline-any cline-neutral"> </span>
|
|
386
376
|
<span class="cline-any cline-neutral"> </span>
|
|
377
|
+
<span class="cline-any cline-yes">78x</span>
|
|
387
378
|
<span class="cline-any cline-neutral"> </span>
|
|
388
379
|
<span class="cline-any cline-neutral"> </span>
|
|
380
|
+
<span class="cline-any cline-yes">15x</span>
|
|
381
|
+
<span class="cline-any cline-yes">15x</span>
|
|
389
382
|
<span class="cline-any cline-neutral"> </span>
|
|
383
|
+
<span class="cline-any cline-yes">15x</span>
|
|
384
|
+
<span class="cline-any cline-yes">8x</span>
|
|
390
385
|
<span class="cline-any cline-neutral"> </span>
|
|
391
|
-
<span class="cline-any cline-no"> </span>
|
|
392
|
-
<span class="cline-any cline-no"> </span>
|
|
393
|
-
<span class="cline-any cline-no"> </span>
|
|
394
|
-
<span class="cline-any cline-no"> </span>
|
|
395
|
-
<span class="cline-any cline-no"> </span>
|
|
396
386
|
<span class="cline-any cline-neutral"> </span>
|
|
397
387
|
<span class="cline-any cline-neutral"> </span>
|
|
398
|
-
<span class="cline-any cline-yes">1x</span>
|
|
399
|
-
<span class="cline-any cline-yes">1x</span>
|
|
400
|
-
<span class="cline-any cline-yes">1x</span>
|
|
401
|
-
<span class="cline-any cline-yes">1x</span>
|
|
402
388
|
<span class="cline-any cline-neutral"> </span>
|
|
403
|
-
<span class="cline-any cline-yes">1x</span>
|
|
404
|
-
<span class="cline-any cline-no"> </span>
|
|
405
|
-
<span class="cline-any cline-no"> </span>
|
|
406
389
|
<span class="cline-any cline-neutral"> </span>
|
|
407
390
|
<span class="cline-any cline-neutral"> </span>
|
|
391
|
+
<span class="cline-any cline-yes">8x</span>
|
|
392
|
+
<span class="cline-any cline-yes">7x</span>
|
|
393
|
+
<span class="cline-any cline-yes">5x</span>
|
|
394
|
+
<span class="cline-any cline-yes">4x</span>
|
|
408
395
|
<span class="cline-any cline-yes">1x</span>
|
|
409
|
-
<span class="cline-any cline-
|
|
410
|
-
<span class="cline-any cline-
|
|
411
|
-
<span class="cline-any cline-yes">
|
|
412
|
-
<span class="cline-any cline-yes">
|
|
396
|
+
<span class="cline-any cline-neutral"> </span>
|
|
397
|
+
<span class="cline-any cline-neutral"> </span>
|
|
398
|
+
<span class="cline-any cline-yes">7x</span>
|
|
399
|
+
<span class="cline-any cline-yes">7x</span>
|
|
400
|
+
<span class="cline-any cline-yes">5x</span>
|
|
401
|
+
<span class="cline-any cline-yes">5x</span>
|
|
402
|
+
<span class="cline-any cline-neutral"> </span>
|
|
403
|
+
<span class="cline-any cline-yes">5x</span>
|
|
413
404
|
<span class="cline-any cline-yes">1x</span>
|
|
414
405
|
<span class="cline-any cline-yes">1x</span>
|
|
415
406
|
<span class="cline-any cline-neutral"> </span>
|
|
407
|
+
<span class="cline-any cline-neutral"> </span>
|
|
408
|
+
<span class="cline-any cline-yes">4x</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-yes">4x</span>
|
|
412
|
+
<span class="cline-any cline-yes">4x</span>
|
|
413
|
+
<span class="cline-any cline-yes">4x</span>
|
|
414
|
+
<span class="cline-any cline-yes">4x</span>
|
|
415
|
+
<span class="cline-any cline-neutral"> </span>
|
|
416
416
|
<span class="cline-any cline-no"> </span>
|
|
417
417
|
<span class="cline-any cline-neutral"> </span>
|
|
418
|
-
<span class="cline-any cline-yes">
|
|
418
|
+
<span class="cline-any cline-yes">4x</span>
|
|
419
419
|
<span class="cline-any cline-neutral"> </span>
|
|
420
420
|
<span class="cline-any cline-neutral"> </span>
|
|
421
|
-
<span class="cline-any cline-
|
|
421
|
+
<span class="cline-any cline-yes">2x</span>
|
|
422
422
|
<span class="cline-any cline-neutral"> </span>
|
|
423
423
|
<span class="cline-any cline-neutral"> </span>
|
|
424
424
|
<span class="cline-any cline-neutral"> </span>
|
|
425
425
|
<span class="cline-any cline-neutral"> </span>
|
|
426
|
-
<span class="cline-any cline-
|
|
427
|
-
<span class="cline-any cline-
|
|
428
|
-
<span class="cline-any cline-
|
|
426
|
+
<span class="cline-any cline-yes">2x</span>
|
|
427
|
+
<span class="cline-any cline-yes">2x</span>
|
|
428
|
+
<span class="cline-any cline-yes">1x</span>
|
|
429
429
|
<span class="cline-any cline-neutral"> </span>
|
|
430
430
|
<span class="cline-any cline-neutral"> </span>
|
|
431
431
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -461,85 +461,85 @@ export interface LoopCommandOptions {
|
|
|
461
461
|
export function registerLoopCommand(options: LoopCommandOptions): void {
|
|
462
462
|
const { pi, getStore, getTriggerSystem, updateWidget } = options;
|
|
463
463
|
|
|
464
|
-
async function
|
|
465
|
-
const p =
|
|
466
|
-
<span class="
|
|
464
|
+
async function scheduleLoop(ui: ExtensionUIContext, prompt?: string) {
|
|
465
|
+
const p = prompt || await ui.input("Prompt (what should the agent check?)");
|
|
466
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!p) <span class="cstat-no" title="statement not covered" >return;</span>
|
|
467
467
|
|
|
468
|
-
const interval =
|
|
469
|
-
<span class="
|
|
468
|
+
const interval = await ui.input("Interval (e.g., 5m, 2h, 1d)");
|
|
469
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!interval) <span class="cstat-no" title="statement not covered" >return;</span>
|
|
470
470
|
|
|
471
|
-
|
|
472
|
-
const
|
|
473
|
-
const trigger: Trigger =
|
|
474
|
-
const entry =
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
471
|
+
try {
|
|
472
|
+
const parsed = parseInterval(interval);
|
|
473
|
+
const trigger: Trigger = { type: "cron", schedule: parsed.cron };
|
|
474
|
+
const entry = getStore().create(trigger, p, { recurring: true });
|
|
475
|
+
getTriggerSystem().add(entry);
|
|
476
|
+
updateWidget();
|
|
477
|
+
ui.notify(`Loop #${entry.id} created: every ${parsed.description}`, "info");
|
|
478
478
|
} catch (err: unknown) {
|
|
479
|
-
|
|
479
|
+
ui.notify((err as Error).message, "error");
|
|
480
480
|
}
|
|
481
481
|
}
|
|
482
482
|
|
|
483
|
-
async function
|
|
484
|
-
const p =
|
|
485
|
-
<span class="
|
|
483
|
+
async function eventLoop(ui: ExtensionUIContext, prompt?: string) {
|
|
484
|
+
const p = prompt || await ui.input("Prompt");
|
|
485
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!p) <span class="cstat-no" title="statement not covered" >return;</span>
|
|
486
486
|
|
|
487
|
-
const source =
|
|
488
|
-
<span class="
|
|
487
|
+
const source = await ui.input("Pi event source (e.g., tool_execution_start, before_agent_start)");
|
|
488
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!source) <span class="cstat-no" title="statement not covered" >return;</span>
|
|
489
489
|
|
|
490
|
-
const trigger: Trigger =
|
|
491
|
-
const entry =
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
490
|
+
const trigger: Trigger = { type: "event", source };
|
|
491
|
+
const entry = getStore().create(trigger, p, { recurring: true });
|
|
492
|
+
getTriggerSystem().add(entry);
|
|
493
|
+
updateWidget();
|
|
494
|
+
ui.notify(`Event loop #${entry.id} created: fires on "${source}"`, "info");
|
|
495
495
|
}
|
|
496
496
|
|
|
497
|
-
async function
|
|
498
|
-
const loops =
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
497
|
+
async function viewLoops(ui: ExtensionUIContext) {
|
|
498
|
+
const loops = getStore().list();
|
|
499
|
+
if (loops.length === 0) {
|
|
500
|
+
await ui.select("No loops configured", ["< Back"]);
|
|
501
|
+
return;
|
|
502
502
|
}
|
|
503
503
|
|
|
504
|
-
const choices =
|
|
505
|
-
const icon =
|
|
506
|
-
const triggerDesc =
|
|
504
|
+
const choices = loops.map((l) => {
|
|
505
|
+
const icon = l.status === "active" ? "*" : l.status === "paused" ? "-" : <span class="branch-1 cbranch-no" title="branch not covered" >"x";</span>
|
|
506
|
+
const triggerDesc = l.trigger.type === "cron"
|
|
507
507
|
? `cron: ${l.trigger.schedule}`
|
|
508
|
-
: l.trigger.type === "event"
|
|
508
|
+
: <span class="branch-1 cbranch-no" title="branch not covered" >l.trigger.type === "event"</span>
|
|
509
509
|
? `event: ${l.trigger.source}`
|
|
510
510
|
: `hybrid: ${l.trigger.cron}`;
|
|
511
|
-
|
|
511
|
+
return `${icon} #${l.id} [${l.status}] ${l.prompt.slice(0, 50)} (${triggerDesc})`;
|
|
512
512
|
});
|
|
513
|
-
|
|
513
|
+
choices.push("< Back");
|
|
514
514
|
|
|
515
|
-
const selected =
|
|
516
|
-
|
|
515
|
+
const selected = await ui.select("Loops", choices);
|
|
516
|
+
if (!selected || selected === "< Back") return;
|
|
517
517
|
|
|
518
|
-
const match =
|
|
519
|
-
<span class="
|
|
520
|
-
const entry =
|
|
521
|
-
<span class="
|
|
522
|
-
const actions =
|
|
523
|
-
|
|
524
|
-
else <span class="cstat-no" title="statement not covered" >if (entry.status === "paused") <span class="cstat-no" title="statement not covered" >actions.unshift("* Resume");</span></span>
|
|
525
|
-
|
|
518
|
+
const match = selected.match(/#(\d+)/);
|
|
519
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (match?.[1]) {
|
|
520
|
+
const entry = getStore().get(match[1]);
|
|
521
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (entry) {
|
|
522
|
+
const actions = ["x Delete"];
|
|
523
|
+
if (entry.status === "active") actions.unshift("- Pause");
|
|
524
|
+
else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="else path not taken" >E</span>if (entry.status === "paused") <span class="cstat-no" title="statement not covered" >actions.unshift("* Resume");</span></span>
|
|
525
|
+
actions.push("< Back");
|
|
526
526
|
|
|
527
|
-
const action =
|
|
527
|
+
const action = await ui.select(
|
|
528
528
|
`#${entry.id}: ${entry.prompt}\nTrigger: ${JSON.stringify(entry.trigger)}`,
|
|
529
529
|
actions,
|
|
530
530
|
);
|
|
531
531
|
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
} else
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
} else <span class="cstat-no" title="statement not covered" >if (action === "* Resume") {</span>
|
|
532
|
+
if (action === "x Delete") {
|
|
533
|
+
getTriggerSystem().remove(entry.id);
|
|
534
|
+
getStore().delete(entry.id);
|
|
535
|
+
updateWidget();
|
|
536
|
+
ui.notify(`Loop #${entry.id} deleted`, "info");
|
|
537
|
+
} else if (action === "- Pause") {
|
|
538
|
+
getStore().pause(entry.id);
|
|
539
|
+
getTriggerSystem().remove(entry.id);
|
|
540
|
+
updateWidget();
|
|
541
|
+
ui.notify(`Loop #${entry.id} paused`, "info");
|
|
542
|
+
} else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="else path not taken" >E</span>if (action === "* Resume") {</span>
|
|
543
543
|
<span class="cstat-no" title="statement not covered" > getStore().resume(entry.id);</span>
|
|
544
544
|
<span class="cstat-no" title="statement not covered" > getTriggerSystem().add(entry);</span>
|
|
545
545
|
<span class="cstat-no" title="statement not covered" > updateWidget();</span>
|
|
@@ -548,13 +548,13 @@ export function registerLoopCommand(options: LoopCommandOptions): void {
|
|
|
548
548
|
}
|
|
549
549
|
}
|
|
550
550
|
|
|
551
|
-
|
|
551
|
+
return viewLoops(ui);
|
|
552
552
|
}
|
|
553
553
|
|
|
554
|
-
async function
|
|
555
|
-
const loops =
|
|
556
|
-
const active =
|
|
557
|
-
|
|
554
|
+
async function settings(ui: ExtensionUIContext) {
|
|
555
|
+
const loops = getStore().list();
|
|
556
|
+
const active = loops.<span class="fstat-no" title="function not covered" >filter((l</span>) => <span class="cstat-no" title="statement not covered" >l.status === "active")</span>.length;
|
|
557
|
+
ui.notify(`${active}/${loops.length} active loops (max 25)`, "info");
|
|
558
558
|
}
|
|
559
559
|
|
|
560
560
|
pi.registerCommand("loop", {
|
|
@@ -563,29 +563,29 @@ export function registerLoopCommand(options: LoopCommandOptions): void {
|
|
|
563
563
|
const trimmed = args.trim();
|
|
564
564
|
const ui = ctx.ui;
|
|
565
565
|
|
|
566
|
-
|
|
567
|
-
const choice =
|
|
566
|
+
if (!trimmed) {
|
|
567
|
+
const choice = await ui.select("Loop", [
|
|
568
568
|
"Create scheduled loop",
|
|
569
569
|
"Create event-triggered loop",
|
|
570
570
|
"View loops",
|
|
571
571
|
"Settings",
|
|
572
572
|
]);
|
|
573
573
|
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
574
|
+
if (!choice) return;
|
|
575
|
+
if (choice.startsWith("Create scheduled")) return scheduleLoop(ui);
|
|
576
|
+
if (choice.startsWith("Create event")) return eventLoop(ui);
|
|
577
|
+
if (choice.startsWith("View loops")) return viewLoops(ui);
|
|
578
|
+
return settings(ui);
|
|
579
579
|
}
|
|
580
580
|
|
|
581
581
|
const intervalMatch = trimmed.match(/^(\d+\s*[smhdS]\b)/i);
|
|
582
|
-
|
|
583
|
-
const interval = intervalMatch[1]
|
|
582
|
+
if (intervalMatch) {
|
|
583
|
+
const interval = intervalMatch[1] ?? <span class="branch-1 cbranch-no" title="branch not covered" >intervalMatch[0];</span>
|
|
584
584
|
const prompt = trimmed.slice(intervalMatch[0].length).trim();
|
|
585
585
|
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
586
|
+
if (!prompt) {
|
|
587
|
+
ui.notify("Provide a prompt after the interval, e.g., /loop 5m check the deploy", "warning");
|
|
588
|
+
return;
|
|
589
589
|
}
|
|
590
590
|
|
|
591
591
|
try {
|
|
@@ -601,14 +601,14 @@ export function registerLoopCommand(options: LoopCommandOptions): void {
|
|
|
601
601
|
return;
|
|
602
602
|
}
|
|
603
603
|
|
|
604
|
-
const choice =
|
|
604
|
+
const choice = await ui.select("Loop mode", [
|
|
605
605
|
`Scheduled: "${trimmed.slice(0, 50)}"`,
|
|
606
606
|
`Event-triggered: "${trimmed.slice(0, 50)}"`,
|
|
607
607
|
]);
|
|
608
608
|
|
|
609
|
-
<span class="
|
|
610
|
-
|
|
611
|
-
|
|
609
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!choice) <span class="cstat-no" title="statement not covered" >return;</span>
|
|
610
|
+
if (choice.startsWith("Event")) return eventLoop(ui, trimmed);
|
|
611
|
+
return scheduleLoop(ui, trimmed);
|
|
612
612
|
},
|
|
613
613
|
});
|
|
614
614
|
}
|
|
@@ -619,7 +619,7 @@ export function registerLoopCommand(options: LoopCommandOptions): void {
|
|
|
619
619
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
620
620
|
Code coverage generated by
|
|
621
621
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
622
|
-
at 2026-
|
|
622
|
+
at 2026-07-02T19:31:50.067Z
|
|
623
623
|
</div>
|
|
624
624
|
<script src="../../prettify.js"></script>
|
|
625
625
|
<script>
|