Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 8 additions & 12 deletions NotchIA.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,6 @@
AA3300012F2100010000BBBB /* ActiveCallManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA3300022F2100010000BBBB /* ActiveCallManager.swift */; };
AA3300032F2100010000BBBB /* FocusModeManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA3300042F2100010000BBBB /* FocusModeManager.swift */; };
AA3300072F2100020000BBBB /* ActiveCallPulseDot.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA3300062F2100020000BBBB /* ActiveCallPulseDot.swift */; };
AA4400012F2200010000CCCC /* CopilotManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA4400022F2200010000CCCC /* CopilotManager.swift */; };
AIAURA00000000000000ABCD /* AppleIntelligenceAura.swift in Sources */ = {isa = PBXBuildFile; fileRef = AIAURA00000000000000ABCE /* AppleIntelligenceAura.swift */; };
AIRPDS00000000000000ABCD /* AirPodsBatteryManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AIRPDS00000000000000ABCE /* AirPodsBatteryManager.swift */; };
ALBCAC00000000000000ABCD /* AlbumArtCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = ALBCAC00000000000000ABCE /* AlbumArtCache.swift */; };
Expand Down Expand Up @@ -339,7 +338,6 @@
AA3300022F2100010000BBBB /* ActiveCallManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActiveCallManager.swift; sourceTree = "<group>"; };
AA3300042F2100010000BBBB /* FocusModeManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FocusModeManager.swift; sourceTree = "<group>"; };
AA3300062F2100020000BBBB /* ActiveCallPulseDot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActiveCallPulseDot.swift; sourceTree = "<group>"; };
AA4400022F2200010000CCCC /* CopilotManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CopilotManager.swift; sourceTree = "<group>"; };
AIAURA00000000000000ABCE /* AppleIntelligenceAura.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleIntelligenceAura.swift; sourceTree = "<group>"; };
AIRPDS00000000000000ABCE /* AirPodsBatteryManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AirPodsBatteryManager.swift; sourceTree = "<group>"; };
ALBCAC00000000000000ABCE /* AlbumArtCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbumArtCache.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -622,7 +620,6 @@
children = (
AA3300022F2100010000BBBB /* ActiveCallManager.swift */,
AA3300042F2100010000BBBB /* FocusModeManager.swift */,
AA4400022F2200010000CCCC /* CopilotManager.swift */,
CAA100122F2000010000AAAA /* CodexManager.swift */,
BBB4112B2F0816D40007988A /* ClaudeCodeManager.swift */,
JSONLR0000000000000000A1 /* JSONLSessionReader.swift */,
Expand Down Expand Up @@ -1217,7 +1214,6 @@
B17266E32C65F7FB0031BA0D /* WhatsNewView.swift in Sources */,
14C08BB62C8DE42D000F8AA0 /* CalendarManager.swift in Sources */,
B10F84A32C6C9596009F3026 /* TestView.swift in Sources */,
AA4400012F2200010000CCCC /* CopilotManager.swift in Sources */,
1443E7F32C609DCE0027C1FC /* matters.swift in Sources */,
11C5E3162DFE88510065821E /* SettingsView.swift in Sources */,
AA3300012F2100010000BBBB /* ActiveCallManager.swift in Sources */,
Expand Down Expand Up @@ -1293,15 +1289,15 @@
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 20903;
CURRENT_PROJECT_VERSION = 20904;
DEVELOPMENT_TEAM = "";
ENABLE_HARDENED_RUNTIME = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = NotchIAXPCHelper/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = NotchIAXPCHelper;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
MACOSX_DEPLOYMENT_TARGET = 15.0;
MARKETING_VERSION = 2.9.3;
MARKETING_VERSION = 2.9.4;
PRODUCT_BUNDLE_IDENTIFIER = com.coaxel2.notchia.NotchIAXPCHelper;
PRODUCT_NAME = "$(TARGET_NAME)";
REGISTER_APP_GROUPS = YES;
Expand All @@ -1319,15 +1315,15 @@
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 20903;
CURRENT_PROJECT_VERSION = 20904;
DEVELOPMENT_TEAM = "";
ENABLE_HARDENED_RUNTIME = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = NotchIAXPCHelper/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = NotchIAXPCHelper;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
MACOSX_DEPLOYMENT_TARGET = 15.0;
MARKETING_VERSION = 2.9.3;
MARKETING_VERSION = 2.9.4;
PRODUCT_BUNDLE_IDENTIFIER = com.coaxel2.notchia.NotchIAXPCHelper;
PRODUCT_NAME = "$(TARGET_NAME)";
REGISTER_APP_GROUPS = YES;
Expand Down Expand Up @@ -1478,7 +1474,7 @@
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 20903;
CURRENT_PROJECT_VERSION = 20904;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_ASSET_PATHS = "\"NotchIA/Preview Content\"";
DEVELOPMENT_TEAM = "";
Expand Down Expand Up @@ -1506,7 +1502,7 @@
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 15.0;
MARKETING_VERSION = 2.9.3;
MARKETING_VERSION = 2.9.4;
PRODUCT_BUNDLE_IDENTIFIER = com.coaxel2.notchia;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
Expand Down Expand Up @@ -1534,7 +1530,7 @@
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = YES;
CURRENT_PROJECT_VERSION = 20903;
CURRENT_PROJECT_VERSION = 20904;
DEAD_CODE_STRIPPING = YES;
DEPLOYMENT_POSTPROCESSING = YES;
DEVELOPMENT_ASSET_PATHS = "\"NotchIA/Preview Content\"";
Expand Down Expand Up @@ -1562,7 +1558,7 @@
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 15.0;
MARKETING_VERSION = 2.9.3;
MARKETING_VERSION = 2.9.4;
PRODUCT_BUNDLE_IDENTIFIER = com.coaxel2.notchia;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
Expand Down
72 changes: 5 additions & 67 deletions NotchIA/ContentView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ struct ContentView: View {
@ObservedObject var volumeManager = VolumeManager.shared
@ObservedObject var claudeCodeManager = ClaudeCodeManager.shared
@ObservedObject var codexManager = CodexManager.shared
@ObservedObject var copilotManager = CopilotManager.shared
@ObservedObject var pomodoroManager = PomodoroManager.shared
@ObservedObject var screenLockManager = ScreenLockManager.shared
@ObservedObject var activeCallManager = ActiveCallManager.shared
Expand Down Expand Up @@ -210,20 +209,15 @@ struct ContentView: View {
private var activeCodeAssistantProvider: CodeAssistantProvider? {
let claudeActive = claudeCodeManager.hasAnySessionActivity || claudeCodeManager.state.needsPermission
let codexActive = codexManager.hasAnySessionActivity
let copilotActive = copilotManager.isActive

switch (claudeActive, codexActive, copilotActive) {
case (true, false, false):
switch (claudeActive, codexActive) {
case (true, false):
return .claudeCode
case (false, true, false):
case (false, true):
return .codex
case (false, false, true):
return .copilot
case (true, true, false):
case (true, true):
return selectedCodeAssistantProvider
case (true, false, true), (false, true, true), (true, true, true):
return selectedCodeAssistantProvider
case (false, false, false):
case (false, false):
return nil
}
}
Expand All @@ -246,15 +240,12 @@ struct ContentView: View {
// running-but-idle CLI process should not keep the notch occupied.
let claudeActive = claudeCodeManager.hasAnySessionActivity || claudeCodeManager.state.needsPermission
let codexActive = codexManager.hasAnySessionActivity
let copilotActive = copilotManager.isActive

switch selectedCodeAssistantProvider {
case .claudeCode:
return claudeActive || codexActive
case .codex:
return codexActive || claudeActive
case .copilot:
return copilotActive
}
}

Expand Down Expand Up @@ -1265,8 +1256,6 @@ struct ContentView: View {
ClaudeCodeCompactView()
case .codex:
CodexCompactView()
case .copilot:
CopilotCompactIndicatorView()
}
}

Expand Down Expand Up @@ -1363,33 +1352,6 @@ struct ContentView: View {
contextWindow: compactUsage.contextWindow,
quotaSubtitle: quotaSubtitle
)

case .copilot:
let quotaSubtitle = compactCopilotStatusSubtitle()
// Display the IDE actually hosting Copilot (Cursor / VS Code /
// Insiders) rather than a flat "Copilot" string — without this
// the user can't tell whether Copilot detection is succeeding
// for non-VS-Code editors.
let copilotProviderName: String = {
if !copilotManager.currentIDE.isEmpty { return copilotManager.currentIDE }
return "Copilot"
}()
return buildCodeAssistantCompactSummary(
providerName: copilotProviderName,
startedAt: copilotManager.isActive ? copilotManager.lastActivityTime : nil,
completedDuration: 0,
now: now,
isCompleted: false,
needsPermission: false,
activeTool: copilotManager.activeTool.map {
ToolExecution(id: "copilot-active-tool", toolName: $0, argument: nil, startTime: copilotManager.lastActivityTime, endTime: nil)
},
isThinking: copilotManager.isThinking,
hasLiveOutput: !copilotManager.latestEventText.isEmpty,
totalTokens: copilotManager.tokenUsage.totalTokens,
contextWindow: copilotManager.tokenUsage.contextWindow,
quotaSubtitle: quotaSubtitle
)
}
}

Expand Down Expand Up @@ -1527,30 +1489,6 @@ struct ContentView: View {
// the token-based subtitle derived from currentRequestTokens.
private func compactClaudeQuotaSubtitle() -> String? { nil }

private func compactCopilotStatusSubtitle() -> String? {
if copilotManager.isRateLimited {
return String(localized: "Limite atteinte")
}

if copilotManager.lastObservedUsage != nil {
return String(localized: "Dernier usage")
}

guard !copilotManager.currentSKU.isEmpty else { return nil }
return compactCopilotPlanLabel(copilotManager.currentSKU)
}

private func compactCopilotPlanLabel(_ sku: String) -> String {
switch sku {
case "monthly_subscriber_quota":
return String(localized: "Mensuel")
case "free_limited_copilot":
return String(localized: "Gratuit limité")
default:
return sku.replacingOccurrences(of: "_", with: " ")
}
}

private func compactLiveText(_ text: String?) -> String? {
guard let text else { return nil }

Expand Down
20 changes: 20 additions & 0 deletions NotchIA/Localizable.xcstrings
Original file line number Diff line number Diff line change
Expand Up @@ -4750,6 +4750,7 @@
}
},
"Agent d'édition" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
Expand Down Expand Up @@ -12704,6 +12705,7 @@
}
},
"Copilot a atteint sa limite de chat" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
Expand Down Expand Up @@ -12732,6 +12734,7 @@
}
},
"Copilot n’expose pas localement les tokens restants du compte. Seuls le plan, la limitation éventuelle et le dernier usage observé sont fiables ici." : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
Expand Down Expand Up @@ -12760,6 +12763,7 @@
}
},
"Copilot non disponible" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
Expand Down Expand Up @@ -12788,6 +12792,7 @@
}
},
"Copilot prêt" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
Expand Down Expand Up @@ -12816,6 +12821,7 @@
}
},
"Copilot prêt dans VS Code" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
Expand Down Expand Up @@ -12844,6 +12850,7 @@
}
},
"Copilot rédige une réponse" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
Expand Down Expand Up @@ -12872,6 +12879,7 @@
}
},
"Copilot travaille" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
Expand Down Expand Up @@ -12900,6 +12908,7 @@
}
},
"Copilot utilise ses outils" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
Expand Down Expand Up @@ -14851,6 +14860,7 @@
}
},
"Dernier usage" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
Expand Down Expand Up @@ -14879,6 +14889,7 @@
}
},
"Dernier usage observé" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
Expand Down Expand Up @@ -16533,6 +16544,7 @@
}
},
"Édition" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
Expand Down Expand Up @@ -16785,6 +16797,7 @@
}
},
"En attente" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
Expand Down Expand Up @@ -21071,6 +21084,7 @@
}
},
"Gratuit limité" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
Expand Down Expand Up @@ -24536,6 +24550,7 @@
}
},
"Limite atteinte" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
Expand Down Expand Up @@ -24564,6 +24579,7 @@
}
},
"Limite d'utilisation Copilot atteinte" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
Expand Down Expand Up @@ -26656,6 +26672,7 @@
}
},
"Mensuel" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
Expand Down Expand Up @@ -30912,6 +30929,7 @@
}
},
"Ouvre GitHub Copilot Chat dans VS Code" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
Expand Down Expand Up @@ -33132,6 +33150,7 @@
}
},
"Quota Copilot atteint" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
Expand Down Expand Up @@ -34876,6 +34895,7 @@
}
},
"Réponse" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
Expand Down
Loading
Loading