Skip to content

revert: PR #313 + #318 (mastracode 0.14 アップグレードに伴う DiffViewer 表示崩れ)#332

Merged
MocA-Love merged 3 commits intomainfrom
revert/pr-313-mastracode-diffviewer
Apr 18, 2026
Merged

revert: PR #313 + #318 (mastracode 0.14 アップグレードに伴う DiffViewer 表示崩れ)#332
MocA-Love merged 3 commits intomainfrom
revert/pr-313-mastracode-diffviewer

Conversation

@MocA-Love
Copy link
Copy Markdown
Owner

@MocA-Love MocA-Love commented Apr 18, 2026

概要

upstream取り込み PR #313 (mastracode 0.14 + small-model refactor) とその regression 修正 #318 を revert します。

発生していた問題

PR #313 マージ後に以下の症状を確認:

  • DiffViewer の表示崩れ: diff 以外の省略された context 部分が白くなる、シンタックスハイライトが効かなくなる(WorkspaceView の Changes タブ、LightDiffViewer / MultiFileDiff 使用箇所全般)
  • ビルド時エラー: onnxruntime_binding.node の dynamic require を @rollup/plugin-commonjs が解決できず main プロセス起動失敗(mastracode が @mastra/fastembed 経由で onnxruntime-node を引き込むため)

切り分け手順

`main-test` ブランチで 10 本の upstream取り込み PR を全て revert してから 1 件ずつ un-revert し、Vite / dist キャッシュも完全クリアした状態で動作確認:

この PR の内容

  1. `d4a277e398` (fix(desktop): PR #313 small-model regression (OAuth + provider fallback) #318) を revert
  2. `0dc604093c` (upstream取り込み: mastracode 0.14 + small-model refactor (#3517) #313) を revert(workspace-creation.ts の import 競合を手動解決)
  3. `apps/desktop/runtime-dependencies.ts` に `"mastracode"` externalize エントリを保持(upstream取り込み: mastracode 0.14 + small-model refactor (#3517) #313 revert で消える onnxruntime-node ビルド回避コメント込み)

根本原因(未特定)

#313 のファイル変更自体には DiffViewer / @pierre/diffs / shiki 関連のコードは含まれない。`@pierre/diffs` や `shiki` のバージョンも不変。
mastracode `0.9.2` → `0.14.0` で発生する大量の transitive 依存(`@mastra/agent-browser`, `@mastra/stagehand`, `@mastra/fastembed`, `@browserbasehq/stagehand`, `chat@4.26.0` など)が Vite の renderer bundle / deps 最適化に副作用を与えている可能性が高い。

根本原因の深掘りは別途フォローアップで実施予定。

影響

Summary by CodeRabbit

リリースノート

  • 新機能

    • AIモデルプロバイダーの診断・状態管理機能を追加
    • 設定画面にプロバイダー管理インターフェースを追加
  • バグ修正

    • OAuth接続時のAPIキー保存の競合を解決
    • プロバイダー認証エラーのハンドリングを改善
    • OAuth認証情報の有効期限切れ検出を強化
  • 改善

    • OAuthダイアログのUIを刷新
    • モデル選択フローを最適化
    • エラーメッセージとフォールバック処理を改善

…gression"

This reverts commit d4a277e, reversing
changes made to f4b29f4.
…tracode-upgrade"

This reverts commit 0dc6040, reversing
changes made to 9b9b194.
#313 の revert で消えた mastracode externalize エントリを復元。
mastracode は @mastra/fastembed → onnxruntime-node を引き込み、
onnxruntime-node の native binding は dynamic require で読まれるため
Rollup が bundle 時に解決できず、main プロセスの起動が失敗する。
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 18, 2026

Caution

Review failed

Pull request was closed or merged during review

📝 Walkthrough

Walkthrough

モデルプロバイダー診断システムの導入、AIモデル呼び出しパイプラインの再設計(プロバイダー反復に基づく)、エラー分類メカニズムの強化、デスクトップ設定UIのリファクタリング、mastracodeの依存関係ダウングレード、および非同期関数の同期化が含まれています。

Changes

コホート / ファイル(s) 変更内容
モデルプロバイダー診断・状態管理
apps/desktop/src/lib/ai/provider-diagnostics.ts, apps/desktop/src/shared/ai/provider-status.ts, apps/desktop/src/shared/ai/provider-status.test.ts
プロバイダー診断レジストリの新規実装、ケーパビリティベースの問題追跡、classifyProviderIssue関数の追加、エラーコードと修復アクションの拡張
AIモデル呼び出しメカニズム
apps/desktop/src/lib/ai/call-small-model.ts, apps/desktop/src/lib/ai/call-small-model.test.ts
プロバイダーオブジェクト反復への変更、OAuth失効判定の追加、構造化エラー分類、診断クリアロジックの導入
ワークスペース・ブランチ名生成
apps/desktop/src/lib/trpc/routers/workspaces/utils/ai-name.ts, apps/desktop/src/lib/trpc/routers/workspaces/utils/ai-name.test.ts, apps/desktop/src/lib/trpc/routers/workspaces/utils/ai-branch-name.ts
callSmallModelへの移行、プロバイダー別ルーティング(OpenAI OAuth用にgenerateTitleFromMessageWithStreamingModelを使用)、動的フォールバック警告メッセージ
Git操作ルーター
apps/desktop/src/lib/trpc/routers/changes/git-operations.ts
コミットメッセージ生成フェーズでOpenAI OAuth認証情報検出とストリーミングモデル呼び出しの追加
モデルプロバイダーAPIエンドポイント
apps/desktop/src/lib/trpc/routers/model-providers/index.ts, apps/desktop/src/lib/trpc/routers/index.ts
新規TRPC ルーターcreateModelProvidersRouterの追加(ステータス取得と問題クリア用エンドポイント)
設定UI再設計
apps/desktop/src/renderer/routes/_authenticated/settings/models/components/ModelsSettings/ModelsSettings.tsx, apps/desktop/src/renderer/routes/_authenticated/settings/models/components/ModelsSettings/utils.ts, apps/desktop/src/renderer/routes/_authenticated/settings/models/components/ModelsSettings/components/.../*
AccountCardコンポーネント新規導入、インラインOAuth/APIキーブロックからカード型レイアウトへの移行、ConfigRowSettingsSectionのプロップ簡素化、問題クリア処理の追加
OAuthダイアログコンポーネント
apps/desktop/src/renderer/components/Chat/ChatInterface/components/ModelPicker/components/AnthropicOAuthDialog/AnthropicOAuthDialog.tsx, apps/desktop/src/renderer/components/Chat/ChatInterface/components/ModelPicker/components/OpenAIOAuthDialog/OpenAIOAuthDialog.tsx, apps/desktop/src/renderer/components/Chat/ChatInterface/components/ModelPicker/components/OAuthDialog/.../*
汎用OAuthDialogコンポーネントの削除、プロバイダー固有の完全カスタムダイアログへの置き換え、明示的な状態管理への変更
OAuthフック
apps/desktop/src/renderer/components/Chat/ChatInterface/components/ModelPicker/hooks/useAnthropicOAuth/useAnthropicOAuth.ts, apps/desktop/src/renderer/components/Chat/ChatInterface/components/ModelPicker/hooks/useOpenAIOAuth/useOpenAIOAuth.ts
TRPC キャッシュ無効化とモデルプロバイダー問題クリア処理の追加、同期フロー調整
スモールモデルプロバイダー実装移動
packages/chat/src/server/desktop/small-model/small-model.ts, packages/chat/src/server/desktop/small-model/small-model.test.ts, packages/chat/src/server/desktop/small-model/index.ts
デスクトップ固有の新規スモールモデルプロバイダー実装(Anthropic、OpenAI対応)、カスタム認証フロー、ストリーミングタイトル生成対応
タイトル生成機能拡張
packages/chat/src/server/desktop/title-generation/title-generation.ts, packages/chat/src/server/desktop/title-generation/title-generation.test.ts, packages/chat/src/server/desktop/title-generation/index.ts
generateTitleFromMessageWithStreamingModel関数の追加(ストリーミングベースのタイトル生成)
ランタイムTRPC更新
packages/chat/src/server/trpc/utils/runtime/runtime.ts, packages/chat/src/server/trpc/utils/runtime/runtime.test.ts
スモールモデルプロバイダー反復への変更、generateTitleFromMessageWithStreamingModelへの移行
認証・認証情報管理の簡素化
packages/chat/src/server/desktop/auth/anthropic/anthropic.ts, packages/chat/src/server/desktop/chat-service/auth-storage-utils.ts, packages/chat/src/server/desktop/chat-service/chat-service.ts, packages/chat/src/server/desktop/chat-service/chat-service.test.ts
非同期関数の同期化、OAuth API鍵バックアップ/復元ロジックの削除、トークン更新フローの簡素化
ホストサービス更新
packages/host-service/src/providers/model-providers/LocalModelProvider/LocalModelProvider.ts, packages/host-service/src/providers/model-providers/LocalModelProvider/utils/resolveAnthropicCredential.ts, packages/host-service/src/trpc/router/workspace-creation/utils/ai-branch-name.ts, packages/host-service/src/trpc/router/workspace-creation/workspace-creation.ts, packages/host-service/package.json
AI ブランチ名生成エンドポイント削除、@superset/chat依存削除、非同期関数の同期化
古い共有実装削除
packages/chat/src/server/shared/small-model/get-small-model.ts, packages/chat/src/server/shared/small-model/index.ts, packages/chat/src/server/shared/index.ts, packages/chat/package.json
./server/sharedサブパス削除、古いスモールモデルプロバイダーロジック削除
計画ドキュメント削除
apps/desktop/plans/done/20260415-v2-host-service-ai-branch-naming-test-plan.md, apps/desktop/plans/done/20260415-v2-host-service-ai-branch-naming.md, apps/desktop/plans/done/20260417-fix-api-key-storage-slot.md
完了した実装計画ドキュメントの削除
その他の変更
apps/desktop/package.json, apps/desktop/runtime-dependencies.ts
@mastra/core依存削除(1.25.0)、mastracode ダウングレード(0.14.0→0.9.2)、コメント削除

Sequence Diagram(s)

sequenceDiagram
    participant Client as クライアント
    participant CallSmallModel as callSmallModel
    participant ProviderLoop as プロバイダー反復
    participant Auth as 認証情報解決
    participant Model as モデル作成
    participant Invocation as モデル呼び出し
    participant Classify as エラー分類
    participant Diagnostics as 診断レジストリ

    Client->>CallSmallModel: invoke(プロバイダーリスト, ...)
    
    loop 各プロバイダー
        CallSmallModel->>ProviderLoop: 次のプロバイダーを取得
        ProviderLoop->>Auth: 認証情報を解決
        
        alt 認証情報がない
            Auth-->>Diagnostics: missing-credentials を記録
            ProviderLoop->>ProviderLoop: スキップ
        else OAuth トークン期限切れ
            Auth-->>Diagnostics: expired-credentials を記録
            ProviderLoop->>ProviderLoop: スキップ
        else 有効な認証情報
            Auth->>Model: クレデンシャルを渡す
            
            alt モデル作成成功
                Model->>Invocation: モデルで invoke() 実行
                
                alt invocation が成功
                    Invocation-->>CallSmallModel: 結果を返す
                    CallSmallModel->>Diagnostics: succeeded を記録、問題をクリア
                    CallSmallModel-->>Client: 結果を返す
                else invocation が失敗
                    Invocation->>Classify: エラーメッセージを分類
                    Classify-->>Diagnostics: unknown_error/empty_result を記録
                    ProviderLoop->>ProviderLoop: 次のプロバイダーへ
                end
            else モデル作成失敗
                Model->>Classify: 例外を分類
                Classify-->>Diagnostics: unsupported_credentials/unknown_error を記録
                ProviderLoop->>ProviderLoop: 次のプロバイダーへ
            end
        end
    end
    
    CallSmallModel-->>Client: { result: null, attempts: [...] }
Loading
sequenceDiagram
    participant UI as 設定UI
    participant TRPC as TRPCエンドポイント
    participant ChatService as ChatService
    participant Diagnostics as 診断レジストリ
    participant AuthStorage as 認証ストレージ

    UI->>TRPC: modelProviders.getStatuses をクエリ
    TRPC->>ChatService: getAnthropicAuthStatus()
    TRPC->>ChatService: getOpenAIAuthStatus()
    ChatService->>AuthStorage: 認証情報を読み取り
    AuthStorage-->>ChatService: AuthStatus を返す
    ChatService-->>TRPC: ステータス配列
    
    TRPC->>Diagnostics: 各プロバイダーの診断を取得
    Diagnostics-->>TRPC: ProviderDiagnostic[]
    
    TRPC-->>UI: { status, issue, capabilities }
    
    UI->>UI: AccountCard/ボタンの状態を派生
    
    alt ユーザーがクリアを実行
        UI->>TRPC: modelProviders.clearIssue.mutate
        TRPC->>Diagnostics: clearProviderIssue(providerId)
        TRPC->>TRPC: modelProviders.getStatuses を無効化
        TRPC-->>UI: { success: true }
        UI->>TRPC: getStatuses を再取得
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Poem

🐰 ウサギの詩

プロバイダーよ、次々と並び、
診断の光で問題をしろい、
OAuth失効も見逃さず、
タイトルはストリーミング、スムーズに流れ、
古き設定は新しく生まれ変わりぬ ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 6.12% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed PR タイトルは日本語で「revert: PR #313 + #318 (mastracode 0.14 アップグレードに伴う DiffViewer 表示崩れ)」であり、mastracode 0.14 アップグレードによる DiffViewer 表示崩れの問題が原因で、PR #313#318 をリバートするというメインの変更を明確に示しています。
Description check ✅ Passed PR の説明は、問題の詳細な背景(DiffViewer 表示崩れとビルドエラー)、切り分け手順、このリバート PR の内容(3つのポイント)、根本原因の分析、および影響の説明を含んでおり、テンプレートで定義されたセクション「Description」と「Related Issues」および変更内容が十分に記載されています。

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch revert/pr-313-mastracode-diffviewer

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@MocA-Love MocA-Love merged commit be71a6c into main Apr 18, 2026
13 of 14 checks passed
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d9cd508932

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines 19 to 22
authStorage.set(providerId, {
type: "api_key",
key: trimmedApiKey,
});
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve API key when OAuth overwrites provider credential slot

setApiKeyForProvider now saves the key only in the same providerId record used by OAuth credentials, so a user who saves an API key, signs in with OAuth, and later disconnects OAuth can lose the original key and end up fully disconnected. The OAuth login path writes OAuth data into this slot and disconnect removes it, so without a separate backup/restore path the prior API key is not recoverable after this flow.

Useful? React with 👍 / 👎.

Comment on lines +190 to +194
if (
credential.type === "oauth" &&
typeof credential.access === "string" &&
credential.access.trim().length > 0
) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Refresh Anthropic OAuth before returning expired auth-storage token

This path returns the stored Anthropic OAuth access token directly, including expired ones, without attempting refresh via auth storage. Downstream, callSmallModel treats expired OAuth as a hard failure (expired-credentials) and skips the provider, so users with refreshable Anthropic sessions are incorrectly forced into fallback/failure until manual reconnect instead of auto-refreshing.

Useful? React with 👍 / 👎.

MocA-Love added a commit that referenced this pull request Apr 18, 2026
PR #332/#333 の DiffViewer 調査で実施した `rm -rf node_modules && bun install`
に伴う lockfile の再解決。新しい transitive 依存 (mastracode 0.14 経由の
ai-sdk プロバイダ群等) が正式に記録される。
MocA-Love added a commit that referenced this pull request Apr 18, 2026
他環境の開発者にも分かるよう、Desktop アプリのビルド手順 (ローカル dev /
配布ビルド確認) と desktop-v* タグによるリリースフローを明記。
合わせて、PR #332/#333 で判明した「dependency bump 後の node_modules
フルクリーン必須」を明文化し、同じ症状 (DiffViewer セパレータ白化等) の
再発を防ぐ。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant