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 build → build 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.json の connect-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.jsonのpermissionsから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.ts の init() に 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 に保存済み consentVersion と PRIVACY_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