รหัสหมดอายุแล้วแอปค้าง ใส่รหัสใหม่ไม่ได้
ใน Kitti รุ่น 0.1.9 พอรหัสเดิมหมดอายุ แอปจะขึ้นเตือนวนอยู่อย่างนั้น ไม่มีหน้าให้ใส่รหัสใหม่ ทำตาม 4 ขั้นนี้ ให้ AI ล้างรหัสเก่าออกจากเครื่องก่อน แล้วค่อยใส่รหัสใหม่
หน้านี้เป็นหน้าชั่วคราว
ใช้กับ Kitti 0.1.9 เท่านั้น รุ่นถัดไปแก้ปัญหานี้แล้ว กดปุ่ม ใส่รหัสใหม่ ในแอปได้เลย เมื่อทุกคนอัปเดตครบเราจะเอาหน้านี้ออก
- 1
คัดลอก prompt ด้านล่าง
กดปุ่ม คัดลอก prompt ที่มุมขวาบนของกล่อง
- 2
วางให้ Claude หรือ Codex บนเครื่องที่ค้าง
เปิด Claude (แท็บ Code) หรือ Codex บนเครื่องเดียวกับที่ติดตั้ง Kitti วาง prompt แล้วกดส่ง AI จะปิด Kitti สำรองไฟล์ แล้วล้างรหัสเก่าให้เอง
- 3
ตอบ AI ถ้ามันถาม
บางเครื่องไม่มีโปรแกรมที่ต้องใช้ AI จะถามก่อนติดตั้ง SQLite ให้กดอนุญาตได้ ถ้ามีหน้าต่างถามรหัสผ่านเครื่อง อย่าให้ AI พิมพ์แทน
- 4
เปิด Kitti แล้วใส่รหัสใหม่
เสร็จแล้วเปิด Kitti เอง จะเจอหน้าใส่รหัส พิมพ์รหัสใหม่ของคุณได้เลย
Prompt สำหรับ Claude หรือ Codex
งาน: ล้างรหัสใบอนุญาต (license) ที่หมดอายุของแอป Kitti 0.1.9 ออกจากเครื่องนี้ เพื่อให้ใส่รหัสใหม่ได้
อาการ: แอปขึ้นว่ารหัสถูกยกเลิก/หมดอายุ วนไม่จบ ไม่มีหน้าใส่รหัสใหม่ และไม่มีปุ่ม "เอารหัสออกจากเครื่องนี้"
สาเหตุ: มี 2 อย่างค้างอยู่ในเครื่อง ต้องลบทั้งคู่ ลบอย่างเดียวไม่หาย
(1) token เก่าในพวงกุญแจของระบบ
(2) สถานะ 'revoked' ในตาราง license_cache ของฐานข้อมูลแอป
ข้อมูลที่ยืนยันแล้ว ใช้ตามนี้ ห้ามเดา
- พวงกุญแจ macOS: service = com.aedowon.kitti , account = license-device-token
- Windows Credential Manager: target = license-device-token.com.aedowon.kitti
- ฐานข้อมูล macOS: ~/Library/Application Support/com.aedowon.kitti/control.sqlite3
- ฐานข้อมูล Windows: %USERPROFILE%\.kitti\com.aedowon.kitti\control.sqlite3
(ไม่ใช่ %APPDATA% · ส่วน AppData\Local\com.aedowon.kitti มีแค่ WebView/log ไม่เกี่ยว)
- license_cache มีแถวเดียว singleton_id = 1
กฎเหล็ก
- ห้ามพิมพ์ค่า token หรือรหัสใบอนุญาตออกมาในแชต/log รายงานแค่ "มี/ไม่มี"
- ลบได้เฉพาะรายการ license-device-token ห้ามแตะ openrouter-api-key, google-api-key หรือรายการอื่น
- ห้ามลบไฟล์ control.sqlite3 / -wal / -shm ห้ามลบโฟลเดอร์ข้อมูลแอป ห้ามแตะโปรเจกต์หรือไฟล์วิดีโอ
(ไฟล์นี้เก็บรายชื่อโปรเจกต์และการเชื่อม AI ไว้ แก้ได้แค่ตาราง license_cache ตารางเดียว)
- ห้ามติดตั้งโปรแกรมใด ๆ โดยไม่ถามผู้ใช้ก่อน
- ถ้ามีหน้าต่างถามรหัสผ่าน หรือผลออกมาไม่ตรงกับที่เขียนไว้ ให้หยุดแล้วรายงาน ห้ามกรอกรหัสผ่านเอง
ขั้น 0 — ดูว่าเป็นเครื่องอะไร แล้วปิด Kitti ให้สนิท
macOS: osascript -e 'quit app "kitti"'; sleep 3; pgrep -ilf kitti
Windows: Get-Process kitti* -ErrorAction SilentlyContinue | Stop-Process -Force; Start-Sleep 3; Get-Process kitti* -ErrorAction SilentlyContinue
ต้องไม่เหลือ process ของแอป kitti
ขั้น 1 — หาไฟล์ฐานข้อมูล แล้วสำรองไว้
macOS:
D="$HOME/Library/Application Support/com.aedowon.kitti"; ls -la "$D/control.sqlite3"
cp "$D/control.sqlite3" "$D/control.backup-before-license-wipe.sqlite3"
[ -f "$D/control.sqlite3-wal" ] && cp "$D/control.sqlite3-wal" "$D/control.backup-before-license-wipe.sqlite3-wal"
Windows (PowerShell):
$D = "$env:USERPROFILE\.kitti\com.aedowon.kitti"; Test-Path "$D\control.sqlite3"
Copy-Item "$D\control.sqlite3" "$D\control.backup-before-license-wipe.sqlite3"
if (Test-Path "$D\control.sqlite3-wal") { Copy-Item "$D\control.sqlite3-wal" "$D\control.backup-before-license-wipe.sqlite3-wal" }
ถ้าไม่เจอไฟล์: หยุด แล้วค้นแบบอ่านอย่างเดียว (ห้ามแก้อะไร) แล้วรายงานผลกลับ
Windows: Get-ChildItem "$env:APPDATA\com.aedowon.kitti\control.sqlite3","$env:LOCALAPPDATA\Packages\*\LocalCache\Roaming\com.aedowon.kitti\control.sqlite3" -ErrorAction SilentlyContinue
ขั้น 2 — หาเครื่องมือรัน SQL (เลือกตัวแรกที่มี)
ก) คำสั่ง sqlite3 (macOS มีติดเครื่องอยู่แล้ว)
macOS: sqlite3 "$D/control.sqlite3" "<SQL>"
Windows: sqlite3 "$D\control.sqlite3" "<SQL>"
ข) Python
macOS:
KITTI_DB="$D/control.sqlite3" KITTI_SQL="<SQL>" python3 -c "import os,sqlite3;c=sqlite3.connect(os.environ['KITTI_DB']);print(c.execute(os.environ['KITTI_SQL']).fetchall());c.commit();print('changes',c.total_changes)"
Windows (ถ้าไม่มี py ให้ใช้ python แทน):
$env:KITTI_DB = "$D\control.sqlite3"; $env:KITTI_SQL = "<SQL>"
py -c "import os,sqlite3;c=sqlite3.connect(os.environ['KITTI_DB']);print(c.execute(os.environ['KITTI_SQL']).fetchall());c.commit();print('changes',c.total_changes)"
ค) ไม่มีทั้งคู่ (มักเป็น Windows): หยุดแล้วถามผู้ใช้ว่าอนุญาตให้รัน winget install SQLite.SQLite ไหม
ถ้าอนุญาต ให้เปิด PowerShell ใหม่หลังติดตั้งเสร็จ แล้วใช้ข้อ ก)
(เปลี่ยน <SQL> เป็นคำสั่งในขั้น 3 หรือขั้น 5)
ขั้น 3 — อ่านสถานะก่อนแก้
SQL: SELECT status, last_error_code, checked_at_ms IS NOT NULL, key_hint FROM license_cache WHERE singleton_id=1;
- status = revoked และ last_error_code = EXPIRED หรือ REVOKED → ทำต่อ
- status = expired และ last_error_code = UNREACHABLE → หยุด (เครื่องต่อเซิร์ฟเวอร์ไม่ได้ ไม่ใช่รหัสหมดอายุ ให้ตรวจเน็ต/ไฟร์วอลล์/VPN ก่อน)
- status = valid หรือ grace → หยุด (รหัสยังใช้ได้)
- ค่าอื่นนอกจากนี้ → หยุดแล้วรายงาน
ขั้น 4 — ลบ token ออกจากพวงกุญแจ
macOS:
security delete-generic-password -s com.aedowon.kitti -a license-device-token >/dev/null 2>&1 && echo deleted || echo none
security find-generic-password -s com.aedowon.kitti -a license-device-token >/dev/null 2>&1 && echo STILL-THERE || echo gone
Windows:
cmdkey /list | Select-String "license-device-token"
cmdkey /delete:license-device-token.com.aedowon.kitti
# ถ้า /list แสดงชื่อเป็น "LegacyGeneric:target=license-device-token.com.aedowon.kitti" ให้ใส่ทั้งก้อนนั้นหลัง /delete:
cmdkey /list | Select-String "license-device-token" # ต้องไม่เจอแล้ว
ขั้น 5 — รีเซ็ต license_cache (คำสั่งเดียวกับที่ปุ่ม "เอารหัสออก" ในแอปใช้)
SQL: UPDATE license_cache SET status='unknown', checked_at_ms=NULL, grace_until_ms=NULL, last_error_code=NULL, key_hint=NULL, updated_at_ms=CAST(strftime('%s','now') AS INTEGER)*1000 WHERE singleton_id=1;
จากนั้นรัน SQL ของขั้น 3 ซ้ำ ต้องได้ status = unknown, ช่องที่สาม = 0, key_hint ว่าง
ขั้น 6 — ส่งต่อให้ผู้ใช้
บอกผู้ใช้ให้เปิด Kitti เอง ต้องเห็นหน้า "ใส่รหัส" แล้วผู้ใช้พิมพ์รหัสใหม่เอง ห้ามพิมพ์รหัสแทน
ถ้าเปิดแล้วยังติดหน้าเดิม: ปิดแอป แล้วรันขั้น 3 อีกครั้ง รายงานผลกลับ ห้ามแก้อะไรเพิ่ม
รายงานสุดท้ายเป็นตาราง: ขั้น | ทำอะไร | ผล (done / none / skipped / stopped-needs-user)
ห้ามมีค่า token หรือรหัสใบอนุญาตอยู่ในรายงาน