feat(shortcuts): make clipboard-video-append shortcut configurable (#158)

This commit is contained in:
2026-07-11 23:36:44 -07:00
committed by GitHub
parent 8797719a09
commit 6ab3d823a4
26 changed files with 87 additions and 18 deletions
@@ -33,6 +33,7 @@ function makeShortcuts(overrides: Partial<ConfiguredShortcuts> = {}): Configured
openControllerDebug: null,
toggleSubtitleSidebar: null,
toggleNotificationHistory: null,
appendClipboardVideoToQueue: null,
...overrides,
};
}
@@ -28,6 +28,7 @@ function createShortcuts(overrides: Partial<ConfiguredShortcuts> = {}): Configur
openControllerDebug: null,
toggleSubtitleSidebar: null,
toggleNotificationHistory: null,
appendClipboardVideoToQueue: null,
...overrides,
};
}
@@ -26,6 +26,7 @@ function createDeps(overrides: Partial<SessionActionExecutorDeps> = {}) {
toggleSecondarySub: () => calls.push('secondary'),
toggleSubtitleSidebar: () => calls.push('sidebar'),
toggleNotificationHistory: () => calls.push('notification-history'),
appendClipboardVideoToQueue: () => calls.push('append-clipboard-video'),
markLastCardAsAudioCard: async () => {
calls.push('audio');
},
+4
View File
@@ -15,6 +15,7 @@ export interface SessionActionExecutorDeps {
toggleSecondarySub: () => void;
toggleSubtitleSidebar: () => void;
toggleNotificationHistory: () => void;
appendClipboardVideoToQueue: () => void;
markLastCardAsAudioCard: () => Promise<void>;
markActiveVideoWatched: () => Promise<boolean>;
openRuntimeOptionsPalette: () => void;
@@ -82,6 +83,9 @@ export async function dispatchSessionAction(
case 'toggleNotificationHistory':
deps.toggleNotificationHistory();
return;
case 'appendClipboardVideoToQueue':
deps.appendClipboardVideoToQueue();
return;
case 'markAudioCard':
await deps.markLastCardAsAudioCard();
return;
@@ -27,6 +27,7 @@ function createShortcuts(overrides: Partial<ConfiguredShortcuts> = {}): Configur
openControllerDebug: null,
toggleSubtitleSidebar: null,
toggleNotificationHistory: null,
appendClipboardVideoToQueue: null,
...overrides,
};
}
@@ -515,6 +516,8 @@ test('compileSessionBindings wires every configured shortcut key into the shared
'openControllerSelect',
'openControllerDebug',
'toggleSubtitleSidebar',
'toggleNotificationHistory',
'appendClipboardVideoToQueue',
];
const shortcuts = createShortcuts();
shortcutKeys.forEach((key, index) => {
@@ -582,6 +585,42 @@ test('buildPluginSessionBindingsArtifact emits CLI args for plugin-bound session
});
});
test('appendClipboardVideoToQueue shortcut compiles to a session action with plugin CLI args', () => {
const result = compileSessionBindings({
shortcuts: createShortcuts({
appendClipboardVideoToQueue: 'CommandOrControl+A',
}),
keybindings: [],
platform: 'linux',
});
assert.deepEqual(result.warnings, []);
const binding = result.bindings.find(
(candidate) =>
candidate.actionType === 'session-action' &&
candidate.actionId === 'appendClipboardVideoToQueue',
);
assert.ok(binding);
assert.deepEqual(binding.key, { code: 'KeyA', modifiers: ['ctrl'] });
const artifact = buildPluginSessionBindingsArtifact({
bindings: result.bindings,
warnings: result.warnings,
numericSelectionTimeoutMs: 2500,
now: new Date('2026-05-26T00:00:00.000Z'),
});
const pluginBinding = artifact.bindings.find(
(candidate) =>
candidate.actionType === 'session-action' &&
candidate.actionId === 'appendClipboardVideoToQueue',
);
assert.ok(pluginBinding && 'cliArgs' in pluginBinding);
assert.equal(pluginBinding.cliArgs?.[0], '--session-action');
assert.deepEqual(JSON.parse(pluginBinding.cliArgs?.[1] ?? ''), {
actionId: 'appendClipboardVideoToQueue',
});
});
test('buildPluginSessionBindingsArtifact preserves plugin selector CLI for no-count multi-line actions', () => {
const result = compileSessionBindings({
shortcuts: createShortcuts({
+1
View File
@@ -60,6 +60,7 @@ const SESSION_SHORTCUT_ACTIONS: Array<{
{ key: 'openControllerDebug', actionId: 'openControllerDebug' },
{ key: 'toggleSubtitleSidebar', actionId: 'toggleSubtitleSidebar' },
{ key: 'toggleNotificationHistory', actionId: 'toggleNotificationHistory' },
{ key: 'appendClipboardVideoToQueue', actionId: 'appendClipboardVideoToQueue' },
];
function normalizeModifiers(modifiers: SessionKeyModifier[]): SessionKeyModifier[] {