opencrabs 0.5.14

The autonomous, self-improving AI agent. Single Rust binary. Every channel. Recommended: the 40MB prebuilt binary for macOS, Linux and Windows: https://github.com/opencrabs/opencrabs/releases
1
2
3
4
5
6
7
8
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
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
280
281
282
283
284
285
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
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
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
543
544
545
546
547
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
709
710
711
712
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
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
# Indonesian (Bahasa, incl. colloquial Jakarta register) phantom-detection
# configuration. Added after a live hallucination narrated in Indonesian
# escaped every detector (#463): character-set language detection cannot
# distinguish Indonesian (pure ASCII Latin) from English, but the intent
# scan checks every loaded language's phrases at once, so these fire
# regardless of detection. Phrases are multi-word to keep cross-language
# collision risk low. All lower-case; matched against lowercased text.
#
# Expanded 2026-07-21 (#667): added full regex coverage, completion claims,
# and reasoning-leak phrases to match en.toml's structure.

intent_phrases = [
    # Colloquial Jakarta register (gue/aku)
    "sekarang gue ",
    "sekarang aku ",
    "sekarang saya ",
    "biar gue ",
    "biar aku ",
    "biar saya ",
    "gue akan ",
    "aku akan ",
    "saya akan ",
    "akan gue ",
    "akan aku ",
    "akan saya ",
    "gue load ",
    "gue jalankan ",
    "gue jalanin ",
    "gue push ",
    "gue commit ",
    "gue cek ",
    "gue baca ",
    "gue lihat ",
    "gue periksa ",
    "gue update ",
    "gue fix ",
    "gue bikin ",
    "gue buat ",
    "gue hapus ",
    "gue ganti ",
    "gue tambah ",
    "gue kurang ",
    "gue ubah ",
    "mari kita jalankan",
    "mari kita cek",
    "mari kita lihat",
    "mari kita periksa",
    "mari kita update",
    "mari kita fix",
    "mari kita buat",
    "mari kita baca",
    "coba gue ",
    "coba aku ",
    "coba saya ",
    # Formal register (saya/kita)
    "saya akan cek",
    "saya akan periksa",
    "saya akan lihat",
    "saya akan baca",
    "saya akan update",
    "saya akan fix",
    "saya akan buat",
    "saya akan bikin",
    "saya akan hapus",
    "saya akan ganti",
    "saya akan tambah",
    "saya akan ubah",
    "saya akan jalankan",
    "saya akan push",
    "saya akan commit",
    "saya perlu cek",
    "saya perlu periksa",
    "saya perlu lihat",
    "saya perlu baca",
    "saya perlu update",
    "saya perlu fix",
    "saya perlu buat",
    "saya perlu jalankan",
    "saya harus cek",
    "saya harus periksa",
    "saya harus update",
    "saya harus fix",
    "saya harus buat",
    "saya harus jalankan",
    # "let me" equivalents
    "biar saya cek",
    "biar saya periksa",
    "biar saya lihat",
    "biar saya baca",
    "biar saya update",
    "biar saya fix",
    "biar saya buat",
    "biar saya jalankan",
    "biar saya push",
    "biar saya commit",
    # "now" equivalents
    "sekarang cek ",
    "sekarang periksa ",
    "sekarang lihat ",
    "sekarang baca ",
    "sekarang update ",
    "sekarang fix ",
    "sekarang buat ",
    "sekarang jalankan ",
    "sekarang push ",
    "sekarang commit ",
    "sekarang menambah",
    "sekarang mengubah",
    "sekarang menghapus",
    "sekarang membuat",
    "sekarang memperbaiki",
    "sekarang memperbarui",

    # Parity with en.toml (#2225): the same stems English lists as
    # verbs, carried through the Indonesian families that announce them.
    # The stem after a modal or a pronoun is the natural form here, so one
    # list feeds every family rather than a separate conjugation each.
    "saya akan tinjau",
    "saya akan validasi",
    "saya akan verifikasi",
    "saya akan tulis",
    "saya akan edit",
    "saya akan perbarui",
    "saya akan perbaiki",
    "saya akan load",
    "saya akan muat",
    "saya akan simpan",
    "saya akan pasang",
    "saya akan instal",
    "saya akan unduh",
    "saya akan unggah",
    "saya akan sinkron",
    "saya akan daftar",
    "saya akan aktifkan",
    "saya akan nonaktifkan",
    "saya akan selidiki",
    "saya akan jelajahi",
    "saya akan cari",
    "saya akan temukan",
    "saya akan kumpulkan",
    "saya akan ambil",
    "saya akan kueri",
    "saya akan pindai",
    "saya akan lacak",
    "saya akan ikuti",
    "saya akan bangun",
    "saya akan kompilasi",
    "saya akan deploy",
    "saya akan terapkan",
    "saya akan konfigurasi",
    "saya akan bersihkan",
    "saya akan refaktor",
    "saya akan atur ulang",
    "saya akan rapikan",
    "saya akan mulai ulang",
    "saya akan uji",
    "saya akan gabung",
    "saya akan dokumentasikan",
    "saya akan petakan",
    "saya akan rencanakan",
    "saya akan sambungkan",
    "saya akan kembalikan",
    "saya akan sesuaikan",
    "saya akan pindahkan",
    "saya akan ganti nama",
    "saya akan migrasi",
    "gue mau cek",
    "gue mau periksa",
    "gue mau tinjau",
    "gue mau validasi",
    "gue mau verifikasi",
    "gue mau lihat",
    "gue mau baca",
    "gue mau tulis",
    "gue mau edit",
    "gue mau update",
    "gue mau perbarui",
    "gue mau fix",
    "gue mau perbaiki",
    "gue mau buat",
    "gue mau bikin",
    "gue mau hapus",
    "gue mau ganti",
    "gue mau tambah",
    "gue mau ubah",
    "gue mau jalankan",
    "gue mau load",
    "gue mau muat",
    "gue mau simpan",
    "gue mau pasang",
    "gue mau instal",
    "gue mau unduh",
    "gue mau unggah",
    "gue mau sinkron",
    "gue mau daftar",
    "gue mau aktifkan",
    "gue mau nonaktifkan",
    "gue mau selidiki",
    "gue mau jelajahi",
    "gue mau cari",
    "gue mau temukan",
    "gue mau kumpulkan",
    "gue mau ambil",
    "gue mau kueri",
    "gue mau pindai",
    "gue mau lacak",
    "gue mau ikuti",
    "gue mau bangun",
    "gue mau kompilasi",
    "gue mau deploy",
    "gue mau terapkan",
    "gue mau konfigurasi",
    "gue mau bersihkan",
    "gue mau refaktor",
    "gue mau atur ulang",
    "gue mau rapikan",
    "gue mau mulai ulang",
    "gue mau uji",
    "gue mau gabung",
    "gue mau dokumentasikan",
    "gue mau petakan",
    "gue mau rencanakan",
    "gue mau sambungkan",
    "gue mau kembalikan",
    "gue mau sesuaikan",
    "gue mau pindahkan",
    "gue mau ganti nama",
    "gue mau migrasi",
    "gue mau commit",
    "gue mau push",
    "aku mau cek",
    "aku mau periksa",
    "aku mau tinjau",
    "aku mau validasi",
    "aku mau verifikasi",
    "aku mau lihat",
    "aku mau baca",
    "aku mau tulis",
    "aku mau edit",
    "aku mau update",
    "aku mau perbarui",
    "aku mau fix",
    "aku mau perbaiki",
    "aku mau buat",
    "aku mau bikin",
    "aku mau hapus",
    "aku mau ganti",
    "aku mau tambah",
    "aku mau ubah",
    "aku mau jalankan",
    "aku mau load",
    "aku mau muat",
    "aku mau simpan",
    "aku mau pasang",
    "aku mau instal",
    "aku mau unduh",
    "aku mau unggah",
    "aku mau sinkron",
    "aku mau daftar",
    "aku mau aktifkan",
    "aku mau nonaktifkan",
    "aku mau selidiki",
    "aku mau jelajahi",
    "aku mau cari",
    "aku mau temukan",
    "aku mau kumpulkan",
    "aku mau ambil",
    "aku mau kueri",
    "aku mau pindai",
    "aku mau lacak",
    "saya mau cek",
    "saya mau periksa",
    "saya mau tinjau",
    "saya mau validasi",
    "saya mau verifikasi",
    "saya mau lihat",
    "saya mau baca",
    "saya mau tulis",
    "saya mau edit",
    "saya mau update",
    "saya mau perbarui",
    "saya mau fix",
    "saya mau perbaiki",
    "saya mau buat",
    "saya mau bikin",
    "saya mau hapus",
    "saya mau ganti",
    "saya mau tambah",
    "saya mau ubah",
    "saya mau jalankan",
    "saya mau load",
    "saya mau muat",
    "saya mau simpan",
    "saya mau pasang",
    "saya mau instal",
    "saya mau unduh",
    "saya mau unggah",
    "saya mau sinkron",
    "saya mau daftar",
    "saya mau aktifkan",
    "saya mau nonaktifkan",
    "saya mau selidiki",
    "saya mau jelajahi",
    "saya mau cari",
    "saya mau temukan",
    "saya mau kumpulkan",
    "saya mau ambil",
    "saya mau kueri",
    "saya mau pindai",
    "saya mau lacak",
    "biar saya tinjau",
    "biar saya validasi",
    "biar saya verifikasi",
    "biar saya tulis",
    "biar saya edit",
    "biar saya perbarui",
    "biar saya perbaiki",
    "biar saya bikin",
    "biar saya hapus",
    "biar saya ganti",
    "biar saya tambah",
    "biar saya ubah",
    "biar saya load",
    "biar saya muat",
    "biar saya simpan",
    "biar saya pasang",
    "biar saya instal",
    "biar saya unduh",
    "biar saya unggah",
    "biar saya sinkron",
    "biar saya daftar",
    "biar saya aktifkan",
    "biar saya nonaktifkan",
    "biar saya selidiki",
    "biar saya jelajahi",
    "biar saya cari",
    "biar saya temukan",
    "biar saya kumpulkan",
    "biar saya ambil",
    "biar saya kueri",
    "biar saya pindai",
    "biar saya lacak",
    "biar saya ikuti",
    "biar saya bangun",
    "biar saya kompilasi",
    "biar saya deploy",
    "biar saya terapkan",
    "biar saya konfigurasi",
    "biar saya bersihkan",
    "biar saya refaktor",
    "biar saya atur ulang",
    "biar saya rapikan",
    "biar saya mulai ulang",
    "biar saya uji",
    "biar saya gabung",
    "biar saya dokumentasikan",
    "biar saya petakan",
    "biar saya rencanakan",
    "biar saya sambungkan",
    "biar saya kembalikan",
    "biar saya sesuaikan",
    "biar saya pindahkan",
    "biar saya ganti nama",
    "biar saya migrasi",
    "mari kita tinjau",
    "mari kita validasi",
    "mari kita verifikasi",
    "mari kita tulis",
    "mari kita edit",
    "mari kita perbarui",
    "mari kita perbaiki",
    "mari kita bikin",
    "mari kita hapus",
    "mari kita ganti",
    "mari kita tambah",
    "mari kita ubah",
    "mari kita load",
    "mari kita muat",
    "mari kita simpan",
    "mari kita pasang",
    "mari kita instal",
    "mari kita unduh",
    "mari kita unggah",
    "mari kita sinkron",
    "mari kita daftar",
    "mari kita aktifkan",
    "mari kita nonaktifkan",
    "mari kita selidiki",
    "mari kita jelajahi",
    "mari kita cari",
    "mari kita temukan",
    "mari kita kumpulkan",
    "mari kita ambil",
    "mari kita kueri",
    "mari kita pindai",
    "mari kita lacak",
    "mari kita ikuti",
    "mari kita bangun",
    "mari kita kompilasi",
    "mari kita deploy",
    "mari kita terapkan",
    "mari kita konfigurasi",
    "mari kita bersihkan",
    "mari kita refaktor",
    "mari kita atur ulang",
    "mari kita rapikan",
    "mari kita mulai ulang",
    "mari kita uji",
    "mari kita gabung",
    "mari kita dokumentasikan",
    "mari kita petakan",
    "mari kita rencanakan",
    "mari kita sambungkan",
    "mari kita kembalikan",
    "mari kita sesuaikan",
    "mari kita pindahkan",
    "mari kita ganti nama",
    "mari kita migrasi",
    "mari kita commit",
    "mari kita push",
    "saya perlu tinjau",
    "saya perlu validasi",
    "saya perlu verifikasi",
    "saya perlu tulis",
    "saya perlu edit",
    "saya perlu perbarui",
    "saya perlu perbaiki",
    "saya perlu bikin",
    "saya perlu hapus",
    "saya perlu ganti",
    "saya perlu tambah",
    "saya perlu ubah",
    "saya perlu load",
    "saya perlu muat",
    "saya perlu simpan",
    "saya perlu pasang",
    "saya perlu instal",
    "saya perlu unduh",
    "saya perlu unggah",
    "saya perlu sinkron",
    "saya perlu daftar",
    "saya perlu aktifkan",
    "saya perlu nonaktifkan",
    "saya perlu selidiki",
    "saya perlu jelajahi",
    "saya perlu cari",
    "saya perlu temukan",
    "saya perlu kumpulkan",
    "saya perlu ambil",
    "saya perlu kueri",
    "saya perlu pindai",
    "saya perlu lacak",
    "saya harus tinjau",
    "saya harus validasi",
    "saya harus verifikasi",
    "saya harus lihat",
    "saya harus baca",
    "saya harus tulis",
    "saya harus edit",
    "saya harus perbarui",
    "saya harus perbaiki",
    "saya harus bikin",
    "saya harus hapus",
    "saya harus ganti",
    "saya harus tambah",
    "saya harus ubah",
    "saya harus load",
    "saya harus muat",
    "saya harus simpan",
    "saya harus pasang",
    "saya harus instal",
    "saya harus unduh",
    "saya harus unggah",
    "saya harus sinkron",
    "saya harus daftar",
    "saya harus aktifkan",
    "saya harus nonaktifkan",
    "saya harus selidiki",
    "saya harus jelajahi",
    "saya harus cari",
    "saya harus temukan",
    "saya harus kumpulkan",
    "saya harus ambil",
    "saya harus kueri",
    "saya harus pindai",
    "saya harus lacak",
    "coba saya cek",
    "coba saya periksa",
    "coba saya tinjau",
    "coba saya validasi",
    "coba saya verifikasi",
    "coba saya lihat",
    "coba saya baca",
    "coba saya tulis",
    "coba saya edit",
    "coba saya update",
    "coba saya perbarui",
    "coba saya fix",
    "coba saya perbaiki",
    "coba saya buat",
    "coba saya bikin",
    "coba saya hapus",
    "coba saya ganti",
    "coba saya tambah",
    "coba saya ubah",
    "coba saya jalankan",
    "coba saya load",
    "coba saya muat",
    "coba saya simpan",
    "coba saya pasang",
    "coba saya instal",
    "coba saya unduh",
    "coba saya unggah",
    "coba saya sinkron",
    "coba saya daftar",
    "coba saya aktifkan",
    "coba saya nonaktifkan",
    "coba saya selidiki",
    "coba saya jelajahi",
    "coba saya cari",
    "coba saya temukan",
    "coba saya kumpulkan",
    "coba saya ambil",
    "coba saya kueri",
    "coba saya pindai",
    "coba saya lacak",
    "sekarang cek",
    "sekarang periksa",
    "sekarang tinjau",
    "sekarang validasi",
    "sekarang verifikasi",
    "sekarang lihat",
    "sekarang baca",
    "sekarang tulis",
    "sekarang edit",
    "sekarang update",
    "sekarang perbarui",
    "sekarang fix",
    "sekarang perbaiki",
    "sekarang buat",
    "sekarang bikin",
    "sekarang hapus",
    "sekarang ganti",
    "sekarang tambah",
    "sekarang ubah",
    "sekarang jalankan",
    "sekarang load",
    "sekarang muat",
    "sekarang simpan",
    "sekarang pasang",
    "sekarang instal",
    "sekarang unduh",
    "sekarang unggah",
    "sekarang sinkron",
    "sekarang daftar",
    "sekarang aktifkan",
    "sekarang nonaktifkan",
    "sekarang selidiki",
    "sekarang jelajahi",
    "sekarang cari",
    "sekarang temukan",
    "sekarang kumpulkan",
    "sekarang ambil",
    "sekarang kueri",
    "sekarang pindai",
    "sekarang lacak",
]

action_verbs = [
    # Local playback / launching an artifact (see en.toml).
    "memutar",
    "diputar",
    "membuka file",
    "menjalankan file",
    "dimuat",
    "dijalankan",
    "diperbarui",
    "diperbaiki",
    "dibuat",
    "dihapus",
    "diganti",
    "ditambah",
    "diubah",
    "dikirim",
    "di-commit",
    "di-push",
    "di-deploy",
    "di-merge",
    "di-install",
    "diunduh",
    "diunggah",
    "disimpan",
    "diselesaikan",
    # Issue-tracker and review actions (see en.toml for the case that
    # exposed the gap).
    "ditutup",
    "dibuka",
    "dikomentari",
    "ditugaskan",
    "dilabeli",
    # Self-update and lifecycle. A fabricated "Evolved from X to Y" with zero
    # tool calls told the user their binary had replaced itself when it had
    # not, leaving them to report bugs against a version they were not running.
    "di-upgrade",
    "di-restart",
    "dibangun ulang",
    "diinstal ulang",
    # Claimed INVESTIGATION, not side effects. A zero-tool turn opening
    # "Verified just now, real output:" produced a fabricated file dump with
    # invented line numbers. Fabricated evidence is worse than a fabricated
    # action: a fake push dies to one git log, a fake dump gets built on.
    # Deliberately excludes read/checked/found/ran — all legitimate in
    # ordinary conversation about context the model already has.
    "diverifikasi",
    "diaudit",
    "diperiksa",
]

completion_claims = [
    "sudah diperbarui",
    "sudah diperbaiki",
    "sudah dibuat",
    "sudah dihapus",
    "sudah diganti",
    "sudah ditambah",
    "sudah diubah",
    "sudah dikirim",
    "sudah di-commit",
    "sudah di-push",
    "sudah di-deploy",
    "sudah selesai",
    "sudah selesai semua",
    "semua sudah diperbarui",
    "semua sudah diperbaiki",
    "file sudah diperbarui",
    "kode sudah diperbaiki",
    "perubahan sudah diterapkan",
    "saya sudah memperbarui",
    "saya sudah memperbaiki",
    "saya sudah membuat",
    "saya sudah menghapus",
    "saya sudah commit",
    "saya sudah push",
    "pekerjaan sudah selesai dan tercatat",
    "sudah dikirim dan tercatat",

    # Parity with en.toml (#2225): the same claim families English lists,
    # phrased the way an Indonesian developer writes them.
    "berikut yang berubah",
    "ini yang saya ubah",
    "ini perubahannya",
    "ini yang saya lakukan",
    "saya sudah memperbarui file",
    "saya sudah memperbarui kode",
    "file sudah diubah",
    "kode sudah diubah",
    "bug sudah diperbaiki",
    "error sudah diperbaiki",
    "file sudah dibuat",
    "file sudah ditulis",
    "semua file sudah diperbarui",
    "perubahan sudah masuk",
    "file sekarang berisi",
    "file sudah tersimpan",
    "perubahan tersimpan",
    "commit sudah dibuat",
    "versi sudah dinaikkan",
    "pekerjaan sudah dikirim",
    "sudah saya perbarui",
    "sudah saya perbaiki",
    "sudah saya buat",
    "sudah saya tulis",
    "sudah saya simpan",
    "sudah saya ubah",
    "sudah saya hapus",
    "sudah saya jalankan",
    "sudah saya uji",
    "sudah saya commit",
    "sudah saya push",
    "sudah saya deploy",
    "sudah saya pasang",
    "sudah saya konfigurasi",
    "sudah beres",
    "sudah kelar",
    "semua sudah beres",
    "sudah selesai dikerjakan",
]

# Regex patterns — Indonesian uses Latin script, so patterns mirror en.toml
# structure but with Indonesian intent phrases.

line_start_re = "(?im)^[\\s\\-*•>]*(?:(?:ok|oke|baik|siap|okeh)\\s*,?\\s+)?(?:sekarang\\s+)?(?:biar\\s+(?:gue|aku|saya)|gue|aku|saya\\s+akan|saya\\s+perlu|saya\\s+harus|mari\\s+kita|coba\\s+(?:gue|aku|saya))\\s+\\w"

work_announcement_re = "(?i)^[\\s\\-*•>]*(?:(?:(?:dan\\s+)?lalu|(?:dan\\s+)?kemudian|setelah\\s+itu|terus|dan)[,]?\\s+)?(?:(?:ok|oke|baik|siap|okeh)[,.!:]?\\s+)?(?:sekarang\\s+|biar\\s+(?:gue|aku|saya)\\s+)?(?:sedang\\s+)?(?:menjalankan|mengecek|memeriksa|membaca|membuat|memperbarui|memperbaiki|menghapus|mengganti|menambah|mengubah|mengirim|meng-commit|meng-push|meng-deploy|meng-install|mengunduh|mengunggah|menyimpan|menyelesaikan|menganalisis|menginvestigasi|mengumpulkan|mengambil|mengunduh)\\b[^.!?:\\n]{0,60}?(?:\\s+(?:sekarang|saat\\s+ini)(?:[.!…,:]+|\\s*(?:\\n|$))|\\.{3}|…|:\\s*(?:\\n|$))"
# Gerund-led plan announcement carrying NO imminence marker — "Setting up the
# plan, then mapping every call site before touching anything." Two reasons
# the patterns above cannot see it (#1261): the verb is a PREPARATION verb
# (mapping, planning, drafting, listing) that work_announcement_re never
# enumerated, and the clause is sequenced with then / before instead of ending
# in now / … / :, which that pattern requires and gerund_re expects at the
# front. Scanned by the zero-tool gate only: once a tool has run, the same
# shape can be a legitimate recap ("Updating the config fixed it, then the
# build passed").
plan_announcement_re = "(?im)^[\\s\\-*•>]*(?:(?:ok|oke|baik)[,.!:]?\\s+)?(?:saya\\s+|sedang\\s+|pertama\\s+|sekarang\\s+)?(?:menyiapkan|menyusun|memetakan|merencanakan|mempersiapkan|meninjau|mendaftar|mendokumentasikan|membuat|memperbarui|memeriksa|membaca|menjalankan|menganalisis|menyelidiki)\\b[^.!?\\n]{0,120}?\\b(?:lalu|kemudian|sebelum|setelah\\s+itu)\\b"


gerund_re = "(?im)(?:^|[.!?]\\s+)\\s*(?:sekarang\\s+)?(?:sedang\\s+)?(?:menjalankan|mengecek|memeriksa|membaca|membuat|memperbarui|memperbaiki|menghapus|mengganti|menambah|mengubah|mengirim|meng-commit|meng-push|meng-deploy|meng-install|mengunduh|mengunggah|menyimpan|menyelesaikan|menganalisis|menginvestigasi|mengumpulkan|mengambil)\\b"

trailing_colon_re = "(?im)(?:^|\\n)\\s*(?:biar\\s+(?:gue|aku|saya)|saya\\s+akan|sekarang\\s+(?:biar\\s+(?:gue|aku|saya)\\s+)?|mari\\s+kita)\\s+\\w[^:\\n]{0,80}:\\s*$"

now_imperative_re = "(?m)^[\\s\\-*]*(?:sekarang\\s+(?:biar\\s+(?:gue|aku|saya)\\s+)?|biar\\s+(?:gue|aku|saya)\\s+)\\w"

numbered_steps_re = "(?m)^\\s*\\d+\\.\\s+(?:perbarui|perbaiki|buat|hapus|ganti|tambah|ubah|cek|periksa|baca|jalankan|push|commit|deploy|install)"

past_tense_standalone_re = "(?m)^[\\s\\-*]*(?:sudah\\s+)?(?:diperbarui|diperbaiki|dibuat|dihapus|diganti|ditambah|diubah|dikirim|di-commit|di-push|di-deploy|di-merge|di-install|diunduh|diunggah|disimpan|diselesaikan)[.!]"

path_re = "(?:^|[\\s`(])(?:\\./)?[a-zA-Z_][\\w\\-]*/[\\w\\-/]*\\.\\w{1,6}(?:[\\s`),:;]|$)"

ext_re = "(?:^|[\\s`(])[\\w\\-]+\\.(?:rs|py|ts|tsx|js|jsx|go|sh|toml|yaml|yml|json|md)(?:[\\s`),:;]|$)"

backtick_code_re = "`[a-zA-Z_]\\w+`"


# Halusinasi pembuatan gambar (#747)
media_delivery_phrases = [
    "ini dia",
    "sudah jadi",
    "sudah saya buat",
    "saya generate",
    "berhasil generate",
    "sudah di-generate",
    "sudah digenerate",
    "hasilnya ini",
    "sudah dibuat",
    "sudah diedit",
    "gambar sudah",
    "sudah dikirim",
]

media_context_words = [
    "gambar",
    "foto",
    "citra",
    "render",
    "latar",
    "latar belakang",
    "kecerahan",
    "eksposur",
    "kontras",
    "logo",
]

# Framings that present a named command as ALREADY RUN. The command is
# language-neutral; the claim around it is not. See #789.
executed_framings = [
    "menjalankan",
    "sudah dijalankan",
    "saya jalankan",
    "diperiksa dengan",
    "outputnya",
    "hasilnya",
    "dikonfirmasi dengan",
]

# Claims that a FILE or DOCUMENT was sent (#825). Paired with
# `file_context_words`: a claim of a delivered file in a turn that never
# invoked a document-sending tool is fabricating. Document sending is a
# newer capability than image generation, so the media checks (#747) did
# not cover it.
file_delivery_phrases = [
    "file terkirim",
    "sudah kirim file",
    "saya kirim file",
    "file dilampirkan",
    "saya lampirkan",
    "sudah dilampirkan",
    "mengunggah file",
    "dokumen terkirim",
    "saya kirim dokumen",
    "laporan terkirim",
    "laporan sudah dikirim",
    "filenya di atas",
    "lihat lampiran",
    "baru keluar dari oven",
    "ini videonya",
    "ini audionya",
    "ada di atas",
    "sudah di atas",
    "putar saja",
    "baru saja saya kirim",
    "sudah saya kirim",
]

# Words marking the claimed deliverable as a file rather than a message.
file_context_words = [
    "file",
    "dokumen",
    "laporan",
    ".md",
    "lampiran",
    "pdf",
    "csv",
    ".mp4",
    ".mp3",
    ".wav",
    ".png",
    ".jpg",
    "video",
    "audio",
    "gambar",
    "mp4",
    "mp3",
    "wav",
    "mov",
    "png",
    "jpg",
]

# Generic first-person intent: the verb is captured, not enumerated, so a
# verb missing from intent_phrases (e.g. "let me execute") is still caught.
generic_intent_re = "(?i)\\b(?:saya\\s+akan|aku\\s+akan|mari\\s+kita|biar\\s+saya)\\s+([a-z]{2,})"

# Verbs that follow that construction without promising any work.
intent_verb_exclusions = [
    "tahu",
    "jelaskan",
    "menjelaskan",
    "katakan",
    "pikir",
    "tunjukkan",
    "bagikan",
    "sebutkan",
]


# Context that turns a BARE tool name into a claim of tool usage (#1262).
# Multi-word names (`load_brain_file`) are unmistakable on their own, but
# `plan`, `bash`, `grep` and `ls` are ordinary words, so naming one proves
# nothing by itself. It proves something when the name is the OBJECT of an
# action the model attributes to itself: "Setting up the plan" in a turn that
# called no tool is a tool use that never happened. A marker must sit
# immediately before the name, optionally across one determiner, so an
# instruction addressed to the user ("run it in bash") stays untouched.
tool_use_markers = [
    "menggunakan",
    "gunakan",
    "pakai",
    "memakai",
    "menjalankan",
    "jalankan",
    "memanggil",
    "panggil",
    "membuat",
    "buat",
    "menyiapkan",
    "siapkan",
    "menyusun",
    "memperbarui",
    "perbarui",
    "membaca",
    "baca",
    "menulis",
    "tulis",
    "memeriksa",
    "periksa",
    "membuka",
    "buka",
    "memulai",
    "mulai",
    "lewat",
    "via",
]

# Nouns that mark the preceding word as a tool by name ("the plan tool").
tool_nouns = [
    "alat",
    "tool",
    "perkakas",
]

# Determiners allowed between a marker and the tool name, so "setting up THE
# plan" reads the same as "setting up plan". At most one, and only these:
# anything else between the two words means the name is not the marker's
# object. Empty for languages without articles.
tool_name_determiners = [
]

# participle_object_re DELIBERATELY ABSENT (#1694).
# Indonesian has zero copula in the present tense, so "Membacanya mudah" is a
# STATEMENT with no copula word and no closed-class head to reject — the tail
# rule that separates announcement from statement in en/pt/es has nothing to
# bite on. The construction itself is easy (membaca + -nya); the split is not.
# Every LangConfig field is #[serde(default)] and every consumer guards
# is_empty(), so an absent arm is inert rather than broken.