merge: integrate AIFabric (S2) into S3 app — unified package

- Resolve Package.swift add/add: one manifest, single AIFabric target (Sources/AI compiled once;
  no duplicate-symbol risk) + DSKit/AppFeature/DSApp + AITests + DSKitTests, AIFabric library product kept.
- import AI -> import AIFabric across AppFeature + RouterFallbackTests (S2 renamed module).
- AppModel.askMeta qualified DSKit.AskResponse (AIFabric also defines an AskResponse for RemoteDS).

swift build + swift test green (71 tests: S2 AITests + S3 DSKitTests). Frozen AIProvider interface intact.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Hyungi
2026-06-05 06:41:30 +09:00
25 changed files with 1584 additions and 61 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
import SwiftUI
import AI
import AIFabric
public extension AIProviderID {
var displayName: String {
+1 -1
View File
@@ -1,5 +1,5 @@
import Foundation
import AI
import AIFabric
/// Renderable failure (the UI never sees a raw AIRoutingError that would break the
/// "visible error, not silent fallback" contract).
+1 -1
View File
@@ -1,5 +1,5 @@
import Foundation
import AI
import AIFabric
/// The ONE composition touch-point that names MockAIProvider. When S2 ships real providers,
/// only this file changes (mockProviders -> realProviders) AIService, views, and intents stay put.
+1 -1
View File
@@ -1,5 +1,5 @@
import SwiftUI
import AI
import AIFabric
/// RAG proof page: routes corpusAsk through AIService (-> AIRouter -> MockAIProvider). Explicit backend
/// pick sets explicitProvider; an explicit-unavailable result renders a visible, non-retrying error.
+2 -2
View File
@@ -1,7 +1,7 @@
import SwiftUI
import Observation
import DSKit
import AI
import AIFabric
/// The single app-state store driving the 3-pane shell. @MainActor @Observable: mutations are
/// main-isolated; the DSClient returns Sendable models; AIService is an actor.
@@ -35,7 +35,7 @@ public final class AppModel {
public var searchResponse: SearchResponse?
public var askQuery: String = ""
public var askResult: AIResult?
public var askMeta: AskResponse?
public var askMeta: DSKit.AskResponse? // qualified: AIFabric also defines an AskResponse
public var memoList: [MemoResponse] = []
public var memoDetail: MemoResponse?
public var digest: DigestResponse?