From a99aa04f2919094e41001acc9b2d9be0d0c538a1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 12 May 2026 03:52:26 +0000 Subject: [PATCH 1/8] Initial plan From 1b0bec1dbdba50fb166546d34a09dfea10df5c7a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 12 May 2026 04:03:49 +0000 Subject: [PATCH 2/8] Implement shared command list and edit dialog behavior changes Agent-Logs-Url: https://github.com/ujiro99/selection-command/sessions/602832e4-7031-485e-b714-13ff9188de16 Co-authored-by: ujiro99 <677231+ujiro99@users.noreply.github.com> --- .../public/_locales/de/messages.json | 3 + .../public/_locales/en/messages.json | 4 ++ .../public/_locales/es/messages.json | 3 + .../public/_locales/fr/messages.json | 3 + .../public/_locales/hi/messages.json | 3 + .../public/_locales/id/messages.json | 3 + .../public/_locales/it/messages.json | 3 + .../public/_locales/ja/messages.json | 3 + .../public/_locales/ko/messages.json | 3 + .../public/_locales/ms/messages.json | 3 + .../public/_locales/pt_BR/messages.json | 3 + .../public/_locales/pt_PT/messages.json | 3 + .../public/_locales/ru/messages.json | 3 + .../public/_locales/zh_CN/messages.json | 3 + packages/extension/src/background_script.ts | 1 + .../src/components/option/ShareButton.tsx | 25 +++++++- .../option/editor/CommandEditDialog.tsx | 62 ++++++++++++++----- .../components/option/editor/CommandList.tsx | 9 +++ .../option/editor/CommandTreeRenderer.tsx | 3 + .../src/hooks/option/useSharedCommandIds.ts | 44 +++++++++++++ .../extension/src/services/hub/background.ts | 40 ++++++++++++ packages/extension/src/services/hubShare.ts | 12 ++++ packages/extension/src/services/ipc.ts | 1 + 23 files changed, 220 insertions(+), 20 deletions(-) create mode 100644 packages/extension/src/hooks/option/useSharedCommandIds.ts diff --git a/packages/extension/public/_locales/de/messages.json b/packages/extension/public/_locales/de/messages.json index 83abb1575..cc136a2c2 100644 --- a/packages/extension/public/_locales/de/messages.json +++ b/packages/extension/public/_locales/de/messages.json @@ -749,6 +749,9 @@ "Option_shareButton_tooltip": { "message": "Mit Hub teilen" }, + "Option_shareButton_shared_tooltip": { + "message": "Bereits geteilt" + }, "Option_remove_title": { "message": "Dies löschen?" }, diff --git a/packages/extension/public/_locales/en/messages.json b/packages/extension/public/_locales/en/messages.json index 8740e0642..798a936d4 100644 --- a/packages/extension/public/_locales/en/messages.json +++ b/packages/extension/public/_locales/en/messages.json @@ -753,6 +753,10 @@ "message": "Share to Hub", "description": "Tooltip for the share button in the command list. Opens the new Selection Command Hub in a new tab with the command pre-filled." }, + "Option_shareButton_shared_tooltip": { + "message": "Already shared", + "description": "Tooltip for the share button when the command has already been shared to the Hub. Clicking opens the hub dashboard for this command." + }, "Option_remove_title": { "message": "Delete this?" }, diff --git a/packages/extension/public/_locales/es/messages.json b/packages/extension/public/_locales/es/messages.json index b745b64d9..e6f01735c 100644 --- a/packages/extension/public/_locales/es/messages.json +++ b/packages/extension/public/_locales/es/messages.json @@ -749,6 +749,9 @@ "Option_shareButton_tooltip": { "message": "Compartir en Hub" }, + "Option_shareButton_shared_tooltip": { + "message": "Ya compartido" + }, "Option_remove_title": { "message": "¿Eliminar esto?" }, diff --git a/packages/extension/public/_locales/fr/messages.json b/packages/extension/public/_locales/fr/messages.json index 415c861ba..09bb2ceef 100644 --- a/packages/extension/public/_locales/fr/messages.json +++ b/packages/extension/public/_locales/fr/messages.json @@ -749,6 +749,9 @@ "Option_shareButton_tooltip": { "message": "Partager sur Hub" }, + "Option_shareButton_shared_tooltip": { + "message": "Déjà partagé" + }, "Option_remove_title": { "message": "Supprimer ceci ?" }, diff --git a/packages/extension/public/_locales/hi/messages.json b/packages/extension/public/_locales/hi/messages.json index 022c7eee4..2954e5aa0 100644 --- a/packages/extension/public/_locales/hi/messages.json +++ b/packages/extension/public/_locales/hi/messages.json @@ -749,6 +749,9 @@ "Option_shareButton_tooltip": { "message": "Hub पर साझा करें" }, + "Option_shareButton_shared_tooltip": { + "message": "पहले से साझा किया गया" + }, "Option_remove_title": { "message": "क्या आप वाकई इसे हटाना चाहते हैं?" }, diff --git a/packages/extension/public/_locales/id/messages.json b/packages/extension/public/_locales/id/messages.json index fcb0e4357..122719616 100644 --- a/packages/extension/public/_locales/id/messages.json +++ b/packages/extension/public/_locales/id/messages.json @@ -749,6 +749,9 @@ "Option_shareButton_tooltip": { "message": "Bagikan ke Hub" }, + "Option_shareButton_shared_tooltip": { + "message": "Sudah dibagikan" + }, "Option_remove_title": { "message": "Hapus ini?" }, diff --git a/packages/extension/public/_locales/it/messages.json b/packages/extension/public/_locales/it/messages.json index 121a5b8c1..d212e69af 100644 --- a/packages/extension/public/_locales/it/messages.json +++ b/packages/extension/public/_locales/it/messages.json @@ -749,6 +749,9 @@ "Option_shareButton_tooltip": { "message": "Condividi su Hub" }, + "Option_shareButton_shared_tooltip": { + "message": "Già condiviso" + }, "Option_remove_title": { "message": "Sei sicuro di voler eliminare questo?" }, diff --git a/packages/extension/public/_locales/ja/messages.json b/packages/extension/public/_locales/ja/messages.json index b66e6230d..da8f8f60c 100644 --- a/packages/extension/public/_locales/ja/messages.json +++ b/packages/extension/public/_locales/ja/messages.json @@ -749,6 +749,9 @@ "Option_shareButton_tooltip": { "message": "Hubに共有" }, + "Option_shareButton_shared_tooltip": { + "message": "共有済み" + }, "Option_remove_title": { "message": "削除しますか?" }, diff --git a/packages/extension/public/_locales/ko/messages.json b/packages/extension/public/_locales/ko/messages.json index bb1d3c694..666c297d3 100644 --- a/packages/extension/public/_locales/ko/messages.json +++ b/packages/extension/public/_locales/ko/messages.json @@ -749,6 +749,9 @@ "Option_shareButton_tooltip": { "message": "Hub에 공유" }, + "Option_shareButton_shared_tooltip": { + "message": "이미 공유됨" + }, "Option_remove_title": { "message": "이것을 삭제하시겠습니까?" }, diff --git a/packages/extension/public/_locales/ms/messages.json b/packages/extension/public/_locales/ms/messages.json index 9a16bd40f..811fdf60b 100644 --- a/packages/extension/public/_locales/ms/messages.json +++ b/packages/extension/public/_locales/ms/messages.json @@ -749,6 +749,9 @@ "Option_shareButton_tooltip": { "message": "Kongsi ke Hub" }, + "Option_shareButton_shared_tooltip": { + "message": "Sudah dikongsi" + }, "Option_remove_title": { "message": "Padam ini?" }, diff --git a/packages/extension/public/_locales/pt_BR/messages.json b/packages/extension/public/_locales/pt_BR/messages.json index 963d13df0..beed63942 100644 --- a/packages/extension/public/_locales/pt_BR/messages.json +++ b/packages/extension/public/_locales/pt_BR/messages.json @@ -749,6 +749,9 @@ "Option_shareButton_tooltip": { "message": "Compartilhar no Hub" }, + "Option_shareButton_shared_tooltip": { + "message": "Já compartilhado" + }, "Option_remove_title": { "message": "Excluir isto?" }, diff --git a/packages/extension/public/_locales/pt_PT/messages.json b/packages/extension/public/_locales/pt_PT/messages.json index aab01ea8e..4b3e8faf5 100644 --- a/packages/extension/public/_locales/pt_PT/messages.json +++ b/packages/extension/public/_locales/pt_PT/messages.json @@ -749,6 +749,9 @@ "Option_shareButton_tooltip": { "message": "Partilhar no Hub" }, + "Option_shareButton_shared_tooltip": { + "message": "Já partilhado" + }, "Option_remove_title": { "message": "Eliminar isto?" }, diff --git a/packages/extension/public/_locales/ru/messages.json b/packages/extension/public/_locales/ru/messages.json index 6efee3cd5..4461e0224 100644 --- a/packages/extension/public/_locales/ru/messages.json +++ b/packages/extension/public/_locales/ru/messages.json @@ -749,6 +749,9 @@ "Option_shareButton_tooltip": { "message": "Поделиться в Hub" }, + "Option_shareButton_shared_tooltip": { + "message": "Уже опубликовано" + }, "Option_remove_title": { "message": "Вы уверены, что хотите удалить это?" }, diff --git a/packages/extension/public/_locales/zh_CN/messages.json b/packages/extension/public/_locales/zh_CN/messages.json index 508d52a04..396268a31 100644 --- a/packages/extension/public/_locales/zh_CN/messages.json +++ b/packages/extension/public/_locales/zh_CN/messages.json @@ -749,6 +749,9 @@ "Option_shareButton_tooltip": { "message": "分享到 Hub" }, + "Option_shareButton_shared_tooltip": { + "message": "已共享" + }, "Option_remove_title": { "message": "您确定要删除吗?" }, diff --git a/packages/extension/src/background_script.ts b/packages/extension/src/background_script.ts index e31d4cd98..16cfb0c16 100644 --- a/packages/extension/src/background_script.ts +++ b/packages/extension/src/background_script.ts @@ -414,6 +414,7 @@ const commandFuncs = { // [BgCommand.shareCommandToHub]: HubBackground.shareCommandToHub, [BgCommand.editCommandToHub]: HubBackground.editCommandToHub, + [BgCommand.getSharedCommandIds]: HubBackground.getSharedCommandIds, // // PageAction diff --git a/packages/extension/src/components/option/ShareButton.tsx b/packages/extension/src/components/option/ShareButton.tsx index 3694c9e0c..2e7b67fc1 100644 --- a/packages/extension/src/components/option/ShareButton.tsx +++ b/packages/extension/src/components/option/ShareButton.tsx @@ -4,7 +4,12 @@ import { Tooltip } from "@/components/Tooltip" import { cn, isUUIDv7, generateId } from "@/lib/utils" import { t } from "@/services/i18n" import { shareCommandToHub } from "@/services/hubShare" -import { NEW_HUB_SHAREABLE_OPEN_MODES, COMMAND_SOURCE_TYPE } from "@/const" +import { + NEW_HUB_SHAREABLE_OPEN_MODES, + COMMAND_SOURCE_TYPE, + NEW_HUB_URL, +} from "@/const" +import { getHubLocale } from "@/services/hubShare" import type { SelectionCommand } from "@/types" const VALID_SOURCE_TYPES = new Set([ @@ -16,15 +21,24 @@ const VALID_SOURCE_TYPES = new Set([ type Props = { command: SelectionCommand onCommandIdChange?: (newId: string) => void + isShared?: boolean } -export const ShareButton = ({ command, onCommandIdChange }: Props) => { +export const ShareButton = ({ command, onCommandIdChange, isShared }: Props) => { const buttonRef = useRef(null) const [status, setStatus] = useState<"idle" | "sent" | "error">("idle") const handleClick = (e: React.MouseEvent) => { e.stopPropagation() + if (isShared) { + // Open the hub dashboard page for the shared command + const locale = getHubLocale() + const url = `${NEW_HUB_URL}/${locale}/dashboard/commands?id=${encodeURIComponent(command.id)}` + chrome.tabs.create({ url }) + return + } + let commandToShare = command if (!isUUIDv7(command.id)) { const newId = generateId() @@ -59,6 +73,7 @@ export const ShareButton = ({ command, onCommandIdChange }: Props) => { { ) diff --git a/packages/extension/src/components/option/editor/CommandEditDialog.tsx b/packages/extension/src/components/option/editor/CommandEditDialog.tsx index c9a4601b7..61e872669 100644 --- a/packages/extension/src/components/option/editor/CommandEditDialog.tsx +++ b/packages/extension/src/components/option/editor/CommandEditDialog.tsx @@ -82,6 +82,7 @@ import { Ipc, BgCommand } from "@/services/ipc" import { getScreenSize } from "@/services/screen" import { Storage, SESSION_STORAGE_KEY } from "@/services/storage" import { ANALYTICS_EVENTS, sendEvent } from "@/services/analytics" +import { shareCommandToHub } from "@/services/hubShare" import { isEmpty, e2a, cn, parseGeminiUrl, generateId } from "@/lib/utils" import { t as _t } from "@/services/i18n" @@ -274,6 +275,7 @@ type CommandEditDialogProps = { initialCommand?: SelectionCommand selectedType: COMMAND_TYPE onTypeClick: () => void + isShared?: boolean } export const CommandEditDialog = (param: CommandEditDialogProps) => { @@ -293,6 +295,7 @@ const CommandEditDialogInner = ({ initialCommand, selectedType, onTypeClick, + isShared, }: CommandEditDialogProps) => { const [initialized, setInitialized] = useState(false) const [assistDialogOpen, setAssistDialogOpen] = useState(false) @@ -327,6 +330,27 @@ const CommandEditDialogInner = ({ // Determine if open mode selection should be shown const shouldShowOpenModeSelect = selectedType === COMMAND_TYPE.SEARCH + // Process form data before submit: apply coercions and clean up unused fields. + const processFormData = (data: CommandSchemaType): CommandSchemaType => { + if (isEmpty(data.id)) data.id = generateId() + if (data.revision == null) data.revision = 0 + if (data.parentFolderId === ROOT_FOLDER) { + data.parentFolderId = undefined + } + if (isSearchType(data)) { + if (data.popupOption != null) { + data.popupOption = { + width: Number(data.popupOption.width), + height: Number(data.popupOption.height), + } + } + if (data.openMode !== OPEN_MODE.WINDOW) { + delete data.windowState + } + } + return data + } + const variableArray = useFieldArray({ name: "variables", control: form.control, @@ -877,28 +901,32 @@ const CommandEditDialogInner = ({ {t("labelCancel")} + {isShared && !isHubEdit && ( + + )}