Any new-tab target (new agent, terminal, browser, or a terminal profile) can be pinned as a quick-launch button. Pins are global client app state (persisted), not daemon config, so the same set shows on every workspace; profile pins resolve per host and are dropped where that profile is absent. The sidebar mirror launches via a navigate-then-launch intent store rather than calling the create handlers directly: terminal creation only works in the mounted/focused workspace, so the sidebar requests the launch and the workspace screen consumes it on focus.
39 lines
1.0 KiB
TypeScript
39 lines
1.0 KiB
TypeScript
import type { TerminalProfile } from "@getpaseo/protocol/messages";
|
|
import type { TerminalProfileInput } from "@/screens/workspace/terminals/use-workspace-terminals";
|
|
import type { PinnedTabTarget } from "@/workspace-pins/target";
|
|
|
|
export interface TabTargetHandlers {
|
|
createDraft: () => void;
|
|
createTerminal: () => void;
|
|
createBrowser: () => void;
|
|
createTerminalWithProfile: (profile: TerminalProfileInput) => void;
|
|
}
|
|
|
|
export function runPinnedTabTarget(
|
|
target: PinnedTabTarget,
|
|
profiles: readonly TerminalProfile[],
|
|
handlers: TabTargetHandlers,
|
|
): void {
|
|
if (target.kind === "draft") {
|
|
handlers.createDraft();
|
|
return;
|
|
}
|
|
if (target.kind === "terminal") {
|
|
handlers.createTerminal();
|
|
return;
|
|
}
|
|
if (target.kind === "browser") {
|
|
handlers.createBrowser();
|
|
return;
|
|
}
|
|
const profile = profiles.find((entry) => entry.id === target.profileId);
|
|
if (!profile) {
|
|
return;
|
|
}
|
|
handlers.createTerminalWithProfile({
|
|
name: profile.name,
|
|
command: profile.command,
|
|
args: profile.args,
|
|
});
|
|
}
|