feat(cli): enable notifications cross-platform via terminal bell fallback (#21618)
Co-authored-by: Sandy Tao <sandytao520@icloud.com>
@@ -15,14 +15,14 @@ CLI works in the background.
|
|||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
Currently, system notifications are only supported on macOS.
|
|
||||||
|
|
||||||
### Terminal support
|
### Terminal support
|
||||||
|
|
||||||
The CLI uses the OSC 9 terminal escape sequence to trigger system notifications.
|
The CLI uses the OSC 9 terminal escape sequence to trigger system notifications.
|
||||||
This is supported by several modern terminal emulators. If your terminal does
|
This is supported by several modern terminal emulators including iTerm2,
|
||||||
not support OSC 9 notifications, Gemini CLI falls back to a system alert sound
|
WezTerm, Ghostty, and Kitty. If your terminal does not support OSC 9
|
||||||
to get your attention.
|
notifications, Gemini CLI falls back to a terminal bell (BEL) to get your
|
||||||
|
attention. Most terminals respond to BEL with a taskbar flash or system alert
|
||||||
|
sound.
|
||||||
|
|
||||||
## Enable notifications
|
## Enable notifications
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ they appear in the UI.
|
|||||||
| Vim Mode | `general.vimMode` | Enable Vim keybindings | `false` |
|
| Vim Mode | `general.vimMode` | Enable Vim keybindings | `false` |
|
||||||
| Default Approval Mode | `general.defaultApprovalMode` | The default approval mode for tool execution. 'default' prompts for approval, 'auto_edit' auto-approves edit tools, and 'plan' is read-only mode. YOLO mode (auto-approve all actions) can only be enabled via command line (--yolo or --approval-mode=yolo). | `"default"` |
|
| Default Approval Mode | `general.defaultApprovalMode` | The default approval mode for tool execution. 'default' prompts for approval, 'auto_edit' auto-approves edit tools, and 'plan' is read-only mode. YOLO mode (auto-approve all actions) can only be enabled via command line (--yolo or --approval-mode=yolo). | `"default"` |
|
||||||
| Enable Auto Update | `general.enableAutoUpdate` | Enable automatic updates. | `true` |
|
| Enable Auto Update | `general.enableAutoUpdate` | Enable automatic updates. | `true` |
|
||||||
| Enable Notifications | `general.enableNotifications` | Enable run-event notifications for action-required prompts and session completion. Currently macOS only. | `false` |
|
| Enable Notifications | `general.enableNotifications` | Enable run-event notifications for action-required prompts and session completion. | `false` |
|
||||||
| Plan Directory | `general.plan.directory` | The directory where planning artifacts are stored. If not specified, defaults to the system temporary directory. A custom directory requires a policy to allow write access in Plan Mode. | `undefined` |
|
| Plan Directory | `general.plan.directory` | The directory where planning artifacts are stored. If not specified, defaults to the system temporary directory. A custom directory requires a policy to allow write access in Plan Mode. | `undefined` |
|
||||||
| Plan Model Routing | `general.plan.modelRouting` | Automatically switch between Pro and Flash models based on Plan Mode status. Uses Pro for the planning phase and Flash for the implementation phase. | `true` |
|
| Plan Model Routing | `general.plan.modelRouting` | Automatically switch between Pro and Flash models based on Plan Mode status. Uses Pro for the planning phase and Flash for the implementation phase. | `true` |
|
||||||
| Retry Fetch Errors | `general.retryFetchErrors` | Retry on "exception TypeError: fetch failed sending request" errors. | `true` |
|
| Retry Fetch Errors | `general.retryFetchErrors` | Retry on "exception TypeError: fetch failed sending request" errors. | `true` |
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
|
|
||||||
- **`general.enableNotifications`** (boolean):
|
- **`general.enableNotifications`** (boolean):
|
||||||
- **Description:** Enable run-event notifications for action-required prompts
|
- **Description:** Enable run-event notifications for action-required prompts
|
||||||
and session completion. Currently macOS only.
|
and session completion.
|
||||||
- **Default:** `false`
|
- **Default:** `false`
|
||||||
|
|
||||||
- **`general.checkpointing.enabled`** (boolean):
|
- **`general.checkpointing.enabled`** (boolean):
|
||||||
|
|||||||
@@ -261,7 +261,7 @@ const SETTINGS_SCHEMA = {
|
|||||||
requiresRestart: false,
|
requiresRestart: false,
|
||||||
default: false,
|
default: false,
|
||||||
description:
|
description:
|
||||||
'Enable run-event notifications for action-required prompts and session completion. Currently macOS only.',
|
'Enable run-event notifications for action-required prompts and session completion.',
|
||||||
showInDialog: true,
|
showInDialog: true,
|
||||||
},
|
},
|
||||||
checkpointing: {
|
checkpointing: {
|
||||||
|
|||||||
@@ -71,7 +71,7 @@
|
|||||||
<text x="828" y="308" fill="#afafaf" textLength="45" lengthAdjust="spacingAndGlyphs">false</text>
|
<text x="828" y="308" fill="#afafaf" textLength="45" lengthAdjust="spacingAndGlyphs">false</text>
|
||||||
<text x="891" y="308" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="308" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="0" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="0" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="45" y="325" fill="#afafaf" textLength="756" lengthAdjust="spacingAndGlyphs">Enable run-event notifications for action-required prompts and session completion. …</text>
|
<text x="45" y="325" fill="#afafaf" textLength="738" lengthAdjust="spacingAndGlyphs">Enable run-event notifications for action-required prompts and session completion.</text>
|
||||||
<text x="891" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="0" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="0" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="891" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
@@ -71,7 +71,7 @@
|
|||||||
<text x="828" y="308" fill="#afafaf" textLength="45" lengthAdjust="spacingAndGlyphs">false</text>
|
<text x="828" y="308" fill="#afafaf" textLength="45" lengthAdjust="spacingAndGlyphs">false</text>
|
||||||
<text x="891" y="308" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="308" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="0" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="0" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="45" y="325" fill="#afafaf" textLength="756" lengthAdjust="spacingAndGlyphs">Enable run-event notifications for action-required prompts and session completion. …</text>
|
<text x="45" y="325" fill="#afafaf" textLength="738" lengthAdjust="spacingAndGlyphs">Enable run-event notifications for action-required prompts and session completion.</text>
|
||||||
<text x="891" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="0" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="0" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="891" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
@@ -71,7 +71,7 @@
|
|||||||
<text x="828" y="308" fill="#afafaf" textLength="45" lengthAdjust="spacingAndGlyphs">false</text>
|
<text x="828" y="308" fill="#afafaf" textLength="45" lengthAdjust="spacingAndGlyphs">false</text>
|
||||||
<text x="891" y="308" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="308" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="0" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="0" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="45" y="325" fill="#afafaf" textLength="756" lengthAdjust="spacingAndGlyphs">Enable run-event notifications for action-required prompts and session completion. …</text>
|
<text x="45" y="325" fill="#afafaf" textLength="738" lengthAdjust="spacingAndGlyphs">Enable run-event notifications for action-required prompts and session completion.</text>
|
||||||
<text x="891" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="0" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="0" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="891" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
@@ -71,7 +71,7 @@
|
|||||||
<text x="828" y="308" fill="#afafaf" textLength="45" lengthAdjust="spacingAndGlyphs">false</text>
|
<text x="828" y="308" fill="#afafaf" textLength="45" lengthAdjust="spacingAndGlyphs">false</text>
|
||||||
<text x="891" y="308" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="308" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="0" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="0" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="45" y="325" fill="#afafaf" textLength="756" lengthAdjust="spacingAndGlyphs">Enable run-event notifications for action-required prompts and session completion. …</text>
|
<text x="45" y="325" fill="#afafaf" textLength="738" lengthAdjust="spacingAndGlyphs">Enable run-event notifications for action-required prompts and session completion.</text>
|
||||||
<text x="891" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="0" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="0" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="891" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
@@ -71,7 +71,7 @@
|
|||||||
<text x="828" y="308" fill="#afafaf" textLength="45" lengthAdjust="spacingAndGlyphs">false</text>
|
<text x="828" y="308" fill="#afafaf" textLength="45" lengthAdjust="spacingAndGlyphs">false</text>
|
||||||
<text x="891" y="308" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="308" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="0" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="0" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="45" y="325" fill="#afafaf" textLength="756" lengthAdjust="spacingAndGlyphs">Enable run-event notifications for action-required prompts and session completion. …</text>
|
<text x="45" y="325" fill="#afafaf" textLength="738" lengthAdjust="spacingAndGlyphs">Enable run-event notifications for action-required prompts and session completion.</text>
|
||||||
<text x="891" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="0" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="0" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="891" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
@@ -60,7 +60,7 @@
|
|||||||
<text x="828" y="308" fill="#afafaf" textLength="45" lengthAdjust="spacingAndGlyphs">false</text>
|
<text x="828" y="308" fill="#afafaf" textLength="45" lengthAdjust="spacingAndGlyphs">false</text>
|
||||||
<text x="891" y="308" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="308" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="0" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="0" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="45" y="325" fill="#afafaf" textLength="756" lengthAdjust="spacingAndGlyphs">Enable run-event notifications for action-required prompts and session completion. …</text>
|
<text x="45" y="325" fill="#afafaf" textLength="738" lengthAdjust="spacingAndGlyphs">Enable run-event notifications for action-required prompts and session completion.</text>
|
||||||
<text x="891" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="0" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="0" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="891" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
@@ -71,7 +71,7 @@
|
|||||||
<text x="828" y="308" fill="#afafaf" textLength="45" lengthAdjust="spacingAndGlyphs">false</text>
|
<text x="828" y="308" fill="#afafaf" textLength="45" lengthAdjust="spacingAndGlyphs">false</text>
|
||||||
<text x="891" y="308" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="308" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="0" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="0" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="45" y="325" fill="#afafaf" textLength="756" lengthAdjust="spacingAndGlyphs">Enable run-event notifications for action-required prompts and session completion. …</text>
|
<text x="45" y="325" fill="#afafaf" textLength="738" lengthAdjust="spacingAndGlyphs">Enable run-event notifications for action-required prompts and session completion.</text>
|
||||||
<text x="891" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="0" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="0" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="891" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
@@ -71,7 +71,7 @@
|
|||||||
<text x="828" y="308" fill="#afafaf" textLength="45" lengthAdjust="spacingAndGlyphs">false</text>
|
<text x="828" y="308" fill="#afafaf" textLength="45" lengthAdjust="spacingAndGlyphs">false</text>
|
||||||
<text x="891" y="308" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="308" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="0" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="0" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="45" y="325" fill="#afafaf" textLength="756" lengthAdjust="spacingAndGlyphs">Enable run-event notifications for action-required prompts and session completion. …</text>
|
<text x="45" y="325" fill="#afafaf" textLength="738" lengthAdjust="spacingAndGlyphs">Enable run-event notifications for action-required prompts and session completion.</text>
|
||||||
<text x="891" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="0" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="0" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="891" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
@@ -71,7 +71,7 @@
|
|||||||
<text x="828" y="308" fill="#afafaf" textLength="45" lengthAdjust="spacingAndGlyphs">false</text>
|
<text x="828" y="308" fill="#afafaf" textLength="45" lengthAdjust="spacingAndGlyphs">false</text>
|
||||||
<text x="891" y="308" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="308" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="0" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="0" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="45" y="325" fill="#afafaf" textLength="756" lengthAdjust="spacingAndGlyphs">Enable run-event notifications for action-required prompts and session completion. …</text>
|
<text x="45" y="325" fill="#afafaf" textLength="738" lengthAdjust="spacingAndGlyphs">Enable run-event notifications for action-required prompts and session completion.</text>
|
||||||
<text x="891" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="325" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="0" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="0" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
<text x="891" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
<text x="891" y="342" fill="#878787" textLength="9" lengthAdjust="spacingAndGlyphs">│</text>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
@@ -20,7 +20,7 @@ exports[`SettingsDialog > Initial Rendering > should render settings list with v
|
|||||||
│ Enable automatic updates. │
|
│ Enable automatic updates. │
|
||||||
│ │
|
│ │
|
||||||
│ Enable Notifications false │
|
│ Enable Notifications false │
|
||||||
│ Enable run-event notifications for action-required prompts and session completion. … │
|
│ Enable run-event notifications for action-required prompts and session completion. │
|
||||||
│ │
|
│ │
|
||||||
│ Plan Directory undefined │
|
│ Plan Directory undefined │
|
||||||
│ The directory where planning artifacts are stored. If not specified, defaults t… │
|
│ The directory where planning artifacts are stored. If not specified, defaults t… │
|
||||||
@@ -66,7 +66,7 @@ exports[`SettingsDialog > Snapshot Tests > should render 'accessibility settings
|
|||||||
│ Enable automatic updates. │
|
│ Enable automatic updates. │
|
||||||
│ │
|
│ │
|
||||||
│ Enable Notifications false │
|
│ Enable Notifications false │
|
||||||
│ Enable run-event notifications for action-required prompts and session completion. … │
|
│ Enable run-event notifications for action-required prompts and session completion. │
|
||||||
│ │
|
│ │
|
||||||
│ Plan Directory undefined │
|
│ Plan Directory undefined │
|
||||||
│ The directory where planning artifacts are stored. If not specified, defaults t… │
|
│ The directory where planning artifacts are stored. If not specified, defaults t… │
|
||||||
@@ -112,7 +112,7 @@ exports[`SettingsDialog > Snapshot Tests > should render 'all boolean settings d
|
|||||||
│ Enable automatic updates. │
|
│ Enable automatic updates. │
|
||||||
│ │
|
│ │
|
||||||
│ Enable Notifications false │
|
│ Enable Notifications false │
|
||||||
│ Enable run-event notifications for action-required prompts and session completion. … │
|
│ Enable run-event notifications for action-required prompts and session completion. │
|
||||||
│ │
|
│ │
|
||||||
│ Plan Directory undefined │
|
│ Plan Directory undefined │
|
||||||
│ The directory where planning artifacts are stored. If not specified, defaults t… │
|
│ The directory where planning artifacts are stored. If not specified, defaults t… │
|
||||||
@@ -158,7 +158,7 @@ exports[`SettingsDialog > Snapshot Tests > should render 'default state' correct
|
|||||||
│ Enable automatic updates. │
|
│ Enable automatic updates. │
|
||||||
│ │
|
│ │
|
||||||
│ Enable Notifications false │
|
│ Enable Notifications false │
|
||||||
│ Enable run-event notifications for action-required prompts and session completion. … │
|
│ Enable run-event notifications for action-required prompts and session completion. │
|
||||||
│ │
|
│ │
|
||||||
│ Plan Directory undefined │
|
│ Plan Directory undefined │
|
||||||
│ The directory where planning artifacts are stored. If not specified, defaults t… │
|
│ The directory where planning artifacts are stored. If not specified, defaults t… │
|
||||||
@@ -204,7 +204,7 @@ exports[`SettingsDialog > Snapshot Tests > should render 'file filtering setting
|
|||||||
│ Enable automatic updates. │
|
│ Enable automatic updates. │
|
||||||
│ │
|
│ │
|
||||||
│ Enable Notifications false │
|
│ Enable Notifications false │
|
||||||
│ Enable run-event notifications for action-required prompts and session completion. … │
|
│ Enable run-event notifications for action-required prompts and session completion. │
|
||||||
│ │
|
│ │
|
||||||
│ Plan Directory undefined │
|
│ Plan Directory undefined │
|
||||||
│ The directory where planning artifacts are stored. If not specified, defaults t… │
|
│ The directory where planning artifacts are stored. If not specified, defaults t… │
|
||||||
@@ -250,7 +250,7 @@ exports[`SettingsDialog > Snapshot Tests > should render 'focused on scope selec
|
|||||||
│ Enable automatic updates. │
|
│ Enable automatic updates. │
|
||||||
│ │
|
│ │
|
||||||
│ Enable Notifications false │
|
│ Enable Notifications false │
|
||||||
│ Enable run-event notifications for action-required prompts and session completion. … │
|
│ Enable run-event notifications for action-required prompts and session completion. │
|
||||||
│ │
|
│ │
|
||||||
│ Plan Directory undefined │
|
│ Plan Directory undefined │
|
||||||
│ The directory where planning artifacts are stored. If not specified, defaults t… │
|
│ The directory where planning artifacts are stored. If not specified, defaults t… │
|
||||||
@@ -296,7 +296,7 @@ exports[`SettingsDialog > Snapshot Tests > should render 'mixed boolean and numb
|
|||||||
│ Enable automatic updates. │
|
│ Enable automatic updates. │
|
||||||
│ │
|
│ │
|
||||||
│ Enable Notifications false │
|
│ Enable Notifications false │
|
||||||
│ Enable run-event notifications for action-required prompts and session completion. … │
|
│ Enable run-event notifications for action-required prompts and session completion. │
|
||||||
│ │
|
│ │
|
||||||
│ Plan Directory undefined │
|
│ Plan Directory undefined │
|
||||||
│ The directory where planning artifacts are stored. If not specified, defaults t… │
|
│ The directory where planning artifacts are stored. If not specified, defaults t… │
|
||||||
@@ -342,7 +342,7 @@ exports[`SettingsDialog > Snapshot Tests > should render 'tools and security set
|
|||||||
│ Enable automatic updates. │
|
│ Enable automatic updates. │
|
||||||
│ │
|
│ │
|
||||||
│ Enable Notifications false │
|
│ Enable Notifications false │
|
||||||
│ Enable run-event notifications for action-required prompts and session completion. … │
|
│ Enable run-event notifications for action-required prompts and session completion. │
|
||||||
│ │
|
│ │
|
||||||
│ Plan Directory undefined │
|
│ Plan Directory undefined │
|
||||||
│ The directory where planning artifacts are stored. If not specified, defaults t… │
|
│ The directory where planning artifacts are stored. If not specified, defaults t… │
|
||||||
@@ -388,7 +388,7 @@ exports[`SettingsDialog > Snapshot Tests > should render 'various boolean settin
|
|||||||
│ Enable automatic updates. │
|
│ Enable automatic updates. │
|
||||||
│ │
|
│ │
|
||||||
│ Enable Notifications false │
|
│ Enable Notifications false │
|
||||||
│ Enable run-event notifications for action-required prompts and session completion. … │
|
│ Enable run-event notifications for action-required prompts and session completion. │
|
||||||
│ │
|
│ │
|
||||||
│ Plan Directory undefined │
|
│ Plan Directory undefined │
|
||||||
│ The directory where planning artifacts are stored. If not specified, defaults t… │
|
│ The directory where planning artifacts are stored. If not specified, defaults t… │
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ describe('terminal notifications', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('returns false without writing on non-macOS platforms', async () => {
|
it('emits notification on non-macOS platforms', async () => {
|
||||||
Object.defineProperty(process, 'platform', {
|
Object.defineProperty(process, 'platform', {
|
||||||
value: 'linux',
|
value: 'linux',
|
||||||
configurable: true,
|
configurable: true,
|
||||||
@@ -54,8 +54,8 @@ describe('terminal notifications', () => {
|
|||||||
body: 'b',
|
body: 'b',
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(shown).toBe(false);
|
expect(shown).toBe(true);
|
||||||
expect(writeToStdout).not.toHaveBeenCalled();
|
expect(writeToStdout).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('returns false without writing when disabled', async () => {
|
it('returns false without writing when disabled', async () => {
|
||||||
@@ -69,6 +69,7 @@ describe('terminal notifications', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('emits OSC 9 notification when supported terminal is detected', async () => {
|
it('emits OSC 9 notification when supported terminal is detected', async () => {
|
||||||
|
vi.stubEnv('WT_SESSION', '');
|
||||||
vi.stubEnv('TERM_PROGRAM', 'iTerm.app');
|
vi.stubEnv('TERM_PROGRAM', 'iTerm.app');
|
||||||
|
|
||||||
const shown = await notifyViaTerminal(true, {
|
const shown = await notifyViaTerminal(true, {
|
||||||
@@ -126,6 +127,7 @@ describe('terminal notifications', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('strips terminal control sequences and newlines from payload text', async () => {
|
it('strips terminal control sequences and newlines from payload text', async () => {
|
||||||
|
vi.stubEnv('WT_SESSION', '');
|
||||||
vi.stubEnv('TERM_PROGRAM', 'iTerm.app');
|
vi.stubEnv('TERM_PROGRAM', 'iTerm.app');
|
||||||
|
|
||||||
const shown = await notifyViaTerminal(true, {
|
const shown = await notifyViaTerminal(true, {
|
||||||
|
|||||||
@@ -75,17 +75,10 @@ export function buildRunEventNotificationContent(
|
|||||||
|
|
||||||
export function isNotificationsEnabled(settings: LoadedSettings): boolean {
|
export function isNotificationsEnabled(settings: LoadedSettings): boolean {
|
||||||
const general = settings.merged.general as
|
const general = settings.merged.general as
|
||||||
| {
|
| { enableNotifications?: boolean }
|
||||||
enableNotifications?: boolean;
|
|
||||||
enableMacOsNotifications?: boolean;
|
|
||||||
}
|
|
||||||
| undefined;
|
| undefined;
|
||||||
|
|
||||||
return (
|
return general?.enableNotifications === true;
|
||||||
process.platform === 'darwin' &&
|
|
||||||
(general?.enableNotifications === true ||
|
|
||||||
general?.enableMacOsNotifications === true)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildTerminalNotificationMessage(
|
function buildTerminalNotificationMessage(
|
||||||
@@ -112,7 +105,7 @@ export async function notifyViaTerminal(
|
|||||||
notificationsEnabled: boolean,
|
notificationsEnabled: boolean,
|
||||||
content: RunEventNotificationContent,
|
content: RunEventNotificationContent,
|
||||||
): Promise<boolean> {
|
): Promise<boolean> {
|
||||||
if (!notificationsEnabled || process.platform !== 'darwin') {
|
if (!notificationsEnabled) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -93,8 +93,8 @@
|
|||||||
},
|
},
|
||||||
"enableNotifications": {
|
"enableNotifications": {
|
||||||
"title": "Enable Notifications",
|
"title": "Enable Notifications",
|
||||||
"description": "Enable run-event notifications for action-required prompts and session completion. Currently macOS only.",
|
"description": "Enable run-event notifications for action-required prompts and session completion.",
|
||||||
"markdownDescription": "Enable run-event notifications for action-required prompts and session completion. Currently macOS only.\n\n- Category: `General`\n- Requires restart: `no`\n- Default: `false`",
|
"markdownDescription": "Enable run-event notifications for action-required prompts and session completion.\n\n- Category: `General`\n- Requires restart: `no`\n- Default: `false`",
|
||||||
"default": false,
|
"default": false,
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
},
|
},
|
||||||
|
|||||||