feat: add tiered channel agent and mobile Codex bridge

This commit is contained in:
冰朔 2026-08-21 08:21:03 +08:00
commit 71db11e7e8
35 changed files with 2242 additions and 76 deletions

View file

@ -45,6 +45,10 @@ struct StoredSession: Codable, Equatable {
let desktopName: String
var counter: UInt64
var cursor: UInt64
var agentConversationID: String?
var pendingAgentRequestID: String?
var pendingAgentContent: String?
var pendingAgentDestination: String?
var baseURL: URL {
URL(string: "http://\(host):\(port)")!
@ -71,6 +75,7 @@ struct SyncRequest: Codable {
let counter: UInt64
let afterCursor: UInt64?
let capture: MobileCaptureInput?
let agentMessage: MobileAgentMessageInput?
}
struct MobileCaptureInput: Codable {
@ -79,6 +84,14 @@ struct MobileCaptureInput: Codable {
let requestID: String
}
struct MobileAgentMessageInput: Codable {
let destination: String
let codexThreadID: String?
let conversationID: String?
let content: String
let requestID: String
}
struct MobileSyncSnapshot: Codable {
let schema: String
let state: String
@ -90,9 +103,43 @@ struct MobileSyncSnapshot: Codable {
let webNovel: MobileWebNovelProjection
let education: MobileEducationProjection
let recentCaptures: [MobileCaptureProjection]
let agentExchange: MobileAgentExchangeProjection?
let recentAgentExchanges: [MobileAgentExchangeProjection]
let codexTarget: MobileCodexTargetProjection?
let boundary: MobileBoundaryProjection
}
struct MobileCodexTargetProjection: Codable, Equatable {
let threadID: String
let name: String
let preview: String
let cwd: String
let updatedAtUnixSeconds: UInt64
let status: String
}
struct MobileAgentExchangeProjection: Codable, Equatable {
let requestID: String
let conversationID: String
let state: String
let stateVersion: UInt64
let reply: String
let responderNumber: String
let responderName: String
let responderKind: String
let personaBindingState: String
let toolReceipts: [MobileAgentToolReceipt]
}
struct MobileAgentToolReceipt: Codable, Equatable, Identifiable {
let toolNumber: String
let toolName: String
let targetPath: String
let contentSha256: String
let summary: String
var id: String { "\(toolNumber):\(contentSha256)" }
}
struct MobileChannelProjection: Codable {
let home: String
let growthEventCount: UInt64
@ -145,6 +192,7 @@ enum HoloLakeMobileError: LocalizedError {
case rejected(String)
case missingNonce
case missingSession
case pendingAgentRequest
case keychain(OSStatus)
var errorDescription: String? {
@ -154,6 +202,7 @@ enum HoloLakeMobileError: LocalizedError {
case .rejected(let code): return "电脑端拒绝了本次请求:\(code)"
case .missingNonce: return "加密响应缺少一次性随机数。"
case .missingSession: return "请先与电脑端 HoloLake 配对。"
case .pendingAgentRequest: return "上一条消息仍在等待电脑端回执,请先重试该消息。"
case .keychain(let status): return "本机钥匙串写入失败(\(status))。"
}
}