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 metanoindex,nofollow,noarchive,nosnippet,noimageindex+_headersのX-Robots-Tag+landing/robots.txtのDisallow)。各ページの公開準備が整い次第、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 種類すべてが旧 BearerADMIN_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自動更新トリガー + 初期 adminkmishimasl@gmail.com登録proxy/index.js:requireAdminRole(allowedRoles)ミドルウェア新規(JWT 検証 → AAL=aal2 確認 → admin_users 参照 → role 判定)。/admin/me・/admin/usersCRUD(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.json・en.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.json・en.json: 36 キー追加(csv.button・csv.tooltip・csv.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.json・en.json: 14 キー追加(filter.range・filter.preset.*・filter.from/to/search/clear/matched/empty・filter.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/ack・PATCH /admin/alerts/:id/resolveの 2 エンドポイント追加。ACK 未実施でも直接 Resolve 可能(同時にacknowledged_*も自動記録・監査整合性確保)。resolution_noteは 1000 文字 truncate(DoS 対策)。BearerADMIN_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.json・en.json: 24 キー追加(alert.status.*・alert.filter.*・alert.action.*・alert.meta.*・alert.modal.*・alert.error.*・alert.empty.filtered・badge.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/DonutChart4 種のラッパーコンポーネント- 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.summary・users.rankingTitle・logs.*(時間帯関連 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.jscreateAlert():description_template/description_paramsを受け取り Supabase に保存。レガシーdescription(日本語完成文)も併存させ後方互換proxy/cloud-logger.jscheckAlertRules():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:--warnCSS 変数を追加(デザインガイドライン準拠#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=1URL パラメータ検知 →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/ragv0.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.jsloadCredentialPatterns(): クレデンシャルパターンのロード時にcostEstimate/provider/tagsフィールドを追加マッピングcore/src/pii-detector.jsdetectPII(): クレデンシャルパターンがマッチした候補に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(commit31db33f)
🟢 Added(Session 155 — P-JSON++: ZAP Groovy / Python SDK / Java SDK の SSoT 統合)
scanner/zap-rules/piifw-passive-scan.groovyv0.2.0: ハードコード 15 種パターンを撤廃。/zap/wrk/core/data/credential-patterns.jsonをJsonSlurperで読込、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_keyregex を 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_keyregex を 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.js内DEFAULT_AI_SERVICESのインライン定義を分離。今後のサービス追加・カテゴリ変更は本 JSON のみで完結(コード変更不要)proxy/index.js:DEFAULT_AI_SERVICESをrequire("./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_SITESをmonitored-sites.jsのPIIFW_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 に緩和。GiNZaja_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 / geminidrop-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 に追加。MessageReadCommandSurfaceExtensionPoint を追加(「インジェクション検知」ボタンを読み取りモードリボンに追加)。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-full・internal: trueネットワーク隔離・JAVA_TOOL_OPTIONS=-Xmx1g・ヘルスチェック付き)。piifw-proxyにTIKA_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-defense・blog/prompt-injection・blog/indirect-injection-ragをpiifirewall.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 buildxでlinux/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: Supabaselicense_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 ユーザー(nodeUID=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.md・docs/en/api/plans.md・docs/ja/guide/plans.md・docs/en/guide/plans.md)を更新 - APIコール上限をシンプル化(統合クレジット方式廃止): Free 300回・Starter 10,000回・Business 300,000回(旧333,333回)・Enterprise 無制限
detect_injection・detect_all_injections・detect_sql_injectionを全プラン無制限に変更- 新規追加:
detectAllInjections(SQL+プロンプト複合検知)・detectSQLInjection・langオプション・maskMessagesを機能表に追加 - チームメンバー招待: Starter ✅→❌(1名利用)・Business ✅ を明記
- アドオンパック: 「クレジット」→「APIコール」に表記変更
- ガイド版(guide/plans.md): Webアプリ統合クレジット方式の記述を削除・シンプル化
⚪ Docs(Session 125 — プラン機能一覧 不整合修正)
docs/ja/api/plans.md・docs/en/api/plans.md: カスタムPIIルール(SDK・REST API)の Starter 利用可否を ❌→✅ に修正(2026-04-29 変更の反映漏れ)。SDK PII種類表示を Starter/Business/Enterprise 全て「24種類+カスタム」に統一。FAQ文言修正。docs/ja/guide/plans.md・docs/en/guide/plans.md: カスタムPIIルール Starter ❌→✅・PII種類表示修正・チームメンバー招待 Starter ✅→❌(Starter=1名のため)・FAQ文言修正。
🔵 Fixed(Session 119 — logo-light.svg が空ファイルになる問題を修正)
- PowerShell の regex 変数書き込み失敗により
docs/public/logo-light.svgとinternal-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.js—WebhookDispatcherクラスを追加。fire-and-forget(非同期)配信・HMAC-SHA256 署名・指数バックオフリトライ(最大3回: 1s→2s→4s)・5秒タイムアウト・配信ログ記録を実装。Privacy by Design: ペイロードに生PII・masked_text・トークン値を含まない設計proxy/index.js—/maskエンドポイントにpii.detectedWebhook 発火を追加(APIキー認証済み・Starter以上・PII検知ありの場合のみ)proxy/index.js—/detect-all-injectionsエンドポイントにinjection.detectedWebhook 発火を追加(オプトイン・デフォルト 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.js—generateWebhookSignature()HMAC-SHA256 署名生成ヘルパーを追加proxy/index.js—validateWebhookUrl()SSRF 対策 URL バリデーション(HTTPS 強制・プライベートIP禁止)を追加proxy/supabase-migrations/008_webhook_endpoints.sql—webhook_endpointsテーブル migration(Supabase 本番適用済み)proxy/supabase-migrations/009_webhook_logs.sql—webhook_logsテーブル migration(Supabase 本番適用済み)
🟢 Added(Session 113 — P-04 フレームワーク Middleware 実装)
python-sdk/pii_firewall/middleware/_base.py— 共通マスク処理を新規追加。_mask_body()がPIIFirewallインスタンスに完全委譲する設計(_localモジュール直接依存なし)。デフォルトスキャンフィールド:messages/text/prompt/query/inputpython-sdk/pii_firewall/middleware/fastapi.py— FastAPI / Starlette ASGI ミドルウェア(PIIFirewallMiddleware)新規追加。app.add_middleware(PIIFirewallMiddleware)の1行で全エンドポイント PII 保護。on_license_error="block"デフォルト(自律停止原則)。ASGIreceive上書きによるゼロコード統合python-sdk/pii_firewall/middleware/flask.py— Flask WSGI ミドルウェア(PIIFirewallFlask)新規追加。WSGIenviron["wsgi.input"]差し替えでrequest.get_json()が自動マスク済みを返すゼロコード統合を実現python-sdk/pii_firewall/middleware/django.py— Django ミドルウェア(PIIFirewallDjango)新規追加。request._bodyキャッシュ上書きでrequest.body/request.data(DRF)が自動マスク済みを返すゼロコード統合を実現。settings.pyのPII_FIREWALLキーから設定を読み込むpython-sdk/pii_firewall/middleware/__init__.py— 上記3クラスをエクスポート。from pii_firewall.middleware import PIIFirewallMiddleware等でインポート可能python-sdk/pyproject.toml—fastapi/flask/djangoの optional-dependencies を追加sdk/src/middleware.js— Express / Hono / Fastify 共通maskBody()にcustomPatterns/lang引数を追加。query/inputフィールドをデフォルトスキャン対象として追加sdk/src/index.js—expressMiddleware()/honoMiddleware()/fastifyPlugin()がcustomPatterns/langをmaskBody()に伝達するよう修正
🟢 Added(Session 112 — カスタムPII辞書 全SDK実装)
sdk/src/index.js/sdk/src/index.d.ts—createFirewall({ customDictionary })に対応。CustomDictionary・CustomKeyword・CustomPattern型を追加。インスタンス生成時にパターンをコンパイル、mask()/maskMessages()/detect()に自動適用python-sdk/_local/detector.py—build_custom_patterns(entries)関数を追加(JSbuildCustomPatternsの Python 移植)。detect_pii()にcustom_patterns引数を追加python-sdk/_local/masker.py—mask_pii()にcustom_patterns引数を追加python-sdk/client.py—PIIFirewall(custom_dictionary=...)に対応。pii-dictionary.jsonをそのまま渡せる設計。mask_pii()/detect_pii()に自動適用。AsyncPIIFirewallも継承mcp-server/src/index.js—mask_pii/detect_piiツールにcustom_dictionaryパラメータを追加。ツール呼び出し時にリアルタイムコンパイルlangchain-plugin/callbacks.py—PIIFirewallCallbackHandler(custom_dictionary=...)に対応langchain-plugin/tools.py—get_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.js—issueSdkKeyの 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.py—PIIFirewallStreamストリーミングラッパー(同期・非同期対応)python-sdk/pyproject.toml—openai/anthropic/alloptional-deps 追加
🔵 Fixed(Session 102 — api_usage FK 制約削除)
proxy/supabase-migrations/007_api_usage_drop_fk.sql—api_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 対応)
- フォーカス中入力要素を 1.5 秒ポーリングスキャン追加(
🔵 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_KEYenv →~/.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_SETTINGSにpiifw_api_keyを追加
- Shadow AI URL検知(
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キーなしは 401API_KEY_REQUIREDPOST /detect-all-injections— 同上POST /shadow-ai/check— 同上
🟢 Added(Session 96 — SDK Billing Phase 4)
proxy/sdk-key-routes.js—POST /sdk/key-checkエンドポイント追加(SDK 日次ポーリング受信)- キー署名検証(KEY_EXPIRED は許容 → 新キー探索フロー)
- 累計
call_countをapi_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.js—sdk-manager全関数をスプレッドエクスポート追加proxy/supabase-migrations/006_api_usage_sdk.sql新規作成 —api_usageにtypeカラム追加('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.js—computeChainHash/verifyChainのエクスポート追加proxy/sdk-key-routes.js—POST /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.js—GET /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.js—billingモジュールを個別・名前空間の両方でエクスポート
🟢 Added(Session 91 — JPY円建て決済対応)
proxy—/stripe/create-checkout-session//stripe/create-credits-checkoutにcurrencyパラメータ追加(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-limitv7.5.1 導入- グローバルリミッター: 全エンドポイント・15分300回(ボット・スクレイパー排除)
- 認証系リミッター:
POST /api-keys・POST /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 に保存データがない場合はエディターの現在の内容を直接使用
- 原因: toggle ON 時点で「保存」を押していない場合、localStorage に辞書データが存在せず
🟢 Added(Session 88)
core/src/pii-detector.js— 日本語姓名スペースなし検出(上位~400姓辞書・Set照合)JAPANESE_SURNAMESSet(2文字以上の姓のみ)、最長姓優先マッチ(長谷川 > 長谷)maskPII(text, ["name"], "ja")で「田中太郎」「山田花子」等のスペースなし表記もマスク- 誤検出対策: 姓の直前/直後に地名・会社後置詞(株・式・会・社・業・機など)がある場合はスキップ
detectPIIでも candidates に{ type: "name", level: "confirm" }として返却- 既存スペースあり検出(
田中 太郎)との二重マスクなし - 9ケースのユニットテスト追加(
pii-detector.test.js)
core/src/pii-detector.js— 敬称・職位コンテキストによる姓検出(1文字姓・多文字姓の両対応)JAPANESE_SURNAMES_1CHARSet(林/森/原/岡/島/谷/野など約50文字)HONORIFIC_TITLES配列(さん/様/氏/くん/殿/部長/課長/社長など30種類超、最長一致)- 4パターン対応:
- A) 1文字姓 + 敬称(林さん、金様、林氏、南くん)
- B) 1文字姓 + 職位後置(森部長、岡社長)
- C) [役職]の[1文字姓]です(社長の菅です、部長の原より)
- D) 2〜4文字姓 + 敬称/職位(小林さん、田中氏、長谷川様)
- 姓のみをマスク(敬称・職位は保持)— 例:
林さん→[SECURE_name_xxx]さん - 誤検出防止: 姓の直前が漢字の場合はスキップ(複合語・地名を除外)
HONORIFIC_KANJI_1CHARSet 追加: 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
- drivers_license UNIVERSAL ラベルパターン拡張:
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
- 🇺🇸 US: bare ZIP(
- クロスリージョン干渉の解消: CA文書で US州名パターンが "SIN" の "IN" を誤検知する問題を根本解決
🟡 Changed(Session 82)
core/src/pii-detector.jsPATTERNS_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 は維持)
- password:
⚪ 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.md—fw.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桁固定に統一。placeholder・maxlength・バリデーション(!== 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.html—renderApiKeysList()でキーが存在する場合もloadAccountTab()を呼ぶよう修正。currentPlan更新後に Account タブの表示が反映されていなかったバグを修正(Session 82)landing/console.html—loadAccountTab()を非同期化。currentPlan === 'free'のタイミングで Account タブが開かれた場合も/api-keysを直接フェッチしてプランを確定してから表示する(Session 82)
🟢 Landing
landing/console.html—refreshSidebarAccess()関数を追加。プラン確定後に 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_keysにstarterがあれば通過できるよう修正(Session 82)landing/seva/seva.js—getAuthHeadersコールバックオプションを追加。_processFileAttachでauthHeadersを/uploadフェッチに含めるよう修正(Session 82)landing/console.html— SevaWidget 初期化にgetAuthHeaders: () => getAuthHeader()を追加。ファイルアップロード時に Supabase JWT を送信してプランチェックをパス(Session 82)landing/console.html—onAuthSuccess()でloadApiKeys().then(() => refreshSidebarAccess())に変更。Account タブ訪問なしにサイドバーが自動でアンロックされるよう修正(Session 82)landing/console.html— トップバーにプランバッジ追加(topbar-plan-badge)。プラン確定後refreshSidebarAccess()がバッジを表示・色分け。ログアウト時は非表示(Session 82)landing/console.html—initPlanBadge()を追加。ログイン直後に/api-keysを直接フェッチしてプランを確定しrefreshSidebarAccess()を呼ぶ。loadApiKeys()に依存しない独立したプラン検出フロー(Session 82)landing/console.html—refreshSidebarAccess()に SEvarefreshContext()呼び出しを追加。プラン更新と同時にコンテキストチップを更新(Session 82)
🔵 Landing
landing/console.html— SCENARIOS・PRESETS 内の日本語サンプルテキストの姓名をすべてスペースあり形式に修正(山田太郎 → 山田 太郎 等)。マスク・RAG・detect シナリオの全サンプルに対応(Session 82)landing/console.html—runRequest()で日本語モード時にextraTypes: ["name"]を自動付与。コンソールデモで氏名が正しくマスクされるよう修正(Session 82)landing/console.html— プランゲートパネルに「〇〇 にアップグレード」ボタンを追加。Starter+ 機能には Starter Stripe Checkout 直行、Business+ 機能には Business Stripe Checkout 直行、Enterprise は問い合わせフォームへ遷移(Session 82)
🔵 Proxy + Docs
proxy/index.js—requireStarterPlan()ヘルパー関数を追加。API キー認証(req.apiKey.plan)と Supabase JWT 認証(credits+api_keys両テーブル参照)を統一して Starter 未満を 403 で弾く再利用可能なミドルウェア(Session 82)proxy/index.js—/rag/ingest・/rag/resolveにrequireStarterPlan()を適用。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—/uploadfetch に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.html—runRequest()にrag_ingest/rag_resolveのルーティング処理を追加(Session 82)landing/console.html—renderPreview()に 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.js—POST /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_agreementsSupabase テーブルチェック・バージョン更新時再同意(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」と誤表示するバグを修正(/detectはcandidates配列を返すが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_ingestMCPツール — Secure RAG用のドキュメントPIIトークン化(匿名化チャンクを返す)(Session 59)rag_resolveMCPツール — LLM回答内のSRAGトークンを元の値に復元(Session 59)- MCPサーバーのツール数:9ツールに拡張(旧 6ツール):
detect_all_injections・rag_ingest・rag_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 /maskProxy APIエンドポイント — テキスト内PIIを一括マスクして{ masked, detections }を返す。外部SDKやAIエージェントからの直接呼び出し用(Session 64)POST /restore-textProxy APIエンドポイント — SECUREDトークンを一括復元してテキストを返す。/restore-all(候補返却)の代わりにエージェント用途向け(Session 64)/detect-all-injectionsProxy APIエンドポイント — 複合攻撃検知のHTTPエンドポイント(Session 58)/rag/ingest・/rag/resolveProxy 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.md—detectAllInjections()と競合比較表 追記(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)
更新ログの記録方針
| 種別 | 記録対象 |
|---|---|
| 🔴 Breaking | APIの破壊的変更(レスポンス形式変更・エンドポイント廃止) |
| 🟢 Added | 新機能・新エンドポイント |
| 🟡 Changed | 既存機能の変更・改善 |
| 🔵 Fixed | バグ修正 |
| ⚪ Docs | ドキュメントのみの変更 |