diff --git a/apps/macos/Sources/Clawdis/SessionActions.swift b/apps/macos/Sources/Clawdis/SessionActions.swift index 177f53134..fb427cc56 100644 --- a/apps/macos/Sources/Clawdis/SessionActions.swift +++ b/apps/macos/Sources/Clawdis/SessionActions.swift @@ -5,8 +5,7 @@ enum SessionActions { static func patchSession( key: String, thinking: String?? = nil, - verbose: String?? = nil, - syncing: SessionSyncingValue?? = nil) async throws + verbose: String?? = nil) async throws { var params: [String: AnyHashable] = ["key": AnyHashable(key)] @@ -16,20 +15,6 @@ enum SessionActions { if let verbose { params["verboseLevel"] = verbose.map(AnyHashable.init) ?? AnyHashable(NSNull()) } - if let syncing { - let payload: AnyHashable = { - switch syncing { - case .none: - AnyHashable(NSNull()) - case let .some(value): - switch value { - case let .bool(v): AnyHashable(v) - case let .string(v): AnyHashable(v) - } - } - }() - params["syncing"] = payload - } _ = try await ControlChannel.shared.request(method: "sessions.patch", params: params) } diff --git a/apps/macos/Sources/Clawdis/SessionData.swift b/apps/macos/Sources/Clawdis/SessionData.swift index bb0390169..ebfbaac7f 100644 --- a/apps/macos/Sources/Clawdis/SessionData.swift +++ b/apps/macos/Sources/Clawdis/SessionData.swift @@ -1,65 +1,6 @@ import Foundation import SwiftUI -enum SessionSyncingValue: Codable, Equatable { - case bool(Bool) - case string(String) - - init(from decoder: Decoder) throws { - let container = try decoder.singleValueContainer() - if let value = try? container.decode(Bool.self) { - self = .bool(value) - return - } - if let value = try? container.decode(String.self) { - self = .string(value) - return - } - throw DecodingError.typeMismatch( - SessionSyncingValue.self, - DecodingError.Context( - codingPath: decoder.codingPath, - debugDescription: "Expected Bool or String")) - } - - func encode(to encoder: Encoder) throws { - var container = encoder.singleValueContainer() - switch self { - case let .bool(value): - try container.encode(value) - case let .string(value): - try container.encode(value) - } - } - - var isOn: Bool { - switch self { - case let .bool(value): - value - case let .string(value): - value.lowercased() == "on" - } - } - - var isOff: Bool { - switch self { - case let .bool(value): - !value - case let .string(value): - value.lowercased() == "off" - } - } - - var label: String { - switch self { - case let .bool(value): - value ? "on" : "off" - case let .string(value): - value - } - } -} - struct GatewaySessionDefaultsRecord: Codable { let model: String? let contextTokens: Int? @@ -73,7 +14,6 @@ struct GatewaySessionEntryRecord: Codable { let abortedLastRun: Bool? let thinkingLevel: String? let verboseLevel: String? - let syncing: SessionSyncingValue? let inputTokens: Int? let outputTokens: Int? let totalTokens: Int? @@ -129,7 +69,6 @@ struct SessionRow: Identifiable { let sessionId: String? let thinkingLevel: String? let verboseLevel: String? - let syncing: SessionSyncingValue? let systemSent: Bool let abortedLastRun: Bool let tokens: SessionTokenStats @@ -141,13 +80,6 @@ struct SessionRow: Identifiable { var flags: [String] = [] if let thinkingLevel { flags.append("think \(thinkingLevel)") } if let verboseLevel { flags.append("verbose \(verboseLevel)") } - if let syncing { - if syncing.isOn { - flags.append("syncing") - } else if !syncing.label.isEmpty { - flags.append("sync \(syncing.label)") - } - } if self.systemSent { flags.append("system sent") } if self.abortedLastRun { flags.append("aborted") } return flags @@ -199,7 +131,6 @@ extension SessionRow { sessionId: "sess-direct-1234", thinkingLevel: "low", verboseLevel: "info", - syncing: .bool(true), systemSent: false, abortedLastRun: false, tokens: SessionTokenStats(input: 320, output: 680, total: 1000, contextTokens: 200_000), @@ -212,7 +143,6 @@ extension SessionRow { sessionId: "sess-group-4321", thinkingLevel: "medium", verboseLevel: nil, - syncing: nil, systemSent: true, abortedLastRun: true, tokens: SessionTokenStats(input: 5000, output: 1200, total: 6200, contextTokens: 200_000), @@ -225,7 +155,6 @@ extension SessionRow { sessionId: nil, thinkingLevel: nil, verboseLevel: nil, - syncing: nil, systemSent: false, abortedLastRun: false, tokens: SessionTokenStats(input: 150, output: 220, total: 370, contextTokens: 200_000), @@ -344,7 +273,6 @@ enum SessionLoader { sessionId: entry.sessionId, thinkingLevel: entry.thinkingLevel, verboseLevel: entry.verboseLevel, - syncing: entry.syncing, systemSent: entry.systemSent ?? false, abortedLastRun: entry.abortedLastRun ?? false, tokens: SessionTokenStats( diff --git a/apps/shared/ClawdisKit/Sources/ClawdisChatUI/ChatSessions.swift b/apps/shared/ClawdisKit/Sources/ClawdisChatUI/ChatSessions.swift index 43dfdfaa6..475528275 100644 --- a/apps/shared/ClawdisKit/Sources/ClawdisChatUI/ChatSessions.swift +++ b/apps/shared/ClawdisKit/Sources/ClawdisChatUI/ChatSessions.swift @@ -5,38 +5,6 @@ public struct ClawdisChatSessionsDefaults: Codable, Sendable { public let contextTokens: Int? } -public enum ClawdisChatSessionSyncing: Codable, Hashable, Sendable { - case bool(Bool) - case string(String) - - public init(from decoder: Decoder) throws { - let container = try decoder.singleValueContainer() - if let b = try? container.decode(Bool.self) { - self = .bool(b) - return - } - if let s = try? container.decode(String.self) { - self = .string(s) - return - } - throw DecodingError.typeMismatch( - ClawdisChatSessionSyncing.self, - DecodingError.Context( - codingPath: decoder.codingPath, - debugDescription: "Expected Bool or String")) - } - - public func encode(to encoder: Encoder) throws { - var container = encoder.singleValueContainer() - switch self { - case let .bool(b): - try container.encode(b) - case let .string(s): - try container.encode(s) - } - } -} - public struct ClawdisChatSessionEntry: Codable, Identifiable, Sendable, Hashable { public var id: String { self.key } @@ -56,7 +24,6 @@ public struct ClawdisChatSessionEntry: Codable, Identifiable, Sendable, Hashable public let model: String? public let contextTokens: Int? - public let syncing: ClawdisChatSessionSyncing? } public struct ClawdisChatSessionsListResponse: Codable, Sendable { diff --git a/src/commands/status.test.ts b/src/commands/status.test.ts index 7faa799e7..ba5855b35 100644 --- a/src/commands/status.test.ts +++ b/src/commands/status.test.ts @@ -12,7 +12,6 @@ const mocks = vi.hoisted(() => ({ model: "pi:opus", sessionId: "abc123", systemSent: true, - syncing: true, }, }), resolveStorePath: vi.fn().mockReturnValue("/tmp/sessions.json"), @@ -56,7 +55,6 @@ describe("statusCommand", () => { expect(payload.sessions.recent[0].percentUsed).toBe(50); expect(payload.sessions.recent[0].remainingTokens).toBe(5000); expect(payload.sessions.recent[0].flags).toContain("verbose:on"); - expect(payload.sessions.recent[0].flags).toContain("syncing"); }); it("prints formatted lines otherwise", async () => { diff --git a/src/commands/status.ts b/src/commands/status.ts index a54eb2fa6..54de3d097 100644 --- a/src/commands/status.ts +++ b/src/commands/status.ts @@ -29,7 +29,6 @@ export type SessionStatus = { verboseLevel?: string; systemSent?: boolean; abortedLastRun?: boolean; - syncing?: boolean | string; inputTokens?: number; outputTokens?: number; totalTokens: number | null; @@ -101,7 +100,6 @@ export async function getStatusSummary(): Promise { verboseLevel: entry?.verboseLevel, systemSent: entry?.systemSent, abortedLastRun: entry?.abortedLastRun, - syncing: entry?.syncing, inputTokens: entry?.inputTokens, outputTokens: entry?.outputTokens, totalTokens: total ?? null, @@ -178,10 +176,6 @@ const buildFlags = (entry: SessionEntry): string[] => { flags.push(`verbose:${verbose}`); if (entry?.systemSent) flags.push("system"); if (entry?.abortedLastRun) flags.push("aborted"); - const syncing = entry?.syncing as unknown; - if (syncing === true || syncing === "on") flags.push("syncing"); - else if (typeof syncing === "string" && syncing) - flags.push(`sync:${syncing}`); const sessionId = entry?.sessionId as unknown; if (typeof sessionId === "string" && sessionId.length > 0) flags.push(`id:${sessionId}`); diff --git a/src/config/sessions.ts b/src/config/sessions.ts index f5d64601b..54afc10d5 100644 --- a/src/config/sessions.ts +++ b/src/config/sessions.ts @@ -25,8 +25,6 @@ export type SessionEntry = { contextTokens?: number; lastChannel?: "whatsapp" | "telegram" | "webchat"; lastTo?: string; - // Optional flag to mirror Mac app UI and future sync states. - syncing?: boolean | string; skillsSnapshot?: SessionSkillSnapshot; }; @@ -134,7 +132,6 @@ export async function updateLastRoute(params: { totalTokens: existing?.totalTokens, model: existing?.model, contextTokens: existing?.contextTokens, - syncing: existing?.syncing, skillsSnapshot: existing?.skillsSnapshot, lastChannel: channel, lastTo: to?.trim() ? to.trim() : undefined, diff --git a/src/cron/isolated-agent.ts b/src/cron/isolated-agent.ts index cf4762c6a..ec7f90236 100644 --- a/src/cron/isolated-agent.ts +++ b/src/cron/isolated-agent.ts @@ -133,7 +133,6 @@ function resolveCronSession(params: { contextTokens: entry?.contextTokens, lastChannel: entry?.lastChannel, lastTo: entry?.lastTo, - syncing: entry?.syncing, }; return { storePath, store, sessionEntry, systemSent, isNewSession: !fresh }; } diff --git a/src/gateway/protocol/schema.ts b/src/gateway/protocol/schema.ts index 72b4fa803..6445b4fc5 100644 --- a/src/gateway/protocol/schema.ts +++ b/src/gateway/protocol/schema.ts @@ -298,9 +298,6 @@ export const SessionsPatchParamsSchema = Type.Object( Type.Null(), ]), ), - syncing: Type.Optional( - Type.Union([Type.Boolean(), NonEmptyString, Type.Null()]), - ), }, { additionalProperties: false }, ); diff --git a/src/gateway/server.test.ts b/src/gateway/server.test.ts index e54f3557e..3b732d656 100644 --- a/src/gateway/server.test.ts +++ b/src/gateway/server.test.ts @@ -3506,20 +3506,6 @@ describe("gateway server", () => { expect(main2?.thinkingLevel).toBe("medium"); expect(main2?.verboseLevel).toBeUndefined(); - const syncPatched = await rpcReq<{ ok: true; key: string }>( - ws, - "sessions.patch", - { key: "main", syncing: true }, - ); - expect(syncPatched.ok).toBe(true); - - const list3 = await rpcReq<{ - sessions: Array<{ key: string; syncing?: boolean | string }>; - }>(ws, "sessions.list", {}); - expect(list3.ok).toBe(true); - const main3 = list3.payload?.sessions.find((s) => s.key === "main"); - expect(main3?.syncing).toBe(true); - const compacted = await rpcReq<{ ok: true; compacted: boolean }>( ws, "sessions.compact", diff --git a/src/gateway/server.ts b/src/gateway/server.ts index c23624a3d..6b4a1f7e6 100644 --- a/src/gateway/server.ts +++ b/src/gateway/server.ts @@ -364,7 +364,6 @@ type GatewaySessionRow = { totalTokens?: number; model?: string; contextTokens?: number; - syncing?: boolean | string; }; type SessionsListResult = { @@ -843,7 +842,6 @@ function listSessionsFromStore(params: { totalTokens: total, model: entry?.model, contextTokens: entry?.contextTokens, - syncing: entry?.syncing, } satisfies GatewaySessionRow; }) .sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0)); @@ -2014,15 +2012,6 @@ export async function startGatewayServer( } } - if ("syncing" in p) { - const raw = p.syncing; - if (raw === null) { - delete next.syncing; - } else if (raw !== undefined) { - next.syncing = raw as boolean | string; - } - } - store[key] = next; await saveSessionStore(storePath, store); const payload: SessionsPatchResult = { @@ -2066,7 +2055,6 @@ export async function startGatewayServer( abortedLastRun: false, thinkingLevel: entry?.thinkingLevel, verboseLevel: entry?.verboseLevel, - syncing: entry?.syncing, model: entry?.model, contextTokens: entry?.contextTokens, lastChannel: entry?.lastChannel, @@ -4321,15 +4309,6 @@ export async function startGatewayServer( } } - if ("syncing" in p) { - const raw = p.syncing; - if (raw === null) { - delete next.syncing; - } else if (raw !== undefined) { - next.syncing = raw as boolean | string; - } - } - store[key] = next; await saveSessionStore(storePath, store); const result: SessionsPatchResult = { @@ -4374,7 +4353,6 @@ export async function startGatewayServer( abortedLastRun: false, thinkingLevel: entry?.thinkingLevel, verboseLevel: entry?.verboseLevel, - syncing: entry?.syncing, model: entry?.model, contextTokens: entry?.contextTokens, lastChannel: entry?.lastChannel, diff --git a/ui/src/ui/types.ts b/ui/src/ui/types.ts index 52adfe050..5e45bef62 100644 --- a/ui/src/ui/types.ts +++ b/ui/src/ui/types.ts @@ -111,7 +111,6 @@ export type GatewaySessionRow = { totalTokens?: number; model?: string; contextTokens?: number; - syncing?: boolean | string; }; export type SessionsListResult = { @@ -131,7 +130,6 @@ export type SessionsPatchResult = { updatedAt?: number; thinkingLevel?: string; verboseLevel?: string; - syncing?: boolean | string; }; }; @@ -248,4 +246,3 @@ export type SkillStatusReport = { export type StatusSummary = Record; export type HealthSnapshot = Record; -