Skip to content

Changelog

PII Firewall SDK・MCP Server・REST API の更新履歴です。


Unreleased(v0.2.0 — 2026-05-01 予定)

🟡 Changed(Session 172 — app.piifirewall.com の公開部分用語整理)

  • app/index.html: meta description を一般的な表現に変更(Google 検索結果スニペットに表示される公開メタタグ)
  • app/src/Login.jsx: ログイン画面のバッジを一般的な表現に変更(認証前に誰でも閲覧可能なログイン画面)
  • ⚠️ 本変更を反映するには npm run build --workspace=@pii-firewall/app の手動デプロイが必要

🟡 Changed(Session 172 — ブログ記事の非公開化)

  • landing/blog.html: ブログ目次から該当記事カードを削除
  • landing/blog/himitsu-bunsan.html: ファイルを削除
  • landing/_redirects: Cloudflare 301 永続リダイレクト追加(/blog/himitsu-bunsan および /blog/himitsu-bunsan.html/blog

🟡 Changed(Session 172 — 準備中ページのクロールブロック実装)

  • landing/portal.html / blog.html / index-v2.html / docs.html: 準備中の 4 ページに 3 層クロールブロックを実装(HTML meta noindex,nofollow,noarchive,nosnippet,noimageindex + _headersX-Robots-Tag + landing/robots.txtDisallow)。各ページの公開準備が整い次第、internal-docs/infra/pre-production-checklist.md §H-Y の手順で段階的に解除
  • landing/robots.txt: AI 学習クローラー(GPTBot / ClaudeBot / anthropic-ai / Google-Extended / PerplexityBot / Bytespider / CCBot / Meta-ExternalAgent / Applebot-Extended 等 20 種以上)を明示的に Disallow。ワイルドカードを軽視する一部 bot にも確実にブロック適用

🟡 Changed(Session 172 — landing/index.html の用語整理)

  • landing/index.html: ランディングページの技術用語表記を「暗号技術」/ "Cryptography" に統一(13 箇所)。Privacy by Design に基づくゼロ知識型プライバシー保護というメッセージは維持

🔴 Breaking(Session 172 — Admin Phase 3-A RBAC + Supabase Auth フル移行)

  • ADMIN_SECRET 完全廃止: admin パネルおよび /admin/* proxy エンドポイント 9 種類すべてが旧 Bearer ADMIN_SECRET 認証から Supabase Auth + admin_users テーブル による RBAC に移行。デプロイ後、Railway Variables の ADMIN_SECRET は不要(手動削除推奨)
  • MFA(TOTP)必須化: admin パネルへのログインは Email OTP + TOTP MFA を強制(AAL=aal2 必須)

🟢 Added(Session 172 — Admin Phase 3-A RBAC)

  • proxy/migrations/004_admin_users.sql(新規): admin_users テーブル新規作成(email PK / role CHECK 3値 / active / created/updated 監査列 / note)+ idx_admin_users_active 部分インデックス + updated_at 自動更新トリガー + 初期 admin kmishimasl@gmail.com 登録
  • proxy/index.js: requireAdminRole(allowedRoles) ミドルウェア新規(JWT 検証 → AAL=aal2 確認 → admin_users 参照 → role 判定)。/admin/me/admin/users CRUD(GET/POST/PATCH/DELETE)新規。既存 9 endpoints(credits/grant・set-plan・credits・api-keys・api-keys/:id/revoke・alerts/:id/ack・alerts/:id/resolve・customers)を requireAdminRole(...) に書き換え。アラート ACK/Resolve の operator 識別子を実 email に差し替え(Phase 2-A の固定 'admin' を廃止)
  • admin/src/lib/supabase.js(新規): Supabase クライアント初期化 + getAccessToken / getAuthHeader / getAuthState / hasTotpFactor / signOut ヘルパー
  • admin/src/Login.jsx(新規・約 380 行): 4 状態統合ログイン画面(email → OTP → mfa_challenge → mfa_enroll)。landing/console.html の OTP + MFA 実装をロジック流用(90%)して React 化
  • admin/src/App.jsx: ADMIN_SECRET 認証完全削除。authedFetch ラッパー + refreshAuthState + can(action) RBAC ヘルパー追加。authState 5 値(loading / unauthenticated / mfa_required / mfa_enroll / authenticated / forbidden)で画面分岐。トップバーにロールバッジ(🛡️/🔧/👁️ + email)+ ログアウトボタン追加。アラート ACK/Resolve・クレジット付与・プラン設定・APIキー失効の各ボタンに RBAC ガード(disabled + tooltip)
  • admin/src/App.jsx: ポリシー設定タブに 「🛡️ Admin ユーザー管理」セクション 追加(admin role のみ・追加/role変更/active切替/削除・最終 admin 降格/削除を防止)
  • admin/src/i18n/ja.jsonen.json: 約 50 キー追加(login.email.* / login.otp.* / login.busy.* / login.error.* / mfa.challenge.* / mfa.enroll.* / mfa.error.* / auth.* / role.* / rbac.error.* / rbac.users.*

🟢 Added(Session 171 — Admin Phase 2-C CSV エクスポート)

  • admin/src/lib/csv-export.js(新規・約 90 行): toCsv(rows, columns) + downloadCsv(baseName, rows, columns) ユーティリティ。RFC 4180 準拠・UTF-8 BOM 付与(Excel 日本語直接読込対応)・配列/オブジェクトは JSON 文字列化・null/undefined は空文字化
  • admin/src/App.jsx: 6 テーブルに 📊 CSV ボタン追加(Logs / Alerts / Users / Customers / PII Analysis / Credits)。全て Phase 2-B のフィルタ状態を反映して出力
  • admin/src/App.jsx: papaparse 不採用(自前実装で 45KB → 8.7KB 増加に削減)
  • admin/src/App.jsx: ⚠️ P15 準拠 — 出力データは集計値・メタ情報・マスクトークンのみ。生 PII を含めない(そもそも DB に存在しない)
  • admin/src/App.jsx: ファイル名タイムスタンプ自動付与(例 logs_2026-05-14_1830.csv
  • admin/src/i18n/ja.jsonen.json: 36 キー追加(csv.buttoncsv.tooltipcsv.empty + 列見出し 33 種類)

🟢 Added(Session 171 — Admin Phase 2-B 期間・検索フィルタ)

  • admin/src/App.jsx: useFilter 相当の state を統合。プリセット(今日 / 7日 / 30日 / 90日 / 全期間 / カスタム)+ ネイティブ <input type="date"> 2 つ(カスタム時のみ)+ 検索ボックス。react-day-picker 等の追加パッケージ不要
  • admin/src/App.jsx: フィルタ状態を URL クエリパラメータに同期(?preset=7d&from=...&to=...&q=...)。ブックマーク・共有 URL でフィルタ再現可能
  • admin/src/App.jsx: renderFilterBar() ヘルパーを 4 タブ(Logs / Alerts / Users / Customers)で共通使用。matchedCount を上部右に常時表示
  • admin/src/App.jsx: Logs(timestamp + email/endpoint/ai_service 検索)、Alerts(created_at + alert_type/email/description 検索、status フィルタと併用)、Users(期間内 logs を持つユーザーに絞込)、Customers(lastActive + email 検索)にフィルタ適用
  • admin/src/i18n/ja.jsonen.json: 14 キー追加(filter.rangefilter.preset.*filter.from/to/search/clear/matched/emptyfilter.searchPlaceholder

🟢 Added(Session 171 — Admin Phase 2-A アラート ACK/Resolve ワークフロー)

  • proxy/migrations/003_alerts_ack_resolve.sql(新規): alerts テーブルに status / acknowledged_at / acknowledged_by / resolved_at / resolved_by / resolution_note の 6 カラム追加。CHECK 制約で 3 状態(open / acknowledged / resolved)に限定。インデックス idx_alerts_status + 部分インデックス idx_alerts_status_open 追加。後方互換: 既存行は自動的に status='open' で初期化
  • proxy/index.js: PATCH /admin/alerts/:id/ackPATCH /admin/alerts/:id/resolve の 2 エンドポイント追加。ACK 未実施でも直接 Resolve 可能(同時に acknowledged_* も自動記録・監査整合性確保)。resolution_note は 1000 文字 truncate(DoS 対策)。Bearer ADMIN_SECRET 認証
  • admin/src/App.jsx: アラートワークフロー UI 実装。状態バッジ(🔴未対応 / 🟡確認済 / 🟢解決)・状態別フィルタタブ(全て / 未対応 / 確認済 / 解決済)・ACK ボタン・Resolve モーダル(解決メモ 1000 文字制限・キーボード閉じる)・Resolve 後の対応者・時刻・メモ表示。デフォルトフィルタは「未対応」
  • admin/src/App.jsx: トップバー未対応 critical バッジ(クリックで Alerts タブの「未対応」フィルタへジャンプ)。Dashboard の「Critical Alerts」stat card も openCriticalCount に変更(「未解決」サブタイトルと整合)
  • admin/src/i18n/ja.jsonen.json: 24 キー追加(alert.status.*alert.filter.*alert.action.*alert.meta.*alert.modal.*alert.error.*alert.empty.filteredbadge.openCritical

🟡 Changed(Session 170 — Topbar 色補正フォローアップ)

  • admin/src/App.jsx: .badge-red--accent2 鮮赤から --warn アンバーに変更(Topbar の「100 critical alerts」バッジ・アラートカード内の CRITICAL バッジを統一)
  • admin/src/App.jsx: .btn-pdf(Export PDF ボタン)を --accent2 鮮赤から落ち着いたスレートブルーに変更。ダーク/ライト両モード対応

⚪ Docs(Session 170 wrap)

  • セッション 170 ハンドオフ文書・セッションレポート作成(Session/PIIFirewall_session_2026-05-14_Session170.md + Session/handoff_2026-05-14_Session170.md
  • internal-docs/project/sprint.md 更新(Session 170 ブロック追加・Session 168 を backlog 移動・次の TODO を Session 171 用に更新)
  • memory/project_progress.md 更新(admin 完成度 75%→85%)

🟢 Added(Session 170 — Admin Phase 1-B Chart.js 導入・ダークライト対応)

  • admin/: ダーク/ライトテーマ切替を実装(Topbar の ☀/🌙 ボタン・localStorage.admin_theme 永続化・prefers-color-scheme 初期判定)
  • admin/src/lib/chart-theme.js(新規): Chart.js テーマ統合(CSS 変数取得 cssVar()・パレット getChartPalette()applyChartDefaults()data-theme 属性監視で自動再描画)
  • admin/src/components/charts/(新規): LineChart / BarChart / PieChart / DonutChart 4 種のラッパーコンポーネント
  • Dashboard タブ: 日次推移 LineChart(直近 14 日・リクエスト数 / PII 検出数の 2 系列)を追加・AI サービス別利用を CSS 棒グラフから水平 BarChart に置換
  • PII Analysis タブ: 種別 BarChart(水平・danger 色・項目数に応じて自動拡張)+ カテゴリ DonutChart(5 カテゴリ・中央に総検出数)の 2 列レイアウト。PII_CATEGORY_MAP(16 種別 → 5 カテゴリ)を追加
  • Alerts タブ: 重要度別 PieChart(critical / high / info)+ 大数字サマリーカード(3 カラム・色連動)を追加
  • Users タブ: ユーザー別ランキング水平 BarChart(Top 10・リクエスト数 / PII 検出数の 2 系列)を追加
  • Logs タブ: 時間帯別 BarChart(24 時間・営業時間外を danger 色で強調表示)+ 営業時間外利用件数の大数字サマリーカードを追加。シャドー利用検知の文脈で 7:00–22:00 を営業時間内と定義
  • BarChart コンポーネント: per-bar coloring 対応(colors 配列で棒ごとにセマンティック色を指定可能・後方互換あり)
  • i18n: theme.* 3・chart.* 16・severity.* 3・alerts.summaryusers.rankingTitlelogs.*(時間帯関連 5 キー)を ja/en 両方に追加

🟢 Added / 🔵 Fixed(Session 170 — アラート i18n 構造化対応 案 A)

  • Supabase migration 002_alerts_i18n.sql(新規): alerts テーブルに description_template TEXT + description_params JSONB カラム追加(両方 nullable・後方互換)+ idx_alerts_template インデックス
  • proxy/cloud-logger.js createAlert(): description_template / description_params を受け取り Supabase に保存。レガシー description(日本語完成文)も併存させ後方互換
  • proxy/cloud-logger.js checkAlertRules(): large_payload / bypass_attempt / prompt_injection の 3 ヶ所で構造化パラメータを併送
  • proxy/index.js: payment_failed(Stripe webhook)+ injection_in_upload(ファイルアップロード)の 2 ヶ所で構造化パラメータを併送
  • admin/src/App.jsx: formatAlertDescription() / formatAlertType() ヘルパー追加。description_template 優先・なければレガシー description フォールバック・テンプレート未登録時もキー文字列直書き回避
  • admin/src/i18n/{ja,en}.json: alert.type.* 5 キー(payment_failed / injection_in_upload / large_payload / bypass_attempt / prompt_injection)+ alert.* 5 テンプレート(params 埋込)を ja/en 両方に追加
  • 既知の制限: インジェクション label 自体(制限の解除試行 等)は core/ 由来の日本語固定。params 内で「元言語のまま」格納し、admin テンプレートでは周囲文のみ翻訳(label 翻訳は将来 core/ に ENUM 導入時に対応)

🟡 Changed(Session 170 — デザインガイドライン準拠 色補正)

  • admin/src/App.jsx: --warn CSS 変数を追加(デザインガイドライン準拠 #d4956a ウォームアンバー)。ライトモードはコントラストのため #b6824a。「警告(リスク・課題)」用途を --accent2 鮮赤から --warn アンバーに変更(Critical Alerts 数値・Injections Detected 数値・営業時間外大数字・severity critical 数値・.pii-tag.danger
  • admin/src/lib/chart-theme.js: パレット warning セマンティックを --warn 由来に変更(旧 --accent3 ゴールド)。series 配列の 2 番目を accent2 から warn に変更
  • admin/ チャート使用箇所: PII 検出・PII 種別・ユーザー別 PII・時間帯外バーの color: "danger""warning" に変更(真のエラー用途のみ --accent2 を残す)

🟢 Added(Session 169 — チーム管理タブ)

  • landing/console.html: 👥 チーム管理タブを追加。Business+ はメンバー一覧・招待・削除のフル機能。Free/Starter は Business アップグレード促進画面(PLG ゲート)を表示
  • landing/console.html: ?team_accept=1 URL パラメータ検知 → POST /team/accept を自動呼び出し(招待メールリンクからの参加フロー)
  • proxy/index.js: maxMembersMap{ free:1, starter:1, business:10 } に修正(従来 { starter:5, business:50 }

🔴 Breaking / ⚪ Docs(Session 162 — P-17 RAG v2 クリーンスタート)

  • @pii-firewall/rag v0.0.0-archived: 旧実装をアーカイブ。rag/src/rag/src.history-2026-05-11/ にリネーム(git 履歴維持)。旧 API は 503 スタブを返す状態に
  • 新設計書(社内ガイドのみ): P-17 RAG Pipeline 設計 v2(portable library として P-14 / Node SDK / Python SDK / MCP の 4 コンテキスト対応)+ Core TTL env var 化設計(PIIFW_TOKEN_TTL・独立設計書)
  • 旧設計書 2 本のアーカイブ: p17-secure-rag-pipeline-design.md(旧 v0.2.1)と rag-core-integration-design.md をアーカイブ化。新基準(アーキテクチャ原則 v1.1 + 設計書ガイド v1.1)への不適合のため
  • @pii-firewall/rag の新実装は P-17 v2 設計承認後に着手予定。当面は旧 API 呼び出し時に RAG_ARCHIVED エラー(503)が返る

⚪ Docs / 🟢 Added(Session 158 — SSoT バンドルコピー同期 CI スクリプト)

  • scripts/sync-credential-patterns.js(新規): core/data/credential-patterns.json を SSoT として、Python SDK・Java SDK のバンドルコピーが同期しているか検証または書き込み。--check / --write / --ci モード対応。Session 156 同種の事故防止のため Java pom.xml の <include>credential-patterns.json</include> 登録も併せて検証
  • package.json: npm run sync:patterns / npm run sync:patterns:check を追加
  • .github/workflows/ssot-sync-check.yml(新規): PR / push 時に credential-patterns.json 変更を検知し --check --ci を自動実行・ドリフト時 fail(Java は別リポジトリのためスキップ)
  • internal-docs/design/credential-patterns-design.md: 新しい同期手順(npm run sync:patterns)を §1 に追記
  • internal-docs/design/p15-web-security-scanner-design.md: Session 158 にて全面再設計。「PII + Injection + LLMjacking 統合エンジン」位置取り・既存 4 Tier への統合・ローカル実行ベースに転換

🟢 Added(Session 157 — P15-2: LLMjacking 脅威インテリジェンスエンジン)

  • core/src/pii-detector.js loadCredentialPatterns(): クレデンシャルパターンのロード時に costEstimate / provider / tags フィールドを追加マッピング
  • core/src/pii-detector.js detectPII(): クレデンシャルパターンがマッチした候補に risk / costEstimate / provider / tags / remediation を pass-through するよう変更。通常の PII パターン(メール・電話番号等)はこれらフィールドを持たないため後方互換性を維持
  • proxy/index.js /detect エンドポイント: クレデンシャル検出結果(costEstimate または tags: ["llmjacking"] を持つ候補)に llmjacking_context を付与。threat / estimated_daily_cost / provider / tags / remediation(配列)/ reference フィールドを含む構造化コンテキストを追加
  • ZAP Groovy 側はすでに完了(Session 155 v0.2.0 で costEstimate / remediation をアラートに出力済み)

🔵 Fixed(Session 156 — Java SDK: pom.xml リソース include 漏れ修正)

  • pii-firewall-java/pii-firewall-java-core/pom.xml: <build><resources><resource><includes>credential-patterns.json を追加。Session 155 でリソースファイルを追加したが pom.xml への登録が漏れており getResourceAsStream("credential-patterns.json")null を返していた。修正後 mvn test: 89 tests, 0 Failures, 0 Errors(commit 31db33f

🟢 Added(Session 155 — P-JSON++: ZAP Groovy / Python SDK / Java SDK の SSoT 統合)

  • scanner/zap-rules/piifw-passive-scan.groovy v0.2.0: ハードコード 15 種パターンを撤廃。/zap/wrk/core/data/credential-patterns.jsonJsonSlurper で読込、19 種に拡張(Replicate / AWS STS / Docker Registry Token を新規検出)。アラートに id / provider を付与、cwe / wascId を JSON から動的取得
  • scanner/docker-compose.yml + .github/workflows/weekly-web-scan.yml: core/data//zap/wrk/core/data:ro としてマウント追加(ローカル + GHA 両対応)
  • python-sdk/pii_firewall/_local/credential-patterns.json(新規): SSoT バンドルコピー。pyproject.toml[tool.setuptools.package-data] で wheel に同梱
  • python-sdk/pii_firewall/_local/detector.py: load_credential_patterns() 関数追加(キャッシュ付き)。PATTERNS_JA / PATTERNS_EN_UNIVERSAL のハードコード api_key regex を JSON 読取の spread に置換。Python SDK の検出能力が新規 9 種に拡張
  • pii-firewall-java/pii-firewall-java-core/src/main/resources/credential-patterns.json(新規): SSoT バンドルコピー(jar に同梱)
  • RegexEngine.java: loadCredentialPatterns() メソッド追加。getResourceAsStream("/credential-patterns.json") で読込、jaPatterns / enPatterns 双方に append(クレデンシャルは言語非依存)。pii-patterns.json から API_KEY エントリを削除(ja + en)

🔴 Breaking(Session 155 — Python SDK / Java SDK の検出タイプ個別 ID 化)

  • Python SDK detect_pii() / mask_pii(): 旧 type === "api_key" を 19 種個別 ID(anthropic-api-key 等)に変更
  • Java SDK Detection.type: 旧 "API_KEY" を 19 種個別 ID(anthropic-api-key 等)に変更。hasType(hits, "API_KEY") で判定していた下流コードは要移行

🟢 Added(Session 154 — P-JSON / P-JSON+: クレデンシャルパターン Single Source of Truth)

  • core/data/credential-patterns.json(新規): 19種クレデンシャルパターンの正本データファイル。id / name / regex / risk / confidence / cwe / wascId / tags / provider / costEstimate / remediation フィールドで構成。Anthropic / OpenAI / Google AI / AWS / GitHub PAT / Stripe Live / HuggingFace / Groq / Perplexity / Replicate(既存10種)+ JWT / Google OAuth / Slack Bot / Slack User / SSH Private Key / DB接続文字列 / Basic Auth URL / AWS STS / Docker Registry Token(新規9種)
  • core/src/pii-detector.js: loadCredentialPatterns() 関数を追加。PATTERNS_JA / PATTERNS_EN_UNIVERSAL のハードコード api_key regex を JSON 読取に置換。mask_pii() / detect_pii() の検出対象が 追加で9種拡張(JWT / Google OAuth / Slack Bot/User / SSH / DB / Basic Auth / AWS STS / Docker)

🔴 Breaking(Session 154 — クレデンシャル検出タイプの個別化)

  • mask_pii() / detect_pii() の type 値: 従来は10種のクレデンシャルすべてを api_key 単一タイプで返していたが、今後はパターン個別の ID(anthropic-api-key / openai-api-key / stripe-secret-key-live / aws-access-key-id / github-pat / huggingface-token / groq-api-key / perplexity-api-key / replicate-api-key / google-ai-key 等)を返す。type === "api_key" で判定していた下流コードは個別 ID または tags フィールドでの判定に切替が必要

🟡 Changed(Session 151 — タスク C: 残ハードコード 3 箇所を JSON / 別ファイルに分離)

  • proxy/data/ai-providers.json(新規): Shadow AI 監視対象 25 サービスのデータ正本。proxy/index.jsDEFAULT_AI_SERVICES のインライン定義を分離。今後のサービス追加・カテゴリ変更は本 JSON のみで完結(コード変更不要)
  • proxy/index.js: DEFAULT_AI_SERVICESrequire("./data/ai-providers.json").services に置換。コード上の固定配列 30 行が 2 行のロード処理に縮約
  • proxy/data/ui-providers.json(新規): Developer Console UI 用プロバイダー設定(PROVIDERS / COMING_SOON)のデータ正本。OpenAI / Anthropic / Google の models / API キー取得手順 / アイコン色等を保持。COMING_SOON に DeepSeek / xAI / Together / Perplexity を追加
  • proxy/providers.js: シン・ラッパー化。データは ui-providers.json から読み込む。115 行 → 21 行
  • extension/content/monitored-sites.js(新規): Extension の添付ファイル PII スキャン対象サイトをグローバル変数 PIIFW_MONITORED_FILE_SITES で公開。content.js より先に読み込まれる
  • extension/content/content.js: FILE_INPUT_SITESmonitored-sites.jsPIIFW_MONITORED_FILE_SITES 参照に変更。未定義時の従来 3 サイトフォールバックも保持
  • extension/manifest.json: content_scripts[0].js["content/monitored-sites.js", "content/content.js"] に拡張(読み込み順保証)
  • internal-docs/design/ai-providers-coverage.md: § 5-1 ハードコード インベントリの 3 箇所すべてを ✅ 化。§ 6 追加・更新フローを JSON ベースの手順に更新

🔵 Fixed(Session 151 — NER パフォーマンステストの flaky 修正)

  • python-sdk/tests/test_local_detector_ner.py: test_performance_long_text の閾値を 500ms → 1500ms に緩和。GiNZa ja_ginza モデルの 1200字ウォーム時定常レイテンシ(実測 501-511ms)と CI 環境のばらつきを考慮し、常時 flaky 状態だった問題を解消。コア検出機能のバグではなくテスト設計(閾値設定)の問題

🟢 Added(Session 151 — Python SDK 汎用化リファクタリング: 任意プロバイダー対応)

  • python-sdk/pii_firewall/wrap.py: 新規作成。wrap_function(fn) / wrap_async_function(fn) / wrap_client(client, format) を提供。任意の str -> str 関数または LLM SDK クライアントに PII マスク・リストアを後付ラップ可能に
  • python-sdk/pii_firewall/providers/openai_compatible.py: 新規作成。OpenAICompatible(api_key=, base_url=) クラスで OpenAI 互換 API(DeepSeek / xAI Grok / Mistral / Groq / Together AI / Perplexity / Fireworks / Azure OpenAI 等)を drop-in 対応。AsyncOpenAICompatible 非同期版も提供
  • python-sdk/pii_firewall/__init__.py: 公開 API に wrap_function / wrap_async_function / wrap_client を追加
  • python-sdk/tests/test_wrap.py: 10 テスト追加(wrap_function 4・wrap_async_function 1・wrap_client OpenAI 3・wrap_client Anthropic 1・integration 1)
  • python-sdk/tests/test_providers.py: 5 テスト追加(OpenAICompatible 4・AsyncOpenAICompatible 1)
  • 後方互換性: 既存の from pii_firewall import openai / anthropic / gemini drop-in は完全に維持。新 API は併設方式

🟢 Added(Session 151 — Shadow AI レジストリ拡充: 9 サービス追加)

  • proxy/index.js: DEFAULT_AI_SERVICES に id 17-25 を追加。DeepSeek(monitoring)/ xAI Grok(monitoring)/ Azure OpenAI(approved)/ AWS Bedrock(approved)/ Vertex AI(approved)/ GitHub Copilot(monitoring)/ Cursor(monitoring)/ Notion AI(monitoring)/ DeepL Write(monitoring)。エンタープライズ標準(Azure / Bedrock / Vertex)と新興プロバイダー(DeepSeek / xAI)、コーディング系(Copilot / Cursor)、SaaS 統合系(Notion / DeepL)を網羅。ドメインマッチング限界(hostname endsWith のみ・path/regex 非対応)は社内ガイドラインの「8. 既知の技術的限界」セクションに記載

🟢 Added(Session 143 — OA-2: Outlook Add-in API キー認証・高度インジェクション検知)

  • outlook-addin/taskpane/taskpane.js / landing/outlook-addin/taskpane.js: v1.2 に更新。PROXY_URL 定数追加(https://pii-firewallproxy-production.up.railway.app)。currentApiKey / hasConsent ステート変数追加。loadSettingsFromRoaming() でアドイン起動時に roamingSettings から API キー・同意状態を復元。handleAdvancedInjectClick() を新規実装(未同意 → 同意モーダル → API キー入力 → スキャン の3ステートルーティング)。saveApiKey() / clearApiKey() / updateApiKeyUI() / maskApiKey() でキー管理 UI を実装。runAdvancedInjectionScan() がプロキシ /detect-all-injections を呼び出し、結果を #injection-list にレンダリング。callAdvancedInject() は 401(キー無効 → クリア + 再入力表示)・429(クォータ超過)・ネットワークエラーを個別ハンドリング。normalizeAdvancedResults() でプロキシレスポンスのフォーマットA({injections:[]})/ フォーマットB({results:[]})を吸収
  • outlook-addin/taskpane/taskpane.html / landing/outlook-addin/taskpane.html: #api-key-section(折りたたみ式・同意後に展開)を #read-section 内に追加。パスワード入力フィールド・保存ボタン・削除ボタン・コンソールリンクで構成。#btn-advanced-inject のハンドラを showConsentModal()handleAdvancedInjectClick() に変更。同意モーダル文言を「全プランで利用可」に更新(旧: 「Starter プラン以上が必要です」)
  • outlook-addin/taskpane/taskpane.css / landing/outlook-addin/taskpane.css: API キーセクション用スタイルを追加(.api-key-section / .api-key-header / .api-key-hint / .api-key-row / .api-key-input / .btn-api-save / .api-key-status.success / .api-key-status.error / .api-key-footer-row / .btn-api-clear / .api-key-console-link

🟢 Added(Session 142 — OA-1: Outlook Add-in 読み取りモード・受信メールインジェクション検知)

  • outlook-addin/taskpane/taskpane.js / landing/outlook-addin/taskpane.js: v1.1 に更新。読み取りモード対応を追加。Office.onReady でモード判定(typeof item.subject === 'string' で read/compose を自動判別)、Office.EventType.ItemChanged ハンドラ登録(Mailbox 1.5+・失敗時は console.warn で継続)。detectInjectionsLocally(text, lang) を新規実装(core/src/injection-detector.js の Phase 1 パターン 11グループ JA+EN をインライン展開)。normalizeForInjection() でひらがな→カタカナ・全角→半角・ゼロ幅文字除去。危険(critical)/警告(warning)の2段階レベルで検知結果を表示。roamingSettings による同意管理(OA-2 Proxy 連携の前準備)
  • outlook-addin/taskpane/taskpane.html / landing/outlook-addin/taskpane.html: v1.0 → v1.1。#mode-indicator#read-section#injection-banner#injection-results#injection-list#injection-safe#btn-advanced-inject)・#compose-section を追加。同意ダイアログ モーダルを追加
  • outlook-addin/taskpane/taskpane.css / landing/outlook-addin/taskpane.css: モードインジケータースタイル(.mode-compose / .mode-read)・インジェクション警告バナー(.injection-banner-critical / -warning / -safe)・検知リスト(.injection-item.critical / .warning)・同意モーダル(.consent-overlay / .consent-modal)・.btn-advanced を追加
  • outlook-addin/manifest.xml / landing/outlook-addin/manifest.xml: <Form xsi:type="ItemRead"> を FormSettings に追加。MessageReadCommandSurface ExtensionPoint を追加(「インジェクション検知」ボタンを読み取りモードリボンに追加)。Mailbox 要件を 1.3 → 1.5 に更新(ItemChanged 対応)

🟡 Changed(Session 142 — OA-Privacy: Outlook Add-in Privacy by Design 準拠・ローカル処理化)

  • outlook-addin/taskpane/taskpane.js / landing/outlook-addin/taskpane.js: PII 検知を Proxy /detect 送信方式からブラウザ内ローカル正規表現エンジンに変更。PROXY_URL 定数を削除。detectPIILocally(text, lang) 関数を新規実装(core/src/pii-detector.js の PATTERNS_JA 19種・PATTERNS_EN 11種をインライン展開)。メール本文テキストが外部サーバーを経由しなくなり Privacy by Design に準拠。JA/EN 両言語で全角→半角正規化・重複排除・無限ループ防止も実装

🟢 Added(Session 141 — FE-2: Tika 本実装・docker-compose.selfhosted.yml 統合)

  • proxy/docker-compose.selfhosted.yml: tika サービスを追加(apache/tika:latest-fullinternal: true ネットワーク隔離・JAVA_TOOL_OPTIONS=-Xmx1g・ヘルスチェック付き)。piifw-proxyTIKA_URL: http://tika:9998 環境変数・depends_on: tika を追加。Self-hosted Proxy 顧客は docker compose up 一発で Tika 込みの環境が起動できる
  • proxy/file-extractor.js: Tika タイムアウトを 30秒 → 120秒に延長(スキャン PDF OCR は最大2分想定)

🟢 Added(Session 140 — Apache Tika 統合・ファイル形式拡張)

  • proxy/file-extractor.js: extractWithTika() 関数を追加。Self-hosted Proxy(TIKA_URL 環境変数設定時)でスキャン PDF・画像(PNG/JPG/TIFF/BMP)・旧形式 PowerPoint(.ppt)・メールファイル(.eml/.msg)のテキスト抽出が可能になった。SaaS 版では TIKA_URL 未設定のため自動スキップ(Privacy by Design 準拠)
  • proxy/file-extractor.js: PDF 抽出でテキストが空の場合(スキャン PDF)に Tika OCR へ自動フォールバックする処理を追加
  • internal-docs/design/file-extraction-design.md: Apache Tika 統合設計書を新規作成(v1.1 PoC 完了)。アーキテクチャ・Docker Compose 設定(internal: true アウトバウンド遮断)・Privacy by Design 適合確認・PoC 実測結果(デジタル PDF <1秒 / スキャン PDF OCR 46.7秒)・OCR UX 設計方針を収録
  • internal-docs/sales/competitor-analysis.md: PII Tools 詳細調査を追加。技術スタック(Apache Tika + Tesseract)・創業者プロフィール・当社との差分比較テーブルを記録

🟡 Changed(Session 138 — index-v2.html noindex 設定追加)

  • landing/index-v2.html: 本番移行前の準備中ページのため <meta name="robots" content="noindex, nofollow"> を追加。本番移行時は必ず削除すること

🟡 Changed(Session 138 — インジェクション関連コンテンツの非公開化)

  • landing/index.html: 特許申請中のため、インジェクション攻撃検知・防御に関するすべてのテキスト・デモ・機能説明をランディングページから完全削除(nav リンク・Problem カード・Feature カード・デモタブ・SDK コード例・i18n 文字列 JA/EN 含む)
  • landing/blog.html: prompt-injection.html および indirect-injection-rag.html の記事カードを削除(3箇所)
  • landing/_redirects: solutions/injection-defenseblog/prompt-injectionblog/indirect-injection-ragpiifirewall.com へ 301 リダイレクト追加

⚪ Docs(Session 137 — P14-5 Self-hosted Proxy セットアップガイド)

  • docs/ja/api/self-hosted-proxy.md / docs/en/api/self-hosted-proxy.md: Self-hosted Proxy セットアップガイドを新規作成(JA/EN)。クイックスタート(5ステップ)・環境変数リファレンス・ストレージ設定(memory/Redis/PostgreSQL)・Docker Compose 手順・エアギャップモード・SHA256 検証・Privacy by Design データ送信説明・トークン消失リスク警告・トラブルシューティングを収録
  • docs/.vitepress/config.ts: JA/EN サイドバーの「インフラ・運用」/「Infrastructure & Operations」セクションに Self-hosted Proxy リンクを追加

🟢 Added(Session 137 — P14-4 GitHub Actions GHCR マルチアーキテクチャビルド)

  • .github/workflows/docker-ghcr.yml: Self-hosted Proxy 用 GitHub Actions ワークフローを新規作成。proxy-v* タグ push をトリガーに docker buildxlinux/amd64 + linux/arm64 の両アーキテクチャを同時ビルドし、GHCR private レジストリ(ghcr.io/kmishimaslgithub/pii-firewall/proxy)へ push。SHA256 ダイジェストを GitHub Release ノートへ自動追記(改ざん検証用)。GitHub Actions キャッシュ対応で2回目以降のビルドを高速化。workflow_dispatch による手動ビルドにも対応

🟢 Added(Session 136 — P14-3 ライセンスキー認証実装)

  • proxy/license-auth.js: Self-hosted Proxy ライセンスキー認証モジュールを新規作成。Ed25519 署名 JWT の構文チェック・有効期限・issuer 検証。公開鍵(proxy/certs/piifw_license_public.pem)が存在する場合は完全署名検証。エアギャップモード(PIIFW_LICENSE_FILE)と通常モード(PIIFW_LICENSE_KEY)の両方に対応
  • proxy/migrations/001_license_keys.sql: Supabase license_keys テーブル・license_usage テーブルの migration SQL を作成。RLS 設定・updated_at 自動更新トリガー付き
  • proxy/index.js — 起動時ライセンスチェック(PIIFW_LICENSE_KEY / PIIFW_LICENSE_FILE のいずれかが設定されている場合のみ実行。無効なら process.exit(1) で起動拒否)・/license/refresh エンドポイント(月次レポート手動トリガー)・/health にライセンス情報追加・APIコールカウントミドルウェア(Self-hosted モード時のみカウント)・月次自動レポート(30日ごと setInterval)を追加

🟢 Added(Session 135 — P14-1 Self-hosted Proxy Dockerfile)

  • proxy/Dockerfile.selfhosted: P-14 Self-hosted Proxy 配布用 Dockerfile を新規作成。マルチステージビルド(deps → production)・非 root ユーザー(node UID=1000)・linux/amd64 + linux/arm64 対応・ヘルスチェック内蔵
  • proxy/docker-compose.selfhosted.yml: 顧客向け Docker Compose ファイル。Redis / PostgreSQL オプション構成をコメントアウト形式で同梱
  • proxy/certs/.gitkeep: Ed25519 公開鍵配置用ディレクトリ(P14-7 で piifw_license_public.pem を配置)
  • .dockerignore: ビルドコンテキストから機密ファイル・フロントエンド不要ファイルを除外

⚪ Docs(Session 134 — GiNZa NER拡張オプション 開発者ドキュメント追加)

  • docs/ja/guide/limitations.md / docs/en/guide/limitations.md: 「NER拡張オプション(Python SDK)— 高精度氏名検知」セクションを追加。カタカナ・辞書外漢字氏名の検知比較表・推奨業種(医療・HR・法務・金融・行政)・インストール例・プラットフォーム制限の注意事項を記載
  • docs/ja/api/sdk.md / docs/en/api/sdk.md: 氏名検知の注意事項(:::warning)直後に Python SDK NER 拡張への案内 tip を追加
  • internal-docs/design/python-sdk-design.md: プラットフォーム別 NER 対応状況テーブルを追加(Python SDK / LangChain / Proxy / MCP / Node.js SDK / Chrome 拡張 / Java SDK の対応状況を一覧化)

🔵 Fixed(Session 130 — CORS ログノイズ修正)

  • proxy/index.js: Railway ヘルスチェック等 Origin ヘッダーなしのリクエストが毎分 [CORS] origin: undefined をログ出力していた問題を修正。origin が未定義の場合はログなしで即時許可するよう変更

🟡 Changed(Session 128 — Developer Console UI改善)

  • Developer Console(landing/console.html: TOTP 2段階認証画面にメールOTPとの違いを明示する警告ボックスを追加。「メールに届いたコードとは異なります」を黄色ボックスで強調表示し、ラベルを「認証アプリのコード(6桁)」に変更

⚪ Docs(Session 125 — プラン表大幅改定・機能追加)

  • 全4ファイルdocs/ja/api/plans.mddocs/en/api/plans.mddocs/ja/guide/plans.mddocs/en/guide/plans.md)を更新
  • APIコール上限をシンプル化(統合クレジット方式廃止): Free 300回・Starter 10,000回・Business 300,000回(旧333,333回)・Enterprise 無制限
  • detect_injectiondetect_all_injectionsdetect_sql_injection全プラン無制限に変更
  • 新規追加: detectAllInjections(SQL+プロンプト複合検知)・detectSQLInjectionlangオプション・maskMessages を機能表に追加
  • チームメンバー招待: Starter ✅→❌(1名利用)・Business ✅ を明記
  • アドオンパック: 「クレジット」→「APIコール」に表記変更
  • ガイド版(guide/plans.md): Webアプリ統合クレジット方式の記述を削除・シンプル化

⚪ Docs(Session 125 — プラン機能一覧 不整合修正)

  • docs/ja/api/plans.mddocs/en/api/plans.md: カスタムPIIルール(SDK・REST API)の Starter 利用可否を ❌→✅ に修正(2026-04-29 変更の反映漏れ)。SDK PII種類表示を Starter/Business/Enterprise 全て「24種類+カスタム」に統一。FAQ文言修正。
  • docs/ja/guide/plans.mddocs/en/guide/plans.md: カスタムPIIルール Starter ❌→✅・PII種類表示修正・チームメンバー招待 Starter ✅→❌(Starter=1名のため)・FAQ文言修正。

🔵 Fixed(Session 119 — logo-light.svg が空ファイルになる問題を修正)

  • PowerShell の regex 変数書き込み失敗により docs/public/logo-light.svginternal-docs/public/logo-light.svg が空ファイルになっていた問題を修正。動作確認済みの logo-dark.svg を読み返し、IndexOf/Substring でrect を挿入する方式に変更。

🎨 Changed(Session 119 — ロゴをライト/ダーク分離・背景色を黒ネイビーに)

  • docs・internal-docs の nav ロゴを logo-adaptive.svg から logo-light.svg / logo-dark.svg の個別ファイルに変更
  • ライトモード: 角丸ネイビー背景(#0a1929、より黒に近い色)で鳥が識別できる
  • ダークモード: 透過背景でハシビロコウが暗い背景に浮かぶデザイン
  • VitePress の logo: { light, dark } 構文を使用(<img> タグ内の SVG メディアクエリは動作が不安定なため)
  • 修正: ソース SVG のアートボード境界線 polyline を除去(角丸が四角に見える問題の原因)

🎨 Changed(Session 118 — ロゴ adaptive SVG 導入)

  • docs・internal-docs の nav ロゴを logo-adaptive.svg に変更。ライトモード→ネイビー背景、ダークモード→透過、をSVG内メディアクエリで自動切替

🎨 Changed(Session 118 — ロゴアイコン全面更新)

  • 全プロダクト(landing / app / extension / admin)のロゴを新デザイン「ハシビロシールド」に統一
  • デザイン: ハシビロコウ×シールド・角丸背景(rx=460)・ダークネイビー(#10365a)統一
  • 更新ファイル: landing/icons/ 全PNG・app/public/icons/ 全PNG・extension/icons/ 全PNG・admin/favicon.svg・favicon.ico・apple-touch-icon.png・PWAアイコン(192/512px)

🔵 Fixed(Session 115 — TOTP スタック UX バグ修正)

  • landing/console.html — TOTP チャレンジ画面(login-step3)に「← メールアドレス入力に戻る」リンクを追加。認証アプリが使えない場合でもログイン画面に戻れるよう修正。resetToLoginStep1() が Supabase セッションをサインアウトし全ステップをリセット

🟢 Added(Session 115 — P-05 Console UI Webhook タブ実装)

  • landing/console.html — Settings パネルに「🔔 Webhook」タブを追加。エンドポイント登録フォーム(URL・イベント選択・説明)、登録済みエンドポイント一覧(テスト送信・シークレット再生成・削除ボタン)、シークレットキー一度だけ全文表示+クリップボードコピー、配信履歴テーブル(日時・イベント・ステータス・試行回数・エラー)を実装。Free プランは Starter+ へのアップグレードゲートを表示

🟢 Added(Session 115 — P-05 WebhookDispatcher 実装)

  • proxy/index.jsWebhookDispatcher クラスを追加。fire-and-forget(非同期)配信・HMAC-SHA256 署名・指数バックオフリトライ(最大3回: 1s→2s→4s)・5秒タイムアウト・配信ログ記録を実装。Privacy by Design: ペイロードに生PII・masked_text・トークン値を含まない設計
  • proxy/index.js/mask エンドポイントに pii.detected Webhook 発火を追加(APIキー認証済み・Starter以上・PII検知ありの場合のみ)
  • proxy/index.js/detect-all-injections エンドポイントに injection.detected Webhook 発火を追加(オプトイン・デフォルト OFF)
  • proxy/index.js — Webhook 管理 REST API を追加: GET/POST /webhooks(一覧・登録)、PATCH/DELETE /webhooks/:id(更新・削除)、GET /webhooks/:id/logs(配信履歴)、POST /webhooks/:id/test(テスト送信)、POST /webhooks/:id/rotate-secret(シークレット再生成)
  • proxy/index.jsgenerateWebhookSignature() HMAC-SHA256 署名生成ヘルパーを追加
  • proxy/index.jsvalidateWebhookUrl() SSRF 対策 URL バリデーション(HTTPS 強制・プライベートIP禁止)を追加
  • proxy/supabase-migrations/008_webhook_endpoints.sqlwebhook_endpoints テーブル migration(Supabase 本番適用済み)
  • proxy/supabase-migrations/009_webhook_logs.sqlwebhook_logs テーブル migration(Supabase 本番適用済み)

🟢 Added(Session 113 — P-04 フレームワーク Middleware 実装)

  • python-sdk/pii_firewall/middleware/_base.py — 共通マスク処理を新規追加。_mask_body()PIIFirewall インスタンスに完全委譲する設計(_local モジュール直接依存なし)。デフォルトスキャンフィールド: messages / text / prompt / query / input
  • python-sdk/pii_firewall/middleware/fastapi.py — FastAPI / Starlette ASGI ミドルウェア(PIIFirewallMiddleware)新規追加。app.add_middleware(PIIFirewallMiddleware) の1行で全エンドポイント PII 保護。on_license_error="block" デフォルト(自律停止原則)。ASGI receive 上書きによるゼロコード統合
  • python-sdk/pii_firewall/middleware/flask.py — Flask WSGI ミドルウェア(PIIFirewallFlask)新規追加。WSGI environ["wsgi.input"] 差し替えで request.get_json() が自動マスク済みを返すゼロコード統合を実現
  • python-sdk/pii_firewall/middleware/django.py — Django ミドルウェア(PIIFirewallDjango)新規追加。request._body キャッシュ上書きで request.body / request.data(DRF)が自動マスク済みを返すゼロコード統合を実現。settings.pyPII_FIREWALL キーから設定を読み込む
  • python-sdk/pii_firewall/middleware/__init__.py — 上記3クラスをエクスポート。from pii_firewall.middleware import PIIFirewallMiddleware 等でインポート可能
  • python-sdk/pyproject.tomlfastapi / flask / django の optional-dependencies を追加
  • sdk/src/middleware.js — Express / Hono / Fastify 共通 maskBody()customPatterns / lang 引数を追加。query / input フィールドをデフォルトスキャン対象として追加
  • sdk/src/index.jsexpressMiddleware() / honoMiddleware() / fastifyPlugin()customPatterns / langmaskBody() に伝達するよう修正

🟢 Added(Session 112 — カスタムPII辞書 全SDK実装)

  • sdk/src/index.js / sdk/src/index.d.tscreateFirewall({ customDictionary }) に対応。CustomDictionaryCustomKeywordCustomPattern 型を追加。インスタンス生成時にパターンをコンパイル、mask() / maskMessages() / detect() に自動適用
  • python-sdk/_local/detector.pybuild_custom_patterns(entries) 関数を追加(JS buildCustomPatterns の Python 移植)。detect_pii()custom_patterns 引数を追加
  • python-sdk/_local/masker.pymask_pii()custom_patterns 引数を追加
  • python-sdk/client.pyPIIFirewall(custom_dictionary=...) に対応。pii-dictionary.json をそのまま渡せる設計。mask_pii() / detect_pii() に自動適用。AsyncPIIFirewall も継承
  • mcp-server/src/index.jsmask_pii / detect_pii ツールに custom_dictionary パラメータを追加。ツール呼び出し時にリアルタイムコンパイル
  • langchain-plugin/callbacks.pyPIIFirewallCallbackHandler(custom_dictionary=...) に対応
  • langchain-plugin/tools.pyget_pii_tools(custom_dictionary=...) に対応

🟡 Changed(Session 112 — カスタムPII辞書 プラン制限変更)

  • proxy/index.js — カスタムPII辞書のプラン制限を変更。キーワード数上限(旧: Starter=10件)を廃止し、全有料プランで無制限に。正規表現制限(旧: Business以上のみ)を廃止し、全有料プランで許容(Free のみ不可)。プラン差別化軸を「辞書数」→「ユーザー数(Starter=1名 / Business=チーム)」に変更

🔵 Fixed(Session 110 — proxy Webhook フロー修正・SDK Billing Phase 2 完全テスト)

  • proxy/index.jsissueSdkKey の import を ../core/src/billing への直接参照に変更(npm workspace シンボリックリンク古い問題を回避)
  • Stripe Webhook エンドポイントパスを /stripe/webhook に統一
  • scripts/sdk-billing-test-phase2.js 新規追加 — Stripe Webhook → sdk_keys 自動発行フローの回帰テストスクリプト(10/10 PASS 確認済み)

🟢 Added(Session 109 — P-03 OpenAI / Anthropic Drop-in ラッパー)

  • python-sdk/pii_firewall/openai.py — OpenAI SDK Drop-in ラッパー新規追加。from pii_firewall import openai の1行変更だけで既存コードを PII 保護。OpenAI / AsyncOpenAI クラス提供。送信前自動マスク・受信後自動リストア・ストリーミング対応(PIIFirewallStream
  • python-sdk/pii_firewall/anthropic.py — Anthropic SDK Drop-in ラッパー新規追加。from pii_firewall import anthropic の1行変更だけで既存コードを PII 保護。Anthropic / AsyncAnthropic クラス提供
  • python-sdk/pii_firewall/_wrapper/messages.py — OpenAI / Anthropic 共通の messages 配列マスク・リストア処理
  • python-sdk/pii_firewall/_wrapper/stream.pyPIIFirewallStream ストリーミングラッパー(同期・非同期対応)
  • python-sdk/pyproject.tomlopenai / anthropic / all optional-deps 追加

🔵 Fixed(Session 102 — api_usage FK 制約削除)

  • proxy/supabase-migrations/007_api_usage_drop_fk.sqlapi_usage.api_key_id の FK 制約(api_usage_api_key_id_fkey)を削除。SDK キー(sdk_keys テーブルの UUID)を api_usage に記録できるよう修正。type='proxy' / type='sdk' カラムで区別する設計を維持

🔵 Fixed(Session 102 — OTP 入力桁数修正)

  • landing/index.html, landing/index-v2.html — 認証モーダルの OTP 入力ボックスを 8 桁 → 6 桁に修正(Supabase は 6 桁 OTP を送信するため)

🟢 Added(Session 98 — リアルタイムPII検知強化・マルチサイト送信インターセプト)

  • extension/content/content.js — 入力検知の信頼性向上・Google AI 対応
    • フォーカス中入力要素を 1.5 秒ポーリングスキャン追加(startInputPolling / stopInputPolling)。input イベントが不安定なサイト(ChatGPT 新UI・Google AI 等)でもリアルタイムにPIIバッジを表示
    • keyup / compositionend / focusin イベント追加(attachListeners / attachToShadowRoot / document レベル)
    • quickLocalCheck() 追加 — 送信ボタン押下時のフォールバック即時チェック(API不要・正規表現ベース)
    • findActiveInput() 追加 — ポーリング・フォーカス履歴から現在の入力要素を特定
    • onKeyDown / onButtonClick 更新: フェーズ1(非同期検出済み→マスク)+ フェーズ2(未検出→クイックチェック→バッジ表示)の2段階インターセプト
    • SEND_BUTTON_SELECTOR 拡張: button[type="submit"] / button[jsname="c8mGvb"] / button[jsaction*="send"] 追加(Google AI 対応)

🔵 Fixed(Session 98 — ChatGPT トークン変形対応)

  • extension/content/content.js — ChatGPT がレスポンス内で [SECURED:type=name,id=xxx][SECURED=name,id=xxx] に変形する問題に対応
    • scanResponsesForTokens(): innerHTML チェックを両フォーマット対応に拡張([SECURED:type= OR [SECURED=
    • getResponseText(): テキスト判定を両フォーマット対応に拡張
    • getFirstTokenId(): regex を [SECURED(?::type=|=)...] に変更(両形式の ID 抽出)
    • normalizeSecuredTokens() 新規追加 — プロキシ送信前に変形トークンを正規形に変換([SECURED=name,id=xxx][SECURED:type=name,id=xxx]
    • applyRestoreText(): 送信前に normalizeSecuredTokens() を適用

🟢 Added(Session 98 — Extension マスキング Proxy 化 / AIレスポンス復元 / MCP 課金組み込み)

  • extension/background/background.js — 2 ハンドラ追加
    • PROXY_MASK: /mask 呼び出し(暗号技術によるトークン化。フリープラン・APIキー不要)
    • PROXY_RESTORE_TEXT: /restore-text 呼び出し(フリープラン・APIキー不要)
  • extension/content/content.js — マスキング・復元機能強化
    • applyMask() を async 化し、Proxy API /mask 経由([SECURED:type=xxx,id=yyy] トークン)に変更。フォールバックはローカルマスク
    • AIレスポンス復元機能追加: [SECURED: トークンを ChatGPT / Claude.ai / Gemini の応答エリアで検知 → 右下固定「🔓 復元する」バッジ → 復元結果パネル(コピー対応)
    • scanResponsesForTokens() / scheduleResponseScan() 追加。MutationObserver に統合
  • extension/content/content.css — 復元バッジ(#piifw-restore-badge)と復元パネル(#piifw-restore-panel)スタイル追加
  • mcp-server/src/index.js — SDK 共通課金モジュール組み込み
    • 起動時: loadKey()PIIFW_LICENSE_KEY env → ~/.piifw-license.json)+ startPolling() 開始
    • ツール実行前: billableCheck()checkQuota() + incrementCounter()(対象: mask_pii / detect_pii / detect_injection / detect_all_injections / rag_ingest / rag_resolve
    • BillingError を構造化エラーとして返却(QUOTA_REACHED / KEY_EXPIRED
    • キーなし(フリーモード)時はスキップ(プロキシ側のレートリミットで制御)

🟢 Added(Session 97 — Extension 課金対応)

  • extension/background/background.js — APIキー対応
    • Shadow AI URL検知(/shadow-ai/check): APIキー未設定時はスキップ、設定時は Authorization: Bearer ヘッダー付与
    • インジェクション検知(/detect-injection): APIキー未設定時は即 { ok: false } 返却
    • SET_API_KEY メッセージハンドラ追加(chrome.storage.sync への保存 / 削除)
    • GET_SETTINGSpiifw_api_key を追加
  • extension/popup/popup.html + popup.js — 設定タブ・APIキーUI追加
    • 「⚙️ 設定」タブ新設(APIキー入力・保存・クリア、プロキシURL変更)
    • Shadow AIタブ: APIキー未設定時にロックUI(🔒)+「APIキーを設定する」ボタン表示
    • APIキー設定済み時は Shadow AI 全機能を即解放
  • proxy/index.js — 有料エンドポイントにAPIキー必須制限を追加
    • POST /detect-injection — APIキーなしは 401 API_KEY_REQUIRED
    • POST /detect-all-injections — 同上
    • POST /shadow-ai/check — 同上

🟢 Added(Session 96 — SDK Billing Phase 4)

  • proxy/sdk-key-routes.jsPOST /sdk/key-check エンドポイント追加(SDK 日次ポーリング受信)
    • キー署名検証(KEY_EXPIRED は許容 → 新キー探索フロー)
    • 累計 call_countapi_usage テーブルに upsert(type: 'sdk'
    • Phase 3 チェーン状態を同時更新(chain_hash / prev_hash 提供時)
    • レスポンス: { status: 'active'|'new_key_available'|'expired', new_key?, quota_remaining? }
  • core/src/sdk-manager.js 新規作成 — クライアント側インメモリキー管理・日次ポーリング
    • loadKey(options) — env / ファイル / 直接指定からキーを読み込みメモリに保持
    • saveKey(keyJson, filePath) — 新キー受信時にメモリ即時切替 + ファイル永続化(再起動不要)
    • getInMemoryKey() — 現在のインメモリキーを取得
    • pollKeyCheck(options)/sdk/key-check を 1 回呼び出し・新キー自動適用
    • startPolling(options) — 起動時即時実行 + 24h 間隔ポーリング開始(プロセス終了ブロックなし)
    • stopPolling() — ポーリング停止
    • テスト: 9件(loadKey / saveKey / getInMemoryKey)
  • core/index.jssdk-manager 全関数をスプレッドエクスポート追加
  • proxy/supabase-migrations/006_api_usage_sdk.sql 新規作成 — api_usagetype カラム追加('proxy' / 'sdk' 区別)

🟢 Added(Session 96 — SDK Billing Phase 3)

  • core/src/billing.js — ハッシュチェーン改ざん検知を追加
    • computeChainHash(prevHash, count, keyId, timestamp) — SHA-256 チェーンハッシュ計算(決定論的)
    • verifyChain(record, keyId) — カウンターファイルの改ざん検知(TAMPER_DETECTED。レガシー形式は後方互換でスキップ)
    • readCounter() — Phase 3 チェーンフィールド(key_id / prev_hash / chain_hash / timestamp)を保持して返すよう拡張
    • incrementCounter(filePath, keyId) — keyId 引数追加。チェーン検証 → 新ハッシュ生成 → 保存
    • resetCounter(filePath, keyId) — keyId 引数追加。ジェネシスチェーン(prev_hash = key_id)を初期化
    • テスト: 35件(Phase 3 で +9件)
  • core/index.jscomputeChainHash / verifyChain のエクスポート追加
  • proxy/sdk-key-routes.jsPOST /sdk/verify-chain エンドポイント追加(サーバー側チェーン検証・prev_hash 照合・chain_hash 保存)
  • proxy/supabase-migrations/005_sdk_chain.sql 新規作成 — sdk_keys テーブルに last_chain_hash / last_call_count / chain_verified_at カラム追加

🟢 Added(Session 95 — SDK Billing Phase 2)

  • proxy/supabase-migrations/004_sdk_keys.sql 新規作成 — sdk_keys テーブル(署名付きキーの保管・RLS有効化)
  • proxy/index.js — Stripe Webhook に SDK キー自動発行を統合
    • checkout.session.completed: サブスクリプション購入時に SDK キーを自動発行・sdk_keys テーブルへ保存
    • invoice.payment_succeeded: 月次更新時に新しい SDK キーを自動発行・旧キーを superseded に更新
  • proxy/sdk-key-routes.jsGET /sdk/my-key エンドポイント追加(Supabase JWT 認証・コンソール向け現在キー取得)

🟢 Added(Session 95 — SDK Billing Phase 1)

  • core/src/billing.js 新規作成 — SDK 課金・使用量管理の基本停止機能モジュール
    • BillingError / BillingErrorCode(QUOTA_REACHED / KEY_EXPIRED / INVALID_KEY)
    • issueKey() / signKey() — HMAC-SHA256 署名付きキー生成(proxy/server 側)
    • verifyKey() — 署名検証 + valid_until チェック(SDK 側)
    • checkQuota() — APIコール数がクォータ上限(quota_total)に達したら自律停止
    • readCounter() / incrementCounter() / resetCounter() — ローカル API コールカウンター永続化
  • proxy/sdk-key-routes.js 新規作成 — POST /sdk/issue-key(管理者専用・署名付き SDK キー発行 API)
    • GET /sdk/key-info — HMAC 設定状態確認エンドポイント
  • core/index.jsbilling モジュールを個別・名前空間の両方でエクスポート

🟢 Added(Session 91 — JPY円建て決済対応)

  • proxy/stripe/create-checkout-session / /stripe/create-credits-checkoutcurrency パラメータ追加(jpy / usd 分岐)
  • landing/index.html — Starter・Business の日本語価格表示を ¥2,980/¥29,800・¥49,800/¥498,000 に更新
  • landing/index-v2.html — 同上(Starter・Business の日本語価格表示更新・_pendingCurrency 追加・OTP リダイレクト URL に currency パラメータ追加)
  • landing/console.html — OTP リダイレクト後 checkout および upgradeFromConsole()currency を checkout API に渡すよう対応
  • docs/ja/guide/plans.md / docs/en/guide/plans.md — 料金表に JPY 列追加(税別注記・年払い割引・クレジットアドオン表)
  • docs/ja/api/plans.md / docs/en/api/plans.md — プラン概要テーブルに JPY 列追加

🟡 Changed(Session 90 — セキュリティ対応)

  • landing/security.html — 第三者サービス欄のインフラ名を機能カテゴリ表記に変更(Railway→クラウドホスティング事業者 等)
  • docs/ja/api/seva.md / docs/en/api/seva.md — 「Supabase pgvector」→「クラウドベクターDB」に変更(インフラ名非開示ルール適用)
  • docs/ja/guide/shadow-ai.md / docs/en/guide/shadow-ai.md — 「Supabase による永続ストレージ」→「クラウドデータベースによる永続ストレージ」に変更

🟢 Added(Session 90)

  • landing/security.html情報セキュリティポリシーページ新規作成(JA/EN両対応)
    • Privacy by Design 7原則テーブル・基本方針・インシデント対応・第三者サービス・法令遵守を掲載
    • landing/index-v2.html フッター「会社」カテゴリにリンク追加(JA/EN i18n対応)

🟢 Added(Session 89)

  • proxy/index.jsブルートフォース対策: express-rate-limit v7.5.1 導入
    • グローバルリミッター: 全エンドポイント・15分300回(ボット・スクレイパー排除)
    • 認証系リミッター: POST /api-keysPOST /user-api-keys/save・15分20回(クレデンシャルスタッフィング対策)
    • チャット系リミッター: /chat/chat-with-file/chat-multi・1分20回(コスト攻撃対策)
    • app.set("trust proxy", 1) 追加(Railway リバースプロキシ越しの実 IP 取得)
    • /stripe/webhook はレートリミット対象外(Stripe 公式 IP からのコール保護)
    • 超過時はログ出力 + 429 Too Many Requests を返却

🟡 Changed(Session 87)

  • landing/console.html — デフォルトテストテキストに「α計画」「機密」を追加(Dictionary 機能の before/after が一目で確認できるデモ文に変更)
  • landing/console.html — Dictionary ON 時に Request Body エリアに「🔑 カスタム辞書: N件 適用中」インジケーターを表示
    • ページロード時・toggle 切替時・Save 時にリアルタイム更新
    • toggle OFF 時は非表示

🔵 Fixed(Session 87)

  • landing/console.html — Dictionary タブ: toggle ON にしても customDictionary がリクエストに追加されない不具合を修正
    • 原因: toggle ON 時点で「保存」を押していない場合、localStorage に辞書データが存在せず getCustomDictionary() が null を返していた
    • 修正: toggle を ON にした瞬間にエディター内容を自動保存。JSON 不正の場合は ON にならずエラーメッセージを表示
    • フォールバック追加: localStorage に保存データがない場合はエディターの現在の内容を直接使用

🟢 Added(Session 88)

  • core/src/pii-detector.js日本語姓名スペースなし検出(上位~400姓辞書・Set照合)
    • JAPANESE_SURNAMES Set(2文字以上の姓のみ)、最長姓優先マッチ(長谷川 > 長谷)
    • maskPII(text, ["name"], "ja") で「田中太郎」「山田花子」等のスペースなし表記もマスク
    • 誤検出対策: 姓の直前/直後に地名・会社後置詞(株・式・会・社・業・機など)がある場合はスキップ
    • detectPII でも candidates に { type: "name", level: "confirm" } として返却
    • 既存スペースあり検出(田中 太郎)との二重マスクなし
    • 9ケースのユニットテスト追加(pii-detector.test.js
  • core/src/pii-detector.js敬称・職位コンテキストによる姓検出(1文字姓・多文字姓の両対応)
    • JAPANESE_SURNAMES_1CHAR Set(林/森/原/岡/島/谷/野など約50文字)
    • HONORIFIC_TITLES 配列(さん/様/氏/くん/殿/部長/課長/社長など30種類超、最長一致)
    • 4パターン対応:
      • A) 1文字姓 + 敬称(林さん、金様、林氏、南くん)
      • B) 1文字姓 + 職位後置(森部長、岡社長)
      • C) [役職]の[1文字姓]です(社長の菅です、部長の原より)
      • D) 2〜4文字姓 + 敬称/職位(小林さん、田中氏、長谷川様)
    • 姓のみをマスク(敬称・職位は保持)— 例: 林さん[SECURE_name_xxx]さん
    • 誤検出防止: 姓の直前が漢字の場合はスキップ(複合語・地名を除外)
    • HONORIFIC_KANJI_1CHAR Set 追加: gLen計算ループで敬称漢字(氏/様/殿/君)を手前で停止 → 長谷川様 の "様" が given name に取り込まれる誤マスクを根本修正
    • 15ケースのユニットテスト追加(pii-detector.test.js

⚪ Docs(Session 88)

  • docs/ja/api/console.mdテストコンソール にページ名変更(旧: API テストコンソール)
  • docs/ja/api/console.md — カスタム辞書(Dictionary)機能の設定・使い方・確認デモ手順を追記
  • docs/.vitepress/config.ts — JA/EN サイドバー: テストコンソール・SEva を「はじめに」セクションに移動(旧: インフラ・運用)
  • docs/ja/guide/limitations.md — 日本語氏名検出の制約を「スペース必須」から「対応強化中」に更新。現在の対応状況(辞書マッチング・敬称コンテキスト)をテーブルで明示
  • docs/ja/api/core-functions.md — 氏名検出の info callout を辞書マッチング・敬称対応の内容に更新

⚪ Docs(Session 87)

  • docs/ja/guide/pii-protection-levels.md新規ページ: LLM別 PII保護レベルガイド
    • 主要LLM(Claude / ChatGPT / Gemini / Copilot / Perplexity / Mistral / Llama / ローカルLLM)の保護レベル比較表
    • 利用ルート(Chrome拡張・API・MCP・SEva)別の仕組み解説
    • ユーザーガイドサイドバーに追加
  • docs/ja/api/mcp.md — 「セッション単位で全メッセージをマスクする」ティップス追加
    • セッション冒頭の一言指示でセッション全体を PII Firewall 稼働状態にする方法

🟢 Added(Session 86)

  • core/src/pii-detector.jsカスタム PII 辞書機能(Privacy by Design: 辞書データを当社サーバーに保存しない設計)
    • buildCustomPatterns(entries) 関数追加: キーワード・正規表現エントリをパターンオブジェクトに変換
    • detectPII() / maskPII()opts.customPatterns オプション追加(動的パターン注入)
  • proxy/index.js/mask / /detect エンドポイントに customDictionary フィールド対応
    • Tier 別バリデーション: Starter=最大10件・キーワードのみ、Business+=正規表現可、Enterprise=無制限
    • フォーマット: { keywords: [{keyword, type}], patterns: [{pattern, type}] }
  • landing/console.html — 🔑 Dictionary タブ追加
    • JSON エディター・ファイルアップロード・ダウンロード・localStorage 保存
    • 適用トグル ON で全リクエストに customDictionary 自動挿入

🟡 Changed(Session 85)

  • core/src/pii-detector.js英語 PII 検出精度改善(pii-masking-300k ベンチマーク Micro F1: 65.02 → 75.48)
    • drivers_license UNIVERSAL ラベルパターン拡張: is セパレーター対応・lookahead をスペース/ドット横断に変更((?=[A-Z0-9]{0,15}\d)(?=[A-Z0-9\s\-\.]{0,40}\d)
    • drivers_license value フォーマット拡張: スペース区切り(VIKAS 606107 9 539)・ドット区切り(EFSEV.761144.EB.196)対応
    • drivers_license JSON キーパターン追加: "driver_license": "VALUE" 形式を UNIVERSAL に追加
    • postal_code JSON/XML/ラベルパターン追加: 部分的 UK outward コード(CM3, RG7 等)を文脈必須パターンで対応
    • F1 スコア改善: drivers_license 21.56→53.71、postal_code 33.11→73.85、Micro Avg 65.02→75.48
  • scripts/run-pii-masking-300k-benchmark.js — ベンチマーク精度向上
    • normalizeValue() に DL・postcode JSON キー prefix 除去を追加
    • GT 収集ロジック: カンマ区切り複数値を split して個別比較(例: "dn33eh,dn33eq" → 2件の GT)

🟢 Added(Session 84)

  • core/src/pii-detector.js英語リージョン検出レイヤー実装(Region-First Exclusive アーキテクチャ)
    • detectRegion(text) 関数追加: スコアリングベースで6リージョン(US/UK/IN/AU/SG/CA)+ Generic を自動判定
    • PATTERNS_EN_UNIVERSAL: 全英語モード共通パターン(labeled/context-required のみ)
    • PATTERNS_EN_US/UK/IN/AU/SG/CA/GENERIC: 各リージョン専用パターン(郵便番号・電話・パスポート・ID)
    • detectPII(text, "en", { region: "us" }) — 明示的リージョン指定オプション追加
    • detectRegion()module.exports に追加(テスト・SDK 利用可能)
    • 改善されるカテゴリ(期待値): postal_code Recall 25%→50%+、drivers_license 14%→60%+
    • 対応リージョン:
      • 🇺🇸 US: bare ZIP(12345)、SSN裸番号、US州名アドレス、US電話 (555) 123-4567、US DL、EIN
      • 🇬🇧 UK: UK郵便番号、NIN(ラベルなし対応)、NHS番号(ラベルなし対応)、DVLA DL形式、UK電話 07xxx
      • 🇮🇳 IN: Aadhaar(12桁)、PAN card、6桁PIN code、IFSC code、IN電話 9xxxxxxxxx
      • 🇦🇺 AU: NSW/VIC等+4桁postal、TFN、ABN、AU電話 02/04xx、Medicare card
      • 🇸🇬 SG: NRIC/FIN(S/T/F/G + 7桁 + check digit)、6桁postal(S048616 形式含む)、SG電話 6/8/9xxxxxxx、UEN
      • 🇨🇦 CA: SIN(3-3-3形式、US SSN 3-2-4と区別)、Canadian postal(K1A 0B1)、OHIP/health card、BN
    • クロスリージョン干渉の解消: CA文書で US州名パターンが "SIN" の "IN" を誤検知する問題を根本解決

🟡 Changed(Session 82)

  • core/src/pii-detector.js PATTERNS_EN — パターン大幅改善(pii-masking-300k ベンチマーク Micro F1: 57.85 → 65.02)
    • password: \b(?:password|passwd)\b\s*[:=]\s*\S+ に変更。pass/pwd を削除・[:=] 必須化で FP 77%削減(133→31件)
    • phone: コンテキスト付きパターン追加(Phone: 0123456789 形式対応)。Recall 42.4%→60.3%、F1 47.41→61.28
    • passport XML: <passport>\d{9}><passport>[A-Z0-9]{6,12} に拡張。英数字パスポート番号(A12345678形式)対応
    • drivers_license XML: タグを <[A-Za-z]*licen[sc]e[A-Za-z]*> に汎化。<driverslicense> / <drivinglicence> 等を追加取得
    • postal_code: 文脈付き US ZIP コードパターン追加(既存 UK/Canada は維持)

⚪ Docs

  • docs/ja/api/quickstart.md — 「最初の3行」コード例を修正: 田中太郎(スペースなし・名前スルー)→ 田中 太郎(スペースあり)+ extraTypes: ["name"] 追加。氏名がマスクされる正しい例示に更新(Session 80)
  • docs/ja/guide/limitations.md — 日本語氏名検出の仕様制約(スペース必須)を新セクションとして正直に記載。スペースなし未対応・今後の改善予定を明記(Session 80)
  • docs/en/guide/limitations.md — 英語版にも氏名検出のスペース必須仕様を追記。日本語テキストへの実用的影響も説明(Session 80)
  • docs/ja/api/rag.md — Proxy API 例・テスト結果の 山田太郎(スペースなし)を 山田 太郎(スペースあり)に修正。extraTypes: ["name"] 追加。テスト結果を名前トークン化済みの正しい出力に更新(3/3 → 4/4)(Session 80)
  • docs/en/api/rag.md — Proxy API 例を Alice Smith(スペースあり)+ extraTypes: ["name"] に更新。テスト結果も名前トークン化を含む正しい出力に更新(Session 80)
  • docs/ja/api/index.md — クイック例の 山田太郎(スペースなし)を 山田 太郎 に修正・extraTypes: ["name"] 追加・レスポンス JSON の value と文字位置も更新。氏名検出 infoボックス追加(Session 80)
  • docs/ja/guide/privacy.md — マスキング仕組み表の 山田太郎山田 太郎 に修正。氏名検出 infoボックス追加(Session 80)
  • docs/ja/api/core-functions.mdfw.mask() 例に extraTypes: ["name"] を追加・山田太郎山田 太郎・コメントを名前マスク済みの正しい出力に更新(Session 80)
  • docs/ja/api/api-keys.md — curl 例の 山田太郎山田 太郎 + extraTypes: ["name"] 追加(Session 80)
  • docs/ja/api/server.md — Python 例の 田中太郎田中 太郎(Session 80)
  • docs/ja/api/rest.md — restore レスポンス例・PIIタイプ一覧の 山田太郎山田 太郎(Session 80)
  • docs/ja/api/mcp.md — 会話例の 山田太郎山田 太郎(Session 80)

⚪ Docs

  • docs/ja/api/mcp.md / docs/en/api/mcp.md — 「PII 自動保護モードの設定(推奨)」セクション追加。方法A(CLAUDE.md への指示追記)・方法B(UserPromptSubmit フック)の2つの手順を記載。動作イメージ・比較表・推奨コメントを含む(Session 82)

🔵 Landing

  • landing/console.html — OTP入力欄を6桁固定に統一。placeholdermaxlength・バリデーション(!== 6)・ラベルを6桁に揃えた(Session 82)

🔵 Landing

  • landing/console.html — APIキー未発行ユーザーのプラン表示バグ修正: renderApiKeysList() でキーなし早期 return 時に /credits エンドポイントからプランをフォールバック取得し、Account タブ・SEva ファイル添付ボタン・TOTP チェックに正しく反映(Session 82)

🔵 Landing

  • landing/console.html/api-keys フェッチにキャッシュ無効化を追加: ?t=Date.now() クエリパラメータを付与。ブラウザが304でキャッシュ返却しプランが "Free" になる問題を修正(Session 82)
  • landing/console.htmlrenderApiKeysList() でキーが存在する場合も loadAccountTab() を呼ぶよう修正。currentPlan 更新後に Account タブの表示が反映されていなかったバグを修正(Session 82)
  • landing/console.htmlloadAccountTab() を非同期化。currentPlan === 'free' のタイミングで Account タブが開かれた場合も /api-keys を直接フェッチしてプランを確定してから表示する(Session 82)

🟢 Landing

  • landing/console.htmlrefreshSidebarAccess() 関数を追加。プラン確定後に Secure RAG サイドバー項目を Starter+ でアンロック(🔒→📦 アイコン変更・ドキュメントリンク化)。SEva 📎 ボタン制御も一元化(Session 82)
  • landing/seva/seva.js_attachEnabled インスタンス変数を追加。setAttachmentEnabled() が DOM 初期化前に呼ばれてもプラン状態を保持し、_inject() 後に正しく反映する(Session 82)

🔵 Proxy + Landing + SEva

  • proxy/index.js/upload エンドポイントのメール解決を resolveUserEmail() に統一。Supabase JWT(Authorization: Bearer)からも email を取得できるようになり、コンソール経由のファイルアップロードが認証可能に(Session 82)
  • proxy/index.js/upload プランチェックを credits + api_keys 両テーブル参照に変更。高い方のプランを採用することで、credits テーブルが未更新でも api_keysstarter があれば通過できるよう修正(Session 82)
  • landing/seva/seva.jsgetAuthHeaders コールバックオプションを追加。_processFileAttachauthHeaders/upload フェッチに含めるよう修正(Session 82)
  • landing/console.html — SevaWidget 初期化に getAuthHeaders: () => getAuthHeader() を追加。ファイルアップロード時に Supabase JWT を送信してプランチェックをパス(Session 82)
  • landing/console.htmlonAuthSuccess()loadApiKeys().then(() => refreshSidebarAccess()) に変更。Account タブ訪問なしにサイドバーが自動でアンロックされるよう修正(Session 82)
  • landing/console.html — トップバーにプランバッジ追加(topbar-plan-badge)。プラン確定後 refreshSidebarAccess() がバッジを表示・色分け。ログアウト時は非表示(Session 82)
  • landing/console.htmlinitPlanBadge() を追加。ログイン直後に /api-keys を直接フェッチしてプランを確定し refreshSidebarAccess() を呼ぶ。loadApiKeys() に依存しない独立したプラン検出フロー(Session 82)
  • landing/console.htmlrefreshSidebarAccess() に SEva refreshContext() 呼び出しを追加。プラン更新と同時にコンテキストチップを更新(Session 82)

🔵 Landing

  • landing/console.html — SCENARIOS・PRESETS 内の日本語サンプルテキストの姓名をすべてスペースあり形式に修正(山田太郎 → 山田 太郎 等)。マスク・RAG・detect シナリオの全サンプルに対応(Session 82)
  • landing/console.htmlrunRequest() で日本語モード時に extraTypes: ["name"] を自動付与。コンソールデモで氏名が正しくマスクされるよう修正(Session 82)
  • landing/console.html — プランゲートパネルに「〇〇 にアップグレード」ボタンを追加。Starter+ 機能には Starter Stripe Checkout 直行、Business+ 機能には Business Stripe Checkout 直行、Enterprise は問い合わせフォームへ遷移(Session 82)

🔵 Proxy + Docs

  • proxy/index.jsrequireStarterPlan() ヘルパー関数を追加。API キー認証(req.apiKey.plan)と Supabase JWT 認証(credits + api_keys 両テーブル参照)を統一して Starter 未満を 403 で弾く再利用可能なミドルウェア(Session 82)
  • proxy/index.js/rag/ingest/rag/resolverequireStarterPlan() を適用。Secure RAG は Starter プラン以上のみ利用可能に(Session 82)
  • docs/ja/api/rag.md / docs/en/api/rag.md — ページ上部に「Starter プラン以上が必要」警告コールアウトを追加。403 の動作と pricing ページへのリンクを記載(Session 82)

🟢 Landing + SEva

  • landing/seva/seva.js — ファイル添付ボタンのラベルを「Business」→「Starter+」に修正(ja/en 両言語)。ファイルアップロードが Starter から利用可能なことを正しく表示(Session 82)
  • landing/seva/seva.js_appendSystemNote() が DOM 要素を返すよう変更。_processFileAttach() で「ファイルを処理中...」メッセージをカード表示後に自動除去(Session 82)
  • landing/seva/seva.js/upload fetch に AbortSignal.timeout(60000) を追加。60秒以上の応答なしでタイムアウトエラーを表示(Session 82)
  • landing/console.html — Secure RAG サイドバー項目(sc-rag_ingest/sc-rag_resolve)を SCENARIOS に追加。クリックでコンソール内に /rag/ingest/rag/resolve のテストパネルが表示されるよう修正(Session 82)
  • landing/console.htmlrunRequest()rag_ingest/rag_resolve のルーティング処理を追加(Session 82)
  • landing/console.htmlrenderPreview() に RAG レスポンスのビジュアライゼーション追加。ingest はチャンク一覧・トークン数表示。resolve は復元済みテキスト表示(Session 82)

🟡 Landing

  • landing/console.html — SEva ファイル添付を Starter プランにも開放(Starter/Business/Enterprise で 📎 ボタン表示)(Session 82)
  • landing/seva/seva.js — ファイルサイズ上限を 1MB に設定。超過時はチャット内にエラーメッセージ表示(Session 82)

🟢 Landing

  • landing/seva/seva.js + landing/seva/seva.css + landing/console.html — Business/Enterprise Tier 向けファイル添付機能: SEva チャット入力欄に 📎 ボタン追加(Business/Enterprise プランのみ表示)。ファイル選択 → proxy /upload でテキスト抽出 + PII マスキング → チャット内レビューカード表示(PII検出数・マスク済みプレビュー)→ [送信] で masked text を SEva に送付。対応形式: PDF, Word, Excel, PowerPoint, CSV, TXT, MD, HTML, RTF(Session 82)

🔵 Landing

  • landing/console.html — TOTP 再登録エラー修正: mfa.enroll() 前に未完了(unverified)ファクターを自動削除することで「QRコードの取得に失敗しました」エラーを解消(Session 81)
  • landing/console.html — TOTP QRコード描画を innerHTML テンプレートリテラルから createElement + img.src に変更。data URI 内の引用符(")が HTML を壊す問題を根本修正(Session 81)

🟡 Landing

  • landing/console.html — Account タブ: プランに応じてアクションボタンを切り替え。Free → Starter/Business アップグレードボタン(Stripe Checkout 直接起動)、Starter → Business アップグレードボタン、Business/Enterprise → 「プランを見る」リンク。Free プランでは Stripe ポータルボタンを非表示(Session 81)

🟢 Proxy

  • proxy/index.jsPOST /stripe/create-portal-session 追加。Stripe カスタマーポータル URL を生成し Account タブの「Stripe ポータルを開く」ボタンを動作させる(Session 81)

🟢 Landing

  • landing/console.html — Account Settings ページ実装(4タブ: Profile / Security / Activity / Account)。APIキー管理をサイドバーから Security タブに移動。Profile タブで表示名・会社名を設定可(Supabase user_metadata 保存)。Activity タブでログイン履歴・アカウント作成日表示。Account タブでプラン使用量・Stripe 請求ポータル・退会リクエスト。トップバーと org セレクタが設定した表示名・会社名を優先表示(Session 80)
  • landing/console.html — 2段階認証(TOTP)実装: Business/Enterprise プランは必須、Starter は推奨バナー表示。ログイン時の TOTP チャレンジ(Step 3)、Supabase MFA enroll/challenge/verify API 統合。QRコード表示・シークレットキー手動入力対応(Session 80)
  • landing/api-keys.md — プラン別月間APIコール上限テーブルを削除し [プラン・機能一覧] リンクに置き換え(Session 80)

🟡 Landing

  • landing/console.html — サイドバー再設計(案C): PII Protection / Injection Defense / Secure RAG(Starter+)/ Shadow AI(Business+)カテゴリに再構造化(Session 72)
  • landing/console.html — 新エンドポイント追加: POST /detect-sql・POST /detect-all-injections(Injection Defense カテゴリ)(Session 72)
  • landing/console.html — 新 Try It シナリオ追加: SQL Injection・Composite Attack(Session 72)
  • landing/console.html — プランゲートパネル実装: Secure RAG / Shadow AI クリック時にアップグレード誘導(Session 72)
  • landing/console.html — EN i18n 基盤実装: I18N オブジェクト・data-i18n 属性・setLang() 拡張(Session 72)
  • Support Chat (Supportchat/poc/src/server.ts) — SEva Enterprise Privacy Briefing: エンタープライズ相談開始時に社名・部署・担当者名・連絡先を申告する STEP 0 を追加。申告情報はセッション内カスタムマスクとして登録し、seva_logs 保存前に extractDeclaredPII() + maskWithCustomTerms() で自動マスキング(Session 77)
  • landing/seva/seva.js + landing/console.html — プロスペクト追跡:userId(Supabase UUID)と endpointsTried を SEva コンテキストに追加。Railway に転送して購買意図スコアリングに使用(Session 76)
  • landing/seva/seva.js + landing/console.html — SEva デフォルト表示:コンソール読み込み時にパネルを自動で開く(defaultOpen: true)。タブボタンで非表示に切り替え可能(Session 76)
  • landing/seva/seva.js — SalesEva: callsUsed / callLimit をサーバーコンテキストに追加。SYSTEM_PROMPT の使用量ベースアップグレード誘導が機能するよう対応(Session 76)
  • landing/seva/seva.js + landing/seva/seva.css — SEva フィードバックボタン UI 修正:👍/👎 ボタンをチャット吹き出しの右ではなく下に表示(.seva-bub-wrap ラッパーによるカラムレイアウト)(Session 75)
  • landing/seva/seva.js + landing/seva/seva.css — SEva 学習ループ Phase 3: 👍/👎 フィードバックボタン追加。_rate() メソッド実装(chatUrl/rate に fire-and-forget)。JA/EN i18n 対応(Session 74)
  • app/src/main.jsx — 利用規約同意画面追加:バージョン管理同意(TERMS_VER)・terms_agreements Supabase テーブルチェック・バージョン更新時再同意(Session 74)
  • landing/console.html — OTP入力フォーム修正:maxlength を 6 → 8 に変更・ラベルを「確認コード(6〜8桁)」に更新(SupabaseのOTPコードが8桁の場合がある)(Session 73)
  • landing/seva/seva.js + landing/seva/seva.css — SEva(SupportEva)Phase 1: 再利用可能な単体モジュールとしてAIテクニカルサポートウィジェット実装(SevaWidgetクラス)。右側340pxスライドパネル・Railway チャットAPI接続・Privacy by Designコンテキスト渡し・JA/EN i18n対応(Session 73)
  • docs/en/api/seva.md + docs/ja/api/seva.md — SEva ドキュメント新規作成:概要・Privacy by Design 原則・FAQ・質問例。サイドバー「インフラ・運用」に追加(Session 73)
  • landing/console.html — SEva contextFn 完成:endpointsTried(試したエンドポイント履歴・重複除去・最大10件)・callsUsed(全キー合算の今月コール数)・callLimit(プラン上限)を追加。すべて行動メタデータのみ — Privacy by Design 境界を維持(Session 73)
  • landing/seva/seva.js — SEva Phase 2: 全メッセージに PII Firewall パイプライン適用(detectAllInjections → mask → Railway chat → restore-text)。攻撃ブロックカウンター・PII マスク件数表示・パイプラインエラー時のグレースフルデグラデーション(Session 73)
  • docs/en/api/seva.md + docs/ja/api/seva.md — SEva ドキュメント拡充:全スタックパイプライン図(detectAllInjections → mask → Secure RAG → Claude → restoreAll)・Secure RAG 知識ベース構成・リアルタイム保護統計の説明・FAQ と質問例の拡充(Session 73)
  • landing/tokusho.html — 電話番号を「現在設定中」から 070-3630-6741 に更新(JA/EN)・準備中注記削除(Session 71)
  • landing/index.html — ナビ全項目(製品・ソリューション・開発者・リソース・料金・サインイン)を pointer-events:none; opacity:0.45; cursor:default で完全無効化・Sign In には onclick="return false" も追加(特許申請期間中・ドロップダウン表示防止)(Session 71)

🔵 インフラ・セキュリティ(Session 71)

  • 全サービス 2FA 設定完了(GitHub: Passkey+TOTP+Recovery / Cloudflare: TOTP+Backup / Supabase: App 278 / Railway: App+Recovery)(Session 71)
  • Vercel アカウント削除・GitHub Apps 整理(Cloudflare + Railway のみ残存)(Session 71)
  • Supabase Pro アップグレード(M-DEEP inc 法人課金・日次自動バックアップ 7 日間保持)(Session 71)
  • Cloudflare Email Routing 更新(support@piifirewall.com → support@m-deep.com Active)(Session 71)

⚪ Docs(Session 71)

  • internal-docs/infra/account-migration.md — 2FA 完了状況・GitHub Apps 整理・Cloudflare セキュリティ計画・Email Routing・Google Workspace 構成を追加(Session 71)
  • internal-docs/project/tips.md — Markdown → Word 変換セクション追加(Session 71)
  • /md-to-word スキル新規作成(C:\Users\kmish\.claude\commands\md-to-word.md)(Session 71)
  • landing/index.html — 特許申請準備として一般ユーザー向け簡略表示に変更(Session 70): ナビドロップダウン全非公開・対象ユーザーセクション非公開・MCPカード非公開・Developerセクション非公開・料金セクション非公開・問い合わせフォーム非公開・チャットウィジェット非公開・CTA ボタン無効化(すべて display:none / pointer-events:none で保持、即時復元可能)
  • landing/index-v2.html — Secure RAG セクション削除(特許申請中のため非公開)(Session 67)
  • landing/index-v2.html — 購入フロー修正適用:Start Starter/Business → OTP → ?plan= パラメータ付きリダイレクト → Stripe Checkout 自動起動(Session 67)
  • landing/index-v2.html — 認証モーダル HTML が欠落していたため追加(Session 67)
  • landing/portal.html?plan=starter|business パラメータ検知 → Stripe Checkout 自動起動を追加(Session 67)
  • landing/index.html / index-v2.html — Magic Link の emailRedirectTo にプランパラメータ付き URL を設定(Supabase Site URL 経由で plan が失われていた問題を修正)(Session 67)
  • landing/index-v2.html — Secure RAG セクションを完全削除から display:none 非表示に変更(特許申請後に再表示可能)(Session 67)
  • landing/index.html / index-v2.html — OTP入力フォーム修正:8文字チェック → 6文字以上チェックに変更(Supabaseが6桁コードを送るのにフォームが8桁要求していた不具合)(Session 67)
  • landing/portal.html — Stripe Checkout を window.open から window.location.href に変更(ポップアップブロッカー回避)(Session 67)

🔵 Fixed

  • docs/ja/api/index.md / docs/en/api/index.md — Free プランAPIコール上限の誤記修正(1,000回 → 300回)(Session 69)
  • docs/ja/api/rest.md — Starter プランサンプルレスポンスの creditsTotal 誤記修正(1,000 → 5,000)(Session 69)

⚪ Docs

  • docs/public/screenshots/ / internal-docs/public/screenshots/ — スクリーンショット管理フォルダを新設(利用者ドキュメント・社内ドキュメントで分離管理)(Session 69)
  • landing/console.html — APIキー一覧に「最終使用」列を追加(last_used_at。未使用キーは「—」表示)(Session 69)
  • proxy/api-key-auth.js — APIコール使用量をユーザー単位(全キー合算)で管理するよう変更。キーローテーション・新規発行時も月次累積カウントが保持される(Session 69)
  • proxy/api-key-auth.js — Enterprise プランのコールログ記録コードに .rpc 参照バグがあったため修正(Session 69)
  • landing/index.html / index-v2.html — OTP後のリダイレクト先を /portal/console に変更(5/1リリースは開発者向け。portalはどこからもリンクされないため)(Session 68)
  • landing/console.html — POST /detect の Preview が「No PII Detected」と誤表示するバグを修正(/detectcandidates 配列を返すが detections しか参照していなかった)(Session 68)
  • landing/console.html — Landing OTP認証後の ?plan= パラメータ検知 → Stripe Checkout 自動起動を追加(Session 68)
  • landing/console.html — ログインオーバーレイ内の app.piifirewall.com 参照を削除(5/1まで未公開)(Session 68)
  • landing/console.html — ログイン後にOrg名・SANDBOX/LIVEバッジを動的更新(ハードコード「Acme Corp」/「SANDBOX」固定だったのを修正)(Session 68)
  • landing/console.html — APIキー一覧に今月の使用量を追加:Freeプランは calls / 300 + プログレスバー(70%以上→黄、90%以上→赤)、Starter/Businessはコール数表示(Session 68)
  • proxy/index.js — CORS: pii-firewall.pages.dev を許可オリジンに追加(CloudflareページプレビューURLはハイフンあり pii-firewall.pages.dev のため piifirewall.com チェックに引っかからず、Stripe セッション取得がブロックされていた)(Session 67)
  • 購入フロー修正: landing「Start Starter/Business」→ OTP認証 → Stripe Checkout が自動起動するよう修正(Session 66)
  • @xmldom/xmldom を 0.8.11 → 0.9.10 にアップデート(High: XML インジェクション脆弱性 GHSA-wh4c-j3r5-mjhp)(Session 66)
  • dompurify を 3.3.3 → 3.4.0 にアップデート(Moderate: ADD_TAGS バイパス脆弱性 GHSA-39q2-94rc-95cp)(Session 66)

🟢 Added

  • examples/ollama-basic.js — PII Firewall + Ollama 基本統合サンプル(マスク→送信→復元)(Session 62)
  • examples/ollama-secure-rag.js — Secure RAG + Ollama 統合サンプル(社内文書のローカル LLM 活用)(Session 62)
  • examples/ollama-full-defense.js — フル防御パイプラインサンプル(複合攻撃検知+PII保護+Ollama)(Session 62)
  • examples/README.md — Ollama 統合サンプル セットアップ・実行ガイド(Session 62)
  • fw.detectAllInjections(text, lang?) — 複合攻撃検知:SQLインジェクションとプロンプトインジェクションを同時検知; { hasSQLInjection, hasPromptInjection, compositeRisk } を返す(Session 58)
  • fw.detectSQLInjection(text) — SQLインジェクション単体検知(Session 58)
  • rag_ingest MCPツール — Secure RAG用のドキュメントPIIトークン化(匿名化チャンクを返す)(Session 59)
  • rag_resolve MCPツール — LLM回答内のSRAGトークンを元の値に復元(Session 59)
  • MCPサーバーのツール数:9ツールに拡張(旧 6ツール): detect_all_injectionsrag_ingestrag_resolve 追加
  • APIキー検出対応プロバイダーを 11社 に拡張:Anthropic・OpenAI・Stripe・Google AI(AIzaSy…)・HuggingFace(hf_)・Groq(gsk_)・Perplexity(pplx-)・Replicate(r8_)・AWS(AKIA…)・GitHub(ghp_・ghs_・github_pat_)(Session 59)
  • POST /mask Proxy APIエンドポイント — テキスト内PIIを一括マスクして{ masked, detections }を返す。外部SDKやAIエージェントからの直接呼び出し用(Session 64)
  • POST /restore-text Proxy APIエンドポイント — SECUREDトークンを一括復元してテキストを返す。/restore-all(候補返却)の代わりにエージェント用途向け(Session 64)
  • /detect-all-injections Proxy APIエンドポイント — 複合攻撃検知のHTTPエンドポイント(Session 58)
  • /rag/ingest/rag/resolve Proxy APIエンドポイント(Session 58)
  • エンタープライズ展開パターン文書化:CLAUDE.md + Claude for Teams Projects システムプロンプト強制設定(Session 59)

🟡 Landing

  • 全ナビ「ソリューション」→「選ぶ理由」に変更(index-v2.html i18n + 全14ページ一括)(Session 61)
  • landing/solutions/injection-defense.html — SQL インジェクション対策セクション追加・競合比較テーブル・Hero 刷新(Session 61)
  • landing/index-v2.html — UX改善9点:タブボタン拡大・Howステップ矢印挿入・RAGフロー拡大・Pricing中央揃え・section-descセンタリング修正・各所句読点調整(Session 61)
  • landing/index-v2.html — 開発者ファースト全面刷新:8セクション構成(Code/HowItWorks/Integrations/Capabilities/RAG/Pricing/Trust/CTA)・npm install 主 CTA・ブラウザアプリ誘導削除・見出し句読点ルール確立(Session 61)
  • landing/index-v2.html — Hero メッセージ刷新:「AIを本番で使う。ラストワンマイルをコード1行で超える。」(Session 60)

⚪ Docs

  • internal-docs/sessions/ — Session 59/60/61 のセッションレポート・ハンドオフをセッション一覧に追加(Session 61)
  • ja/api/rag.md — Secure RAG 専用ページを新規作成(mcp.md から分割)(Session 62)
  • ja/api/injection-detection.md — 複合攻撃検知 専用ページを新規作成(mcp.md から分割)(Session 62)
  • ja/api/mcp.md — MCPサーバーのコア内容のみに整理、各専用ページへのリンクを追加(Session 62)
  • ja/api/index.md — 概要ページ更新:5つの統合オプション・7つの主要機能・MCPサーバー/SDK はAPIキー不要の旨明記(Session 62)
  • docs/.vitepress/config.ts — JA/ENサイドバーをカテゴリグループ構造に再構成(はじめに / 統合方法 / 機能リファレンス / 導入ガイド / インフラ・運用)(Session 62)

⚪ Docs

  • en/api/use-cases.md — 業種別導入事例ガイド(英語版)(Session 59)
  • ja/api/use-cases.md — 業種別導入事例ガイド・製造業Secure RAG・エンタープライズ展開パターン追加(Session 59)
  • en/api/slack-it-integration.md — Slack & IT/OT連携ガイド(Session 59)
  • ja/api/slack-it-integration.md — Slack・IT/OT連携ガイド(Session 59)
  • en/api/mcp.md / ja/api/mcp.md — 9ツール対応・Secure RAGパイプラインセクション・APIキー対応表 追記(Session 59)
  • en/api/sdk.md / ja/api/core-functions.mddetectAllInjections() と競合比較表 追記(Session 59)
  • シャドーAI監視ドキュメント追加(Session 55–56)

🟡 Changed

  • MCPサーバー ツール数:6 → 9

v0.1.0 — 2026-04-13

追加

  • @pii-firewall/core — PII検出24種類・マスク・復元・差分プライバシー・インジェクション検知10カテゴリ
  • @pii-firewall/sdk — Node.js SDK(createFirewall()maskPII()detectPII()detectInjection()
  • @pii-firewall/mcp-server — Claude Desktop / Cursor向け MCPサーバー(6ツール)
  • REST API — /detect/mask/restore/detect-injection エンドポイント
  • Developer Console — piifirewall.com/console(メールOTP認証・APIキー発行・管理)
  • APIキー認証 — pf_live_xxx 形式・プラン別コール数制限

対応言語

  • 日本語(lang: "ja")・英語(lang: "en"

インフラ

  • Railway(proxy)・Cloudflare Pages(landing)・Cloudflare Workers(app・docs)

更新ログの記録方針

種別記録対象
🔴 BreakingAPIの破壊的変更(レスポンス形式変更・エンドポイント廃止)
🟢 Added新機能・新エンドポイント
🟡 Changed既存機能の変更・改善
🔵 Fixedバグ修正
⚪ Docsドキュメントのみの変更

Last updated:

Privacy by Design.