@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.
- package/.release-please-manifest.json +3 -0
- package/AGENTS.md +52 -12
- package/CHANGELOG.md +59 -0
- package/CONTRIBUTING.md +13 -3
- package/Dockerfile +17 -0
- package/README.md +47 -0
- package/coverage/coverage-final.json +35 -31
- 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 +135 -135
- package/coverage/src/coordinator.ts.html +26 -26
- package/coverage/src/index.html +61 -106
- package/coverage/src/index.ts.html +280 -94
- package/coverage/src/loop-parse.ts.html +90 -57
- package/coverage/src/loop-reducer.ts.html +25 -25
- 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 +7 -7
- 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 +89 -29
- 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 +14 -14
- package/coverage/src/runtime/scope.ts.html +17 -17
- package/coverage/src/runtime/session-runtime.ts.html +40 -40
- package/coverage/src/runtime/task-backlog-runtime.ts.html +66 -24
- package/coverage/src/runtime/task-events.ts.html +208 -0
- package/coverage/src/runtime/task-mutations.ts.html +394 -0
- package/coverage/src/runtime/task-rpc.ts.html +106 -118
- package/coverage/src/scheduler.ts.html +12 -12
- package/coverage/src/store.ts.html +20 -20
- 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 +52 -94
- 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 +80 -20
- package/dist/loop-parse.js +14 -5
- package/dist/monitor-manager.d.ts +4 -1
- package/dist/monitor-manager.js +5 -3
- 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/docker-compose.yml +12 -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/release-please-config.json +9 -0
- 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 +84 -22
- package/src/loop-parse.ts +18 -7
- package/src/monitor-manager.ts +11 -3
- 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 +11 -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">74.72% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>68/91</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">61.66% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>37/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">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">
|
|
47
|
+
<span class="strong">80.48% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>66/82</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 medium'></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>
|
|
@@ -215,125 +215,126 @@
|
|
|
215
215
|
<span class="cline-any cline-neutral"> </span>
|
|
216
216
|
<span class="cline-any cline-neutral"> </span>
|
|
217
217
|
<span class="cline-any cline-neutral"> </span>
|
|
218
|
-
<span class="cline-any cline-yes">45x</span>
|
|
219
|
-
<span class="cline-any cline-neutral"> </span>
|
|
220
|
-
<span class="cline-any cline-neutral"> </span>
|
|
221
|
-
<span class="cline-any cline-yes">1x</span>
|
|
222
|
-
<span class="cline-any cline-neutral"> </span>
|
|
223
|
-
<span class="cline-any cline-neutral"> </span>
|
|
224
218
|
<span class="cline-any cline-neutral"> </span>
|
|
219
|
+
<span class="cline-any cline-yes">60x</span>
|
|
225
220
|
<span class="cline-any cline-neutral"> </span>
|
|
226
221
|
<span class="cline-any cline-neutral"> </span>
|
|
227
|
-
<span class="cline-any cline-yes">
|
|
228
|
-
<span class="cline-any cline-yes">
|
|
229
|
-
<span class="cline-any cline-yes">
|
|
230
|
-
<span class="cline-any cline-yes">
|
|
231
|
-
<span class="cline-any cline-yes">
|
|
222
|
+
<span class="cline-any cline-yes">7x</span>
|
|
223
|
+
<span class="cline-any cline-yes">7x</span>
|
|
224
|
+
<span class="cline-any cline-yes">7x</span>
|
|
225
|
+
<span class="cline-any cline-yes">7x</span>
|
|
226
|
+
<span class="cline-any cline-yes">7x</span>
|
|
227
|
+
<span class="cline-any cline-yes">7x</span>
|
|
232
228
|
<span class="cline-any cline-neutral"> </span>
|
|
233
229
|
<span class="cline-any cline-neutral"> </span>
|
|
234
230
|
<span class="cline-any cline-neutral"> </span>
|
|
235
|
-
<span class="cline-any cline-
|
|
236
|
-
<span class="cline-any cline-
|
|
231
|
+
<span class="cline-any cline-yes">2x</span>
|
|
232
|
+
<span class="cline-any cline-yes">2x</span>
|
|
237
233
|
<span class="cline-any cline-no"> </span>
|
|
238
234
|
<span class="cline-any cline-no"> </span>
|
|
239
235
|
<span class="cline-any cline-neutral"> </span>
|
|
240
236
|
<span class="cline-any cline-neutral"> </span>
|
|
241
|
-
<span class="cline-any cline-
|
|
242
|
-
<span class="cline-any cline-
|
|
243
|
-
<span class="cline-any cline-
|
|
244
|
-
<span class="cline-any cline-
|
|
245
|
-
<span class="cline-any cline-
|
|
246
|
-
<span class="cline-any cline-
|
|
247
|
-
<span class="cline-any cline-
|
|
237
|
+
<span class="cline-any cline-yes">2x</span>
|
|
238
|
+
<span class="cline-any cline-yes">2x</span>
|
|
239
|
+
<span class="cline-any cline-yes">2x</span>
|
|
240
|
+
<span class="cline-any cline-yes">2x</span>
|
|
241
|
+
<span class="cline-any cline-yes">2x</span>
|
|
242
|
+
<span class="cline-any cline-yes">2x</span>
|
|
243
|
+
<span class="cline-any cline-yes">2x</span>
|
|
248
244
|
<span class="cline-any cline-no"> </span>
|
|
249
245
|
<span class="cline-any cline-neutral"> </span>
|
|
250
246
|
<span class="cline-any cline-neutral"> </span>
|
|
251
247
|
<span class="cline-any cline-neutral"> </span>
|
|
252
248
|
<span class="cline-any cline-neutral"> </span>
|
|
253
|
-
<span class="cline-any cline-
|
|
254
|
-
<span class="cline-any cline-
|
|
249
|
+
<span class="cline-any cline-yes">10x</span>
|
|
250
|
+
<span class="cline-any cline-yes">10x</span>
|
|
255
251
|
<span class="cline-any cline-no"> </span>
|
|
256
252
|
<span class="cline-any cline-no"> </span>
|
|
257
253
|
<span class="cline-any cline-neutral"> </span>
|
|
258
254
|
<span class="cline-any cline-neutral"> </span>
|
|
259
|
-
<span class="cline-any cline-
|
|
260
|
-
<span class="cline-any cline-
|
|
261
|
-
<span class="cline-any cline-
|
|
262
|
-
<span class="cline-any cline-
|
|
255
|
+
<span class="cline-any cline-yes">10x</span>
|
|
256
|
+
<span class="cline-any cline-yes">10x</span>
|
|
257
|
+
<span class="cline-any cline-yes">8x</span>
|
|
258
|
+
<span class="cline-any cline-yes">8x</span>
|
|
263
259
|
<span class="cline-any cline-neutral"> </span>
|
|
264
|
-
<span class="cline-any cline-
|
|
265
|
-
<span class="cline-any cline-
|
|
260
|
+
<span class="cline-any cline-yes">10x</span>
|
|
261
|
+
<span class="cline-any cline-yes">10x</span>
|
|
266
262
|
<span class="cline-any cline-neutral"> </span>
|
|
267
|
-
<span class="cline-any cline-
|
|
268
|
-
<span class="cline-any cline-
|
|
269
|
-
<span class="cline-any cline-
|
|
270
|
-
<span class="cline-any cline-
|
|
271
|
-
<span class="cline-any cline-
|
|
263
|
+
<span class="cline-any cline-yes">10x</span>
|
|
264
|
+
<span class="cline-any cline-yes">10x</span>
|
|
265
|
+
<span class="cline-any cline-yes">4x</span>
|
|
266
|
+
<span class="cline-any cline-yes">2x</span>
|
|
267
|
+
<span class="cline-any cline-yes">2x</span>
|
|
272
268
|
<span class="cline-any cline-neutral"> </span>
|
|
273
269
|
<span class="cline-any cline-neutral"> </span>
|
|
274
|
-
<span class="cline-any cline-
|
|
275
|
-
<span class="cline-any cline-
|
|
270
|
+
<span class="cline-any cline-yes">2x</span>
|
|
271
|
+
<span class="cline-any cline-yes">10x</span>
|
|
276
272
|
<span class="cline-any cline-neutral"> </span>
|
|
277
|
-
<span class="cline-any cline-
|
|
278
|
-
<span class="cline-any cline-
|
|
273
|
+
<span class="cline-any cline-yes">2x</span>
|
|
274
|
+
<span class="cline-any cline-yes">2x</span>
|
|
279
275
|
<span class="cline-any cline-neutral"> </span>
|
|
280
|
-
<span class="cline-any cline-
|
|
281
|
-
<span class="cline-any cline-
|
|
282
|
-
<span class="cline-any cline-
|
|
283
|
-
<span class="cline-any cline-
|
|
276
|
+
<span class="cline-any cline-yes">2x</span>
|
|
277
|
+
<span class="cline-any cline-yes">2x</span>
|
|
278
|
+
<span class="cline-any cline-yes">2x</span>
|
|
279
|
+
<span class="cline-any cline-yes">2x</span>
|
|
284
280
|
<span class="cline-any cline-no"> </span>
|
|
285
281
|
<span class="cline-any cline-no"> </span>
|
|
286
282
|
<span class="cline-any cline-no"> </span>
|
|
287
283
|
<span class="cline-any cline-neutral"> </span>
|
|
288
284
|
<span class="cline-any cline-no"> </span>
|
|
289
285
|
<span class="cline-any cline-neutral"> </span>
|
|
290
|
-
<span class="cline-any cline-
|
|
286
|
+
<span class="cline-any cline-yes">2x</span>
|
|
291
287
|
<span class="cline-any cline-neutral"> </span>
|
|
292
|
-
<span class="cline-any cline-
|
|
293
|
-
<span class="cline-any cline-
|
|
288
|
+
<span class="cline-any cline-yes">2x</span>
|
|
289
|
+
<span class="cline-any cline-yes">2x</span>
|
|
294
290
|
<span class="cline-any cline-neutral"> </span>
|
|
291
|
+
<span class="cline-any cline-yes">2x</span>
|
|
292
|
+
<span class="cline-any cline-yes">1x</span>
|
|
293
|
+
<span class="cline-any cline-yes">1x</span>
|
|
294
|
+
<span class="cline-any cline-yes">1x</span>
|
|
295
|
+
<span class="cline-any cline-yes">1x</span>
|
|
295
296
|
<span class="cline-any cline-no"> </span>
|
|
296
297
|
<span class="cline-any cline-no"> </span>
|
|
297
298
|
<span class="cline-any cline-no"> </span>
|
|
298
|
-
<span class="cline-any cline-
|
|
299
|
-
<span class="cline-any cline-
|
|
300
|
-
<span class="cline-any cline-
|
|
301
|
-
<span class="cline-any cline-
|
|
302
|
-
<span class="cline-any cline-no"> </span>
|
|
299
|
+
<span class="cline-any cline-yes">1x</span>
|
|
300
|
+
<span class="cline-any cline-yes">1x</span>
|
|
301
|
+
<span class="cline-any cline-yes">1x</span>
|
|
302
|
+
<span class="cline-any cline-yes">1x</span>
|
|
303
303
|
<span class="cline-any cline-no"> </span>
|
|
304
304
|
<span class="cline-any cline-no"> </span>
|
|
305
305
|
<span class="cline-any cline-no"> </span>
|
|
306
306
|
<span class="cline-any cline-no"> </span>
|
|
307
307
|
<span class="cline-any cline-neutral"> </span>
|
|
308
308
|
<span class="cline-any cline-neutral"> </span>
|
|
309
|
-
<span class="cline-any cline-
|
|
310
|
-
<span class="cline-any cline-
|
|
311
|
-
<span class="cline-any cline-
|
|
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
|
-
<span class="cline-any cline-yes">
|
|
314
|
+
<span class="cline-any cline-yes">60x</span>
|
|
315
315
|
<span class="cline-any cline-neutral"> </span>
|
|
316
316
|
<span class="cline-any cline-neutral"> </span>
|
|
317
|
+
<span class="cline-any cline-yes">12x</span>
|
|
318
|
+
<span class="cline-any cline-yes">12x</span>
|
|
319
|
+
<span class="cline-any cline-yes">12x</span>
|
|
317
320
|
<span class="cline-any cline-yes">1x</span>
|
|
318
321
|
<span class="cline-any cline-yes">1x</span>
|
|
319
|
-
<span class="cline-any cline-yes">1x</span>
|
|
320
|
-
<span class="cline-any cline-no"> </span>
|
|
321
|
-
<span class="cline-any cline-no"> </span>
|
|
322
322
|
<span class="cline-any cline-neutral"> </span>
|
|
323
|
+
<span class="cline-any cline-yes">11x</span>
|
|
324
|
+
<span class="cline-any cline-yes">5x</span>
|
|
325
|
+
<span class="cline-any cline-yes">5x</span>
|
|
326
|
+
<span class="cline-any cline-yes">5x</span>
|
|
327
|
+
<span class="cline-any cline-yes">5x</span>
|
|
323
328
|
<span class="cline-any cline-yes">1x</span>
|
|
324
|
-
<span class="cline-any cline-yes">1x</span>
|
|
325
|
-
<span class="cline-any cline-yes">1x</span>
|
|
326
|
-
<span class="cline-any cline-yes">1x</span>
|
|
327
|
-
<span class="cline-any cline-yes">1x</span>
|
|
328
|
-
<span class="cline-any cline-no"> </span>
|
|
329
329
|
<span class="cline-any cline-neutral"> </span>
|
|
330
|
-
<span class="cline-any cline-yes">
|
|
330
|
+
<span class="cline-any cline-yes">5x</span>
|
|
331
331
|
<span class="cline-any cline-neutral"> </span>
|
|
332
|
-
<span class="cline-any cline-
|
|
332
|
+
<span class="cline-any cline-yes">6x</span>
|
|
333
333
|
<span class="cline-any cline-neutral"> </span>
|
|
334
334
|
<span class="cline-any cline-neutral"> </span>
|
|
335
335
|
<span class="cline-any cline-neutral"> </span>
|
|
336
336
|
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import type { ExtensionAPI, ExtensionCommandContext, ExtensionUIContext } from "@earendil-works/pi-coding-agent";
|
|
337
|
+
import { emitNativeTaskEvent } from "../runtime/task-events.js";
|
|
337
338
|
import { TaskStore } from "../task-store.js";
|
|
338
339
|
import type { TaskEntry } from "../task-types.js";
|
|
339
340
|
|
|
@@ -353,12 +354,7 @@ export function registerTasksCommand(options: TasksCommandOptions): void {
|
|
|
353
354
|
const { pi, getNativeTaskStore, evaluateTaskBacklog, updateWidget } = options;
|
|
354
355
|
|
|
355
356
|
async function emitCreated(entry: TaskEntry) {
|
|
356
|
-
pi
|
|
357
|
-
taskId: entry.id,
|
|
358
|
-
subject: entry.subject,
|
|
359
|
-
description: entry.description,
|
|
360
|
-
status: entry.status,
|
|
361
|
-
});
|
|
357
|
+
emitNativeTaskEvent(pi, "tasks:created", entry);
|
|
362
358
|
const taskStore = getNativeTaskStore();
|
|
363
359
|
<span class="missing-if-branch" title="if path not taken" >I</span>if (!taskStore) <span class="cstat-no" title="statement not covered" >return { created: false } satisfies TaskBacklogResult;</span>
|
|
364
360
|
const backlog = await evaluateTaskBacklog(taskStore, taskStore.pendingCount());
|
|
@@ -366,84 +362,88 @@ export function registerTasksCommand(options: TasksCommandOptions): void {
|
|
|
366
362
|
return backlog;
|
|
367
363
|
}
|
|
368
364
|
|
|
369
|
-
async function
|
|
370
|
-
const taskStore =
|
|
371
|
-
<span class="
|
|
365
|
+
async function createNativeTaskInteractively(ui: ExtensionUIContext) {
|
|
366
|
+
const taskStore = getNativeTaskStore();
|
|
367
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!taskStore) {
|
|
372
368
|
<span class="cstat-no" title="statement not covered" > ui.notify("Native tasks are unavailable while pi-tasks is active", "warning");</span>
|
|
373
369
|
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
374
370
|
}
|
|
375
371
|
|
|
376
|
-
const subject =
|
|
377
|
-
<span class="
|
|
378
|
-
const description =
|
|
379
|
-
const entry =
|
|
380
|
-
const backlog =
|
|
381
|
-
|
|
382
|
-
<span class="
|
|
372
|
+
const subject = await ui.input("Task subject");
|
|
373
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!subject) <span class="cstat-no" title="statement not covered" >return;</span>
|
|
374
|
+
const description = await ui.input("Task description") || subject;
|
|
375
|
+
const entry = taskStore.create(subject, description);
|
|
376
|
+
const backlog = await emitCreated(entry);
|
|
377
|
+
ui.notify(`Task #${entry.id} created`, "info");
|
|
378
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (backlog.created && <span class="branch-1 cbranch-no" title="branch not covered" >backlog.entry) {</span>
|
|
383
379
|
<span class="cstat-no" title="statement not covered" > ui.notify(`Backlog worker loop #${backlog.entry.id} created`, "info");</span>
|
|
384
380
|
}
|
|
385
381
|
}
|
|
386
382
|
|
|
387
|
-
async function
|
|
388
|
-
const taskStore =
|
|
389
|
-
<span class="
|
|
383
|
+
async function viewNativeTasks(ui: ExtensionUIContext): Promise<void> {
|
|
384
|
+
const taskStore = getNativeTaskStore();
|
|
385
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!taskStore) {
|
|
390
386
|
<span class="cstat-no" title="statement not covered" > ui.notify("Native tasks are unavailable while pi-tasks is active", "warning");</span>
|
|
391
387
|
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
392
388
|
}
|
|
393
389
|
|
|
394
|
-
const tasks =
|
|
395
|
-
const choices =
|
|
396
|
-
const icon =
|
|
397
|
-
|
|
390
|
+
const tasks = taskStore.list();
|
|
391
|
+
const choices = tasks.map((task) => {
|
|
392
|
+
const icon = task.status === "in_progress" ? ">" : task.status === "completed" ? "ok" : "*";
|
|
393
|
+
return `${icon} #${task.id} [${task.status}] ${task.subject.slice(0, 60)}`;
|
|
398
394
|
});
|
|
399
|
-
|
|
400
|
-
|
|
395
|
+
choices.unshift("+ Create task");
|
|
396
|
+
choices.push("< Back");
|
|
401
397
|
|
|
402
|
-
const selected =
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
398
|
+
const selected = await ui.select("Tasks", choices);
|
|
399
|
+
if (!selected || selected === "< Back") return;
|
|
400
|
+
if (selected === "+ Create task") {
|
|
401
|
+
await createNativeTaskInteractively(ui);
|
|
402
|
+
return viewNativeTasks(ui);
|
|
407
403
|
}
|
|
408
404
|
|
|
409
|
-
const
|
|
410
|
-
<span class="
|
|
405
|
+
const taskId = selected.match(/#(\d+)/)?.[1];
|
|
406
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!taskId) <span class="cstat-no" title="statement not covered" >return viewNativeTasks(ui);</span>
|
|
411
407
|
|
|
412
|
-
const task =
|
|
413
|
-
<span class="
|
|
408
|
+
const task = taskStore.get(taskId);
|
|
409
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!task) <span class="cstat-no" title="statement not covered" >return viewNativeTasks(ui);</span>
|
|
414
410
|
|
|
415
|
-
const actions =
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
} else <span class="cstat-no" title="statement not covered" >if (task.status === "in_progress") {</span>
|
|
411
|
+
const actions = ["x Delete"];
|
|
412
|
+
if (task.status === "pending") {
|
|
413
|
+
actions.unshift("ok Complete");
|
|
414
|
+
actions.unshift("> Start");
|
|
415
|
+
} else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="else path not taken" >E</span>if (task.status === "in_progress") {</span>
|
|
420
416
|
<span class="cstat-no" title="statement not covered" > actions.unshift("ok Complete");</span>
|
|
421
417
|
<span class="cstat-no" title="statement not covered" > actions.unshift("* Return to pending");</span>
|
|
422
418
|
} else {
|
|
423
419
|
<span class="cstat-no" title="statement not covered" > actions.unshift("* Reopen");</span>
|
|
424
420
|
}
|
|
425
|
-
|
|
421
|
+
actions.push("< Back");
|
|
426
422
|
|
|
427
|
-
const action =
|
|
428
|
-
<span class="
|
|
423
|
+
const action = await ui.select(`#${task.id}: ${task.subject}\n\n${task.description}`, actions);
|
|
424
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!action || action === "< Back") <span class="cstat-no" title="statement not covered" >return viewNativeTasks(ui);</span>
|
|
429
425
|
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
<span class="
|
|
426
|
+
if (action === "x Delete") {
|
|
427
|
+
taskStore.delete(task.id);
|
|
428
|
+
emitNativeTaskEvent(pi, "tasks:deleted", task, task.status);
|
|
429
|
+
ui.notify(`Task #${task.id} deleted`, "info");
|
|
430
|
+
} else <span class="missing-if-branch" title="if path not taken" >I</span>if (action === "> Start") {
|
|
431
|
+
const next = <span class="cstat-no" title="statement not covered" >taskStore.start(task.id);</span>
|
|
432
|
+
<span class="cstat-no" title="statement not covered" > if (<span class="cstat-no" title="statement not covered" >next) emitNativeTaskEvent(pi, "tasks:started", next, task.status);</span></span>
|
|
435
433
|
<span class="cstat-no" title="statement not covered" > ui.notify(`Task #${task.id} started`, "info");</span>
|
|
436
|
-
} else
|
|
437
|
-
|
|
438
|
-
<span class="
|
|
439
|
-
|
|
440
|
-
<span class="cstat-no" title="statement not covered" >
|
|
434
|
+
} else if (action === "ok Complete") {
|
|
435
|
+
const next = taskStore.complete(task.id);
|
|
436
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (next) emitNativeTaskEvent(pi, "tasks:completed", next, task.status);
|
|
437
|
+
ui.notify(`Task #${task.id} completed`, "info");
|
|
438
|
+
} else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="else path not taken" >E</span>if (action === "* Return to pending" || action === "* Reopen") {</span>
|
|
439
|
+
const next = <span class="cstat-no" title="statement not covered" >taskStore.reopen(task.id);</span>
|
|
440
|
+
<span class="cstat-no" title="statement not covered" > if (<span class="cstat-no" title="statement not covered" >next) emitNativeTaskEvent(pi, "tasks:reopened", next, task.status);</span></span>
|
|
441
441
|
<span class="cstat-no" title="statement not covered" > ui.notify(`Task #${task.id} reopened`, "info");</span>
|
|
442
442
|
}
|
|
443
443
|
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
444
|
+
updateWidget();
|
|
445
|
+
await evaluateTaskBacklog(taskStore, taskStore.pendingCount());
|
|
446
|
+
return viewNativeTasks(ui);
|
|
447
447
|
}
|
|
448
448
|
|
|
449
449
|
pi.registerCommand("tasks", {
|
|
@@ -451,20 +451,20 @@ export function registerTasksCommand(options: TasksCommandOptions): void {
|
|
|
451
451
|
handler: async (args: string, ctx: ExtensionCommandContext) => {
|
|
452
452
|
const trimmed = args.trim();
|
|
453
453
|
const taskStore = getNativeTaskStore();
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
454
|
+
if (!taskStore) {
|
|
455
|
+
ctx.ui.notify("Native tasks are unavailable while pi-tasks is active", "warning");
|
|
456
|
+
return;
|
|
457
457
|
}
|
|
458
|
-
|
|
458
|
+
if (trimmed) {
|
|
459
459
|
const entry = taskStore.create(trimmed.slice(0, 80), trimmed);
|
|
460
460
|
const backlog = await emitCreated(entry);
|
|
461
461
|
ctx.ui.notify(`Task #${entry.id} created`, "info");
|
|
462
|
-
|
|
463
|
-
|
|
462
|
+
if (backlog.created && backlog.entry) {
|
|
463
|
+
ctx.ui.notify(`Backlog worker loop #${backlog.entry.id} created`, "info");
|
|
464
464
|
}
|
|
465
465
|
return;
|
|
466
466
|
}
|
|
467
|
-
|
|
467
|
+
await viewNativeTasks(ctx.ui);
|
|
468
468
|
},
|
|
469
469
|
});
|
|
470
470
|
}
|
|
@@ -475,7 +475,7 @@ export function registerTasksCommand(options: TasksCommandOptions): void {
|
|
|
475
475
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
476
476
|
Code coverage generated by
|
|
477
477
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
478
|
-
at 2026-
|
|
478
|
+
at 2026-07-02T19:31:50.067Z
|
|
479
479
|
</div>
|
|
480
480
|
<script src="../../prettify.js"></script>
|
|
481
481
|
<script>
|
|
@@ -30,9 +30,9 @@
|
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">88% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>22/25</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
@@ -239,55 +239,55 @@
|
|
|
239
239
|
<span class="cline-any cline-neutral"> </span>
|
|
240
240
|
<span class="cline-any cline-neutral"> </span>
|
|
241
241
|
<span class="cline-any cline-neutral"> </span>
|
|
242
|
-
<span class="cline-any cline-yes">
|
|
242
|
+
<span class="cline-any cline-yes">222x</span>
|
|
243
243
|
<span class="cline-any cline-neutral"> </span>
|
|
244
244
|
<span class="cline-any cline-neutral"> </span>
|
|
245
|
-
<span class="cline-any cline-yes">
|
|
245
|
+
<span class="cline-any cline-yes">248x</span>
|
|
246
246
|
<span class="cline-any cline-neutral"> </span>
|
|
247
247
|
<span class="cline-any cline-neutral"> </span>
|
|
248
248
|
<span class="cline-any cline-neutral"> </span>
|
|
249
|
-
<span class="cline-any cline-yes">
|
|
250
|
-
<span class="cline-any cline-yes">
|
|
251
|
-
<span class="cline-any cline-yes">
|
|
252
|
-
<span class="cline-any cline-yes">
|
|
249
|
+
<span class="cline-any cline-yes">84x</span>
|
|
250
|
+
<span class="cline-any cline-yes">4x</span>
|
|
251
|
+
<span class="cline-any cline-yes">4x</span>
|
|
252
|
+
<span class="cline-any cline-yes">4x</span>
|
|
253
253
|
<span class="cline-any cline-no"> </span>
|
|
254
254
|
<span class="cline-any cline-neutral"> </span>
|
|
255
|
-
<span class="cline-any cline-yes">
|
|
256
|
-
<span class="cline-any cline-yes">
|
|
255
|
+
<span class="cline-any cline-yes">4x</span>
|
|
256
|
+
<span class="cline-any cline-yes">1x</span>
|
|
257
257
|
<span class="cline-any cline-neutral"> </span>
|
|
258
258
|
<span class="cline-any cline-neutral"> </span>
|
|
259
|
-
<span class="cline-any cline-yes">
|
|
260
|
-
<span class="cline-any cline-yes">
|
|
259
|
+
<span class="cline-any cline-yes">80x</span>
|
|
260
|
+
<span class="cline-any cline-yes">80x</span>
|
|
261
261
|
<span class="cline-any cline-yes">72x</span>
|
|
262
262
|
<span class="cline-any cline-yes">72x</span>
|
|
263
263
|
<span class="cline-any cline-yes">72x</span>
|
|
264
264
|
<span class="cline-any cline-neutral"> </span>
|
|
265
265
|
<span class="cline-any cline-neutral"> </span>
|
|
266
|
-
<span class="cline-any cline-yes">
|
|
266
|
+
<span class="cline-any cline-yes">8x</span>
|
|
267
267
|
<span class="cline-any cline-yes">8x</span>
|
|
268
268
|
<span class="cline-any cline-yes">8x</span>
|
|
269
269
|
<span class="cline-any cline-neutral"> </span>
|
|
270
270
|
<span class="cline-any cline-neutral"> </span>
|
|
271
271
|
<span class="cline-any cline-neutral"> </span>
|
|
272
272
|
<span class="cline-any cline-neutral"> </span>
|
|
273
|
-
<span class="cline-any cline-yes">
|
|
273
|
+
<span class="cline-any cline-yes">168x</span>
|
|
274
274
|
<span class="cline-any cline-yes">1x</span>
|
|
275
275
|
<span class="cline-any cline-neutral"> </span>
|
|
276
276
|
<span class="cline-any cline-neutral"> </span>
|
|
277
|
-
<span class="cline-any cline-yes">
|
|
278
|
-
<span class="cline-any cline-yes">
|
|
279
|
-
<span class="cline-any cline-yes">
|
|
280
|
-
<span class="cline-any cline-yes">
|
|
281
|
-
<span class="cline-any cline-yes">
|
|
282
|
-
<span class="cline-any cline-yes">
|
|
277
|
+
<span class="cline-any cline-yes">167x</span>
|
|
278
|
+
<span class="cline-any cline-yes">167x</span>
|
|
279
|
+
<span class="cline-any cline-yes">168x</span>
|
|
280
|
+
<span class="cline-any cline-yes">168x</span>
|
|
281
|
+
<span class="cline-any cline-yes">168x</span>
|
|
282
|
+
<span class="cline-any cline-yes">80x</span>
|
|
283
283
|
<span class="cline-any cline-neutral"> </span>
|
|
284
284
|
<span class="cline-any cline-neutral"> </span>
|
|
285
|
-
<span class="cline-any cline-yes">
|
|
286
|
-
<span class="cline-any cline-yes">
|
|
285
|
+
<span class="cline-any cline-yes">167x</span>
|
|
286
|
+
<span class="cline-any cline-yes">84x</span>
|
|
287
287
|
<span class="cline-any cline-neutral"> </span>
|
|
288
288
|
<span class="cline-any cline-neutral"> </span>
|
|
289
289
|
<span class="cline-any cline-neutral"> </span>
|
|
290
|
-
<span class="cline-any cline-yes">
|
|
290
|
+
<span class="cline-any cline-yes">222x</span>
|
|
291
291
|
<span class="cline-any cline-neutral"> </span>
|
|
292
292
|
<span class="cline-any cline-yes">164x</span>
|
|
293
293
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -303,7 +303,7 @@
|
|
|
303
303
|
| "coordinator"
|
|
304
304
|
| "system";
|
|
305
305
|
|
|
306
|
-
export type ReducerEntityType = "task" | "loop" | "monitor" | "notification"
|
|
306
|
+
export type ReducerEntityType = "task" | "loop" | "monitor" | "notification";
|
|
307
307
|
|
|
308
308
|
export interface ReducerEvent<TType extends string = string, TPayload = unknown> {
|
|
309
309
|
type: TType;
|
|
@@ -378,7 +378,7 @@ export function createCoordinator(options: CoordinatorOptions): Coordinator {
|
|
|
378
378
|
return;
|
|
379
379
|
}
|
|
380
380
|
|
|
381
|
-
if (effectExecutor) {
|
|
381
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (effectExecutor) {
|
|
382
382
|
const handled = effectExecutor(effect);
|
|
383
383
|
<span class="missing-if-branch" title="else path not taken" >E</span>if (isPromiseLike(handled)) await handled;
|
|
384
384
|
}
|
|
@@ -415,7 +415,7 @@ export function createCoordinator(options: CoordinatorOptions): Coordinator {
|
|
|
415
415
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
416
416
|
Code coverage generated by
|
|
417
417
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
418
|
-
at 2026-
|
|
418
|
+
at 2026-07-02T19:31:50.067Z
|
|
419
419
|
</div>
|
|
420
420
|
<script src="../prettify.js"></script>
|
|
421
421
|
<script>
|