@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,9 +23,9 @@
|
|
|
23
23
|
<div class='clearfix'>
|
|
24
24
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">
|
|
26
|
+
<span class="strong">87.5% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>49/56</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
@@ -37,16 +37,16 @@
|
|
|
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'>8/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">95.91% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>47/49</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -209,11 +209,7 @@
|
|
|
209
209
|
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
210
|
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
217
213
|
<span class="cline-any cline-neutral"> </span>
|
|
218
214
|
<span class="cline-any cline-neutral"> </span>
|
|
219
215
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -244,46 +240,64 @@
|
|
|
244
240
|
<span class="cline-any cline-neutral"> </span>
|
|
245
241
|
<span class="cline-any cline-neutral"> </span>
|
|
246
242
|
<span class="cline-any cline-neutral"> </span>
|
|
247
|
-
<span class="cline-any cline-yes">71x</span>
|
|
248
243
|
<span class="cline-any cline-neutral"> </span>
|
|
249
244
|
<span class="cline-any cline-neutral"> </span>
|
|
250
|
-
<span class="cline-any cline-yes">63x</span>
|
|
251
|
-
<span class="cline-any cline-yes">63x</span>
|
|
252
|
-
<span class="cline-any cline-yes">45x</span>
|
|
253
245
|
<span class="cline-any cline-neutral"> </span>
|
|
254
|
-
<span class="cline-any cline-yes">63x</span>
|
|
255
|
-
<span class="cline-any cline-yes">3x</span>
|
|
256
|
-
<span class="cline-any cline-yes">3x</span>
|
|
257
|
-
<span class="cline-any cline-yes">3x</span>
|
|
258
|
-
<span class="cline-any cline-yes">3x</span>
|
|
259
246
|
<span class="cline-any cline-neutral"> </span>
|
|
260
|
-
<span class="cline-any cline-yes">63x</span>
|
|
261
247
|
<span class="cline-any cline-neutral"> </span>
|
|
262
248
|
<span class="cline-any cline-neutral"> </span>
|
|
263
249
|
<span class="cline-any cline-neutral"> </span>
|
|
264
|
-
<span class="cline-any cline-yes">4x</span>
|
|
265
|
-
<span class="cline-any cline-yes">3x</span>
|
|
266
|
-
<span class="cline-any cline-yes">1x</span>
|
|
267
|
-
<span class="cline-any cline-yes">1x</span>
|
|
268
|
-
<span class="cline-any cline-yes">1x</span>
|
|
269
|
-
<span class="cline-any cline-yes">1x</span>
|
|
270
|
-
<span class="cline-any cline-no"> </span>
|
|
271
|
-
<span class="cline-any cline-no"> </span>
|
|
272
250
|
<span class="cline-any cline-neutral"> </span>
|
|
273
|
-
<span class="cline-any cline-yes">1x</span>
|
|
274
|
-
<span class="cline-any cline-yes">1x</span>
|
|
275
|
-
<span class="cline-any cline-yes">1x</span>
|
|
276
|
-
<span class="cline-any cline-yes">1x</span>
|
|
277
|
-
<span class="cline-any cline-yes">1x</span>
|
|
278
|
-
<span class="cline-any cline-no"> </span>
|
|
279
251
|
<span class="cline-any cline-neutral"> </span>
|
|
280
|
-
<span class="cline-any cline-yes">1x</span>
|
|
281
252
|
<span class="cline-any cline-neutral"> </span>
|
|
282
253
|
<span class="cline-any cline-neutral"> </span>
|
|
283
254
|
<span class="cline-any cline-neutral"> </span>
|
|
284
255
|
<span class="cline-any cline-neutral"> </span>
|
|
285
256
|
<span class="cline-any cline-neutral"> </span>
|
|
286
257
|
<span class="cline-any cline-neutral"> </span>
|
|
258
|
+
<span class="cline-any cline-neutral"> </span>
|
|
259
|
+
<span class="cline-any cline-neutral"> </span>
|
|
260
|
+
<span class="cline-any cline-yes">77x</span>
|
|
261
|
+
<span class="cline-any cline-yes">77x</span>
|
|
262
|
+
<span class="cline-any cline-neutral"> </span>
|
|
263
|
+
<span class="cline-any cline-neutral"> </span>
|
|
264
|
+
<span class="cline-any cline-neutral"> </span>
|
|
265
|
+
<span class="cline-any cline-neutral"> </span>
|
|
266
|
+
<span class="cline-any cline-neutral"> </span>
|
|
267
|
+
<span class="cline-any cline-neutral"> </span>
|
|
268
|
+
<span class="cline-any cline-yes">70x</span>
|
|
269
|
+
<span class="cline-any cline-yes">70x</span>
|
|
270
|
+
<span class="cline-any cline-yes">70x</span>
|
|
271
|
+
<span class="cline-any cline-yes">54x</span>
|
|
272
|
+
<span class="cline-any cline-yes">54x</span>
|
|
273
|
+
<span class="cline-any cline-neutral"> </span>
|
|
274
|
+
<span class="cline-any cline-yes">70x</span>
|
|
275
|
+
<span class="cline-any cline-yes">70x</span>
|
|
276
|
+
<span class="cline-any cline-yes">49x</span>
|
|
277
|
+
<span class="cline-any cline-yes">49x</span>
|
|
278
|
+
<span class="cline-any cline-neutral"> </span>
|
|
279
|
+
<span class="cline-any cline-yes">70x</span>
|
|
280
|
+
<span class="cline-any cline-yes">71x</span>
|
|
281
|
+
<span class="cline-any cline-yes">71x</span>
|
|
282
|
+
<span class="cline-any cline-yes">71x</span>
|
|
283
|
+
<span class="cline-any cline-yes">5x</span>
|
|
284
|
+
<span class="cline-any cline-yes">5x</span>
|
|
285
|
+
<span class="cline-any cline-yes">5x</span>
|
|
286
|
+
<span class="cline-any cline-yes">5x</span>
|
|
287
|
+
<span class="cline-any cline-yes">5x</span>
|
|
288
|
+
<span class="cline-any cline-neutral"> </span>
|
|
289
|
+
<span class="cline-any cline-yes">70x</span>
|
|
290
|
+
<span class="cline-any cline-neutral"> </span>
|
|
291
|
+
<span class="cline-any cline-neutral"> </span>
|
|
292
|
+
<span class="cline-any cline-neutral"> </span>
|
|
293
|
+
<span class="cline-any cline-yes">4x</span>
|
|
294
|
+
<span class="cline-any cline-yes">3x</span>
|
|
295
|
+
<span class="cline-any cline-yes">1x</span>
|
|
296
|
+
<span class="cline-any cline-yes">1x</span>
|
|
297
|
+
<span class="cline-any cline-neutral"> </span>
|
|
298
|
+
<span class="cline-any cline-neutral"> </span>
|
|
299
|
+
<span class="cline-any cline-neutral"> </span>
|
|
300
|
+
<span class="cline-any cline-neutral"> </span>
|
|
287
301
|
<span class="cline-any cline-yes">1x</span>
|
|
288
302
|
<span class="cline-any cline-neutral"> </span>
|
|
289
303
|
<span class="cline-any cline-no"> </span>
|
|
@@ -298,33 +312,23 @@
|
|
|
298
312
|
<span class="cline-any cline-neutral"> </span>
|
|
299
313
|
<span class="cline-any cline-neutral"> </span>
|
|
300
314
|
<span class="cline-any cline-yes">2x</span>
|
|
315
|
+
<span class="cline-any cline-yes">2x</span>
|
|
301
316
|
<span class="cline-any cline-yes">4x</span>
|
|
302
317
|
<span class="cline-any cline-neutral"> </span>
|
|
303
318
|
<span class="cline-any cline-neutral"> </span>
|
|
304
319
|
<span class="cline-any cline-neutral"> </span>
|
|
305
|
-
<span class="cline-any cline-yes">
|
|
306
|
-
<span class="cline-any cline-yes">3x</span>
|
|
307
|
-
<span class="cline-any cline-yes">3x</span>
|
|
308
|
-
<span class="cline-any cline-yes">3x</span>
|
|
309
|
-
<span class="cline-any cline-yes">3x</span>
|
|
310
|
-
<span class="cline-any cline-no"> </span>
|
|
311
|
-
<span class="cline-any cline-no"> </span>
|
|
320
|
+
<span class="cline-any cline-yes">39x</span>
|
|
312
321
|
<span class="cline-any cline-neutral"> </span>
|
|
313
|
-
<span class="cline-any cline-yes">3x</span>
|
|
314
|
-
<span class="cline-any cline-yes">3x</span>
|
|
315
|
-
<span class="cline-any cline-yes">3x</span>
|
|
316
|
-
<span class="cline-any cline-yes">3x</span>
|
|
317
|
-
<span class="cline-any cline-yes">3x</span>
|
|
318
322
|
<span class="cline-any cline-neutral"> </span>
|
|
319
323
|
<span class="cline-any cline-yes">3x</span>
|
|
320
|
-
<span class="cline-any cline-
|
|
324
|
+
<span class="cline-any cline-yes">3x</span>
|
|
321
325
|
<span class="cline-any cline-yes">3x</span>
|
|
322
326
|
<span class="cline-any cline-neutral"> </span>
|
|
323
327
|
<span class="cline-any cline-no"> </span>
|
|
324
328
|
<span class="cline-any cline-neutral"> </span>
|
|
325
329
|
<span class="cline-any cline-neutral"> </span>
|
|
326
330
|
<span class="cline-any cline-neutral"> </span>
|
|
327
|
-
<span class="cline-any cline-yes">
|
|
331
|
+
<span class="cline-any cline-yes">36x</span>
|
|
328
332
|
<span class="cline-any cline-neutral"> </span>
|
|
329
333
|
<span class="cline-any cline-neutral"> </span>
|
|
330
334
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -332,18 +336,6 @@
|
|
|
332
336
|
<span class="cline-any cline-yes">2x</span>
|
|
333
337
|
<span class="cline-any cline-yes">2x</span>
|
|
334
338
|
<span class="cline-any cline-yes">2x</span>
|
|
335
|
-
<span class="cline-any cline-yes">2x</span>
|
|
336
|
-
<span class="cline-any cline-no"> </span>
|
|
337
|
-
<span class="cline-any cline-no"> </span>
|
|
338
|
-
<span class="cline-any cline-neutral"> </span>
|
|
339
|
-
<span class="cline-any cline-yes">2x</span>
|
|
340
|
-
<span class="cline-any cline-yes">2x</span>
|
|
341
|
-
<span class="cline-any cline-yes">2x</span>
|
|
342
|
-
<span class="cline-any cline-yes">2x</span>
|
|
343
|
-
<span class="cline-any cline-yes">2x</span>
|
|
344
|
-
<span class="cline-any cline-neutral"> </span>
|
|
345
|
-
<span class="cline-any cline-yes">2x</span>
|
|
346
|
-
<span class="cline-any cline-neutral"> </span>
|
|
347
339
|
<span class="cline-any cline-neutral"> </span>
|
|
348
340
|
<span class="cline-any cline-neutral"> </span>
|
|
349
341
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -356,7 +348,7 @@
|
|
|
356
348
|
<span class="cline-any cline-yes">4x</span>
|
|
357
349
|
<span class="cline-any cline-neutral"> </span>
|
|
358
350
|
<span class="cline-any cline-neutral"> </span>
|
|
359
|
-
<span class="cline-any cline-yes">
|
|
351
|
+
<span class="cline-any cline-yes">77x</span>
|
|
360
352
|
<span class="cline-any cline-neutral"> </span>
|
|
361
353
|
<span class="cline-any cline-neutral"> </span>
|
|
362
354
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -365,8 +357,19 @@
|
|
|
365
357
|
<span class="cline-any cline-neutral"> </span>
|
|
366
358
|
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { randomUUID } from "node:crypto";
|
|
367
359
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
360
|
+
import {
|
|
361
|
+
type CleanReply,
|
|
362
|
+
type CreateTaskReply,
|
|
363
|
+
type PendingReply,
|
|
364
|
+
type PingReply,
|
|
365
|
+
replyChannel,
|
|
366
|
+
TASKS_RPC,
|
|
367
|
+
} from "../rpc/channels.js";
|
|
368
|
+
import { type RpcReply, rpcCall } from "../rpc/cross-extension-rpc.js";
|
|
368
369
|
import type { TaskStore } from "../task-store.js";
|
|
369
370
|
import type { LoopEntry } from "../types.js";
|
|
371
|
+
import { NATIVE_TASKS_PROVIDER } from "./native-task-rpc.js";
|
|
372
|
+
import { emitNativeTaskEvent } from "./task-events.js";
|
|
370
373
|
|
|
371
374
|
export interface TaskRuntimeBridgeOptions {
|
|
372
375
|
pi: ExtensionAPI;
|
|
@@ -375,6 +378,10 @@ export interface TaskRuntimeBridgeOptions {
|
|
|
375
378
|
getNativeTaskStore: () => TaskStore | undefined;
|
|
376
379
|
onNativeTaskCreated?: (taskStore: TaskStore) => void;
|
|
377
380
|
onNativeTasksPruned?: (taskStore: TaskStore) => Promise<void> | void;
|
|
381
|
+
/** Called when a detection window opens. */
|
|
382
|
+
onDetectionStarted?: () => void;
|
|
383
|
+
/** Called when a detection window closes (provider found or probe timed out). */
|
|
384
|
+
onDetectionSettled?: () => void;
|
|
378
385
|
debug?: (...args: unknown[]) => void;
|
|
379
386
|
}
|
|
380
387
|
|
|
@@ -393,48 +400,51 @@ export function createTaskRuntimeBridge(options: TaskRuntimeBridgeOptions): Task
|
|
|
393
400
|
getNativeTaskStore,
|
|
394
401
|
onNativeTaskCreated,
|
|
395
402
|
onNativeTasksPruned,
|
|
403
|
+
onDetectionStarted,
|
|
404
|
+
onDetectionSettled,
|
|
396
405
|
debug,
|
|
397
406
|
} = options;
|
|
407
|
+
let detectionEpoch = 0;
|
|
398
408
|
|
|
399
409
|
function checkTasksVersion() {
|
|
410
|
+
// Not rpcProbe: pi-loop's own native server also answers this ping, and a
|
|
411
|
+
// first-reply-wins probe would always settle on that self-reply. Keep the
|
|
412
|
+
// listener open for the whole window and skip self-replies so a slower
|
|
413
|
+
// external provider (pi-tasks) is still detected.
|
|
414
|
+
const epoch = ++detectionEpoch;
|
|
415
|
+
onDetectionStarted?.();
|
|
416
|
+
const settleCurrentDetection = () => {
|
|
417
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (epoch !== detectionEpoch) <span class="cstat-no" title="statement not covered" >return;</span>
|
|
418
|
+
onDetectionSettled?.();
|
|
419
|
+
};
|
|
400
420
|
const requestId = randomUUID();
|
|
401
421
|
const timer = setTimeout(() => {
|
|
402
422
|
unsub();
|
|
423
|
+
settleCurrentDetection();
|
|
403
424
|
}, 5000);
|
|
404
|
-
const unsub = pi.events.on(
|
|
425
|
+
const unsub = pi.events.on(replyChannel(TASKS_RPC.ping, requestId), (raw: unknown) => {
|
|
426
|
+
const reply = raw as RpcReply<PingReply> | undefined;
|
|
427
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!reply?.success || !reply.data) <span class="cstat-no" title="statement not covered" >return;</span>
|
|
428
|
+
if (reply.data.provider === NATIVE_TASKS_PROVIDER) return;
|
|
429
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (reply.data.version === undefined) <span class="cstat-no" title="statement not covered" >return;</span>
|
|
405
430
|
unsub();
|
|
406
431
|
clearTimeout(timer);
|
|
407
|
-
|
|
408
|
-
|
|
432
|
+
setTasksAvailable(true);
|
|
433
|
+
settleCurrentDetection();
|
|
409
434
|
});
|
|
410
|
-
pi.events.emit(
|
|
435
|
+
pi.events.emit(TASKS_RPC.ping, { requestId });
|
|
411
436
|
}
|
|
412
437
|
|
|
413
438
|
async function autoCreateTask(entry: LoopEntry): Promise<string | undefined> {
|
|
414
439
|
if (!entry.autoTask) return undefined;
|
|
415
440
|
if (isTasksAvailable()) {
|
|
416
441
|
try {
|
|
417
|
-
const
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
const unsub = pi.events.on(`tasks:rpc:create:reply:${requestId}`, (raw: unknown) => {
|
|
424
|
-
unsub();
|
|
425
|
-
clearTimeout(timer);
|
|
426
|
-
const reply = raw as { success: boolean; data?: { id: string } };
|
|
427
|
-
if (reply.success && reply.data) resolve(reply.data.id);
|
|
428
|
-
else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="else path not taken" >E</span>resolve(undefined);</span>
|
|
429
|
-
});
|
|
430
|
-
pi.events.emit("tasks:rpc:create", {
|
|
431
|
-
requestId,
|
|
432
|
-
subject: entry.prompt.slice(0, 80),
|
|
433
|
-
description: `Auto-created from loop #${entry.id}`,
|
|
434
|
-
metadata: { loopId: entry.id, trigger: entry.trigger },
|
|
435
|
-
});
|
|
436
|
-
});
|
|
437
|
-
return taskId;
|
|
442
|
+
const reply = await rpcCall<CreateTaskReply>(pi.events, TASKS_RPC.create, {
|
|
443
|
+
subject: entry.prompt.slice(0, 80),
|
|
444
|
+
description: `Auto-created from loop #${entry.id}`,
|
|
445
|
+
metadata: { loopId: entry.id, trigger: entry.trigger },
|
|
446
|
+
}, 5000);
|
|
447
|
+
return reply.id;
|
|
438
448
|
} catch {
|
|
439
449
|
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
440
450
|
}
|
|
@@ -447,28 +457,18 @@ export function createTaskRuntimeBridge(options: TaskRuntimeBridgeOptions): Task
|
|
|
447
457
|
`Auto-created from loop #${entry.id}`,
|
|
448
458
|
{ loopId: entry.id, trigger: entry.trigger },
|
|
449
459
|
);
|
|
460
|
+
emitNativeTaskEvent(pi, "tasks:created", task);
|
|
450
461
|
onNativeTaskCreated?.(nativeTaskStore);
|
|
451
462
|
return task.id;
|
|
452
463
|
}
|
|
453
464
|
|
|
454
465
|
async function hasPendingTasks(): Promise<number> {
|
|
455
466
|
if (isTasksAvailable()) {
|
|
467
|
+
// -1 is this bridge's "unknown" sentinel, consumed by notification-runtime;
|
|
468
|
+
// the RPC layer itself rejects on failure.
|
|
456
469
|
try {
|
|
457
|
-
const
|
|
458
|
-
|
|
459
|
-
const timer = <span class="fstat-no" title="function not covered" >setTimeout(() => {</span>
|
|
460
|
-
<span class="cstat-no" title="statement not covered" > unsub();</span>
|
|
461
|
-
<span class="cstat-no" title="statement not covered" > resolve(-1);</span>
|
|
462
|
-
}, 3000);
|
|
463
|
-
const unsub = pi.events.on(`tasks:rpc:pending:reply:${requestId}`, (raw: unknown) => {
|
|
464
|
-
unsub();
|
|
465
|
-
clearTimeout(timer);
|
|
466
|
-
const reply = raw as { success: boolean; data?: { pending: number } };
|
|
467
|
-
resolve(reply.success && reply.data ? reply.data.pending : <span class="branch-1 cbranch-no" title="branch not covered" >-1)</span>;
|
|
468
|
-
});
|
|
469
|
-
pi.events.emit("tasks:rpc:pending", { requestId });
|
|
470
|
-
});
|
|
471
|
-
return count;
|
|
470
|
+
const reply = await rpcCall<PendingReply>(pi.events, TASKS_RPC.pending, {}, 3000);
|
|
471
|
+
return reply.pending;
|
|
472
472
|
} catch {
|
|
473
473
|
<span class="cstat-no" title="statement not covered" > return -1;</span>
|
|
474
474
|
}
|
|
@@ -480,20 +480,8 @@ export function createTaskRuntimeBridge(options: TaskRuntimeBridgeOptions): Task
|
|
|
480
480
|
async function cleanDoneTasks(): Promise<void> {
|
|
481
481
|
if (isTasksAvailable()) {
|
|
482
482
|
try {
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
const timer = <span class="fstat-no" title="function not covered" >setTimeout(() => {</span>
|
|
486
|
-
<span class="cstat-no" title="statement not covered" > unsub();</span>
|
|
487
|
-
<span class="cstat-no" title="statement not covered" > resolve();</span>
|
|
488
|
-
}, 3000);
|
|
489
|
-
const unsub = pi.events.on(`tasks:rpc:clean:reply:${requestId}`, () => {
|
|
490
|
-
unsub();
|
|
491
|
-
clearTimeout(timer);
|
|
492
|
-
debug?.("tasks:rpc:clean — done tasks swept");
|
|
493
|
-
resolve();
|
|
494
|
-
});
|
|
495
|
-
pi.events.emit("tasks:rpc:clean", { requestId });
|
|
496
|
-
});
|
|
483
|
+
await rpcCall<CleanReply>(pi.events, TASKS_RPC.clean, {}, 3000);
|
|
484
|
+
debug?.(`${TASKS_RPC.clean} — done tasks swept`);
|
|
497
485
|
} catch {
|
|
498
486
|
// timeout or error, ignore
|
|
499
487
|
}
|
|
@@ -520,7 +508,7 @@ export function createTaskRuntimeBridge(options: TaskRuntimeBridgeOptions): Task
|
|
|
520
508
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
521
509
|
Code coverage generated by
|
|
522
510
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
523
|
-
at 2026-
|
|
511
|
+
at 2026-07-02T19:31:50.067Z
|
|
524
512
|
</div>
|
|
525
513
|
<script src="../../prettify.js"></script>
|
|
526
514
|
<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">83.67% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>41/49</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
@@ -182,11 +182,11 @@
|
|
|
182
182
|
<span class="cline-any cline-neutral"> </span>
|
|
183
183
|
<span class="cline-any cline-neutral"> </span>
|
|
184
184
|
<span class="cline-any cline-neutral"> </span>
|
|
185
|
-
<span class="cline-any cline-yes">
|
|
185
|
+
<span class="cline-any cline-yes">137x</span>
|
|
186
186
|
<span class="cline-any cline-neutral"> </span>
|
|
187
187
|
<span class="cline-any cline-neutral"> </span>
|
|
188
|
-
<span class="cline-any cline-yes">
|
|
189
|
-
<span class="cline-any cline-yes">
|
|
188
|
+
<span class="cline-any cline-yes">137x</span>
|
|
189
|
+
<span class="cline-any cline-yes">137x</span>
|
|
190
190
|
<span class="cline-any cline-neutral"> </span>
|
|
191
191
|
<span class="cline-any cline-neutral"> </span>
|
|
192
192
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -234,16 +234,16 @@
|
|
|
234
234
|
<span class="cline-any cline-neutral"> </span>
|
|
235
235
|
<span class="cline-any cline-neutral"> </span>
|
|
236
236
|
<span class="cline-any cline-neutral"> </span>
|
|
237
|
-
<span class="cline-any cline-yes">
|
|
238
|
-
<span class="cline-any cline-yes">
|
|
237
|
+
<span class="cline-any cline-yes">172x</span>
|
|
238
|
+
<span class="cline-any cline-yes">76x</span>
|
|
239
239
|
<span class="cline-any cline-neutral"> </span>
|
|
240
|
-
<span class="cline-any cline-yes">
|
|
241
|
-
<span class="cline-any cline-yes">
|
|
240
|
+
<span class="cline-any cline-yes">17x</span>
|
|
241
|
+
<span class="cline-any cline-yes">17x</span>
|
|
242
242
|
<span class="cline-any cline-yes">1x</span>
|
|
243
243
|
<span class="cline-any cline-yes">1x</span>
|
|
244
244
|
<span class="cline-any cline-neutral"> </span>
|
|
245
245
|
<span class="cline-any cline-neutral"> </span>
|
|
246
|
-
<span class="cline-any cline-yes">
|
|
246
|
+
<span class="cline-any cline-yes">16x</span>
|
|
247
247
|
<span class="cline-any cline-neutral"> </span>
|
|
248
248
|
<span class="cline-any cline-yes">9x</span>
|
|
249
249
|
<span class="cline-any cline-no"> </span>
|
|
@@ -325,7 +325,7 @@ export class CronScheduler {
|
|
|
325
325
|
const _scheduleExpr = entry.trigger.type === "hybrid" ? entry.trigger.cron : (entry.trigger as { schedule: string }).schedule;
|
|
326
326
|
|
|
327
327
|
const nextFire = computeNextFire(entry);
|
|
328
|
-
const minuteField = _scheduleExpr.trim().split(/\s+/)[0]
|
|
328
|
+
const minuteField = _scheduleExpr.trim().split(/\s+/)[0] ?? <span class="branch-1 cbranch-no" title="branch not covered" >"";</span>
|
|
329
329
|
const minuteStep = minuteField.startsWith("*/") ? parseInt(minuteField.slice(2), 10) || <span class="branch-1 cbranch-no" title="branch not covered" >30 : 3</span>0;
|
|
330
330
|
const jitter = computeJitter(entry.id, entry.recurring, minuteStep);
|
|
331
331
|
const fireTime = nextFire.getTime() + jitter;
|
|
@@ -385,7 +385,7 @@ export class CronScheduler {
|
|
|
385
385
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
386
386
|
Code coverage generated by
|
|
387
387
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
388
|
-
at 2026-
|
|
388
|
+
at 2026-07-02T19:31:50.067Z
|
|
389
389
|
</div>
|
|
390
390
|
<script src="../prettify.js"></script>
|
|
391
391
|
<script>
|
|
@@ -263,17 +263,17 @@
|
|
|
263
263
|
<span class="cline-any cline-neutral"> </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">
|
|
267
|
-
<span class="cline-any cline-yes">
|
|
266
|
+
<span class="cline-any cline-yes">10x</span>
|
|
267
|
+
<span class="cline-any cline-yes">10x</span>
|
|
268
268
|
<span class="cline-any cline-neutral"> </span>
|
|
269
269
|
<span class="cline-any cline-neutral"> </span>
|
|
270
270
|
<span class="cline-any cline-neutral"> </span>
|
|
271
|
-
<span class="cline-any cline-yes">
|
|
271
|
+
<span class="cline-any cline-yes">218x</span>
|
|
272
272
|
<span class="cline-any cline-neutral"> </span>
|
|
273
273
|
<span class="cline-any cline-neutral"> </span>
|
|
274
|
-
<span class="cline-any cline-yes">
|
|
275
|
-
<span class="cline-any cline-yes">
|
|
276
|
-
<span class="cline-any cline-yes">
|
|
274
|
+
<span class="cline-any cline-yes">200x</span>
|
|
275
|
+
<span class="cline-any cline-yes">200x</span>
|
|
276
|
+
<span class="cline-any cline-yes">200x</span>
|
|
277
277
|
<span class="cline-any cline-yes">61x</span>
|
|
278
278
|
<span class="cline-any cline-yes">37x</span>
|
|
279
279
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -282,12 +282,12 @@
|
|
|
282
282
|
<span class="cline-any cline-neutral"> </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">137x</span>
|
|
286
|
+
<span class="cline-any cline-yes">137x</span>
|
|
287
287
|
<span class="cline-any cline-yes">1x</span>
|
|
288
288
|
<span class="cline-any cline-neutral"> </span>
|
|
289
|
-
<span class="cline-any cline-yes">
|
|
290
|
-
<span class="cline-any cline-yes">
|
|
289
|
+
<span class="cline-any cline-yes">136x</span>
|
|
290
|
+
<span class="cline-any cline-yes">136x</span>
|
|
291
291
|
<span class="cline-any cline-neutral"> </span>
|
|
292
292
|
<span class="cline-any cline-neutral"> </span>
|
|
293
293
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -302,15 +302,15 @@
|
|
|
302
302
|
<span class="cline-any cline-neutral"> </span>
|
|
303
303
|
<span class="cline-any cline-neutral"> </span>
|
|
304
304
|
<span class="cline-any cline-neutral"> </span>
|
|
305
|
-
<span class="cline-any cline-yes">
|
|
305
|
+
<span class="cline-any cline-yes">136x</span>
|
|
306
306
|
<span class="cline-any cline-neutral"> </span>
|
|
307
307
|
<span class="cline-any cline-neutral"> </span>
|
|
308
308
|
<span class="cline-any cline-neutral"> </span>
|
|
309
309
|
<span class="cline-any cline-neutral"> </span>
|
|
310
|
+
<span class="cline-any cline-yes">8x</span>
|
|
311
|
+
<span class="cline-any cline-yes">8x</span>
|
|
312
|
+
<span class="cline-any cline-yes">8x</span>
|
|
310
313
|
<span class="cline-any cline-yes">7x</span>
|
|
311
|
-
<span class="cline-any cline-yes">7x</span>
|
|
312
|
-
<span class="cline-any cline-yes">7x</span>
|
|
313
|
-
<span class="cline-any cline-yes">6x</span>
|
|
314
314
|
<span class="cline-any cline-neutral"> </span>
|
|
315
315
|
<span class="cline-any cline-neutral"> </span>
|
|
316
316
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -318,7 +318,7 @@
|
|
|
318
318
|
<span class="cline-any cline-neutral"> </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-yes">
|
|
321
|
+
<span class="cline-any cline-yes">7x</span>
|
|
322
322
|
<span class="cline-any cline-neutral"> </span>
|
|
323
323
|
<span class="cline-any cline-neutral"> </span>
|
|
324
324
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -379,9 +379,9 @@
|
|
|
379
379
|
<span class="cline-any cline-neutral"> </span>
|
|
380
380
|
<span class="cline-any cline-neutral"> </span>
|
|
381
381
|
<span class="cline-any cline-neutral"> </span>
|
|
382
|
-
<span class="cline-any cline-yes">
|
|
383
|
-
<span class="cline-any cline-yes">
|
|
384
|
-
<span class="cline-any cline-yes">
|
|
382
|
+
<span class="cline-any cline-yes">27x</span>
|
|
383
|
+
<span class="cline-any cline-yes">27x</span>
|
|
384
|
+
<span class="cline-any cline-yes">24x</span>
|
|
385
385
|
<span class="cline-any cline-neutral"> </span>
|
|
386
386
|
<span class="cline-any cline-neutral"> </span>
|
|
387
387
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -389,7 +389,7 @@
|
|
|
389
389
|
<span class="cline-any cline-neutral"> </span>
|
|
390
390
|
<span class="cline-any cline-neutral"> </span>
|
|
391
391
|
<span class="cline-any cline-neutral"> </span>
|
|
392
|
-
<span class="cline-any cline-yes">
|
|
392
|
+
<span class="cline-any cline-yes">24x</span>
|
|
393
393
|
<span class="cline-any cline-neutral"> </span>
|
|
394
394
|
<span class="cline-any cline-neutral"> </span>
|
|
395
395
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -652,7 +652,7 @@ export class LoopStore extends ReducerBackedStore<LoopEntry, LoopReducerState
|
|
|
652
652
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
653
653
|
Code coverage generated by
|
|
654
654
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
655
|
-
at 2026-
|
|
655
|
+
at 2026-07-02T19:31:50.067Z
|
|
656
656
|
</div>
|
|
657
657
|
<script src="../prettify.js"></script>
|
|
658
658
|
<script>
|
|
@@ -107,25 +107,25 @@
|
|
|
107
107
|
<span class="cline-any cline-neutral"> </span>
|
|
108
108
|
<span class="cline-any cline-neutral"> </span>
|
|
109
109
|
<span class="cline-any cline-neutral"> </span>
|
|
110
|
-
<span class="cline-any cline-yes">
|
|
110
|
+
<span class="cline-any cline-yes">79x</span>
|
|
111
111
|
<span class="cline-any cline-neutral"> </span>
|
|
112
|
-
<span class="cline-any cline-yes">
|
|
113
|
-
<span class="cline-any cline-yes">
|
|
114
|
-
<span class="cline-any cline-yes">
|
|
115
|
-
<span class="cline-any cline-yes">
|
|
112
|
+
<span class="cline-any cline-yes">79x</span>
|
|
113
|
+
<span class="cline-any cline-yes">79x</span>
|
|
114
|
+
<span class="cline-any cline-yes">79x</span>
|
|
115
|
+
<span class="cline-any cline-yes">13x</span>
|
|
116
116
|
<span class="cline-any cline-neutral"> </span>
|
|
117
117
|
<span class="cline-any cline-neutral"> </span>
|
|
118
118
|
<span class="cline-any cline-neutral"> </span>
|
|
119
119
|
<span class="cline-any cline-neutral"> </span>
|
|
120
120
|
<span class="cline-any cline-neutral"> </span>
|
|
121
|
-
<span class="cline-any cline-yes">
|
|
121
|
+
<span class="cline-any cline-yes">66x</span>
|
|
122
122
|
<span class="cline-any cline-yes">10x</span>
|
|
123
123
|
<span class="cline-any cline-neutral"> </span>
|
|
124
124
|
<span class="cline-any cline-neutral"> </span>
|
|
125
125
|
<span class="cline-any cline-neutral"> </span>
|
|
126
126
|
<span class="cline-any cline-neutral"> </span>
|
|
127
127
|
<span class="cline-any cline-neutral"> </span>
|
|
128
|
-
<span class="cline-any cline-yes">
|
|
128
|
+
<span class="cline-any cline-yes">56x</span>
|
|
129
129
|
<span class="cline-any cline-neutral"> </span>
|
|
130
130
|
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import type { ReducerEffect, ReducerEvent } from "./coordinator.js";
|
|
131
131
|
|
|
@@ -166,7 +166,7 @@ export function reduceTaskBacklogEvent(event: TaskBacklogEvent): TaskBacklogEffe
|
|
|
166
166
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
167
167
|
Code coverage generated by
|
|
168
168
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
169
|
-
at 2026-
|
|
169
|
+
at 2026-07-02T19:31:50.067Z
|
|
170
170
|
</div>
|
|
171
171
|
<script src="../prettify.js"></script>
|
|
172
172
|
<script>
|