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
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ Programa is a fork of [cmux](https://github.com/manaflow-ai/cmux); for history p
- Clearing browser history now stays cleared after a temporary disk deletion failure or app termination.
- Escape now cancels in-progress terminal input for Japanese, Chinese, and Korean keyboards even while the command palette is still opening or has just closed.
- Cmd+D now confirms only the close alert in the window that received the shortcut, so another window's alert can no longer close the wrong tab or steal a split command.
- Launching two copies of Programa at nearly the same time now deterministically keeps the newer instance instead of allowing both processes to terminate each other.
- Concurrent Programa launches now use exact process identities and a durable per-target responsive state so overlapping contenders cannot force-close a healthy instance. Requests keep generation-owned cleanup, recognized stale state is pruned in bounded batches, live requesters are authenticated from running code, and an unresponsive instance can only be force-closed through a Cancel-first data-loss warning.
- Browser imports now treat Unicode domains and their Punycode forms as the same filter, so internationalized domains no longer silently import zero matching cookies or history entries.
- Socket automation no longer hangs on split Unicode requests or unsubscribe races, and malformed telemetry can no longer crash the app or grow retained workspace state without bounds.
- Large command output no longer deadlocks the CLI or background Git checks, and stalled Git probes now time out instead of accumulating work.
Expand Down
8 changes: 8 additions & 0 deletions GhosttyTabs.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,8 @@
NRBR0011 /* BrowserPanelWebDelegates.swift in Sources */ = {isa = PBXBuildFile; fileRef = NRBR0012 /* BrowserPanelWebDelegates.swift */; };
NRBR0013 /* BrowserUserProxySettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = NRBR0014 /* BrowserUserProxySettings.swift */; };
NRBR0015 /* IMECompositionMessageHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = NRBR0016 /* IMECompositionMessageHandler.swift */; };
NRBR0019 /* BrowserExtensionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = NRBR0020 /* BrowserExtensionManager.swift */; };
NRBR0021 /* BrowserExtensionAdapters.swift in Sources */ = {isa = PBXBuildFile; fileRef = NRBR0022 /* BrowserExtensionAdapters.swift */; };
NRBR0017 /* WebViewRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = NRBR0018 /* WebViewRepresentable.swift */; };
A5FF0013 /* BrowserDataImport.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5FF0003 /* BrowserDataImport.swift */; };
A500RG01 /* ReactGrab.swift in Sources */ = {isa = PBXBuildFile; fileRef = A500RG00 /* ReactGrab.swift */; };
Expand Down Expand Up @@ -578,6 +580,8 @@
NRBR0012 /* BrowserPanelWebDelegates.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Panels/BrowserPanelWebDelegates.swift; sourceTree = "<group>"; };
NRBR0014 /* BrowserUserProxySettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Panels/BrowserUserProxySettings.swift; sourceTree = "<group>"; };
NRBR0016 /* IMECompositionMessageHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Panels/IMECompositionMessageHandler.swift; sourceTree = "<group>"; };
NRBR0020 /* BrowserExtensionManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Panels/BrowserExtensionManager.swift; sourceTree = "<group>"; };
NRBR0022 /* BrowserExtensionAdapters.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Panels/BrowserExtensionAdapters.swift; sourceTree = "<group>"; };
NRBR0018 /* WebViewRepresentable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Panels/WebViewRepresentable.swift; sourceTree = "<group>"; };
A5FF0003 /* BrowserDataImport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Panels/BrowserDataImport.swift; sourceTree = "<group>"; };
A500RG00 /* ReactGrab.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Panels/ReactGrab.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1089,6 +1093,8 @@
NRBR0012 /* BrowserPanelWebDelegates.swift */,
NRBR0014 /* BrowserUserProxySettings.swift */,
NRBR0016 /* IMECompositionMessageHandler.swift */,
NRBR0020 /* BrowserExtensionManager.swift */,
NRBR0022 /* BrowserExtensionAdapters.swift */,
NRBR0018 /* WebViewRepresentable.swift */,
A5FF0003 /* BrowserDataImport.swift */,
A500RG00 /* ReactGrab.swift */,
Expand Down Expand Up @@ -1653,6 +1659,8 @@
NRBR0011 /* BrowserPanelWebDelegates.swift in Sources */,
NRBR0013 /* BrowserUserProxySettings.swift in Sources */,
NRBR0015 /* IMECompositionMessageHandler.swift in Sources */,
NRBR0019 /* BrowserExtensionManager.swift in Sources */,
NRBR0021 /* BrowserExtensionAdapters.swift in Sources */,
NRBR0017 /* WebViewRepresentable.swift in Sources */,
A5FF0013 /* BrowserDataImport.swift in Sources */,
A500RG01 /* ReactGrab.swift in Sources */,
Expand Down
57 changes: 57 additions & 0 deletions Resources/Localizable.xcstrings
Original file line number Diff line number Diff line change
Expand Up @@ -5718,6 +5718,12 @@
"state": "translated",
"value": "Cancel"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "キャンセル"
}
}
}
},
Expand Down Expand Up @@ -7392,6 +7398,57 @@
}
}
},
"dialog.singleInstanceNotResponding.forceClose": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Force Close"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "強制終了"
}
}
}
},
"dialog.singleInstanceNotResponding.message": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "The existing Programa instance is not responding. Force closing it may lose unsaved terminal or session state."
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "既存のProgramaインスタンスが応答していません。強制終了すると、保存されていないターミナルまたはセッションの状態が失われる可能性があります。"
}
}
}
},
"dialog.singleInstanceNotResponding.title": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Programa Isn’t Responding"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "Programaが応答していません"
}
}
}
},
"error.clipboardFolderPath": {
"extractionState": "manual",
"localizations": {
Expand Down
Loading
Loading