{"_id":"9router-manager","name":"9router-manager","dist-tags":{"beta":"0.0.1","latest":"0.0.1"},"versions":{"0.0.1":{"name":"9router-manager","version":"0.0.1","description":"9Router AI Gateway Local - Combo Model Scanner (Node.js)","license":"MIT","author":{"name":"ARIS"},"type":"module","bin":{"9router-manager":"bin/9router-manager.js"},"main":"./src/cli.js","engines":{"node":">=18.0.0"},"scripts":{"start":"node src/cli.js","test":"node --test tests/*.test.js","env:test":"node --test tests/env.test.js","cli:test":"node --test tests/cli.test.js","paths:test":"node --test tests/paths.test.js","metadata:test":"node --test tests/metadata.test.js","combo:test":"node --test tests/combo.test.js","scan:test":"node --test tests/scan.test.js","results:test":"node --test tests/results.test.js","audit-shape:test":"node --test tests/audit-shape.test.js","password:test":"node --test tests/password.test.js","lint":"node --check src/*.js bin/*.js tests/*.test.js","scan":"node src/cli.js scan","results":"node src/cli.js results","list":"node src/cli.js list","version":"node src/cli.js version","help":"node src/cli.js help","prepublishOnly":"npm run lint && npm test"},"dependencies":{"better-sqlite3":"^11.0.0","cli-progress":"^3.12.0","commander":"^12.0.0","dotenv":"^16.4.5"},"keywords":["9router","ai-gateway","model-scanner","cli","nodejs"],"repository":{"type":"git","url":"git+https://github.com/arssnndr/9router-manager.git"},"homepage":"https://github.com/arssnndr/9router-manager","bugs":{"url":"https://github.com/arssnndr/9router-manager/issues"},"gitHead":"61cb64b624dcc16c0f2d7805d1cde411367d1b05","_id":"9router-manager@0.0.1","_nodeVersion":"24.16.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-OuTLAofpTxbKwTFeTWf22F65FplKAHqklyzlvjxI2p1jCIB9cMm/2dStpYNcbJ6f2f6fCur0uy3lUPc4Ot1Otw==","shasum":"4f8414e5bf40b30b011eaeec4f3fccf60b198c02","tarball":"https://registry.npmjs.org/9router-manager/-/9router-manager-0.0.1.tgz","fileCount":19,"unpackedSize":103593,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQChLybIALOM6q8ZiSGTWhcNB01UU2ivNJTY6oXfVIsrSQIga5acCnol0xfDJn+51G9xrJviFrJED77ghRFz3OHSL7Q="}]},"_npmUser":{"name":"arssnndr","email":"arissunandar399@gmail.com"},"directories":{},"maintainers":[{"name":"arssnndr","email":"arissunandar399@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/9router-manager_0.0.1_1781259138755_0.5873408691946778"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-12T10:12:18.699Z","0.0.1":"2026-06-12T10:12:18.928Z","modified":"2026-06-12T10:12:19.130Z"},"maintainers":[{"name":"arssnndr","email":"arissunandar399@gmail.com"}],"description":"9Router AI Gateway Local - Combo Model Scanner (Node.js)","homepage":"https://github.com/arssnndr/9router-manager","keywords":["9router","ai-gateway","model-scanner","cli","nodejs"],"repository":{"type":"git","url":"git+https://github.com/arssnndr/9router-manager.git"},"author":{"name":"ARIS"},"bugs":{"url":"https://github.com/arssnndr/9router-manager/issues"},"license":"MIT","readme":"# 9Router Manager\n\nManajemen 9Router AI gateway lokal — scan model, update combo, monitor provider.\n\n**Cross-platform**: Windows, Linux, macOS supported.\n\n**Tests: 88/88 pass · Node ≥18**\n\n## Fitur\n\n- ✅ Scan semua model dari provider aktif\n- ✅ Concurrent testing (configurable, default 1 worker — raise NINEROUTER_MAX_WORKERS env var untuk scan paralel)\n- ✅ Auto-retry pada HTTP 429 (rate limit)\n- ✅ Progress bar real-time\n- ✅ Audit log untuk tracking perubahan (verify_token disanitasi, ditulis async)\n- ✅ Setup auto-scan via scheduler interaktif (confirm + auto-exec, atau print-only mode)\n\n## Struktur\n\n```\n9router-manager/\n├── bin/\n│   └── 9router-manager.js  # Executable shim\n├── src/\n│   ├── cli.js              # CLI entry + commander setup\n│   ├── env.js              # .env loader + path/token helpers\n│   ├── scan.js             # API + concurrent scan logic\n│   ├── combo.js            # SQLite combo management\n│   ├── metadata.js         # Model pattern matching + sort keys\n│   └── results.js          # Read & print audit JSON\n├── tests/\n│   ├── audit-shape.test.js\n│   ├── cli.test.js\n│   ├── combo.test.js\n│   ├── env.test.js\n│   ├── metadata.test.js\n│   ├── paths.test.js\n│   ├── results.test.js\n│   └── scan.test.js\n├── bat/                    # Windows batch scripts\n│   ├── run-scan.bat\n│   ├── check-results.bat\n│   └── setup-scheduler.bat\n├── sh/                     # Unix shell scripts\n│   ├── run-scan.sh\n│   ├── check-results.sh\n│   ├── setup-scheduler.sh\n│   └── setup-scheduler-macos.sh\n├── metadata.json           # Model patterns + release dates\n├── package.json            # Node.js package config\n├── .env                    # Konfigurasi lokal (password, path)\n└── .env.template           # Template dokumentasi\n```\n\n## Setup\n\n### 1. Konfigurasi\n\nGunakan perintah bawaan CLI untuk mengatur konfigurasi global (disimpan di `~/.9router/.env`):\n\n```bash\n9router-manager config\n```\n\nAplikasi akan meminta Anda untuk memasukkan:\n- `NINEROUTER_PASSWORD` (password dashboard 9Router)\n- `NINEROUTER_BASE_URL` (biarkan default jika menggunakan `localhost:20128`)\n\n*(Jika Anda ingin konfigurasi per-folder, Anda masih bisa meng-copy `.env.template` ke `.env` di folder tersebut).*\n\n### 2. Setup Auto-Scan (Opsional)\n\n**Cara cepat (via CLI):**\n```bash\n9router-manager setup       # Tanyakan konfirmasi, lalu jalankan script\n9router-manager setup -y    # Skip konfirmasi (untuk script/CI)\n```\n\n**Cara manual (langsung ke script):**\n```bash\n# Windows (as Administrator)\nbat\\setup-scheduler.bat\n\n# Linux (cron)\n./sh/setup-scheduler.sh\n\n# macOS (launchd)\n./sh/setup-scheduler-macos.sh\n```\n\n## Usage\n\n### CLI (Recommended)\n\nAfter installation, simply type:\n```bash\n9router-manager\n```\n\nAkan muncul menu interaktif:\n```\n╔═══════════════════════════════════════════════════╗\n║           9Router Manager v0.0.1                     ║\n╠═══════════════════════════════════════════════════╣\n║  AI Gateway Local - Model Scanner                 ║\n╚═══════════════════════════════════════════════════╝\n\n  [1] Run Model Scan\n  [2] List Combos\n  [3] Show Last Scan Results\n  [4] Test Single Model\n  [5] Setup Auto-Scan Scheduler\n  [6] Configure Settings\n  ────────────────────────────────────────────────────────────\n  [v] Version Info    [h] Show Help    [q] Quit\n\n  Pilihan (nomor/v/h/q):\n```\n\nAtau gunakan command line mode:\n```bash\n9router-manager scan                              # Run scan\n9router-manager list                              # List combos\n9router-manager list --details                    # List combos + models in each\n9router-manager results                           # Check results\n9router-manager test <model>                      # Test single model\n9router-manager setup                             # Setup scheduler (interaktif)\n9router-manager setup -y                          # Setup scheduler (skip prompt)\n9router-manager config                            # Configure global settings (interaktif)\n9router-manager version                           # Version info\n9router-manager help                              # Show help\n```\n\n### Installation\n\nInstall globally via npm (recommended for development):\n\n```bash\nnpm link\n```\n\nSetelah itu perintah `9router-manager` bisa dipanggil dari direktori manapun (entry-point dari `package.json`).\n\n### Shell Scripts (Fallback)\n\nJika CLI belum diinstall, bisa pakai shell scripts:\n\n**Linux/macOS:**\n```bash\n./sh/run-scan.sh\n./sh/check-results.sh\n./sh/setup-scheduler.sh\n```\n\n**Windows:**\n```bash\nbat\\run-scan.bat\nbat\\check-results.bat\nbat\\setup-scheduler.bat\n```\n\n### Direct Node\n\n```bash\nnode src/cli.js scan\nnode src/cli.js results\nnode src/cli.js test minimax/MiniMax-M2.7\n```\n\n### Commit\n\n```bash\ngit add .\ngit commit -m \"feat: add new feature\"\n```\n\nFormat: `type: short description`\n\n## Konfigurasi\n\n| Variable | Default | Deskripsi |\n|----------|---------|-----------|\n| `NINEROUTER_PASSWORD` | (required) | Password dashboard 9Router |\n| `NINEROUTER_BASE_URL` | `http://localhost:20128` | URL 9Router gateway |\n| `NINEROUTER_DB_PATH` | OS-specific | Path SQLite DB |\n| `NINEROUTER_AUDIT_PATH` | OS-specific | Audit log output |\n| `NINEROUTER_TIMEOUT` | `8` | Timeout per model (detik) |\n| `NINEROUTER_MAX_WORKERS` | `1` | Concurrent workers |\n| `NINEROUTER_RETRY_429_MAX` | `2` | Max retry pada rate limit |\n| `NINEROUTER_RETRY_429_DELAY` | `3.0` | Delay antar retry (detik) |\n| `NINEROUTER_SLEEP` | `0.05` | Delay antar test (detik) |\n| `NINEROUTER_PROMPT` | `1+1=?` | Prompt dikirim ke setiap model |\n| `NINEROUTER_ENV_FILE` | (unset) | Override default .env search path |\n\n## Managed Combo\n\nTarget combo **tidak dikonfigurasi** — scanner mendeteksinya otomatis dari `/v1/models` × tabel `combos` SQLite.\n\n- 0 combo cocok: scanner berhenti dengan error.\n- Tepat 1 combo cocok: combo itu yang di-update.\n- Lebih dari 1 cocok: scanner berhenti dengan error (target ambigu).\n\nManaged combo berisi semua model dari semua provider yang berhasil response saat di-test.\n\n- Menambah model baru yang mulai response\n- Menghapus model yang tidak lagi response (timeout, 400, 402, 404, 429, error)\n- Skip provider yang statusnya `active=false` di SQLite 9Router\n\n## Commit Types\n\n| Type | Usage |\n|------|-------|\n| `feat` | Fitur baru |\n| `fix` | Bug fix |\n| `docs` | Dokumentasi |\n| `style` | Formatting, typo |\n| `refactor` | Refactoring |\n| `perf` | Performa |\n| `test` | Unit test |\n| `build` | Build system |\n| `ci` | CI/CD |\n| `chore` | Config, dependency |\n| `revert` | Revert commit |\n\n## Quick Start\n\n```bash\n# 1. Install dependencies\nnpm install\n\n# 2. Setup configuration\nnode src/cli.js config\n# (You will be prompted to enter your 9Router password)\n\n# 3. Run scan\nnpm run scan\n# atau\nnode src/cli.js scan\n\n# 4. Check results\nnpm run results\n# atau\nnode src/cli.js results\n\n# 5. Run tests\nnpm test\n```\n\n## Sub-commands\n\n- `scan` — Run daily combo model scan\n- `list` — List combos in database (use `--details` to show models)\n- `results` / `check` / `status` — Show last scan results\n- `test <model>` — Test a single model\n- `setup` — Setup auto-scan scheduler (interactive; `-y` to skip prompt)\n- `config` — Configure global settings (interactive)\n- `version` — Show version info\n- `help` — Show help\n\n## Per-Phase Test Scripts\n\n```bash\nnpm run env:test         # 8 tests\nnpm run cli:test         # 6 tests\nnpm run paths:test       # 14 tests\nnpm run metadata:test    # 22 tests\nnpm run combo:test       # 9 tests\nnpm run scan:test        # 16 tests\nnpm run results:test     # 8 tests\nnpm run audit-shape:test # 10 tests\nnpm test                 # 88 tests total\n```\n\n## Key Files\n\n| File | Platform | Description |\n|------|----------|-------------|\n| `bin/9router-manager.js` | All | Executable shim (`#!/usr/bin/env node`) |\n| `src/cli.js` | All | CLI entry + commander setup + interactive menu |\n| `src/scan.js` | All | API + concurrent scan logic |\n| `src/combo.js` | All | SQLite combo management (async) |\n| `src/env.js` | All | .env loader + path helpers |\n| `src/metadata.js` | All | Model pattern matching + sort keys |\n| `src/results.js` | All | Audit JSON reader/summarizer |\n| `package.json` | All | Node.js package config |\n| `sh/run-scan.sh` | Linux/macOS | Run scan (fallback) |\n| `sh/check-results.sh` | Linux/macOS | Check results (fallback) |\n| `bat/run-scan.bat` | Windows | Run scan (fallback) |\n\n## OS-Specific Paths\n\nDefault paths untuk setiap OS (jika `NINEROUTER_DB_PATH` / `NINEROUTER_AUDIT_PATH` tidak diset):\n\n| OS | DB Path | Audit Path |\n|----|---------|------------|\n| Windows | `~/AppData/Roaming/9router/db/data.sqlite` | `%USERPROFILE%\\AppData\\Local\\hermes\\scripts\\9router_daily_combo_model_scan_last.json` |\n| Linux | `~/.9router/db/data.sqlite` (fallback: `~/.config/9router/`, `~/.local/share/9router/`, `snap`) | `~/.local/share/9router/audit/9router_daily_combo_model_scan_last.json` |\n| macOS | `~/.9router/db/data.sqlite` (fallback: `~/.config/9router/`, `~/.local/share/9router/`) | `~/Library/Logs/9router-scan.log` |\n\n## Project Status\n\n- [x] All rewrite phases complete\n- [x] 88/88 tests pass (`npm test`)\n- [x] `npm run lint` passes\n- [x] No `AIO` references in the tree\n- [x] Combo-agnostic audit file paths\n- [x] Async audit write + sanitized verify_token\n- [x] Multi-platform CI (Linux, macOS, Windows × Node 18/20/22)\n- [x] `node bin/9router-manager.js` works end-to-end\n- [x] Interactive menu with letter shortcuts (q/h/v)\n- [x] `setup` command with confirm + auto-exec + non-TTY fallback\n\n## Open Questions\n\n- **TypeScript?** Plain JS for now. Can be added later via `tsc --check` without a full rewrite.\n- **Cookie store?** In-memory `Map` (single-session scan). Browser-equivalent `tough-cookie` is overkill for a one-shot CLI run.\n- **Concurrency model?** Promise-based fan-out (capped by `NINEROUTER_MAX_WORKERS`). Watch SQLite write contention at the end of long runs.\n- **Schema for `metadata.json`?** Ported as-is. Normalize later if it pays off.\n\n## Commit\n\n```bash\ngit add .\ngit commit -m \"feat: add new feature\"\n```\n\nFormat: `type: short description`\n","readmeFilename":"README.md","_rev":"1-f7f9c45672d29f4e513ec402a240d3e3"}