Obsidian Weave v5.1.27〜v5.1.30 で何を変えたか

に公開

v5.1.26 の公開後も開発は続き、v5.1.27〜v5.1.30 の 4 バージョンで合計 10 件以上の修正と新機能を追加しました。本記事はその技術的な変更内容をまとめたものです。


v5.1.27 / v5.1.28 — ビルドとテストの基盤を固める

Makefile の修正(v5.1.28)

make test コマンドが E2E テストの前に npm run build を実行しない問題を修正しました。

従来は npm run validate && npm run test:e2e を順に実行していましたが、dist/chromium-mv3/popup.html が存在しない状態で Playwright が走るため、70 件すべての E2E テストが ERR_FILE_NOT_FOUND で失敗していました。

# 修正後: build → validate → test:e2e の順で実行
test: build
    npm run validate
    npm run test:e2e

また test-and-build ターゲットの実行順序も test buildbuild test に修正し、ビルド後に検証が走るよう改めました。


v5.1.29 — 最大のリリース:セキュリティ・信頼性・SW 永続化

Service Worker 状態永続化(SW State Persistence)

Chrome の Service Worker はアイドル状態が続くと終了されます。従来の実装ではレート制限の状態・タブキャッシュ・設定キャッシュが SW 再起動のたびにリセットされていました。

v5.1.29 で SessionStore クラス(src/background/sessionStore.ts)を新設しました。chrome.storage.session をラップし、Map のシリアライズと queueMicrotask による debounced 書き込みを提供します。

SessionStore
  ├── skipAiRateLimiter: レート制限状態を再起動後も維持
  ├── TabCache: タブキャッシュを session storage に永続化
  └── RecordingLogic.cacheState: settings/URL/privacy キャッシュを永続化

各コンポーネントは initialize() 時に session storage からリストアし、mutation ごとに scheduleCacheSave() で非同期保存します。

AISummaryResult に success フィールドを追加

ProviderStrategy.ts のインターフェースに success: boolean を必須フィールドとして追加しました。OpenAI / Gemini / aiClient の全エラーパスと成功パスに success: true/false を明示的に設定するようになり、呼び出し元で結果の判定がより明確になりました。

セキュリティ修正

CSP connect-src の最小化

manifest.jsonconnect-src を約 50 ドメインから 8 エントリに削減しました。

// 変更前: 約 50 ドメインが列挙されていた
// 変更後
"connect-src": "http://localhost:* https://localhost:* http://127.0.0.1:* https://127.0.0.1:* https://generativelanguage.googleapis.com https://api.openai.com https://api.anthropic.com https://api.groq.com"

過剰パーミッションの削除

  • manifest.jsonpermissions から webRequest を削除(declarativeNetRequest で代替済み)
  • optional_host_permissions から <all_urls> を削除(コンテンツスクリプトは matches 宣言で動作するため不要)

マスターパスワード未設定時の暗号化改善

Extension ID(公開情報)をキー導出から除去し、初回生成のランダム 32 バイトシークレットのみで PBKDF2 を導出するよう改善しました。

E2E テスト安定化

src/content/loader.ts にあった data-ow-e2e-test 属性による完全バイパスを、キャッシュベースのドメインチェックに変更しました。

これまでの実装は E2E テスト時に SW へのラウンドトリップを完全にスキップしていたため、flaky 率が約 33% 程度ありました。変更後はキャッシュで明示的に拒否されているドメインのみ extractor の読み込みをスキップし、それ以外は通常の判定フローを通します。結果として E2E テストの安定性は 100% に改善されました。

その他の修正

修正内容 詳細
セッションタイムアウトアラームの初期化漏れ service-worker.tsinit()initializeSessionAlarms() 呼び出しを追加
手動保存時のクレンジング bypass handleManualRecord に DOM クレンジング処理を適用
TreeWalker の重複呼び出し修正 calculateTextScore() のスコアを事前計算して O(n) に削減
DRY 違反修正 extractor.ts の 37 個の重複 StorageKeys 定数を削除
PII 正規表現の hoist COMBINED_PII_REGEX をモジュールスコープに移動し再コンパイルを排除
i18n 対応 LM Studio / Ollama プリセットメッセージを getMessage() に移行

プライバシーポリシー再同意フロー

privacyConsent.ts に保存済み consentVersionPRIVACY_POLICY_VERSION の比較ロジックを追加しました。バージョン不一致時は hasConsented: false を返し、再同意ダイアログが表示されます。


v5.1.30 — SessionStore のさらなる信頼性強化

フラッシュ機構の改善

v5.1.29 で導入した SessionStore の書き込みは queueMicrotask ベースでした。しかし Chrome の Service Worker は queueMicrotask のコールバックが実行される前に終了する可能性があります。

v5.1.30 ではこれを setTimeout(50ms) に変更しました。50ms というタイムアウトは「十分短くバッチ効果がある」かつ「SW が終了するまでの猶予に収まる可能性が高い」バランスを意図しています。

// 変更前
queueMicrotask(() => this._flush());

// 変更後
setTimeout(() => this._flush(), 50);

合わせて以下の機能も追加しました。

  • flushNow() 公開メソッド: 重要な操作後に即座に永続化したいケースで使用
  • deleteQueue: remove()chrome.storage.session.remove() を直接呼び出すことで、書き込み済みキーの削除を正しく処理
  • フラッシュ失敗時のリトライ: フラッシュに失敗した場合はキューを復元し、次回 flush 時に再試行

スキップテスト 10 件の修正・削除

vi.spyOn の使い方の誤り、移行済みテストの残留、未有効化の境界値テストなど、10 件のスキップテストを整理しました。


まとめ

v5.1.27〜v5.1.30 で行った主な変更をまとめます。

バージョン 主な変更
v5.1.27 バージョン番号の更新
v5.1.28 Makefile のビルド順序修正、E2E テスト安定化
v5.1.29 SW 状態永続化、CSP 最小化、Prompt Injection 修正(v5.1.25)のさらなる強化、i18n 拡充
v5.1.30 SessionStore フラッシュ機構改善(setTimeout 化・リトライ)、スキップテスト修正

Discussion