Skip to content

Latest commit

 

History

History
72 lines (52 loc) · 16.1 KB

File metadata and controls

72 lines (52 loc) · 16.1 KB

Changelog

Semua perubahan penting proyek ini. Format: Keep a Changelog, versi mengikuti SemVer. Rilis publik pertama 0.1.0 (2026-07-21) — repo publik, Apache-2.0, unpackaged (bukan npm publish; G-59).

Riwayat lengkap per-sesi ada di docs/CONTEXT.md + git log; CHANGELOG ini mulai dari M5.

[Unreleased]

Changed

  • Upgrade ESLint 9→10 + @typescript-eslint 8.47→8.65. Fix npm audit 10 high (brace-expansion DoS, GHSA-mh99-v99m-4gvg). eslint 9.39.1→10.8.0, @eslint/js 9.39.1→10.0.1, @typescript-eslint/eslint-plugin+parser 8.47.0→8.65.0. 4 cast as unknown as () => unknown dihapus dari test (lint rule no-unnecessary-type-assertion baru).
  • Fix npm audit 2 high baru (terpisah dari fix eslint di atas). brace-expansion 5.0.8→5.0.9 (via eslint→minimatch, GHSA-rgw5-rvv9-x895) + nanoid 3.3.16→3.3.18 (via vitest→vite→postcss, GHSA-2v37-7h3g-55p8) — keduanya dev-only transitive, tak masuk dist/ runtime. npm audit fix, hanya package-lock.json berubah.

Fixed

  • DEFAULT_CONTEXT_WINDOW Web UI usang → persentase context >100% (I-38). src/web/transcript.ts sebelumnya menghardcode 200K sebagai penyebut context-window untuk semua model — Opus/Sonnet/Fable 5, Opus 4.6-4.8, Sonnet 4.6 sebenarnya 1M, jadi progress bar page.ts mentok merah permanen begitu penggunaan tembus 200K. Fix: peta MODEL_CONTEXT_WINDOWS (prefix raw model id → window), contextWindowSize/contextPct kini number | null — model tak dikenal (mis. transcript non-Anthropic deepseek-v4-pro/gpt-5.6-luna-pro/glm-5.2) menampilkan token count saja tanpa bar, bukan mengarang penyebut. Nol field baru ke /api/status (T-W1 utuh).
  • Output PTY nabrak/berhimpitan di Windows (I-37, G-67). Saat isi bergulir, potongan teks lama tertinggal di kiri dan terbaca seolah bagian dari baris baru; hilang saat terminal di-resize. Penyebab: ConPTY bawaan OS bukan passthrough seperti PTY POSIX — ia merender ulang ke buffer internalnya lalu memancarkan selisih, dan model layarnya meleset saat TUI ber-render-diferensial (Ink/Claude Code) berjalan di terminal yang sudah terpakai. Fix: useConptyDll: true pada pty.spawn() (Windows saja) — memakai conpty.dll tim Windows Terminal yang dibundel node-pty 1.1.0. Linux tak terpengaruh (opsi diabaikan di POSIX). Escape hatch ACCA_PTY_CONPTY_DLL=0 mengembalikan ConPTY in-box tanpa rebuild.
  • Grace window post-unlatch 5s→120s (G-37). Live-verify #hnce (25 Jul): CC TUI repaint banner limit lama @T+9s pasca-inject memicu LIMIT_HIT palsu kedua → double-trigger continue. Grace window 5s awal tidak cukup; 120s menutup kasus ini (bukti #hnce @9s) dan #z36i (16 Jul, @157s). Hook StopFailure (deteksi PRIMER) TIDAK disuppress.

Added

  • Web UI enrichment — card layout + context window CC. acca web kini menampilkan card per sesi dengan: model name, context window (token count + progress bar warna threshold), status badge, reset countdown di usage. Data context window dibaca dari transcript JSONL CC (modul baru src/web/transcript.ts, path encoding G-34). Semua derived values (bukan path/secret) — T-W1 utuh. Progress bar DOM berwarna: hijau <70%, kuning 70-90%, merah ≥90%.

[0.1.0] - 2026-07-21

Rilis publik pertama. Repo di-flip ke publik + private vulnerability reporting aktif + tag/Release v0.1.0 dari commit ber-CI-hijau f30e915 (target main). Menutup P-1. Isi rilis = seluruh entri di bawah (M1–M5 + M-web + kesiapan publik Apache-2.0/CI/SECURITY + remediasi PII G-61).

Added

  • Persiapan repo publik — berkas komunitas + metadata (demo-only posture). CONTRIBUTING.md: menyatakan repo = artefak demonstrasi solo/non-komersial yang tidak menerima PR eksternal rutin (fork & pakai-ulang Apache 2.0 dipersilakan; keamanan → SECURITY.md; tracker kerja internal = docs/ISSUES.md, bukan GitHub Issues). package.json: tambah field repository (URL git kanonik) + keywords (discoverability); bugs sengaja dikosongkan (tak ada public bug tracker — keamanan lewat PVR). Reading-guide 1-baris di header docs/CONTEXT.md & docs/ISSUES.md untuk mengarahkan pengunjung pertama ke README/PROJECT (doc-doc itu = jurnal/tracker internal padat jargon). Sapuan akhir kerahasiaan pra-flip: metadata commit author/committer diverifikasi 100% noreply (cek manual git log --all --format='%ae %ce', gate file-based tak menjangkaunya — G-61).
  • README: ## English summary + ## Metodologi doc-first — entry point berbahasa Inggris (apa itu acca, tiga constraint desain, status pra-rilis, pointer ke SECURITY/LICENSE/DECISIONS) + disclaimer non-afiliasi dengan Anthropic/Google, karena acca mengemudikan CLI milik dua vendor itu. Section metodologi menjelaskan repo ini sebagai artefak demonstrasi doc-first (ADR immutable, GOTCHAS, threat-model ter-gate, CONTEXT per sesi, .claude/skills/ sengaja publik) berikut ongkosnya yang jujur (docs > kode).
  • CI GitHub Actions lintas-OS — .github/workflows/ci.yml: npm ci + npm run check di matrix ubuntu-latest + windows-latest (Node dari .nvmrc), permissions: contents: read, concurrency cancel-in-progress. Action dipin ke SHA 40-hex (bukan tag mutable) sebagai kontrol supply-chain. Gate artefak kelas I-34: test/ci-workflow.test.ts memverifikasi pinning SHA, cakupan matrix dua-OS, npm run check terpanggil, dan least-privilege — supaya klaim lintas-OS proyek benar-benar dieksekusi, bukan sekadar diklaim di docs.
  • SECURITY.md — kanal disclosure (GitHub private vulnerability reporting; bukan issue publik), pernyataan jujur best-effort tanpa SLA, model kepercayaan (kredensial dibaca read-only, spawn CLI via PTY, state SQLite lokal, listener loopback hanya saat acca web, egress whitelist, nol telemetry, injection firewall ADR-013 + human-in-the-loop ADR-008), dan batasan yang diketahui & diterima (single-user desktop R-5/R-7, DACL named pipe Windows terbuka by design ADR-023/G-41, acca web tanpa auth by design ADR-028).
  • Lisensi repo = Apache License 2.0 (ADR-029) — LICENSE (teks kanonik apache.org verbatim, sha256 cfc7749b…, Copyright 2026 Ziffany Firdinal) + NOTICE (atribusi wajib-terdistribusi per §4(d)) + metadata package.json (license/author/homepage) + section README Lisensi & dukungan (tautan lab kampusmerah.com + author ziffany.firdinal.my.id). Menutup Pending "Lisensi repo" berumur M0. Apache 2.0 dipilih di atas MIT karena patent grant §3 + klausa merek §6 + mekanisme NOTICE; AGPL ditawarkan & ditolak owner (proyek non-komersial). Tanpa header copyright per-file; "private": true dipertahankan (melisensikan ≠ memutuskan publish npm).
  • Web UI monitor read-only (acca web, M-web.1, ADR-028) — dashboard browser lokal (http://127.0.0.1:<port>, default 4599, env ACCA_WEB_PORT) yang mirror acca status: usage bar 2 CLI, liveness daemon, tabel sesi, tail event-log, auto-refresh ~5s. Zero-dep (http bawaan), opt-in. Keamanan (THREAT-MODEL §9, T-W1..W6): bind 127.0.0.1 SAJA, GET-only (405 lain), Host-guard anti-DNS-rebinding (403), proyeksi ter-firewall yang sama dgn IPC status (nol cli_session_id/cwd/rahasia — nol jalur data baru), halaman self-contained (nol aset eksternal), render textContent (anti-XSS). Verifikasi runtime: /api/status firewalled + Host: evil.com→403 + netstat LISTENING 127.0.0.1 saja. Security-review gate M-web (T-W1..T-W6) LULUS PENUH 19 Jul → milestone M-web ditutup formal. Polish W-3 (19 Jul): kolom reset_at/updated_at di tabel sesi kini human-readable (HH:MM lokal + nama hari bila >24 jam, browser-side, nol jalur data baru).
  • acca prune — soft-archive sesi (ADR-004) — arsipkan sesi lama agar acca status tetap relevan; default sesi terminal saja (sisakan RUNNING/LIMIT_HIT), <ids> selektif (--force utk yang dipantau), --all, --dry-run. Soft (set archived_at, TAK hard-delete — row tetap di DB utk audit/retensi); reversible; audit session_archived.
  • Brand/splash + inline badge (ADR-027) — wordmark "The Loop" (a ( c∞c ) a) di acca/--help/--version/acca daemon start + inline gauge di header acca status. Gating ketat: TTY-only, hormati NO_COLOR, --no-banner, ASCII fallback (default konservatif; Windows legacy → ASCII), zero-dep (helper ANSI, bukan chalk/kleur).
  • Deploy sebagai service Linux (M5.4) — deploy/linux/acca-daemon.service (systemd --user) + scripts/install-linux.sh / scripts/uninstall-linux.sh (render placeholder → path absolut, enable --now + loginctl enable-linger; uninstall round-trip LIVE-verified). LIVE-verified di Ubuntu (systemd 255): install→active, auto-restart on-crash <30s, survive logout + reboot auto-start, same-DB dengan CLI (kontras I-33), recovery job pending pasca-reboot (AC-M5-3).
  • Backup/DR minimal (M5.1/M5.2) — engine backupDatabase (SQLite online backup API db.backup + integrity_check + prune tiered GFS-lite 24 hourly/30 daily, ADR-024); scripts/backup.js; template systemd backup + Windows Task Scheduler; dokumentasi restore. Restore LIVE-verified (M5.6): backup→marker→restore→revert terbukti + integrity_check: ok + daemon start bersih (T-L6 tutup).
  • Monitor proaktif "mendekati limit" (I-8/I-17) — loop probe usage periodik saat sesi RUNNING (usage-monitor.ts, wired di acca daemon, interval ~2mnt) → cache snapshot utk acca status + notifikasi proximity (default 90% 5-jam / 75% mingguan, meniru Claude Code). Dedup rising-edge (createProximityGate) → notif hanya saat window BARU melewati ambang, bukan tiap tick.
  • Deploy sebagai service Windows (M5.5, ADR-026) — autostart per-user via Task Scheduler trigger "At log on" (deploy/windows/acca-daemon.task.xml + scripts/install-windows.ps1 / uninstall-windows.ps1); jalan sebagai user login → acca.db & kredensial CC/agy sama (menyelesaikan I-33 by construction, bukan Windows Service/LocalSystem). Crash-recovery = watchdog repetisi (Repetition PT1M + IgnoreNew, ~65s); nol jendela konsol via conhost.exe --headless; ExecutionTimeLimit=PT0S. LIVE-verified di Win 11 (2× logout/login owner): @logon auto-start, daemon=user (bukan SYSTEM), same-DB, watchdog restart, nol tampilan terminal (G-49/G-50/G-52).
  • Gate artefak shippable lintas-OS (I-34) — test/systemd-unit.test.ts, test/shell-script.test.ts, test/ps1-encoding.test.ts, test/task-scheduler-xml.test.ts: tiap .service/.timer/.sh/.ps1/Task-Scheduler-XML divalidasi (struktur/render/encoding/---in-comment), bukan sekadar dibaca reviewer. Kelas I-34 kini tertutup untuk SEMUA artefak deploy.
  • Security pass 5-permukaan (M5.3) — data-minimize IPC status (T-L1), + suite test/security-*.test.ts (injection firewall wire-level, credential-read, egress whitelist, audit append-only). THREAT-MODEL §8.

Fixed

  • acca help regresi "too many arguments" (G-58) — slice banner memasang program.action() di root commander → acca help/subcommand di-parse sbg argumen berlebih. Fix: buildProgram() diekstrak ke src/cli/program.ts, bare-acca (splash+help) ditangani sebelum parse via process.argv. Guard regresi test/cli-dispatch.test.ts (exitOverride).
  • Auto-resume sesi "limit lalu exit bersih" (D-1/RD-1 Opsi A, audit keempat 18 Jul) — markExited tak lagi meng-clobber LIMIT_HIT→EXITED (status hanya transisi dari RUNNING; semantik = markOrphanExited). Sesi yang kena limit lalu ditutup bersih (Ctrl-C/quit) kini tetap di-resume-by-id otomatis di reset_at — regresi senyap dari interaksi guard I-35 (17 Jul) yang membuat jalur agy-exited (ADR-019) praktis tak terjangkau. +5 test (3 unit + 2 komposisi lifecycle), negative control terbukti.
  • Audit-trail probe agy sesi-hidup jujur soal kebasian (C-5/RC-5, audit ketiga) — event keputusan probe untuk sesi agy alive (usage_available_enqueue_resume/still_limited) kini menyertakan reason:'ls_snapshot_stale' (probe LS agy sesi-hidup = snapshot beku launch-time, G-35 — bukan real-time). Perilaku tak berubah (self-correcting via inject→detect); hanya audit-trail yang berhenti menyesatkan. Opsi optimistic-resume penuh (spt agy-exited) ditolak: meng-inject sesi agy live-mungkin-masih-limit = jalur belum di-live-verify.
  • Notifikasi limit asli hasil konfirmasi verify (D-2/RD-2) — latch via job verify kini menulis status_change {to:LIMIT_HIT, source:verify} → user dinotifikasi (AC-5) + audit-trail transisi konsisten di semua jalur latch. Sebelumnya satu-satunya jalur latch yang bisu.

Security

  • PII: alamat email pribadi dihapus dari metadata 25 commit (G-61) — sapuan privasi pra-publik menemukan email owner di field author+committer; audit sebelumnya melewatkannya karena hanya memindai isi file (git grep membaca blob, tak pernah header commit). Diremediasi git filter-repo --mailmap → seluruh history memakai @users.noreply.github.com; tree hash HEAD lama == baru (terbukti hanya metadata berubah, nol perubahan isi). Gate pencegah di test/ci-workflow.test.ts: nol alamat email di domain pribadi owner pada file tracked (URL situs tetap boleh — atribusi ADR-029), diverifikasi dgn negative-control. Batasnya ditulis eksplisit: metadata commit tak terjangkau gate file-based → cek manual git log --all --format='%ae'.
  • Egress allowlist dipersempit — api.telegram.org DIHAPUS (D-4/RD-4, audit keempat 18 Jul) — host tanpa konsumen produksi (M-remote ditunda tak-tentu) dibuang dari ALLOWED_HOSTS (shared/http.ts); least-privilege, preseden persis ADR-019. Dikembalikan saat slice M-remote (ADR-011) benar-benar dibangun. Test egress + NFR §Security disesuaikan.

Changed

  • engines.node: ">=24 <25" → ">=24" — batas atas memblokir install di Node 25+ tanpa alasan teknis; menjelang repo publik itu menolak calon pengguna secara sia-sia. .nvmrc (24.18.0) tetap jadi versi acuan dev + CI.
  • Build: script prepare (→ npm run build) + typescript dipindah ke dependencies — npm install polos (setelah git clone manual) kini auto-build dist/, tak perlu langkah npm run build terpisah lagi untuk pemasangan baru. Dipicu oleh kebutuhan instalasi lintas-mesin: shortcut npm install -g git+https://… diuji langsung dan tidak andal (bug npm — lifecycle prepare re-run tanpa node_modules/.bin di salah satu jalur reify → tsc: not found); metode resmi tetap git clone manual + npm install + npm link (teruji end-to-end dari clone segar). Didokumentasikan di README §"Mesin baru, belum ada clone".
  • Engine backup → SQLite online backup API (I-32) — backupDatabase kini async (db.backup), concurrency-safe by design: menghapus race wal_checkpoint+copyFileSync yang bisa hasilkan salinan half-written saat daemon menulis konkuren. Caller (scripts/backup.js) pakai top-level await.
  • Deteksi limit CC dari OUTPUT dikorroborasi snapshot usage (I-35) — sinyal source:'output' CC di-suppress bila kuota jelas longgar (≥0.85 free, snapshot ≤5mnt) → firewall ADR-013 menguat; hook StopFailure bypass. Jaring FN aktif (job kind:'verify', migrasi 0003): suppress kini menjadwalkan probe verifikasi susulan (~2,5mnt) → kuota ternyata habis (snapshot basi menutupi limit asli) = latch (mesin reset/probe normal ambil alih, tak langsung resume); kuota tersedia = FP terkonfirmasi (no-op). Dedup satu verify per-episode (hasPendingKind) — prosa multi-literal tak memicu storm probe.
  • Gate higiene: frasa kanonik pesan limit dilarang di repo di luar test/fixtures/** (test/no-canonical-limit-literals.test.ts, I-36).

Deferred

  • Windows Service via WinSW (ADR-025) — di-demote jadi opsi host non-laptop selalu-login (tetap ter-blok I-33 utk kasus itu). MVP Windows pakai autostart per-user (ADR-026, lihat Added). Pin WinSW dorman-tapi-sah bila dibuka lagi.
  • Always-on lintas-logout / at-boot-pra-login di Windows — TIDAK didukung (autostart logon-scoped, ADR-026/ADR-007, direlakan utk profil laptop). Always-on sejati = Linux systemd --user + linger.

Security

  • Runtime least-privilege (T-L7, Linux): daemon jalan sebagai user, bukan root; install pun user-scope (nol sudo).
  • Backup/restore integritas (T-L6): restore LIVE-verified; gate security-review lokal Linux bersih (T-L1..T-L8 tutup/N/A).