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
16 changes: 8 additions & 8 deletions NotchIA.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -1277,15 +1277,15 @@
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 20809;
CURRENT_PROJECT_VERSION = 20900;
DEVELOPMENT_TEAM = "";
ENABLE_HARDENED_RUNTIME = NO;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = NotchIAXPCHelper/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = NotchIAXPCHelper;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
MACOSX_DEPLOYMENT_TARGET = 15.0;
MARKETING_VERSION = 2.8.9;
MARKETING_VERSION = 2.9.0;
PRODUCT_BUNDLE_IDENTIFIER = com.coaxel2.notchia.NotchIAXPCHelper;
PRODUCT_NAME = "$(TARGET_NAME)";
REGISTER_APP_GROUPS = YES;
Expand All @@ -1303,15 +1303,15 @@
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 20809;
CURRENT_PROJECT_VERSION = 20900;
DEVELOPMENT_TEAM = "";
ENABLE_HARDENED_RUNTIME = NO;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = NotchIAXPCHelper/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = NotchIAXPCHelper;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
MACOSX_DEPLOYMENT_TARGET = 15.0;
MARKETING_VERSION = 2.8.9;
MARKETING_VERSION = 2.9.0;
PRODUCT_BUNDLE_IDENTIFIER = com.coaxel2.notchia.NotchIAXPCHelper;
PRODUCT_NAME = "$(TARGET_NAME)";
REGISTER_APP_GROUPS = YES;
Expand Down Expand Up @@ -1462,7 +1462,7 @@
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 20809;
CURRENT_PROJECT_VERSION = 20900;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_ASSET_PATHS = "\"NotchIA/Preview Content\"";
DEVELOPMENT_TEAM = "";
Expand Down Expand Up @@ -1490,7 +1490,7 @@
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 15.0;
MARKETING_VERSION = 2.8.9;
MARKETING_VERSION = 2.9.0;
PRODUCT_BUNDLE_IDENTIFIER = com.coaxel2.notchia;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
Expand Down Expand Up @@ -1518,7 +1518,7 @@
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = YES;
CURRENT_PROJECT_VERSION = 20809;
CURRENT_PROJECT_VERSION = 20900;
DEAD_CODE_STRIPPING = YES;
DEPLOYMENT_POSTPROCESSING = YES;
DEVELOPMENT_ASSET_PATHS = "\"NotchIA/Preview Content\"";
Expand Down Expand Up @@ -1546,7 +1546,7 @@
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 15.0;
MARKETING_VERSION = 2.8.9;
MARKETING_VERSION = 2.9.0;
PRODUCT_BUNDLE_IDENTIFIER = com.coaxel2.notchia;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
Expand Down
8 changes: 7 additions & 1 deletion NotchIA/animations/drop.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,14 @@ public class NotchIAAnimations {
}

var animation: Animation {
// Spring tuné pour donner le sentiment d'une encoche qui "émerge"
// du notch hardware : durée allongée à ~0.55s + damping légèrement
// sous-amorti (0.72) pour un petit overshoot organique en fin
// de course, qui rend l'ouverture moins "directe" et plus fluide.
// Ferme aussi avec la même courbe (close() utilise withAnimation
// sans override explicite, c'est cette animation qui sert).
if #available(macOS 14.0, *), notchStyle == .notch {
Animation.spring(.bouncy(duration: 0.4))
Animation.spring(response: 0.5, dampingFraction: 0.72, blendDuration: 0.1)
} else {
Animation.timingCurve(0.16, 1, 0.3, 1, duration: 0.7)
}
Expand Down
11 changes: 1 addition & 10 deletions NotchIA/managers/ClaudeCodeManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -592,7 +592,6 @@ final class ClaudeCodeManager: ObservableObject {
}

log.info("Watching session file: \(jsonlFile.lastPathComponent)")
NSLog("[NotchIA-Diag] startWatching session=\(session.id) file=\(jsonlFile.path)")

// Seed UI from recent history first (50KB tail), then start tailing.
// Order matters: loadRecent happens before start() so the watcher
Expand All @@ -603,22 +602,16 @@ final class ClaudeCodeManager: ObservableObject {
let started = reader.start(
file: jsonlFile,
onLine: { [weak self] line in
NSLog("[NotchIA-Diag] LIVE line received (\(line.count) chars) from selected session")
self?.parseJSONLLine(line)
},
onChunkComplete: { [weak self] in
guard let self else { return }
NSLog("[NotchIA-Diag] chunk complete — state.activityStartedAt=\(self.state.activityStartedAt as Any), state.promptTokensTotal=\(self.state.promptTokensTotal)")
self.state.lastUpdateTime = Date()
self.loadRateLimitsSnapshot()
self.resetIdleTimer()
}
)
guard started else {
NSLog("[NotchIA-Diag] ❌ reader.start() returned false — TCC denied or file unreadable")
return
}
NSLog("[NotchIA-Diag] ✅ reader armed for \(jsonlFile.lastPathComponent)")
guard started else { return }

selectedSessionReader = reader
state.isConnected = true
Expand Down Expand Up @@ -1363,7 +1356,6 @@ final class ClaudeCodeManager: ObservableObject {
// isThinking=true unless `stop_reason == end_turn`
// is observed (handled below).
if let role = message["role"] as? String {
NSLog("[NotchIA-Diag] parseJSONLLine role=\(role) isLoadingHistory=\(isLoadingHistory)")
if role == "user" && !isLoadingHistory {
state.latestThinking = ""
state.isThinking = true
Expand All @@ -1372,7 +1364,6 @@ final class ClaudeCodeManager: ObservableObject {
state.lastCompletedDuration = 0
state.promptTokensTotal = 0
lastActivityTime = Date()
NSLog("[NotchIA-Diag] ⏱ CHRONO STARTED — activityStartedAt=\(state.activityStartedAt!)")
} else if role == "assistant" {
state.isThinking = true
markSelectedStateActive()
Expand Down
12 changes: 10 additions & 2 deletions NotchIA/models/NotchIAViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -162,16 +162,24 @@ class NotchIAViewModel: NSObject, ObservableObject {
let horizontalPadding: CGFloat = extendForClosedTrigger ? 30 : 0
let verticalPadding: CGFloat = extendForClosedTrigger && size.height <= 0 ? 10 : 0

// FIX bord supérieur d'écran : macOS clamp le curseur à `frame.maxY`
// quand l'utilisateur monte la souris contre le haut de l'écran.
// `CGRect.contains` est demi-ouvert sur maxY → un curseur à
// `position.y == frame.maxY` était EXCLU du rect dont le maxY
// était exactement à `frame.maxY`. Résultat : la notch ne s'ouvrait
// pas si la souris tapait le bord. On étire le rect de 6pt
// vers le haut (au-delà du bord visible) pour absorber le clamp.
let topClampMargin: CGFloat = 6
let hoverRect = CGRect(
x: frame.midX - size.width / 2 - horizontalPadding,
y: frame.maxY - size.height - verticalPadding,
width: size.width + (horizontalPadding * 2),
height: max(size.height + verticalPadding, 1)
height: max(size.height + verticalPadding + topClampMargin, 1)
)

return hoverRect.contains(position)
}

return false
}

Expand Down
20 changes: 10 additions & 10 deletions updater/appcast.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,16 @@
-->
<rss xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" version="2.0">
<channel>
<item>
<title>2.9.0</title>
<pubDate>Tue, 26 May 2026 01:13:07 +0000</pubDate>
<link>https://github.com/coaxel2/NotchIA/releases</link>
<sparkle:version>20900</sparkle:version>
<sparkle:shortVersionString>2.9.0</sparkle:shortVersionString>
<sparkle:minimumSystemVersion>15.0</sparkle:minimumSystemVersion>
<description><![CDATA[Fix hover dead zone when mouse hits screen top edge + tune open/close animation for organic emergence feel. Also cleanup diagnostic NSLogs from v2.8.9.]]></description>
<enclosure url="https://github.com/coaxel2/NotchIA/releases/download/v2.9.0/NotchIA.dmg" length="13559015" type="application/octet-stream" sparkle:edSignature="57jYjJy8CXLoqqP0Ij4YYqIavNXS4dfFkVqMu22L9tPcTaZpHv69qIElq4w6Yll28DqyYXSC/RZjSeOzrA+qBA=="/>
</item>
<item>
<title>2.8.9</title>
<pubDate>Tue, 26 May 2026 00:50:13 +0000</pubDate>
Expand All @@ -52,16 +62,6 @@
<description><![CDATA[macOS notifications on end_turn + needs-permission. Auto-switch to a more active session when current is idle > 30s.]]></description>
<enclosure url="https://github.com/coaxel2/NotchIA/releases/download/v2.8.8/NotchIA.dmg" length="13559280" type="application/octet-stream" sparkle:edSignature="jGSyXz9rsJr6Q68s2rIfF/IhAXXPKz2hlXy+w/2PosC8baUWSgRP+3kTMbH9ZwSD9DmIlcvG746QS9oyOcJODw=="/>
</item>
<item>
<title>2.8.7</title>
<pubDate>Mon, 25 May 2026 23:52:28 +0000</pubDate>
<link>https://github.com/coaxel2/NotchIA/releases</link>
<sparkle:version>20807</sparkle:version>
<sparkle:shortVersionString>2.8.7</sparkle:shortVersionString>
<sparkle:minimumSystemVersion>15.0</sparkle:minimumSystemVersion>
<description><![CDATA[5 layers of Pro gating : hidden tabs, hidden compact AI activity, no clipboard recording, no AI session scanning, no drag detector for free users.]]></description>
<enclosure url="https://github.com/coaxel2/NotchIA/releases/download/v2.8.7/NotchIA.dmg" length="13554233" type="application/octet-stream" sparkle:edSignature="05ezNoKl/jMBSYOfS9/MTWJNfWJE8MA8poho/Lt59shOca5A0wsE1lA8UC1rZgnrQMIrZKD6FHcT453oykUJCQ=="/>
</item>
<item>
<title>2.7.3</title>
<pubDate>Mon, 24 Nov 2025 08:07:37 +0000</pubDate>
Expand Down
Loading