https://github.com/nlink-jp/ir-tracker
Live incident response tracker — continuous ingestion, segmented analysis, and timeline visualization for ongoing IR conversations
https://github.com/nlink-jp/ir-tracker
cli cybersecurity gemini incident-response llm python security slack timeline vertex-ai
Last synced: 3 months ago
JSON representation
Live incident response tracker — continuous ingestion, segmented analysis, and timeline visualization for ongoing IR conversations
- Host: GitHub
- URL: https://github.com/nlink-jp/ir-tracker
- Owner: nlink-jp
- License: mit
- Created: 2026-03-30T13:28:47.000Z (3 months ago)
- Default Branch: main
- Last Pushed: 2026-03-30T17:40:09.000Z (3 months ago)
- Last Synced: 2026-04-04T11:40:01.704Z (3 months ago)
- Topics: cli, cybersecurity, gemini, incident-response, llm, python, security, slack, timeline, vertex-ai
- Language: Python
- Homepage:
- Size: 438 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.ja.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# ir-tracker
進行中のインシデント対応会話を継続的にインジェスト・分析し、タイムラインで可視化するライブ IR トラッカー。
[English README is here](README.md)
## コンセプト
[ai-ir](https://github.com/nlink-jp/ai-ir) がインシデント**終了後**のポストモーテムを行うのに対し、ir-tracker は進行中のインシデントの**ライブ**状況把握を提供する。
```
[インシデント対応中] [インシデント終了後]
stail export → ir-tracker ingest stail export → aiir ingest
→ ir-tracker analyze → aiir report
→ ir-tracker status
↻ (15-30分ごとに繰り返し)
「今、何が起きている?」 「何が起きて、何を学んだか?」
```
## 機能
- **差分分析** — 新規・変更されたセグメントのみ LLM に送信
- **インシデントサマリ** — インシデント全体のエグゼクティブ概要を自動生成
- **アクティビティ密度チャート** — メッセージ量の時系列ヒートマップ
- **2カラム Web UI** — タイムライン + フローティング状況パネル、ダーク/ライトテーマ
- **メッセージドリルダウン** — セグメントクリックで元の会話を表示
- **多言語対応** — 分析は英語、翻訳オーバーレイで任意の言語(日本語等)表示
- **状況エクスポート** — Current Situation を Markdown でダウンロード(Web UI + CLI)
- **コンテキスト連鎖** — 圧縮された前セグメントコンテキストで LLM の継続性を維持
- **プロンプトインジェクション防御** — ノンス付き XML タグでユーザーメッセージをラッピング
- **セキュリティヘッダー** — CSP, X-Frame-Options, X-Content-Type-Options
## クイックスタート
```bash
# インストール
git clone https://github.com/nlink-jp/ir-tracker.git
cd ir-tracker
uv sync
# 設定
export GOOGLE_CLOUD_PROJECT="your-project-id"
gcloud auth application-default login
# インジェスト → 分析 → 表示
ir-tracker ingest export.json
ir-tracker analyze --lang ja
ir-tracker serve
# http://127.0.0.1:8080 を開く
```
## CLI
```bash
ir-tracker ingest [--channel name] # メッセージ取り込み(重複排除・自動セグメント化)
ir-tracker analyze [-v] [--lang ja] # 未分析セグメントを分析 + 翻訳
ir-tracker translate --lang ja [-v] # 翻訳のみ実行
ir-tracker status [--format json|markdown] [--lang ja] # タイムライン出力
ir-tracker situation [--lang ja] [-o file.md] # 現在の状況を Markdown 出力
ir-tracker export [--lang ja] [-o timeline.html] # 静的 HTML レポート(サーバー不要)
ir-tracker segments # セグメント一覧と状態
ir-tracker serve [--port 8080] [--host 127.0.0.1] # Web UI 起動
ir-tracker reset # 分析をクリア(メッセージは保持)
```
全コマンド共通で `--db ` により SQLite データベースパスを指定可能(デフォルト: `tracker.db`)。
## Web UI
| ページ | URL | 説明 |
|--------|-----|------|
| タイムライン | `/` | インシデントサマリ、密度チャート、セグメントタイムライン、状況パネル |
| セグメント | `/segments` | セグメント一覧と状態 |
| API: タイムライン | `/api/timeline` | JSON タイムラインデータ |
| API: 状況 | `/api/situation.md` | Markdown 状況ダウンロード |
| API: メッセージ | `/api/segments/{id}/messages` | セグメント内メッセージ(JSON) |
全ページ `?lang=ja` で翻訳オーバーレイ表示。
## 静的 HTML エクスポート
サーバー不要の自己完結型 HTML ファイルを生成。メールやファイル共有での配布に最適:
```bash
ir-tracker export -o timeline.html # 英語版
ir-tracker export --lang ja -o timeline-ja.html # 日本語版
```
両ファイルには言語切替リンクが含まれる。同じディレクトリに配置すればシームレスに切替可能。
## 設定
```bash
export GOOGLE_CLOUD_PROJECT="your-project-id" # 必須
export GOOGLE_CLOUD_LOCATION="us-central1" # 任意(デフォルト: us-central1)
export IR_TRACKER_MODEL="gemini-2.5-pro" # 任意(デフォルト: gemini-2.5-pro)
export IR_TRACKER_TZ="Asia/Tokyo" # 任意(システムから自動検出)
```
認証: `gcloud auth application-default login` またはサービスアカウントキー。
## セキュリティ
- 全データはローカル保存(SQLite ファイル)。Vertex AI API エンドポイントのみにデータ送信。
- Web UI は `127.0.0.1` のみにバインド。`--host 0.0.0.0` 使用時は警告を表示。
- Web UI に認証なし — 信頼されたネットワークでのみ使用。
- ノンス付き XML タグ(``)によるプロンプトインジェクション防御。
- セキュリティヘッダー: `Content-Security-Policy`, `X-Frame-Options: DENY`, `X-Content-Type-Options: nosniff`。
- 全 SQL クエリはパラメータ化(文字列結合なし)。
- JavaScript でのユーザーデータ表示は DOM API ベース(`innerHTML` 不使用)。
- Jinja2 自動エスケープ有効。
## アーキテクチャ
```
ir_tracker/
cli.py — CLI エントリポイント(argparse サブコマンド)
ingest.py — stail/scat エクスポート解析、ts による重複排除
segmenter.py — 時間窓 + ギャップ検出 + エントロピーベース分割
analyzer.py — Gemini 2.5 Pro セグメント分析 + インシデントサマリ
translator.py — Gemini Flash 並列翻訳(キャッシュ付き)
timeline.py — Markdown/JSON タイムライン + 状況エクスポート
export_html.py — 自己完結型静的 HTML レポート生成
storage.py — SQLite スキーマ(マイグレーション対応)
web.py — FastAPI アプリ(タイムライン、セグメント、API エンドポイント)
templates/ — Jinja2 HTML(base, timeline, segments)
static/ — CSS(ライト/ダークテーマ)
```
## 設計資料
- [アーキテクチャ](docs/design/architecture.md) — コンポーネント、データフロー、CLI、セキュリティ
- [セグメンテーション](docs/design/segmentation.md) — 時間窓 + ギャップ検出アルゴリズム
- [分析](docs/design/analysis.md) — LLM パイプライン、コンテキスト連鎖、出力スキーマ
## ai-ir との関係
| 観点 | ai-ir | ir-tracker |
|---|---|---|
| タイミング | インシデント後 | インシデント中 |
| 入力 | 1回のエクスポート | 継続的な再インジェスト |
| 分析 | 会話全体を一括 | セグメント単位・差分 |
| 出力 | 最終レポート | 成長するタイムライン |
| LLM | OpenAI 互換 | Vertex AI Gemini(1M コンテキスト) |
| ストレージ | ステートレス(ファイル) | ステートフル(SQLite) |
両ツールとも同じ stail/scat エクスポート形式を入力とする。
## cybersecurity-series の一部
ir-tracker は [cybersecurity-series](https://github.com/nlink-jp/cybersecurity-series) の一部 —
脅威インテリジェンス、インシデント対応、セキュリティ運用のための AI 活用ツール群。