@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,9 +23,9 @@
|
|
|
23
23
|
<div class='clearfix'>
|
|
24
24
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">83.
|
|
26
|
+
<span class="strong">83.69% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>77/92</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'>
|
|
42
|
+
<span class='fraction'>7/7</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">85.
|
|
47
|
+
<span class="strong">85.18% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>69/81</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -365,10 +365,7 @@
|
|
|
365
365
|
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
366
|
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
367
|
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
-
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
-
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
-
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
-
<a name='L306'></a><a href='#L306'>306</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
368
|
+
<a name='L303'></a><a href='#L303'>303</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
372
369
|
<span class="cline-any cline-neutral"> </span>
|
|
373
370
|
<span class="cline-any cline-neutral"> </span>
|
|
374
371
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -417,9 +414,6 @@
|
|
|
417
414
|
<span class="cline-any cline-neutral"> </span>
|
|
418
415
|
<span class="cline-any cline-neutral"> </span>
|
|
419
416
|
<span class="cline-any cline-neutral"> </span>
|
|
420
|
-
<span class="cline-any cline-yes">55x</span>
|
|
421
|
-
<span class="cline-any cline-neutral"> </span>
|
|
422
|
-
<span class="cline-any cline-neutral"> </span>
|
|
423
417
|
<span class="cline-any cline-neutral"> </span>
|
|
424
418
|
<span class="cline-any cline-yes">28x</span>
|
|
425
419
|
<span class="cline-any cline-yes">13x</span>
|
|
@@ -465,9 +459,9 @@
|
|
|
465
459
|
<span class="cline-any cline-neutral"> </span>
|
|
466
460
|
<span class="cline-any cline-neutral"> </span>
|
|
467
461
|
<span class="cline-any cline-neutral"> </span>
|
|
468
|
-
<span class="cline-any cline-yes">
|
|
462
|
+
<span class="cline-any cline-yes">78x</span>
|
|
469
463
|
<span class="cline-any cline-neutral"> </span>
|
|
470
|
-
<span class="cline-any cline-yes">
|
|
464
|
+
<span class="cline-any cline-yes">78x</span>
|
|
471
465
|
<span class="cline-any cline-neutral"> </span>
|
|
472
466
|
<span class="cline-any cline-neutral"> </span>
|
|
473
467
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -608,7 +602,7 @@
|
|
|
608
602
|
<span class="cline-any cline-neutral"> </span>
|
|
609
603
|
<span class="cline-any cline-neutral"> </span>
|
|
610
604
|
<span class="cline-any cline-neutral"> </span>
|
|
611
|
-
<span class="cline-any cline-yes">
|
|
605
|
+
<span class="cline-any cline-yes">78x</span>
|
|
612
606
|
<span class="cline-any cline-neutral"> </span>
|
|
613
607
|
<span class="cline-any cline-neutral"> </span>
|
|
614
608
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -644,7 +638,7 @@
|
|
|
644
638
|
<span class="cline-any cline-neutral"> </span>
|
|
645
639
|
<span class="cline-any cline-neutral"> </span>
|
|
646
640
|
<span class="cline-any cline-neutral"> </span>
|
|
647
|
-
<span class="cline-any cline-yes">
|
|
641
|
+
<span class="cline-any cline-yes">78x</span>
|
|
648
642
|
<span class="cline-any cline-neutral"> </span>
|
|
649
643
|
<span class="cline-any cline-neutral"> </span>
|
|
650
644
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -677,6 +671,7 @@
|
|
|
677
671
|
import { Type } from "typebox";
|
|
678
672
|
import { parseInterval } from "../loop-parse.js";
|
|
679
673
|
import type { LoopEntry, Trigger } from "../types.js";
|
|
674
|
+
import { textResult } from "./tool-result.js";
|
|
680
675
|
|
|
681
676
|
interface LoopStoreLike {
|
|
682
677
|
list(): LoopEntry[];
|
|
@@ -721,10 +716,6 @@ export interface LoopToolsOptions {
|
|
|
721
716
|
isTaskSystemReady: () => boolean;
|
|
722
717
|
}
|
|
723
718
|
|
|
724
|
-
function textResult(msg: string) {
|
|
725
|
-
return { content: [{ type: "text" as const, text: msg }], details: undefined as any };
|
|
726
|
-
}
|
|
727
|
-
|
|
728
719
|
function validateTrigger(trigger: Trigger): string | null {
|
|
729
720
|
if (trigger.type === "cron") {
|
|
730
721
|
const parts = trigger.schedule.trim().split(/\s+/);
|
|
@@ -985,7 +976,7 @@ Use "pause" to temporarily stop a loop without removing it. Use "delete" to perm
|
|
|
985
976
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
986
977
|
Code coverage generated by
|
|
987
978
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
988
|
-
at 2026-
|
|
979
|
+
at 2026-07-02T19:31:50.067Z
|
|
989
980
|
</div>
|
|
990
981
|
<script src="../../prettify.js"></script>
|
|
991
982
|
<script>
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
<div class='clearfix'>
|
|
24
24
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">93.
|
|
26
|
+
<span class="strong">93.02% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>40/43</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'>
|
|
42
|
+
<span class='fraction'>6/6</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">94.
|
|
47
|
+
<span class="strong">94.59% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>35/37</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -214,10 +214,7 @@
|
|
|
214
214
|
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
215
|
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
216
|
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
-
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
-
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
-
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
-
<a name='L155'></a><a href='#L155'>155</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
221
218
|
<span class="cline-any cline-neutral"> </span>
|
|
222
219
|
<span class="cline-any cline-neutral"> </span>
|
|
223
220
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -246,9 +243,6 @@
|
|
|
246
243
|
<span class="cline-any cline-neutral"> </span>
|
|
247
244
|
<span class="cline-any cline-neutral"> </span>
|
|
248
245
|
<span class="cline-any cline-neutral"> </span>
|
|
249
|
-
<span class="cline-any cline-yes">25x</span>
|
|
250
|
-
<span class="cline-any cline-neutral"> </span>
|
|
251
|
-
<span class="cline-any cline-neutral"> </span>
|
|
252
246
|
<span class="cline-any cline-neutral"> </span>
|
|
253
247
|
<span class="cline-any cline-yes">4x</span>
|
|
254
248
|
<span class="cline-any cline-no"> </span>
|
|
@@ -256,9 +250,9 @@
|
|
|
256
250
|
<span class="cline-any cline-neutral"> </span>
|
|
257
251
|
<span class="cline-any cline-neutral"> </span>
|
|
258
252
|
<span class="cline-any cline-neutral"> </span>
|
|
259
|
-
<span class="cline-any cline-yes">
|
|
253
|
+
<span class="cline-any cline-yes">72x</span>
|
|
260
254
|
<span class="cline-any cline-neutral"> </span>
|
|
261
|
-
<span class="cline-any cline-yes">
|
|
255
|
+
<span class="cline-any cline-yes">72x</span>
|
|
262
256
|
<span class="cline-any cline-neutral"> </span>
|
|
263
257
|
<span class="cline-any cline-neutral"> </span>
|
|
264
258
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -324,7 +318,7 @@
|
|
|
324
318
|
<span class="cline-any cline-neutral"> </span>
|
|
325
319
|
<span class="cline-any cline-neutral"> </span>
|
|
326
320
|
<span class="cline-any cline-neutral"> </span>
|
|
327
|
-
<span class="cline-any cline-yes">
|
|
321
|
+
<span class="cline-any cline-yes">72x</span>
|
|
328
322
|
<span class="cline-any cline-neutral"> </span>
|
|
329
323
|
<span class="cline-any cline-neutral"> </span>
|
|
330
324
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -354,7 +348,7 @@
|
|
|
354
348
|
<span class="cline-any cline-neutral"> </span>
|
|
355
349
|
<span class="cline-any cline-neutral"> </span>
|
|
356
350
|
<span class="cline-any cline-neutral"> </span>
|
|
357
|
-
<span class="cline-any cline-yes">
|
|
351
|
+
<span class="cline-any cline-yes">72x</span>
|
|
358
352
|
<span class="cline-any cline-neutral"> </span>
|
|
359
353
|
<span class="cline-any cline-neutral"> </span>
|
|
360
354
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -374,6 +368,7 @@
|
|
|
374
368
|
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
375
369
|
import { Type } from "typebox";
|
|
376
370
|
import type { LoopEntry, MonitorEntry, Trigger } from "../types.js";
|
|
371
|
+
import { textResult } from "./tool-result.js";
|
|
377
372
|
|
|
378
373
|
interface MonitorManagerLike {
|
|
379
374
|
list(): MonitorEntry[];
|
|
@@ -399,10 +394,6 @@ export interface MonitorToolsOptions {
|
|
|
399
394
|
handleMonitorDoneLoop: (doneLoop: LoopEntry, monitorId: string) => void;
|
|
400
395
|
}
|
|
401
396
|
|
|
402
|
-
function textResult(msg: string) {
|
|
403
|
-
return { content: [{ type: "text" as const, text: msg }], details: undefined as any };
|
|
404
|
-
}
|
|
405
|
-
|
|
406
397
|
function formatRemaining(ms: number): string {
|
|
407
398
|
<span class="missing-if-branch" title="else path not taken" >E</span>if (ms < 60000) return `${Math.round(ms / 1000)}s`;
|
|
408
399
|
<span class="cstat-no" title="statement not covered" > if (ms < 3600000) <span class="cstat-no" title="statement not covered" >return `${Math.round(ms / 60000)}m`;</span></span>
|
|
@@ -532,7 +523,7 @@ Use MonitorList to find the monitor ID, then stop it with this tool.`,
|
|
|
532
523
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
533
524
|
Code coverage generated by
|
|
534
525
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
535
|
-
at 2026-
|
|
526
|
+
at 2026-07-02T19:31:50.067Z
|
|
536
527
|
</div>
|
|
537
528
|
<script src="../../prettify.js"></script>
|
|
538
529
|
<script>
|
|
@@ -25,14 +25,14 @@
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
26
|
<span class="strong">100% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>30/30</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">100% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>16/16</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
@@ -46,7 +46,7 @@
|
|
|
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'>
|
|
49
|
+
<span class='fraction'>27/27</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -199,28 +199,14 @@
|
|
|
199
199
|
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
200
|
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
201
|
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
-
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
-
<
|
|
204
|
-
<
|
|
205
|
-
<
|
|
206
|
-
<
|
|
207
|
-
<
|
|
208
|
-
<
|
|
209
|
-
<
|
|
210
|
-
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
-
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
-
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
-
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
-
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
-
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
-
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
-
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
-
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
-
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
-
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
-
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
-
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
-
<a name='L158'></a><a href='#L158'>158</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
203
|
+
<span class="cline-any cline-neutral"> </span>
|
|
204
|
+
<span class="cline-any cline-neutral"> </span>
|
|
205
|
+
<span class="cline-any cline-neutral"> </span>
|
|
206
|
+
<span class="cline-any cline-neutral"> </span>
|
|
207
|
+
<span class="cline-any cline-neutral"> </span>
|
|
208
|
+
<span class="cline-any cline-neutral"> </span>
|
|
209
|
+
<span class="cline-any cline-neutral"> </span>
|
|
224
210
|
<span class="cline-any cline-neutral"> </span>
|
|
225
211
|
<span class="cline-any cline-neutral"> </span>
|
|
226
212
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -236,15 +222,16 @@
|
|
|
236
222
|
<span class="cline-any cline-neutral"> </span>
|
|
237
223
|
<span class="cline-any cline-neutral"> </span>
|
|
238
224
|
<span class="cline-any cline-neutral"> </span>
|
|
225
|
+
<span class="cline-any cline-yes">74x</span>
|
|
239
226
|
<span class="cline-any cline-neutral"> </span>
|
|
240
227
|
<span class="cline-any cline-neutral"> </span>
|
|
241
|
-
<span class="cline-any cline-yes">82x</span>
|
|
242
228
|
<span class="cline-any cline-neutral"> </span>
|
|
243
229
|
<span class="cline-any cline-neutral"> </span>
|
|
244
230
|
<span class="cline-any cline-neutral"> </span>
|
|
245
|
-
<span class="cline-any cline-yes">
|
|
231
|
+
<span class="cline-any cline-yes">57x</span>
|
|
232
|
+
<span class="cline-any cline-yes">57x</span>
|
|
246
233
|
<span class="cline-any cline-neutral"> </span>
|
|
247
|
-
<span class="cline-any cline-yes">
|
|
234
|
+
<span class="cline-any cline-yes">57x</span>
|
|
248
235
|
<span class="cline-any cline-neutral"> </span>
|
|
249
236
|
<span class="cline-any cline-neutral"> </span>
|
|
250
237
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -269,19 +256,15 @@
|
|
|
269
256
|
<span class="cline-any cline-neutral"> </span>
|
|
270
257
|
<span class="cline-any cline-neutral"> </span>
|
|
271
258
|
<span class="cline-any cline-neutral"> </span>
|
|
272
|
-
<span class="cline-any cline-yes">
|
|
273
|
-
<span class="cline-any cline-yes">42x</span>
|
|
274
|
-
<span class="cline-any cline-yes">42x</span>
|
|
275
|
-
<span class="cline-any cline-yes">42x</span>
|
|
259
|
+
<span class="cline-any cline-yes">43x</span>
|
|
276
260
|
<span class="cline-any cline-neutral"> </span>
|
|
277
|
-
<span class="cline-any cline-yes">42x</span>
|
|
278
261
|
<span class="cline-any cline-neutral"> </span>
|
|
279
262
|
<span class="cline-any cline-neutral"> </span>
|
|
280
|
-
<span class="cline-any cline-yes">
|
|
263
|
+
<span class="cline-any cline-yes">43x</span>
|
|
281
264
|
<span class="cline-any cline-neutral"> </span>
|
|
282
265
|
<span class="cline-any cline-neutral"> </span>
|
|
283
266
|
<span class="cline-any cline-neutral"> </span>
|
|
284
|
-
<span class="cline-any cline-yes">
|
|
267
|
+
<span class="cline-any cline-yes">57x</span>
|
|
285
268
|
<span class="cline-any cline-neutral"> </span>
|
|
286
269
|
<span class="cline-any cline-neutral"> </span>
|
|
287
270
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -306,7 +289,7 @@
|
|
|
306
289
|
<span class="cline-any cline-neutral"> </span>
|
|
307
290
|
<span class="cline-any cline-neutral"> </span>
|
|
308
291
|
<span class="cline-any cline-neutral"> </span>
|
|
309
|
-
<span class="cline-any cline-yes">
|
|
292
|
+
<span class="cline-any cline-yes">57x</span>
|
|
310
293
|
<span class="cline-any cline-neutral"> </span>
|
|
311
294
|
<span class="cline-any cline-neutral"> </span>
|
|
312
295
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -325,39 +308,20 @@
|
|
|
325
308
|
<span class="cline-any cline-neutral"> </span>
|
|
326
309
|
<span class="cline-any cline-neutral"> </span>
|
|
327
310
|
<span class="cline-any cline-neutral"> </span>
|
|
328
|
-
<span class="cline-any cline-yes">
|
|
329
|
-
<span class="cline-any cline-yes">
|
|
330
|
-
<span class="cline-any cline-yes">31x</span>
|
|
311
|
+
<span class="cline-any cline-yes">32x</span>
|
|
312
|
+
<span class="cline-any cline-yes">32x</span>
|
|
331
313
|
<span class="cline-any cline-neutral"> </span>
|
|
332
|
-
<span class="cline-any cline-yes">30x</span>
|
|
333
|
-
<span class="cline-any cline-yes">30x</span>
|
|
334
|
-
<span class="cline-any cline-yes">3x</span>
|
|
335
|
-
<span class="cline-any cline-yes">3x</span>
|
|
336
|
-
<span class="cline-any cline-yes">27x</span>
|
|
337
|
-
<span class="cline-any cline-yes">19x</span>
|
|
338
|
-
<span class="cline-any cline-yes">19x</span>
|
|
339
|
-
<span class="cline-any cline-yes">8x</span>
|
|
340
|
-
<span class="cline-any cline-yes">7x</span>
|
|
341
|
-
<span class="cline-any cline-yes">7x</span>
|
|
342
314
|
<span class="cline-any cline-neutral"> </span>
|
|
343
315
|
<span class="cline-any cline-neutral"> </span>
|
|
344
|
-
<span class="cline-any cline-yes">30x</span>
|
|
345
|
-
<span class="cline-any cline-yes">30x</span>
|
|
346
|
-
<span class="cline-any cline-yes">1x</span>
|
|
347
|
-
<span class="cline-any cline-yes">1x</span>
|
|
348
|
-
<span class="cline-any cline-neutral"> </span>
|
|
349
|
-
<span class="cline-any cline-yes">30x</span>
|
|
350
|
-
<span class="cline-any cline-yes">30x</span>
|
|
351
|
-
<span class="cline-any cline-yes">30x</span>
|
|
352
|
-
<span class="cline-any cline-yes">30x</span>
|
|
353
|
-
<span class="cline-any cline-yes">31x</span>
|
|
354
316
|
<span class="cline-any cline-neutral"> </span>
|
|
355
317
|
<span class="cline-any cline-neutral"> </span>
|
|
318
|
+
<span class="cline-any cline-yes">32x</span>
|
|
356
319
|
<span class="cline-any cline-yes">31x</span>
|
|
320
|
+
<span class="cline-any cline-yes">32x</span>
|
|
357
321
|
<span class="cline-any cline-neutral"> </span>
|
|
358
322
|
<span class="cline-any cline-neutral"> </span>
|
|
359
323
|
<span class="cline-any cline-neutral"> </span>
|
|
360
|
-
<span class="cline-any cline-yes">
|
|
324
|
+
<span class="cline-any cline-yes">57x</span>
|
|
361
325
|
<span class="cline-any cline-neutral"> </span>
|
|
362
326
|
<span class="cline-any cline-neutral"> </span>
|
|
363
327
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -367,25 +331,24 @@
|
|
|
367
331
|
<span class="cline-any cline-neutral"> </span>
|
|
368
332
|
<span class="cline-any cline-yes">2x</span>
|
|
369
333
|
<span class="cline-any cline-yes">2x</span>
|
|
370
|
-
<span class="cline-any cline-yes">2x</span>
|
|
371
|
-
<span class="cline-any cline-yes">2x</span>
|
|
372
|
-
<span class="cline-any cline-yes">1x</span>
|
|
373
|
-
<span class="cline-any cline-yes">1x</span>
|
|
374
|
-
<span class="cline-any cline-yes">1x</span>
|
|
375
|
-
<span class="cline-any cline-neutral"> </span>
|
|
376
334
|
<span class="cline-any cline-yes">1x</span>
|
|
377
335
|
<span class="cline-any cline-neutral"> </span>
|
|
378
336
|
<span class="cline-any cline-neutral"> </span>
|
|
379
337
|
<span class="cline-any cline-neutral"> </span>
|
|
380
338
|
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
381
339
|
import { Type } from "typebox";
|
|
382
|
-
import {
|
|
340
|
+
import {
|
|
341
|
+
createTask,
|
|
342
|
+
deleteTask,
|
|
343
|
+
type TaskBacklogResult,
|
|
344
|
+
type TaskMutationContext,
|
|
345
|
+
updateTask,
|
|
346
|
+
} from "../runtime/task-mutations.js";
|
|
383
347
|
import { TaskStore } from "../task-store.js";
|
|
348
|
+
import type { TaskStatus } from "../task-types.js";
|
|
349
|
+
import { textResult } from "./tool-result.js";
|
|
384
350
|
|
|
385
|
-
export
|
|
386
|
-
created: boolean;
|
|
387
|
-
entry?: { id: string };
|
|
388
|
-
}
|
|
351
|
+
export type { TaskBacklogResult };
|
|
389
352
|
|
|
390
353
|
export interface NativeTaskToolsOptions {
|
|
391
354
|
pi: ExtensionAPI;
|
|
@@ -394,12 +357,15 @@ export interface NativeTaskToolsOptions {
|
|
|
394
357
|
updateWidget: () => void;
|
|
395
358
|
}
|
|
396
359
|
|
|
397
|
-
function
|
|
398
|
-
return
|
|
360
|
+
function backlogSuffix(backlog: TaskBacklogResult): string {
|
|
361
|
+
return backlog.created && backlog.entry
|
|
362
|
+
? `\nBacklog worker loop #${backlog.entry.id} created`
|
|
363
|
+
: "";
|
|
399
364
|
}
|
|
400
365
|
|
|
401
366
|
export function registerNativeTaskTools(options: NativeTaskToolsOptions): void {
|
|
402
367
|
const { pi, taskStore, evaluateTaskBacklog, updateWidget } = options;
|
|
368
|
+
const mutationCtx: TaskMutationContext = { pi, taskStore, evaluateTaskBacklog, updateWidget };
|
|
403
369
|
|
|
404
370
|
pi.registerTool({
|
|
405
371
|
name: "TaskCreate",
|
|
@@ -426,15 +392,11 @@ Fields:
|
|
|
426
392
|
description: Type.String({ description: "Detailed description of what needs to be done" }),
|
|
427
393
|
}),
|
|
428
394
|
async execute(_toolCallId, params) {
|
|
429
|
-
const entry =
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
const autoLoopMsg = backlog.created && backlog.entry
|
|
435
|
-
? `\nBacklog worker loop #${backlog.entry.id} created`
|
|
436
|
-
: "";
|
|
437
|
-
return Promise.resolve(textResult(`Task #${entry.id} created: ${entry.subject}${autoLoopMsg}`));
|
|
395
|
+
const { entry, backlog } = await createTask(mutationCtx, {
|
|
396
|
+
subject: params.subject,
|
|
397
|
+
description: params.description,
|
|
398
|
+
});
|
|
399
|
+
return textResult(`Task #${entry.id} created: ${entry.subject}${backlogSuffix(backlog)}`);
|
|
438
400
|
},
|
|
439
401
|
});
|
|
440
402
|
|
|
@@ -483,34 +445,15 @@ Parameters: id (required), status, subject, description`,
|
|
|
483
445
|
}),
|
|
484
446
|
async execute(_toolCallId, params) {
|
|
485
447
|
const { id, status, subject, description } = params;
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
} else if (status === "completed") {
|
|
494
|
-
entry = taskStore.complete(id);
|
|
495
|
-
<span class="missing-if-branch" title="else path not taken" >E</span>if (entry) emitNativeTaskEvent(pi, "tasks:completed", entry, previousStatus);
|
|
496
|
-
} else if (status === "pending") {
|
|
497
|
-
entry = taskStore.reopen(id);
|
|
498
|
-
<span class="missing-if-branch" title="else path not taken" >E</span>if (entry) emitNativeTaskEvent(pi, "tasks:reopened", entry, previousStatus);
|
|
499
|
-
}
|
|
500
|
-
|
|
501
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (!entry) return Promise.resolve(textResult(`Task #${id} not found`));
|
|
502
|
-
if (subject !== undefined || description !== undefined) {
|
|
503
|
-
entry = taskStore.updateDetails(id, { subject, description });
|
|
504
|
-
<span class="missing-if-branch" title="else path not taken" >E</span>if (entry) emitNativeTaskEvent(pi, "tasks:updated", entry, previousStatus);
|
|
505
|
-
}
|
|
506
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (!entry) return Promise.resolve(textResult(`Task #${id} not found`));
|
|
507
|
-
updateWidget();
|
|
508
|
-
const backlog = await evaluateTaskBacklog(taskStore, taskStore.pendingCount());
|
|
448
|
+
const result = await updateTask(mutationCtx, {
|
|
449
|
+
id,
|
|
450
|
+
status: status as TaskStatus | undefined,
|
|
451
|
+
subject,
|
|
452
|
+
description,
|
|
453
|
+
});
|
|
454
|
+
if (!result) return textResult(`Task #${id} not found`);
|
|
509
455
|
const statusMsg = status ? ` → ${status}` : "";
|
|
510
|
-
|
|
511
|
-
? `\nBacklog worker loop #${backlog.entry.id} created`
|
|
512
|
-
: "";
|
|
513
|
-
return Promise.resolve(textResult(`Task #${id} updated${statusMsg}${autoLoopMsg}`));
|
|
456
|
+
return textResult(`Task #${id} updated${statusMsg}${backlogSuffix(result.backlog)}`);
|
|
514
457
|
},
|
|
515
458
|
});
|
|
516
459
|
|
|
@@ -522,15 +465,9 @@ Parameters: id (required), status, subject, description`,
|
|
|
522
465
|
id: Type.String({ description: "Task ID to delete" }),
|
|
523
466
|
}),
|
|
524
467
|
async execute(_toolCallId, params) {
|
|
525
|
-
const
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
if (deleted) {
|
|
529
|
-
<span class="missing-if-branch" title="else path not taken" >E</span>if (existing) emitNativeTaskEvent(pi, "tasks:deleted", existing, existing.status);
|
|
530
|
-
await evaluateTaskBacklog(taskStore, taskStore.pendingCount());
|
|
531
|
-
return Promise.resolve(textResult(`Task #${params.id} deleted`));
|
|
532
|
-
}
|
|
533
|
-
return Promise.resolve(textResult(`Task #${params.id} not found`));
|
|
468
|
+
const result = await deleteTask(mutationCtx, params.id);
|
|
469
|
+
if (!result) return textResult(`Task #${params.id} not found`);
|
|
470
|
+
return textResult(`Task #${params.id} deleted`);
|
|
534
471
|
},
|
|
535
472
|
});
|
|
536
473
|
}
|
|
@@ -541,7 +478,7 @@ Parameters: id (required), status, subject, description`,
|
|
|
541
478
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
542
479
|
Code coverage generated by
|
|
543
480
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
544
|
-
at 2026-
|
|
481
|
+
at 2026-07-02T19:31:50.067Z
|
|
545
482
|
</div>
|
|
546
483
|
<script src="../../prettify.js"></script>
|
|
547
484
|
<script>
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for src/tools/tool-result.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/tools</a> tool-result.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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
71
|
+
<span class="cline-any cline-neutral"> </span>
|
|
72
|
+
<span class="cline-any cline-yes">164x</span>
|
|
73
|
+
<span class="cline-any cline-neutral"> </span>
|
|
74
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">/** Plain-text tool result in the shape pi's registerTool expects. */
|
|
75
|
+
export function textResult(msg: string) {
|
|
76
|
+
return { content: [{ type: "text" as const, text: msg }], details: undefined };
|
|
77
|
+
}
|
|
78
|
+
</pre></td></tr></table></pre>
|
|
79
|
+
|
|
80
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
81
|
+
</div><!-- /wrapper -->
|
|
82
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
83
|
+
Code coverage generated by
|
|
84
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
85
|
+
at 2026-07-02T19:31:50.067Z
|
|
86
|
+
</div>
|
|
87
|
+
<script src="../../prettify.js"></script>
|
|
88
|
+
<script>
|
|
89
|
+
window.onload = function () {
|
|
90
|
+
prettyPrint();
|
|
91
|
+
};
|
|
92
|
+
</script>
|
|
93
|
+
<script src="../../sorter.js"></script>
|
|
94
|
+
<script src="../../block-navigation.js"></script>
|
|
95
|
+
</body>
|
|
96
|
+
</html>
|
|
97
|
+
|