@aragon-agent/cli 0.6.24 → 0.6.26
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/CHANGELOG.md +1924 -1786
- package/README.md +2730 -2562
- package/dist/agent/controller.d.ts +49 -3
- package/dist/agent/controller.js +78 -3
- package/dist/agent/conversation-reset.d.ts +91 -0
- package/dist/agent/conversation-reset.js +66 -0
- package/dist/agent/model-probe-limits.d.ts +39 -0
- package/dist/agent/model-probe-limits.js +25 -0
- package/dist/agent/model-probe.d.ts +104 -0
- package/dist/agent/model-probe.js +391 -0
- package/dist/agent/reducer.d.ts +22 -0
- package/dist/agent/reducer.js +49 -14
- package/dist/cli.js +214 -2
- package/dist/commands/branch-command.d.ts +61 -0
- package/dist/commands/branch-command.js +117 -0
- package/dist/commands/builtins.js +62 -40
- package/dist/commands/clear-command.d.ts +27 -0
- package/dist/commands/clear-command.js +107 -0
- package/dist/commands/registry.d.ts +48 -1
- package/dist/commands/session-command.d.ts +54 -0
- package/dist/commands/session-command.js +109 -0
- package/dist/config/load.d.ts +15 -0
- package/dist/config/model-profiles.d.ts +8 -0
- package/dist/config/model-profiles.js +10 -0
- package/dist/exec/index.js +10 -1
- package/dist/logging/logger.d.ts +1 -1
- package/dist/proc/terminal-plan.d.ts +155 -0
- package/dist/proc/terminal-plan.js +360 -0
- package/dist/session/branch-invocation.d.ts +83 -0
- package/dist/session/branch-invocation.js +109 -0
- package/dist/session/branch-launch.d.ts +70 -0
- package/dist/session/branch-launch.js +248 -0
- package/dist/session/checkpoint.d.ts +257 -0
- package/dist/session/checkpoint.js +512 -0
- package/dist/session/clear-archive.d.ts +51 -0
- package/dist/session/clear-archive.js +160 -0
- package/dist/session/cli-commands.d.ts +2 -0
- package/dist/session/cli-commands.js +36 -5
- package/dist/session/identity.d.ts +72 -0
- package/dist/session/identity.js +148 -0
- package/dist/session/limits.d.ts +66 -0
- package/dist/session/limits.js +66 -0
- package/dist/session/persist.d.ts +30 -5
- package/dist/session/startup-session.d.ts +107 -0
- package/dist/session/startup-session.js +315 -0
- package/dist/session/store.d.ts +60 -1
- package/dist/session/store.js +95 -6
- package/dist/todo/types.d.ts +5 -3
- package/dist/ui/App.d.ts +54 -2
- package/dist/ui/App.js +154 -28
- package/dist/ui/Header.js +8 -16
- package/dist/ui/StatusBar.d.ts +8 -0
- package/dist/ui/StatusBar.js +12 -3
- package/dist/ui/entries/CompactionCard.d.ts +5 -4
- package/dist/ui/entries/CompactionCard.js +5 -4
- package/dist/ui/layout/header-hints.d.ts +68 -0
- package/dist/ui/layout/header-hints.js +138 -0
- package/dist/ui/layout/session-chip.d.ts +52 -0
- package/dist/ui/layout/session-chip.js +64 -0
- package/dist/ui/layout/status-layout.d.ts +10 -0
- package/dist/ui/layout/status-layout.js +8 -1
- package/dist/ui/overlays/HelpOverlay.js +17 -5
- package/dist/ui/overlays/ModelDiscoveryList.d.ts +23 -0
- package/dist/ui/overlays/ModelDiscoveryList.js +161 -0
- package/dist/ui/overlays/ModelProfileEditor.d.ts +18 -1
- package/dist/ui/overlays/ModelProfileEditor.js +117 -68
- package/dist/ui/overlays/SettingsScreen.d.ts +8 -0
- package/dist/ui/overlays/SettingsScreen.js +34 -2
- package/dist/ui/overlays/model-probe-view.d.ts +128 -0
- package/dist/ui/overlays/model-probe-view.js +225 -0
- package/dist/ui/overlays/model-profile-state.d.ts +9 -1
- package/dist/ui/overlays/model-profile-state.js +10 -0
- package/dist/ui/overlays/use-model-probe.d.ts +30 -0
- package/dist/ui/overlays/use-model-probe.js +109 -0
- package/dist/ui/session-bridge.d.ts +26 -0
- package/dist/ui/session-bridge.js +32 -0
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,1786 +1,1924 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to `@aragon-agent/cli` are documented here. Entries at
|
|
4
|
-
`0.4.x` and earlier refer to the package by its former name, `@argon-agent/cli`
|
|
5
|
-
— those releases really were published under that name, so they are left as they
|
|
6
|
-
were written.
|
|
7
|
-
|
|
8
|
-
## Unreleased
|
|
9
|
-
|
|
10
|
-
###
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
`
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
-
|
|
93
|
-
the
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
-
|
|
103
|
-
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
a
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
A
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
the
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
`
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
the
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
the
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
was
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
the
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
`aragon
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
`
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
of a
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
and
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
is
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
`
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
- **
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
- **
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
`
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
`
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
cost
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
### Changed
|
|
1311
|
-
|
|
1312
|
-
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
the
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
`
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
`
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
Two
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
`
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
`
|
|
1616
|
-
`
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
the
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
-
|
|
1742
|
-
|
|
1743
|
-
`
|
|
1744
|
-
|
|
1745
|
-
-
|
|
1746
|
-
|
|
1747
|
-
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to `@aragon-agent/cli` are documented here. Entries at
|
|
4
|
+
`0.4.x` and earlier refer to the package by its former name, `@argon-agent/cli`
|
|
5
|
+
— those releases really were published under that name, so they are left as they
|
|
6
|
+
were written.
|
|
7
|
+
|
|
8
|
+
## Unreleased
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- **`Ctrl+L` branches this session into a new terminal - and `Ctrl+R` now
|
|
12
|
+
redraws (KEY BINDING CHANGE).** One keystroke opens a PowerShell (Windows) or
|
|
13
|
+
bash (macOS/Linux) window in the session's current `/cwd`, running
|
|
14
|
+
`aragon --resume <id>` there: the child derives its own id and only ever writes
|
|
15
|
+
its own file, so the TUI you branched from keeps running untouched. The session
|
|
16
|
+
is force-flushed to disk BEFORE anything is spawned, because the child reads
|
|
17
|
+
that file first and the normal checkpoint is debounced. Works mid-run too - the
|
|
18
|
+
child inherits the last settled turn. Platforms: a new Windows Terminal tab
|
|
19
|
+
(`wt -d <cwd> ... --`), a new console window (`cmd /c start`), a Terminal.app
|
|
20
|
+
window via `osascript`, or the first available Linux emulator; each rung carries
|
|
21
|
+
the working directory itself, because `--resume` does not restore one. No
|
|
22
|
+
terminal (SSH, container) prints a pasteable `aragon --resume <id>` instead of
|
|
23
|
+
failing silently. `ARAGON_BRANCH_COMMAND` / `ARAGON_BRANCH_SHELL` override what
|
|
24
|
+
runs and which shell; presses are throttled to one window per two seconds and a
|
|
25
|
+
failed attempt never starts the cooldown. New `/branch` is the same code path.
|
|
26
|
+
The header (top right) now shows `^L branch` next to `^I Index` and `^G more`,
|
|
27
|
+
spending a fixed cell budget: `^I` therefore appears from 52 columns
|
|
28
|
+
(collapsed) / 62 columns (expanded) instead of 72, and on a very narrow terminal
|
|
29
|
+
the branch hint degrades to the bare `^L` before it is dropped.
|
|
30
|
+
**Breaking:** the redraw previously bound to `Ctrl+L` moved to `Ctrl+R` - same
|
|
31
|
+
behaviour, same overlay guard (the settings screen keeps its own `Ctrl+R`).
|
|
32
|
+
|
|
33
|
+
- **A TUI session now has an id, and another terminal can continue it.** Every
|
|
34
|
+
interactive session is written to `~/.aragon-agent/sessions/<id>.json` as it
|
|
35
|
+
runs and shows that id at the right end of the status bar (`id a4k2m9`, or
|
|
36
|
+
`a4k2m9` on a narrow terminal - the id itself is never truncated). Checkpoints
|
|
37
|
+
are written after the first frame, after every settled turn (debounced), on
|
|
38
|
+
`/session pin`, and once on exit; each one is an atomic replace, because a
|
|
39
|
+
second terminal may be reading. `aragon --resume <id|path>` continues a saved
|
|
40
|
+
session under a NEW id and never writes the file it came from, so branching
|
|
41
|
+
while the original TUI keeps running is safe - including
|
|
42
|
+
`aragon exec --resume <tui-id>`, which now writes a session of its own instead
|
|
43
|
+
of overwriting yours. `aragon --save <id>` names this run's id and pins it
|
|
44
|
+
against `sessions prune`. New `/session [copy|pin]` reports the id, the file and
|
|
45
|
+
the branch parent, copies the resume command through the same clipboard door as
|
|
46
|
+
`/copy` (OSC 52 included), and pins the file. A checkpoint taken mid-tool is
|
|
47
|
+
repaired on the saved copy only, so resuming it cannot produce an illegal
|
|
48
|
+
history, and a tool card that was still running is settled so nothing spins
|
|
49
|
+
after a resume. `aragon -p` writes one checkpoint at exit: context only, no
|
|
50
|
+
transcript, because nothing was displayed.
|
|
51
|
+
|
|
52
|
+
- **A model profile can be verified where it is written.** The profile editor
|
|
53
|
+
gains two action rows: **Test connection** (`Ctrl+R`) and **Discover models**
|
|
54
|
+
(`Ctrl+F`). A test is one real completion against the UNSAVED draft - the
|
|
55
|
+
provider, model, base URL and the key `keep`/`replace`/`shared` actually
|
|
56
|
+
resolves to - and it answers with a verdict (`OK 812 ms | 18 in / 4 out`) or a
|
|
57
|
+
classified failure plus the one thing to fix (`Key rejected by anthropic (HTTP
|
|
58
|
+
401).` / `Fix: edit API key, or set Credential mode to Shared.`). A discovery
|
|
59
|
+
lists what the key can really reach, so the model is picked instead of typed.
|
|
60
|
+
Both run against the draft, cost at most one short request (discovery costs no
|
|
61
|
+
tokens), never retry, and never write `ModelRegistry`'s five-minute discovery
|
|
62
|
+
cache. Every result is bound to a target fingerprint, so an `OK` can never
|
|
63
|
+
describe a model, endpoint or key the user has since edited. The progress line
|
|
64
|
+
is static text: no new animated site, so `single-spinner` still holds.
|
|
65
|
+
|
|
66
|
+
### Changed
|
|
67
|
+
|
|
68
|
+
- **`aragon sessions list` gained an `origin` column** and shows TUI checkpoints,
|
|
69
|
+
which are managed files now. `sessions prune` defaults to `--origin exec`, so it
|
|
70
|
+
behaves exactly as before for every file that existed before this release; the
|
|
71
|
+
new `--origin tui|all` selects the other writer. `prune` never deletes a pinned
|
|
72
|
+
session or one whose owner process is still alive, and `--all` now means only
|
|
73
|
+
"also consider files with no session metadata" - it can no longer reach a TUI
|
|
74
|
+
checkpoint. `/resume` inside the TUI moves the session to a new id and restarts
|
|
75
|
+
the spend counter, because a new id's file must not bill the previous
|
|
76
|
+
conversation.
|
|
77
|
+
|
|
78
|
+
### Fixed
|
|
79
|
+
|
|
80
|
+
- **A conversation saved mid-tool could be resumed into an illegal history.**
|
|
81
|
+
A `tool_call` with no matching `tool_result` makes the next request fail. The
|
|
82
|
+
checkpoint writer closes every dangling call on the copy it writes and re-checks
|
|
83
|
+
sendability before replacing the file; a history it cannot make sendable is not
|
|
84
|
+
written at all, so the previous good checkpoint survives.
|
|
85
|
+
- **A checkpoint could carry a tool card that never stopped spinning.** A card
|
|
86
|
+
saved while its tool was running kept `ToolCard` animated and kept the
|
|
87
|
+
transcript's settled boundary from ever passing it, which re-rendered the tail
|
|
88
|
+
on every frame for the rest of the resumed session. Cards are now settled on the
|
|
89
|
+
saved copy only, which leaves `/save` (an explicit export you are watching) and
|
|
90
|
+
its documented behaviour untouched.
|
|
91
|
+
- **`aragon exec --resume <tui-id>` overwrote the session it resumed.** The
|
|
92
|
+
write-back id preferred the file's own metadata, so exec took the TUI's id and
|
|
93
|
+
replaced the checkpoint - silent, unrecoverable loss of the conversation still
|
|
94
|
+
running in the other terminal. A TUI file now always yields a fresh id, and the
|
|
95
|
+
same rule covers `--session-id`, which used to return the typed id verbatim.
|
|
96
|
+
- **`sessions prune --origin tui --yes` could delete a running session's
|
|
97
|
+
checkpoint.** The `live` marker was written by the TUI but the process lock it
|
|
98
|
+
is checked against was only ever taken by `exec`, so the liveness guard answered
|
|
99
|
+
"nobody owns this" for exactly the files it was written for. The TUI checkpoint
|
|
100
|
+
writer now holds the session lock for as long as it owns the file, releases it
|
|
101
|
+
on exit, and moves it when `/resume` rotates the id.
|
|
102
|
+
- **`aragon --save <id>` said "already exists" for an id that does not exist.**
|
|
103
|
+
A session directory that cannot be written (read-only home, full disk) was
|
|
104
|
+
reported as a name collision, which sends the user to `--resume <id>` and then
|
|
105
|
+
to "no such session". It now names the directory instead.
|
|
106
|
+
- **A hand-written `/save` file resumed as if it were a branch of itself.**
|
|
107
|
+
`--resume ./notes.json` recorded `notes` as `meta.branchOf` and announced it as
|
|
108
|
+
the parent session, though it is not a session id. Lineage is now recorded only
|
|
109
|
+
for ids this CLI minted, and a collision while deriving a branch id re-mints the
|
|
110
|
+
suffix instead of dropping the branch shape.
|
|
111
|
+
- **`/session` answered `pinned no` right after `/session pin`.** The file was
|
|
112
|
+
marked and the report was not. The identity is now updated with the pin.
|
|
113
|
+
- **An id rotation could write one turn into the old id's file.** For the window
|
|
114
|
+
between `/resume` claiming a new id and the next render, the writer still aimed
|
|
115
|
+
at the previous file while recording the new parent. The rotation now republishes
|
|
116
|
+
the writer's id in the same step.
|
|
117
|
+
- **`/clear` did not clear the context.** It reset the visible transcript and the
|
|
118
|
+
todo panel and left `agent.state.messages` - the history that is actually sent,
|
|
119
|
+
billed, measured by `/context` and compacted - completely untouched. A long
|
|
120
|
+
session looked restarted and behaved like it had never been cleared: the next
|
|
121
|
+
request still carried every old turn, so the model remembered the previous task
|
|
122
|
+
and the occupancy gauge did not move. `/clear` now runs the one real
|
|
123
|
+
new-conversation boundary (`controller.resetConversation()`) in the only safe
|
|
124
|
+
order: interrupt the running turn (`forceStop`, which also drops the events the
|
|
125
|
+
unwinding engine keeps emitting), wait for it to settle inside a bounded budget,
|
|
126
|
+
archive the old conversation, drop both queues, then clear history, compaction
|
|
127
|
+
identity, context measurement and skill activation frames. A reset that cannot
|
|
128
|
+
stop the engine clears **nothing** and says so.
|
|
129
|
+
- **`/reset`'s "cancelled N queued messages" notice is preserved.** `/reset` is now
|
|
130
|
+
an alias of `/clear`, and the count is read **before** the queues are cleared -
|
|
131
|
+
read afterwards it would always be zero, which is a notice that lies.
|
|
132
|
+
|
|
133
|
+
### Changed
|
|
134
|
+
|
|
135
|
+
- **`/clear` means "start a new conversation"; the old behaviour moved to
|
|
136
|
+
`/clear screen`.** The previous semantics (wipe the transcript and the todo
|
|
137
|
+
panel, keep the history and the queue) are still available, spelled explicitly,
|
|
138
|
+
and are byte-identical to what `/clear` used to do. `/clear` no longer refuses
|
|
139
|
+
while a run is in flight: it interrupts, which removes the dead end where the
|
|
140
|
+
only command that worked mid-run was the one that kept the context.
|
|
141
|
+
- **`/reset` is an alias of `/clear`, one implementation.** Two bodies could drift
|
|
142
|
+
back into "one clears the screen, one clears the session"; one body cannot.
|
|
143
|
+
- **The conversation being cleared is archived first**, to
|
|
144
|
+
`~/.aragon-agent/sessions/cleared/cleared-<yyyyMMdd>-<HHmmss>-<pid>.json`
|
|
145
|
+
(newest 20 kept, `<ARAGON_HOME>` honoured). The path is reported in the
|
|
146
|
+
transcript and restores with `/resume <path>`. The file carries no `meta`, so
|
|
147
|
+
`sessions list` / `sessions prune` and `--continue` are unaffected; a failed
|
|
148
|
+
archive only logs and never blocks the clear.
|
|
149
|
+
|
|
150
|
+
- **`Ctrl+I` was dead on Windows.** The win32-input-mode translator only
|
|
151
|
+
recognised the chord when the console reported it as `VK_TAB` (vk 9) with
|
|
152
|
+
ctrl - a record shape no real console was ever probed for. Physical
|
|
153
|
+
Ctrl+I keeps the LETTER vk (0x49, the same Ctrl+letter rule that reports
|
|
154
|
+
Ctrl+A as vk 65 and Ctrl+J as vk 74 in the Shift+Enter probe captures)
|
|
155
|
+
while `char` carries the Tab byte, so the record fell through to the
|
|
156
|
+
generic Ctrl-combo branch, came out as plain Tab, and the keybinding
|
|
157
|
+
silently did completion instead of opening the index confirm. The
|
|
158
|
+
translator now tells Ctrl+I apart from Tab by `char === 0x09 && ctrl`
|
|
159
|
+
whatever vk it rides, with Shift still mapping to Shift+Tab; both record
|
|
160
|
+
shapes are pinned by regression rows in `win32-input-mode.test.ts`.
|
|
161
|
+
|
|
162
|
+
### Team dispatch supervisor (team-overseer)
|
|
163
|
+
|
|
164
|
+
- **A time ceiling on a subagent is now an inspection trigger, not a death
|
|
165
|
+
sentence.** With the supervisor on (new key `team.overseer`, default
|
|
166
|
+
`true`, needs the fast tier), two soft timers per child - event silence at
|
|
167
|
+
`idleTimeoutMs` and a wall clock at `subagentTimeoutMs` (or 5 minutes when
|
|
168
|
+
no ceiling is configured) - fire one bounded fast-tier inspection. The
|
|
169
|
+
supervisor decides wait / nudge / replace / abandon; the runtime applies,
|
|
170
|
+
funnelling every lifecycle change through the worker loop that awaits the
|
|
171
|
+
child, so a replacement is never built for nobody.
|
|
172
|
+
- **A nudge is steering; a replace is a rebuild with an amended brief.**
|
|
173
|
+
Guidance is queued at core's safe top-of-loop checkpoint; a replacement
|
|
174
|
+
carries the supervisor's reason, the dead child's `filesTouched`, and the
|
|
175
|
+
original brief bounded to the same prompt budget. A post-mortem inspection
|
|
176
|
+
diagnoses a child that died silently (watchdog death, stream loss) and may
|
|
177
|
+
re-assign it once.
|
|
178
|
+
- **Budgets are structural, not settings**: 4 inspections and 1 replacement
|
|
179
|
+
per child per dispatch; past them the child runs under its own (lengthened
|
|
180
|
+
while supervised) idle watchdog and the supervisor goes quiet. An
|
|
181
|
+
unparseable or failing supervision call always becomes `wait` -
|
|
182
|
+
supervision must never kill a healthy child.
|
|
183
|
+
- Every applied decision is visible three ways: the report's Supervisor
|
|
184
|
+
section (`[silence 30s] a1: nudge - ...`), the team panel and the `-p`
|
|
185
|
+
stderr line, and a `debug` log event. `aragon exec` emits it as an
|
|
186
|
+
additive `team` subtype `overseer` (`EXEC_SCHEMA_VERSION` unchanged).
|
|
187
|
+
- New command `/team overseer on|off` (refused mid-dispatch, like every
|
|
188
|
+
other `/team` setting) and new config key `team.overseer`, also settable
|
|
189
|
+
as `aragon config set team.overseer false`. With the supervisor off - or
|
|
190
|
+
no fast tier - every path is byte-for-byte the pre-feature regime:
|
|
191
|
+
`subagentTimeoutMs` is a hard abort and silence is the child's own
|
|
192
|
+
watchdog.
|
|
193
|
+
|
|
194
|
+
### 启动与缩窗不再误报 Frame diff lost sync
|
|
195
|
+
|
|
196
|
+
- 启动即现的 "Frame diffing lost sync with the terminal and fell back to a
|
|
197
|
+
full repaint … `--no-diff-render`" 警告已消除:Ink 挂载/卸载经渲染 stdout 写出的
|
|
198
|
+
光标隐藏/恢复序列(`ESC[?25l` / `ESC[?25h`)由帧写入器直接透传——不进差分、
|
|
199
|
+
不失效缓存、不计 fallback,也不再消耗会话的首写豁免。启动序列恢复
|
|
200
|
+
"种子帧透传 → 首帧全量 → 之后纯 diff"。
|
|
201
|
+
- 终端高度缩小(拖小窗口、改字号、面板重排)不再触发同一条警告:Ink 的
|
|
202
|
+
`clearTerminal` 整帧写入被差分器识别为 Ink 自身写法,透传并失效缓存但不计
|
|
203
|
+
fallback;该控制写同样不消耗首写豁免,其后的首个 log-update 帧仍按种子帧豁免,
|
|
204
|
+
下一帧自然全量重绘。
|
|
205
|
+
- `/perf` 的 `fallbacks` 重新从 0 起步,"健康会话 fallbacks === 0" 的诊断信号
|
|
206
|
+
(AC-11)恢复可判。
|
|
207
|
+
|
|
208
|
+
### Consistent TUI styling
|
|
209
|
+
|
|
210
|
+
- Interactive sessions always use Unicode and default to truecolor, including
|
|
211
|
+
PowerShell sessions without terminal or UTF locale markers. Ink's actual color
|
|
212
|
+
output follows the same policy, with renderer state restored on exit.
|
|
213
|
+
- Explicit color opt-outs keep Unicode borders and icons; the opening logo now
|
|
214
|
+
depends only on available space. Headless terminal detection is unchanged.
|
|
215
|
+
- Reloading model settings preserves session display preferences. Syntax
|
|
216
|
+
highlighting follows the same color policy, and status icons use consistent
|
|
217
|
+
single-column glyphs to prevent narrow-frame overflow.
|
|
218
|
+
- Hiding the editor caret while scrolling preserves draft geometry, preventing
|
|
219
|
+
a layout update loop when entering text above the full startup logo.
|
|
220
|
+
- Register exit cleanup before mounting the application, so immediate exits and
|
|
221
|
+
initial render failures restore terminal and color state reliably. Failed
|
|
222
|
+
mounts no longer mark an auto-installed build as healthy.
|
|
223
|
+
|
|
224
|
+
### Model context window
|
|
225
|
+
|
|
226
|
+
- Discover context limits at startup and after connection changes without blocking
|
|
227
|
+
input. The status bar and compaction use the discovered limit; `/context` names
|
|
228
|
+
API versus catalog metadata. Unknown windows show `?`, not a fabricated 128k
|
|
229
|
+
capacity or percentage. Manual `contextWindow` overrides retain precedence.
|
|
230
|
+
- Window overrides now apply to tail relief and compaction progress as well as
|
|
231
|
+
the gauge. Workers on different models/endpoints do not inherit the lead's
|
|
232
|
+
override. API-key changes refresh metadata, and ending a session cancels its
|
|
233
|
+
pending model queries. `/context` also hides unknown capacities/percentages.
|
|
234
|
+
|
|
235
|
+
### TUI 输入与排队可靠性
|
|
236
|
+
|
|
237
|
+
- Shift+Enter 与粘贴按输入顺序处理;普通 Enter 保持弹层兼容,混合输入最多提交一次,
|
|
238
|
+
余稿及拒绝提交的正文保留。结束输入流时完整排空,不泄漏内部控制标记。
|
|
239
|
+
- 超限粘贴拒绝同一外部输入块的正文和 Enter,避免误提交旧稿;未闭合粘贴继续按正文消费。
|
|
240
|
+
- 拖选后仅 Ctrl+C 复制;文字变化与丢失鼠标释放时取消无效高亮,避免卡住视口。
|
|
241
|
+
- 固定 Queue 状态行按消息 ID 回执更新,支持窄屏、暂停与多条消息计数。
|
|
242
|
+
- 保存和退出保留所有未发送全文;恢复先验证存档,旧 queued 作为警告展示且不自动重放。
|
|
243
|
+
|
|
244
|
+
### Removed
|
|
245
|
+
|
|
246
|
+
- Removed the inline terminal UI and its automatic downgrade rules. Interactive
|
|
247
|
+
sessions now always use the full-screen UI; small windows show a resize notice.
|
|
248
|
+
- Removed `--fullscreen`, `--no-fullscreen`, `ARAGON_FULLSCREEN`, and the
|
|
249
|
+
`fullscreen` config setting. Old flags are rejected and old stored preferences
|
|
250
|
+
are ignored. Headless commands and piped input retain their existing behavior.
|
|
251
|
+
- Interactive-only screens now reject non-TTY input/output with exit code 2.
|
|
252
|
+
|
|
253
|
+
### Added
|
|
254
|
+
|
|
255
|
+
- **`system/init` now lists what this build can do.** A new optional
|
|
256
|
+
`capabilities: string[]` field, carrying `["interrupt"]` for this release.
|
|
257
|
+
|
|
258
|
+
A wrapper cannot tell by observation whether an interrupt will settle
|
|
259
|
+
gracefully or kill the process outright, and guessing wrong costs the user
|
|
260
|
+
their conversation. Rather than have callers compare version numbers — which
|
|
261
|
+
breaks on forks, prereleases, and version shapes nobody anticipated — the
|
|
262
|
+
build now says so itself, in an event that already arrives on every start.
|
|
263
|
+
Absent on older builds, and absence should be read as "no", never as
|
|
264
|
+
"probably".
|
|
265
|
+
|
|
266
|
+
Additive, so `schemaVersion` does not move. Consumers that do not know the
|
|
267
|
+
field ignore it, exactly as the schema contract asks.
|
|
268
|
+
|
|
269
|
+
- **The composer understands pasting.** Until now it did not have the concept at
|
|
270
|
+
all: every byte the terminal delivered on stdin was a keystroke, and a
|
|
271
|
+
clipboard block is thousands of bytes arriving in an unpredictable number of
|
|
272
|
+
chunks. Three separate failures fell out of that one omission, and on Windows
|
|
273
|
+
you hit all three at once.
|
|
274
|
+
|
|
275
|
+
A carriage return that landed alone in a chunk **sent the half-finished
|
|
276
|
+
message** — a fifteen-line paste could arrive as a dozen separate messages,
|
|
277
|
+
interleaved with the agent's replies. A carriage return in the middle of a
|
|
278
|
+
chunk was inserted into the draft as a literal `\r`, which the terminal obeyed
|
|
279
|
+
by **overwriting the row it was drawn on**. And a paste that survived both grew
|
|
280
|
+
the composer to the height of the pasted text, pushing the transcript out of a
|
|
281
|
+
frame whose row accounting still believed the composer was three rows tall.
|
|
282
|
+
|
|
283
|
+
Pasting now works the way it reads:
|
|
284
|
+
|
|
285
|
+
- **A paste never submits.** Line breaks become buffer newlines, exactly one
|
|
286
|
+
per source line break, `CRLF` and lone `CR` alike.
|
|
287
|
+
- **A short paste appears verbatim.** At or below 6 lines and 400 characters it
|
|
288
|
+
is inserted as-is, indentation intact, and renders exactly like typed text.
|
|
289
|
+
- **A large paste collapses to a placeholder** — `[Pasted text #1 +218 lines]`
|
|
290
|
+
— which occupies one line, carries its own size in its label, deletes as a
|
|
291
|
+
single unit (one `Backspace`, and `Ctrl+W` / `Ctrl+U` / `Ctrl+K` cannot leave
|
|
292
|
+
half of one behind), and expands back to the full text the moment you send.
|
|
293
|
+
The model receives every byte; the composer never has to draw them.
|
|
294
|
+
- **No pasted byte is executed as a terminal control.** `\r`, `\x1b`, NUL, DEL
|
|
295
|
+
and the C1 range are stripped from the payload — never from your keystrokes,
|
|
296
|
+
so `Ctrl+A` and Escape are untouched.
|
|
297
|
+
- **The composer has a ceiling.** A draft of any length occupies at most 3 / 6 /
|
|
298
|
+
10 rows depending on terminal height, scrolls internally to keep the caret
|
|
299
|
+
visible, shows how many rows are hidden above and below, and reports its true
|
|
300
|
+
height to the layout budget. Four hundred presses of `Shift+Enter` were
|
|
301
|
+
already able to destroy the frame; they no longer are.
|
|
302
|
+
- **A submitted message cannot make the transcript unresponsive.** A user entry
|
|
303
|
+
renders at most 40 rows plus a `... +N more lines` tail. The full text is kept
|
|
304
|
+
and the exit transcript is uncapped.
|
|
305
|
+
|
|
306
|
+
On terminals that support it, detection is **exact**: aragon asks for bracketed
|
|
307
|
+
paste (`DECSET 2004`) in full-screen mode and reads the markers the terminal
|
|
308
|
+
wraps your paste in. Where that is unavailable — inline mode, an old Windows
|
|
309
|
+
console — a heuristic on chunk shape catches the same cases, and it needs no
|
|
310
|
+
cooperation from the terminal at all. Both feed one code path.
|
|
311
|
+
|
|
312
|
+
Turn it off with `--no-paste`, `ARAGON_PASTE=0`, or
|
|
313
|
+
`aragon config set paste false`; the input path is then byte-for-byte what
|
|
314
|
+
0.6.2 did.
|
|
315
|
+
|
|
316
|
+
### Fixed
|
|
317
|
+
|
|
318
|
+
- **The right-edge scrollbar no longer disappears while output streams.** The
|
|
319
|
+
differential renderer ended every repainted row with `CSI K` (erase to end of
|
|
320
|
+
line). The scrollbar fills the last column of every viewport row, and on
|
|
321
|
+
terminals that keep the cursor on the last column after writing it (Windows
|
|
322
|
+
console hosts) that erase blanked the cell that had just been drawn, so the
|
|
323
|
+
scrollbar vanished whenever a row was redrawn. Rows that already fill the
|
|
324
|
+
terminal width are now repainted without the erase; narrower rows are
|
|
325
|
+
unchanged. `--no-diff-render` was never affected. `/perf` gained a `scrollbar:`
|
|
326
|
+
line for diagnosing visibility and drag problems.
|
|
327
|
+
|
|
328
|
+
- **`{"type":"interrupt"}` now really does settle the run — on every platform.**
|
|
329
|
+
The stdin interrupt frame used to raise a SIGINT at our own process. On POSIX
|
|
330
|
+
that reaches the runner's terminator and the run winds down properly: it
|
|
331
|
+
breaks out of the loop, persists the session, and emits `result` with the
|
|
332
|
+
usage and cost. On Windows, Node does not deliver a self-directed SIGINT to
|
|
333
|
+
its own handlers — the process simply terminated with exit code 1, having run
|
|
334
|
+
none of it.
|
|
335
|
+
|
|
336
|
+
For anyone using `aragon exec` interactively that difference was invisible,
|
|
337
|
+
because an interrupt there is usually the last thing that happens. It is not
|
|
338
|
+
invisible to a **wrapper** that interrupts a turn and then respawns on the same
|
|
339
|
+
`--session-id` to keep the conversation going: on Windows it silently got back
|
|
340
|
+
a session missing everything since the previous save. `exec/index.ts` has
|
|
341
|
+
carried a comment about that caller for some time ("PERSIST FIRST, ANNOUNCE
|
|
342
|
+
SECOND … a caller that reads `result` and immediately respawns with the same
|
|
343
|
+
`--session-id` must not race the writer"), so the intent was there; the path
|
|
344
|
+
just could not be reached on Windows.
|
|
345
|
+
|
|
346
|
+
The frame now calls the runner directly instead of going through a signal.
|
|
347
|
+
POSIX behaviour is byte-for-byte unchanged — the same code runs, with the same
|
|
348
|
+
`stopReason`, the same exit code 130, and the same two-second window in which a
|
|
349
|
+
second signal still forces an immediate exit.
|
|
350
|
+
|
|
351
|
+
- **A pasted API key is stored correctly again.** Ink broadcasts each stdin chunk
|
|
352
|
+
to every mounted input handler, so the settings screen, the question overlay
|
|
353
|
+
and the plan-review feedback field all see what the composer sees. Without
|
|
354
|
+
this, a ~100-character key pasted into Settings would have been stored wrapped
|
|
355
|
+
in invisible framing bytes, masked on screen by the password dots, and would
|
|
356
|
+
have failed to authenticate on every request afterwards with nothing anywhere
|
|
357
|
+
explaining why.
|
|
358
|
+
|
|
359
|
+
- **`--no-mouse` still writes no mouse sequence.** Paste support installs a
|
|
360
|
+
stdin filter, and `paste` defaults to on, so the filter now exists in sessions
|
|
361
|
+
that disabled the mouse. Whether the mouse is on is a separate question from
|
|
362
|
+
whether the stream is wrapped, and the four places that used to conflate them
|
|
363
|
+
now ask the right one: `aragon --no-mouse` writes no `?1000h`, no `?1006h` and
|
|
364
|
+
no `?1002h`, leaves your terminal's own click-drag selection alone, and reports
|
|
365
|
+
`/mouse` as off — while pasting still works.
|
|
366
|
+
|
|
367
|
+
### Changed
|
|
368
|
+
|
|
369
|
+
- **The run status row moved above the input box and carries the `steer` hint.**
|
|
370
|
+
While a run is active, the spinner, the phrase and `steer / interrupt / exit`
|
|
371
|
+
share one row directly above the input, in place of the idle hint row below it
|
|
372
|
+
(the footer keeps its height). It scrolls with the input; when it leaves the
|
|
373
|
+
viewport the fixed bottom row shows the animation instead, so there is never
|
|
374
|
+
more than one spinner. Terminals under 20 rows and `--no-hints` keep the old
|
|
375
|
+
fixed row. The update notice is also held back for the whole run.
|
|
376
|
+
|
|
377
|
+
- **Auto-compaction no longer reports compactions that did not happen.** A long
|
|
378
|
+
unattended run used to print a red `context not compacted #2: nothing_to_drop`
|
|
379
|
+
card into the transcript. The card was accurate; nobody had asked for it.
|
|
380
|
+
Auto-compaction evaluates itself at every turn boundary, and a checkpoint that
|
|
381
|
+
looks at the history and finds nothing worth dropping has changed nothing,
|
|
382
|
+
called nothing and spent nothing — a smoke alarm announcing "no fire" twice an
|
|
383
|
+
hour, in error colours, with a machine reason attached.
|
|
384
|
+
|
|
385
|
+
A compaction now announces itself **if and only if it commits to doing work**.
|
|
386
|
+
That is a position in the control flow, not a list of reason strings: everything
|
|
387
|
+
decided before the first spend is silent, and everything decided after it —
|
|
388
|
+
including every failure, the truncation fallback, an Esc, and a host fault — is
|
|
389
|
+
as loud as it ever was. A declined `pressure` checkpoint is now
|
|
390
|
+
indistinguishable from a turn on which the threshold was never crossed.
|
|
391
|
+
|
|
392
|
+
**`/compact` and overflow recovery are unchanged.** A compaction you asked for
|
|
393
|
+
is owed an answer, and a reactive compaction running after the provider has
|
|
394
|
+
already refused your request is the one moment the diagnosis matters most. Both
|
|
395
|
+
still report on every outcome.
|
|
396
|
+
|
|
397
|
+
**Quiet, not unrecorded.** Every attempt is still written to the diagnostic log
|
|
398
|
+
(its `compaction` line gains an `announced` field, so `announced: false` is one
|
|
399
|
+
grep), still charged to the anti-loop guards, and still counted by
|
|
400
|
+
`/compact status` — which now reads
|
|
401
|
+
`This session: 1 compaction (2 checkpoints declined), 94.2k tokens reclaimed`
|
|
402
|
+
when checkpoints declined, and is byte-identical to before when none did. If
|
|
403
|
+
declines keep happening, the self-disable notice still says so out loud, once,
|
|
404
|
+
naming the cause and the remedies. Card numbers are also contiguous again: `#N`
|
|
405
|
+
counts compactions that ran, not checkpoints that fired.
|
|
406
|
+
|
|
407
|
+
**Behaviour change for wrapper scripts.** A declined `pressure` compaction no
|
|
408
|
+
longer emits a `{ type: 'compaction', subtype: 'start' | 'end' }` pair on the
|
|
409
|
+
`--output-format json` stream, and no longer prints `[compaction] skipped:` on
|
|
410
|
+
`-p` stderr. The pairs stay balanced, so only consumers counting *attempts* are
|
|
411
|
+
affected; the diagnostic log reports those more accurately.
|
|
412
|
+
|
|
413
|
+
### Added
|
|
414
|
+
|
|
415
|
+
- **Context compaction, hardened — the trigger now counts the whole history, the
|
|
416
|
+
recent turns can no longer wedge a run, sub-agents get the same protection, and
|
|
417
|
+
a compaction is no longer irreversible.**
|
|
418
|
+
|
|
419
|
+
**The trigger was systematically late.** It fired on the provider's reported
|
|
420
|
+
usage for the PREVIOUS request, read at a checkpoint that runs AFTER the current
|
|
421
|
+
turn's tool results were appended — and tool results are the largest single
|
|
422
|
+
increment in this loop (100 KB per call, several per turn, ~25 k tokens each).
|
|
423
|
+
A session reading 88 % could be sending 110 %. Occupancy is now the measured
|
|
424
|
+
base PLUS an estimate of everything appended since that measurement, and the
|
|
425
|
+
status gauge reads the same number the trigger does, on every turn — including
|
|
426
|
+
the turns where a guard declines to compact, which is exactly when the number
|
|
427
|
+
matters most.
|
|
428
|
+
|
|
429
|
+
**The recent turns can no longer wedge a run.** Every previous rung of the
|
|
430
|
+
ladder operated on the head of the conversation. When the RETAINED tail was what
|
|
431
|
+
did not fit, each rung reported success or "nothing to drop" while the history
|
|
432
|
+
stayed un-sendable and the run died. Oversized `tool_result` bodies inside the
|
|
433
|
+
retained turns are now clipped, oldest first, only when the alternative is a
|
|
434
|
+
request the provider cannot accept. Nothing is removed — no message, no
|
|
435
|
+
tool-call id, no role — so a valid history stays valid. Every clip is announced
|
|
436
|
+
in the text the model reads, at the exact place the data went, and on the card,
|
|
437
|
+
in `/compact status`, on the JSON stream and in the archive.
|
|
438
|
+
|
|
439
|
+
**Sub-agents compact their own history** (`compaction.subagents`, default
|
|
440
|
+
`true`). A `task` child is bounded by 24 turns and fifteen minutes, and when one
|
|
441
|
+
overflowed its entire history was discarded and the dispatch reached the lead as
|
|
442
|
+
one partial sentence. Children run under tighter bounds than the lead: two
|
|
443
|
+
retained turns, at most two compactions, the fast tier preferred, and failure
|
|
444
|
+
forced to truncate because nobody is watching a background worker. No transcript
|
|
445
|
+
card — the lead's transcript describes the lead's context. Set
|
|
446
|
+
`compaction.subagents: false` to restore the previous behaviour exactly.
|
|
447
|
+
|
|
448
|
+
**A compaction is no longer irreversible** (`compaction.archive`, default
|
|
449
|
+
`true`). The dropped messages are written verbatim to `~/.aragon/compaction/`
|
|
450
|
+
before the splice is adopted. `/compact history` lists this run's archives,
|
|
451
|
+
`/compact show <n>` prints one's metadata and summary — never message bodies.
|
|
452
|
+
The directory is shared by every `aragon` on the machine, so files carry a
|
|
453
|
+
per-process run id and retention is two-tier: 20 files per run by count, plus a
|
|
454
|
+
seven-day sweep across all runs, so one session can never prune a live
|
|
455
|
+
neighbour's work. Writing is best-effort: a failure is logged and never affects
|
|
456
|
+
the compaction. This is deliberately **not** undo — restoring an over-full
|
|
457
|
+
history restores the condition that triggered the compaction.
|
|
458
|
+
|
|
459
|
+
**The long moment is legible.** The live card counts elapsed seconds and says
|
|
460
|
+
`esc to cancel`, which `AgentController.abort()` has always made true and no
|
|
461
|
+
surface has ever stated. A compaction that could only clip says so and names no
|
|
462
|
+
model, because none was called.
|
|
463
|
+
|
|
464
|
+
Two new config keys (`compaction.subagents`, `compaction.archive`), two new
|
|
465
|
+
environment variables (`ARAGON_COMPACTION_SUBAGENTS`,
|
|
466
|
+
`ARAGON_COMPACTION_ARCHIVE`), two new `/compact` verbs (`history`, `show <n>`),
|
|
467
|
+
and two new settings-screen rows. No flags were added.
|
|
468
|
+
|
|
469
|
+
- **Context compaction — a long run no longer dies when the window fills, and it
|
|
470
|
+
is ON by default.** A session's conversation only grows: nothing anywhere
|
|
471
|
+
removed a message, so a 40-turn tool-heavy run had exactly one ending available
|
|
472
|
+
to it once the context window filled — an HTTP 400 and a banner reading
|
|
473
|
+
*"Context length exceeded — start a new conversation with /reset."* The
|
|
474
|
+
product's answer to running out of context was "throw away everything you were
|
|
475
|
+
doing."
|
|
476
|
+
|
|
477
|
+
Now, at **90 %** occupancy, the run pauses at a turn boundary, hands the older
|
|
478
|
+
part of the history to a summarizer, and swaps it for a structured record. Your
|
|
479
|
+
original task stays **verbatim**, the most recent turns stay **verbatim**, and
|
|
480
|
+
the run continues in the same loop with the same tools, the same todo list and
|
|
481
|
+
the same working directory.
|
|
482
|
+
|
|
483
|
+
**This changes behaviour for existing users, in the direction of not dying.**
|
|
484
|
+
`--no-compaction`, or `compaction.enabled: false`, restores the old behaviour
|
|
485
|
+
exactly: no manager is constructed, nothing is subscribed, no registry is
|
|
486
|
+
allocated, and a full window ends the run as it did before. Both flag forms are
|
|
487
|
+
declared, so a stored `false` survives a run that passes no flags.
|
|
488
|
+
|
|
489
|
+
Three ways it fires. **Proactively** on measured occupancy — the case that
|
|
490
|
+
happens almost every time. **Reactively** when the provider returns
|
|
491
|
+
`context_overflow` anyway, because the model is not in the static window table
|
|
492
|
+
or you are pointed at a proxy in front of a smaller one: one compaction, one
|
|
493
|
+
re-send, run continues. And **manually**, via `/compact`, which runs
|
|
494
|
+
immediately when idle and queues to the next turn boundary when running.
|
|
495
|
+
|
|
496
|
+
The trigger has two terms. 90 % of a 200 k window leaves 20 k, which is plenty;
|
|
497
|
+
90 % of a 32 k window leaves 3.2 k, which is less than a single `max_tokens` of
|
|
498
|
+
8192 — the request is already impossible. So compaction also fires whenever the
|
|
499
|
+
remaining headroom drops below one full response.
|
|
500
|
+
|
|
501
|
+
**The default summarizer is your own model, and that costs real money.**
|
|
502
|
+
`compaction.useFastTier` is `true`, but it is a *preference*: the fast tier is
|
|
503
|
+
off unless you configured it, so out of the box the first compaction is a
|
|
504
|
+
~30 k-token call on the session's own model. It happens at most 5 times per
|
|
505
|
+
run, the alternative is losing the run entirely, and the spend is visible — in
|
|
506
|
+
the session total, priced with the summarizer's own table, and reported as
|
|
507
|
+
`pricing unknown` rather than `$0.00` when that table has never seen the model.
|
|
508
|
+
Configure the fast tier to make it cheap.
|
|
509
|
+
|
|
510
|
+
Summarization fails sometimes. The ladder is one retry (on your **main** model
|
|
511
|
+
if the first attempt used the fast tier), then a **truncation** that says so on
|
|
512
|
+
the card, on the JSON event stream, and inside the block the model itself
|
|
513
|
+
reads. `compaction.onFailure: "stop"` makes the other trade.
|
|
514
|
+
|
|
515
|
+
Four guards stop it looping on your money: never two on consecutive turns,
|
|
516
|
+
never more than 5 per run, a progress requirement, and a self-disable after two
|
|
517
|
+
no-progress attempts with a notice naming the cause and the fix. The guards are
|
|
518
|
+
**trigger-aware** — the reactive path stays armed even after a self-disable,
|
|
519
|
+
because a compaction answering a request the provider has already refused is
|
|
520
|
+
the difference between a live run and a dead one.
|
|
521
|
+
|
|
522
|
+
Three UI surfaces: `Compacting context…` on the activity row while it runs, a
|
|
523
|
+
`compacting` chip plus threshold-aligned gauge colours as state, and a
|
|
524
|
+
transcript card with the before/after counts, the summarizer, the duration and
|
|
525
|
+
an expandable summary as the record. The gauge falls **immediately** rather
|
|
526
|
+
than waiting for the next turn. `/compact status` is the guaranteed surface at
|
|
527
|
+
any width.
|
|
528
|
+
|
|
529
|
+
New: `compaction` config section (6 keys), `--compaction` / `--no-compaction` /
|
|
530
|
+
`--compaction-threshold`, `ARAGON_COMPACTION*` (3 vars), `/compact` (6 forms),
|
|
531
|
+
three settings-screen rows, a `compaction` event on the `aragon exec` JSON
|
|
532
|
+
stream (`EXEC_SCHEMA_VERSION` **unchanged** — adding an event type never bumps
|
|
533
|
+
it), and two stderr lines under `-p`.
|
|
534
|
+
|
|
535
|
+
### Changed
|
|
536
|
+
|
|
537
|
+
- **The context gauge now counts cache tokens**, through the same
|
|
538
|
+
`occupiedTokens` the compaction trigger reads. Anthropic reports `input_tokens`
|
|
539
|
+
*excluding* cached tokens and puts them in two separate fields, so the old
|
|
540
|
+
`inputTokens + outputTokens` silently under-reported occupancy for anyone
|
|
541
|
+
behind a caching gateway. That was already a defect in the number on the status
|
|
542
|
+
bar; it becomes a much worse one the moment a trigger fires on a different
|
|
543
|
+
number from the one you are watching.
|
|
544
|
+
|
|
545
|
+
- **`context_overflow` now names `/compact` alongside `/reset`.** That remedy
|
|
546
|
+
list was complete until this release, because throwing the conversation away
|
|
547
|
+
really was the only exit.
|
|
548
|
+
|
|
549
|
+
### Known limitation
|
|
550
|
+
|
|
551
|
+
- **A summarizer that is 90 % faithful will, eventually, drop something the run
|
|
552
|
+
needed,** and no amount of prompt engineering closes that. The design bounds it
|
|
553
|
+
— verbatim task, verbatim recent turns, a block that tells the model the record
|
|
554
|
+
is partial, and three surfaces that make it visible so a human can step in —
|
|
555
|
+
but it does not eliminate it. That is inherent to compaction as a technique, it
|
|
556
|
+
is the same trade Claude Code and Codex make, and it is preferable by a wide
|
|
557
|
+
margin to the previous behaviour, which was to lose the entire run.
|
|
558
|
+
|
|
559
|
+
## 0.6.0
|
|
560
|
+
|
|
561
|
+
### Added
|
|
562
|
+
|
|
563
|
+
- **`aragon exec` — a second, machine-facing face on the same binary.** The
|
|
564
|
+
package already installed from npm and already ran from a terminal, so "it has
|
|
565
|
+
a CLI" was true. It was nonetheless not *callable* by another program:
|
|
566
|
+
everything it exposed was shaped for a person, and a build script, a CI job, a
|
|
567
|
+
web backend or a second agent had to spawn it, capture free text, and guess.
|
|
568
|
+
There was no way to read the answer without also reading the narration, no way
|
|
569
|
+
to carry a conversation across two invocations, no way to say "you may read but
|
|
570
|
+
not write" when there is no human to answer `--confirm`, and no way to bound
|
|
571
|
+
what a run may spend.
|
|
572
|
+
|
|
573
|
+
`aragon exec` adds a **contract** rather than a feature: a versioned JSON event
|
|
574
|
+
schema on stdout, a session identifier the caller may mint itself, a tool
|
|
575
|
+
permission policy enforced at the tool boundary, caller-set budgets with their
|
|
576
|
+
own exit code, and a discovery command so a wrapper can ask what it just
|
|
577
|
+
installed before depending on it. Everything underneath is reused unchanged —
|
|
578
|
+
the same controller, the same tools, the same config resolution, the same
|
|
579
|
+
skills, teams, todo and fast-tier subsystems.
|
|
580
|
+
|
|
581
|
+
- `--output-format text | json | stream-json`. `stream-json` is NDJSON: one
|
|
582
|
+
object per line, `system/init` first, exactly one `result` last, on every
|
|
583
|
+
exit path including error, budget and signal. `text` is byte-identical to
|
|
584
|
+
`aragon -p`, because it **delegates** to the same renderer rather than
|
|
585
|
+
reimplementing it.
|
|
586
|
+
- `--session-id` / `--resume` / `--continue`, backed by `~/.aragon-agent/
|
|
587
|
+
sessions/` and an exclusive lock, so two runs cannot interleave and lose a
|
|
588
|
+
turn. A second run on a held id exits 2 with `session_busy` rather than
|
|
589
|
+
blocking.
|
|
590
|
+
- `--permission-mode auto|plan|strict` plus `--allow-tool` / `--deny-tool`.
|
|
591
|
+
A denied tool is **not registered at all**, so the model never sees it and
|
|
592
|
+
never plans around it — and the policy reaches subagents, so one `task` call
|
|
593
|
+
cannot bypass it.
|
|
594
|
+
- `--max-turns` / `--max-duration`, both aborting through the same path `Esc`
|
|
595
|
+
uses, both reporting `isError: false` and exit **3**: a budget firing is not
|
|
596
|
+
a malfunction, but it is not a complete answer either, and a shell script has
|
|
597
|
+
to be able to tell without parsing JSON.
|
|
598
|
+
- `--append-system-prompt` / `--append-system-prompt-file`. Appending only;
|
|
599
|
+
there is deliberately no full `--system-prompt` replacement, because the
|
|
600
|
+
builtin prompt carries tool discipline, todo planning, the skills catalog and
|
|
601
|
+
the plan-mode block, and replacing it silently disables half the product.
|
|
602
|
+
- `--input-format stream-json`, so one process can serve several turns from a
|
|
603
|
+
pipe. A malformed line is skipped with a non-fatal `error` event; an unknown
|
|
604
|
+
message type is ignored.
|
|
605
|
+
- **`aragon sessions`** (`list` / `show` / `rm` / `prune` / `path`),
|
|
606
|
+
**`aragon info [--json]`** and **`aragon doctor [--json] [--probe]`**.
|
|
607
|
+
|
|
608
|
+
Documented in full under
|
|
609
|
+
[Use it from another project](./README.md#use-it-from-another-project),
|
|
610
|
+
including an honest Limits section: there is no filesystem sandbox, process
|
|
611
|
+
exit is terminal on Windows whether or not a `result` arrived, an exec session
|
|
612
|
+
resumed in the TUI shows no scrollback, and `sessions prune` shares a directory
|
|
613
|
+
with the TUI's `/save`.
|
|
614
|
+
|
|
615
|
+
### Changed
|
|
616
|
+
|
|
617
|
+
- **Exit code `3` is new, and the signal row is now stated as `128 + signo`.**
|
|
618
|
+
`3` means "stopped by a budget you set" and is reachable only from
|
|
619
|
+
`aragon exec`. The signal codes are unchanged in behaviour — this CLI has
|
|
620
|
+
always exited `128 + signo`, so `SIGTERM` has always been `143` — but the
|
|
621
|
+
README previously simplified all of them to `130`, which is fine for prose
|
|
622
|
+
about a CLI a human interrupts and not good enough for a wire contract.
|
|
623
|
+
- `interrupt` handling now settles the run before exiting when `aragon exec`
|
|
624
|
+
owns it, so a wrapper reading NDJSON gets a final `result` on Ctrl-C instead of
|
|
625
|
+
having to time out to learn the run ended. `aragon`, `aragon -p` and every
|
|
626
|
+
other subcommand keep the previous bare-exit behaviour byte for byte.
|
|
627
|
+
|
|
628
|
+
### Unchanged, and asserted rather than claimed
|
|
629
|
+
|
|
630
|
+
- `aragon`, `aragon -p`, every existing flag, every slash command and every byte
|
|
631
|
+
of their output. `aragon exec --output-format text` and `runHeadless` are
|
|
632
|
+
compared for byte equality on **both** stdout and stderr by a regression test,
|
|
633
|
+
and `createBuiltinTools` with no permission policy is proven by object identity
|
|
634
|
+
to return the tools it returned before.
|
|
635
|
+
|
|
636
|
+
## Unreleased
|
|
637
|
+
|
|
638
|
+
### Project index on Ctrl+I (bundled `project-indexer` skill)
|
|
639
|
+
|
|
640
|
+
- The `project-indexer` skill now ships **bundled** with the package
|
|
641
|
+
(`<pkg>/skills/project-indexer`, read-only, alongside `skill-creator`): it
|
|
642
|
+
generates the `.claude-index/` navigation map and injects the Google-style
|
|
643
|
+
Clean Code Guidelines section into `CLAUDE.md`, adapted from the standalone
|
|
644
|
+
Claude Code skill (ask_user instead of AskUserQuestion; body condensed under
|
|
645
|
+
the 30 KB invocation budget with the four templates bundled as files).
|
|
646
|
+
- New keybinding `Ctrl+I`: opens a Yes/No confirm that names every write
|
|
647
|
+
target, then dispatches `/skill:project-indexer` through the ordinary
|
|
648
|
+
command path - the indexing run is a normal agent turn whose tool calls
|
|
649
|
+
stream into the transcript. While a run is in flight the key warns instead
|
|
650
|
+
of queueing; with skills disabled or the skill shadowed it explains instead
|
|
651
|
+
of failing silently.
|
|
652
|
+
- `Ctrl+I` is legacy-encoded as the Tab byte, so the stdin filter's two
|
|
653
|
+
translators (win32-input-mode on Windows, kitty CSI-u / modifyOtherKeys
|
|
654
|
+
elsewhere) now emit a distinct NUL-delimited `INDEX_KEY_FRAME` for it -
|
|
655
|
+
the same framing technique `Shift+Enter` uses. On terminals with neither
|
|
656
|
+
protocol the key keeps its legacy Tab meaning (completion).
|
|
657
|
+
- The header names the key next to the detail toggle: `^I Index` collapsed,
|
|
658
|
+
`^I build index` in the `Ctrl+G` expanded state; hidden below 72 columns and
|
|
659
|
+
while an overlay is open. `/skill:project-indexer` and `/project-indexer`
|
|
660
|
+
remain available as typed commands.
|
|
661
|
+
|
|
662
|
+
### Added
|
|
663
|
+
|
|
664
|
+
- **Drag the mouse to select text, and release to copy it.** Full-screen mode
|
|
665
|
+
takes the alternate screen, turns on mouse reporting so the wheel can scroll a
|
|
666
|
+
transcript the terminal no longer knows how to scroll, and draws every row
|
|
667
|
+
itself. Each of those is right on its own; together they took your terminal's
|
|
668
|
+
own drag-to-select away and put nothing in its place. The only thing shipped
|
|
669
|
+
in its place was a one-line notice naming a bypass key that is Shift on some
|
|
670
|
+
emulators, Fn on others and a preference elsewhere — a workaround, told once,
|
|
671
|
+
in a line that scrolls away.
|
|
672
|
+
|
|
673
|
+
Press the left button and drag: the cells you drag across are highlighted as
|
|
674
|
+
you go, and releasing copies exactly them. The copy goes out over **OSC 52**
|
|
675
|
+
first, so it reaches the clipboard of the machine you are *sitting at* rather
|
|
676
|
+
than the one you are ssh'd into, with the platform clipboard binary attempted
|
|
677
|
+
alongside it for terminals that ignore the sequence. Neither mechanism is
|
|
678
|
+
detectable, so the toast names what was sent rather than claiming a success it
|
|
679
|
+
cannot verify. `/copy` now goes through the same path and gained ssh support on
|
|
680
|
+
the way.
|
|
681
|
+
|
|
682
|
+
The highlight is painted in the frame pipeline rather than in React, so a drag
|
|
683
|
+
costs one to three re-addressed rows instead of a re-render of the whole tree,
|
|
684
|
+
and the text that is copied is read from the same mirrored rows the highlight
|
|
685
|
+
was painted over — what you see is what you get by construction, not by a
|
|
686
|
+
staleness check that can be wrong.
|
|
687
|
+
|
|
688
|
+
Two switches, both reversible without a restart: `/mouse off` hands the mouse
|
|
689
|
+
back to your terminal for the session (and says plainly that the wheel goes
|
|
690
|
+
inert while it is off), `/mouse on` takes it back, and
|
|
691
|
+
`aragon config set mouseSelect false` keeps wheel scrolling while leaving
|
|
692
|
+
drag-select off — which also stops the CLI asking the terminal for motion
|
|
693
|
+
reports at all, so that session puts exactly the bytes on the wire that it did
|
|
694
|
+
before this release. `--no-mouse` remains the switch that captures nothing.
|
|
695
|
+
|
|
696
|
+
### Changed
|
|
697
|
+
|
|
698
|
+
- **Scrolling up now actually stops the transcript.** The viewport followed the
|
|
699
|
+
newest output by holding a *fixed distance from the bottom*, so scrolling up
|
|
700
|
+
during a run did not pause anything: twelve new rows of output moved the
|
|
701
|
+
window twelve rows down, and whatever you had scrolled up to read slid off the
|
|
702
|
+
top while you were reading it. The faster the agent talked, the faster your
|
|
703
|
+
reading position ran away.
|
|
704
|
+
|
|
705
|
+
While you are scrolled up, the transcript is now anchored to the **content**:
|
|
706
|
+
new output accumulates below the window instead of dragging the window along
|
|
707
|
+
with it, and the rows on screen hold still. After five seconds with no
|
|
708
|
+
scrolling the viewport returns to the newest line by itself — but only if
|
|
709
|
+
something actually arrived while you were paused, so reading a *finished*
|
|
710
|
+
transcript is never interrupted by a jump to a bottom that has not moved.
|
|
711
|
+
Every gesture restarts the countdown, a selection drag suspends it, and
|
|
712
|
+
`aragon config set scrollResumeMs 0` turns the return off entirely
|
|
713
|
+
(`ARAGON_SCROLL_RESUME_MS` sets it too).
|
|
714
|
+
|
|
715
|
+
The number the hint shows means something sharper as a result: it is now
|
|
716
|
+
literally "rows of newer output below your reading position", which is what
|
|
717
|
+
`PgDn` traverses and what the status bar's `↑N` has always shown.
|
|
718
|
+
|
|
719
|
+
- **The "N new lines · PgDn" hint moved inside the input box.** It used to be
|
|
720
|
+
rendered as the viewport's own last row, which spent a line of your transcript
|
|
721
|
+
on chrome at exactly the moment the transcript was longest — and, because the
|
|
722
|
+
hint's presence shrank the viewport, it fed back into the very number it was
|
|
723
|
+
displaying. It is now a right-aligned chip on the composer's input row, inside
|
|
724
|
+
the border, where it costs no rows at all. The chip sits in a fixed-width cell
|
|
725
|
+
so the number gaining a digit cannot re-wrap a draft, it never truncates (the
|
|
726
|
+
draft wraps first), and unlike the teaching row below the box it neither fades
|
|
727
|
+
with experience nor disappears on a short terminal: how far behind you are is
|
|
728
|
+
state, not a tutorial.
|
|
729
|
+
|
|
730
|
+
### Fixed
|
|
731
|
+
|
|
732
|
+
- **The working spinner no longer disappears when an ack takes its row.** Steer a
|
|
733
|
+
run, approve a plan, or press `Ctrl+T` while the agent is working, and the row
|
|
734
|
+
above the composer traded its spinner for the acknowledgement — and for that
|
|
735
|
+
ack's full two and a half seconds, nothing anywhere on screen moved. The status
|
|
736
|
+
bar still read `running` and the tool card still read `running`, so no
|
|
737
|
+
information had left the frame; only the evidence that the process was alive
|
|
738
|
+
had, during exactly the long tool calls where "is it stuck?" is the question you
|
|
739
|
+
are already asking. Consecutive acks extended the window, and steering is
|
|
740
|
+
something the composer invites on every run.
|
|
741
|
+
|
|
742
|
+
That row was made the sole owner of animation in this same release, and
|
|
743
|
+
everything else on screen holds still for as long as the row is believed to be
|
|
744
|
+
showing one. Believed, not checked: an ack won the row outright, so the belief
|
|
745
|
+
and the frame disagreed, and the disagreement was invisible to every test
|
|
746
|
+
because no component was wrong on its own.
|
|
747
|
+
|
|
748
|
+
The ack still owns the row and keeps every word of its text. The spinner now
|
|
749
|
+
rides beside it as a bare glyph — no phrase, no clock — so there is exactly one
|
|
750
|
+
animation at every instant of a run, with an ack up or without one: never none,
|
|
751
|
+
and never the several this release set out to remove. Terminals without Unicode
|
|
752
|
+
and anyone running with `reducedMotion` come out byte for byte unchanged; they
|
|
753
|
+
had no animation to lose, and nothing is prefixed to their acks.
|
|
754
|
+
|
|
755
|
+
- **`/clear` now takes the todo panel with it.** Finish a plan, type `/clear`,
|
|
756
|
+
and the transcript emptied while the `7/7 done` rail stayed exactly where it
|
|
757
|
+
was — on a screen you had just asked to be cleared. It stayed until your next
|
|
758
|
+
real message, which is precisely the pause you take after clearing to decide
|
|
759
|
+
what to ask next, so essentially everyone met it.
|
|
760
|
+
|
|
761
|
+
This was deliberate once. The list is a projection of what the model believes,
|
|
762
|
+
and `/clear` wipes the transcript rather than the conversation, so the model
|
|
763
|
+
still believed in the plan and a panel contradicting the model was judged worse
|
|
764
|
+
than no panel. That reasoning holds for everything the CLI does on its own; it
|
|
765
|
+
does not hold against you typing the command. An explicit instruction was
|
|
766
|
+
always this rule's exception — `/todo clear` has used the same door from the
|
|
767
|
+
start — and `/clear` now goes through it.
|
|
768
|
+
|
|
769
|
+
The list itself is cleared, not just the pixels, so `/save`, `/todo status`,
|
|
770
|
+
`/todo continue` and auto follow-through all agree with the screen: no plan is
|
|
771
|
+
written into a saved session, nothing offers to continue one, and nothing spends
|
|
772
|
+
a follow-through on it. `/reset` is unchanged and still the only command that
|
|
773
|
+
clears the conversation. Nothing is stranded either way — the model's next
|
|
774
|
+
`todo_write` is a full replacement, so the panel comes back the moment there is
|
|
775
|
+
a plan to show.
|
|
776
|
+
|
|
777
|
+
### Added
|
|
778
|
+
|
|
779
|
+
- **An update that will not start is undone automatically.** The updater shipped
|
|
780
|
+
in this same release could install a version that fails to *import* — an
|
|
781
|
+
undeclared dependency, a Node API that moved, a syntax error past the transpile
|
|
782
|
+
target — and the only recovery was to know the package name and type
|
|
783
|
+
`npm i -g @aragon-agent/cli@<some older version>` from memory. None of those
|
|
784
|
+
failures reach any line inside `main()`, so no amount of care there helps.
|
|
785
|
+
|
|
786
|
+
The `aragon` command is now a small launcher that runs **before** the CLI. It
|
|
787
|
+
reads one ~300-byte file, and on every launch except the first one after an
|
|
788
|
+
auto-update that is all it does — no write at all. But if the version it is
|
|
789
|
+
about to start is one **this updater installed**, and that version has already
|
|
790
|
+
exited non-zero twice, it reinstalls the version that was running before the
|
|
791
|
+
update and marks the bad one so nothing puts it back:
|
|
792
|
+
|
|
793
|
+
```
|
|
794
|
+
aragon 0.6.0 failed to start twice; rolling back to 0.5.9.
|
|
795
|
+
```
|
|
796
|
+
|
|
797
|
+
It boots anyway. If the crash was transient, refusing to start would lock you
|
|
798
|
+
out of a working CLI on our guess; the reinstall is detached and finishes
|
|
799
|
+
either way. The next session says once what happened and then stops. A **newer**
|
|
800
|
+
release clears the mark and installs normally — you were never opted out of
|
|
801
|
+
updates, only out of the loop.
|
|
802
|
+
|
|
803
|
+
It never touches a version **you** installed yourself, and it does not try to
|
|
804
|
+
detect a release that starts and is merely wrong. `aragon update --rollback` is
|
|
805
|
+
the same mechanism run deliberately, for the case a human spots in one second
|
|
806
|
+
and a heuristic would get wrong on a bad day. Exit `4` means there was nothing
|
|
807
|
+
recorded to roll back to.
|
|
808
|
+
|
|
809
|
+
**`update.mode: off` disables this too.** The guard is armed only by an
|
|
810
|
+
auto-install, so a machine that never auto-installs never arms it — the kill
|
|
811
|
+
switch turns off the whole subsystem, recovery included.
|
|
812
|
+
|
|
813
|
+
- **A blocked install now says what is actually blocking it.** Every install
|
|
814
|
+
failure used to print the same line: `update failed · npm i -g
|
|
815
|
+
@aragon-agent/cli`. On Windows the commonest cause is that the shim which
|
|
816
|
+
launched us is held open by the shell running it, so that advice hits the same
|
|
817
|
+
handle and fails identically — the one visible failure was also a wrong
|
|
818
|
+
instruction. Failures are now classified, and three of them name the real
|
|
819
|
+
remedy and appear immediately rather than after three strikes, because each is
|
|
820
|
+
something you can fix and none of them fixes itself:
|
|
821
|
+
|
|
822
|
+
```
|
|
823
|
+
! update blocked · close other aragon windows, then: npm i -g @aragon-agent/cli
|
|
824
|
+
! update failed · no disk space
|
|
825
|
+
! update needs write access · npm i -g @aragon-agent/cli
|
|
826
|
+
```
|
|
827
|
+
|
|
828
|
+
Network failures are deliberately **not** in that set: you cannot fix the
|
|
829
|
+
registry and the next check may well succeed, so they stay silent and back off.
|
|
830
|
+
|
|
831
|
+
- **Updates work behind a corporate proxy.** Node's `fetch` ignores `HTTP_PROXY`,
|
|
832
|
+
so on a proxied machine the check failed silently forever. When the direct
|
|
833
|
+
request fails, `aragon` now asks the npm you already have instead, which
|
|
834
|
+
honours `proxy`, `https-proxy` and your `.npmrc`. It runs *only* after a
|
|
835
|
+
request that has already failed, so on an ordinary machine it never runs.
|
|
836
|
+
`/update status` shows `probe: npm` when this is what answered. No credentials
|
|
837
|
+
are read or forwarded — we run the command you could have typed.
|
|
838
|
+
|
|
839
|
+
- `/update status` gained `rollback`, `lastgood` and `probe` lines, so what the
|
|
840
|
+
guard did and what `--rollback` would reinstall are answerable without reading
|
|
841
|
+
the log.
|
|
842
|
+
|
|
843
|
+
### Changed
|
|
844
|
+
|
|
845
|
+
- **`aragon update` exit codes: a blocked install is now `2`, not `1`.** This is
|
|
846
|
+
the one change here a script can notice. `1` means "try again later" and `2`
|
|
847
|
+
means "this machine will never auto-update, run the command we printed" — and
|
|
848
|
+
for `EPERM` / `EBUSY` / `ENOSPC` the second is the accurate one: waiting does
|
|
849
|
+
not unblock a held file handle or an empty disk. A caller shaped like
|
|
850
|
+
`aragon update || sleep 300 && retry` changes behaviour. `0`, and `1` for an
|
|
851
|
+
ordinary failed check or install, are unchanged.
|
|
852
|
+
|
|
853
|
+
- `bin.aragon` now points at `dist/launcher.js` rather than `dist/cli.js`.
|
|
854
|
+
`dist/cli.js` is unchanged, keeps its shebang and stays executable, so
|
|
855
|
+
`npm start` and any script invoking it directly keep working — only the mapping
|
|
856
|
+
moved.
|
|
857
|
+
|
|
858
|
+
- **`aragon` keeps itself up to date.** Until now the installed copy was frozen
|
|
859
|
+
forever: nothing in the CLI ever looked at the registry, so someone who
|
|
860
|
+
installed 0.4.x eighteen releases ago was still running it and the only signal
|
|
861
|
+
that anything had moved was a README they were never going to re-read.
|
|
862
|
+
|
|
863
|
+
There is now a background updater. At most once every four hours, and at most
|
|
864
|
+
once per machine per interval, it asks npm what the `latest` dist-tag resolves
|
|
865
|
+
to; if that version is genuinely newer, stable, not deprecated and runnable on
|
|
866
|
+
this Node, it installs it silently into the same global installation you
|
|
867
|
+
already have and says so on **one line above the composer**:
|
|
868
|
+
|
|
869
|
+
```
|
|
870
|
+
* 0.6.0 installed - restart aragon to apply
|
|
871
|
+
```
|
|
872
|
+
|
|
873
|
+
**The running process is never mutated in any way it can observe.** The new
|
|
874
|
+
version lands on disk and takes effect on the *next* launch. A restart in the
|
|
875
|
+
middle of a turn would destroy a live run, a subagent dispatch and an open plan
|
|
876
|
+
review, so the line waits and the human decides when.
|
|
877
|
+
|
|
878
|
+
The notice does not get its own row — it shares the row the toast stack and the
|
|
879
|
+
working line already share, behind both of them. A toast is a response to
|
|
880
|
+
something you did and wins outright; the working line is transient and would be
|
|
881
|
+
lost if deferred; the update line is persistent and loses nothing by waiting.
|
|
882
|
+
The practical effect is that **someone who is actually working never sees the
|
|
883
|
+
updater until they stop.**
|
|
884
|
+
|
|
885
|
+
It only ever runs `npm i -g` for one kind of installation: a global one where
|
|
886
|
+
no project manifest claims to own the version. pnpm, yarn, bun and volta are
|
|
887
|
+
each detected and get the correct command for *that* manager printed instead
|
|
888
|
+
of a command run on their behalf; `npx`, a project's `node_modules` and a
|
|
889
|
+
clone of this repo produce no line at all, because none of them is out of date
|
|
890
|
+
in any sense the user can act on. A global directory that cannot be written is
|
|
891
|
+
detected before anything is spawned, and npm exiting `0` into a *different*
|
|
892
|
+
prefix — which happens on any machine with `prefix=` in `.npmrc` or two Node
|
|
893
|
+
installations — is caught by re-reading the version from the directory we
|
|
894
|
+
classified, rather than being believed.
|
|
895
|
+
|
|
896
|
+
Every failure is silent: it logs, backs off exponentially, and says nothing
|
|
897
|
+
until the third consecutive one, at which point it says something actionable.
|
|
898
|
+
Four config keys (`update.mode`, `update.checkIntervalMs`, `update.registry`,
|
|
899
|
+
`update.distTag`), the flags `--update` / `--no-update`, the environment
|
|
900
|
+
variables `ARAGON_UPDATE` and `ARAGON_UPDATE_REGISTRY`, the slash command
|
|
901
|
+
`/update [status|now|skip|off]`, and a foreground `aragon update
|
|
902
|
+
[--check] [--to <version>] [--json]` for headless users. `update.mode: off`
|
|
903
|
+
and `ARAGON_UPDATE=0` are kill switches, and with either set the CLI executes
|
|
904
|
+
zero lines of update code.
|
|
905
|
+
|
|
906
|
+
Auto-update widens the window in which a compromised release reaches users
|
|
907
|
+
without a human decision. The README says so plainly, along with what is and
|
|
908
|
+
is not mitigated. No credentials are ever attached to the check.
|
|
909
|
+
|
|
910
|
+
- **A running command shows what it is doing.** `bash` is the only tool here that
|
|
911
|
+
can run for minutes — `npm test`, a `git clone`, a training job — and while it
|
|
912
|
+
ran, its card was one line of text that never changed. Nothing in that frame
|
|
913
|
+
distinguished a test suite at 40% from a child process blocked forever on a
|
|
914
|
+
password prompt this CLI will never show. Its card now carries the last eight
|
|
915
|
+
lines of what the command is printing, plus one footer row that reads
|
|
916
|
+
`(running)` or, once the child has been quiet for ten seconds,
|
|
917
|
+
`no output for 45s` — with the seconds advancing.
|
|
918
|
+
|
|
919
|
+
A `\r`-driven progress bar (npm, pip, curl, docker) is *one* line rewritten a
|
|
920
|
+
thousand times, and it renders as **one row counting up in place** rather than
|
|
921
|
+
a thousand rows of nearly the same string — including the ordinary case where
|
|
922
|
+
the bar emits no newline at all for its entire run.
|
|
923
|
+
|
|
924
|
+
Everything the tail shows is **stripped, not interpreted**: ANSI colour, cursor
|
|
925
|
+
motion, `\r`, `\b`, tabs and every other control byte are removed at the
|
|
926
|
+
boundary before a row is stored, so nothing can move a cursor inside a frame
|
|
927
|
+
the renderer believes it owns. It is bounded twice by construction — eight rows
|
|
928
|
+
per call, sixteen concurrent calls — so a command that writes 400 MB to stdout
|
|
929
|
+
costs a fixed number of retained rows.
|
|
930
|
+
|
|
931
|
+
It is a **display and nothing else**. The text the model receives is
|
|
932
|
+
byte-for-byte what it was; `Ctrl+O` does nothing while a command runs, because
|
|
933
|
+
expansion is a promise about stored content and there is no stored rest of a
|
|
934
|
+
400 MB stream; `/save` during a run writes no tail, since a resumed one would
|
|
935
|
+
describe a process that died with the session; and at settle the card is
|
|
936
|
+
replaced by the authoritative result exactly as before.
|
|
937
|
+
|
|
938
|
+
New config key `liveToolOutput`, defaulting to **`true`** — unlike
|
|
939
|
+
`showThinking` below, this adds information rather than hiding it.
|
|
940
|
+
`aragon config set liveToolOutput false` (or `--no-live-tool-output`, or
|
|
941
|
+
`ARAGON_LIVE_TOOL_OUTPUT=0`, or the **Live output** row in `/settings`) turns it
|
|
942
|
+
off, and with it off no store is allocated and no recorder is attached: `bash`
|
|
943
|
+
is byte-identical to the build before this entry.
|
|
944
|
+
|
|
945
|
+
- **The working line stops guessing while a tool runs.** It reads
|
|
946
|
+
`⠙ Running bash` instead of rotating thinking-words. `running` covers the whole
|
|
947
|
+
turn, including the minutes the model is idle and a child process is doing the
|
|
948
|
+
work, so "Pondering" during a build was not calm — it was wrong. One row, no
|
|
949
|
+
digits, no clock: everything the row already promised still holds.
|
|
950
|
+
|
|
951
|
+
### Changed
|
|
952
|
+
|
|
953
|
+
- **Reasoning blocks are now hidden by default.** `showThinking` is a new
|
|
954
|
+
top-level config key and it defaults to `false`. If you have been reading
|
|
955
|
+
thinking every day, this is the entry that concerns you: `Ctrl+T` still shows
|
|
956
|
+
it for the session exactly as before, `aragon config set showThinking true`
|
|
957
|
+
(or `--show-thinking`, or `ARAGON_SHOW_THINKING=1`) restores the old behaviour
|
|
958
|
+
permanently, and `/settings` has a **Show thinking** row directly under
|
|
959
|
+
**Thinking**.
|
|
960
|
+
|
|
961
|
+
Nothing is hidden silently. A settled turn that thought leaves one muted row
|
|
962
|
+
where the block used to be — `✱ thought for 12s · ctrl+t to show` — so the fact
|
|
963
|
+
that reasoning happened, how long it took, and how to see it are all still on
|
|
964
|
+
screen. In **inline** mode that row omits the key hint and the toast reads
|
|
965
|
+
`Thinking shown for new output.`, because a settled entry there has already
|
|
966
|
+
been printed into your terminal's scrollback and cannot be repainted; the
|
|
967
|
+
toggle applies to the live entry and to everything drawn after it.
|
|
968
|
+
|
|
969
|
+
`thinkingLevel` is untouched and means what it always did — the effort the
|
|
970
|
+
provider is asked to spend. `showThinking` is only whether the terminal draws
|
|
971
|
+
what came back. They are one word apart in the config file, which is why the
|
|
972
|
+
flag is `--show-thinking` rather than the shorter name.
|
|
973
|
+
|
|
974
|
+
### Added
|
|
975
|
+
|
|
976
|
+
- **A live working line while a run is in flight.** One row above the composer,
|
|
977
|
+
carrying a spinner and a word that rotates every four seconds:
|
|
978
|
+
`⠋ Percolating…`. Take reasoning off the screen and the gap between submitting
|
|
979
|
+
and the first token is otherwise completely blank, which reads as dead rather
|
|
980
|
+
than as busy — the two changes are one change.
|
|
981
|
+
|
|
982
|
+
It carries no clock and no token count, deliberately: the status bar one row
|
|
983
|
+
below already renders both, under the same running condition and driven by the
|
|
984
|
+
same 200 ms ticker this row reuses. Under `reducedMotion` the spinner is a
|
|
985
|
+
static glyph and the word is chosen once and holds, because rotating text is
|
|
986
|
+
motion too. An idle frame is unchanged, and so is the viewport's row budget —
|
|
987
|
+
the line shares the row the toast strip already owned rather than adding one.
|
|
988
|
+
|
|
989
|
+
- **`write_file` and `edit_file` render a real diff.** Hunks with old/new line
|
|
990
|
+
numbers, a `+N -M` summary, add/remove/context colouring, and `(truncated)` or
|
|
991
|
+
a `binary` / `too-large` / `unreadable` note when the old side could not be
|
|
992
|
+
read. Diffs collapse at 12 rows behind the existing `Ctrl+O` — no new
|
|
993
|
+
keybinding. A resumed session written by an older build, or a card whose patch
|
|
994
|
+
the bounded store already evicted, falls back to the previous text preview;
|
|
995
|
+
nothing renders blank.
|
|
996
|
+
|
|
997
|
+
`write_file` previously reported creating a 300-line file as
|
|
998
|
+
`Wrote 8214 bytes to path`, and `edit_file`'s diff trimmed the common prefix
|
|
999
|
+
and suffix and rendered *everything* in between as one removed block followed
|
|
1000
|
+
by one added block — for a `replace_all` touching line 40 and line 900, that
|
|
1001
|
+
was 860 removed rows followed by 860 nearly identical added ones.
|
|
1002
|
+
|
|
1003
|
+
**The model's input got smaller, not larger.** The structured patch reaches the
|
|
1004
|
+
screen on a CLI-local channel rather than through the tool result, and the text
|
|
1005
|
+
the model reads gained a 4 000-character ceiling it did not have before (its
|
|
1006
|
+
only previous bound was the executor's 100 KB backstop). A single-region edit
|
|
1007
|
+
is byte-for-byte what it was plus one `@@` header; a multi-region edit is
|
|
1008
|
+
strictly smaller. `write_file`'s result text is unchanged.
|
|
1009
|
+
|
|
1010
|
+
### Changed
|
|
1011
|
+
|
|
1012
|
+
- **A stream that stops mid-answer is now a loud failure instead of a silent
|
|
1013
|
+
truncated one.** All three provider adapters used to end their SSE loop by
|
|
1014
|
+
yielding "done" with whatever had arrived, so a connection closed cleanly
|
|
1015
|
+
half-way through an answer — a proxy idle cut, a load-balancer timeout, an
|
|
1016
|
+
HTTP/2 GOAWAY — was indistinguishable from a completed reply. You got a
|
|
1017
|
+
truncated answer and were told nothing.
|
|
1018
|
+
|
|
1019
|
+
Each adapter now reports the truncation, which is what lets it be retried and
|
|
1020
|
+
recovered. An **abort** is explicitly excluded and still completes normally, and
|
|
1021
|
+
a model that legitimately says nothing and stops is still a success.
|
|
1022
|
+
|
|
1023
|
+
This is deliberately **not** behind `--no-retry`: an adapter that reports a
|
|
1024
|
+
truncated stream honestly should do so whether or not retry is enabled. A switch
|
|
1025
|
+
that also disabled telling you the truth would be a mute button, not a kill
|
|
1026
|
+
switch.
|
|
1027
|
+
|
|
1028
|
+
- **The mouse wheel now only ever scrolls.** A notch scrolls the transcript
|
|
1029
|
+
three rows (a page with `Shift`), or the open overlay when there is one, no
|
|
1030
|
+
matter where the pointer is sitting. Prompt history is recalled by `↑` / `↓`
|
|
1031
|
+
alone, exactly as in Claude Code and Codex.
|
|
1032
|
+
|
|
1033
|
+
**This supersedes the 0.5.0 entry below**, which said the wheel "scrolls what
|
|
1034
|
+
is under the pointer" and stepped prompt history one entry per notch when the
|
|
1035
|
+
pointer was over the input box. That turned out to be wrong in use rather than
|
|
1036
|
+
in principle: the pointer is not an instrument you aim in a TUI — it rests
|
|
1037
|
+
wherever you last left it, which in a chat-shaped app is next to the thing you
|
|
1038
|
+
type into. So the ordinary "scroll back and see what just happened" gesture
|
|
1039
|
+
landed on the composer and replaced the draft with an old prompt, with no
|
|
1040
|
+
error, no undo and nothing visibly connecting the gesture to the outcome. The
|
|
1041
|
+
band that decided this was invisible too: its boundary was a measured row that
|
|
1042
|
+
moved as the toast row, the hint row and the completion popup came and went, so
|
|
1043
|
+
the same gesture could do two different things a second apart.
|
|
1044
|
+
|
|
1045
|
+
Nothing else about the wheel changes — same three rows per notch, same
|
|
1046
|
+
`Shift`+wheel page, same `--no-mouse` / `ARAGON_MOUSE=0` / `mouse: false`
|
|
1047
|
+
escape hatches, same `Shift`+drag for selecting text.
|
|
1048
|
+
|
|
1049
|
+
- **A long session stays as fast as a short one.** The TUI used to get slower as
|
|
1050
|
+
a session grew and, past a threshold, stopped making progress at all. That was
|
|
1051
|
+
structural rather than incidental: Ink has no output caching, so every frame
|
|
1052
|
+
re-walked the entire mounted tree, re-measured every text node and
|
|
1053
|
+
re-serialised the frame. The per-frame cost was therefore proportional to every
|
|
1054
|
+
character the session had ever produced — and `transcriptWindow` bounded the
|
|
1055
|
+
entry *count*, which bounds nothing when one entry can be fifty thousand lines.
|
|
1056
|
+
|
|
1057
|
+
Entries outside the visible band are no longer mounted. The viewport renders
|
|
1058
|
+
what you can see plus a couple either side and replaces the rest with two
|
|
1059
|
+
spacers of the right height, so the frame costs what the screen costs.
|
|
1060
|
+
Scrolling, the `↑N` readout and the wheel routing are untouched. Because the
|
|
1061
|
+
horizon is no longer a rendering budget, `transcriptWindow` rises from 300 to
|
|
1062
|
+
1000 and its ceiling from 2000 to 20000; an existing setting is still valid
|
|
1063
|
+
and still clamps.
|
|
1064
|
+
|
|
1065
|
+
Syntax highlighting and markdown parsing are memoised on their input, so a
|
|
1066
|
+
200-line code block is tokenised once rather than thirty times a second for as
|
|
1067
|
+
long as it stays on screen. Only the *parsed* form is cached and never a themed
|
|
1068
|
+
one, so `/theme` still takes effect on the next frame.
|
|
1069
|
+
|
|
1070
|
+
Under genuine load the streaming interval widens — 33 ms up to a 320 ms
|
|
1071
|
+
ceiling — so keystrokes and `Ctrl+C` do not queue behind renders. This is
|
|
1072
|
+
visible rather than silent: a muted **`eco`** chip appears in the status bar
|
|
1073
|
+
while it is in effect, because a user who cannot see why the stream got
|
|
1074
|
+
chunkier will conclude the model got slower. `--no-render-governor`,
|
|
1075
|
+
`renderGovernor: false` or `ARAGON_RENDER_GOVERNOR=0` turns it off;
|
|
1076
|
+
`--max-render-interval 33` flattens the ladder without disabling the mechanism.
|
|
1077
|
+
|
|
1078
|
+
- **A live thinking block no longer grows without limit.** While an answer is
|
|
1079
|
+
streaming, visible thinking is clamped to its newest 24 rows behind a
|
|
1080
|
+
`... N earlier lines` marker, and the whole block renders again the moment the
|
|
1081
|
+
answer settles. Thinking is scratch reasoning you read from its newest end, and
|
|
1082
|
+
an unbounded one was the easiest way for a single live entry to fill the
|
|
1083
|
+
viewport on its own.
|
|
1084
|
+
|
|
1085
|
+
### Fixed
|
|
1086
|
+
|
|
1087
|
+
- **Inline mode could hard-freeze the terminal, and now cannot.** Once a live
|
|
1088
|
+
entry grew taller than the terminal, Ink took a branch that writes
|
|
1089
|
+
`clearTerminal` plus the *entire accumulated session history* on every
|
|
1090
|
+
subsequent frame — bypassing both of its own dedupe gates, and growing without
|
|
1091
|
+
bound for the rest of the session. Any inline user (`--no-fullscreen`,
|
|
1092
|
+
`TERM=dumb`, CI, a terminal under 12 rows or 40 columns) whose model wrote a
|
|
1093
|
+
long answer could reach it. The live region is now clamped below that
|
|
1094
|
+
threshold, with a `... N earlier lines` marker naming what is deferred. Nothing
|
|
1095
|
+
is lost: the entry prints in full into the terminal's own scrollback the moment
|
|
1096
|
+
it settles.
|
|
1097
|
+
|
|
1098
|
+
- **The view state no longer grows without a ceiling.** A single assistant answer
|
|
1099
|
+
is capped at 256 KiB in the view (thinking at 64 KiB, streamed tool arguments
|
|
1100
|
+
at 16 KiB) by eliding the MIDDLE, so both the opening and the live cursor
|
|
1101
|
+
survive; a marker states how many characters went. `transcriptRetain`
|
|
1102
|
+
(default 1000) caps the entries kept in memory, and what it removed is counted
|
|
1103
|
+
and reported both by `/perf` and at the top of the exit replay. A model that
|
|
1104
|
+
emits five megabytes no longer makes every later frame a five-megabyte scan.
|
|
1105
|
+
|
|
1106
|
+
### Added
|
|
1107
|
+
|
|
1108
|
+
- **A fast model tier: a second, cheaper model you can delegate to and be
|
|
1109
|
+
reviewed by.** Off by default — with `fast.enabled: false` the system prompt,
|
|
1110
|
+
the `task` schema, the transcript and the request payloads are byte-identical
|
|
1111
|
+
to a build without it — and it does two things once you turn it on.
|
|
1112
|
+
|
|
1113
|
+
**Delegation.** `task` gains one optional field per subagent, `model: "fast"`.
|
|
1114
|
+
A child marked that way runs on the fast model and is otherwise identical:
|
|
1115
|
+
same tools, same working directory, same `--confirm` gate, same plan-mode
|
|
1116
|
+
gate, same skills ceiling. Delegating to a cheaper model is a *model* choice,
|
|
1117
|
+
never a permission boundary. It is where "not complicated, but very expensive
|
|
1118
|
+
in context" gets paid for — a child that reads nine files and reports four
|
|
1119
|
+
sentences moves the file bodies out of the lead's window and onto a model that
|
|
1120
|
+
costs a fraction as much per token.
|
|
1121
|
+
|
|
1122
|
+
**Periodic review.** Every few turns a small digest of what the lead has been
|
|
1123
|
+
doing goes to the fast model with one question — is this still on track? — and
|
|
1124
|
+
a critique that is not "on track" is injected into the running loop as a
|
|
1125
|
+
`<fast_review>` block, so the lead sees a second opinion while it can still
|
|
1126
|
+
act on it:
|
|
1127
|
+
|
|
1128
|
+
```
|
|
1129
|
+
fast review #2 · claude-haiku-4-5 · turn 12 · 1.4s
|
|
1130
|
+
You have edited config/schema.ts three times without running the tests.
|
|
1131
|
+
```
|
|
1132
|
+
|
|
1133
|
+
The digest is built from a bounded ring of recent turns and **never** from the
|
|
1134
|
+
message history: sending a session's accumulated file bodies to the "cheap"
|
|
1135
|
+
model would make a review cost more than the turn it reviews, which is the
|
|
1136
|
+
inversion the whole feature exists to prevent.
|
|
1137
|
+
|
|
1138
|
+
Spend is attributed **per tier** — a fast child's tokens are priced at the
|
|
1139
|
+
fast model's table, not the lead's, and the dispatch report states the two
|
|
1140
|
+
separately. A model the built-in price table has never seen is reported as
|
|
1141
|
+
`unknown` rather than as `$0.00`, because a feature that looks free while it
|
|
1142
|
+
is spending money is worse than one that admits it does not know.
|
|
1143
|
+
|
|
1144
|
+
Turn it on with `/fast model <id>` then `/fast on`, with
|
|
1145
|
+
`aragon config set fast.enabled true`, with `--fast --fast-model <id>`, or with
|
|
1146
|
+
`ARAGON_FAST=1 ARAGON_FAST_MODEL=<id>`. `/fast status` is the guaranteed
|
|
1147
|
+
readout: the resolved model, the budget, and this session's reviews, delegated
|
|
1148
|
+
children, tokens and cost. Eleven `fast.*` config keys, four flags, four
|
|
1149
|
+
environment variables and five settings-screen rows; see the README.
|
|
1150
|
+
|
|
1151
|
+
**The review has a session budget.** A session is not one run — it is one run
|
|
1152
|
+
per message you send — so a cadence bounds the pace and nothing bounds the
|
|
1153
|
+
total. `fast.reviewMaxPerSession` (default **40**, raisable live with
|
|
1154
|
+
`/fast budget <n>`) is the number of reviews a session may *start*; reaching it
|
|
1155
|
+
prints one `info` notice that names the remedy and says delegation is
|
|
1156
|
+
unaffected, and `/fast status` reads `12/40` from the first review rather than a
|
|
1157
|
+
bare count you can only size after the fact. It is denominated in **reviews,
|
|
1158
|
+
not currency**, because the fast tier is exactly where a model the price table
|
|
1159
|
+
has never seen lives — a dollar ceiling would silently never fire for the
|
|
1160
|
+
configuration that most needs one. Delegation is never budgeted: it is spend the
|
|
1161
|
+
lead chose in service of a message you sent, it is already bounded by `team.*`,
|
|
1162
|
+
and it exists to *reduce* total cost.
|
|
1163
|
+
|
|
1164
|
+
**The review also fails fast, so it cannot compete with you.** It calls through
|
|
1165
|
+
its own provider registry with **one** retry rather than the ten
|
|
1166
|
+
`retry.maxRetries` defaults to for the lead, and it observes neither `retry.*`
|
|
1167
|
+
nor `/retry` — that policy says how hard to fight for *your* answer, and
|
|
1168
|
+
inheriting it for an unrequested background call is how an advisory ends up
|
|
1169
|
+
spending a rate-limited provider's quota on itself. Its own wall-clock bound
|
|
1170
|
+
is 20 s.
|
|
1171
|
+
|
|
1172
|
+
Two failure modes are handled out loud rather than silently. If the tier stops
|
|
1173
|
+
resolving mid-session — you switch the main provider and `fast.provider` was
|
|
1174
|
+
inheriting it — `model:"fast"` is downgraded to the main model, **counted, and
|
|
1175
|
+
stated in the report**, because an agent that silently gets an expensive child
|
|
1176
|
+
has no way to learn its cost model is wrong. And three consecutive
|
|
1177
|
+
*misconfiguration* failures disable the reviewer for the session with exactly
|
|
1178
|
+
one warning, while a merely busy provider (rate-limited or overloaded) is
|
|
1179
|
+
treated as transient and never counts — that condition fixes itself, and a
|
|
1180
|
+
session-long silent shutdown over it would not. A review you *cancelled* is
|
|
1181
|
+
neither: Esc, a run that ends first, or quitting leaves a `cancelled` card and
|
|
1182
|
+
no strike against the tier.
|
|
1183
|
+
|
|
1184
|
+
Reviews log under their own `fast` scope rather than under `agent`, so
|
|
1185
|
+
`fast_review_*` records filter cleanly away from the lead's.
|
|
1186
|
+
|
|
1187
|
+
- **API calls are retried with backoff, and the waiting is legible.** A transient
|
|
1188
|
+
provider failure — HTTP 429, 529, 5xx, 408, or a dropped connection — used to end
|
|
1189
|
+
the turn. One red notice, an idle prompt, and forty tool calls of work thrown
|
|
1190
|
+
away. It is now retried up to **10 times** with an increasing interval
|
|
1191
|
+
(1 s → 2 → 4 → 8 → 16 → 30 s, equal-jittered, 30 s per wait at most) under a
|
|
1192
|
+
4-minute budget measured from the first failure.
|
|
1193
|
+
|
|
1194
|
+
What you see while it waits is **one line, rewritten in place** — never ten
|
|
1195
|
+
notices — carrying what failed, which attempt this is, and a countdown to the
|
|
1196
|
+
next one:
|
|
1197
|
+
|
|
1198
|
+
```
|
|
1199
|
+
↻ Provider overloaded · retry 3/10 in 7s Esc to cancel
|
|
1200
|
+
↻ recovered after 3 retries · 12.4s
|
|
1201
|
+
```
|
|
1202
|
+
|
|
1203
|
+
plus a `retry 3/10 7s` chip on the status bar (`[r3]` on a narrow terminal). The
|
|
1204
|
+
card settles into the transcript as history — `recovered`, `gave up`, or
|
|
1205
|
+
`interrupted` — and shows up in the exit replay, because a turn that spent three
|
|
1206
|
+
minutes retrying is exactly the kind of cost an exported transcript should
|
|
1207
|
+
account for.
|
|
1208
|
+
|
|
1209
|
+
**Esc ends the wait within a frame**, not at the end of the countdown, and it
|
|
1210
|
+
never produces a fabricated error: an aborted request is silent. That is the one
|
|
1211
|
+
detail everything else here depends on, because the provider layer marks an
|
|
1212
|
+
`AbortError` as retryable — so the signal is checked *before* the error, and a
|
|
1213
|
+
user pressing Esc can never be mistaken for a timeout worth retrying.
|
|
1214
|
+
|
|
1215
|
+
Never retried: `auth_error` (401/403), `invalid_request`, `context_overflow`.
|
|
1216
|
+
Ten retries of a bad API key is three minutes of looking broken.
|
|
1217
|
+
|
|
1218
|
+
`Retry-After` is honoured as a **floor**, never a replacement — a `Retry-After: 1`
|
|
1219
|
+
on the ninth retry does not undo eight retries of backoff — and a stated wait
|
|
1220
|
+
longer than a minute is surfaced immediately with the provider's own number
|
|
1221
|
+
rather than silently wedging the terminal.
|
|
1222
|
+
|
|
1223
|
+
A connection that dies **mid-answer** is also covered, and this is the case that
|
|
1224
|
+
needed more than a retry loop: the partial text is discarded, the affected tool
|
|
1225
|
+
cards are removed, and the answer restarts from the top. Nothing is duplicated,
|
|
1226
|
+
because the engine only writes history on a completed turn.
|
|
1227
|
+
|
|
1228
|
+
- **`/retry [show|on|off|max <n>]`, `--retry` / `--no-retry`, `--retry-max <n>`,
|
|
1229
|
+
`ARAGON_RETRY`, `ARAGON_RETRY_MAX`, and a `retry` config section** with nine
|
|
1230
|
+
keys (`aragon config set retry.*`). `/retry off` takes effect **in the running
|
|
1231
|
+
session** — subagents included, since they share the lead's provider registry —
|
|
1232
|
+
not only at the next launch. `retry.maxRetries: 0` is the kill switch and is a
|
|
1233
|
+
real value at every one of those entry points. `/settings` gains one read-only
|
|
1234
|
+
`API retries` row.
|
|
1235
|
+
|
|
1236
|
+
- **A subagent's retry is visible on the team card.** A child in backoff reports
|
|
1237
|
+
`retry 3/10` on its own row. Children inherit the retry policy for free, but
|
|
1238
|
+
their events never reach the lead's view, so without this a subagent spending
|
|
1239
|
+
three minutes waiting looked exactly like a hung dispatch.
|
|
1240
|
+
|
|
1241
|
+
- **Retry lines in `-p` mode go to stderr, never stdout.** `[retry 3/10]
|
|
1242
|
+
overloaded — waiting 7s` and `[retry] recovered after 3 retries` are on stderr,
|
|
1243
|
+
so `aragon -p … | jq` stays valid; a discarded partial answer is announced there
|
|
1244
|
+
too, because a piped consumer otherwise cannot tell a replay from a model that
|
|
1245
|
+
repeated itself. They are not suppressed by `--quiet`: a three-minute pause with
|
|
1246
|
+
no explanation is not a compact run, it is a hang.
|
|
1247
|
+
|
|
1248
|
+
- **`/perf`.** Reports what the renderer is actually doing: the frame interval
|
|
1249
|
+
and the last commit cost, how many entries exist / are retained / were dropped
|
|
1250
|
+
/ are mounted, height-cache and render-cache occupancy, and the viewport
|
|
1251
|
+
geometry. `/perf reset` clears the caches and returns the governor to its
|
|
1252
|
+
fastest rung. Silent degradation is the one thing a claim of robustness cannot
|
|
1253
|
+
afford, and this is the place that names it.
|
|
1254
|
+
|
|
1255
|
+
- **Three configuration keys**, each with a flag and an environment override:
|
|
1256
|
+
`transcriptRetain` (`--transcript-retain`, `ARAGON_TRANSCRIPT_RETAIN`),
|
|
1257
|
+
`renderGovernor` (`--render-governor` / `--no-render-governor`,
|
|
1258
|
+
`ARAGON_RENDER_GOVERNOR`) and `maxRenderIntervalMs`
|
|
1259
|
+
(`--max-render-interval`, `ARAGON_MAX_RENDER_INTERVAL_MS`). No migration and no
|
|
1260
|
+
config version bump: a file written before they existed loads unchanged.
|
|
1261
|
+
`transcriptRetain` is raised to `transcriptWindow` when the two conflict —
|
|
1262
|
+
retaining less than you can scroll to would make part of the horizon
|
|
1263
|
+
unreachable — and a startup notice names both numbers, because overriding a
|
|
1264
|
+
value you typed and saying nothing is the one thing none of this may do.
|
|
1265
|
+
|
|
1266
|
+
- **Following the plan through, on a budget you can do arithmetic on.** A run
|
|
1267
|
+
that ended with steps outstanding used to print one sentence and stop. It now
|
|
1268
|
+
asks three questions the CLI already knew the answers to — did you abort it,
|
|
1269
|
+
did it error, did the list move — and does one of three things.
|
|
1270
|
+
|
|
1271
|
+
With the default `notify` the sentence is unchanged, except that a run **you**
|
|
1272
|
+
cancelled with `Esc` now says nothing at all: being told what you just
|
|
1273
|
+
interrupted is the CLI answering a question nobody asked.
|
|
1274
|
+
|
|
1275
|
+
With `/todo follow auto` it continues the plan itself, after announcing
|
|
1276
|
+
`Continuing with 4 remaining steps in 3s - Esc to stop.` Auto-continuation was
|
|
1277
|
+
refused last release as "an unbounded cost loop wearing a helpful hat", and
|
|
1278
|
+
that judgement stands — what changed is that the loop is now bounded first.
|
|
1279
|
+
A continuation that completes no step buys exactly one more attempt; a single
|
|
1280
|
+
plan is continued at most 25 times however productive it looks; and a re-plan
|
|
1281
|
+
forgives the first counter but never the second, so a model that reshapes its
|
|
1282
|
+
list every turn cannot lift the ceiling. A run that ended with an error never
|
|
1283
|
+
auto-continues in any mode. `Esc` cancels, and so does typing anything.
|
|
1284
|
+
|
|
1285
|
+
Whatever sends the continuation — the timer or `/todo continue` — now sends
|
|
1286
|
+
the numbered list of open steps rather than the words "continue with the
|
|
1287
|
+
remaining todo items", so a plan whose `todo_write` has scrolled out of the
|
|
1288
|
+
context window is still followed exactly. Neither path records that text in
|
|
1289
|
+
your prompt history any more; it is not something you typed.
|
|
1290
|
+
|
|
1291
|
+
Under `-p` there is no grace window, because there is nobody there to use it,
|
|
1292
|
+
which is precisely why the two counters rather than the human are the
|
|
1293
|
+
protection there. `[todo] continuing (3 steps left)` and
|
|
1294
|
+
`[todo] 3 steps unfinished` go to stderr, suppressed by `--quiet`, and an
|
|
1295
|
+
unfinished plan still never changes the exit code.
|
|
1296
|
+
|
|
1297
|
+
New surfaces: `/todo follow <notify|auto|off>`; `--todo-follow <mode>`;
|
|
1298
|
+
`ARAGON_TODO_FOLLOW`; and `todo.followThrough` in `config.json`. The default
|
|
1299
|
+
is `notify`, so a session that does not ask for any of this behaves as it did.
|
|
1300
|
+
|
|
1301
|
+
- **A plan strip for inline mode.** Inline mode has no fixed frame and so no
|
|
1302
|
+
rail, which left every pipe, every `CI=1`, every `TERM=dumb` terminal and
|
|
1303
|
+
every window under twelve rows able to see `todo 3/7` but not *which* step was
|
|
1304
|
+
running. There is now a one-row strip under the transcript —
|
|
1305
|
+
`todo 3/7 > Adding the rail to AppShell +2 done` — windowed on the
|
|
1306
|
+
same step the rail would have anchored on. It truncates rather than wrapping
|
|
1307
|
+
and is exactly one row at every width, so the composer does not move.
|
|
1308
|
+
`--no-todo-panel` hides it along with the rail.
|
|
1309
|
+
|
|
1310
|
+
### Changed
|
|
1311
|
+
|
|
1312
|
+
- `npm run typecheck` now covers the test tree in both packages. `tsconfig.json`
|
|
1313
|
+
excludes `__tests__` so the build never emits fixtures, and vitest transpiles
|
|
1314
|
+
without typechecking — between the two, a widened required field could break
|
|
1315
|
+
ten test files while `npm run build` and `npm test` were both green. Twelve
|
|
1316
|
+
such errors had accumulated; all twelve were fixture drift and all twelve are
|
|
1317
|
+
repaired, with no suppressions and no production type relaxed to accommodate a
|
|
1318
|
+
fixture.
|
|
1319
|
+
|
|
1320
|
+
- **TODO planning, and a rail to watch it in.** For work with three or more
|
|
1321
|
+
distinct steps the agent now keeps a visible plan: it writes a checklist with
|
|
1322
|
+
a new `todo_write` tool, marks exactly one item in progress, and ticks it off
|
|
1323
|
+
before starting the next. In full-screen mode the list is rendered as a
|
|
1324
|
+
right-hand rail about a fifth of the terminal wide, windowed around the step
|
|
1325
|
+
being worked on rather than sliced from the top. Ask for something small and
|
|
1326
|
+
nothing appears — the prompt tells the model not to plan work it can finish in
|
|
1327
|
+
one or two steps, and a one-item list against an empty plan is refused
|
|
1328
|
+
outright, so a session that never plans has byte-identical layout to a build
|
|
1329
|
+
without this feature.
|
|
1330
|
+
|
|
1331
|
+
The list is a projection of what the model believes, and that single rule
|
|
1332
|
+
decides everything else: `/clear` keeps it (the conversation is still there),
|
|
1333
|
+
`/reset` drops it, `/save` writes it and `/resume` restores it — and resuming
|
|
1334
|
+
a session that carries no list CLEARS the current one rather than leaving a
|
|
1335
|
+
plan on screen whose conversation has just been replaced. A finished plan
|
|
1336
|
+
survives to the start of your next message so you get to see `7/7 done`; an
|
|
1337
|
+
unfinished one survives "continue" and "now do the rest", then expires after
|
|
1338
|
+
three unrelated turns rather than holding a fifth of the screen for the rest
|
|
1339
|
+
of the session. A run that ends with items left over produces a notice and
|
|
1340
|
+
`/todo continue`; nothing auto-continues on your behalf.
|
|
1341
|
+
|
|
1342
|
+
"One step at a time" is enforced by structure rather than asked for in a
|
|
1343
|
+
prompt: any payload with two in-progress items is repaired down to one, and a
|
|
1344
|
+
list with none promotes the first unfinished item. Whatever the model sends,
|
|
1345
|
+
the panel has exactly one current row.
|
|
1346
|
+
|
|
1347
|
+
New surfaces: the `todo_write` tool; `/todo [status|on|off|panel on|off|clear|
|
|
1348
|
+
continue]`; `--todo` / `--no-todo` and `--todo-panel` / `--no-todo-panel`;
|
|
1349
|
+
`ARAGON_TODO=0`; and `todo.enabled` / `todo.panel` in `config.json` (a third
|
|
1350
|
+
key, `todo.followThrough`, arrived with the follow-through entry above).
|
|
1351
|
+
`panel` is
|
|
1352
|
+
separate from `enabled` on purpose — a screen-reader user wants the planning
|
|
1353
|
+
discipline without the column, and the system prompt varies one sentence to
|
|
1354
|
+
match. Under `-p` the plan goes to stderr as `[todo] 3/7 <step>` lines,
|
|
1355
|
+
suppressed by `--quiet`. Below 80 columns, behind an overlay, in inline mode
|
|
1356
|
+
or on a short terminal the rail is not mounted and the counter appears in the
|
|
1357
|
+
status bar instead; the transcript keeps at least 62 columns at every width.
|
|
1358
|
+
|
|
1359
|
+
- **Output token limits that cannot themselves fail a run.** Every model and
|
|
1360
|
+
every provider now defaults to 64000 output tokens, and that number is
|
|
1361
|
+
configurable from the TUI, from a flag, from `ARAGON_MAX_TOKENS`, and by hand
|
|
1362
|
+
in `~/.aragon-agent/config.json`. Leave it alone and it stays 64000.
|
|
1363
|
+
|
|
1364
|
+
What is new is that the number is an *ambition*. `gpt-4o` caps at 16384 and
|
|
1365
|
+
`gemini-1.5-pro` at 8192; sending 64000 to either is an HTTP 400 that ends the
|
|
1366
|
+
turn with a raw provider string in the transcript. The cap is now clamped down
|
|
1367
|
+
to whatever the target model actually accepts, from a per-model table plus
|
|
1368
|
+
whatever the provider's own model list reports. For a model nothing knows — a
|
|
1369
|
+
proxy, a `--base-url` endpoint, something that shipped last week — the request
|
|
1370
|
+
goes out at 64000, and if the provider objects, `aragon` reads the real ceiling
|
|
1371
|
+
out of the error text, repairs the request, sends it exactly once more, and
|
|
1372
|
+
remembers the answer for the rest of the session. One warning line; the run
|
|
1373
|
+
continues.
|
|
1374
|
+
|
|
1375
|
+
Two combinations that were a guaranteed 400 on every request are fixed with
|
|
1376
|
+
it: `--thinking xhigh` asks for a 65536-token budget while Anthropic requires
|
|
1377
|
+
`max_tokens` to be strictly greater than it, and OpenAI's reasoning family
|
|
1378
|
+
(`o1`, `o3`, `gpt-5`) rejects the `max_tokens` parameter name outright in
|
|
1379
|
+
favour of `max_completion_tokens`.
|
|
1380
|
+
|
|
1381
|
+
New surfaces: `/max-tokens [<n>|auto|default]`, which with no argument reports
|
|
1382
|
+
the setting *and* the effective cap for the live model; an `Effective:` line
|
|
1383
|
+
under the settings screen's `Max tokens` field, so a value the model will not
|
|
1384
|
+
honour is visible before you save it; `--max-tokens auto`; and
|
|
1385
|
+
`aragon config set maxTokens <n|auto|default>`, which echoes the value that was
|
|
1386
|
+
actually stored rather than the one you typed.
|
|
1387
|
+
|
|
1388
|
+
- **Team subagents.** The agent can now hand independent parts of a job to up to
|
|
1389
|
+
five short-lived subagents that run in parallel, then read one combined report
|
|
1390
|
+
of what each of them found. It decides for itself whether to delegate, so a
|
|
1391
|
+
session that never calls the new `task` tool is byte-for-byte the session that
|
|
1392
|
+
existed before. On by default; `--no-team` or `team.enabled: false` turns it
|
|
1393
|
+
off, and `aragon config set team.maxSubagents <n>` sets the width (1-10; the
|
|
1394
|
+
10 is a hard ceiling no config file can raise).
|
|
1395
|
+
|
|
1396
|
+
A subagent is a full agent with the same tools and working directory but no
|
|
1397
|
+
memory of your conversation, so its brief has to be self-contained. It cannot
|
|
1398
|
+
delegate further and it cannot ask you anything. Plan mode and a skill's
|
|
1399
|
+
`allowed-tools` ceiling both reach one level down, so delegating is never a
|
|
1400
|
+
way around either; `--confirm` queues subagent confirmations one at a time and
|
|
1401
|
+
labels each with the subagent that is asking.
|
|
1402
|
+
|
|
1403
|
+
Subagents can message each other with `team_send` / `team_wait`, delivered by
|
|
1404
|
+
attaching the message to the recipient's next tool result rather than
|
|
1405
|
+
interrupting it. The limits are deliberate — 6 messages each, one every 15
|
|
1406
|
+
seconds, 24 per dispatch — and every refusal is a plain result naming the
|
|
1407
|
+
limit rather than an error, because an error invites the retry the limits
|
|
1408
|
+
exist to prevent.
|
|
1409
|
+
|
|
1410
|
+
While a dispatch runs, a roster sits between the transcript and the composer
|
|
1411
|
+
and the status bar carries `agents 3/5`; both disappear when it finishes and
|
|
1412
|
+
the transcript keeps a card you can expand with `Ctrl+O`. `Esc` aborts every
|
|
1413
|
+
subagent and returns the partial report. Under `-p` the transitions go to
|
|
1414
|
+
stderr and the subagents' tokens are folded into the `[usage]` footer, so the
|
|
1415
|
+
cost readout cannot under-report what the team spent.
|
|
1416
|
+
|
|
1417
|
+
Full documentation, including the limits table and how team mode interacts
|
|
1418
|
+
with plan mode, skills and `--confirm`, is in the README.
|
|
1419
|
+
|
|
1420
|
+
- **The subagent roster now shows what each subagent is doing, and shows the
|
|
1421
|
+
ones that are working.** Where every row used to say `thinking` for minutes at
|
|
1422
|
+
a time, it now says `bash: npm test -w cli`, `read: src/api/routes.ts`,
|
|
1423
|
+
`waiting for a2`, or the tail of the sentence the subagent is currently
|
|
1424
|
+
writing. On a narrow terminal the same row falls back to a file name and a
|
|
1425
|
+
program name rather than wrapping, and the elapsed clock keeps its place at
|
|
1426
|
+
every width.
|
|
1427
|
+
|
|
1428
|
+
The five visible rows are now the five that matter: whatever is running comes
|
|
1429
|
+
first, then whatever is queued, then the most recent results. Above five
|
|
1430
|
+
subagents the old panel showed the five that had finished first and hid
|
|
1431
|
+
everything still working behind `+3 more`, which is the opposite of what the
|
|
1432
|
+
roster is for. `+3 more` now says how many of the hidden ones are still going.
|
|
1433
|
+
|
|
1434
|
+
- **A subagent no longer waits two minutes for a message nobody can send.**
|
|
1435
|
+
`team_wait` now checks whether anyone could actually answer before it blocks:
|
|
1436
|
+
if the teammate it named has already finished, does not exist, or is itself
|
|
1437
|
+
waiting in a way that cannot be released in time, it returns straight away and
|
|
1438
|
+
says which. Nothing is refused that could still have been answered — including
|
|
1439
|
+
by a third teammate further down the chain — and the subagent is told what to
|
|
1440
|
+
do instead rather than handed an error.
|
|
1441
|
+
|
|
1442
|
+
- **A subagent whose very first request dies on a rate limit is retried once.**
|
|
1443
|
+
Only a genuine cold start qualifies: no turn completed and no tool ran, so
|
|
1444
|
+
there is nothing to undo. It restarts after two seconds, the roster says
|
|
1445
|
+
`starting (retry)`, and the report notes `retried 1x`. Pressing `Esc`, a
|
|
1446
|
+
timeout, or any subagent that had already begun work is never retried.
|
|
1447
|
+
|
|
1448
|
+
### Changed
|
|
1449
|
+
|
|
1450
|
+
- **`"maxTokens": null` in `config.json` now means AUTO** — use each model's own
|
|
1451
|
+
ceiling, never above 64000. It previously resolved to 64000 by accident (the
|
|
1452
|
+
layered resolver skipped `null`), and there was no way to express AUTO through
|
|
1453
|
+
any supported write path. If you have a `null` there today, the only difference
|
|
1454
|
+
is a downward clamp on models whose real ceiling is below 64000 — the direction
|
|
1455
|
+
that prevents failures rather than causing them. Absent still means 64000, and
|
|
1456
|
+
an explicit number still means that number.
|
|
1457
|
+
|
|
1458
|
+
- **`config.json` holds settings again.** The prompts you type are no longer
|
|
1459
|
+
stored in it. They move to `~/.aragon-agent/prompt-history.jsonl` — one JSON
|
|
1460
|
+
object per line, `0600` on POSIX — and the submit counter and the "notice
|
|
1461
|
+
already shown" flag move to `~/.aragon-agent/state.json`. `↑` and `↓` behave
|
|
1462
|
+
exactly as before.
|
|
1463
|
+
|
|
1464
|
+
Two things get better. Opening `config.json` to change your model no longer
|
|
1465
|
+
means scrolling past a transcript of your own typing, and copying it to
|
|
1466
|
+
another machine no longer carries your prompts along. And submitting a message
|
|
1467
|
+
no longer rewrites the file that holds your API keys: `config.json` is written
|
|
1468
|
+
when you change a setting, and at no other time.
|
|
1469
|
+
|
|
1470
|
+
**Your history and counters are migrated automatically, once, at the next
|
|
1471
|
+
launch.** Nothing is printed, because nothing changes for you. The dead
|
|
1472
|
+
`recentModels` key — which nothing has ever written — is dropped.
|
|
1473
|
+
|
|
1474
|
+
If you go back to 0.5.x after upgrading, that version does not know about the
|
|
1475
|
+
new file and `↑` will look empty. Nothing has been lost: the entries are still
|
|
1476
|
+
in `prompt-history.jsonl`, and upgrading again brings them back.
|
|
1477
|
+
|
|
1478
|
+
### Added
|
|
1479
|
+
|
|
1480
|
+
- **`aragon history`** — `path`, `list` (`-n`, `--json`) and `clear --yes` for
|
|
1481
|
+
the prompt history, alongside the existing `aragon logs` commands. Entries are
|
|
1482
|
+
stored verbatim, so `clear` is how you erase them; `aragon config set
|
|
1483
|
+
historyEnabled false` stops new ones being recorded without deleting or hiding
|
|
1484
|
+
what is already there.
|
|
1485
|
+
|
|
1486
|
+
- **The mouse wheel scrolls what is under the pointer.** In full-screen mode the
|
|
1487
|
+
wheel now scrolls the transcript three rows per notch (a page with `Shift`),
|
|
1488
|
+
scrolls an open overlay when the pointer is over one, and steps prompt history
|
|
1489
|
+
one entry per notch when the pointer is over the input box — the same code
|
|
1490
|
+
path `↑` / `↓` use, so it inherits the rule that an in-progress draft is never
|
|
1491
|
+
overwritten. A slim rail on the viewport's right edge shows where you are in
|
|
1492
|
+
the conversation.
|
|
1493
|
+
|
|
1494
|
+
**This fixes a destructive bug.** Previously the wheel recalled prompt history
|
|
1495
|
+
no matter where the pointer was, because the alternate screen makes terminals
|
|
1496
|
+
translate each notch into arrow keys. Wheeling while composing a message
|
|
1497
|
+
silently replaced the draft with an old prompt, and nothing scrolled.
|
|
1498
|
+
|
|
1499
|
+
**Selecting text with the mouse now requires `Shift`+drag** in most terminals.
|
|
1500
|
+
That is the standard convention for "an application is tracking the mouse" and
|
|
1501
|
+
it applies to everyone, including people who never scroll with the wheel — so
|
|
1502
|
+
the first session says so once, in the transcript, and never again. Turn the
|
|
1503
|
+
whole feature off with `--no-mouse`, `ARAGON_MOUSE=0`, or
|
|
1504
|
+
`aragon config set mouse false`; the wheel then does nothing rather than
|
|
1505
|
+
reverting to the old behaviour. Inline mode (`--no-fullscreen`) is untouched:
|
|
1506
|
+
your terminal's own scrollback already does the right thing there.
|
|
1507
|
+
|
|
1508
|
+
Under `tmux` with `mouse on`, tmux keeps the wheel for itself and the app
|
|
1509
|
+
never sees it. `set -g mouse off` hands it back.
|
|
1510
|
+
|
|
1511
|
+
### Changed
|
|
1512
|
+
|
|
1513
|
+
- **Your files moved to `~/.aragon-agent/`.** Config, sessions, installed skills
|
|
1514
|
+
and the usage counters now live in one directory in your home — on Windows
|
|
1515
|
+
`C:\Users\<you>\.aragon-agent\`, and the same path on macOS and Linux. They
|
|
1516
|
+
used to be split across `%APPDATA%\aragon-agent-nodejs\Config` and
|
|
1517
|
+
`%LOCALAPPDATA%\aragon-agent-nodejs\Data` (or the XDG equivalents), which are
|
|
1518
|
+
correct locations and terrible answers to "where do I change the model?".
|
|
1519
|
+
|
|
1520
|
+
**The move happens once, automatically, on first launch, and prints a line on
|
|
1521
|
+
stderr when it does.** Nothing is deleted: `config.json` is COPIED rather than
|
|
1522
|
+
moved, and the old directories are left where they are, so reinstalling 0.5.0
|
|
1523
|
+
remains lossless. `aragon config home` prints the new location and names the
|
|
1524
|
+
old ones. Once you are satisfied, you can delete them yourself.
|
|
1525
|
+
|
|
1526
|
+
`ARAGON_HOME` relocates the whole tree. It has to be a real environment
|
|
1527
|
+
variable — the path is resolved before any `.env` is read, so putting it in a
|
|
1528
|
+
`.env` will not work. `aragon config home` always prints what is actually in
|
|
1529
|
+
use.
|
|
1530
|
+
|
|
1531
|
+
### Added
|
|
1532
|
+
|
|
1533
|
+
- **Logging.** Records go to `~/.aragon-agent/logs/aragon-<date>.log` as JSON
|
|
1534
|
+
Lines: startup and exit, config writes, turn boundaries with token counts,
|
|
1535
|
+
tool names with durations, skill loads, and every uncaught error. Files rotate
|
|
1536
|
+
by day and by size (`log.maxFileBytes`, default 5 MiB) and the oldest beyond
|
|
1537
|
+
`log.maxFiles` (default 10) are deleted.
|
|
1538
|
+
|
|
1539
|
+
**`info`, the default, records no conversation content**, so attaching a log
|
|
1540
|
+
to a bug report is safe. `--log-level debug` (or `--verbose`) adds prompts,
|
|
1541
|
+
replies and tool arguments truncated to `log.previewChars`; `trace` adds them
|
|
1542
|
+
in full. Those two write what you typed — check before sharing one.
|
|
1543
|
+
|
|
1544
|
+
API keys are removed at every level by two independent passes: fields whose
|
|
1545
|
+
name looks like a credential are blanked whatever they hold, and every string
|
|
1546
|
+
is scanned both for known key formats and for the literal keys this process is
|
|
1547
|
+
holding — which is what covers a custom endpoint whose key looks like nothing
|
|
1548
|
+
in particular. `log.redactSecrets false` turns both off and warns you on
|
|
1549
|
+
stdout when you set it.
|
|
1550
|
+
|
|
1551
|
+
Nothing is ever uploaded. There is no network path out of this subsystem.
|
|
1552
|
+
|
|
1553
|
+
New commands: `aragon logs path | list | tail [-n N] [--follow] [--level lv]
|
|
1554
|
+
[--json] | clear --yes | open`, and `/logs` inside the TUI. New flags:
|
|
1555
|
+
`--log-level`, `--verbose`, `--log-file` / `--no-log-file`, `--log-dir`. New
|
|
1556
|
+
environment variables: `ARAGON_LOG_LEVEL`, `ARAGON_LOG_FILE`, `ARAGON_LOG_DIR`
|
|
1557
|
+
— these three, unlike `ARAGON_HOME`, can come from a `.env`.
|
|
1558
|
+
|
|
1559
|
+
- **`aragon config get <key>` / `list [--json]` / `edit` / `home`.** `get` and
|
|
1560
|
+
`list` mask every secret, `--json` included. `edit` opens `config.json` in
|
|
1561
|
+
`$VISUAL` / `$EDITOR` (`notepad` on Windows), takes a `config.json.bak` first,
|
|
1562
|
+
and re-parses on exit — an invalid edit is reported immediately, and the
|
|
1563
|
+
backup is named in the message.
|
|
1564
|
+
|
|
1565
|
+
- **`/reload`** re-reads `config.json` into the running session, for when you
|
|
1566
|
+
have edited it in another window. Refused while a run is in progress: swapping
|
|
1567
|
+
the model mid-turn would let the second half of an answer come from different
|
|
1568
|
+
settings than the first, with nothing afterwards able to explain the result.
|
|
1569
|
+
|
|
1570
|
+
- **Log level in the settings screen**, alongside provider / model / thinking.
|
|
1571
|
+
The rest of the log settings — and `redactSecrets` above all — stay
|
|
1572
|
+
command-line-only, so the one switch that can put credentials on disk cannot
|
|
1573
|
+
be flipped with an arrow key.
|
|
1574
|
+
|
|
1575
|
+
### Fixed
|
|
1576
|
+
|
|
1577
|
+
- **A malformed `config.json` no longer resets everything in silence.** A stray
|
|
1578
|
+
comma used to send the model, theme, timeouts, skills and (as far as you could
|
|
1579
|
+
tell) your API key back to defaults, with nothing anywhere explaining it. The
|
|
1580
|
+
fallback is unchanged — a bad config still never stops the CLI from starting —
|
|
1581
|
+
but it now says so, and records why.
|
|
1582
|
+
|
|
1583
|
+
- **Ctrl+C now flushes pending log records in every mode.** The signal handlers
|
|
1584
|
+
only existed in the full-screen branch, so `-p`, the inline renderer and every
|
|
1585
|
+
subcommand took Node's default termination, which does not run exit handlers.
|
|
1586
|
+
|
|
1587
|
+
### Added
|
|
1588
|
+
|
|
1589
|
+
- **Plan mode.** `Shift+Tab` toggles between `BUILD` (everything as before) and
|
|
1590
|
+
`PLAN`, a read-only research-and-design posture. `/plan [on|off|status]` is a
|
|
1591
|
+
first-class equivalent for terminals that swallow `CSI Z`, and `--plan` /
|
|
1592
|
+
`--no-plan` / `ARAGON_PLAN=1` / `planModeDefault` cover the startup case.
|
|
1593
|
+
|
|
1594
|
+
In `PLAN`, `write_file`, `edit_file`, `bash`, `skill_install` and
|
|
1595
|
+
`skill_create` are refused **at the tool boundary**, so read-only is a
|
|
1596
|
+
property of the wiring rather than a promise in a prompt. `bash` is refused in
|
|
1597
|
+
full, `git status` included: a shell string cannot be classified reliably, and
|
|
1598
|
+
a gate that is right most of the time is worse than one that is always right,
|
|
1599
|
+
because you stop trusting the badge. The refusal names `read_file` / `glob` /
|
|
1600
|
+
`grep` as the alternatives.
|
|
1601
|
+
|
|
1602
|
+
Two tools exist only while a human is attached. `ask_user` renders a
|
|
1603
|
+
keyboard-driven wizard - 1-5 questions, 2-4 options each, exactly one marked
|
|
1604
|
+
`RECOMMENDED`, plus an `Other...` free-text option - where pressing `Enter`
|
|
1605
|
+
through the wizard accepts every recommendation. `submit_plan` renders the
|
|
1606
|
+
plan as a scrollable card: `a` approves, `r` sends written feedback (`<-`
|
|
1607
|
+
returns to the card), `Esc` dismisses. **Approving flips the session to
|
|
1608
|
+
`BUILD` immediately and the same run continues into implementation.**
|
|
1609
|
+
|
|
1610
|
+
Dismissing a plan asks for a better one rather than stopping - the agent is
|
|
1611
|
+
told to refine and resubmit - so the way out of a run is `Esc` twice: the
|
|
1612
|
+
first closes the card, the second aborts the run.
|
|
1613
|
+
|
|
1614
|
+
Toggling mid-run is asymmetric on purpose: `build -> plan` applies at once,
|
|
1615
|
+
`plan -> build` is deferred to the end of the run (the status bar shows
|
|
1616
|
+
`PLAN -> BUILD` meanwhile) so a run launched under a read-only guarantee
|
|
1617
|
+
cannot start writing files because of one stray keypress.
|
|
1618
|
+
|
|
1619
|
+
`aragon -p --plan "..."` registers no question or plan tool - there is nobody
|
|
1620
|
+
to ask - but the read-only gate still applies, so it means "tell me how you
|
|
1621
|
+
would do this, and do not touch my repository".
|
|
1622
|
+
|
|
1623
|
+
- Three flat config keys: `planModeDefault` (default `false`),
|
|
1624
|
+
`planModeMaxAskRounds` (default `4`, clamped `[1, 10]`) and
|
|
1625
|
+
`planModeHumanTimeoutMs` (default `1800000`, clamped `[60000, 7200000]`). All
|
|
1626
|
+
three are settable with `aragon config set`. Additive, as always: a config
|
|
1627
|
+
file written by an earlier version loads unchanged.
|
|
1628
|
+
|
|
1629
|
+
### Fixed
|
|
1630
|
+
|
|
1631
|
+
- A `--confirm` prompt no longer races the idle watchdog. Taking longer than
|
|
1632
|
+
`idleTimeoutMs` over `Proceed? (y/N)` used to abort the run with no
|
|
1633
|
+
explanation; every human wait now suspends the watchdog and restarts it in a
|
|
1634
|
+
`finally`.
|
|
1635
|
+
|
|
1636
|
+
- Honor an explicit `NODE_TLS_REJECT_UNAUTHORIZED=0` setting in the CLI and the
|
|
1637
|
+
official npm release workflow while hiding only Node's standard insecure-TLS
|
|
1638
|
+
warning. Other process warnings remain visible.
|
|
1639
|
+
|
|
1640
|
+
## 0.5.0
|
|
1641
|
+
|
|
1642
|
+
### Breaking
|
|
1643
|
+
|
|
1644
|
+
- **The package is renamed `@argon-agent/cli` → `@aragon-agent/cli`.** The brand
|
|
1645
|
+
was always meant to be *Aragon*, matching AragonMesh; the missing `a` was a
|
|
1646
|
+
typo that reached the registry. Install with:
|
|
1647
|
+
|
|
1648
|
+
```
|
|
1649
|
+
npm uninstall -g @argon-agent/cli
|
|
1650
|
+
npm install -g @aragon-agent/cli
|
|
1651
|
+
```
|
|
1652
|
+
|
|
1653
|
+
`@argon-agent/cli` is deprecated and receives no further releases. **The
|
|
1654
|
+
executable is still `aragon`** — the command you type does not change.
|
|
1655
|
+
|
|
1656
|
+
- **Environment variables are `ARAGON_*`, not `ARGON_*`.** There is no
|
|
1657
|
+
compatibility fallback: `ARGON_MODEL`, `ARGON_PROVIDER`, `ARGON_BASE_URL`,
|
|
1658
|
+
`ARGON_THINKING`, `ARGON_MAX_TOKENS`, `ARGON_THEME`, `ARGON_FULLSCREEN`,
|
|
1659
|
+
`ARGON_SKILLS`, `ARGON_SKILLS_DISABLED`, `ARGON_SKILLS_PATH` and
|
|
1660
|
+
`ARGON_REDUCED_MOTION` are all ignored from this release on. Rename them in
|
|
1661
|
+
your shell profile and CI. Provider keys (`ANTHROPIC_API_KEY`,
|
|
1662
|
+
`OPENAI_API_KEY`, `GOOGLE_API_KEY`, `GEMINI_API_KEY`) are untouched.
|
|
1663
|
+
|
|
1664
|
+
- **The project-level skills directory is `.aragon/skills`, not
|
|
1665
|
+
`.argon/skills`.** This one lives in your repository, so rename it yourself:
|
|
1666
|
+
|
|
1667
|
+
```
|
|
1668
|
+
git mv .argon .aragon
|
|
1669
|
+
```
|
|
1670
|
+
|
|
1671
|
+
A config file that already persisted the old default keeps working — an
|
|
1672
|
+
explicitly saved `skills.projectDirs` still wins over the default — but the
|
|
1673
|
+
shipped default is now `['.aragon/skills', '.claude/skills']`. Update it with
|
|
1674
|
+
`aragon config set` if you want the new default.
|
|
1675
|
+
|
|
1676
|
+
### Added
|
|
1677
|
+
|
|
1678
|
+
- **Automatic migration of your user-level state.** On first run, 0.5.0 moves
|
|
1679
|
+
the `env-paths` config and data directories from `argon-agent` to
|
|
1680
|
+
`aragon-agent` — your API key, sessions and installed skills come with it, and
|
|
1681
|
+
each installed skill's `.argon-skill.json` manifest is renamed to
|
|
1682
|
+
`.aragon-skill.json` so `skills update` and `skills uninstall` still recognise
|
|
1683
|
+
it. The migration prints one line to **stderr**, runs once, and is skipped
|
|
1684
|
+
entirely if the new directory already exists. If it fails for any reason the
|
|
1685
|
+
CLI still starts; the old directory is never deleted when a cross-volume copy
|
|
1686
|
+
was needed.
|
|
1687
|
+
|
|
1688
|
+
- The opening wordmark now reads `ARAGON` and is 52 columns wide (was 44).
|
|
1689
|
+
Terminals between 52 and 55 columns show the single-line banner rather than a
|
|
1690
|
+
clipped wordmark.
|
|
1691
|
+
|
|
1692
|
+
- **Skills.** A skill is a directory holding a `SKILL.md` (YAML frontmatter +
|
|
1693
|
+
Markdown body) plus optional `reference/`, `scripts/` and `assets/`. Skills
|
|
1694
|
+
reach the model through three levels of progressive disclosure: a name +
|
|
1695
|
+
one-line "when to use" catalog in the system prompt (≤ 6 000 bytes total),
|
|
1696
|
+
the full body only when the model calls the `skill` tool, and bundled files
|
|
1697
|
+
only when it reads them with `read_file` / `bash`. A skill therefore costs a
|
|
1698
|
+
line of context rather than its whole body. How many fit in Level 1 depends on
|
|
1699
|
+
description length and language — roughly 30 with terse English descriptions,
|
|
1700
|
+
roughly 10 with Chinese ones at the character cap; past that the catalog
|
|
1701
|
+
truncates and `skill_find` covers the remainder.
|
|
1702
|
+
- Four model-facing tools: `skill` (load), `skill_find` (search installed
|
|
1703
|
+
skills), `skill_install` (install from a local directory, git repo, or https
|
|
1704
|
+
`SKILL.md` / `.zip`) and `skill_create` (author a new one from a procedure the
|
|
1705
|
+
agent just worked out).
|
|
1706
|
+
- **`aragon skills update <name> | --all`**, with `--dry-run`, `--force` and
|
|
1707
|
+
`--check`. Re-fetches from the source recorded in the install manifest,
|
|
1708
|
+
preserving `installedAt` and recording `updatedAt` / `previousVersion`. Refuses
|
|
1709
|
+
before downloading anything when the installed copy has local edits, and
|
|
1710
|
+
re-validates the source against the *current* `skills.allowedHosts` rather than
|
|
1711
|
+
the one in force at install time. Not exposed to the model.
|
|
1712
|
+
- **Catalog ranking.** Level 1 entries are ordered by scope, then by how recently
|
|
1713
|
+
and often each skill was used, so truncation drops what you do not use rather
|
|
1714
|
+
than what sorts last alphabetically. With no usage data the order is unchanged.
|
|
1715
|
+
- **`skill_find`**, advertised in the prompt only when the catalog actually
|
|
1716
|
+
truncated. Searches installed skills by name, description and keyword; never
|
|
1717
|
+
reaches the network, never returns `activation: manual` skills, and tells the
|
|
1718
|
+
model to ask for a source rather than invent one when nothing matches.
|
|
1719
|
+
- **Cross-process install lock.** Install / create / remove / update take a
|
|
1720
|
+
per-directory advisory lock, closing a race in which two concurrent installs
|
|
1721
|
+
could interleave their atomic-replace steps and delete a skill with no error.
|
|
1722
|
+
Self-expires after 60 s; waits at most 5 s; only ever released by its owner.
|
|
1723
|
+
- **Load-time integrity.** Discovery re-checks `SKILL.md` against the sha256
|
|
1724
|
+
recorded at install, at no extra I/O. `skills.integrity` selects
|
|
1725
|
+
`off` / `warn` (default) / `strict`.
|
|
1726
|
+
- **Local usage counters** at `<data>/skill-usage.json` — skill name, count and
|
|
1727
|
+
timestamp only, never transmitted, disabled with `skills.usageTracking=false`.
|
|
1728
|
+
Automatically injected `activation: always` skills are not counted.
|
|
1729
|
+
- Config keys `skills.integrity` and `skills.usageTracking`; `aragon skills list
|
|
1730
|
+
--sort=recent` and `/skills list --sort=recent`.
|
|
1731
|
+
- Every usable skill also becomes a slash command: `/<skill-name> [args]`, with
|
|
1732
|
+
`$ARGUMENTS` / `$1..$9` substitution. On a name clash the built-in command
|
|
1733
|
+
always wins and the skill is reachable as `/skill:<name>`.
|
|
1734
|
+
- `/skills` management: `list`, `info`, `install`, `remove`, `enable`,
|
|
1735
|
+
`disable`, `reload`, `create`, `trust`, `untrust`.
|
|
1736
|
+
- `aragon skills …` non-interactive equivalents plus `path` and `doctor`.
|
|
1737
|
+
Exit codes follow `config set`: `0` ok, `1` run-time failure, `2` usage.
|
|
1738
|
+
- Four discovery scopes in ascending precedence: bundled (`<pkg>/skills`), user
|
|
1739
|
+
(`<data>/skills`), project (`<cwd>/.aragon/skills` and, read-only,
|
|
1740
|
+
`<cwd>/.claude/skills` for Claude Code interop), and `ARAGON_SKILLS_PATH`.
|
|
1741
|
+
- New flags `--no-skills`, `--skill <name>` (repeatable) and `--skills-yes`;
|
|
1742
|
+
env `ARAGON_SKILLS`, `ARAGON_SKILLS_PATH`, `ARAGON_SKILLS_DISABLED`; config keys
|
|
1743
|
+
`skills.enabled`, `skills.requireApproval`, `skills.catalogMaxBytes`,
|
|
1744
|
+
`skills.bodyMaxBytes`.
|
|
1745
|
+
- One bundled skill, `skill-creator`, documenting how to write a good one.
|
|
1746
|
+
- New runtime dependency: `fflate` (~30 KB, MIT, zero transitive deps) for zip
|
|
1747
|
+
extraction. `@aragon-agent/core` gains no dependency.
|
|
1748
|
+
- **Release tooling for the scope change.** `npm run verify:brand` scans every
|
|
1749
|
+
file that `npm pack` would put in the tarball — README and `dist/` included —
|
|
1750
|
+
and blocks the release on any surviving `argon` reference, with only the four
|
|
1751
|
+
documented exceptions (the two CHANGELOGs and the legacy-state migration
|
|
1752
|
+
module, which hold the old names by definition). `packages/cli` also gains a
|
|
1753
|
+
`prepublishOnly: npm run build`, so a publish that bypasses
|
|
1754
|
+
`publish-latest.ps1` can no longer ship a `dist/` that is out of step with the
|
|
1755
|
+
sources. `deprecate-legacy.ps1` retires `@argon-agent/*` on the registry, and
|
|
1756
|
+
refuses to do so until the replacements are actually published.
|
|
1757
|
+
|
|
1758
|
+
### Changed
|
|
1759
|
+
|
|
1760
|
+
- The globally installed executable is now `aragon`. The previous `argon` and
|
|
1761
|
+
`argon-agent` aliases are no longer installed.
|
|
1762
|
+
- `config/store.ts` now deep-merges the `skills` section on both read and write,
|
|
1763
|
+
the same treatment `apiKeys` already received. Without it a partial patch such
|
|
1764
|
+
as the one `/skills disable` sends would replace the whole section and
|
|
1765
|
+
silently discard `trustedProjectDirs`, `allowedHosts` and `requireApproval`.
|
|
1766
|
+
- `slashSuggestions` accepts `-` and `:`, so kebab-case and `skill:`-namespaced
|
|
1767
|
+
commands autocomplete. Previously `/my-sk` produced no popup at all.
|
|
1768
|
+
- `AgentController` now has a single `agent.setSystemPrompt()` call site, so a
|
|
1769
|
+
`/cwd` change can no longer drop the skill catalog out of the prompt.
|
|
1770
|
+
- With skills off or none installed, the system prompt and the 7-tool array are
|
|
1771
|
+
byte-identical to the previous release.
|
|
1772
|
+
- Added a repository-level PowerShell release workflow that automatically
|
|
1773
|
+
updates CLI and Core versions, synchronizes their dependency and lockfile,
|
|
1774
|
+
verifies both tarballs, and publishes them in dependency order.
|
|
1775
|
+
|
|
1776
|
+
### Security
|
|
1777
|
+
|
|
1778
|
+
- Installing a skill requires an explicit human approval that **probes for a
|
|
1779
|
+
human first and refuses when there is none**. Under `-p` there is no TUI and
|
|
1780
|
+
therefore no approver, so `skill_install` is refused with an actionable
|
|
1781
|
+
message rather than writing a third-party directory unattended. Use
|
|
1782
|
+
`--skills-yes` (or `skills.requireApproval=false`) to opt out deliberately.
|
|
1783
|
+
- Project skill directories require a one-time trust confirmation before they
|
|
1784
|
+
are loaded — cloning an unfamiliar repository does not grant it the ability
|
|
1785
|
+
to inject instructions into your session.
|
|
1786
|
+
- Git is invoked only via `execFile` with an argv array and `shell: false`, and
|
|
1787
|
+
owner / repo / ref / subdirectory fragments are whitelisted and refused if
|
|
1788
|
+
they begin with `-`. A leading dash matters even with a pure argv array:
|
|
1789
|
+
`--upload-pack=<program>` makes git execute that program.
|
|
1790
|
+
- Zip extraction is streamed and gated on **actually written** bytes, per-entry
|
|
1791
|
+
size, compression ratio and entry count, all of which can abort mid-archive.
|
|
1792
|
+
The size a zip *declares* is written by whoever built it and is never trusted.
|
|
1793
|
+
Path traversal, absolute entries, symlinks and Windows device names are
|
|
1794
|
+
refused, and a rejected archive is removed rather than left half-extracted.
|
|
1795
|
+
- Network fetches are `https:` only, restricted to `skills.allowedHosts`,
|
|
1796
|
+
re-checked on every redirect (max 3), size-capped, and refuse IP literals and
|
|
1797
|
+
loopback.
|
|
1798
|
+
- Nothing a skill ships is executed at install time, and the executable bit is
|
|
1799
|
+
not preserved. Scripts run only when the model invokes `bash` explicitly.
|
|
1800
|
+
There is no sandbox: approval blocks *silent* installation, it does not make
|
|
1801
|
+
a skill you approved safe.
|
|
1802
|
+
|
|
1803
|
+
## 0.3.0
|
|
1804
|
+
|
|
1805
|
+
A full-screen TUI release. `@argon-agent/core` is untouched, no new runtime
|
|
1806
|
+
dependency is added, and the headless/print contract, exit codes, and
|
|
1807
|
+
slash-command semantics are unchanged. The 0.2.0 inline renderer remains
|
|
1808
|
+
available in full via `--no-fullscreen`.
|
|
1809
|
+
|
|
1810
|
+
### Added
|
|
1811
|
+
|
|
1812
|
+
- **Full-screen mode (default).** `aragon` now takes over the terminal's
|
|
1813
|
+
alternate screen buffer — the same mechanism `vim` / `htop` / `lazygit` use.
|
|
1814
|
+
Your shell history is covered, not erased, and comes back untouched on exit.
|
|
1815
|
+
The frame is a fixed `rows - 1` tall, so **the composer and the status bar sit
|
|
1816
|
+
at the physical bottom of the screen from the very first frame**: empty
|
|
1817
|
+
session, long session, mid-scroll, or overlay open.
|
|
1818
|
+
- **Brand region.** A six-row gradient ASCII wordmark on a roomy empty session,
|
|
1819
|
+
degrading to a banner, then a single-line bar, then a bare wordmark as space
|
|
1820
|
+
runs out. Row 1 always begins with the brand glyph.
|
|
1821
|
+
- **Self-drawn scrolling.** `PgUp` / `PgDn` by the page, `Shift+↑` / `Shift+↓` by
|
|
1822
|
+
the line. The viewport auto-follows new output while pinned to the bottom;
|
|
1823
|
+
scrolling away shows `↑N` in the status bar plus a "N new lines" hint, and
|
|
1824
|
+
submitting a message always re-pins.
|
|
1825
|
+
- **Exit replay.** After leaving the alternate screen the session is replayed
|
|
1826
|
+
into the normal buffer as plain, colorless text, so the conversation does not
|
|
1827
|
+
evaporate with the screen. Turn it off with `--no-exit-transcript`.
|
|
1828
|
+
- **New flags** `--fullscreen` / `--no-fullscreen` / `--no-exit-transcript`, the
|
|
1829
|
+
env var `ARGON_FULLSCREEN=0|1`, and the config keys `fullscreen`,
|
|
1830
|
+
`exitTranscript`, and `transcriptWindow`.
|
|
1831
|
+
- **Automatic downgrade.** A non-TTY stdout, `TERM=dumb`, CI, and terminals under
|
|
1832
|
+
12 rows / 40 columns fall back to the inline renderer. Only the non-TTY gate is
|
|
1833
|
+
un-overridable — `--fullscreen` beats the rest.
|
|
1834
|
+
|
|
1835
|
+
### Changed
|
|
1836
|
+
|
|
1837
|
+
- The status bar lost its round border and is now exactly one row; it had been
|
|
1838
|
+
spending an eighth of a 24-row terminal framing a single line of text.
|
|
1839
|
+
- The toast strip holds a fixed row in full-screen mode, so the transcript no
|
|
1840
|
+
longer jumps as toasts appear and expire.
|
|
1841
|
+
- The composer is a rounded frame whose border color reports state (idle, has a
|
|
1842
|
+
draft, running, blurred by an overlay), with the completion popup above it.
|
|
1843
|
+
- `Ctrl+L` repaints the frame instead of writing a clear sequence. Ink dedupes
|
|
1844
|
+
identical output at two separate gates, so under a fixed frame the old
|
|
1845
|
+
approach erased the screen and then declined to redraw it.
|
|
1846
|
+
- `Shift+↑` / `Shift+↓` no longer recall prompt history — they scroll.
|
|
1847
|
+
- Full-screen mode routes `console.*` into the transcript as notices rather than
|
|
1848
|
+
letting Ink write them straight to stdout, which corrupts the frame's line
|
|
1849
|
+
accounting.
|
|
1850
|
+
|
|
1851
|
+
### Known trade-offs
|
|
1852
|
+
|
|
1853
|
+
- The terminal's native scrollback and mouse wheel do not scroll the transcript
|
|
1854
|
+
in full-screen mode; use `PgUp` / `PgDn`, or run with `--no-fullscreen`.
|
|
1855
|
+
- Mouse tracking is deliberately left off: enabling it costs text selection and
|
|
1856
|
+
copy in most terminals.
|
|
1857
|
+
- Should a crash ever strand your terminal on the alternate screen, `reset`
|
|
1858
|
+
restores it. Four independent restore paths exist to prevent that: normal
|
|
1859
|
+
exit, `process.exit`, `SIGINT` / `SIGTERM` / `SIGHUP`, and Ink's own signal
|
|
1860
|
+
handling.
|
|
1861
|
+
|
|
1862
|
+
## 0.2.0
|
|
1863
|
+
|
|
1864
|
+
A design-elevation & HCI-hardening release. No breaking changes: `@argon-agent/core`
|
|
1865
|
+
is untouched, no new runtime dependency is added, and the headless/print contract,
|
|
1866
|
+
exit codes, config keys, and slash-command semantics from 0.1.0 are unchanged.
|
|
1867
|
+
|
|
1868
|
+
### Added
|
|
1869
|
+
|
|
1870
|
+
- **Real theming engine.** Distinct `dark` / `light` palettes with an `auto`
|
|
1871
|
+
resolution (`auto → dark`), color degradation across terminal depth
|
|
1872
|
+
(truecolor → 256 → 16 → monochrome), and an ASCII glyph fallback for terminals
|
|
1873
|
+
without Unicode. Honors `NO_COLOR`, `FORCE_COLOR`, `--no-color`, and
|
|
1874
|
+
`TERM=dumb`. Switch live with `/theme <auto|dark|light>` (persisted).
|
|
1875
|
+
- **Elegant chrome.** A gradient wordmark header that collapses to a slim sticky
|
|
1876
|
+
bar after the first turn, a first-run **Welcome / empty-state** card, and a
|
|
1877
|
+
status bar with a colored **context gauge** (threshold colors), a **tokens/sec**
|
|
1878
|
+
read-out while running, and a contextual hint.
|
|
1879
|
+
- **Legible tool output.** Colored unified diffs (green adds / red removes) and
|
|
1880
|
+
per-tool rich previews (`edit_file`/`write_file`/`read_file`/`bash`/`list_dir`/
|
|
1881
|
+
`glob`). Long previews collapse to 8 lines and expand with `Ctrl+O` or
|
|
1882
|
+
`/expand [n]`.
|
|
1883
|
+
- **Autocomplete.** A slash-command palette and `@file` path completion popup
|
|
1884
|
+
(`Tab`/`→` to complete, `Up`/`Down` to move, `Esc` to close).
|
|
1885
|
+
- **Full line editing.** Home/End, word jump/delete, kill-to-start/end, and
|
|
1886
|
+
multi-line vertical cursor navigation, with prompt-history recall at the edges.
|
|
1887
|
+
Unknown control/escape sequences are dropped instead of inserted.
|
|
1888
|
+
- **Reliability under load.** Ink `<Static>` finalization for settled entries and
|
|
1889
|
+
a streaming delta coalescer, so long/fast sessions stay flicker-free.
|
|
1890
|
+
- **Calm feedback.** Ephemeral, auto-dismissing **toasts** for transient acks;
|
|
1891
|
+
the transcript keeps only durable content (messages, tool cards, run errors).
|
|
1892
|
+
- `reducedMotion` config (also `ARGON_REDUCED_MOTION`; implied by `--no-color`)
|
|
1893
|
+
replaces spinners with a static glyph.
|
|
1894
|
+
|
|
1895
|
+
### Changed
|
|
1896
|
+
|
|
1897
|
+
- History scrollback now uses the **native terminal scrollback** that `<Static>`
|
|
1898
|
+
prints into (this supersedes the never-implemented `PgUp`/`PgDn` promise).
|
|
1899
|
+
|
|
1900
|
+
## 0.1.0
|
|
1901
|
+
|
|
1902
|
+
Initial release — a Claude-Code / Codex-style interactive terminal UI (TUI) on
|
|
1903
|
+
top of `@argon-agent/core`.
|
|
1904
|
+
|
|
1905
|
+
### Added
|
|
1906
|
+
|
|
1907
|
+
- **Interactive TUI** (React + Ink): gradient header, streaming transcript with
|
|
1908
|
+
markdown + syntax highlighting, collapsible thinking blocks, live tool-call
|
|
1909
|
+
cards, a status bar (model / context % / tokens / cost / elapsed), and modal
|
|
1910
|
+
overlays (settings, model picker, help, confirm).
|
|
1911
|
+
- **Built-in toolset** wired into the core agent at full permission:
|
|
1912
|
+
`read_file`, `write_file`, `edit_file`, `list_dir`, `glob`, `grep`, `bash`.
|
|
1913
|
+
- **Layered configuration** (defaults → user file → env/`.env` → flags) with
|
|
1914
|
+
live in-TUI editing of provider / model / base URL / API keys / thinking level
|
|
1915
|
+
/ max tokens. Secrets are masked and the config file is written `0600` on POSIX.
|
|
1916
|
+
- **One-shot / print mode** (`argon -p`) for scripting and piping, plus
|
|
1917
|
+
`argon config` / `argon config set` / `argon config path` / `argon models`.
|
|
1918
|
+
- **Session control**: abort (Esc), steer-while-running, follow-up queue,
|
|
1919
|
+
double-Ctrl-C exit, `/save` / `/resume` JSON sessions.
|
|
1920
|
+
- **Timeout invariant** (`idleTimeout ≥ toolTimeout`) so a long single tool run
|
|
1921
|
+
is never killed by the idle watchdog.
|
|
1922
|
+
- **Never-silent failures**: pre-flight API-key validation, error-StreamEvent
|
|
1923
|
+
rendering, and a guard that surfaces a swallowed agent error instead of a
|
|
1924
|
+
blank no-op (headless exits `1`/`2` accordingly).
|