> For the complete documentation index, see [llms.txt](https://docs.haikaldev.my.id/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.haikaldev.my.id/riwayat/changelog.md).

# Changelog

Catatan rilis AI-Haikaru. Entri di sini menjelaskan **kenapa** sebuah perubahan dibuat, bukan cuma apa yang berubah — karena bagian "kenapa" itulah yang menyelamatkanmu saat gejalanya muncul lagi enam bulan kemudian.

{% hint style="info" %}
Halaman ini punya **RSS feed** otomatis. Versi mentahnya ada di [`CHANGELOG.md`](https://github.com/AnakTentara/AI-Haikaru/blob/main/CHANGELOG.md) di repo.
{% endhint %}

{% updates format="full" %}
{% update date="2026-08-19" tags="hosting,jaringan,perbaikan" %}

## v2.1.1 — alamat yang bisa dibaca & port yang benar-benar berubah

Versi tambal: tiga hal yang sudah bisa dipakai tapi belum pernah punya nomor rilis, plus dokumentasi yang pindah rumah.

**Alamat situs bisa dibaca manusia** (`setid` + username grup)

* `setid` mengganti **ID** workspace — bagian yang tampil di URL — sedangkan `rename` hanya mengganti nama panggilannya. Dua hal berbeda yang sebelumnya tidak bisa dibedakan: minta *"ganti ID jadi nanikoreweb"* menghasilkan rename, dan ID-nya tetap acak. Folder isi ikut dipindah atomik, dan **ID lama mati, bukan alias**.
* **Grup sekarang bisa punya username sendiri.** Sebelumnya bentuk `/site/<username>/<proyek>/` hanya menelusuri laci pribadi, jadi untuk workspace grup link bentuk itu lahir langsung 404. Nama grup dipakai kalau namanya dikosongkan — `Nanikore! 😂` → `nanikore`.
* Ruang URL-nya satu, jadi bentrok dijaga **dua arah**. ID kustom dipaksa huruf kecil — URL yang beda kapitalnya adalah dua URL.

**Port & alamat publik bisa diubah dari dashboard**

* `config.json` kini menang atas `.env` untuk port. Urutannya dulu terbalik, jadi mengubah port lewat `/config` **tidak pernah berefek**: halamannya bilang "tersimpan", bot restart, port tetap yang lama. Gagal diam-diam, persis di saat paling dibutuhkan.
* `SERVER_PORT` dari panel tetap menang mutlak — kalau boleh ditimpa, satu salah ketik membuat bot mendengarkan di port yang tidak dipetakan: dari luar tampak mati, **dan `/config` ikut tak terjangkau**. Kompromi jujurnya: panel menang, tapi dashboard **mengatakan** kolomnya dikunci.

**Versi bot dibaca dari `package.json`, bukan `config.json`**

`config.json` tidak dilacak git, jadi salinan produksi ketinggalan diam-diam tiap rilis — dan yang berbohong bukan cuma berkasnya, melainkan `.help` dan `.info` yang menyebut versi lama ke orang.

**Dokumentasi pindah ke GitBook** — 11 halaman ditulis ulang dengan blok asli GitBook. Alamat wiki lama diarahkan otomatis supaya tautan yang terlanjur tersebar tidak mati.
{% endupdate %}

{% update date="2026-08-10" tags="workspace,hosting,keamanan,media" %}

## v2.1.0 — "bikinin website" berakhir di URL

Tema versi ini satu kalimat: **"bikinin website" sekarang berakhir dengan link yang bisa dibuka siapa pun** — bukan berkas di dalam chat.

**Workspace coding per orang & per grup**

* Folder proyek betulan yang bertahan antar percakapan. Maks. 10 workspace pribadi per orang plus 10 per grup, 20 MB / 200 berkas, dibersihkan otomatis setelah 30 hari tak tersentuh — ditolak dengan kalimat saat penuh, **tidak pernah menggusur diam-diam**.
* **Bot benar-benar MENJALANKAN kodenya** lalu membaca hasilnya sendiri. Diverifikasi end-to-end: diberi kode ber-typo `.lenght` yang diam-diam menghasilkan `Total: 0`, bot membacanya, memperbaiki berkas di disk, dan menjalankan ulang sampai benar.
* Runner-nya dikurung berlapis: tanpa shell, env dibangun dari nol, permission model Node, timeout dengan pembunuhan seluruh process tree, maksimal 2 proses global. **Bash sengaja tidak ada** — di kontainer tanpa root, tidak ada cara membuatnya aman.
* Pagar path satu pintu: `path.relative` + `realpathSync` (bukan `startsWith` yang meloloskan `/ws/abcdef` untuk akar `/ws/abc`), symlink ditolak, hardlink dideteksi lewat `nlink > 1` — `os.link('/app/.env', 'catatan.txt')` dari python sudah dicoba dan tertahan.

**Hosting website statis**

* **Tayang itu opt-in.** Sebelum di-publish, `/site/<id>/` menjawab 404 yang **identik** dengan workspace yang tidak ada — bukan "ada tapi terkunci", supaya keberadaan proyek pun tidak bocor.
* Rute web memakai pagar yang sama dengan tool AI. `%2e%2e/%2e%2e/.env` lewat HTTP sungguhan diuji dan tertahan.
* Tiap respons membawa CSP `sandbox` + `nosniff` + `ACAO:*`. Konsekuensi yang disebut jujur: `localStorage` mati di situs workspace, dan persona melarang model memakainya.

**URL cantik ala GitHub Pages** — klaim username sekali, semua situs beralamat `/site/<username>/<proyek>/`. Bentuk `/site/<id>/` lama tetap hidup selamanya: link yang terlanjur tersebar tidak boleh mati.

**Port situs terpisah** (`SITE_PORT`) — domain publik dilayani app Express terpisah yang HANYA tahu situs. QR login dan `/config` tidak ikut ke domain yang link-nya justru paling sering disebar.

**Media dari chat masuk ke website** — byte biner utuh, ekstensi dikoreksi dari magic bytes. Foto WebP bernama `.png` tampil rusak di sebagian browser, dan gejalanya jauh dari penyebabnya.

**Bot bisa melihat gambar lagi** — regresi yang menimpa foto sekali-lihat, ephemeral, yang diteruskan, dan dokumen-bercaption: pembungkus pesan tidak dibuka adapter, jadi mimetype-nya terbaca `application/octet-stream` dan vision tak pernah dipanggil.
{% endupdate %}

{% update date="2026-08-09" tags="ai,grup,media,perbaikan" %}

## v2.0.0 — agent sejati, dan cara bot menyapa orang

Versi ini menaikkan angka mayor karena dua hal paling mendasar berubah: **mesin yang menjalankan bot**, dan **cara bot menyapa orang**.

**Agent sejati di atas GPT 5.6**

* Pseudo 2-pass yang lama diganti agent loop betulan. Dulu tiap tool ditangani blok `if` terpisah dan maksimal cuma 2 putaran; sekarang model sendiri yang menentukan berapa kali menelusuri.
* **Intent-detection regex dihapus total.** Itu penyebab bug *"nanya kabar malah kepanggil `.help`"* — kalimat "bantuin dong" cocok dengan regex `/help|bantuan/` padahal AI-nya sudah menjawab benar.
* Riwayat chat jadi agentic: bot memutuskan sendiri berapa pesan dan rentang waktu mana yang dibaca.

**Perbaikan mention grup yang selama ini diam-diam gagal**

* Tag ke satu orang **tidak pernah benar-benar menandai siapa pun**. Menulis `@628xxx` di teks tidak berefek; JID orangnya harus ikut dikirim, dan tidak ada satu pun jalur kirim yang melakukannya.
* *"tag semua kecuali aku"* tetap menandai orangnya, karena pengecualian membandingkan nomor telepon dengan LID — dua angka yang tidak akan pernah sama.

**Seluruh gaya teks disatukan** (`handlers/ui.js`) — pembatas dan format kartu dulu diketik ulang di 11 tempat. Kartu berjangkar di kiri dengan rel pendek: tiap ponsel punya ukuran font sendiri, jadi rel panjang yang pas di satu layar patah jadi dua baris di layar lain — dan rel yang patah terlihat jauh lebih rusak daripada rel yang memang pendek sejak awal.

**Voting — kartu pilihan asli WhatsApp**

* Suaranya **benar-benar terbaca bot**. Ini bagian yang paling mudah luput: kartu poll bisa tampil sempurna sementara bot tidak pernah tahu satu pun hasilnya, karena di Baileys 7.0.0-rc13 jalur dekripsi suara bawaannya dinonaktifkan. Kuncinya dibuat di sisi kita — kalau pustaka yang membuatnya, nilainya tidak pernah kita ketahui dan tidak ada satu suara pun yang bisa dibaca selamanya.
* Persentase dihitung terhadap jumlah **orang**, bukan jumlah klik. Kalau seri, disebut seri.

**Unduh dari tautan medsos** — yt-dlp dipasang `run.sh` lalu disegarkan tiap minggu. Yang diunduh zipapp Python-nya, bukan biner per-arsitektur: yang x86\_64 berhenti dengan "Exec format error" di kontainer ARM, dan pesan itu tidak menyebut arsitektur sama sekali. Adanya tautan di chat **tidak** dianggap permintaan mengunduh.

**Voice note yang tidak pernah sampai** — `ppt` tertulis menggantikan `ptt` di payload audio. Protobuf membuang kunci asing tanpa bunyi, jadi rekamannya terkirim sebagai lampiran tanpa durasi dan di sebagian klien tidak muncul sama sekali, sementara log tetap menulis "dikirim ulang".

**Listing, permainan grup, moderasi, stiker komposabel, edit gambar, arsip audio** — semuanya masuk di versi ini.
{% endupdate %}

{% update date="2026-07-10" tags="ai,perbaikan" %}

## v1.9.0 — uptime harian & dashboard

* **Daily uptime tracking**: penyimpanan log pindah ke format terkelompok per tanggal. Portal `/uptime` didesain ulang, menampilkan 24 baris jam × 60 bar menit (1440 segmen sehari) plus kalender untuk hari-hari sebelumnya. Perhitungan timezone Jakarta (GMT+7) dibuat absolut, independen dari server hosting.
* `.uptime` di WhatsApp men-generate grafis vertical-pill 15 menit terakhir lewat SVG & Sharp.
* **Token saving**: biografi developer dipisah dari instruksi sistem ke `data/owner_info.json`, dipanggil dinamis lewat tool `get_owner_info` — hemat token sistem per percakapan.
* **Reply context strip**: kutipan `[replying to: "..."]` disaring sebelum intent detection, menyelesaikan bug pemicuan ganda command saat me-reply pesan bot.
  {% endupdate %}

{% update date="2026-07-09" tags="ai,media" %}

## v1.8.8 — streaming & Gemini 3.1

* Indikator loading dinamis dan streaming proses berpikir secara real-time di bawah "Baca Selengkapnya", dibersihkan otomatis setelah respons selesai supaya riwayat chat tetap rapi.
* Mesin transkripsi naik ke **gemini-3.1-flash-lite**, dengan rotasi otomatis API key dan pelacakan rate-limit.
* Stiker langsung dari media pesan tanpa perlu me-reply; `--gen` untuk generate gambar lalu langsung jadi stiker dalam satu perintah berantai.
* Perintah bahasa alami tanpa prefix di grup **hanya direspons kalau bot di-mention**.
  {% endupdate %}

{% update date="2026-07-01" tags="ai" %}

## v1.8.0 — sebelum penomoran rapi

* Integrasi MinervaX (Claude 3.5 Sonnet / Opus).
* Fitur Scheduler — jadwal pengingat/reminder.
* Sistem memori jangka panjang (`update_memory`).
  {% endupdate %}
  {% endupdates %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.haikaldev.my.id/riwayat/changelog.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
