From 12e31b22b31ab4551677aef91c5fb38b7ee8a856 Mon Sep 17 00:00:00 2001 From: digitalbase Date: Fri, 23 Oct 2026 15:31:13 +0200 Subject: [PATCH 01/15] Add optional camera preview plugin for pre-meeting checks --- CLAUDE.md | 7 ++ README.md | 5 ++ addons/camera-preview/CameraPreview.qml | 101 ++++++++++++++++++++++++ addons/camera-preview/README.md | 50 ++++++++++++ addons/camera-preview/i18n/en.json | 5 ++ addons/camera-preview/manifest.json | 9 +++ addons/camera-preview/menu-entry.json | 9 +++ 7 files changed, 186 insertions(+) create mode 100644 addons/camera-preview/CameraPreview.qml create mode 100644 addons/camera-preview/README.md create mode 100644 addons/camera-preview/i18n/en.json create mode 100644 addons/camera-preview/manifest.json create mode 100644 addons/camera-preview/menu-entry.json diff --git a/CLAUDE.md b/CLAUDE.md index c2ea441..5ddc2a1 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -162,3 +162,10 @@ Deviations from the original spec (SPEC §2.0 and the Phase 1 note in §12): - The Omarchy theme replaces Raycast's 8 themes; the HUD is Omarchy's OSD. Testing lesson: the query survives hide/show until pop-to-root. A live test must clear it first (Ctrl+U), or typed text gets appended to the old query. Pressing ↵ on a stale query once opened real browser tabs. + +**Optional camera preview add-on:** `addons/camera-preview/` is a separate +Omarchy panel plugin using Qt Multimedia, registered in oma-cast through the +existing user menu extension API. It previews the default camera, supports +selecting another connected camera, and stops capture when hidden or unloaded. +It does not implement the planned Raycast extension runtime. Installation is +opt-in; see its README. diff --git a/README.md b/README.md index 392b025..c824bb0 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,11 @@ Press **Alt+Space**. Super+Space stays the Omarchy menu. You can change the laun To remove it: `oma-cast uninstall`. +## Optional plugins + +- [Camera preview](addons/camera-preview/README.md): add **Open camera** to check + your webcam in a mirrored preview before a meeting. + ## Ask your default agent Type a question, select **Ask default agent** under the web-search fallbacks, diff --git a/addons/camera-preview/CameraPreview.qml b/addons/camera-preview/CameraPreview.qml new file mode 100644 index 0000000..035c6a6 --- /dev/null +++ b/addons/camera-preview/CameraPreview.qml @@ -0,0 +1,101 @@ +import QtQuick +import QtQuick.Controls +import Quickshell +import QtMultimedia +import qs.Commons as Commons + +Item { + id: root + property var shell: null + property var manifest: null + property bool opened: false + + function open(payload) { + root.opened = true + } + + function close() { + root.opened = false + } + + function dismiss() { + root.close() + if (root.shell) root.shell.hide(root.manifest.id) + } + + Commons.Translations { id: strings; directory: Qt.resolvedUrl("i18n") } + MediaDevices { id: devices } + Camera { + id: camera + cameraDevice: devices.defaultVideoInput + active: root.opened && devices.videoInputs.length > 0 + } + CaptureSession { + camera: camera + videoOutput: video + } + + FloatingWindow { + id: preview + visible: root.opened + implicitWidth: 960 + implicitHeight: 600 + title: strings.t("title", "Camera preview") + color: Commons.Color.background + onVisibleChanged: { + if (!visible && root.opened) root.dismiss() + } + + Item { + anchors.fill: parent + focus: true + Keys.onEscapePressed: root.dismiss() + + ComboBox { + id: selector + anchors.top: parent.top + anchors.horizontalCenter: parent.horizontalCenter + visible: devices.videoInputs.length > 1 + model: devices.videoInputs + textRole: "description" + contentItem: Text { + text: selector.displayText + textFormat: Text.PlainText + color: Commons.Color.foreground + verticalAlignment: Text.AlignVCenter + } + delegate: ItemDelegate { + required property var modelData + width: selector.width + contentItem: Text { + text: modelData.description + textFormat: Text.PlainText + color: Commons.Color.foreground + } + } + onActivated: camera.cameraDevice = devices.videoInputs[currentIndex] + } + + VideoOutput { + id: video + anchors.top: selector.visible ? selector.bottom : parent.top + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + fillMode: VideoOutput.PreserveAspectFit + mirrored: true + } + + Text { + anchors.centerIn: parent + width: parent.width - 48 + horizontalAlignment: Text.AlignHCenter + wrapMode: Text.Wrap + color: Commons.Color.foreground + textFormat: Text.PlainText + visible: devices.videoInputs.length === 0 || camera.error !== Camera.NoError + text: devices.videoInputs.length === 0 ? strings.t("noCamera", "No camera found. Connect a camera and try again.") : strings.t("cameraError", "Could not open the camera. Close any meeting app using it and try again.\n%1").arg(camera.errorString) + } + } + } +} diff --git a/addons/camera-preview/README.md b/addons/camera-preview/README.md new file mode 100644 index 0000000..288f091 --- /dev/null +++ b/addons/camera-preview/README.md @@ -0,0 +1,50 @@ +# Camera preview + +An optional Omarchy shell plugin with an **Open camera** command in oma-cast. +It opens a mirrored live preview of the default camera. If multiple cameras +are connected, a selector lets you choose another one. Escape or closing the +window stops capture and releases the camera. There is no audio or recording. +Close the preview before joining a meeting. + +This uses Omarchy's existing plugin and menu extension APIs. It does not +require oma-cast's planned Raycast extension runtime, a desktop application +entry, mpv, or a background camera process. + +## Install + +Requires Omarchy 4 and Qt Multimedia, including a working camera backend +and the QtMultimedia QML module. On Arch Linux, install `qt6-multimedia` +and a backend such as `qt6-multimedia-ffmpeg`. +Run these commands from the oma-cast checkout, which must remain in place: + +```sh +mkdir -p ~/.config/omarchy/plugins +ln -s "$PWD/addons/camera-preview" ~/.config/omarchy/plugins/oma-cast.camera-preview +omarchy-shell shell rescanPlugins +omarchy plugin enable oma-cast.camera-preview +``` + +Merge the object in `menu-entry.json` into +`~/.config/omarchy/extensions/omarchy-menu.jsonc`, preserving your existing +entries. Create the file and its parent directory if needed. oma-cast picks +up menu extensions automatically. Search for **Open camera** and press Enter. + +To test the plugin directly: + +```sh +omarchy-shell shell summon oma-cast.camera-preview '{}' +``` + +## Remove + +Remove the `camera-preview` entry from your menu extension file, then run: + +```sh +omarchy plugin disable oma-cast.camera-preview +rm ~/.config/omarchy/plugins/oma-cast.camera-preview +omarchy-shell shell rescanPlugins +``` + +No connected cameras or a capture failure displays an error in the preview. +Camera permissions and whether another application can share the camera are +managed by the system's Qt Multimedia backend. diff --git a/addons/camera-preview/i18n/en.json b/addons/camera-preview/i18n/en.json new file mode 100644 index 0000000..59b8487 --- /dev/null +++ b/addons/camera-preview/i18n/en.json @@ -0,0 +1,5 @@ +{ + "title": "Camera preview", + "noCamera": "No camera found. Connect a camera and try again.", + "cameraError": "Could not open the camera. Close any meeting app using it and try again.\n%1" +} diff --git a/addons/camera-preview/manifest.json b/addons/camera-preview/manifest.json new file mode 100644 index 0000000..0a9a1d4 --- /dev/null +++ b/addons/camera-preview/manifest.json @@ -0,0 +1,9 @@ +{ + "schemaVersion": 1, + "id": "oma-cast.camera-preview", + "name": "Camera preview", + "version": "0.1.0", + "description": "Check your camera before a meeting, without recording or audio", + "kinds": ["panel"], + "entryPoints": { "panel": "CameraPreview.qml" } +} diff --git a/addons/camera-preview/menu-entry.json b/addons/camera-preview/menu-entry.json new file mode 100644 index 0000000..e91e9f6 --- /dev/null +++ b/addons/camera-preview/menu-entry.json @@ -0,0 +1,9 @@ +{ + "camera-preview": { + "icon": "󰄀", + "label": "Open camera", + "description": "Check your camera before a meeting", + "aliases": ["camera", "webcam", "preview", "meeting"], + "action": "omarchy-shell shell summon oma-cast.camera-preview '{}'" + } +} From 7a545cfe015a658c439a110207ff43b258a1e741 Mon Sep 17 00:00:00 2001 From: digitalbase Date: Fri, 23 Oct 2026 15:33:47 +0200 Subject: [PATCH 02/15] Handle preview visibility through the FloatingWindow lifecycle --- addons/camera-preview/CameraPreview.qml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/addons/camera-preview/CameraPreview.qml b/addons/camera-preview/CameraPreview.qml index 035c6a6..23b2bd0 100644 --- a/addons/camera-preview/CameraPreview.qml +++ b/addons/camera-preview/CameraPreview.qml @@ -12,10 +12,12 @@ Item { function open(payload) { root.opened = true + preview.visible = true } function close() { root.opened = false + preview.visible = false } function dismiss() { @@ -37,13 +39,15 @@ Item { FloatingWindow { id: preview - visible: root.opened + property bool wasVisible: false + visible: false implicitWidth: 960 implicitHeight: 600 title: strings.t("title", "Camera preview") color: Commons.Color.background onVisibleChanged: { - if (!visible && root.opened) root.dismiss() + if (visible) wasVisible = true + else if (wasVisible && root.opened) root.dismiss() } Item { From 61cf1ad1bfc5116ff6e083260265e5401f159402 Mon Sep 17 00:00:00 2001 From: digitalbase Date: Fri, 23 Oct 2026 15:34:14 +0200 Subject: [PATCH 03/15] Keep the preview plugin mounted for repeat launches --- addons/camera-preview/manifest.json | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/addons/camera-preview/manifest.json b/addons/camera-preview/manifest.json index 0a9a1d4..0cf1ddd 100644 --- a/addons/camera-preview/manifest.json +++ b/addons/camera-preview/manifest.json @@ -4,6 +4,11 @@ "name": "Camera preview", "version": "0.1.0", "description": "Check your camera before a meeting, without recording or audio", - "kinds": ["panel"], - "entryPoints": { "panel": "CameraPreview.qml" } + "kinds": [ + "panel" + ], + "entryPoints": { + "panel": "CameraPreview.qml" + }, + "keepLoaded": true } From 5d265bbee939fba69bf3b32f8ffb83625a487829 Mon Sep 17 00:00:00 2001 From: digitalbase Date: Fri, 23 Oct 2026 15:34:59 +0200 Subject: [PATCH 04/15] Release the camera device by unloading capture on close --- addons/camera-preview/CameraPreview.qml | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/addons/camera-preview/CameraPreview.qml b/addons/camera-preview/CameraPreview.qml index 23b2bd0..a98bb54 100644 --- a/addons/camera-preview/CameraPreview.qml +++ b/addons/camera-preview/CameraPreview.qml @@ -27,13 +27,19 @@ Item { Commons.Translations { id: strings; directory: Qt.resolvedUrl("i18n") } MediaDevices { id: devices } - Camera { - id: camera - cameraDevice: devices.defaultVideoInput + readonly property var camera: cameraLoader.item + Loader { + id: cameraLoader active: root.opened && devices.videoInputs.length > 0 + sourceComponent: Component { + Camera { + cameraDevice: devices.defaultVideoInput + active: true + } + } } CaptureSession { - camera: camera + camera: root.camera videoOutput: video } @@ -77,7 +83,7 @@ Item { color: Commons.Color.foreground } } - onActivated: camera.cameraDevice = devices.videoInputs[currentIndex] + onActivated: { if (root.camera) root.camera.cameraDevice = devices.videoInputs[currentIndex] } } VideoOutput { @@ -97,8 +103,8 @@ Item { wrapMode: Text.Wrap color: Commons.Color.foreground textFormat: Text.PlainText - visible: devices.videoInputs.length === 0 || camera.error !== Camera.NoError - text: devices.videoInputs.length === 0 ? strings.t("noCamera", "No camera found. Connect a camera and try again.") : strings.t("cameraError", "Could not open the camera. Close any meeting app using it and try again.\n%1").arg(camera.errorString) + visible: devices.videoInputs.length === 0 || (root.camera && root.camera.error !== Camera.NoError) + text: devices.videoInputs.length === 0 ? strings.t("noCamera", "No camera found. Connect a camera and try again.") : strings.t("cameraError", "Could not open the camera. Close any meeting app using it and try again.\n%1").arg(root.camera ? root.camera.errorString : "") } } } From c3472c85541a1490033a0673fda92843391b4fd8 Mon Sep 17 00:00:00 2001 From: Adam Brewer Date: Wed, 28 Oct 2026 17:11:14 +0000 Subject: [PATCH 05/15] Adds kernel menus and provider fallbacks (#45) Keeps Omarchy v4.5 kernel choices available in oma-cast and opens unsupported submenus in the stock menu. Covers both menu versions without relying on the installed Omarchy release. --- README.md | 2 +- plugin/Backend.qml | 12 +- plugin/core/OmarchyMenu.js | 5 + tests/fixtures/omarchy-menu-v4.0.0.jsonc | 14 +++ tests/fixtures/omarchy-menu-v4.5.0-rc2.jsonc | 17 +++ tests/menu-compatibility.test.js | 112 +++++++++++++++++++ tests/omarchy-menu.test.js | 6 +- tests/smoke.sh | 2 +- 8 files changed, 164 insertions(+), 6 deletions(-) create mode 100644 tests/fixtures/omarchy-menu-v4.0.0.jsonc create mode 100644 tests/fixtures/omarchy-menu-v4.5.0-rc2.jsonc create mode 100644 tests/menu-compatibility.test.js diff --git a/README.md b/README.md index 392b025..74e88ef 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ need live desktop validation. ```sh oma-cast toggle | show | hide -oma-cast run # e.g. app:com.mitchellh.ghostty, omarchy:style.theme +oma-cast run # e.g. app:com.mitchellh.ghostty, omarchy:appearance.theme oma-cast call [json] # call any backend method oma-cast doctor ``` diff --git a/plugin/Backend.qml b/plugin/Backend.qml index a26fa47..de22eaf 100644 --- a/plugin/Backend.qml +++ b/plugin/Backend.qml @@ -220,6 +220,14 @@ Item { return candidate.kind === "omarchy-link" ? candidate.target : candidate.menuId } + function openMenu(item) { + if (item.provider && !OmarchyMenu.PROVIDERS[item.provider]) { + backend.summonPlugin("omarchy.menu", JSON.stringify({ menu: item.id })) + return { close: true } + } + return { push: { kind: "menu", menuId: item.id, title: item.label } } + } + function performAction(data) { var id = String(data && data.id || "") var action = String(data && data.action || "open") @@ -241,12 +249,12 @@ Item { return { close: true } case "omarchy-menu": backend.recordVisit(id, query) - return { push: { kind: "menu", menuId: candidate.menuId, title: candidate.title } } + return backend.openMenu(menuSource.tree.items[candidate.menuId]) case "omarchy-link": backend.recordVisit(id, query) var target = menuSource.tree.items[candidate.target] if (!target) return { toast: { style: "failure", title: "Menu " + candidate.target + " not found" } } - return { push: { kind: "menu", menuId: target.id, title: target.label } } + return backend.openMenu(target) case "builtin": if (candidate.run.url) { var values = (data && data.arguments) || {} diff --git a/plugin/core/OmarchyMenu.js b/plugin/core/OmarchyMenu.js index 61645c9..38d394e 100644 --- a/plugin/core/OmarchyMenu.js +++ b/plugin/core/OmarchyMenu.js @@ -158,6 +158,11 @@ function shellQuote(value) { } var PROVIDERS = { + "kernels": { + script: "current=$(omarchy-kernel get 2>/dev/null); omarchy-kernel list 2>/dev/null | while read -r k; do [[ -z $k ]] && continue; printf '%s\\t%s\\t%s\\n' \"$k\" \"$k\" \"$current\"; done", + icon: "", + actionFor: function(value) { return "omarchy-kernel set " + shellQuote(value) } + }, "fonts": { script: "current=$(omarchy-font-current 2>/dev/null); omarchy-font-list 2>/dev/null | while read -r f; do [[ -z $f ]] && continue; printf '%s\\t%s\\t%s\\n' \"$f\" \"$f\" \"$current\"; done", icon: "", diff --git a/tests/fixtures/omarchy-menu-v4.0.0.jsonc b/tests/fixtures/omarchy-menu-v4.0.0.jsonc new file mode 100644 index 0000000..02653f2 --- /dev/null +++ b/tests/fixtures/omarchy-menu-v4.0.0.jsonc @@ -0,0 +1,14 @@ +// Selected unchanged rows from omacom/omarchy v4.0.0, default/omarchy/omarchy-menu.jsonc. +{ + "apps": {"icon":"󰀻","label":"Apps","aliases":["app","applications"],"provider":"apps"}, + "trigger": {"icon":"󱓞","label":"Trigger"}, + "style": {"icon":"","label":"Style"}, + "setup": {"icon":"","label":"Setup","aliases":["settings"]}, + "install": {"icon":"󰉉","label":"Install"}, + "remove": {"icon":"󰭌","label":"Remove","aliases":["uninstall"]}, + "update": {"icon":"","label":"Update","aliases":["restart","refresh"]}, + "system": {"icon":"","label":"System","aliases":["power-menu"]}, + "trigger.toggle": {"icon":"󰔎","label":"Toggle","aliases":["toggle","toggles"]}, + "trigger.toggle.nightlight": {"icon":"󰔎","label":"Nightlight","action":"omarchy-toggle-nightlight"}, + "style.font": {"icon":"","label":"Font","provider":"fonts"} +} diff --git a/tests/fixtures/omarchy-menu-v4.5.0-rc2.jsonc b/tests/fixtures/omarchy-menu-v4.5.0-rc2.jsonc new file mode 100644 index 0000000..d40636e --- /dev/null +++ b/tests/fixtures/omarchy-menu-v4.5.0-rc2.jsonc @@ -0,0 +1,17 @@ +// Selected unchanged rows from omacom/omarchy v4.5.0-rc2, default/omarchy/omarchy-menu.jsonc. +{ + "apps": {"icon":"󰀻","label":"Apps","aliases":["app","applications"],"provider":"apps","action":"omarchy-shell omarchy.dock apps"}, + "appearance": {"icon":"󰏘","label":"Appearance","aliases":["style"]}, + "trigger": {"icon":"󱓞","label":"Trigger"}, + "setup": {"icon":"","label":"Setup","aliases":["settings"]}, + "install": {"icon":"󰉉","label":"Install"}, + "remove": {"icon":"󰭌","label":"Remove","aliases":["uninstall"]}, + "update": {"icon":"","label":"Update","aliases":["restart","refresh"]}, + "system": {"icon":"","label":"System","aliases":["power-menu"]}, + "appearance.font": {"icon":"","label":"Font","provider":"fonts"}, + "trigger.toggle": {"icon":"󰔎","label":"Toggle","aliases":["toggle","toggles"]}, + "trigger.toggle.nightlight-on": {"icon":"󰔎","label":"Nightlight On","when":"[[ $(omarchy-toggle-nightlight --status) != *'\"enabled\":true'* ]]","action":"omarchy-toggle-nightlight"}, + "trigger.toggle.nightlight-off": {"icon":"󰔎","label":"Nightlight Off","when":"[[ $(omarchy-toggle-nightlight --status) == *'\"enabled\":true'* ]]","action":"omarchy-toggle-nightlight"}, + "setup.language": {"icon":"","label":"Language","provider":"languages"}, + "update.kernel": {"icon":"","label":"Kernel","when":"(( $(omarchy-kernel list | wc -l) > 1 ))","provider":"kernels"} +} diff --git a/tests/menu-compatibility.test.js b/tests/menu-compatibility.test.js new file mode 100644 index 0000000..14b6306 --- /dev/null +++ b/tests/menu-compatibility.test.js @@ -0,0 +1,112 @@ +const test = require("node:test") +const assert = require("node:assert/strict") +const fs = require("node:fs") +const os = require("node:os") +const path = require("node:path") +const vm = require("node:vm") +const { execFileSync } = require("node:child_process") +const OmarchyMenu = require("../plugin/core/OmarchyMenu.js") +const RootSearch = require("../plugin/core/RootSearch.js") +const Ranker = require("../plugin/core/Ranker.js") +const Frecency = require("../plugin/core/Frecency.js") + +const deps = { OmarchyMenu, Ranker, Frecency } +const backendSource = fs.readFileSync(path.join(__dirname, "../plugin/Backend.qml"), "utf8") + +function backendFunction(name, params, context) { + const signature = "function " + name + "(" + params + ")" + const start = backendSource.indexOf(signature) + assert.ok(start >= 0, signature) + const end = backendSource.indexOf("\n }", start) + 4 + return vm.runInContext("(" + backendSource.slice(start, end) + ")", context) +} + +function harness(tree) { + const summons = [] + const visits = [] + const candidates = RootSearch.menuCandidates(tree, {}, {}, deps) + const backend = { + decorated: id => candidates.find(c => c.id === id), + recordVisit: (id, query) => visits.push({ id, query }), + summonPlugin: (id, payload) => summons.push({ id, payload: JSON.parse(payload) }) + } + const context = vm.createContext({ backend, menuSource: { tree }, OmarchyMenu }) + backend.openMenu = backendFunction("openMenu", "item", context) + const perform = backendFunction("performAction", "data", context) + return { summons, visits, open: id => JSON.parse(JSON.stringify(perform({ id }))) } +} + +for (const [version, appearance] of [["4.0.0", "style"], ["4.5.0-rc2", "appearance"]]) { + const parsed = OmarchyMenu.parse(fs.readFileSync(path.join(__dirname, "fixtures/omarchy-menu-v" + version + ".jsonc"), "utf8")) + const tree = OmarchyMenu.buildTree(parsed.items, []) + + test("Omarchy v" + version + " menu keeps navigation and populates its supported providers", () => { + assert.equal(parsed.error, "") + for (const id of ["apps", "system", appearance, "setup", "install", "remove", "update"]) { + assert.ok(tree.children.root.includes(id), id) + } + const providers = {} + for (const item of parsed.items.filter(i => OmarchyMenu.PROVIDERS[i.provider])) { + providers[item.id] = OmarchyMenu.providerItems(item.id, item.provider, "First\tfirst\tfirst\nSecond\tsecond\tfirst\n") + } + assert.ok(providers[appearance + ".font"]) + if (version === "4.5.0-rc2") assert.ok(providers["update.kernel"]) + const candidates = RootSearch.menuCandidates(tree, {}, providers, deps) + for (const [id, rows] of Object.entries(providers)) { + const sections = RootSearch.submenuSections(candidates, id, "", { commands: {}, frecency: {}, nowMs: Date.now() }, deps) + assert.deepEqual(sections.flatMap(s => s.rows.map(r => r.candidate.id)), rows.map(r => "omarchy:" + r.id)) + assert.equal(candidates.find(c => c.id === "omarchy:" + rows[0].id).checked, true) + assert.equal(candidates.find(c => c.id === "omarchy:" + rows[1].id).checked, false) + } + assert.ok(candidates.some(c => c.title.startsWith("Nightlight"))) + }) + + test("Omarchy v" + version + " unsupported submenus open in the stock menu, including links", () => { + for (const item of parsed.items.filter(i => i.kind === "menu" && i.provider && !OmarchyMenu.PROVIDERS[i.provider])) { + const linked = OmarchyMenu.buildTree(parsed.items, OmarchyMenu.parse(JSON.stringify({ shortcut: { label: "Shortcut", target: item.id } })).items) + for (const id of ["omarchy:" + item.id, "omarchy:shortcut"]) { + const h = harness(linked) + assert.deepEqual(h.open(id), { close: true }) + assert.deepEqual(h.summons, [{ id: "omarchy.menu", payload: { menu: item.id } }]) + assert.equal(h.visits[0].id, id) + } + } + const h = harness(tree) + assert.deepEqual(h.open("omarchy:" + appearance), { push: { kind: "menu", menuId: appearance, title: tree.items[appearance].label } }) + assert.deepEqual(h.open("omarchy:" + appearance + ".font"), { push: { kind: "menu", menuId: appearance + ".font", title: tree.items[appearance + ".font"].label } }) + assert.deepEqual(h.summons, []) + }) +} + +test("an unknown extension provider opens in the stock menu", () => { + const tree = OmarchyMenu.buildTree(OmarchyMenu.parse('{"custom":{"label":"Custom","provider":"future-provider"}}').items, []) + const h = harness(tree) + assert.deepEqual(h.open("omarchy:custom"), { close: true }) + assert.deepEqual(h.summons, [{ id: "omarchy.menu", payload: { menu: "custom" } }]) +}) + +test("kernel rows obey the menu visibility guard and remain searchable when visible", () => { + const parsed = OmarchyMenu.parse(fs.readFileSync(path.join(__dirname, "fixtures/omarchy-menu-v4.5.0-rc2.jsonc"), "utf8")) + const tree = OmarchyMenu.buildTree(parsed.items, []) + assert.ok(tree.items["update.kernel"].when) + const providers = { "update.kernel": OmarchyMenu.providerItems("update.kernel", "kernels", "linux-lts\tlinux-lts\tlinux-lts\n") } + const visible = RootSearch.menuCandidates(tree, { when: { "update.kernel": true } }, providers, deps) + assert.ok(visible.some(c => c.id === "omarchy:update.kernel.linux-lts" && c.checked)) + const hidden = RootSearch.menuCandidates(tree, { when: { "update.kernel": false } }, providers, deps) + assert.ok(!hidden.some(c => c.menuId.startsWith("update.kernel"))) +}) + +test("kernel enumeration reads list/get and set receives the selected value literally", t => { + const dir = fs.mkdtempSync(path.join(os.tmpdir(), "oma-cast-kernels-")) + t.after(() => fs.rmSync(dir, { recursive: true, force: true })) + fs.writeFileSync(path.join(dir, "omarchy-kernel"), '#!/bin/bash\ncase "$1" in\nget) echo linux-lts ;;\nlist) printf "linux\\nlinux-lts\\n" ;;\nset) printf "%s\\0" "$@" ;;\n*) exit 1 ;;\nesac\n', { mode: 0o755 }) + const env = { ...process.env, PATH: dir + ":" + process.env.PATH } + const output = execFileSync("bash", ["-c", OmarchyMenu.PROVIDERS.kernels.script], { env, encoding: "utf8" }) + const rows = OmarchyMenu.providerItems("update.kernel", "kernels", output) + assert.deepEqual(rows.map(r => [r.label, r.isCurrent, r.action]), [["linux", false, "omarchy-kernel set 'linux'"], ["linux-lts", true, "omarchy-kernel set 'linux-lts'"]]) + const value = "it's $(touch " + path.join(dir, "injected") + ") `id`" + const action = OmarchyMenu.PROVIDERS.kernels.actionFor(value) + assert.equal(execFileSync("bash", ["-c", action], { env, encoding: "utf8" }), "set\0" + value + "\0") + assert.equal(fs.existsSync(path.join(dir, "injected")), false) + assert.deepEqual(OmarchyMenu.providerItems("update.kernel", "kernels", ""), []) +}) diff --git a/tests/omarchy-menu.test.js b/tests/omarchy-menu.test.js index e4c2103..dfbcbdf 100644 --- a/tests/omarchy-menu.test.js +++ b/tests/omarchy-menu.test.js @@ -1,6 +1,7 @@ const test = require("node:test") const assert = require("node:assert/strict") const fs = require("node:fs") +const path = require("node:path") const { execFileSync } = require("node:child_process") const M = require("../plugin/core/OmarchyMenu.js") @@ -74,11 +75,12 @@ test("only a bare summon is run in-process", () => { assert.equal(M.summonAction("omarchy-shell shell summon x; rm -rf ~"), null) }) -const shipped = "/usr/share/omarchy/default/omarchy/omarchy-menu.jsonc" +const shipped = path.join(process.env.OMARCHY_PATH || "/usr/share/omarchy", "default/omarchy/omarchy-menu.jsonc") test("the installed Omarchy menu parses completely", { skip: !fs.existsSync(shipped) }, () => { const r = M.parse(fs.readFileSync(shipped, "utf8")) assert.equal(r.error, "") assert.ok(r.items.length > 300, "expected the full menu, got " + r.items.length) const tree = M.buildTree(r.items, []) - for (const id of ["apps", "system", "style", "setup", "install", "remove", "update"]) assert.ok(tree.children.root.includes(id), id) + for (const id of ["apps", "system", "setup", "install", "remove", "update"]) assert.ok(tree.children.root.includes(id), id) + assert.ok(tree.children.root.includes("style") || tree.children.root.includes("appearance")) }) diff --git a/tests/smoke.sh b/tests/smoke.sh index 0e57ed4..166cbf2 100755 --- a/tests/smoke.sh +++ b/tests/smoke.sh @@ -18,7 +18,7 @@ $cli call settings.getGeneralSettings | grep -q '"popToRootTimeout"' && pass "se echo "root search (Phase 1)" search() { $cli call rootSearch.search "{\"query\":\"$1\"}"; } first() { search "$1" | python3 -I -c 'import json,sys; d=json.load(sys.stdin); print(d["data"][0]["rows"][0]["title"] if d["ok"] and d["data"] else "")'; } -[[ $(first nightlight) == "Nightlight" ]] && pass "Omarchy menu items are searchable (nightlight)" || bad "Omarchy menu items are searchable (nightlight)" +[[ $(first nightlight) =~ ^Nightlight(\ On|\ Off)?$ ]] && pass "Omarchy menu items are searchable (nightlight)" || bad "Omarchy menu items are searchable (nightlight)" [[ $(first "") != "" ]] && pass "empty root has sections" || bad "empty root has sections" search zzzz-no-match | grep -q '"id":"fallback-commands"' && pass "fallback section for unmatched queries" || bad "fallback section for unmatched queries" count=$($cli call system.info | python3 -I -c 'import json,sys; print(json.load(sys.stdin)["data"]["candidates"])') From 74805349ea4f4e2d783c8a3ecf30000c99131605 Mon Sep 17 00:00:00 2001 From: GM Date: Wed, 28 Oct 2026 15:13:46 -0400 Subject: [PATCH 06/15] perf(search): accelerate matching and result updates Move matching into an optional flea-search helper while preserving personalization and automatic fallback. Reuse QML rows and delegates, publish selection atomically, and defer optional controls. On minipc, paired search medians improved from 42.8-45.3 ms to about 7.7 ms. --- .github/workflows/ci.yml | 13 +- .gitignore | 2 + CLAUDE.md | 2 +- README.md | 10 +- SPEC.md | 11 ++ bin/build-search | 15 ++ bin/oma-cast | 7 + plugin/Backend.qml | 27 ++- plugin/core/FleaSearch.js | 45 +++++ plugin/core/Ranker.js | 46 ++++- plugin/core/RootSearch.js | 2 +- plugin/core/Rows.js | 20 +++ plugin/services/NativeSearch.qml | 99 +++++++++++ plugin/ui/LauncherWindow.qml | 157 ++++++++++------- plugin/ui/ResultRow.qml | 135 ++++++++------- search/Cargo.lock | 107 ++++++++++++ search/Cargo.toml | 13 ++ search/LICENSE | 21 +++ search/PROVENANCE.md | 87 ++++++++++ search/src/backend/mod.rs | 3 + search/src/backend/searchascii.rs | 55 ++++++ search/src/backend/searchbits.rs | 23 +++ search/src/backend/searchmatch.rs | 233 +++++++++++++++++++++++++ search/src/backend/searchtypo.rs | 219 +++++++++++++++++++++++ search/src/engine.rs | 277 ++++++++++++++++++++++++++++++ search/src/main.rs | 21 +++ search/src/protocol.rs | 160 +++++++++++++++++ search/tests/protocol.rs | 235 +++++++++++++++++++++++++ test-search.qml | 41 +++++ tests/launcher-paste.test.js | 6 +- tests/native-search.test.js | 143 +++++++++++++++ tests/native-transport.sh | 52 ++++++ tests/rows.test.js | 52 ++++++ tests/search-integration.test.js | 39 +++++ 34 files changed, 2240 insertions(+), 138 deletions(-) create mode 100644 .gitignore create mode 100755 bin/build-search create mode 100644 plugin/core/FleaSearch.js create mode 100644 plugin/core/Rows.js create mode 100644 plugin/services/NativeSearch.qml create mode 100644 search/Cargo.lock create mode 100644 search/Cargo.toml create mode 100644 search/LICENSE create mode 100644 search/PROVENANCE.md create mode 100644 search/src/backend/mod.rs create mode 100644 search/src/backend/searchascii.rs create mode 100644 search/src/backend/searchbits.rs create mode 100644 search/src/backend/searchmatch.rs create mode 100644 search/src/backend/searchtypo.rs create mode 100644 search/src/engine.rs create mode 100644 search/src/main.rs create mode 100644 search/src/protocol.rs create mode 100644 search/tests/protocol.rs create mode 100644 test-search.qml create mode 100644 tests/native-search.test.js create mode 100755 tests/native-transport.sh create mode 100644 tests/rows.test.js create mode 100644 tests/search-integration.test.js diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 36aebcc..64c4255 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,8 +22,19 @@ jobs: - name: Unit tests run: node --test tests/*.test.js + - uses: dtolnay/rust-toolchain@stable + + - name: Search helper + run: | + cargo test --locked --manifest-path search/Cargo.toml + bin/build-search + node --test tests/search-integration.test.js + - name: Shell syntax - run: bash -n bin/oma-cast tests/smoke.sh + run: | + for script in bin/oma-cast bin/build-search tests/smoke.sh tests/native-transport.sh; do + bash -n "$script" + done - name: Plugin manifest is valid JSON run: node -e 'JSON.parse(require("fs").readFileSync("plugin/manifest.json", "utf8"))' diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fc055f7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/search/target/ +/plugin/bin/ diff --git a/CLAUDE.md b/CLAUDE.md index c2ea441..b90a935 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -23,7 +23,7 @@ Spec legend: **[O]** observed in Raycast, **[I]** inferred, **[D]** design decis 2. **Never call `*.raycast.com`.** No store, account, sync, telemetry or currency APIs. Build extensions from a local `raycast/extensions` clone. 3. **No telemetry.** No Sentry, no PostHog. 4. **No embedded AI features.** The fork's user-authorized exception is an explicit hand-off of root-search text to Omarchy's existing default-agent terminal launcher (SPEC §2.0). No model API, credential handling or automatic submission while typing. Other built-ins remain non-AI. -5. **Port the root-search ranker exactly** from `reference/02-backend.md §4.2–4.5`. Do not substitute fzf, nucleo or fuse.js. +5. **Port the root-search ranker exactly** from `reference/02-backend.md §4.2–4.5`. Do not substitute fzf, nucleo or fuse.js. The user-authorized flea-search matcher in SPEC §2.0 is the matching exception; personalization still uses this ranker. ## How to work diff --git a/README.md b/README.md index 392b025..521a11f 100644 --- a/README.md +++ b/README.md @@ -52,11 +52,19 @@ Requires Omarchy 4 (Hyprland 0.56+, `omarchy-shell`) and `socat`, which Omarchy ```sh git clone https://github.com/typecraft-dev/oma-cast.git cd oma-cast -bin/oma-cast install # link the plugin into omarchy-shell and the CLI into ~/.local/bin +bin/oma-cast install # build search if cargo is installed, then link and enable the plugin oma-cast setup hyprland # bind Alt+Space oma-cast doctor # check everything is wired up ``` +With Rust (`cargo`) installed, installation builds the small **flea-search** helper locally. It matches titles, +alternate names, subtitles and keywords outside the shell's UI thread and tolerates transposed or missing letters. +Aliases, favorites, learned terms and frecency stay in oma-cast's existing ranker. Without Rust, installation keeps +the built-in matcher; install Rust and run `oma-cast build-search`, then `oma-cast reload`, to enable acceleration. +Run `tests/native-transport.sh` on Omarchy to check the real native transport, process failures and timeout fallback. +No binary download or background system service is required. If the helper fails or times out, search falls back +to the built-in matcher until the plugin reloads. The synchronous `rootSearch.search` IPC stays compatible. + Press **Alt+Space**. Super+Space stays the Omarchy menu. You can change the launcher binding in `~/.config/hypr/oma-cast.lua`. To remove it: `oma-cast uninstall`. diff --git a/SPEC.md b/SPEC.md index 44a925c..0abd361 100644 --- a/SPEC.md +++ b/SPEC.md @@ -73,6 +73,17 @@ Consequences for Linux: ### 2.0 Quickshell build (current) [D, 2026-10-19] +**Search acceleration [D, 2026-10-28].** An optional Rust helper vendors Flea's MIT typed matcher; this is an +approved exception to the QML/JS-only runtime. The launcher searches asynchronously over JSON lines while oma-cast +still applies personalization, filtering, calculator and fallback sections. Exact, prefix, word, subsequence and +typo matches use Flea's tiers, with shorter titles breaking prefix/word ties after frecency. High sensitivity excludes +typo-only hits; medium and low use Flea's bounded edit budget (one edit from four alphanumeric letters, two from eight). +The old matcher remains the synchronous IPC and failure fallback. Query/view/filter/revision changes and hide cancel +obsolete results; navigation cannot activate an entry while its search is pending. Startup, malformed replies, exit +and timeout all have a bounded fallback. Build-time dependencies are Rust, serde and serde_json; no extra runtime or +system daemon. Flea's source provenance and license live in `search/`. Results update the existing ListModel in place and reuse visible delegates, following Flea 0.3.12's stable-model technique. Unchanged answers produce no model writes. + + **This supersedes the Tauri + Node design below for Omarchy.** Omarchy's desktop (bar, menus, launcher, notifications, lock screen) runs in one long-lived Quickshell process, `omarchy-shell`, whose features are plugins. oma-cast is one more plugin there, built the way Omarchy builds its own menu and emoji picker. The reasons: - **No external dependencies.** No Tauri, WebKitGTK, Node runtime, npm packages or native SQLite modules. It needs only what Omarchy already ships: Quickshell, Qt, bash, socat and Hyprland. - **Native look.** The plugin reads the active Omarchy theme's `[menu]` tokens (`qs.Commons.Color`, `Style`), so `omarchy theme set` restyles it live with no theme parser. diff --git a/bin/build-search b/bin/build-search new file mode 100755 index 0000000..30cd3fd --- /dev/null +++ b/bin/build-search @@ -0,0 +1,15 @@ +#!/bin/bash +set -euo pipefail + +repo=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd -P) +command -v cargo >/dev/null || { echo "oma-cast: building search needs Rust (cargo)" >&2; exit 1; } +target_dir=${CARGO_TARGET_DIR:-$repo/search/target} +[[ $target_dir == /* ]] || target_dir="$PWD/$target_dir" +cargo build --locked --release --manifest-path "$repo/search/Cargo.toml" --target-dir "$target_dir" +mkdir -p "$repo/plugin/bin" +temporary=$(mktemp "$repo/plugin/bin/.search.XXXXXXXX") +trap 'rm -f -- "$temporary"' EXIT +cp "$target_dir/release/oma-cast-search" "$temporary" +chmod 755 "$temporary" +mv -f -- "$temporary" "$repo/plugin/bin/oma-cast-search" +echo "built $repo/plugin/bin/oma-cast-search" diff --git a/bin/oma-cast b/bin/oma-cast index 474d5da..b4d96aa 100755 --- a/bin/oma-cast +++ b/bin/oma-cast @@ -32,6 +32,7 @@ Launcher call [json] Call a backend method, e.g. oma-cast call system.info Setup + build-search Build the optional flea-search helper (needs Rust/cargo) install Link the plugin into omarchy-shell, enable it, and link this CLI into ~/.local/bin uninstall Disable and unlink the plugin reload Make the shell reload the plugin after editing it @@ -52,6 +53,11 @@ need_shell() { cmd_install() { need_shell [[ -f $plugin_src/manifest.json ]] || die "plugin source missing at $plugin_src" + if command -v cargo >/dev/null; then + "$repo/bin/build-search" || die "search helper build failed; plugin was not installed" + else + echo "Rust not found; skipping the helper build (using an existing helper or the built-in matcher)" + fi mkdir -p "$plugins_dir" if [[ -e $plugin_link && ! -L $plugin_link ]]; then die "$plugin_link exists and is not a symlink; move it away first" @@ -164,6 +170,7 @@ case "${1:-}" in run) need_shell; [[ -n ${2:-} ]] || die "usage: oma-cast run "; ipc run "$2" ;; call) need_shell; [[ -n ${2:-} ]] || die "usage: oma-cast call [json]"; ipc call "$2" "${3:-}" ;; ping) need_shell; ipc ping ;; + build-search) "$repo/bin/build-search" ;; install) cmd_install ;; uninstall) cmd_uninstall ;; reload) cmd_reload ;; diff --git a/plugin/Backend.qml b/plugin/Backend.qml index a26fa47..e60fc77 100644 --- a/plugin/Backend.qml +++ b/plugin/Backend.qml @@ -7,6 +7,7 @@ import "core/Paths.js" as Paths import "core/Log.js" as Log import "core/Schema.js" as Schema import "core/Ranker.js" as Ranker +import "core/FleaSearch.js" as FleaSearch import "core/Frecency.js" as Frecency import "core/OmarchyMenu.js" as OmarchyMenu import "core/RootSearch.js" as RootSearch @@ -35,7 +36,7 @@ Item { property var candidates: [] property var candidatesById: ({}) property int candidatesRevision: 0 - readonly property bool loading: menuSource.loading || agentLauncher.checking + readonly property bool loading: menuSource.loading || agentLauncher.checking || nativeSearch.pending !== null // Bumped when exchange rates or zone offsets arrive, so an open // calculator row re-evaluates. readonly property int calculatorRevision: (calculatorData.rates ? 1 : 0) + calculatorData.ratesFetchedAt + calculatorData.zonesAt @@ -45,6 +46,25 @@ Item { function call(method, data) { return Rpc.call(backend.registry, method, data) } function callSync(method, data) { return Rpc.callSync(backend.registry, method, data) } + function cancelSearch() { nativeSearch.cancel() } + + function searchAsync(data, callback) { + nativeSearch.cancel() + var query = String(data && data.query || "").trim() + var view = data && data.view + if (!query || (view && view.kind !== "root")) { + callback(backend.callSync("rootSearch.search", data)) + return + } + nativeSearch.search(Ranker.transliterate(query.toLowerCase()), backend.searchContext().sensitivity, function(matches) { + callback(backend.callSync("rootSearch.search", Object.assign({}, data, { fleaHits: matches }))) + }) + } + + NativeSearch { + id: nativeSearch + onFailed: function(message) { backend.log("warning", "search", message) } + } function subscribe(method, callback) { return Rpc.subscribe(backend.registry, method, callback) } function emit(method, data) { @@ -78,8 +98,12 @@ Item { for (var b = 0; b < RootSearch.BUILTINS.length; b++) next.push(RootSearch.builtinCandidate(RootSearch.BUILTINS[b])) var byId = ({}) for (var j = 0; j < next.length; j++) byId[next[j].id] = next[j] + var entries = FleaSearch.entries(next, Ranker.transliterate) + nativeSearch.cancel() backend.candidates = next backend.candidatesById = byId + nativeSearch.ids = next.map(function(c) { return c.id }) + nativeSearch.entries = entries backend.candidatesRevision++ } @@ -386,6 +410,7 @@ Item { var query = String(data && data.query || "") var view = data && data.view var ctx = backend.searchContext() + if (data && data.fleaHits) ctx.fleaHits = data.fleaHits var sections if (view && view.kind === "menu") sections = RootSearch.submenuSections(backend.candidates, view.menuId, query, ctx, backend.deps) else if (view && view.kind === "calculator-history") sections = RootSearch.historySections(calculatorStore.doc.history, query, ctx.nowMs, Calculator.filterHistory) diff --git a/plugin/core/FleaSearch.js b/plugin/core/FleaSearch.js new file mode 100644 index 0000000..c5544e5 --- /dev/null +++ b/plugin/core/FleaSearch.js @@ -0,0 +1,45 @@ +var MAX_QUERY_LENGTH = 256 +var MAX_REPLY_LENGTH = 8 * 1024 * 1024 + +function entries(candidates, fold) { + function strings(values) { + return Array.isArray(values) ? values.map(function(value) { return fold(String(value || "")) }) : [] + } + return candidates.map(function(c) { + return { + title: fold(String(c.title || "")), subtitle: fold(String(c.subtitle || "")), + alternateTitles: strings(c.alternateTitles), keywords: strings(c.keywords), bundleId: fold(String(c.bundleId || "")) + } + }) +} + +// Replies look like {id: 7, hits: [{index: 0, title: 4000000, alternate: null, subtitle: null, keyword: null}]}. +function reply(line) { + if (line.length > MAX_REPLY_LENGTH) throw new Error("Search reply exceeds the size limit") + var data = JSON.parse(line) + if (!data || !Number.isSafeInteger(data.id)) throw new Error("Search reply has no request id") + return data +} + +function hits(data, ids) { + if (!Array.isArray(data.hits)) throw new Error("Search reply has no hits") + var out = Object.create(null) + for (var i = 0; i < data.hits.length; i++) { + var hit = data.hits[i] + if (!hit || !Number.isInteger(hit.index) || hit.index < 0 || hit.index >= ids.length) + throw new Error("Search reply has an invalid entry index") + var id = ids[hit.index] + if (Object.prototype.hasOwnProperty.call(out, id)) throw new Error("Search reply repeats an entry") + var scores = [hit.title, hit.alternate, hit.subtitle, hit.keyword] + for (var j = 0; j < scores.length; j++) { + var score = scores[j] + if (score !== null && (!Number.isInteger(score) || score <= 0 || score > 5000000)) + throw new Error("Search reply has an invalid score") + } + if (scores.every(function(score) { return score === null })) throw new Error("Search reply contains an empty hit") + out[id] = hit + } + return out +} + +if (typeof module !== "undefined") module.exports = { MAX_QUERY_LENGTH, entries, reply, hits } diff --git a/plugin/core/Ranker.js b/plugin/core/Ranker.js index 92c0731..b7c8fd3 100644 --- a/plugin/core/Ranker.js +++ b/plugin/core/Ranker.js @@ -233,11 +233,6 @@ function buildRecord(candidate, query, options) { var tq = transliterate(q) var frecency = typeof c.frecency === "number" && isFinite(c.frecency) ? c.frecency : 1 - var title = transliterate(String(c.title || "")) - if (tq.charAt(0) === "/") title = title.replace("/", " ") - var titleLower = title.toLowerCase() - var alternates = Array.isArray(c.alternateTitles) ? c.alternateTitles.map(function(a) { return String(a || "") }) : [] - var record = { candidate: c, query: q, @@ -265,6 +260,12 @@ function buildRecord(candidate, query, options) { return String(term || "").toLowerCase() === q }) + if (opts.fleaHits) return fleaRecord(record, opts.fleaHits[c.id], frecency, nowMs) + + var title = transliterate(String(c.title || "")) + if (tq.charAt(0) === "/") title = title.replace("/", " ") + var titleLower = title.toLowerCase() + var alternates = Array.isArray(c.alternateTitles) ? c.alternateTitles.map(function(a) { return String(a || "") }) : [] record.title = fuzzyMatch(title, tq, { literalQueryDots: literalDots }) if (record.title === "exact") record.titleMatch = "exact" else if (titleLower.indexOf(q) === 0 || alternates.some(function(a) { return a.toLowerCase().indexOf(q) === 0 })) @@ -317,6 +318,35 @@ function buildRecord(candidate, query, options) { } +var FLEA_EXACT = 5000000 +var FLEA_PREFIX = 4000000 +var FLEA_WORD = 3500000 + +function fleaMatch(score) { + return score === null ? "unmatched" : score === FLEA_EXACT ? "exact" : { score: score, skipped: 0 } +} + +function fleaRecord(record, hit, frecency, nowMs) { + var c = record.candidate, q = record.query + record.flea = true + record.keywordScore = -MAX + record.searchTerm = searchTermMatch(c.searchTerms, q, frecency, c.openedAt, nowMs) + if (hit) { + record.keywordScore = matchScore(fleaMatch(hit.keyword)) + record.title = fleaMatch(hit.title) + record.titleScore = matchScore(record.title) + record.subtitle = fleaMatch(hit.subtitle) + record.subtitleExact = record.subtitle === "exact" + record.subtitleScore = matchScore(record.subtitle) + if (hit.title === FLEA_EXACT || hit.alternate === FLEA_EXACT) record.titleMatch = "exact" + else if (hit.title === FLEA_PREFIX || hit.alternate === FLEA_PREFIX) record.titleMatch = "prefix" + if (hit.alternate !== null) record.titleScore = Math.max(record.titleScore, matchScore(fleaMatch(hit.alternate))) + } + record.textMatched = record.alias !== "unmatched" || !!hit + record.isMatching = !!c.alwaysMatching || record.textMatched + return record +} + function collate(a, b) { return String(a || "").localeCompare(String(b || ""), undefined, { numeric: true, sensitivity: "base" }) } @@ -413,8 +443,14 @@ function compareMatched(a, b, ctx) { var aBest = Math.max(a.titleScore, a.subtitleScore) var bBest = Math.max(b.titleScore, b.subtitleScore) if (aBest !== bBest) return bBest - aBest + if (a.flea && b.flea && aBest === -MAX && a.keywordScore !== b.keywordScore) + return b.keywordScore - a.keywordScore if (a.frecency !== b.frecency) return b.frecency - a.frecency + if (a.flea && (aBest === FLEA_PREFIX || aBest === FLEA_WORD)) { + var shorter = String(a.candidate.title || "").length - String(b.candidate.title || "").length + if (shorter !== 0) return shorter + } if (a.titleScore !== b.titleScore) return b.titleScore - a.titleScore if (a.typePriority !== b.typePriority) return b.typePriority - a.typePriority var h = heuristic(a) - heuristic(b) diff --git a/plugin/core/RootSearch.js b/plugin/core/RootSearch.js index ad23421..7a7e22a 100644 --- a/plugin/core/RootSearch.js +++ b/plugin/core/RootSearch.js @@ -151,7 +151,7 @@ function isEnabled(candidate, ctx) { } function rankOptions(ctx) { - return { sensitivity: ctx.sensitivity || "medium", nowMs: ctx.nowMs } + return { sensitivity: ctx.sensitivity || "medium", nowMs: ctx.nowMs, fleaHits: ctx.fleaHits || null } } function fallbackRows(query) { diff --git a/plugin/core/Rows.js b/plugin/core/Rows.js new file mode 100644 index 0000000..550aee5 --- /dev/null +++ b/plugin/core/Rows.js @@ -0,0 +1,20 @@ +function same(current, next) { + var keys = Object.keys(next) + for (var i = 0; i < keys.length; i++) if (current[keys[i]] !== next[keys[i]]) return false + return true +} + +// Keep existing delegates alive across search answers, as Flea 0.3.12's StableModel does for listings. +function update(model, next) { + var shared = Math.min(model.count, next.length) + for (var i = 0; i < shared; i++) if (!same(model.get(i), next[i])) model.set(i, next[i]) + if (model.count > next.length) model.remove(next.length, model.count - next.length) + if (model.count < next.length) model.append(next.slice(model.count)) +} + +// ListModel.get returns a mutable handle, so selection must keep a separate value. +function snapshot(model, index) { + return index >= 0 && index < model.count ? Object.assign({}, model.get(index)) : null +} + +if (typeof module !== "undefined") module.exports = { update, snapshot } diff --git a/plugin/services/NativeSearch.qml b/plugin/services/NativeSearch.qml new file mode 100644 index 0000000..6ba914e --- /dev/null +++ b/plugin/services/NativeSearch.qml @@ -0,0 +1,99 @@ +import QtQuick +import Quickshell.Io +import "../core/FleaSearch.js" as FleaSearch + +Item { + id: service + property var entries: [] + property var ids: [] + property string executable: decodeURIComponent(Qt.resolvedUrl("../bin/oma-cast-search").toString().replace(/^file:\/\//, "")) + property bool disabled: false + property bool loaded: false + property int serial: 0 + property int loadId: 0 + property var pending: null + signal failed(string message) + + function cancel() { + service.pending = null + timeout.stop() + } + + function invalidate() { + var request = service.pending + service.cancel() + service.loaded = false + service.loadId = 0 + if (helper.running) service.load() + if (request) request.callback(null) + } + + function search(query, sensitivity, callback) { + service.cancel() + if (service.disabled || query.length > FleaSearch.MAX_QUERY_LENGTH) { callback(null); return } + service.pending = { id: ++service.serial, query: query, sensitivity: sensitivity, callback: callback } + timeout.restart() + if (!helper.running) helper.running = true + else if (service.loaded) service.send() + } + + function load() { + service.loadId = ++service.serial + helper.write(JSON.stringify({ id: service.loadId, entries: service.entries }) + "\n") + } + + function send() { + var request = service.pending + if (request) helper.write(JSON.stringify({ id: request.id, query: request.query, sensitivity: request.sensitivity }) + "\n") + } + + function fail(message) { + var request = service.pending + service.cancel() + service.disabled = true + service.loaded = false + helper.running = false + service.failed(message) + if (request) request.callback(null) + } + + function receive(line) { + try { + var data = FleaSearch.reply(line) + var request = service.pending + if (data.id !== service.loadId && (!request || data.id !== request.id)) return + if (data.error) throw new Error(String(data.error)) + if (data.id === service.loadId) { + if (data.loaded !== service.entries.length) throw new Error("Search helper loaded the wrong entry count") + service.loaded = true + service.send() + return + } + if (!request || data.id !== request.id) return + var matches = FleaSearch.hits(data, service.ids) + service.cancel() + request.callback(matches) + } catch (error) { service.fail(String(error)) } + } + + onEntriesChanged: service.invalidate() + Component.onDestruction: { service.cancel(); helper.running = false } + + Timer { + id: timeout + interval: 1000 + onTriggered: service.fail("Search helper timed out; using the built-in matcher") + } + + Process { + id: helper + // Bash emits a normal process exit when the helper is missing or cannot execute. + command: ["bash", "-c", 'exec -- "$1"', "oma-cast-search", service.executable] + stdinEnabled: true + stdout: SplitParser { onRead: function(line) { service.receive(line) } } + onStarted: service.load() + onExited: function(exitCode, exitStatus) { + if (!service.disabled) service.fail("Search helper exited; using the built-in matcher") + } + } +} diff --git a/plugin/ui/LauncherWindow.qml b/plugin/ui/LauncherWindow.qml index 24a282e..892f1d2 100644 --- a/plugin/ui/LauncherWindow.qml +++ b/plugin/ui/LauncherWindow.qml @@ -6,6 +6,7 @@ import qs.Commons as Commons import qs.Ui import "../core/Agent.js" as Agent import "../core/RootSearch.js" as RootSearch +import "../core/Rows.js" as Rows // Omarchy 4.0.x dropped qs.Ui.OverlayWindow; this is the same full-screen // overlay layer the shell's own emoji picker uses. @@ -48,6 +49,8 @@ PanelWindow { property string query: "" property int selectedIndex: -1 property var selectedRow: null + property int searchSerial: 0 + property bool searchPending: false property bool actionPanelOpen: false property var actions: [] property var toast: null @@ -115,6 +118,9 @@ PanelWindow { onShownChanged: { if (window.shown) return + window.searchSerial++ + window.backend.cancelSearch() + window.searchPending = false window.closePopups() var seconds = Number(window.general.popToRootTimeout) if (!(seconds > 0)) window.popToRoot() @@ -148,33 +154,46 @@ PanelWindow { var top = next[next.length - 1] window.stack = next window.query = top.query || "" - window.rebuild(false) - if (top.selectedIndex >= 0) window.select(top.selectedIndex) + window.rebuild(false, top.selectedIndex) } - function rebuild(resetSelection) { + function rebuild(resetSelection, restoreIndex) { + var serial = ++window.searchSerial + window.backend.cancelSearch() pointerGate.reset() var keepId = !resetSelection && window.selectedRow ? window.selectedRow.itemId : "" - rows.clear() - if (window.view.kind === "alias") { window.select(-1); return } - var result = window.backend.callSync("rootSearch.search", { query: window.query, view: window.view, filter: window.atRoot ? window.rootFilter : "all" }) + window.searchPending = false + if (window.view.kind === "alias") { Rows.update(rows, []); window.select(-1); return } + window.searchPending = true + var revision = window.backend.candidatesRevision + window.backend.searchAsync({ query: window.query, view: window.view, filter: window.atRoot ? window.rootFilter : "all" }, function(result) { + if (serial !== window.searchSerial || revision !== window.backend.candidatesRevision) return + window.applySearch(result, keepId, restoreIndex) + window.searchPending = false + }) + } + + function applySearch(result, keepId, restoreIndex) { if (!result.ok) { + Rows.update(rows, []) window.showToast("failure", result.error) window.select(-1) return } - var keepIndex = -1 + var keepIndex = -1, next = [] for (var s = 0; s < result.data.length; s++) { var section = result.data[s] - if (section.title || s > 0) rows.append(window.rowData({ id: "section:" + section.id, title: section.title }, "section")) + if (section.title || s > 0) next.push(window.rowData({ id: "section:" + section.id, title: section.title }, "section")) for (var r = 0; r < section.rows.length; r++) { var c = section.rows[r] - if (c.id === keepId) keepIndex = rows.count - rows.append(window.rowData(c, c.kind === "calculator" ? "calculator" : "item")) + if (c.id === keepId) keepIndex = next.length + next.push(window.rowData(c, c.kind === "calculator" ? "calculator" : "item")) } } - window.select(keepIndex >= 0 ? keepIndex : window.nextSelectable(-1, 1)) + Rows.update(rows, next) + if (restoreIndex >= 0 && restoreIndex < rows.count && window.isSelectable(restoreIndex)) window.select(restoreIndex) + else window.select(keepIndex >= 0 ? keepIndex : window.nextSelectable(-1, 1)) } function rowData(c, kind) { @@ -211,8 +230,14 @@ PanelWindow { } function select(index) { + if (index !== window.selectedIndex) { + var previous = list.itemAtIndex(window.selectedIndex) + if (previous) previous.selected = false + } window.selectedIndex = index - window.selectedRow = index >= 0 && index < rows.count ? rows.get(index) : null + var current = list.itemAtIndex(index) + if (current) current.selected = true + window.selectedRow = Rows.snapshot(rows, index) // Argument values belong to one command; a different row starts empty. var id = window.selectedRow ? window.selectedRow.itemId : "" if (id !== window.argsForId) { @@ -260,12 +285,13 @@ PanelWindow { function actionsForSelected() { - if (!window.selectedRow) return [] + if (window.searchPending || !window.selectedRow) return [] var r = window.backend.callSync("rootSearch.getActions", { id: window.selectedRow.itemId }) return r.ok ? r.data : [] } function perform(actionId, index) { + if (window.searchPending) return if (index !== undefined && index >= 0) window.select(index) if (!window.selectedRow) return window.actionPanelOpen = false @@ -315,16 +341,16 @@ PanelWindow { function toggleActionPanel() { if (window.actionPanelOpen) { window.actionPanelOpen = false; return } window.actions = window.actionsForSelected() - actionPanel.filter = "" window.actionPanelOpen = window.actions.length > 0 + if (actionPanel.item) actionPanel.item.filter = "" } function toggleDropdown() { if (window.dropdownOpen || !window.atRoot) { window.dropdownOpen = false; return } - dropdown.filter = "" window.dropdownOpen = true + dropdown.item.filter = "" var at = RootSearch.FILTERS.map(function(f) { return f.id }).indexOf(window.rootFilter) - dropdown.selectedIndex = Math.max(0, at) + dropdown.item.selectedIndex = Math.max(0, at) } function setRootFilter(id) { @@ -345,8 +371,8 @@ PanelWindow { function toggleToastPanel() { if (window.toastPanelOpen) { window.toastPanelOpen = false; toastTimer.restart(); return } if (!window.toast || !window.toast.actions.length) return - toastPanel.filter = "" window.toastPanelOpen = true + toastPanel.item.filter = "" toastTimer.stop() } @@ -439,7 +465,7 @@ PanelWindow { var text = clipboardInput.text.replace(/[\r\n\u2028\u2029]+/g, " ") clipboardInput.clear() if (!text) return - if (window.actionPanelOpen) actionPanel.filter += text + if (window.actionPanelOpen) actionPanel.item.filter += text else if (window.argFocus >= 0) { var name = window.argDefs[window.argFocus].name var values = Object.assign({}, window.argValues) @@ -548,15 +574,15 @@ PanelWindow { } if (window.dropdownOpen) { if (ctrl && !shift && key === Qt.Key_P) { window.dropdownOpen = false; return true } - return window.handlePopupKey(event, dropdown, ctrl, alt) + return window.handlePopupKey(event, dropdown.item, ctrl, alt) } if (window.toastPanelOpen) { if (ctrl && key === Qt.Key_T) { window.toggleToastPanel(); return true } - return window.handlePopupKey(event, toastPanel, ctrl, alt) + return window.handlePopupKey(event, toastPanel.item, ctrl, alt) } if (window.actionPanelOpen) { if (window.isActionPanelKey(ctrl, alt, shift, key)) { window.actionPanelOpen = false; return true } - return window.handlePopupKey(event, actionPanel, ctrl, alt) + return window.handlePopupKey(event, actionPanel.item, ctrl, alt) } if (window.view.kind === "alias") { @@ -865,10 +891,13 @@ PanelWindow { visible: window.view.kind !== "alias" clip: true model: rows + reuseItems: true boundsBehavior: Flickable.StopAtBounds delegate: ResultRow { - selected: index === window.selectedIndex + Component.onCompleted: selected = index === window.selectedIndex + ListView.onReused: selected = index === window.selectedIndex + ListView.onPooled: selected = false look: window.look appLibrary: window.appLibrary zoom: window.zoom @@ -1026,78 +1055,88 @@ PanelWindow { } } - ActionPanel { + Loader { id: actionPanel - visible: window.actionPanelOpen + active: window.actionPanelOpen z: 10 anchors.right: parent.right anchors.rightMargin: card.borderRight + window.px(10) anchors.bottom: footer.top anchors.bottomMargin: window.px(6) - actions: window.actions - look: window.look - zoom: window.zoom - onActivated: function(actionId) { window.perform(actionId) } + sourceComponent: ActionPanel { + actions: window.actions + look: window.look + zoom: window.zoom + onActivated: function(actionId) { window.perform(actionId) } + } } - ActionPanel { + Loader { id: dropdown - visible: window.dropdownOpen + active: window.dropdownOpen z: 10 width: window.px(240) anchors.right: parent.right anchors.rightMargin: card.borderRight + window.px(10) anchors.top: header.bottom anchors.topMargin: window.px(4) - placeholder: "Filter…" - actions: RootSearch.FILTERS.map(function(f) { - return { id: f.id, title: f.title, shortcut: "", section: "filter", icon: f.id === window.rootFilter ? "✓" : " " } - }) - look: window.look - zoom: window.zoom - onActivated: function(id) { window.setRootFilter(id) } + sourceComponent: ActionPanel { + placeholder: "Filter…" + actions: RootSearch.FILTERS.map(function(f) { + return { id: f.id, title: f.title, shortcut: "", section: "filter", icon: f.id === window.rootFilter ? "✓" : " " } + }) + look: window.look + zoom: window.zoom + onActivated: function(id) { window.setRootFilter(id) } + } } - ActionPanel { + Loader { id: toastPanel - visible: window.toastPanelOpen + active: window.toastPanelOpen z: 10 width: window.px(280) anchors.left: parent.left anchors.leftMargin: card.borderLeft + window.px(10) anchors.bottom: footer.top anchors.bottomMargin: window.px(6) - placeholder: "Search toast actions…" - actions: (window.toast ? window.toast.actions : []).map(function(a) { - return { id: a.id, title: a.title, shortcut: "", section: "toast", icon: " " } - }) - look: window.look - zoom: window.zoom - onActivated: function(id) { window.runToastAction(id) } + sourceComponent: ActionPanel { + placeholder: "Search toast actions…" + actions: (window.toast ? window.toast.actions : []).map(function(a) { + return { id: a.id, title: a.title, shortcut: "", section: "toast", icon: " " } + }) + look: window.look + zoom: window.zoom + onActivated: function(id) { window.runToastAction(id) } + } } - InfoPanel { - visible: window.aboutOpen + Loader { + active: window.aboutOpen z: 10 anchors.right: parent.right anchors.rightMargin: card.borderRight + window.px(10) anchors.bottom: footer.top anchors.bottomMargin: window.px(6) - title: window.selectedRow ? window.selectedRow.title : "" - rows: window.aboutRows - look: window.look - zoom: window.zoom + sourceComponent: InfoPanel { + title: window.selectedRow ? window.selectedRow.title : "" + rows: window.aboutRows + look: window.look + zoom: window.zoom + } } - Alert { - visible: !!window.alert + Loader { + active: !!window.alert z: 20 anchors.fill: parent - spec: window.alert ? window.alert.spec : null - look: window.look - zoom: window.zoom - onConfirmed: window.confirmAlert() - onCancelled: window.alert = null + sourceComponent: Alert { + spec: window.alert ? window.alert.spec : null + look: window.look + zoom: window.zoom + onConfirmed: window.confirmAlert() + onCancelled: window.alert = null + } } } } diff --git a/plugin/ui/ResultRow.qml b/plugin/ui/ResultRow.qml index 99552b2..ab5a1ec 100644 --- a/plugin/ui/ResultRow.qml +++ b/plugin/ui/ResultRow.qml @@ -40,85 +40,88 @@ Item { // The inline calculator (ref 04 §1 Calculator): question on the left, // answer on the right, each with a caption, an arrow between them. - Rectangle { - visible: row.isCalculator + Loader { + active: row.isCalculator anchors.fill: parent - radius: Math.max(Style.cornerRadius, row.px(6)) - color: row.selected ? row.look.selectedBackground : Util.alpha(row.look.foreground, 0.04) - border.width: 1 - border.color: Util.alpha(row.look.foreground, row.selected ? 0 : 0.08) + sourceComponent: Rectangle { + anchors.fill: parent + radius: Math.max(Style.cornerRadius, row.px(6)) + color: row.selected ? row.look.selectedBackground : Util.alpha(row.look.foreground, 0.04) + border.width: 1 + border.color: Util.alpha(row.look.foreground, row.selected ? 0 : 0.08) - Repeater { - model: row.isCalculator ? [ - { text: row.calcInput, caption: row.calcInputCaption, answer: false }, - { text: row.calcResult, caption: row.calcResultCaption, answer: true } - ] : [] + Repeater { + model: row.isCalculator ? [ + { text: row.calcInput, caption: row.calcInputCaption, answer: false }, + { text: row.calcResult, caption: row.calcResultCaption, answer: true } + ] : [] - delegate: Item { - required property var modelData - required property int index - x: index === 0 ? 0 : parent.width / 2 + row.px(20) - width: parent.width / 2 - row.px(20) - height: parent.height - - Text { - id: calcText - textFormat: Text.PlainText - anchors.horizontalCenter: parent.horizontalCenter - anchors.verticalCenter: parent.verticalCenter - anchors.verticalCenterOffset: -row.px(10) - width: parent.width - row.px(24) - horizontalAlignment: Text.AlignHCenter - text: modelData.text - color: modelData.answer && row.selected ? row.look.accent : row.look.foreground - font.family: row.look.fontFamily - font.pixelSize: Math.round(Style.font.heading * 1.25 * row.zoom) - font.weight: modelData.answer ? Font.DemiBold : Font.Normal - fontSizeMode: Text.HorizontalFit - minimumPixelSize: Math.round(Style.font.body * row.zoom) - elide: Text.ElideRight - } - - Rectangle { - visible: modelData.caption.length > 0 - anchors.horizontalCenter: parent.horizontalCenter - anchors.top: calcText.bottom - anchors.topMargin: row.px(8) - width: Math.min(captionText.implicitWidth + row.px(16), parent.width - row.px(24)) - height: captionText.implicitHeight + row.px(6) - radius: height / 2 - color: Util.alpha(row.look.foreground, 0.08) + delegate: Item { + required property var modelData + required property int index + x: index === 0 ? 0 : parent.width / 2 + row.px(20) + width: parent.width / 2 - row.px(20) + height: parent.height Text { - id: captionText - anchors.centerIn: parent - width: Math.min(implicitWidth, parent.parent.width - row.px(40)) + id: calcText textFormat: Text.PlainText - text: modelData.caption - color: row.look.foreground - opacity: 0.7 + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + anchors.verticalCenterOffset: -row.px(10) + width: parent.width - row.px(24) + horizontalAlignment: Text.AlignHCenter + text: modelData.text + color: modelData.answer && row.selected ? row.look.accent : row.look.foreground font.family: row.look.fontFamily - font.pixelSize: Math.round(Style.font.caption * row.zoom) + font.pixelSize: Math.round(Style.font.heading * 1.25 * row.zoom) + font.weight: modelData.answer ? Font.DemiBold : Font.Normal + fontSizeMode: Text.HorizontalFit + minimumPixelSize: Math.round(Style.font.body * row.zoom) elide: Text.ElideRight } + + Rectangle { + visible: modelData.caption.length > 0 + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: calcText.bottom + anchors.topMargin: row.px(8) + width: Math.min(captionText.implicitWidth + row.px(16), parent.width - row.px(24)) + height: captionText.implicitHeight + row.px(6) + radius: height / 2 + color: Util.alpha(row.look.foreground, 0.08) + + Text { + id: captionText + anchors.centerIn: parent + width: Math.min(implicitWidth, parent.parent.width - row.px(40)) + textFormat: Text.PlainText + text: modelData.caption + color: row.look.foreground + opacity: 0.7 + font.family: row.look.fontFamily + font.pixelSize: Math.round(Style.font.caption * row.zoom) + elide: Text.ElideRight + } + } } } - } - Rectangle { - anchors.centerIn: parent - width: row.px(28) - height: row.px(28) - radius: width / 2 - color: Util.alpha(row.look.foreground, 0.08) - Text { + Rectangle { anchors.centerIn: parent - textFormat: Text.PlainText - text: "→" - color: row.look.foreground - opacity: 0.7 - font.family: row.look.fontFamily - font.pixelSize: Math.round(Style.font.body * row.zoom) + width: row.px(28) + height: row.px(28) + radius: width / 2 + color: Util.alpha(row.look.foreground, 0.08) + Text { + anchors.centerIn: parent + textFormat: Text.PlainText + text: "→" + color: row.look.foreground + opacity: 0.7 + font.family: row.look.fontFamily + font.pixelSize: Math.round(Style.font.body * row.zoom) + } } } } diff --git a/search/Cargo.lock b/search/Cargo.lock new file mode 100644 index 0000000..7c05199 --- /dev/null +++ b/search/Cargo.lock @@ -0,0 +1,107 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "oma-cast-search" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.154" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "syn" +version = "3.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563" + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/search/Cargo.toml b/search/Cargo.toml new file mode 100644 index 0000000..cb98de6 --- /dev/null +++ b/search/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "oma-cast-search" +version = "0.1.0" +edition = "2021" +license = "MIT" +publish = false + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" + +[profile.release] +lto = true diff --git a/search/LICENSE b/search/LICENSE new file mode 100644 index 0000000..ba6c6d1 --- /dev/null +++ b/search/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 GM + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/search/PROVENANCE.md b/search/PROVENANCE.md new file mode 100644 index 0000000..f679de9 --- /dev/null +++ b/search/PROVENANCE.md @@ -0,0 +1,87 @@ +# Matcher provenance + +The matcher comes from [Flea](https://github.com/thisisgm/flea), base commit `7c866397b` with +flea-search's pre-release `wk2` and `H` changes (diff SHA-256 +`942bbf17235ff91e7758ff3ff28d77a6c22924616d96ec343afe45b6d069ad14`). +The hashes below identify the exact upstream file contents used for this snapshot. + +| Source file | Source SHA-256 | +| --- | --- | +| `searchmatch.rs` | `1416164b21d32cfaee769582de04885a3d64e0d5180447a53977969f898b9158` | +| `searchascii.rs` | `a923431abd51f8ed93ad463a895fe1db518771b07b1b196cc6fcfb7b987b8c4c` | +| `searchtypo.rs` | `9edefcf793c1f02e6513c776e59103d4f84e41e6c46d198c591395a5b781470e` | +| `searchbits.rs` | `b7842ff21afbe14065556b82760b4c4185798cb1c8d41e01ed4f7d4896c2b027` | + +`searchascii.rs`, `searchtypo.rs`, and `searchbits.rs` are byte-for-byte copies. +The only change to `searchmatch.rs` is removal of this trailing module reference, +including its preceding blank line, because the snapshot does not include +`searchmatch_tests.rs`: + +```rust +#[cfg(test)] +#[path = "searchmatch_tests.rs"] +pub(crate) mod tests; +``` + +`src/backend/mod.rs` retains the original module hierarchy, including the +`crate::backend::searchtypo` reference. Unused filesystem-search APIs are allowed +at the adapter's module boundary so the vendored files need no warning edits. +The helper's own tests live in `src/engine.rs`, `src/protocol.rs`, and +`tests/protocol.rs`. + +## License + +The vendored source is MIT licensed, copyright (c) 2026 GM. The original MIT +license and notice are retained verbatim in `LICENSE`, SHA-256 +`d2a2191fc6fa3fb43cd6dfe0a7b156ded8f4a5e23c498ef1111788c37ec4f0c4`. + +## Adapter contract + +`oma-cast-search` uses synchronous NDJSON on stdin and stdout. Each response is +flushed before reading another request. A write, flush, or input I/O failure ends +the process with failure. Unknown object properties are accepted. Requests must +contain exactly one of `entries` or `query` and an unsigned 64-bit integer `id`. +Optional entry fields may be omitted; present nulls and wrong types are rejected. +Errors include `id` when a complete JSON object contains a valid unsigned ID. +Invalid JSON and oversized drained lines have no recoverable ID. Every rejected +request preserves the previously loaded catalog. A successful empty load counts +as loaded; any search before the first successful load fails. + +The caller applies `Ranker.transliterate` to every input string and query once. +The helper performs no transliteration, normalization, trimming, or path search. +Each score comes directly from `Matcher::name_bytes`. Hits retain loaded entry +order and contain explicit numeric or null `title`, `alternate`, `subtitle`, and +`keyword` scores. Entries with no surviving channel are omitted. Alternate and +keyword channels take their maximum score. A subtitle equal to the title after +Unicode lowercasing is not scored separately. Nonempty subtitles contribute both +`title + " " + subtitle` and `subtitle + " " + title` to keywords, even when the +subtitle duplicates the title. Bundle IDs contribute only to queries containing +a literal period. Empty queries return `hits: []` for legacy UI suggestions. + +All channels drop shadow typo scores `<= SHADOW_TYPO` (`992000`). Default +`medium` and `low` use the same upstream matching rules. `high` also drops scores +`< NAME - HIT_SPAN` (`1900000`), retaining all name subsequences and stronger +matches. Upstream name DP scores are bounded by `2000000 +/- 100000`; exact, +prefix, and word scores are `5000000`, `4000000`, and `3500000`. Upstream listed +typo scores are `999000` or `998000`: one edit from four alphanumeric query +characters, two from eight, and no edits when the query starts with a +non-alphanumeric character. Digits and punctuation remain literal. + +Limits are inclusive: 20000 entries per load, 1024 supplied text fields per +entry, 16384 UTF-8 bytes per supplied text field, 256 Unicode scalar values per +query, and 8 MiB per wire line excluding LF. The field count includes the title, +each present subtitle and bundle ID (including empty strings), and every +alternate-title and keyword array item. Generated keyword combinations are not +supplied fields. CR in CRLF counts toward the wire limit. `BufRead::take` limits +line reads to 8 MiB plus one detection byte; oversized lines drain through LF or +EOF using the existing reader buffer, without growing the line allocation. +The last line may omit LF. + +## Build and verification + +Dependencies are `serde` (derive) and `serde_json`; edition is 2021 and release +LTO is enabled. `Cargo.lock` records dependency resolution from the build host. +Run `cargo test --locked` and `cargo build --release --locked`. The integration tests execute the built binary and +cover protocol recovery, reload atomicity, channel scores, optional fields, +reordered fields, Unicode, long requests, and each input limit. Unit tests also +cover matcher tiers, shadow removal, sensitivity, and write/flush failure. diff --git a/search/src/backend/mod.rs b/search/src/backend/mod.rs new file mode 100644 index 0000000..52c4184 --- /dev/null +++ b/search/src/backend/mod.rs @@ -0,0 +1,3 @@ +pub(crate) mod searchbits; +pub(crate) mod searchmatch; +pub(crate) mod searchtypo; diff --git a/search/src/backend/searchascii.rs b/search/src/backend/searchascii.rs new file mode 100644 index 0000000..07089c8 --- /dev/null +++ b/search/src/backend/searchascii.rs @@ -0,0 +1,55 @@ +// ASCII candidates expose folded letters without allocating or expanding each byte to a Letter. +use super::{fold, Letter, Matcher, State, EXACT, NAME, PENDING_NAME, PREFIX, TYPO, WORD}; + +pub(crate) trait Text: Copy { + fn len(self) -> usize; + fn lower(self, at: usize) -> char; + fn boundary(self, at: usize) -> bool; + fn alphabetic(self, at: usize) -> bool { self.lower(at).is_alphabetic() } +} + +impl Text for &[Letter] { + fn len(self) -> usize { self.len() } + fn lower(self, at: usize) -> char { self[at].lower } + fn boundary(self, at: usize) -> bool { self[at].boundary } +} + +#[derive(Clone, Copy)] +pub(crate) struct Ascii<'a>(pub &'a [u8]); + +impl Text for Ascii<'_> { + fn len(self) -> usize { self.0.len() } + fn lower(self, at: usize) -> char { self.0[at].to_ascii_lowercase() as char } + fn boundary(self, at: usize) -> bool { + at == 0 || super::separator(self.0[at - 1] as char) + || (self.0[at].is_ascii_uppercase() && !self.0[at - 1].is_ascii_uppercase()) + } + fn alphabetic(self, at: usize) -> bool { self.0[at].is_ascii_alphabetic() } +} + +pub(super) fn name(matcher: &Matcher, query: &[u8], bytes: &[u8], letters: &mut Vec, state: &mut State, edits: &mut crate::backend::searchtypo::Scratch) -> Option { + if query.is_empty() { return Some(0); } + let hay = Ascii(bytes); + let prefix = |at| bytes.get(at..at + query.len()).is_some_and(|part| part.eq_ignore_ascii_case(query)); + if prefix(0) { return Some(if bytes.len() == query.len() { EXACT } else { PREFIX }); } + let mut matched = 0; + for at in 0..bytes.len() { + if hay.lower(at) as u8 == query[0] && at > 0 && hay.boundary(at) && prefix(at) { return Some(WORD); } + if query.get(matched).copied() == Some(hay.lower(at) as u8) { matched += 1; } + } + if matched == query.len() { + if matcher.defer { return Some(PENDING_NAME); } + fold(bytes, letters); + state.reset(); + state.advance(&matcher.needle, letters, true); + return state.score(NAME); + } + let distance = match matcher.typo.ascii_distance(hay, matcher.budget) { + Some(distance) => distance, + None => { + fold(bytes, letters); + matcher.distance(letters, edits) + } + }; + distance.map(|distance| TYPO - distance as i32 * 1000) +} diff --git a/search/src/backend/searchbits.rs b/search/src/backend/searchbits.rs new file mode 100644 index 0000000..ee5afc4 --- /dev/null +++ b/search/src/backend/searchbits.rs @@ -0,0 +1,23 @@ +// Letter presence is a rejection filter only; unknown bytes always keep the candidate. +pub(crate) const UNKNOWN: u64 = 1 << 63; +const LITERALS: u64 = ((1 << 16) - 1) << 26; + +pub(crate) fn mask(bytes: &[u8]) -> u64 { + bytes.iter().fold(0, |bits, byte| bits | match byte.to_ascii_lowercase() { + b'a'..=b'z' => 1 << (byte.to_ascii_lowercase() - b'a'), + b'0'..=b'9' => 1 << (26 + byte - b'0'), + b'/' => 1 << 36, + b'-' => 1 << 37, + b'_' => 1 << 38, + b'.' => 1 << 39, + b' ' => 1 << 40, + b'+' => 1 << 41, + _ => UNKNOWN, + }) +} + +pub(crate) fn possible(query: u64, candidate: u64, edits: usize) -> bool { + if (query | candidate) & UNKNOWN != 0 { return true; } + let missing = query & !candidate; + missing & LITERALS == 0 && missing.count_ones() as usize <= edits +} diff --git a/search/src/backend/searchmatch.rs b/search/src/backend/searchmatch.rs new file mode 100644 index 0000000..38060c5 --- /dev/null +++ b/search/src/backend/searchmatch.rs @@ -0,0 +1,233 @@ +// Typed search has its own matcher; folder jump keeps the legacy fuzzy scorer. +use super::searchbits; + +pub(crate) const EXACT: i32 = 5_000_000; +pub(crate) const PREFIX: i32 = 4_000_000; +pub(crate) const WORD: i32 = 3_500_000; +pub(crate) const ALIGNED: i32 = 3_000_000; +pub(crate) const NAME: i32 = 2_000_000; +pub(crate) const TYPO: i32 = 1_000_000; +// The best score a shadow typo can take: an answer drops it, narrowing keeps it. +pub(crate) const SHADOW_TYPO: i32 = TYPO - super::searchtypo::SHADOW as i32 * 1000; +// A DP hit moves a score at most this far inside its tier. +pub(crate) const HIT_SPAN: i32 = 100_000; +// Pass-1 markers for rows whose class is known and whose score inside it waits for the DP; a real score is never negative. +pub(crate) const PENDING_ALIGNED: i32 = -3; +pub(crate) const PENDING_NAME: i32 = -2; +// A NAME-class row whose basename alone is not a subsequence, so a parent-state bound can rank it before its DP. +pub(crate) const PENDING_PATH: i32 = -1; +const DEAD: i32 = i32::MIN / 4; +// State::advance's bonuses for a matched letter that continues a run, starts a word, or sits in the basename. +pub(crate) const RUN_BONUS: i32 = 8; +pub(crate) const BOUNDARY_BONUS: i32 = 6; +pub(crate) const BASENAME_BONUS: i32 = 4; + +#[derive(Clone, Copy)] +pub(crate) struct Letter { + pub lower: char, + pub boundary: bool, +} + +pub(crate) fn fold(bytes: &[u8], into: &mut Vec) { + into.clear(); + if bytes.is_ascii() { + let mut before: Option = None; + into.extend(bytes.iter().map(|&c| { + let boundary = before.map_or(true, |p| separator(p as char) || (c.is_ascii_uppercase() && !p.is_ascii_uppercase())); + before = Some(c); + Letter { lower: c.to_ascii_lowercase() as char, boundary } + })); + return; + } + let mut before: Option = None; + for c in String::from_utf8_lossy(bytes).chars() { + let boundary = before.map_or(true, |p| separator(p) || (c.is_uppercase() && !p.is_uppercase())); + into.push(Letter { lower: c.to_lowercase().next().unwrap_or(c), boundary }); + before = Some(c); + } +} + +pub(crate) fn separator(c: char) -> bool { matches!(c, '/' | '-' | '_' | '.' | ' ') } + +fn edit_budget(query: &str) -> usize { + let count = query.chars().filter(|c| c.is_alphanumeric()).count(); + if query.chars().next().is_some_and(|c| !c.is_alphanumeric()) { 0 } + else if count >= 8 { 2 } else if count >= 4 { 1 } else { 0 } +} + +#[derive(Clone)] +pub(crate) struct State { + best: Vec, + end: Vec, + pub hit: i32, +} + +impl State { + pub(crate) fn new(len: usize) -> Self { + let mut best = vec![DEAD; len + 1]; + best[0] = 0; + Self { best, end: vec![DEAD; len + 1], hit: if len == 0 { 0 } else { DEAD } } + } + + pub(crate) fn resize(&mut self, len: usize) { + self.best.resize(len + 1, DEAD); + self.end.resize(len + 1, DEAD); + self.reset(); + } + + #[cfg(test)] + pub(crate) fn heap_bytes(&self) -> usize { (self.best.capacity() + self.end.capacity()) * std::mem::size_of::() } + + pub(crate) fn best(&self) -> &[i32] { &self.best } + + pub(crate) fn copy_from(&mut self, other: &Self) { + self.best.clone_from(&other.best); + self.end.clone_from(&other.end); + self.hit = other.hit; + } + + pub(crate) fn reset(&mut self) { + self.best.fill(DEAD); + self.best[0] = 0; + self.end.fill(DEAD); + self.hit = if self.best.len() == 1 { 0 } else { DEAD }; + } + + // Descending query positions preserve the previous column without allocating another one. + pub(crate) fn advance(&mut self, query: &[char], letters: &[Letter], basename: bool) { + for letter in letters { + for k in (1..=query.len()).rev() { + let matched = if query[k - 1] == letter.lower { + self.best[k - 1].max(self.end[k - 1] + RUN_BONUS) + + i32::from(letter.boundary) * BOUNDARY_BONUS + i32::from(basename) * BASENAME_BONUS + } else { DEAD }; + self.best[k] = (self.best[k] - 1).max(matched); + self.end[k] = matched; + } + self.hit = self.hit.max(self.end[query.len()]); + } + } + + pub(crate) fn score(&self, tier: i32) -> Option { + (self.hit > DEAD / 2).then(|| tier + self.hit.clamp(-HIT_SPAN, HIT_SPAN)) + } + +} + +pub(crate) struct Matcher { + pub needle: Vec, + ascii: Option>, + pub bits: u64, + pub parent_bits: u64, + pub suffix_bits: Vec, + pub budget: usize, + typo: super::searchtypo::Plan, + pub prefix: usize, + parent_typo: super::searchtypo::Plan, + // Pass 1 of a ranked answer: a name or path that matches as a subsequence gets its class marker instead of its DP. + pub defer: bool, +} + +impl Matcher { + pub(crate) fn new(query: &str) -> Self { + let needle: Vec = query.chars().map(|c| c.to_lowercase().next().unwrap_or(c)).collect(); + let budget = edit_budget(query); + let typo = super::searchtypo::Plan::new(&needle); + let prefix = needle.iter().rposition(|&c| c == '/').map_or(0, |at| at + 1); + let parent_typo = super::searchtypo::Plan::new(&needle[..prefix]); + let ascii = needle.iter().all(char::is_ascii).then(|| needle.iter().map(|&c| c as u8).collect()); + let parent: String = needle[..prefix].iter().collect(); + let mut suffix_bits = vec![0; needle.len() + 1]; + let mut encoded = [0; 4]; + for at in (0..needle.len()).rev() { + suffix_bits[at] = suffix_bits[at + 1] | searchbits::mask(needle[at].encode_utf8(&mut encoded).as_bytes()); + } + Self { needle, ascii, bits: searchbits::mask(query.as_bytes()), parent_bits: searchbits::mask(parent.as_bytes()), suffix_bits, budget, typo, prefix, parent_typo, defer: false } + } + + pub(crate) fn deferred(query: &str) -> Self { + Self { defer: true, ..Self::new(query) } + } + + pub(crate) fn can_narrow(before: &str, now: &str) -> bool { + if !now.starts_with(before) { return false; } + let budget = edit_budget(before); + // The first slash enables path typos, so it must not enlarge the match set. + budget == edit_budget(now) + && (budget == 0 || before.contains('/') || !now.contains('/')) + } + + pub(crate) fn name(&self, letters: &[Letter], state: &mut State, edits: &mut super::searchtypo::Scratch) -> Option { + if self.needle.is_empty() { return Some(0); } + let prefix = |at: usize| letters.get(at..at + self.needle.len()).is_some_and(|part| { + part.iter().zip(&self.needle).all(|(letter, query)| letter.lower == *query) + }); + if prefix(0) { return Some(if letters.len() == self.needle.len() { EXACT } else { PREFIX }); } + if (1..letters.len()).any(|at| letters[at].boundary && prefix(at)) { return Some(WORD); } + let mut at = 0; + for letter in letters { + if self.needle.get(at) == Some(&letter.lower) { at += 1; } + } + if at == self.needle.len() { + if self.defer { return Some(PENDING_NAME); } + state.reset(); + state.advance(&self.needle, letters, true); + return state.score(NAME); + } + self.distance(letters, edits).map(|distance| TYPO - distance as i32 * 1000) + } + + pub(crate) fn name_bytes(&self, bytes: &[u8], letters: &mut Vec, state: &mut State, edits: &mut super::searchtypo::Scratch) -> Option { + if let Some(query) = self.ascii.as_ref().filter(|_| bytes.is_ascii()) { + return ascii::name(self, query, bytes, letters, state, edits); + } + fold(bytes, letters); + self.name(letters, state, edits) + } + + pub(crate) fn reach(&self, bytes: &[u8], mut at: usize) -> usize { + if bytes.is_ascii() { + for &byte in bytes { + if self.needle.get(at) == Some(&(byte.to_ascii_lowercase() as char)) { at += 1; } + } + } else { + for c in String::from_utf8_lossy(bytes).chars() { + if self.needle.get(at) == Some(&c.to_lowercase().next().unwrap_or(c)) { at += 1; } + } + } + at + } + + pub(crate) fn distance(&self, letters: &[Letter], scratch: &mut super::searchtypo::Scratch) -> Option { + self.typo.distance(&self.needle, letters, self.budget, scratch) + } + + pub(crate) fn parent_possible(&self, letters: &[Letter], scratch: &mut super::searchtypo::Scratch) -> bool { + self.parent_typo.distance(&self.needle[..self.prefix], letters, self.budget, scratch).is_some() + } + + #[cfg(test)] + pub(crate) fn full(&self, path: &[u8]) -> Option { + let mut letters = Vec::new(); + fold(path, &mut letters); + let base = path.iter().rposition(|&b| b == b'/').map_or(0, |at| at + 1); + let mut leaf = Vec::new(); + fold(&path[base..], &mut leaf); + let mut state = State::new(self.needle.len()); + let name = self.name_bytes(&path[base..], &mut leaf, &mut state, &mut super::searchtypo::Scratch::default()); + if name.is_some_and(|score| score > NAME + HIT_SPAN) || base == 0 { return name; } + state = State::new(self.needle.len()); + let split = letters.len() - leaf.len(); + state.advance(&self.needle, &letters[..split], false); + state.advance(&self.needle, &leaf, true); + let mut score = name.max(state.score(if self.needle.contains(&'/') { ALIGNED } else { NAME })); + if self.needle.contains(&'/') { + score = score.max(self.distance(&letters, &mut super::searchtypo::Scratch::default()) + .map(|distance| TYPO - distance as i32 * 1000)); + } + score + } +} + +#[path = "searchascii.rs"] +pub(crate) mod ascii; diff --git a/search/src/backend/searchtypo.rs b/search/src/backend/searchtypo.rs new file mode 100644 index 0000000..9f7ee2b --- /dev/null +++ b/search/src/backend/searchtypo.rs @@ -0,0 +1,219 @@ +// Banded optimal-string-alignment distance at word starts, with literal digits and punctuation. +use super::searchmatch::{Letter, ascii::{Ascii, Text}}; + +// Each row is two layers: index 0 without a dropped query letter, index 1 with one, which may only end at a word end. +#[derive(Default)] +pub(crate) struct Scratch { + older: [Vec; 2], + previous: [Vec; 2], + current: [Vec; 2], +} + +fn editable(c: char) -> bool { c.is_alphabetic() } + +// A match only a query letter dropped inside a word gives is reported SHADOW edits further: narrowing keeps it, answers never list it. +pub(crate) const SHADOW: usize = 8; + +// The listed distance, else the shadow of an unrestricted one, so the match set still only shrinks as the query grows. +fn reported(best: usize, plain: usize, budget: usize) -> Option { + if best <= budget { Some(best) } else { (plain <= budget).then_some(SHADOW + plain) } +} + +fn word_end(hay: &[Letter], at: usize) -> bool { + at == hay.len() || !editable(hay[at].lower) || hay[at].boundary +} + +impl Scratch { + pub(crate) fn distance(&mut self, query: &[char], hay: &[Letter], budget: usize) -> Option { + if budget == 0 { return None; } + let (mut best, mut plain) = (budget + 1, budget + 1); + for start in 0..hay.len() { + if !hay[start].boundary || hay.len() - start + budget < query.len() { continue; } + let len = (hay.len() - start).min(query.len() + budget); + for layer in 0..2 { + self.older[layer].resize(len + 1, budget + 1); + self.previous[layer].resize(len + 1, budget + 1); + self.current[layer].resize(len + 1, budget + 1); + self.previous[layer].fill(budget + 1); + } + self.previous[0][0] = 0; + for j in 1..=len.min(budget) { + self.previous[0][j] = if editable(hay[start + j - 1].lower) { self.previous[0][j - 1] + 1 } else { budget + 1 }; + } + for i in 1..=query.len() { + for layer in 0..2 { self.current[layer].fill(budget + 1); } + if editable(query[i - 1]) { self.current[1][0] = self.previous[0][0].min(self.previous[1][0]) + 1; } + let mut low = self.current[1][0]; + for j in i.saturating_sub(budget).max(1)..=len.min(i + budget) { + let (a, b) = (query[i - 1], hay[start + j - 1].lower); + for layer in 0..2 { + let previous = &self.previous[layer]; + let mut value = if a == b { previous[j - 1] } + else if editable(a) && editable(b) { previous[j - 1] + 1 } else { budget + 1 }; + if layer == 1 && editable(a) { value = value.min(self.previous[0][j].min(self.previous[1][j]) + 1); } + if editable(b) { value = value.min(self.current[layer][j - 1] + 1); } + if i > 1 && j > 1 && a == hay[start + j - 2].lower && query[i - 2] == b && editable(a) && editable(b) { + value = value.min(self.older[layer][j - 2] + 1); + } + self.current[layer][j] = value.min(budget + 1); + low = low.min(value); + } + } + std::mem::swap(&mut self.older, &mut self.previous); + std::mem::swap(&mut self.previous, &mut self.current); + if low > budget { break; } + if i == query.len() { + for j in query.len().saturating_sub(budget)..=len { + best = best.min(self.previous[0][j]); + plain = plain.min(self.previous[0][j]).min(self.previous[1][j]); + if word_end(hay, start + j) { best = best.min(self.previous[1][j]); } + } + } + } + } + reported(best, plain, budget) + } +} + +// Short ASCII queries use the same edit automaton packed into three bounded bit sets. +pub(crate) struct Plan { + equal: [u64; 128], + letters: u64, + goal: u64, + segments: Vec<(usize, u32)>, + literals: Vec, +} + +impl Plan { + pub(crate) fn new(query: &[char]) -> Self { + let mut plan = Self { equal: [0; 128], letters: 0, goal: 0, segments: Vec::new(), literals: Vec::new() }; + if query.len() >= 64 || !query.iter().all(char::is_ascii) { return plan; } + plan.goal = 1 << query.len(); + let (mut len, mut bits) = (0, 0); + for (at, &c) in query.iter().enumerate() { + plan.equal[c as usize] |= 1 << at; + if editable(c) { + plan.letters |= 1 << at; + len += 1; + bits |= 1 << (c.to_ascii_lowercase() as u8 - b'a'); + } else { + plan.segments.push((len, bits)); + plan.literals.push(c); + (len, bits) = (0, 0); + } + } + plan.segments.push((len, bits)); + plan + } + + // An edit cannot cross a literal, so length and missing-letter costs add across its segments. + fn possible(&self, hay: impl Text, budget: usize) -> bool { + if !self.trailing_possible(hay, budget) { return false; } + for start in 0..hay.len() { + if !hay.boundary(start) { continue; } + let (mut at, mut spent, mut valid) = (start, 0, true); + for (part, &(wanted, required)) in self.segments.iter().enumerate() { + let last = part == self.literals.len(); + let (mut len, mut bits, mut over) = (0usize, 0u32, false); + while at < hay.len() && hay.alphabetic(at) { + if len == wanted + budget { + over = !last; + break; + } + let c = hay.lower(at); + if c.is_ascii_alphabetic() { bits |= 1 << (c.to_ascii_lowercase() as u8 - b'a'); } + len += 1; + at += 1; + } + let length = if last { wanted.saturating_sub(len) } else { wanted.abs_diff(len) }; + spent += length.max((required & !bits).count_ones() as usize); + if over || spent > budget { valid = false; break; } + if last { return true; } + if at == hay.len() || hay.lower(at) != self.literals[part] { + valid = false; + break; + } + at += 1; + } + if valid { return true; } + } + false + } + + // The segment before the last literal must fit immediately before one occurrence of that literal. + fn trailing_possible(&self, hay: impl Text, budget: usize) -> bool { + let Some(&literal) = self.literals.last() else { return true }; + let part = self.literals.len() - 1; + let (wanted, required) = self.segments[part]; + for end in (0..hay.len()).rev() { + if hay.lower(end) != literal { continue; } + let (mut at, mut len, mut bits) = (end, 0usize, 0u32); + while at > 0 && len < wanted + budget && hay.alphabetic(at - 1) { + at -= 1; + len += 1; + let c = hay.lower(at); + if c.is_ascii_alphabetic() { bits |= 1 << (c.to_ascii_lowercase() as u8 - b'a'); } + } + if part > 0 && at > 0 && hay.alphabetic(at - 1) { continue; } + let length = if part == 0 { wanted.saturating_sub(len) } else { wanted.abs_diff(len) }; + if length.max((required & !bits).count_ones() as usize) <= budget { return true; } + } + false + } + + pub(crate) fn distance(&self, query: &[char], hay: &[Letter], budget: usize, scratch: &mut Scratch) -> Option { + if budget == 0 { return None; } + if self.goal == 0 { return scratch.distance(query, hay, budget); } + self.bit_distance(hay, budget) + } + + pub(crate) fn ascii_distance(&self, hay: Ascii<'_>, budget: usize) -> Option> { + if budget == 0 { return Some(None); } + if self.goal == 0 { return None; } + Some(self.bit_distance(hay, budget)) + } + + fn bit_distance(&self, hay: impl Text, budget: usize) -> Option { + if !self.possible(hay, budget) { return None; } + // Layer 0 holds states without a dropped query letter, layer 1 states with one, which may only end at a word end. + let mut start = [[0u64; 3]; 2]; + start[0] = [1; 3]; + for e in 1..=budget { start[1][e] = start[1][e - 1] | (((start[0][e - 1] | start[1][e - 1]) & self.letters) << 1); } + let mut previous = [[0u64; 3]; 2]; + let mut older = [[0u64; 3]; 2]; + let mut last = '\0'; + let mut last_editable = false; + let (mut best, mut plain) = (budget + 1, budget + 1); + for at in 0..hay.len() { + let lower = hay.lower(at); + let editable = hay.alphabetic(at); + if hay.boundary(at) { + for layer in 0..2 { for e in 0..=budget { previous[layer][e] |= start[layer][e]; } } + } + let equal = self.equal.get(lower as usize).copied().unwrap_or(0); + let before = if last_editable { self.equal.get(last as usize).copied().unwrap_or(0) } else { 0 }; + let ends = at + 1 == hay.len() || !hay.alphabetic(at + 1) || hay.boundary(at + 1); + let mut current = [[0u64; 3]; 2]; + for e in 0..=budget { + for layer in 0..2 { + current[layer][e] = (previous[layer][e] & equal) << 1; + if e > 0 { + current[layer][e] |= current[layer][e - 1]; + if editable { + current[layer][e] |= previous[layer][e - 1] | ((previous[layer][e - 1] & self.letters) << 1); + current[layer][e] |= (older[layer][e - 1] & equal & (before >> 1)) << 2; + } + } + } + if e > 0 { current[1][e] |= ((current[0][e - 1] | current[1][e - 1]) & self.letters) << 1; } + if current[0][e] & self.goal != 0 || (ends && current[1][e] & self.goal != 0) { best = best.min(e); } + if (current[0][e] | current[1][e]) & self.goal != 0 { plain = plain.min(e); } + } + older = previous; + previous = current; + last = lower; + last_editable = editable; + } + reported(best, plain, budget) + } +} diff --git a/search/src/engine.rs b/search/src/engine.rs new file mode 100644 index 0000000..c329acc --- /dev/null +++ b/search/src/engine.rs @@ -0,0 +1,277 @@ +use crate::backend::searchmatch::{Letter, Matcher, State, HIT_SPAN, NAME, SHADOW_TYPO}; +use crate::backend::searchtypo::Scratch; +use serde::{Deserialize, Deserializer, Serialize}; + +pub(crate) const MAX_ENTRIES: usize = 20_000; +pub(crate) const MAX_FIELD_BYTES: usize = 16_384; +pub(crate) const MAX_FIELDS: usize = 1_024; +pub(crate) const MAX_QUERY_CHARS: usize = 256; + +// Input: {"title":"Firefox","subtitle":"Browser","alternateTitles":[],"keywords":[],"bundleId":"org.mozilla.firefox"}. +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct Entry { + title: String, + #[serde(default, deserialize_with = "present_string")] + subtitle: Option, + #[serde(default)] + alternate_titles: Vec, + #[serde(default)] + keywords: Vec, + #[serde(default, deserialize_with = "present_string")] + bundle_id: Option, +} + +// An absent optional string is valid; a present null is a shape error. +fn present_string<'de, D: Deserializer<'de>>(deserializer: D) -> Result, D::Error> { + String::deserialize(deserializer).map(Some) +} + +struct Candidate { + title: String, + subtitle: Option, + alternate_titles: Vec, + keywords: Vec, + bundle_id: Option, +} + +impl Entry { + fn validate(&self, index: usize) -> Result<(), String> { + let fields = 1 + usize::from(self.subtitle.is_some()) + + self.alternate_titles.len() + self.keywords.len() + + usize::from(self.bundle_id.is_some()); + if fields > MAX_FIELDS { + return Err(format!("entries[{index}] exceeds {MAX_FIELDS} text fields")); + } + let check = |field: &str, text: &str| { + if text.len() > MAX_FIELD_BYTES { + Err(format!("entries[{index}].{field} exceeds {MAX_FIELD_BYTES} bytes")) + } else { + Ok(()) + } + }; + check("title", &self.title)?; + if let Some(text) = &self.subtitle { + check("subtitle", text)?; + } + if let Some(text) = &self.bundle_id { + check("bundleId", text)?; + } + for (at, text) in self.alternate_titles.iter().enumerate() { + check(&format!("alternateTitles[{at}]"), text)?; + } + for (at, text) in self.keywords.iter().enumerate() { + check(&format!("keywords[{at}]"), text)?; + } + Ok(()) + } + + fn prepare(self) -> Candidate { + let mut keywords = self.keywords; + let subtitle = self.subtitle.filter(|text| !text.is_empty()); + if let Some(text) = &subtitle { + keywords.push(format!("{} {text}", self.title)); + keywords.push(format!("{text} {}", self.title)); + } + let subtitle = subtitle.filter(|text| text.to_lowercase() != self.title.to_lowercase()); + Candidate { + title: self.title, + subtitle, + alternate_titles: self.alternate_titles, + keywords, + bundle_id: self.bundle_id, + } + } +} + +#[derive(Clone, Copy, Default, Deserialize, PartialEq)] +#[serde(rename_all = "lowercase")] +pub(crate) enum Sensitivity { + Low, + #[default] + Medium, + High, +} + +#[derive(Debug, Serialize)] +pub(crate) struct Hit { + pub index: usize, + pub title: Option, + pub alternate: Option, + pub subtitle: Option, + pub keyword: Option, +} + +struct Scorer { + matcher: Matcher, + letters: Vec, + state: State, + edits: Scratch, + sensitivity: Sensitivity, +} + +impl Scorer { + fn new(query: &str, sensitivity: Sensitivity) -> Self { + let matcher = Matcher::new(query); + let state = State::new(matcher.needle.len()); + Self { matcher, letters: Vec::new(), state, edits: Scratch::default(), sensitivity } + } + + fn score(&mut self, text: &str) -> Option { + self.matcher.name_bytes(text.as_bytes(), &mut self.letters, &mut self.state, &mut self.edits) + .filter(|score| *score > SHADOW_TYPO + && (self.sensitivity != Sensitivity::High || *score >= NAME - HIT_SPAN)) + } +} + +#[derive(Default)] +pub(crate) struct Catalog { + entries: Option>, +} + +impl Catalog { + pub(crate) fn load(&mut self, entries: Vec) -> Result { + if entries.len() > MAX_ENTRIES { + return Err(format!("entries exceeds {MAX_ENTRIES} candidates")); + } + for (index, entry) in entries.iter().enumerate() { + entry.validate(index)?; + } + let count = entries.len(); + self.entries = Some(entries.into_iter().map(Entry::prepare).collect()); + Ok(count) + } + + pub(crate) fn search(&self, query: &str, sensitivity: Sensitivity) -> Result, String> { + let entries = self.entries.as_ref().ok_or("search requires a successful load first")?; + if query.chars().count() > MAX_QUERY_CHARS { + return Err(format!("query exceeds {MAX_QUERY_CHARS} characters")); + } + if query.is_empty() { + return Ok(Vec::new()); + } + let mut scorer = Scorer::new(query, sensitivity); + let mut hits = Vec::new(); + for (index, entry) in entries.iter().enumerate() { + let title = scorer.score(&entry.title); + let alternate = entry.alternate_titles.iter().filter_map(|text| scorer.score(text)).max(); + let subtitle = entry.subtitle.as_ref().and_then(|text| scorer.score(text)); + let mut keyword = entry.keywords.iter().filter_map(|text| scorer.score(text)).max(); + if query.contains('.') { + if let Some(bundle_id) = &entry.bundle_id { + keyword = keyword.max(scorer.score(bundle_id)); + } + } + if title.is_some() || alternate.is_some() || subtitle.is_some() || keyword.is_some() { + hits.push(Hit { index, title, alternate, subtitle, keyword }); + } + } + Ok(hits) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::backend::searchmatch::{EXACT, PREFIX, TYPO, WORD}; + use serde_json::json; + + fn catalog(entries: serde_json::Value) -> Catalog { + let mut catalog = Catalog::default(); + catalog.load(serde_json::from_value(entries).unwrap()).unwrap(); + catalog + } + + #[test] + fn name_tiers_and_loaded_order_are_preserved() { + let catalog = catalog(json!([ + {"title":"Fire"}, {"title":"Firefox"}, {"title":"Mozilla Fire"}, + {"title":"first-response"}, {"title":"zzzz"} + ])); + let hits = catalog.search("fire", Sensitivity::Medium).unwrap(); + assert_eq!(hits.iter().map(|hit| hit.index).collect::>(), vec![0, 1, 2, 3]); + assert_eq!(hits[0].title, Some(EXACT)); + assert_eq!(hits[1].title, Some(PREFIX)); + assert_eq!(hits[2].title, Some(WORD)); + assert!((NAME - HIT_SPAN..=NAME + HIT_SPAN).contains(&hits[3].title.unwrap())); + } + + #[test] + fn typo_scores_survive_low_and_medium_but_not_high() { + let catalog = catalog(json!([{ "title":"Firefox" }])); + for query in ["firefoc", "fierfox"] { + for sensitivity in [Sensitivity::Low, Sensitivity::Medium] { + assert_eq!(catalog.search(query, sensitivity).unwrap()[0].title, Some(TYPO - 1000)); + } + assert!(catalog.search(query, Sensitivity::High).unwrap().is_empty()); + } + assert!(!catalog.search("frfx", Sensitivity::High).unwrap().is_empty()); + } + + #[test] + fn shadow_typos_are_never_returned() { + let mut scorer = Scorer::new("firre", Sensitivity::Medium); + let raw = scorer.matcher.name_bytes(b"Firefox", &mut scorer.letters, &mut scorer.state, &mut scorer.edits); + assert!(raw.is_some_and(|score| score <= SHADOW_TYPO)); + assert!(scorer.score("Firefox").is_none()); + let catalog = catalog(json!([ + { "title":"Firefox", "alternateTitles":["Firefox"], "keywords":["Firefox"] }, + { "title":"zzzz", "subtitle":"Firefox" } + ])); + assert!(catalog.search("firre", Sensitivity::Low).unwrap().is_empty()); + } + + #[test] + fn combined_keywords_keep_real_subsequences_when_title_is_only_a_shadow() { + let catalog = catalog(json!([{ "title":"Firefox", "subtitle":"Firefox Tool" }])); + let hits = catalog.search("firre", Sensitivity::High).unwrap(); + assert_eq!(hits.len(), 1); + assert_eq!(hits[0].title, None); + assert_eq!(hits[0].subtitle, None); + assert!((NAME - HIT_SPAN..=NAME + HIT_SPAN).contains(&hits[0].keyword.unwrap())); + } + + #[test] + fn unicode_folding_and_long_query_fallback_work_without_transliteration() { + let long = "é".repeat(65); + let catalog = catalog(json!([{ "title":"Файл" }, { "title":"Café" }, { "title":long }])); + assert_eq!(catalog.search("фАЙЛ", Sensitivity::High).unwrap()[0].title, Some(EXACT)); + assert!((NAME - HIT_SPAN..=NAME + HIT_SPAN).contains(&catalog.search("фл", Sensitivity::High).unwrap()[0].title.unwrap())); + assert_eq!(catalog.search("café", Sensitivity::High).unwrap()[0].title, Some(EXACT)); + assert!(catalog.search("cafe", Sensitivity::High).unwrap().is_empty()); + assert_eq!(catalog.search(&"é".repeat(65), Sensitivity::High).unwrap()[0].title, Some(EXACT)); + } + + #[test] + fn channel_maxima_combinations_and_bundle_gate_are_independent() { + let catalog = catalog(json!([{ "title":"Alpha", "subtitle":"Beta", + "alternateTitles":["Alpha Tool", "Alpha"], "keywords":["Beta Alpha Tool", "Beta Alpha"], + "bundleId":"org.unique.app" }])); + let hits = catalog.search("alpha", Sensitivity::Medium).unwrap(); + assert_eq!(hits[0].title, Some(EXACT)); + assert_eq!(hits[0].alternate, Some(EXACT)); + assert_eq!(hits[0].subtitle, None); + assert_eq!(catalog.search("beta", Sensitivity::Medium).unwrap()[0].subtitle, Some(EXACT)); + assert_eq!(catalog.search("alpha beta", Sensitivity::High).unwrap()[0].keyword, Some(EXACT)); + assert_eq!(catalog.search("beta alpha", Sensitivity::High).unwrap()[0].keyword, Some(EXACT)); + assert!(catalog.search("unique", Sensitivity::High).unwrap().is_empty()); + assert_eq!(catalog.search("org.unique.app", Sensitivity::High).unwrap()[0].keyword, Some(EXACT)); + } + + #[test] + fn repeated_subtitle_is_suppressed_using_unicode_case_folding() { + let catalog = catalog(json!([{ "title":"CAFÉ", "subtitle":"café" }])); + let hits = catalog.search("café", Sensitivity::High).unwrap(); + assert_eq!(hits[0].title, Some(EXACT)); + assert_eq!(hits[0].subtitle, None); + } + + #[test] + fn query_limit_counts_characters_and_field_limit_counts_bytes() { + let catalog = catalog(json!([{ "title":"é".repeat(MAX_FIELD_BYTES / 2) }])); + assert_eq!(catalog.search(&"é".repeat(MAX_QUERY_CHARS), Sensitivity::Medium).unwrap()[0].title, Some(PREFIX)); + assert!(catalog.search(&"é".repeat(MAX_QUERY_CHARS + 1), Sensitivity::Medium).is_err()); + let mut old = Catalog::default(); + assert!(old.load(serde_json::from_value(json!([{ "title":"é".repeat(MAX_FIELD_BYTES / 2 + 1) }])).unwrap()).is_err()); + } +} diff --git a/search/src/main.rs b/search/src/main.rs new file mode 100644 index 0000000..289a63a --- /dev/null +++ b/search/src/main.rs @@ -0,0 +1,21 @@ +// Vendored matcher also exposes filesystem-search APIs unused by this adapter. +#[allow(dead_code)] +mod backend; +mod engine; +mod protocol; + +use std::io::{self, BufWriter}; +use std::process::ExitCode; + +fn main() -> ExitCode { + let stdin = io::stdin(); + let stdout = io::stdout(); + let mut output = BufWriter::new(stdout.lock()); + match protocol::run(stdin.lock(), &mut output) { + Ok(()) => ExitCode::SUCCESS, + Err(error) => { + eprintln!("oma-cast-search: {error}"); + ExitCode::FAILURE + } + } +} diff --git a/search/src/protocol.rs b/search/src/protocol.rs new file mode 100644 index 0000000..c463a36 --- /dev/null +++ b/search/src/protocol.rs @@ -0,0 +1,160 @@ +use crate::engine::{Catalog, Entry, Hit, Sensitivity}; +use serde::{Deserialize, Serialize}; +use serde_json::Value; +use std::io::{self, BufRead, Read, Write}; + +pub(crate) const MAX_LINE_BYTES: usize = 8 * 1024 * 1024; + +// Input: {"id":1,"entries":[{"title":"Firefox"}]}. +#[derive(Deserialize)] +struct LoadRequest { + id: u64, + entries: Vec, +} + +// Input: {"id":2,"query":"fire","sensitivity":"medium"}. +#[derive(Deserialize)] +struct SearchRequest { + id: u64, + query: String, + #[serde(default)] + sensitivity: Sensitivity, +} + +#[derive(Serialize)] +#[serde(untagged)] +enum Response { + Loaded { id: u64, loaded: usize }, + Hits { id: u64, hits: Vec }, + Error { + #[serde(skip_serializing_if = "Option::is_none")] + id: Option, + error: String, + }, +} + +impl Response { + fn error(id: Option, error: impl Into) -> Self { + Self::Error { id, error: error.into() } + } +} + +fn request(value: Value, catalog: &mut Catalog) -> Result { + let object = value.as_object().ok_or("request must be an object")?; + match (object.contains_key("entries"), object.contains_key("query")) { + (true, false) => { + let request: LoadRequest = serde_json::from_value(value) + .map_err(|error| format!("invalid load request: {error}"))?; + let loaded = catalog.load(request.entries)?; + Ok(Response::Loaded { id: request.id, loaded }) + } + (false, true) => { + let request: SearchRequest = serde_json::from_value(value) + .map_err(|error| format!("invalid search request: {error}"))?; + let hits = catalog.search(&request.query, request.sensitivity)?; + Ok(Response::Hits { id: request.id, hits }) + } + _ => Err("request must contain exactly one of entries or query".into()), + } +} + +// Input is one complete JSON object per line; property order and unknown properties are unrestricted. +fn response(line: &[u8], catalog: &mut Catalog) -> Response { + let value: Value = match serde_json::from_slice(line) { + Ok(value) => value, + Err(error) => return Response::error(None, format!("invalid JSON request: {error}")), + }; + let id = value.get("id").and_then(Value::as_u64); + request(value, catalog).unwrap_or_else(|error| Response::error(id, error)) +} + +fn drain_line(reader: &mut impl BufRead) -> io::Result<()> { + loop { + let bytes = reader.fill_buf()?; + if bytes.is_empty() { + return Ok(()); + } + let newline = bytes.iter().position(|&byte| byte == b'\n'); + let consumed = newline.map_or(bytes.len(), |at| at + 1); + reader.consume(consumed); + if newline.is_some() { + return Ok(()); + } + } +} + +pub(crate) fn run(mut reader: impl BufRead, writer: &mut impl Write) -> io::Result<()> { + let mut catalog = Catalog::default(); + let mut line = Vec::new(); + loop { + line.clear(); + let read = reader.by_ref().take((MAX_LINE_BYTES + 1) as u64).read_until(b'\n', &mut line)?; + if read == 0 { + return Ok(()); + } + if line.last() == Some(&b'\n') { + line.pop(); + } + let reply = if line.len() > MAX_LINE_BYTES { + drain_line(&mut reader)?; + Response::error(None, format!("request line exceeds {MAX_LINE_BYTES} bytes")) + } else { + response(&line, &mut catalog) + }; + serde_json::to_writer(&mut *writer, &reply).map_err(|error| { + io::Error::new(error.io_error_kind().unwrap_or(io::ErrorKind::Other), error) + })?; + writer.write_all(b"\n")?; + writer.flush()?; + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::io::{BufReader, Cursor}; + + struct BrokenWriter { + fail_flush: bool, + } + + impl Write for BrokenWriter { + fn write(&mut self, bytes: &[u8]) -> io::Result { + if self.fail_flush { + Ok(bytes.len()) + } else { + Err(io::Error::new(io::ErrorKind::BrokenPipe, "closed output")) + } + } + + fn flush(&mut self) -> io::Result<()> { + Err(io::Error::new(io::ErrorKind::BrokenPipe, "closed output")) + } + } + + #[test] + fn write_and_flush_failure_stop_before_reading_next_request() { + let first = b"{\"id\":1,\"entries\":[]}\n"; + let mut input = first.to_vec(); + input.extend_from_slice(b"{\"id\":2,\"query\":\"abc\"}\n"); + for fail_flush in [false, true] { + let mut reader = Cursor::new(&input); + let error = run(&mut reader, &mut BrokenWriter { fail_flush }).unwrap_err(); + assert_eq!(error.kind(), io::ErrorKind::BrokenPipe); + assert_eq!(reader.position(), first.len() as u64); + } + } + + #[test] + fn oversized_drain_crosses_buffer_boundaries_and_preserves_following_line() { + let mut input = vec![b'x'; MAX_LINE_BYTES + 37]; + input.extend_from_slice(b"\n{\"id\":2,\"entries\":[]}\n"); + let mut output = Vec::new(); + run(BufReader::with_capacity(7, Cursor::new(input)), &mut output).unwrap(); + let replies: Vec = output.split(|&byte| byte == b'\n').filter(|line| !line.is_empty()) + .map(|line| serde_json::from_slice(line).unwrap()).collect(); + assert_eq!(replies.len(), 2); + assert!(replies[0]["error"].as_str().unwrap().contains("exceeds")); + assert_eq!(replies[1], serde_json::json!({"id":2,"loaded":0})); + } +} diff --git a/search/tests/protocol.rs b/search/tests/protocol.rs new file mode 100644 index 0000000..ff476d8 --- /dev/null +++ b/search/tests/protocol.rs @@ -0,0 +1,235 @@ +use serde_json::{json, Value}; +use std::io::Write; +use std::process::{Command, Stdio}; + +const MAX_LINE_BYTES: usize = 8 * 1024 * 1024; +const MAX_FIELD_BYTES: usize = 16_384; +const MAX_FIELDS: usize = 1_024; +const MAX_ENTRIES: usize = 20_000; + +fn exchange(input: &[u8]) -> Vec { + let mut child = Command::new(env!("CARGO_BIN_EXE_oma-cast-search")) + .stdin(Stdio::piped()).stdout(Stdio::piped()).stderr(Stdio::piped()) + .spawn().unwrap(); + child.stdin.take().unwrap().write_all(input).unwrap(); + let output = child.wait_with_output().unwrap(); + assert!(output.status.success(), "{}", String::from_utf8_lossy(&output.stderr)); + assert!(output.stderr.is_empty()); + assert!(output.stdout.ends_with(b"\n")); + output.stdout.split(|&byte| byte == b'\n').filter(|line| !line.is_empty()) + .map(|line| serde_json::from_slice(line).unwrap()).collect() +} + +fn encode(requests: &[Value]) -> Vec { + let mut input = Vec::new(); + for request in requests { + serde_json::to_writer(&mut input, request).unwrap(); + input.push(b'\n'); + } + input +} + +#[test] +fn reordered_fields_unknown_properties_missing_optional_fields_and_numeric_null_scores() { + let output = exchange(concat!( + "{\"future\":true,\"entries\":[{\"future\":{},\"title\":\"Firefox\"},{\"title\":\"zzzz\"}],\"id\":1}\r\n", + "{\"sensitivity\":\"high\",\"query\":\"FIREFOX\",\"id\":18446744073709551615}\n", + "{\"id\":3,\"query\":\"\"}\n" + ).as_bytes()); + assert_eq!(output, vec![ + json!({"id":1,"loaded":2}), + json!({"id":u64::MAX,"hits":[{"index":0,"title":5_000_000,"alternate":null,"subtitle":null,"keyword":null}]}), + json!({"id":3,"hits":[]}), + ]); +} + +#[test] +fn errors_recover_and_invalid_reload_keeps_previous_entries() { + let output = exchange(concat!( + "{\"id\":0,\"query\":\"\"}\n", + "{\"id\":1,\"entries\":[{\"title\":\"Old\"}]}\n", + "{\"id\":2,\"entries\":[{\"title\":\"New\"},{}]}\n", + "{\"id\":3,\"query\":\"old\"}\n", + "not json\n", + "{\"id\":4,\"query\":\"old\",\"entries\":[]}\n", + "{\"id\":5,\"entries\":[{\"title\":\"New\"}]}\n", + "{\"id\":6,\"query\":\"old\"}\n", + "{\"id\":7,\"query\":\"new\"}\n", + "{\"id\":8,\"entries\":[]}\n", + "{\"id\":9,\"query\":\"new\"}" + ).as_bytes()); + for (at, id) in [(0, 0), (2, 2), (5, 4)] { + assert_eq!(output[at]["id"], id); + assert!(output[at]["error"].is_string()); + } + assert!(output[4].get("id").is_none()); + assert!(output[4]["error"].is_string()); + assert_eq!(output[3]["hits"][0]["title"], 5_000_000); + assert_eq!(output[6], json!({"id":5,"loaded":1})); + assert_eq!(output[7], json!({"id":6,"hits":[]})); + assert_eq!(output[8]["hits"][0]["title"], 5_000_000); + assert_eq!(output[9], json!({"id":8,"loaded":0})); + assert_eq!(output[10], json!({"id":9,"hits":[]})); +} + +#[test] +fn strict_shapes_reject_nulls_wrong_types_and_invalid_ids_then_recover() { + let invalid = vec![ + json!({"id":1,"entries":[{}]}), + json!({"id":2,"entries":[{"title":1}]}), + json!({"id":3,"entries":[{"title":"x","subtitle":null}]}), + json!({"id":4,"entries":[{"title":"x","alternateTitles":null}]}), + json!({"id":5,"entries":[{"title":"x","alternateTitles":[1]}]}), + json!({"id":6,"entries":[{"title":"x","keywords":[false]}]}), + json!({"id":7,"entries":[{"title":"x","bundleId":null}]}), + json!({"id":8,"entries":{}}), + json!({"id":9,"entries":null}), + json!({"id":10,"query":null}), + json!({"id":11,"query":1}), + json!({"id":12,"query":"x","sensitivity":"maximum"}), + json!({"id":13,"query":"x","sensitivity":null}), + json!({"id":14}), + json!({"entries":[]}), + json!({"id":-1,"entries":[]}), + json!({"id":1.5,"entries":[]}), + json!({"id":"1","entries":[]}), + json!({"id":null,"entries":[]}), + json!([]), json!(null), json!(false), + ]; + let mut requests = vec![json!({"id":0,"entries":[{"title":"Keep"}]})]; + requests.extend(invalid.iter().cloned()); + requests.push(json!({"id":99,"query":"keep"})); + let output = exchange(&encode(&requests)); + for (request, reply) in invalid.iter().zip(&output[1..]) { + assert!(reply["error"].is_string(), "{request}: {reply}"); + assert_eq!(reply.get("id").and_then(Value::as_u64), request.get("id").and_then(Value::as_u64)); + } + assert_eq!(output.last().unwrap()["hits"][0]["title"], 5_000_000); +} + +#[test] +fn invalid_utf8_blank_line_and_multiple_json_values_do_not_poison_stream() { + let mut input = b"\xff\n\n{} {}\n".to_vec(); + input.extend_from_slice(b"{\"id\":1,\"entries\":[]}\n{\"id\":2,\"query\":\"\"}\n"); + let output = exchange(&input); + assert_eq!(output.len(), 5); + for reply in &output[..3] { + assert!(reply["error"].is_string()); + assert!(reply.get("id").is_none()); + } + assert_eq!(output[3], json!({"id":1,"loaded":0})); + assert_eq!(output[4], json!({"id":2,"hits":[]})); +} + +#[test] +fn default_medium_and_channel_specific_high_filter_use_real_binary() { + let output = exchange(&encode(&[ + json!({"id":1,"entries":[{"title":"Firefox","alternateTitles":["fierfox"],"subtitle":"Browser","keywords":["Browser"]}]}), + json!({"id":2,"query":"fierfox"}), + json!({"id":3,"query":"fierfox","sensitivity":"high"}), + json!({"id":4,"query":"broxser","sensitivity":"low"}), + json!({"id":5,"query":"broxser","sensitivity":"high"}), + ])); + assert_eq!(output[1]["hits"][0]["title"], 999_000); + assert_eq!(output[2]["hits"][0]["title"], Value::Null); + assert_eq!(output[2]["hits"][0]["alternate"], 5_000_000); + assert_eq!(output[3]["hits"][0]["subtitle"], 999_000); + assert_eq!(output[4]["hits"], json!([])); +} + +#[test] +fn every_input_text_field_checks_byte_limit_before_replacing_catalog() { + let oversized = "x".repeat(MAX_FIELD_BYTES + 1); + let invalid = vec![ + json!({"title":oversized}), + json!({"title":"New","subtitle":oversized}), + json!({"title":"New","alternateTitles":[oversized]}), + json!({"title":"New","keywords":[oversized]}), + json!({"title":"New","bundleId":oversized}), + ]; + let mut requests = vec![json!({"id":0,"entries":[{"title":"Keep"}]})]; + for (at, entry) in invalid.into_iter().enumerate() { + requests.push(json!({"id":at + 1,"entries":[entry]})); + } + requests.push(json!({"id":6,"query":"keep"})); + requests.push(json!({"id":7,"entries":[{"title":"x".repeat(MAX_FIELD_BYTES),"subtitle":"y".repeat(MAX_FIELD_BYTES)}]})); + let output = exchange(&encode(&requests)); + for reply in &output[1..6] { + assert!(reply["error"].as_str().unwrap().contains("16384 bytes")); + } + assert_eq!(output[6]["hits"][0]["title"], 5_000_000); + assert_eq!(output[7], json!({"id":7,"loaded":1})); +} + +#[test] +fn text_field_count_includes_title_optional_scalars_and_each_array_item() { + let output = exchange(&encode(&[ + json!({"id":1,"entries":[{"title":"Keep","keywords":vec![""; MAX_FIELDS - 1]}]}), + json!({"id":2,"entries":[{"title":"New","keywords":vec![""; MAX_FIELDS]}]}), + json!({"id":3,"entries":[{"title":"Keep","subtitle":"","bundleId":"","alternateTitles":["",""],"keywords":vec![""; MAX_FIELDS - 5]}]}), + json!({"id":4,"entries":[{"title":"New","subtitle":"","bundleId":"","alternateTitles":["",""],"keywords":vec![""; MAX_FIELDS - 4]}]}), + json!({"id":5,"query":"keep"}), + ])); + assert_eq!(output[0], json!({"id":1,"loaded":1})); + assert!(output[1]["error"].as_str().unwrap().contains("1024 text fields")); + assert_eq!(output[2], json!({"id":3,"loaded":1})); + assert!(output[3]["error"].as_str().unwrap().contains("1024 text fields")); + assert_eq!(output[4]["hits"][0]["title"], 5_000_000); +} + +#[test] +fn long_loads_accept_maximum_entry_count_and_reject_one_more_atomically() { + let output = exchange(&encode(&[ + json!({"id":1,"entries":vec![json!({"title":"x"}); MAX_ENTRIES]}), + json!({"id":2,"entries":vec![json!({"title":"y"}); MAX_ENTRIES + 1]}), + json!({"id":3,"query":"x","sensitivity":"medium"}), + json!({"id":4,"query":"y"}), + json!({"id":5,"entries":[]}), + ])); + assert_eq!(output[0], json!({"id":1,"loaded":MAX_ENTRIES})); + assert!(output[1]["error"].as_str().unwrap().contains("20000 candidates")); + assert_eq!(output[2]["hits"].as_array().unwrap().len(), MAX_ENTRIES); + assert!(output[2]["hits"].as_array().unwrap().iter().all(|hit| hit["title"] == 5_000_000)); + assert_eq!(output[3], json!({"id":4,"hits":[]})); + assert_eq!(output[4], json!({"id":5,"loaded":0})); +} + +#[test] +fn query_character_limit_errors_then_recovers() { + let output = exchange(&encode(&[ + json!({"id":1,"entries":[{"title":"é".repeat(256)}]}), + json!({"id":2,"query":"é".repeat(256)}), + json!({"id":3,"query":"é".repeat(257)}), + json!({"id":4,"query":"é".repeat(256)}), + ])); + assert_eq!(output[1]["hits"][0]["title"], 5_000_000); + assert!(output[2]["error"].as_str().unwrap().contains("256 characters")); + assert_eq!(output[3]["hits"][0]["title"], 5_000_000); +} + +#[test] +fn wire_limit_accepts_boundary_and_drains_oversized_reload_before_recovery() { + let mut input = encode(&[json!({"id":1,"entries":[{"title":"Keep"}]})]); + let mut boundary = b"{\"id\":2,\"query\":\"\",\"padding\":\"".to_vec(); + boundary.resize(MAX_LINE_BYTES - 2, b'x'); + boundary.extend_from_slice(b"\"}"); + assert_eq!(boundary.len(), MAX_LINE_BYTES); + input.extend_from_slice(&boundary); + input.push(b'\n'); + input.extend_from_slice(b"{\"id\":3,\"entries\":[],\"padding\":\""); + input.extend(std::iter::repeat(b'x').take(MAX_LINE_BYTES * 2)); + input.extend_from_slice(b"\"}\n{\"id\":4,\"query\":\"keep\"}\n"); + let output = exchange(&input); + assert_eq!(output.len(), 4); + assert_eq!(output[1], json!({"id":2,"hits":[]})); + assert!(output[2]["error"].as_str().unwrap().contains("8388608 bytes")); + assert!(output[2].get("id").is_none()); + assert_eq!(output[3]["hits"][0]["title"], 5_000_000); +} + +#[test] +fn oversized_final_line_without_newline_reports_one_error() { + let output = exchange(&vec![b'x'; MAX_LINE_BYTES + 1]); + assert_eq!(output.len(), 1); + assert!(output[0]["error"].as_str().unwrap().contains("8388608 bytes")); +} diff --git a/test-search.qml b/test-search.qml new file mode 100644 index 0000000..9d7c521 --- /dev/null +++ b/test-search.qml @@ -0,0 +1,41 @@ +import QtQuick +import Quickshell +import "plugin/services" + +ShellRoot { + id: root + property bool expectFallback: Quickshell.env("OMA_CAST_EXPECT_FALLBACK") === "1" + property int at: 0 + property string failureMessage: "" + property string expectedFailure: Quickshell.env("OMA_CAST_EXPECT_FAILURE") || "" + property var queries: ["chormium", "cafe", "lcok"] + property var expected: ["chrome", "cafe", "lock"] + + function next() { + if (root.at === root.queries.length) { + console.log("NATIVE-SEARCH-PASS") + Qt.quit() + return + } + search.search(root.queries[root.at], "medium", function(hits) { + var okay = root.expectFallback ? hits === null && !!root.failureMessage : hits && hits[root.expected[root.at]] + if (root.expectedFailure && root.failureMessage.indexOf(root.expectedFailure) < 0) okay = false + if (!okay) { console.error("NATIVE-SEARCH-FAIL", root.queries[root.at]); Qt.exit(1); return } + root.at++ + Qt.callLater(root.next) + }) + } + + NativeSearch { + id: search + onFailed: function(message) { root.failureMessage = message; console.log("NATIVE-SEARCH-FAILURE", message) } + ids: ["chrome", "cafe", "lock"] + entries: [{title: "Chromium"}, {title: "Cafe"}, {title: "Lock"}] + } + + Component.onCompleted: { + var override = Quickshell.env("OMA_CAST_TEST_HELPER") + if (override) search.executable = override + Qt.callLater(root.next) + } +} diff --git a/tests/launcher-paste.test.js b/tests/launcher-paste.test.js index bccb929..989fd85 100644 --- a/tests/launcher-paste.test.js +++ b/tests/launcher-paste.test.js @@ -25,7 +25,7 @@ function harness(text) { rebuild: reset => changes.push(reset), isTyping: () => false, isActionPanelKey: () => false, direction: () => 0 } - const actionPanel = { filter: "" } + const actionPanel = { item: { filter: "" } } const clipboardInput = { text: "", clear() { this.text = "" }, paste() { this.text = text } } const context = vm.createContext({ Qt, window, actionPanel, clipboardInput, Util: { editsFilter: () => false } }) window.setQuery = next => { @@ -97,9 +97,9 @@ test("clipboard paste also works in submenu queries and alias editing", () => { test("action-panel paste edits its filter without changing the query", () => { const h = harness("Copy\nResult") h.window.actionPanelOpen = true - h.actionPanel.filter = "Find " + h.actionPanel.item.filter = "Find " h.press("V", h.Qt.ControlModifier) - assert.equal(h.actionPanel.filter, "Find Copy Result") + assert.equal(h.actionPanel.item.filter, "Find Copy Result") assert.equal(h.window.query, "prefix ") assert.deepEqual(h.changes, []) }) diff --git a/tests/native-search.test.js b/tests/native-search.test.js new file mode 100644 index 0000000..de7e781 --- /dev/null +++ b/tests/native-search.test.js @@ -0,0 +1,143 @@ +const test = require("node:test") +const assert = require("node:assert/strict") +const fs = require("node:fs") +const path = require("node:path") +const vm = require("node:vm") +const F = require("../plugin/core/FleaSearch.js") +const R = require("../plugin/core/Ranker.js") + +const source = fs.readFileSync(path.join(__dirname, "../plugin/services/NativeSearch.qml"), "utf8") +function harness() { + const events = [], writes = [] + const service = { entries: [{ title: "Files" }], ids: ["files"], serial: 0, loadId: 0, loaded: false, disabled: false, pending: null, failed: m => events.push(m) } + const helper = { running: false, write: s => writes.push(JSON.parse(s)) } + const timeout = { active: false, restart() { this.active = true }, stop() { this.active = false } } + const context = vm.createContext({ service, helper, timeout, FleaSearch: F }) + for (const name of ["cancel", "invalidate", "search", "load", "send", "fail", "receive"]) { + const start = source.indexOf(" function " + name + "(") + const end = source.indexOf("\n }", start) + 4 + vm.runInContext(source.slice(start, end).trim(), context) + service[name] = context[name] + } + return { service, helper, timeout, events, writes, reply: obj => service.receive(JSON.stringify(obj)) } +} +const hit = { index: 0, title: 4000000, alternate: null, subtitle: null, keyword: null } + +test("native service waits for load, suppresses stale replies, and cancels hidden queries", () => { + const h = harness(), got = [] + h.service.search("fi", "medium", r => got.push(r)) + const first = h.service.pending.id + h.service.load() + h.reply({ id: h.service.loadId, loaded: 1 }) + assert.equal(h.writes.at(-1).query, "fi") + h.service.search("files", "medium", r => got.push(r)) + h.reply({ id: first, hits: [hit] }) + assert.equal(got.length, 0) + h.reply({ id: h.service.pending.id, hits: [hit] }) + assert.equal(got[0].files.title, 4000000) + assert.equal(h.timeout.active, false) + h.service.search("new", "medium", r => got.push(r)) + const hidden = h.service.pending.id + h.service.cancel() + h.reply({ id: hidden, hits: [hit] }) + assert.equal(got.length, 1) +}) + +test("candidate reload cannot apply a reply using the previous index", () => { + const h = harness(), got = [] + h.service.loaded = true + h.helper.running = true + h.service.search("fi", "medium", r => got.push(r)) + const stale = h.service.pending.id + h.service.entries = [{ title: "Firefox" }] + h.service.ids = ["firefox"] + h.service.invalidate() + assert.deepEqual(got, [null]) + h.reply({ id: stale, hits: [hit] }) + assert.deepEqual(got, [null]) + h.service.search("fire", "medium", r => got.push(r)) + h.reply({ id: h.service.loadId, loaded: 1 }) + h.reply({ id: h.service.pending.id, hits: [hit] }) + assert.equal(got[1].firefox.title, 4000000) +}) + +test("malformed replies, invalid scores and service failures all permit fallback", () => { + for (const reply of ["not json", '{"id":1}', JSON.stringify({ id: 1, hits: [{ ...hit, title: "500" }] })]) { + const h = harness(), got = [] + h.service.search("bad", "medium", r => got.push(r)) + h.service.receive(reply) + assert.deepEqual(got, [null]) + assert.equal(h.service.disabled, true) + assert.equal(h.helper.running, false) + } + const h = harness(), got = [] + h.service.search("one", "medium", r => got.push(r)) + h.service.fail("missing executable or timeout") + h.service.fail("late exit") + h.service.search("two", "medium", r => got.push(r)) + assert.deepEqual(got, [null, null]) +}) + +test("protocol rejects duplicate entries and bounds, and folds native input like the ranker", () => { + assert.throws(() => F.hits({ hits: [hit, hit] }, ["x"]), /repeats/) + assert.throws(() => F.hits({ hits: [{ ...hit, index: 1 }] }, ["x"]), /index/) + assert.throws(() => F.hits({ hits: [{ index: 0 }] }, ["x"]), /score/) + assert.equal(F.entries([{ title: "Café", keywords: ["Straße"] }], R.transliterate)[0].keywords[0], "Strasse") +}) + +test("native scores retain exact aliases, learning, pins, alternate names and frecency", () => { + const c = [ + { id: "long", title: "Firefox Developer Edition", type: "application" }, + { id: "short", title: "Firefox", type: "application" }, + { id: "alias", title: "Unrelated", alias: "fir", type: "application" } + ] + const scores = { long: { ...hit }, short: { ...hit } } + const ids = extra => R.rank(c, "fir", { fleaHits: scores, nowMs: 1000, ...extra }).map(r => r.candidate.id) + assert.deepEqual(ids(), ["alias", "short", "long"]) + c[0].frecency = 100 + assert.deepEqual(ids(), ["alias", "long", "short"]) + c[1].pinPriority = 1 + assert.equal(ids()[0], "short") + delete c[1].pinPriority + c[1].frecency = 100 + assert.equal(ids()[1], "short") + c[0].openedAt = 1000 + c[0].searchTerms = ["fir"] + assert.equal(ids()[1], "long") + scores.short = { ...hit, title: null, alternate: 5000000 } + assert.equal(R.buildRecord(c[1], "fir", { fleaHits: scores }).titleMatch, "exact") +}) + + +test("obsolete errors cannot disable a newer valid request", () => { + const h = harness(), got = [] + h.service.loaded = true + h.helper.running = true + h.service.search("old", "unsupported", r => got.push(r)) + const old = h.service.pending.id + h.service.search("new", "medium", r => got.push(r)) + h.reply({ id: old, error: "unsupported sensitivity" }) + assert.equal(h.service.disabled, false) + assert.equal(got.length, 0) + h.reply({ id: h.service.pending.id, hits: [hit] }) + assert.equal(got.length, 1) +}) + +test("all-null hits trigger fallback instead of phantom results", () => { + const invalid = harness(), got = [] + invalid.service.search("fi", "medium", r => got.push(r)) + invalid.reply({ id: invalid.service.pending.id, hits: [{ ...hit, title: null }] }) + assert.equal(invalid.service.disabled, true) + assert.equal(got.at(-1), null) +}) + +test("keyword-only tiers rank exact ahead of typo while titles keep priority", () => { + const c = [{ id: "typo", title: "Alpha", frecency: 100 }, { id: "exact", title: "Zulu", frecency: 1 }] + const fleaHits = { + typo: { title: null, alternate: null, subtitle: null, keyword: 999000 }, + exact: { title: null, alternate: null, subtitle: null, keyword: 5000000 } + } + assert.deepEqual(R.rank(c, "browser", { fleaHits }).map(r => r.candidate.id), ["exact", "typo"]) + fleaHits.typo.title = 2000001 + assert.equal(R.rank(c, "browser", { fleaHits })[0].candidate.id, "typo") +}) diff --git a/tests/native-transport.sh b/tests/native-transport.sh new file mode 100755 index 0000000..9747738 --- /dev/null +++ b/tests/native-transport.sh @@ -0,0 +1,52 @@ +#!/bin/bash +set -euo pipefail + +repo=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd -P) +command -v qs >/dev/null || { echo 'native transport tests need Quickshell' >&2; exit 1; } +[[ -x $repo/plugin/bin/oma-cast-search ]] || { echo 'run bin/build-search before native transport tests' >&2; exit 1; } +fixture=$(mktemp -d /tmp/oma-cast-search.XXXXXXXX) +touch "$fixture/.oma-cast-search-test" +cleanup() { + [[ $fixture == /tmp/oma-cast-search.* && -f $fixture/.oma-cast-search-test ]] || return 1 + rm -rf -- "$fixture" +} +trap cleanup EXIT + +printf '#!/bin/bash\nread -r line\nexit 0\n' > "$fixture/exit0" +printf '#!/bin/bash\nread -r line\nexit 1\n' > "$fixture/exit1" +printf '#!/bin/bash\nread -r line\nprintf "bad json\\n"\nexec sleep 10\n' > "$fixture/malformed" +printf '#!/bin/bash\nread -r line\nexec sleep 10\n' > "$fixture/hang" +printf '#!/bin/bash\nexit 0\n' > "$fixture/nonexecutable" +chmod +x "$fixture/exit0" "$fixture/exit1" "$fixture/malformed" "$fixture/hang" +chmod 600 "$fixture/nonexecutable" + +for name in native missing nonexecutable exit0 exit1 malformed hang; do + helper="$fixture/$name" + fallback=1 + expected="" + case $name in + missing | nonexecutable | exit0 | exit1) expected="exited" ;; + malformed) expected="SyntaxError" ;; + hang) expected="timed out" ;; + esac + if [[ $name == native ]]; then helper="$repo/plugin/bin/oma-cast-search"; fallback=0; fi + OMA_CAST_TEST_HELPER="$helper" OMA_CAST_EXPECT_FALLBACK="$fallback" OMA_CAST_EXPECT_FAILURE="$expected" QT_QPA_PLATFORM=offscreen \ + timeout 8 qs -p "$repo/test-search.qml" > "$fixture/$name.log" 2>&1 || { + cat "$fixture/$name.log" >&2 + echo "native transport test failed: $name" >&2 + exit 1 + } + grep -q NATIVE-SEARCH-PASS "$fixture/$name.log" || { cat "$fixture/$name.log" >&2; exit 1; } + echo "native transport PASS $name" +done + +mkdir -p "$fixture/path with spaces" +cp -R "$repo/plugin" "$fixture/path with spaces/plugin" +cp "$repo/test-search.qml" "$fixture/path with spaces/test-search.qml" +QT_QPA_PLATFORM=offscreen timeout 8 qs -p "$fixture/path with spaces/test-search.qml" > "$fixture/path.log" 2>&1 || { + cat "$fixture/path.log" >&2 + echo 'native transport test failed: default helper path with spaces' >&2 + exit 1 +} +grep -q NATIVE-SEARCH-PASS "$fixture/path.log" || { cat "$fixture/path.log" >&2; exit 1; } +echo 'native transport PASS default helper path with spaces' diff --git a/tests/rows.test.js b/tests/rows.test.js new file mode 100644 index 0000000..aca4d4f --- /dev/null +++ b/tests/rows.test.js @@ -0,0 +1,52 @@ +const test = require("node:test") +const assert = require("node:assert/strict") +const { update, snapshot } = require("../plugin/core/Rows.js") + +test("stable updates keep unchanged rows and batch additions without resetting the model", () => { + const records = [{ itemId: "a", title: "A" }, { itemId: "b", title: "B" }], calls = [] + const first = records[0] + const model = { + get count() { return records.length }, get(i) { return records[i] }, + set(i, data) { calls.push("set"); records[i] = data }, + remove(i, n) { calls.push("remove"); records.splice(i, n) }, + append(data) { calls.push("append"); records.push(...data) } + } + update(model, [{ ...first }, { itemId: "c", title: "C" }, { itemId: "d", title: "D" }]) + assert.equal(records[0], first) + assert.deepEqual(calls, ["set", "append"]) + calls.length = 0 + update(model, [{ ...first }]) + assert.deepEqual(calls, ["remove"]) + assert.equal(records[0], first) + update(model, []) + assert.equal(records.length, 0) +}) + + +test("a failed search removes retained rows before they can be clicked", () => { + const fs = require("node:fs"), path = require("node:path"), vm = require("node:vm") + const source = fs.readFileSync(path.join(__dirname, "../plugin/ui/LauncherWindow.qml"), "utf8") + const start = source.indexOf(" function applySearch(") + const body = source.slice(source.indexOf("{", start) + 1, source.indexOf("\n }", start)) + const records = [{ itemId: "old-result" }] + const rows = { get count() { return records.length }, remove(at, n) { records.splice(at, n) } } + let selection = 0, error = "" + const window = { showToast(_, message) { error = message }, select(index) { selection = index } } + vm.runInNewContext("(function() {" + body + "})()", { result: { ok: false, error: "Search unavailable" }, window, rows, Rows: { update } }) + assert.equal(records.length, 0) + assert.equal(selection, -1) + assert.equal(error, "Search unavailable") +}) + + +test("selection is a value snapshot across in-place model changes", () => { + const handle = { itemId: "old", title: "Old", argsJson: "[]" } + const model = { count: 1, get() { return handle } } + const selected = snapshot(model, 0) + handle.itemId = "new" + handle.title = "New" + assert.equal(selected.itemId, "old") + assert.equal(selected.title, "Old") + assert.equal(snapshot(model, 0).itemId, "new") + assert.equal(snapshot(model, -1), null) +}) diff --git a/tests/search-integration.test.js b/tests/search-integration.test.js new file mode 100644 index 0000000..594302a --- /dev/null +++ b/tests/search-integration.test.js @@ -0,0 +1,39 @@ +const test = require("node:test") +const assert = require("node:assert/strict") +const fs = require("node:fs") +const path = require("node:path") +const { spawn } = require("node:child_process") +const readline = require("node:readline") +const R = require("../plugin/core/Ranker.js") +const F = require("../plugin/core/FleaSearch.js") +const Root = require("../plugin/core/RootSearch.js") +const Frecency = require("../plugin/core/Frecency.js") +const binary = path.join(__dirname, "../plugin/bin/oma-cast-search") + +test("built helper feeds the actual root ranker and sections", { skip: !fs.existsSync(binary), timeout: 10000 }, async t => { + const child = spawn(binary, [], { stdio: ["pipe", "pipe", "inherit"] }) + t.after(() => child.kill()) + const lines = readline.createInterface({ input: child.stdout })[Symbol.asyncIterator]() + const ask = async obj => { child.stdin.write(JSON.stringify(obj) + "\n"); return JSON.parse((await lines.next()).value) } + const candidates = [ + { id: "chrome", title: "Chromium", type: "application", keywords: ["browser"] }, + { id: "cafe", title: "Café", type: "application", alternateTitles: ["Coffee"], subtitle: "Drinks" }, + { id: "lock", title: "Lock", type: "command" } + ].map(c => ({ ...c, rootSearch: { when: "always" } })) + const ids = candidates.map(c => c.id) + assert.equal((await ask({ id: 1, entries: F.entries(candidates, R.transliterate) })).loaded, 3) + for (const [query, expected] of [["chormium", "chrome"], ["cafe", "cafe"], ["coffee", "cafe"], ["drinks", "cafe"], ["browser", "chrome"], ["lcok", "lock"]]) { + const reply = await ask({ id: 2, query: R.transliterate(query), sensitivity: "medium" }) + const fleaHits = F.hits(F.reply(JSON.stringify(reply)), ids) + const ctx = { commands: {}, frecency: {}, nowMs: 1000, filter: "all", fleaHits } + const sections = Root.rootSections(candidates, query, ctx, { Ranker: R, Frecency }) + assert.equal(sections[0].rows[0].candidate.id, expected, query) + assert.equal(sections.at(-1).id, "fallback-commands") + ctx.commands[expected] = { enabled: false } + const filtered = Root.rootSections(candidates, query, ctx, { Ranker: R, Frecency }) + assert.ok(!filtered.flatMap(s => s.rows).some(r => r.candidate.id === expected)) + } + assert.deepEqual((await ask({ id: 3, query: "lcok", sensitivity: "high" })).hits, []) + assert.deepEqual((await ask({ id: 4, query: "" })).hits, []) + child.stdin.end() +}) From 1761972150eaa7fe706959c3acc4cb6e872256d0 Mon Sep 17 00:00:00 2001 From: GM Date: Wed, 28 Oct 2026 17:11:35 -0400 Subject: [PATCH 07/15] perf(menu): speed up refresh and quiet loading feedback Reuse stock guard batching and retain valid results on failed or partial refreshes. Replace the flashing header stripe with delayed footer feedback that yields to toasts. Minipc tests cover compiler fallback, atomic publication and the loading lifecycle. --- CLAUDE.md | 2 +- SPEC.md | 4 +- plugin/services/OmarchyMenuSource.qml | 89 ++++++- plugin/ui/LauncherWindow.qml | 34 +-- tests/loading-feedback.test.js | 100 ++++++++ tests/omarchy-native-guards.test.js | 332 ++++++++++++++++++++++++++ 6 files changed, 537 insertions(+), 24 deletions(-) create mode 100644 tests/loading-feedback.test.js create mode 100644 tests/omarchy-native-guards.test.js diff --git a/CLAUDE.md b/CLAUDE.md index b90a935..608dbac 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -120,7 +120,7 @@ Works: - **Ctrl+T** opens the toast's actions (Copy Error Message on failures, Undo after Disable Command). **Ctrl+Shift+K** opens the About panel for the selected row. - **Argument pills:** "Search Google" / "Search DuckDuckGo" take a query in a pill after the search text (Tab in, Shift+Tab out). - **Alerts:** Shut Down, Restart, Log Out and Delete All Entries ask first (↵ confirms, Esc cancels). `oma-cast run` skips the alert. -- **Feedback:** toasts in the footer, a HUD through Omarchy's OSD when the window closes, and a 2 px loading bar while guards and providers refresh (on every open, about 250 ms in the background). +- **Feedback:** toasts in the footer and a HUD through Omarchy's OSD when the window closes; static footer "Loading…" appears only after 500 ms of visible loading, yields to toasts and resets on hide. The header divider stays still. - **Window behaviour:** - The `escapeKeyBehavior` setting works both ways. - Pop-to-root runs after `popToRootTimeout`. diff --git a/SPEC.md b/SPEC.md index 0abd361..c1744ed 100644 --- a/SPEC.md +++ b/SPEC.md @@ -660,12 +660,12 @@ Each running menu-bar command owns one SNI item (ksni): - search field with placeholder "Search for apps and commands…" (each view sets its own) - inline argument pills after the measured text width - optional right-side dropdown accessory (Ctrl+P) - - a 2 px loading bar under the header + - a static divider under the header; loading feedback stays in the footer [D, 2026-10-28] - **Body:** sectioned list. - Row: icon 22 px, title, subtitle in secondary colour, and right-aligned accessories in this order: tags/text/date, alias badge, hotkey glyphs, type label ("Application", "Command", "Quicklink", …). - Master-detail split for list detail (~40/60). Grid view (columns 1–8). Empty state with icon, title and description. - **Footer (42 px):** - - left: current context icon + title, or the active toast (style icon, title, message) + - left: current context icon + title, or the active toast (style icon, title, message); show quiet "Loading…" after 500 ms of visible loading, with toast priority and reset on hide [D, 2026-10-28] - right: primary action title + ↵, a separator, "Actions" + Ctrl+K - **Action panel (Ctrl+K):** popover anchored bottom-right, with its own search field and sections (primary, then copy, configure, deeplink, delete). - Each row shows its shortcut. diff --git a/plugin/services/OmarchyMenuSource.qml b/plugin/services/OmarchyMenuSource.qml index b621b1a..b2653f1 100644 --- a/plugin/services/OmarchyMenuSource.qml +++ b/plugin/services/OmarchyMenuSource.qml @@ -17,9 +17,87 @@ Item { property var providerItems: ({}) property bool loading: guardProc.running || providerProc.running property int revision: 0 + property var guardCompiler: null signal message(string level, string text, var metadata) + function createGuardCompiler() { + try { + var path = source.omarchyPath + "/shell/plugins/menu/MenuModel.js" + var url = "file://" + path.split("/").map(encodeURIComponent).join("/") + source.guardCompiler = Qt.createQmlObject( + "import QtQml\nimport " + JSON.stringify(url) + " as Stock\n" + + "QtObject { function compile(items) { return Stock.guardScript(items) } }", + source, "OmarchyGuardCompiler") + } catch (error) { + source.guardCompiler = null + } + } + + Component.onCompleted: { source.createGuardCompiler(); source.refresh() } + Component.onDestruction: if (source.guardCompiler) source.guardCompiler.destroy() + + function guardItems(tree) { + var items = Object.create(null) + for (var i = 0; i < tree.order.length; i++) { + var id = tree.order[i] + if (!Object.prototype.hasOwnProperty.call(tree.items, id)) continue + var item = tree.items[id] + if (item && /^[A-Za-z0-9._-]+$/.test(item.id)) items[item.id] = item + } + return items + } + + function compileGuards(tree, items) { + if (source.guardCompiler) { + try { + var script = source.guardCompiler.compile(items) + if (typeof script === "string") return script + } catch (error) {} + source.guardCompiler.destroy() + source.guardCompiler = null + } + return OmarchyMenu.guardScript(tree) + } + + function guardKeys(items) { + var keys = [] + for (var id in items) { + if (items[id].when) keys.push(id + ":w") + if (items[id].checked) keys.push(id + ":c") + if (items[id].disabled) keys.push(id + ":d") + } + return keys + } + + function finishGuards(exitCode, exitStatus) { + var tree = guardProc.requestTree + var expected = guardProc.expectedGuards + guardProc.requestTree = null + guardProc.expectedGuards = [] + if (!tree) return + if (tree !== source.tree) { source.refresh(); return } + if (exitCode !== 0 || exitStatus !== 0) { + source.message("warning", "Menu guard refresh failed; keeping previous results.", null) + return + } + var received = Object.create(null) + var lines = guardProc.collected.split("\n") + for (var i = 0; i < lines.length; i++) { + // Guard rows look like system.lock:w:1, with one row per requested condition. + var match = /^([A-Za-z0-9._-]+:[wcd]):[01]$/.exec(lines[i].trim()) + if (match) received[match[1]] = true + } + for (var j = 0; j < expected.length; j++) { + if (!received[expected[j]]) { + source.message("warning", "Menu guard refresh was incomplete; keeping previous results.", null) + return + } + } + source.guards = OmarchyMenu.parseGuardOutput(guardProc.collected) + source.revision++ + } + function rebuild() { source.tree = OmarchyMenu.buildTree(source.defaultItems, source.userItems) source.revision++ @@ -28,9 +106,12 @@ Item { function refresh() { if (!guardProc.running) { - var script = OmarchyMenu.guardScript(source.tree) + var items = source.guardItems(source.tree) + var script = source.compileGuards(source.tree, items) if (script) { guardProc.collected = "" + guardProc.requestTree = source.tree + guardProc.expectedGuards = source.guardKeys(items) guardProc.command = ["bash", "-lc", script] guardProc.running = true } @@ -80,11 +161,11 @@ Item { Process { id: guardProc property string collected: "" + property var requestTree: null + property var expectedGuards: [] stdout: SplitParser { onRead: function(line) { guardProc.collected += line + "\n" } } onExited: function(exitCode, exitStatus) { - if (exitStatus !== 0) return - source.guards = OmarchyMenu.parseGuardOutput(guardProc.collected) - source.revision++ + source.finishGuards(exitCode, exitStatus) } } diff --git a/plugin/ui/LauncherWindow.qml b/plugin/ui/LauncherWindow.qml index 892f1d2..0ef5141 100644 --- a/plugin/ui/LauncherWindow.qml +++ b/plugin/ui/LauncherWindow.qml @@ -16,6 +16,21 @@ PanelWindow { required property var backend property var appLibrary: null property bool shown: false + readonly property bool busy: window.shown && window.backend.loading + readonly property int loadingFeedbackDelay: 500 + property bool loadingVisible: false + + onBusyChanged: { + window.loadingVisible = false + if (window.busy) loadingDelay.restart() + else loadingDelay.stop() + } + + Timer { + id: loadingDelay + interval: window.loadingFeedbackDelay + onTriggered: window.loadingVisible = window.busy + } signal dismissRequested() @@ -854,22 +869,6 @@ PanelWindow { height: Style.spacing.hairline color: Util.alpha(window.look.foreground, 0.12) visible: !window.compact - - Rectangle { - id: loader - visible: window.backend.loading && window.shown - height: Math.max(2, Style.space(2)) - width: parent.width / 4 - anchors.verticalCenter: parent.verticalCenter - color: window.look.accent - NumberAnimation on x { - running: loader.visible - loops: Animation.Infinite - from: -loader.width - to: header.width - duration: 900 - } - } } } @@ -978,9 +977,10 @@ PanelWindow { color: window.toast && window.toast.style === "failure" ? "#e06c75" : window.look.accent } Text { + id: footerStatus anchors.verticalCenter: parent.verticalCenter textFormat: Text.PlainText - text: window.toast ? window.toast.title : window.view.title + text: window.toast ? window.toast.title : window.loadingVisible ? "Loading…" : window.view.title color: window.look.foreground opacity: window.toast ? 0.9 : 0.6 elide: Text.ElideRight diff --git a/tests/loading-feedback.test.js b/tests/loading-feedback.test.js new file mode 100644 index 0000000..ef6e2f7 --- /dev/null +++ b/tests/loading-feedback.test.js @@ -0,0 +1,100 @@ +const test = require("node:test") +const assert = require("node:assert/strict") +const fs = require("node:fs") +const os = require("node:os") +const path = require("node:path") +const { spawnSync } = require("node:child_process") + +const source = fs.readFileSync(path.join(__dirname, "../plugin/ui/LauncherWindow.qml"), "utf8") + +// QML block sample: " onBusyChanged: {\n loadingDelay.stop()\n }". +function qmlBlock(signature) { + const start = source.indexOf(signature) + assert.ok(start >= 0, "missing QML block: " + signature) + const end = source.indexOf("\n }", start) + assert.ok(end > start, "unterminated QML block: " + signature) + return source.slice(start, end + 4) +} + +test("loading feedback delays fast work, preserves toasts and resets across hide and reopen", { skip: !process.env.OMA_CAST_QML_RUNNER }, t => { + const parent = fs.realpathSync(os.tmpdir()) + const root = fs.mkdtempSync(path.join(parent, "oma-cast-loading-probe-")) + const marker = path.join(root, ".oma-cast-loading-probe") + fs.writeFileSync(marker, "loading feedback fixture\n") + t.after(() => { + assert.ok(path.isAbsolute(root)) + assert.equal(path.dirname(root), parent) + assert.ok(path.basename(root).startsWith("oma-cast-loading-probe-")) + assert.equal(fs.readFileSync(marker, "utf8"), "loading feedback fixture\n") + fs.rmSync(root, { recursive: true, force: true }) + }) + const declarations = ["busy", "loadingVisible", "loadingFeedbackDelay"].map(name => { + // Property sample: " readonly property int loadingFeedbackDelay: 500". + const declaration = source.match(new RegExp("^ (?:readonly )?property (?:bool|int) " + name + ":.+$", "m")) + assert.ok(declaration, "missing loading property: " + name) + return declaration[0] + }).join("\n") + // Footer sample: "id: footerStatus\n text: window.toast ? window.toast.title : window.view.title". + const footer = source.match(/id: footerStatus\s+[\s\S]*?text: ([^\n]+)/) + assert.ok(footer, "missing footer status binding") + const env = { ...process.env, HOME: root, TMPDIR: root, QT_QPA_PLATFORM: "offscreen", QML_DISABLE_DISK_CACHE: "1" } + for (const key of ["XDG_CACHE_HOME", "XDG_CONFIG_HOME", "XDG_DATA_HOME", "XDG_STATE_HOME", "XDG_RUNTIME_DIR"]) { + env[key] = path.join(root, key) + fs.mkdirSync(env[key], { mode: 0o700 }) + } + const config = path.join(root, "shell.qml") + fs.writeFileSync(config, `import QtQuick +import Quickshell +ShellRoot { + id: window + property QtObject backend: QtObject { property bool loading: false } + property bool shown: false + property var toast: null + property var view: ({ title: "oma-cast" }) + ${declarations} + ${qmlBlock("onBusyChanged: {")} + ${qmlBlock("Timer {\n id: loadingDelay")} + property string footerText: ${footer[1]} + property int stage: 0 + function check(ok, detail) { if (!ok) throw new Error(detail) } + property var stages: [ + { wait: 50, run: function() { check(!window.loadingVisible && window.footerText === "oma-cast", "fast work flashed"); backend.loading = false } }, + { wait: loadingFeedbackDelay + 80, run: function() { check(!window.loadingVisible, "completed work left a pending cue"); backend.loading = true } }, + { wait: loadingFeedbackDelay + 80, run: function() { check(window.loadingVisible && window.footerText === "Loading…", "slow work lacks feedback"); window.toast = { title: "Copied" } } }, + { wait: 30, run: function() { check(window.footerText === "Copied", "toast lost priority"); window.toast = null; backend.loading = false } }, + { wait: 30, run: function() { check(!window.loadingVisible && window.footerText === "oma-cast", "completion did not restore context"); backend.loading = true } }, + { wait: 100, run: function() { window.shown = false } }, + { wait: loadingFeedbackDelay + 80, run: function() { check(!window.loadingVisible, "hidden window retained feedback"); window.shown = true } }, + { wait: 100, run: function() { check(!window.loadingVisible, "reopen reused an old delay") } }, + { wait: loadingFeedbackDelay + 80, run: function() { check(window.loadingVisible, "reopen lost persistent loading"); window.shown = false } }, + { wait: 30, run: function() { check(!window.loadingVisible, "close retained visible feedback"); backend.loading = false; window.shown = true } }, + { wait: loadingFeedbackDelay + 80, run: function() { check(!window.loadingVisible && window.footerText === "oma-cast", "idle reopen flashed"); console.log("OMA_CAST_LOADING_PROBE:OK"); Qt.quit() } } + ] + Timer { + id: tick + onTriggered: { + try { + window.stages[window.stage].run() + window.stage++ + if (window.stage < window.stages.length) { + tick.interval = window.stages[window.stage].wait + tick.restart() + } + } catch (error) { console.error("OMA_CAST_LOADING_PROBE:FAIL " + error); Qt.quit() } + } + } + Component.onCompleted: Qt.callLater(function() { + window.shown = true + backend.loading = true + tick.interval = window.stages[0].wait + tick.start() + }) +} +`) + const result = spawnSync(process.env.OMA_CAST_QML_RUNNER, ["-p", config], { cwd: root, env, encoding: "utf8", timeout: 10000, killSignal: "SIGKILL" }) + assert.ifError(result.error) + const output = result.stdout + result.stderr + assert.equal(result.status, 0, output) + assert.match(output, /OMA_CAST_LOADING_PROBE:OK/) + assert.doesNotMatch(output, /OMA_CAST_LOADING_PROBE:FAIL/) +}) diff --git a/tests/omarchy-native-guards.test.js b/tests/omarchy-native-guards.test.js new file mode 100644 index 0000000..35b7e1f --- /dev/null +++ b/tests/omarchy-native-guards.test.js @@ -0,0 +1,332 @@ +const test = require("node:test") +const assert = require("node:assert/strict") +const fs = require("node:fs") +const path = require("node:path") +const vm = require("node:vm") +const { spawnSync } = require("node:child_process") +const { fileURLToPath, pathToFileURL } = require("node:url") +const OmarchyMenu = require("../plugin/core/OmarchyMenu.js") + +const sourcePath = path.join(__dirname, "../plugin/services/OmarchyMenuSource.qml") +const text = fs.readFileSync(sourcePath, "utf8") +const methods = ["createGuardCompiler", "guardItems", "compileGuards", "guardKeys", "finishGuards", "refresh"] + +// QML block sample: " function refresh() {\n }". +function block(signature, indentation) { + const start = text.indexOf(signature) + assert.ok(start >= 0, signature) + const open = text.indexOf("{", start) + const end = text.indexOf("\n" + " ".repeat(indentation) + "}", open) + indentation + 2 + assert.ok(end > open, signature) + return text.slice(start, end) +} + +function method(name) { + return block("function " + name + "(", 2) +} + +function sampleTree() { + return OmarchyMenu.buildTree(OmarchyMenu.parse(JSON.stringify({ + probe: { when: "true", checked: "false", disabled: "custom-check --literal '*'" }, + other: { when: "false" } + })).items, []) +} + +function harness(factory = () => ({ compile: () => "stock-script", destroy() {} })) { + const imports = [] + const messages = [] + const source = { + omarchyPath: '/opt/omarchy space "double" \'single\' #percent%', + guardCompiler: null, tree: sampleTree(), guards: { previous: true }, revision: 7, + message: (...args) => messages.push(args), providerMenus: () => [], startNextProvider() {} + } + const guardProc = { running: false, collected: "", requestTree: null, expectedGuards: [] } + const context = vm.createContext({ + source, guardProc, providerProc: { running: true }, OmarchyMenu, + Qt: { createQmlObject: (...args) => { imports.push(args); return factory(...args) } } + }) + for (const name of methods) { + vm.runInContext(method(name), context) + source[name] = context[name] + } + return { + source, guardProc, imports, messages, + start() { + vm.runInContext(text.match(/Component.onCompleted: (\{[^\n]+\})/)[1], context) + }, + exit(code, status = 0, output = "probe:w:1\nprobe:c:0\nprobe:d:1\nother:w:0\n") { + guardProc.running = false + guardProc.collected = output + Object.assign(context, { exitCode: code, exitStatus: status }) + const handler = block("onExited: function(exitCode, exitStatus)", 4) + vm.runInContext("(" + handler.slice(handler.indexOf("function")) + ")(exitCode, exitStatus)", context) + }, + destroy() { + vm.runInContext(text.match(/Component.onDestruction: ([^\n]+)/)[1], context) + } + } +} + +test("startup can use the legacy fallback, then imports OEM once and compiles every refresh", () => { + const calls = [] + const h = harness(() => ({ compile: items => { calls.push(items); return "stock-" + calls.length }, destroy() {} })) + const { source, guardProc } = h + assert.equal(source.compileGuards(source.tree, source.guardItems(source.tree)), OmarchyMenu.guardScript(source.tree)) + assert.equal(h.imports.length, 0) + h.start() + assert.equal(h.imports.length, 1) + const [code, parent, name] = h.imports[0] + const url = JSON.parse(code.match(/^import QtQml\nimport ("[^\n]+") as Stock\n/)[1]) + assert.equal(fileURLToPath(url), source.omarchyPath + "/shell/plugins/menu/MenuModel.js") + assert.equal(parent, source) + assert.equal(name, "OmarchyGuardCompiler") + assert.deepEqual(Array.from(guardProc.command), ["bash", "-lc", "stock-1"]) + assert.equal(guardProc.requestTree, source.tree) + assert.deepEqual(Array.from(guardProc.expectedGuards), ["probe:w", "probe:c", "probe:d", "other:w"]) + h.exit(0) + source.tree = sampleTree() + source.tree.items.probe.when = "fresh-custom-check" + source.refresh() + assert.equal(h.imports.length, 1) + assert.equal(calls.length, 2) + assert.equal(calls[1].probe.when, "fresh-custom-check") + assert.equal(guardProc.command[2], "stock-2") +}) + +test("OEM input preserves legacy ID filtering and uses own keys even for prototype names", () => { + let received + const h = harness(() => ({ compile: items => { received = items; return "stock" }, destroy() {} })) + const items = Object.create({ inherited: { id: "inherited", when: "true" } }) + for (const [key, id] of [["probe", "probe"], ["alias", "actual.id"], ["constructor", "constructor"], ["__proto__", "__proto__"], ["hasOwnProperty", "hasOwnProperty"], ["bad", "bad'; echo injected"], ["newline", "bad\nline"], ["empty", ""]]) { + Object.defineProperty(items, key, { value: { id, when: "true" }, enumerable: true }) + } + h.source.tree = { items, order: [...Object.keys(items), "inherited", "toString"] } + h.start() + assert.equal(Object.getPrototypeOf(received), null) + assert.deepEqual(Object.keys(received), ["probe", "actual.id", "constructor", "__proto__", "hasOwnProperty"]) + assert.equal(received.__proto__, items.__proto__) + assert.equal(received.constructor, items.constructor) + assert.equal(Object.getPrototypeOf(items).inherited.id, "inherited") +}) + +test("missing OEM import falls back without retrying each refresh", () => { + const h = harness(() => { throw new Error("No MenuModel.js on this Omarchy") }) + h.start() + assert.equal(h.source.guardCompiler, null) + assert.equal(h.guardProc.command[2], OmarchyMenu.guardScript(h.source.tree)) + h.exit(0) + h.source.refresh() + assert.equal(h.imports.length, 1) + assert.equal(h.guardProc.command[2], OmarchyMenu.guardScript(h.source.tree)) + h.destroy() +}) + +test("throwing or non-string OEM compilers are destroyed once and use unchanged fallback", () => { + for (const result of [new Error("incompatible compiler"), undefined, null, 17, {}, new String("boxed")]) { + let destroyed = 0 + let compiled = 0 + const h = harness(() => ({ + compile() { compiled++; if (result instanceof Error) throw result; return result }, + destroy() { destroyed++ } + })) + h.start() + assert.equal(h.guardProc.command[2], OmarchyMenu.guardScript(h.source.tree)) + assert.equal(h.source.guardCompiler, null) + h.exit(0) + h.source.refresh() + h.destroy() + assert.equal(compiled, 1) + assert.equal(destroyed, 1) + assert.equal(h.imports.length, 1) + } +}) + +test("component destruction releases a working optional compiler", () => { + let destroyed = 0 + const h = harness(() => ({ compile: () => "stock", destroy() { destroyed++ } })) + h.start() + h.destroy() + assert.equal(destroyed, 1) +}) + +test("only successful complete guard responses publish once", () => { + const h = harness() + h.start() + h.exit(0) + assert.deepEqual(h.source.guards, { when: { probe: true, other: false }, checked: { probe: false }, disabled: { probe: true } }) + assert.equal(h.source.revision, 8) + assert.deepEqual(h.messages, []) + h.exit(0) + assert.equal(h.source.revision, 8) +}) + +test("nonzero exit or abnormal termination retains previous guards and warns once", () => { + for (const [code, status] of [[1, 0], [0, 1], [9, 1]]) { + const h = harness() + const previous = h.source.guards + h.start() + h.exit(code, status) + assert.equal(h.source.guards, previous) + assert.equal(h.source.revision, 7) + assert.equal(h.messages.length, 1) + assert.equal(h.messages[0][0], "warning") + assert.match(h.messages[0][1], /refresh failed/) + } +}) + +test("exit zero with missing or malformed rows retains previous guards", () => { + const rows = ["probe:w:1", "probe:c:0", "probe:d:1", "other:w:0"] + for (let missing = 0; missing < rows.length; missing++) { + const h = harness() + const previous = h.source.guards + h.start() + h.exit(0, 0, [...rows.filter((row, i) => i !== missing), rows[(missing + 1) % rows.length], "probe:d:2", "bad id:w:1"].join("\n")) + assert.equal(h.source.guards, previous) + assert.equal(h.source.revision, 7) + assert.equal(h.messages.length, 1) + assert.match(h.messages[0][1], /incomplete/) + } + const empty = harness() + const previous = empty.source.guards + empty.start() + empty.exit(0, 0, "") + assert.equal(empty.source.guards, previous) +}) + +test("expected tags are captured per request rather than read from changed guard fields", () => { + const h = harness() + const previous = h.source.guards + h.start() + h.source.tree.items.probe.disabled = "" + h.exit(0, 0, "probe:w:1\nprobe:c:0\nother:w:0\n") + assert.equal(h.source.guards, previous) + assert.match(h.messages[0][1], /incomplete/) +}) + +test("a response for an old tree is discarded and the current tree is refreshed", () => { + const h = harness() + const previous = h.source.guards + h.start() + const requested = h.guardProc.requestTree + h.source.tree = OmarchyMenu.buildTree(OmarchyMenu.parse('{"latest":{"checked":"true"}}').items, []) + h.source.refresh() + assert.equal(h.guardProc.requestTree, requested) + h.exit(0) + assert.equal(h.source.guards, previous) + assert.equal(h.source.revision, 7) + assert.equal(h.guardProc.requestTree, h.source.tree) + assert.deepEqual(Array.from(h.guardProc.expectedGuards), ["latest:c"]) + assert.equal(h.guardProc.running, true) + h.exit(0, 0, "latest:c:1\n") + assert.deepEqual(h.source.guards, { when: {}, checked: { latest: true }, disabled: {} }) + assert.equal(h.source.revision, 8) +}) + +test("empty guard scripts do not launch a process", () => { + const h = harness(() => ({ compile: () => "", destroy() {} })) + h.source.tree = OmarchyMenu.buildTree([], []) + h.start() + assert.equal(h.guardProc.running, false) + assert.equal(h.guardProc.requestTree, null) +}) + +function sandbox(t) { + const parent = fs.realpathSync("/tmp") + const root = fs.mkdtempSync(path.join(parent, "oma-cast-guard-probe-")) + const marker = path.join(root, ".oma-cast-guard-probe") + fs.writeFileSync(marker, "guard import fixtures\n") + t.after(() => { + assert.ok(path.isAbsolute(root)) + assert.equal(path.dirname(root), parent) + assert.ok(path.basename(root).startsWith("oma-cast-guard-probe-")) + assert.equal(fs.readFileSync(marker, "utf8"), "guard import fixtures\n") + fs.rmSync(root, { recursive: true, force: true }) + }) + return root +} + +// Opt in on Omarchy: OMA_CAST_QML_RUNNER=/usr/bin/qs node --test tests/omarchy-native-guards.test.js +test("real QML imports present, missing, broken, throwing and quoted-path OEM fixtures", { skip: !process.env.OMA_CAST_QML_RUNNER }, t => { + const root = sandbox(t) + const paths = {} + const fixtures = { + present: 'function guardScript(items) { return "stock:" + Object.keys(items).sort().join(",") }\n', + missing: null, + broken: 'function guardScript( {\n', + throws: 'function guardScript(items) { throw new Error("compiler failed") }\n', + invalid: 'function guardScript(items) { return 7 }\n', + 'space "double" \'single\' #percent%': 'function guardScript(items) { return "stock:" + Object.keys(items).sort().join(",") }\n' + } + for (const [name, script] of Object.entries(fixtures)) { + paths[name] = path.join(root, name) + const dir = path.join(paths[name], "shell/plugins/menu") + fs.mkdirSync(dir, { recursive: true }) + if (script !== null) fs.writeFileSync(path.join(dir, "MenuModel.js"), script) + } + const env = { ...process.env, HOME: root, TMPDIR: root, QT_QPA_PLATFORM: "offscreen", QML_DISABLE_DISK_CACHE: "1" } + for (const key of ["XDG_CACHE_HOME", "XDG_CONFIG_HOME", "XDG_DATA_HOME", "XDG_STATE_HOME", "XDG_RUNTIME_DIR"]) { + env[key] = path.join(root, key) + fs.mkdirSync(env[key], { mode: 0o700 }) + } + const coreUrl = pathToFileURL(path.join(__dirname, "../plugin/core/OmarchyMenu.js")).href + const config = path.join(root, "shell.qml") + fs.writeFileSync(config, `import QtQml +import Quickshell +import ${JSON.stringify(coreUrl)} as OmarchyMenu +ShellRoot { + id: source + property string omarchyPath: "" + property var guardCompiler: null + property var tree: ({ items: ({}), order: [] }) + property var guards: ({}) + property int revision: 0 + property var providerQueue: [] + signal message(string level, string text, var metadata) + property QtObject guardProcess: QtObject { + id: guardProc + property bool running: false + property string collected: "" + property var requestTree: null + property var expectedGuards: [] + property var command: [] + } + property QtObject providerProcess: QtObject { id: providerProc; property bool running: true } + function providerMenus() { return [] } + function startNextProvider() {} + ${methods.map(method).join("\n ")} + ${text.match(/Component.onDestruction: [^\n]+/)[0]} + function check(ok, detail) { if (!ok) throw new Error(detail) } + Component.onCompleted: Qt.callLater(function() { + try { + var paths = ${JSON.stringify(paths)} + source.tree = { order: ["probe", "bad", "__proto__", "constructor", "toString"], items: JSON.parse(${JSON.stringify(JSON.stringify({ + probe: { id: "probe", when: "true" }, bad: { id: "bad'; echo injected", when: "true" }, + ["__proto__"]: { id: "__proto__", checked: "false" }, constructor: { id: "constructor", disabled: "true" } + }))}) } + var items = source.guardItems(source.tree) + check(Object.getPrototypeOf(items) === null, "input map has a prototype") + check(Object.keys(items).sort().join(",") === "__proto__,constructor,probe", "unsafe input IDs") + var fallback = OmarchyMenu.guardScript(source.tree) + check(source.compileGuards(source.tree, items) === fallback, "startup fallback") + for (var name in paths) { + source.omarchyPath = paths[name] + source.createGuardCompiler() + var available = name === "present" || name.indexOf("space ") === 0 + if (name !== "missing" && name !== "broken") check(source.guardCompiler !== null, "import failed: " + name) + var script = source.compileGuards(source.tree, items) + check(script === (available ? "stock:__proto__,constructor,probe" : fallback), "wrong compiler: " + name) + if (source.guardCompiler) { source.guardCompiler.destroy(); source.guardCompiler = null } + } + console.log("OMA_CAST_GUARD_PROBE:OK") + } catch (error) { console.error("OMA_CAST_GUARD_PROBE:FAIL " + error) } + Qt.quit() + }) +} +`) + const result = spawnSync(process.env.OMA_CAST_QML_RUNNER, ["-p", config], { cwd: root, env, encoding: "utf8", timeout: 15000, killSignal: "SIGKILL" }) + assert.ifError(result.error) + const output = result.stdout + result.stderr + assert.equal(result.status, 0, output) + assert.match(output, /OMA_CAST_GUARD_PROBE:OK/) + assert.doesNotMatch(output, /OMA_CAST_GUARD_PROBE:FAIL/) +}) From 65e95e668fa34da740cae630cc026affdf79c024 Mon Sep 17 00:00:00 2001 From: Guilherme Caraciolo Date: Thu, 22 Oct 2026 16:23:09 -0300 Subject: [PATCH 08/15] Switch to an app's open window instead of launching another Enter on an app now focuses its most recently used window, which also switches to its workspace, and launches only when no window is open. Windows match by desktop id, StartupWMClass, or the URL Chromium/Brave web app classes are built from. Shift+Enter ("Open New Window") always starts a new instance. The focus waits for the launcher's layer to unmap: Hyprland refuses focus while it holds exclusive keyboard focus and refocuses the previous window when it goes. Co-Authored-By: Claude Opus 5.5 (1M context) --- CLAUDE.md | 1 + README.md | 1 + plugin/Backend.qml | 17 ++++++++- plugin/core/RootSearch.js | 53 +++++++++++++++++++++++++++ plugin/services/AppFocuser.qml | 67 ++++++++++++++++++++++++++++++++++ plugin/ui/LauncherWindow.qml | 2 + tests/rootsearch.test.js | 28 ++++++++++++++ 7 files changed, 167 insertions(+), 2 deletions(-) create mode 100644 plugin/services/AppFocuser.qml diff --git a/CLAUDE.md b/CLAUDE.md index 608dbac..3f30f0c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -112,6 +112,7 @@ Works: - empty root: Favorites, Suggestions (frecency > 1, top 6), Commands, Applications - query: Results, then `Use "" with…` (Google, DuckDuckGo fallbacks) - **Providers:** apps from `shell.appLibrary`, the whole Omarchy menu (about 400 items, with breadcrumbs, guards, ✓ state and font/power-profile provider rows), and the built-in "Omarchy Menu". +- **Opening an open app [D]:** ↵ on an app focuses its most recently used window, switching to its workspace, and launches only when none is open. Windows match by desktop id, `StartupWMClass`, or the URL Chromium/Brave web app classes are built from (`RootSearch.findAppWindow`). The focus waits for the `oma-cast` layer to unmap, since Hyprland refuses focus while it holds the keyboard. Shift+↵ ("Open New Window") always launches. - **Ranking state:** frecency (+100 per launch, 10-day half-life) and learned search terms in `db/frecency.json`. Aliases (exact → top; duplicates rejected), favourites (Ctrl+Shift+F, reorder Ctrl+Alt+↑↓) and disabled commands live in `db/settings.json` `commands`. - **Navigation:** pushed Omarchy submenus (search within them), the alias editor, back with Esc / Ctrl+[ / Backspace on an empty query / the header arrow, and Shift+Esc to pop to root. - **Keyboard:** Ctrl+K action panel (filterable, per-row shortcuts), ↵ / Ctrl+↵ / Ctrl+Shift+↵ for the first three actions, Ctrl+1–9, Ctrl+↑↓ to jump sections, PageUp/PageDown, ↑ on an empty root for search history, Ctrl+Shift+C copy, Alt+Shift+D disable, Ctrl + / − / 0 zoom. diff --git a/README.md b/README.md index c4c0278..a143e33 100644 --- a/README.md +++ b/README.md @@ -95,6 +95,7 @@ need live desktop validation. | Key | Does | |---|---| | `↵` / `Ctrl+↵` / `Ctrl+Shift+↵` | Run the first, second or third action | +| `Shift+↵` | Open a new window of an app (`↵` switches to the one already open) | | `Ctrl+K` | Open the action panel | | `Super+V` / `Ctrl+V` / `Ctrl+Shift+V` / `Shift+Insert` | Paste text into the query (also accepts clipboard-history selections) | | `Ctrl+Alt+↵` | Ask the default agent using the current root-search text | diff --git a/plugin/Backend.qml b/plugin/Backend.qml index 76d6582..65ce472 100644 --- a/plugin/Backend.qml +++ b/plugin/Backend.qml @@ -252,6 +252,11 @@ Item { return { push: { kind: "menu", menuId: item.id, title: item.label } } } + function launchApp(candidate) { + if (backend.appLibrary) backend.appLibrary.launch(candidate.appId, candidate.title) + else Util.execArgv(["uwsm-app", "--", "gtk-launch", candidate.appId + ".desktop"]) + } + function performAction(data) { var id = String(data && data.id || "") var action = String(data && data.action || "open") @@ -263,8 +268,7 @@ Item { switch (candidate.kind) { case "app": backend.recordVisit(id, query) - if (backend.appLibrary) backend.appLibrary.launch(candidate.appId, candidate.title) - else Util.execArgv(["uwsm-app", "--", "gtk-launch", candidate.appId + ".desktop"]) + appFocuser.open(candidate) return { close: true } case "omarchy-action": if (candidate.disabled) return { toast: { style: "failure", title: candidate.title + " is already set up" } } @@ -300,6 +304,10 @@ Item { } switch (action) { + case "open-new": + backend.recordVisit(id, query) + backend.launchApp(candidate) + return { close: true } case "open-in-omarchy-menu": backend.summonPlugin("omarchy.menu", JSON.stringify({ menu: backend.omarchyRouteFor(candidate) })) return { close: true } @@ -554,6 +562,11 @@ Item { if (method === "window.visibilityChanged" && data && !data.visible) agentLauncher.cancel() } + AppFocuser { + id: appFocuser + onLaunchRequested: function(candidate) { backend.launchApp(candidate) } + } + AgentLauncher { id: agentLauncher onPrepared: function(argv) { backend.emit("agent.launchReady", { argv: argv }) } diff --git a/plugin/core/RootSearch.js b/plugin/core/RootSearch.js index 7a7e22a..7879362 100644 --- a/plugin/core/RootSearch.js +++ b/plugin/core/RootSearch.js @@ -64,11 +64,60 @@ function appCandidate(entry) { bundleId: desktopId, typeLabel: "Application", appId: desktopId, + windowKeys: appWindowKeys(entry), iconName: String(entry.icon || ""), rootSearch: { when: "always" } } } +// host+path of a web app URL, the shape both sides of the match reduce to. +// The trailing slash is dropped rather than forced: web apps disagree on it. +function webappKey(url) { + return "webapp:" + String(url).replace(/^[a-z]+:\/\//i, "").replace(/\/+$/, "").toLowerCase() +} + +// Keys a Hyprland window class can match for one desktop entry. No single +// one covers everything: StartupWMClass is the declared answer but often +// wrong or absent, the desktop id covers files named after their class, and +// web apps declare no class at all, so their URL is rebuilt from Exec. +function appWindowKeys(entry) { + var keys = [] + function add(key) { if (key && keys.indexOf(key) < 0) keys.push(key) } + add(String(entry.id || "").toLowerCase()) + add(String(entry.startupClass || "").toLowerCase()) + var exec = String(entry.execString || "") + if (!exec && entry.command && entry.command.length) exec = Array.prototype.join.call(entry.command, " ") + if (/--app=|webapp/.test(exec)) { + var url = exec.match(/https?:\/\/[^\s"']+/) + if (url) add(webappKey(url[0])) + } + return keys +} + +// Keys for one window class. Chromium-based browsers build a web app's class +// off its URL: chrome-web.whatsapp.com__-Default -> web.whatsapp.com. +function windowClassKeys(windowClass) { + var cls = String(windowClass || "").toLowerCase() + var keys = [cls] + var url = cls.replace(/^(brave|chrome|chromium)-/, "") + if (url !== cls) keys.push(webappKey(url.replace(/-default$/, "").replace(/__/g, "/").replace(/_/g, "/"))) + return keys +} + +// Address of the most recently focused window of an app, or "" when none is +// open. focusHistoryID 0 is the focused window, higher is older. +function findAppWindow(clients, keys) { + if (!keys || !keys.length) return "" + var best = null + for (var i = 0; i < (clients || []).length; i++) { + var c = clients[i] + if (!c || !c.class || c.mapped === false) continue + var matches = windowClassKeys(c.class).some(function(k) { return keys.indexOf(k) >= 0 }) + if (matches && (!best || c.focusHistoryID < best.focusHistoryID)) best = c + } + return best ? String(best.address) : "" +} + function menuCandidate(tree, item, guards, deps) { var crumbs = deps.OmarchyMenu.breadcrumb(tree, item.id) var keywords = item.aliases.map(words).filter(function(k) { return k }) @@ -319,6 +368,7 @@ function actionsFor(candidate) { list.push({ id: "open-in-omarchy-menu", title: "Open in Omarchy Menu", shortcut: "Ctrl ↵", section: "primary", icon: "" }) if (candidate.kind === "fallback") return list + if (candidate.kind === "app") list.push({ id: "open-new", title: "Open New Window", shortcut: "Shift ↵", section: "primary", icon: "" }) if (candidate.kind === "app") list.push({ id: "copy-id", title: "Copy Desktop ID", shortcut: "Ctrl Shift C", section: "copy", icon: "" }) if (candidate.kind === "omarchy-action") list.push({ id: "copy-command", title: "Copy Command", shortcut: "Ctrl Shift C", section: "copy", icon: "" }) @@ -433,6 +483,9 @@ if (typeof module !== "undefined") { confirmationFor: confirmationFor, aboutFor: aboutFor, appCandidate: appCandidate, + appWindowKeys: appWindowKeys, + windowClassKeys: windowClassKeys, + findAppWindow: findAppWindow, menuCandidate: menuCandidate, menuCandidates: menuCandidates, builtinCandidate: builtinCandidate, diff --git a/plugin/services/AppFocuser.qml b/plugin/services/AppFocuser.qml new file mode 100644 index 0000000..aece0c4 --- /dev/null +++ b/plugin/services/AppFocuser.qml @@ -0,0 +1,67 @@ +import QtQuick +import Quickshell +import Quickshell.Io +import "../core/RootSearch.js" as RootSearch + +// Opening an app that already has a window focuses that window instead of +// starting another instance [D]. Anything that goes wrong on the way (no +// hyprctl, bad JSON, no match) falls back to launching. +Item { + id: service + property var pending: null + signal launchRequested(var candidate) + + function open(candidate) { + if (!candidate.windowKeys || !candidate.windowKeys.length) { + service.launchRequested(candidate) + return + } + if (service.pending) service.launchRequested(service.pending) + service.pending = candidate + clients.running = false + clients.running = true + } + + // Focusing the window is what moves you to its workspace. Hyprland refuses + // focus to any window while the launcher's layer holds exclusive keyboard + // focus, and refocuses the previous window when it unmaps, so wait (up to a + // second) for the "oma-cast" layer to go before dispatching. The Lua-config + // dispatcher is tried first and the classic keyword form is the fallback; + // the dispatch is retried for half a second in case it still lands early. + function focusWindow(address) { + Quickshell.execDetached(["bash", "-c", + 'for _ in $(seq 20); do' + + ' hyprctl layers -j 2>/dev/null | grep -q \'"namespace": *"oma-cast"\' || break;' + + ' sleep 0.05;' + + ' done;' + + ' for _ in 1 2 3 4 5 6 7 8 9 10; do' + + ' hyprctl dispatch "hl.dsp.focus({ window = \\"address:$0\\" })" >/dev/null 2>&1' + + ' || hyprctl dispatch focuswindow "address:$0" >/dev/null 2>&1;' + + ' [[ $(hyprctl activewindow -j | jq -r .address) == "$0" ]] && exit 0;' + + ' sleep 0.05;' + + ' done', + address]) + } + + Process { + id: clients + command: ["hyprctl", "clients", "-j"] + stdout: StdioCollector { + onStreamFinished: { + var candidate = service.pending + service.pending = null + if (!candidate) return + var address = "" + try { address = RootSearch.findAppWindow(JSON.parse(text), candidate.windowKeys) } catch (e) {} + if (address) service.focusWindow(address) + else service.launchRequested(candidate) + } + } + onExited: function(exitCode) { + if (exitCode === 0 || !service.pending) return + var candidate = service.pending + service.pending = null + service.launchRequested(candidate) + } + } +} diff --git a/plugin/ui/LauncherWindow.qml b/plugin/ui/LauncherWindow.qml index 0ef5141..4ccd2cf 100644 --- a/plugin/ui/LauncherWindow.qml +++ b/plugin/ui/LauncherWindow.qml @@ -609,6 +609,8 @@ PanelWindow { if (window.isActionPanelKey(ctrl, alt, shift, key)) { window.toggleActionPanel(); return true } if (ctrl && !shift && key === Qt.Key_P) { window.toggleDropdown(); return true } if (ctrl && !shift && key === Qt.Key_T) { window.toggleToastPanel(); return true } + // Shift+Enter opens a new window for apps; Enter focuses an open one. + if (enter && shift && !ctrl && !alt && window.performIfOffered(["open-new"])) return true if (enter && ctrl && shift) { window.performNth(2); return true } if (enter && ctrl) { window.performNth(1); return true } if (enter) { window.performNth(0); return true } diff --git a/tests/rootsearch.test.js b/tests/rootsearch.test.js index 429be0a..6e49437 100644 --- a/tests/rootsearch.test.js +++ b/tests/rootsearch.test.js @@ -180,3 +180,31 @@ test("the about panel describes a row", () => { const calc = RS.aboutFor({ kind: "calculator", calcInput: "2+2", calcResult: "4", calcResultCaption: "Four" }, NOW) assert.deepEqual(calc.map((r) => r.label), ["Question", "Answer", "Type"]) }) + +test("app windows: keys from desktop id, StartupWMClass and web app URL", () => { + assert.deepEqual(RS.appWindowKeys({ id: "sublime_text", startupClass: "subl" }), ["sublime_text", "subl"]) + assert.deepEqual(RS.appWindowKeys({ id: "WhatsApp", execString: '/home/u/.local/bin/chrome-webapp "https://web.whatsapp.com/"' }), ["whatsapp", "webapp:web.whatsapp.com"]) + assert.deepEqual(RS.appWindowKeys({ id: "Chat", command: ["omarchy-launch-webapp", "https://app.parlichat.com/chats"] }), ["chat", "webapp:app.parlichat.com/chats"]) + assert.deepEqual(RS.appWindowKeys({ id: "firefox", execString: "firefox https://example.com" }), ["firefox"]) + assert.deepEqual(RS.windowClassKeys("chrome-web.whatsapp.com__-Default"), ["chrome-web.whatsapp.com__-default", "webapp:web.whatsapp.com"]) + assert.deepEqual(RS.windowClassKeys("brave-app.parlichat.com__chats-Default"), ["brave-app.parlichat.com__chats-default", "webapp:app.parlichat.com/chats"]) +}) + +test("app windows: picks the most recently focused mapped window", () => { + const clients = [ + { class: "firefox", address: "0xa", focusHistoryID: 3, mapped: true }, + { class: "Firefox", address: "0xb", focusHistoryID: 1, mapped: true }, + { class: "firefox", address: "0xc", focusHistoryID: 0, mapped: false }, + { class: "chrome-web.whatsapp.com__-Default", address: "0xd", focusHistoryID: 2, mapped: true } + ] + assert.equal(RS.findAppWindow(clients, ["firefox"]), "0xb") + assert.equal(RS.findAppWindow(clients, ["whatsapp", "webapp:web.whatsapp.com"]), "0xd") + assert.equal(RS.findAppWindow(clients, ["signal-desktop"]), "") + assert.equal(RS.findAppWindow(clients, []), "") +}) + +test("actions: apps offer Open New Window on Shift+Enter", () => { + const app = RS.decorate(RS.appCandidate(apps[0]), ctx(), deps) + const openNew = RS.actionsFor(app).find((a) => a.id === "open-new") + assert.equal(openNew.shortcut, "Shift ↵") +}) From 756246130fc41ca5564a8b3b06a6f3beb35950a6 Mon Sep 17 00:00:00 2001 From: Guilherme Caraciolo Date: Mon, 26 Oct 2026 08:00:00 -0300 Subject: [PATCH 09/15] Bring the focused window to the top on floating workspaces On Omarchy 4.5's floating workspaces focus doesn't raise a window, so switching to an open app could leave it behind the others. After focus lands the window is now brought to the top, and one minimized to the dock is first moved back to the current workspace, the same way the dock does it. Co-Authored-By: Claude Opus 5.5 --- CLAUDE.md | 2 +- plugin/services/AppFocuser.qml | 29 ++++++++++++++++++++++++----- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 3f30f0c..5d53ca7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -112,7 +112,7 @@ Works: - empty root: Favorites, Suggestions (frecency > 1, top 6), Commands, Applications - query: Results, then `Use "" with…` (Google, DuckDuckGo fallbacks) - **Providers:** apps from `shell.appLibrary`, the whole Omarchy menu (about 400 items, with breadcrumbs, guards, ✓ state and font/power-profile provider rows), and the built-in "Omarchy Menu". -- **Opening an open app [D]:** ↵ on an app focuses its most recently used window, switching to its workspace, and launches only when none is open. Windows match by desktop id, `StartupWMClass`, or the URL Chromium/Brave web app classes are built from (`RootSearch.findAppWindow`). The focus waits for the `oma-cast` layer to unmap, since Hyprland refuses focus while it holds the keyboard. Shift+↵ ("Open New Window") always launches. +- **Opening an open app [D]:** ↵ on an app focuses its most recently used window, switching to its workspace, and launches only when none is open. Windows match by desktop id, `StartupWMClass`, or the URL Chromium/Brave web app classes are built from (`RootSearch.findAppWindow`). The focus waits for the `oma-cast` layer to unmap, since Hyprland refuses focus while it holds the keyboard. Focus doesn't raise on Omarchy 4.5's floating workspaces, so the window is then brought to the top, and one minimized to the dock is moved back first, the way the dock does it. Shift+↵ ("Open New Window") always launches. - **Ranking state:** frecency (+100 per launch, 10-day half-life) and learned search terms in `db/frecency.json`. Aliases (exact → top; duplicates rejected), favourites (Ctrl+Shift+F, reorder Ctrl+Alt+↑↓) and disabled commands live in `db/settings.json` `commands`. - **Navigation:** pushed Omarchy submenus (search within them), the alias editor, back with Esc / Ctrl+[ / Backspace on an empty query / the header arrow, and Shift+Esc to pop to root. - **Keyboard:** Ctrl+K action panel (filterable, per-row shortcuts), ↵ / Ctrl+↵ / Ctrl+Shift+↵ for the first three actions, Ctrl+1–9, Ctrl+↑↓ to jump sections, PageUp/PageDown, ↑ on an empty root for search history, Ctrl+Shift+C copy, Alt+Shift+D disable, Ctrl + / − / 0 zoom. diff --git a/plugin/services/AppFocuser.qml b/plugin/services/AppFocuser.qml index aece0c4..13d2921 100644 --- a/plugin/services/AppFocuser.qml +++ b/plugin/services/AppFocuser.qml @@ -28,19 +28,31 @@ Item { // second) for the "oma-cast" layer to go before dispatching. The Lua-config // dispatcher is tried first and the classic keyword form is the fallback; // the dispatch is retried for half a second in case it still lands early. - function focusWindow(address) { + // On floating workspaces focus doesn't raise, so the window is then brought + // to the top the way the dock does it; a window minimized to the dock is + // first moved back to the workspace in front of the user. + function focusWindow(address, minimized) { Quickshell.execDetached(["bash", "-c", 'for _ in $(seq 20); do' + ' hyprctl layers -j 2>/dev/null | grep -q \'"namespace": *"oma-cast"\' || break;' + ' sleep 0.05;' + ' done;' + + ' if [[ $1 == 1 ]]; then' + + ' ws=$(hyprctl activeworkspace -j | jq -r .id);' + + ' hyprctl dispatch "hl.dsp.window.move({ workspace = \\"$ws\\", window = \\"address:$0\\" })" >/dev/null 2>&1' + + ' || hyprctl dispatch movetoworkspacesilent "$ws,address:$0" >/dev/null 2>&1;' + + ' fi;' + ' for _ in 1 2 3 4 5 6 7 8 9 10; do' + ' hyprctl dispatch "hl.dsp.focus({ window = \\"address:$0\\" })" >/dev/null 2>&1' + ' || hyprctl dispatch focuswindow "address:$0" >/dev/null 2>&1;' - + ' [[ $(hyprctl activewindow -j | jq -r .address) == "$0" ]] && exit 0;' + + ' if [[ $(hyprctl activewindow -j | jq -r .address) == "$0" ]]; then' + + ' hyprctl dispatch "hl.dsp.window.alter_zorder({ mode = \\"top\\", window = \\"address:$0\\" })" >/dev/null 2>&1' + + ' || hyprctl dispatch alterzorder "top,address:$0" >/dev/null 2>&1;' + + ' exit 0;' + + ' fi;' + ' sleep 0.05;' + ' done', - address]) + address, minimized ? "1" : "0"]) } Process { @@ -52,8 +64,15 @@ Item { service.pending = null if (!candidate) return var address = "" - try { address = RootSearch.findAppWindow(JSON.parse(text), candidate.windowKeys) } catch (e) {} - if (address) service.focusWindow(address) + var minimized = false + try { + var list = JSON.parse(text) + address = RootSearch.findAppWindow(list, candidate.windowKeys) + minimized = list.some(function(c) { + return String(c.address) === address && c.workspace && c.workspace.name === "special:minimized" + }) + } catch (e) {} + if (address) service.focusWindow(address, minimized) else service.launchRequested(candidate) } } From 8a89b66775dc96e1adef40cef6325d4343211b08 Mon Sep 17 00:00:00 2001 From: chris power Date: Thu, 29 Oct 2026 08:59:59 -0400 Subject: [PATCH 10/15] update to handle generic windows --- plugin/core/RootSearch.js | 6 ++++-- tests/rootsearch.test.js | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/plugin/core/RootSearch.js b/plugin/core/RootSearch.js index 7879362..6ad7673 100644 --- a/plugin/core/RootSearch.js +++ b/plugin/core/RootSearch.js @@ -95,12 +95,14 @@ function appWindowKeys(entry) { } // Keys for one window class. Chromium-based browsers build a web app's class -// off its URL: chrome-web.whatsapp.com__-Default -> web.whatsapp.com. +// off its URL and the profile directory: chrome-web.whatsapp.com__-Default -> +// web.whatsapp.com. The profile is whatever the user launched with ("Default", +// "Profile 1" -> Profile_1), so the last dash segment is dropped, not matched. function windowClassKeys(windowClass) { var cls = String(windowClass || "").toLowerCase() var keys = [cls] var url = cls.replace(/^(brave|chrome|chromium)-/, "") - if (url !== cls) keys.push(webappKey(url.replace(/-default$/, "").replace(/__/g, "/").replace(/_/g, "/"))) + if (url !== cls) keys.push(webappKey(url.replace(/-[^-]*$/, "").replace(/__/g, "/").replace(/_/g, "/"))) return keys } diff --git a/tests/rootsearch.test.js b/tests/rootsearch.test.js index 6e49437..0c3c09f 100644 --- a/tests/rootsearch.test.js +++ b/tests/rootsearch.test.js @@ -185,6 +185,7 @@ test("app windows: keys from desktop id, StartupWMClass and web app URL", () => assert.deepEqual(RS.appWindowKeys({ id: "sublime_text", startupClass: "subl" }), ["sublime_text", "subl"]) assert.deepEqual(RS.appWindowKeys({ id: "WhatsApp", execString: '/home/u/.local/bin/chrome-webapp "https://web.whatsapp.com/"' }), ["whatsapp", "webapp:web.whatsapp.com"]) assert.deepEqual(RS.appWindowKeys({ id: "Chat", command: ["omarchy-launch-webapp", "https://app.parlichat.com/chats"] }), ["chat", "webapp:app.parlichat.com/chats"]) + assert.deepEqual(RS.windowClassKeys("chrome-discord.com__channels_@me-Profile_1"), ["chrome-discord.com__channels_@me-profile_1", "webapp:discord.com/channels/@me"]) assert.deepEqual(RS.appWindowKeys({ id: "firefox", execString: "firefox https://example.com" }), ["firefox"]) assert.deepEqual(RS.windowClassKeys("chrome-web.whatsapp.com__-Default"), ["chrome-web.whatsapp.com__-default", "webapp:web.whatsapp.com"]) assert.deepEqual(RS.windowClassKeys("brave-app.parlichat.com__chats-Default"), ["brave-app.parlichat.com__chats-default", "webapp:app.parlichat.com/chats"]) From 6cd068a9fc36587ea691a11ef24579c23da16595 Mon Sep 17 00:00:00 2001 From: Adam Brewer Date: Fri, 30 Oct 2026 08:37:34 +0000 Subject: [PATCH 11/15] Shares project instructions with Codex --- AGENTS.md | 1 + 1 file changed, 1 insertion(+) create mode 120000 AGENTS.md diff --git a/AGENTS.md b/AGENTS.md new file mode 120000 index 0000000..681311e --- /dev/null +++ b/AGENTS.md @@ -0,0 +1 @@ +CLAUDE.md \ No newline at end of file From fdae22c38001ccf008d4d420e4350c054cc55f45 Mon Sep 17 00:00:00 2001 From: chris power Date: Sun, 1 Nov 2026 16:11:32 -0500 Subject: [PATCH 12/15] prepare for omarchy plugin submission --- .github/workflows/ci.yml | 4 +- .gitignore | 3 +- plugin/Backend.qml => Backend.qml | 6 +- CLAUDE.md | 77 ++-- LICENSE | 21 ++ plugin/Launcher.qml => Launcher.qml | 10 +- README.md | 102 ++++-- SPEC.md | 32 +- bin/build-search | 15 +- bin/oma-cast | 187 ---------- bin/omacast | 333 ++++++++++++++++++ {plugin/core => core}/Agent.js | 0 {plugin/core => core}/Calculator.js | 0 {plugin/core => core}/FleaSearch.js | 0 {plugin/core => core}/Frecency.js | 0 {plugin/core => core}/Log.js | 2 +- {plugin/core => core}/Migrate.js | 0 {plugin/core => core}/OmarchyMenu.js | 0 {plugin/core => core}/Paths.js | 14 +- {plugin/core => core}/Ranker.js | 0 {plugin/core => core}/RootSearch.js | 0 {plugin/core => core}/Rows.js | 0 {plugin/core => core}/Rpc.js | 0 {plugin/core => core}/Schema.js | 2 +- manifest.json | 15 + plugin/manifest.json | 15 - search/Cargo.lock | 2 +- search/Cargo.toml | 2 +- search/PROVENANCE.md | 2 +- search/src/main.rs | 2 +- search/tests/protocol.rs | 2 +- .../services => services}/AgentLauncher.qml | 0 {plugin/services => services}/AppFocuser.qml | 4 +- .../services => services}/CalculatorData.qml | 7 +- {plugin/services => services}/JsonStore.qml | 0 .../services => services}/NativeSearch.qml | 4 +- .../OmarchyMenuSource.qml | 0 test-search.qml | 8 +- tests/agent-lifecycle.test.js | 10 +- tests/agent.test.js | 4 +- tests/calculator.test.js | 6 +- tests/frecency.test.js | 2 +- tests/launcher-paste.test.js | 2 +- tests/loading-feedback.test.js | 26 +- tests/log.test.js | 6 +- tests/marketplace.test.js | 45 +++ tests/menu-compatibility.test.js | 12 +- tests/migrate.test.js | 4 +- tests/native-search.test.js | 6 +- tests/native-transport.sh | 12 +- tests/omarchy-menu.test.js | 2 +- tests/omarchy-native-guards.test.js | 26 +- tests/paths.test.js | 38 +- tests/ranker.test.js | 2 +- tests/rootsearch.test.js | 8 +- tests/rows.test.js | 4 +- tests/rpc.test.js | 2 +- tests/search-integration.test.js | 10 +- tests/smoke.sh | 4 +- {plugin/ui => ui}/ActionPanel.qml | 0 {plugin/ui => ui}/Alert.qml | 0 {plugin/ui => ui}/InfoPanel.qml | 0 {plugin/ui => ui}/KeyHint.qml | 0 {plugin/ui => ui}/LauncherWindow.qml | 6 +- {plugin/ui => ui}/ResultRow.qml | 0 65 files changed, 697 insertions(+), 411 deletions(-) rename plugin/Backend.qml => Backend.qml (98%) create mode 100644 LICENSE rename plugin/Launcher.qml => Launcher.qml (94%) delete mode 100755 bin/oma-cast create mode 100755 bin/omacast rename {plugin/core => core}/Agent.js (100%) rename {plugin/core => core}/Calculator.js (100%) rename {plugin/core => core}/FleaSearch.js (100%) rename {plugin/core => core}/Frecency.js (100%) rename {plugin/core => core}/Log.js (92%) rename {plugin/core => core}/Migrate.js (100%) rename {plugin/core => core}/OmarchyMenu.js (100%) rename {plugin/core => core}/Paths.js (71%) rename {plugin/core => core}/Ranker.js (100%) rename {plugin/core => core}/RootSearch.js (100%) rename {plugin/core => core}/Rows.js (100%) rename {plugin/core => core}/Rpc.js (100%) rename {plugin/core => core}/Schema.js (97%) create mode 100644 manifest.json delete mode 100644 plugin/manifest.json rename {plugin/services => services}/AgentLauncher.qml (100%) rename {plugin/services => services}/AppFocuser.qml (96%) rename {plugin/services => services}/CalculatorData.qml (93%) rename {plugin/services => services}/JsonStore.qml (100%) rename {plugin/services => services}/NativeSearch.qml (95%) rename {plugin/services => services}/OmarchyMenuSource.qml (100%) create mode 100644 tests/marketplace.test.js rename {plugin/ui => ui}/ActionPanel.qml (100%) rename {plugin/ui => ui}/Alert.qml (100%) rename {plugin/ui => ui}/InfoPanel.qml (100%) rename {plugin/ui => ui}/KeyHint.qml (100%) rename {plugin/ui => ui}/LauncherWindow.qml (99%) rename {plugin/ui => ui}/ResultRow.qml (100%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 64c4255..608ec62 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,9 +32,9 @@ jobs: - name: Shell syntax run: | - for script in bin/oma-cast bin/build-search tests/smoke.sh tests/native-transport.sh; do + for script in bin/omacast bin/build-search tests/smoke.sh tests/native-transport.sh; do bash -n "$script" done - name: Plugin manifest is valid JSON - run: node -e 'JSON.parse(require("fs").readFileSync("plugin/manifest.json", "utf8"))' + run: node -e 'JSON.parse(require("fs").readFileSync("manifest.json", "utf8"))' diff --git a/.gitignore b/.gitignore index fc055f7..3673463 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /search/target/ -/plugin/bin/ +/bin/omacast-search +/bin/.search.* diff --git a/plugin/Backend.qml b/Backend.qml similarity index 98% rename from plugin/Backend.qml rename to Backend.qml index 65ce472..5fe1099 100644 --- a/plugin/Backend.qml +++ b/Backend.qml @@ -576,7 +576,11 @@ Item { Process { id: mkdirs - command: ["mkdir", "-p"].concat(Paths.directoriesToCreate(backend.paths)) + // Move each directory left under the old name first, unless the new one already exists. + command: ["bash", "-c", + 'while [[ $1 != -- ]]; do [[ -d $1 && ! -e $2 ]] && mv -T -- "$1" "$2"; shift 2; done; shift; exec mkdir -p -- "$@"', + "omacast-mkdirs"] + .concat([].concat.apply([], Paths.legacyMoves(backend.paths)), ["--"], Paths.directoriesToCreate(backend.paths)) onExited: function(exitCode) { if (exitCode !== 0) backend.log("error", "paths", "could not create data directories", { exitCode: exitCode }) backend.directoriesReady = true diff --git a/CLAUDE.md b/CLAUDE.md index 5d53ca7..4ed16cd 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -30,11 +30,11 @@ Spec legend: **[O]** observed in Raycast, **[I]** inferred, **[D]** design decis - Build **phase by phase** following `SPEC.md §12` (Phase 0 → 9). A phase is done only when its **Accept** checks pass. Then move on. - After each phase, update the **Status** section at the bottom of this file: what works, what's stubbed, and any deviations from the spec. - If the reference docs don't answer a question, choose a sensible value, mark it `[I]` or `[D]` in a code comment, and keep going. Raycast.app is not on the Omarchy machine. Re-running the reverse-engineering only works on the Mac where `/Applications/Raycast.app` lives. -- The working name is **`oma-cast`**: plugin id `typecraft.oma-cast`, CLI `oma-cast`, IPC target `oma-cast`, layer namespace `oma-cast`, URL scheme `oma-cast://` (later). Also register `raycast://` for extension deep links (SPEC §5.5). +- The working name is **`omacast`**: plugin id `typecraft.omacast`, CLI `omacast`, IPC target `omacast`, layer namespace `omacast`, URL scheme `omacast://` (later). Also register `raycast://` for extension deep links (SPEC §5.5). ## Architecture: an Omarchy shell plugin (SPEC §2.0) -oma-cast runs **inside `omarchy-shell`**, Omarchy's long-lived Quickshell process, as the plugin `typecraft.oma-cast`. That is how Omarchy builds its own menu, emoji picker and clipboard overlays. **Keep external dependencies near zero:** QML and plain JS only, using what Omarchy already ships (Quickshell, Qt, bash, socat, Hyprland). No Tauri, Node runtime, npm packages or native modules without asking first. The Tauri/Node design in SPEC §2 is kept for reference only. +omacast runs **inside `omarchy-shell`**, Omarchy's long-lived Quickshell process, as the plugin `typecraft.omacast`. That is how Omarchy builds its own menu, emoji picker and clipboard overlays. **Keep external dependencies near zero:** QML and plain JS only, using what Omarchy already ships (Quickshell, Qt, bash, socat, Hyprland). No Tauri, Node runtime, npm packages or native modules without asking first. The Tauri/Node design in SPEC §2 is kept for reference only. To learn the host, read the shell's own code in `$OMARCHY_PATH/shell/` (`/usr/share/omarchy/shell`): - `shell.qml`: plugin loading, `summon`/`hide`/`toggle`, and the scoped `shell` API @@ -47,21 +47,26 @@ To learn the host, read the shell's own code in `$OMARCHY_PATH/shell/` (`/usr/sh ## Repo layout ``` -SPEC.md, reference/ # the spec -plugin/ # the Omarchy shell plugin (what gets linked into ~/.config/omarchy/plugins/) - manifest.json # id typecraft.oma-cast, kind "menu" (so the shell passes shell.appLibrary), keepLoaded - Launcher.qml # entry point: open()/close() from the shell, IpcHandler "oma-cast", GlobalShortcut oma-cast:toggle - Backend.qml # in-process backend: paths, config.json, stores, method registry, notifications - ui/ # launcher surface and (later) views - services/ # QML services that do I/O (JsonStore, OmarchyMenuSource; later clipboard, …) - core/*.js # pure logic, no Qt imports: shared by QML and node tests (module.exports guard) +# The repo root is the plugin: `omarchy plugin add` clones it into ~/.config/omarchy/plugins/typecraft.omacast/ +manifest.json # id typecraft.omacast, kind "menu" (so the shell passes shell.appLibrary), keepLoaded +Launcher.qml # entry point: open()/close() from the shell, IpcHandler "omacast", GlobalShortcut omacast:toggle +Backend.qml # in-process backend: paths, config.json, stores, method registry, notifications +ui/ # launcher surface and (later) views +services/ # QML services that do I/O (JsonStore, OmarchyMenuSource; later clipboard, …) +core/*.js # pure logic, no Qt imports: shared by QML and node tests (module.exports guard) # Ranker, Frecency (ref 02 §4, port exactly), OmarchyMenu, RootSearch, Schema, Migrate, Rpc, Paths, Log -bin/oma-cast # bash CLI -tests/*.test.js # node --test unit tests for plugin/core (ranker, frecency, Omarchy menu, root search, …) +bin/omacast # bash CLI (works from a dev checkout or a marketplace install) +bin/omacast-search # built flea-search helper (gitignored; bin/build-search builds it from search/) +search/ # Rust source of the optional helper; builds into ~/.cache/omacast/search-target +SPEC.md, reference/ # the spec +tests/*.test.js # node --test unit tests for core/ (ranker, frecency, Omarchy menu, root search, …) tests/smoke.sh # live acceptance check against the running shell +LICENSE, README.md # marketplace requirements: root license, install/removal instructions ``` -Rules for `plugin/core/*.js`: one self-contained file per module (QML `import "x.js"` and node `require` must both work, so a module never imports another one). Expose functions through the `if (typeof module !== "undefined") module.exports = …` guard. QML wires the modules together. +The shell loads only the manifest's entry points, so the spec, tests and Rust source ride along harmlessly. Every push to the default branch reaches marketplace users on their next `omarchy plugin update`. `omarchy plugin validate .` must pass and the tree may hold no symlinks. + +Rules for `core/*.js`: one self-contained file per module (QML `import "x.js"` and node `require` must both work, so a module never imports another one). Expose functions through the `if (typeof module !== "undefined") module.exports = …` guard. QML wires the modules together. ## Commands @@ -69,41 +74,41 @@ Rules for `plugin/core/*.js`: one self-contained file per module (QML `import "x node --test tests/*.test.js # unit tests (node's built-in runner; no npm install) mise x act@latest -- act push # run .github/workflows/ci.yml locally in Docker (.actrc maps the WarpBuild label) tests/smoke.sh # live checks: doctor, IPC, toggle latency (<100 ms). Shows/hides the launcher, never types. -omarchy plugin validate plugin +omarchy plugin validate . -bin/oma-cast install # link plugin into ~/.config/omarchy/plugins, enable it, link CLI into ~/.local/bin -bin/oma-cast reload # pick up QML/JS edits (see "Reloading" below) -bin/oma-cast dev # reload on every save under plugin/ (needs inotifywait) -bin/oma-cast uninstall +bin/omacast install # link this checkout into ~/.config/omarchy/plugins, enable it, link CLI into ~/.local/bin +bin/omacast reload # pick up QML/JS edits (see "Reloading" below) +bin/omacast dev # reload on every save (needs inotifywait) +bin/omacast uninstall -oma-cast toggle | show | hide -oma-cast run # Phase 1+ -oma-cast call [json] # any backend method, e.g. oma-cast call system.info -oma-cast doctor -oma-cast setup hyprland # writes ~/.config/hypr/oma-cast.lua (Alt+Space) and requires it from hyprland.lua +omacast toggle | show | hide +omacast run # Phase 1+ +omacast call [json] # any backend method, e.g. omacast call system.info +omacast doctor +omacast setup hyprland [--yes] # asks, then writes ~/.config/hypr/omacast.lua (Alt+Space) and requires it from hyprland.lua -qs log -n -p "$OMARCHY_PATH/shell" -t 50 # shell log; our lines start with [oma-cast] +qs log -n -p "$OMARCHY_PATH/shell" -t 50 # shell log; our lines start with [omacast] ``` -**Reloading.** Quickshell keeps every QML/JS file it has read, keyed by path, for the life of the process, and the shell's inotify watch doesn't follow the symlink into this repo. So editing files under `plugin/` changes nothing until `oma-cast reload` re-links the plugin under a fresh `typecraft.oma-cast.dev-` path. Always reload, then check `qs log` for QML errors, before concluding a change works. A QML error shows up as "Type X unavailable" plus the real cause on the next line. Names that clash with JS globals (such as `escape`) are "Illegal method name". +**Reloading.** Quickshell keeps every QML/JS file it has read, keyed by path, for the life of the process, and the shell's inotify watch doesn't follow the symlink into this repo. So editing files in a checkout changes nothing until `omacast reload` re-links the plugin under a fresh `typecraft.omacast.dev-` path. Always reload, then check `qs log` for QML errors, before concluding a change works. A QML error shows up as "Type X unavailable" plus the real cause on the next line. Names that clash with JS globals (such as `escape`) are "Illegal method name". ## Running on Omarchy Check each of these on the machine instead of assuming it; Omarchy changes often. -- **Hyprland config is Lua** (Hyprland 0.56). `~/.config/hypr/hyprland.lua` `require`s `default.hypr.omarchy` and the user's `hypr.bindings` etc. Bindings use `o.bind("ALT + SPACE", "desc", dispatcher)`. `oma-cast setup hyprland` writes only `~/.config/hypr/oma-cast.lua` and appends one `require("hypr.oma-cast")`. Never edit Omarchy's files. -- **Hotkey.** Super+Space is the Omarchy menu and Super+Alt+Space is the dock's app grid. oma-cast defaults to **Alt+Space** through `hl.dsp.global("oma-cast:toggle")`, so the plugin's GlobalShortcut fires with no process spawn. Users can change their binding in `oma-cast.lua`; never force a Super+Space swap. -- **IPC.** `omarchy-shell args…` answers over the shell's socket (needs `socat`), falling back to `qs ipc`. Our target is `oma-cast`. `IpcHandler` (Quickshell.Io; 4.0.x dropped `ShellIpc`) functions must have typed params and return a string. +- **Hyprland config is Lua** (Hyprland 0.56). `~/.config/hypr/hyprland.lua` `require`s `default.hypr.omarchy` and the user's `hypr.bindings` etc. Bindings use `o.bind("ALT + SPACE", "desc", dispatcher)`. `omacast setup hyprland` writes only `~/.config/hypr/omacast.lua` and appends one `require("hypr.omacast")`. Never edit Omarchy's files. +- **Hotkey.** Super+Space is the Omarchy menu and Super+Alt+Space is the dock's app grid. omacast defaults to **Alt+Space** through `hl.dsp.global("omacast:toggle")`, so the plugin's GlobalShortcut fires with no process spawn. Users can change their binding in `omacast.lua`; never force a Super+Space swap. +- **IPC.** `omarchy-shell args…` answers over the shell's socket (needs `socat`), falling back to `qs ipc`. Our target is `omacast`. `IpcHandler` (Quickshell.Io; 4.0.x dropped `ShellIpc`) functions must have typed params and return a string. - **Theme.** Bind colours to `Commons.Color.menu.*` and sizes to `Style.*`. They follow `omarchy theme set` live; no theme parsing. - **App launching.** Use `shell.appLibrary.launch(id, name)`. It goes through `uwsm-app -- gtk-launch`, sends terminal apps to `omarchy-launch-tui`, and shows Omarchy's launch OSD. The shell only provides `appLibrary` to `menu`-kind plugins. - **Terminals and paste.** Alacritty/Ghostty/Kitty need Ctrl+Shift+V (SPEC §5.3). Read the class from `hyprctl activewindow -j`. - **Notifications** go to the Omarchy shell's notification service (`org.freedesktop.Notifications`). The bar has a tray widget (SNI). -- **Snippet expansion** needs the `input` group or a uinput udev rule. Keep it opt-in; `oma-cast doctor` explains it. +- **Snippet expansion** needs the `input` group or a uinput udev rule. Keep it opt-in; `omacast doctor` explains it. - **Testing on the live desktop.** Don't synthesize keystrokes (`wtype`) unless the launcher is already mapped and focused. Keys sent within about 25 ms of `show` go to the window underneath, which is usually the terminal running Claude. ## Status -Renamed **raylinux → oma-launcher → oma-cast** on 2026-10-19 (plugin `typecraft.oma-cast`, CLI `oma-cast`, IPC target and global shortcut `oma-cast:toggle`, XDG dirs `oma-cast`). The app icon is Omarchy's logo: glyph `\ue900` in the `omarchy` font, the same one the bar's menu button uses. +Renamed **raylinux → oma-launcher → oma-cast** on 2026-10-19, then **oma-cast → omacast** on 2026-11-01 for the Omarchy plugin marketplace (plugin `typecraft.omacast`, display name `omacast`, CLI `omacast`, IPC target `omacast`, global shortcut `omacast:toggle`, XDG dirs `omacast`). Another marketplace submission is called "Oma Cast" and uses IPC target `oma-cast`. The GitHub repo is still `typecraft-dev/oma-cast`. `core/Paths.js` `legacyMoves` moves the old XDG dirs on first start. `bin/omacast install` removes the old plugin links and CLI link, and `setup hyprland` migrates `oma-cast.lua`. The app icon is Omarchy's logo: glyph `\ue900` in the `omarchy` font, the same one the bar's menu button uses. **Phase 1 (Quickshell build): done**, with the gaps listed below. **Phase 0: done.** Omarchy 4.0.0.alpha, Quickshell 0.3.2, Hyprland 0.56.2. @@ -112,15 +117,15 @@ Works: - empty root: Favorites, Suggestions (frecency > 1, top 6), Commands, Applications - query: Results, then `Use "" with…` (Google, DuckDuckGo fallbacks) - **Providers:** apps from `shell.appLibrary`, the whole Omarchy menu (about 400 items, with breadcrumbs, guards, ✓ state and font/power-profile provider rows), and the built-in "Omarchy Menu". -- **Opening an open app [D]:** ↵ on an app focuses its most recently used window, switching to its workspace, and launches only when none is open. Windows match by desktop id, `StartupWMClass`, or the URL Chromium/Brave web app classes are built from (`RootSearch.findAppWindow`). The focus waits for the `oma-cast` layer to unmap, since Hyprland refuses focus while it holds the keyboard. Focus doesn't raise on Omarchy 4.5's floating workspaces, so the window is then brought to the top, and one minimized to the dock is moved back first, the way the dock does it. Shift+↵ ("Open New Window") always launches. +- **Opening an open app [D]:** ↵ on an app focuses its most recently used window, switching to its workspace, and launches only when none is open. Windows match by desktop id, `StartupWMClass`, or the URL Chromium/Brave web app classes are built from (`RootSearch.findAppWindow`). The focus waits for the `omacast` layer to unmap, since Hyprland refuses focus while it holds the keyboard. Focus doesn't raise on Omarchy 4.5's floating workspaces, so the window is then brought to the top, and one minimized to the dock is moved back first, the way the dock does it. Shift+↵ ("Open New Window") always launches. - **Ranking state:** frecency (+100 per launch, 10-day half-life) and learned search terms in `db/frecency.json`. Aliases (exact → top; duplicates rejected), favourites (Ctrl+Shift+F, reorder Ctrl+Alt+↑↓) and disabled commands live in `db/settings.json` `commands`. - **Navigation:** pushed Omarchy submenus (search within them), the alias editor, back with Esc / Ctrl+[ / Backspace on an empty query / the header arrow, and Shift+Esc to pop to root. - **Keyboard:** Ctrl+K action panel (filterable, per-row shortcuts), ↵ / Ctrl+↵ / Ctrl+Shift+↵ for the first three actions, Ctrl+1–9, Ctrl+↑↓ to jump sections, PageUp/PageDown, ↑ on an empty root for search history, Ctrl+Shift+C copy, Alt+Shift+D disable, Ctrl + / − / 0 zoom. - - Navigation bindings (`general.navigationBindings`): `emacs` moves down with Ctrl+N; `vim-motions` moves with Ctrl+J/K and puts the action panel on **Alt+K**. Set it with `oma-cast call settings.updateGeneralSettings '{"navigationBindings":"vim-motions"}'`. + - Navigation bindings (`general.navigationBindings`): `emacs` moves down with Ctrl+N; `vim-motions` moves with Ctrl+J/K and puts the action panel on **Alt+K**. Set it with `omacast call settings.updateGeneralSettings '{"navigationBindings":"vim-motions"}'`. - **Ctrl+P** opens the root dropdown (All / Applications / Commands); emacs Ctrl+P = up only works inside popups. - **Ctrl+T** opens the toast's actions (Copy Error Message on failures, Undo after Disable Command). **Ctrl+Shift+K** opens the About panel for the selected row. - **Argument pills:** "Search Google" / "Search DuckDuckGo" take a query in a pill after the search text (Tab in, Shift+Tab out). - - **Alerts:** Shut Down, Restart, Log Out and Delete All Entries ask first (↵ confirms, Esc cancels). `oma-cast run` skips the alert. + - **Alerts:** Shut Down, Restart, Log Out and Delete All Entries ask first (↵ confirms, Esc cancels). `omacast run` skips the alert. - **Feedback:** toasts in the footer and a HUD through Omarchy's OSD when the window closes; static footer "Loading…" appears only after 500 ms of visible loading, yields to toasts and resets on hide. The header divider stays still. - **Window behaviour:** - The `escapeKeyBehavior` setting works both ways. @@ -132,7 +137,7 @@ Works: - arithmetic and functions - Soulver-style percentages (`$30 + 20%`, `20% off 50`, `50 as a % of 200`) - ~250 units (`5 ft to cm`, `60 mph * 2 h`, `16px to rem`) - - currencies (ECB rates from frankfurter.dev, cached daily in `~/.cache/oma-cast/currencies.json`; turn off with `"currencyRates": false` in config.json) + - currencies (ECB rates from frankfurter.dev, cached daily in `~/.cache/omacast/currencies.json`; turn off with `"currencyRates": false` in config.json) - dates (`3 days from now`, `days until christmas`) - time zones (`time in tokyo`, `3pm london to nyc`; offsets come from one bash `printf %(%z)T` pass because QML has no Intl) - bases (`255 to hex`) @@ -149,8 +154,8 @@ Works: **Default-agent hand-off (fork, 2026-10-20):** user-authorized addition outside the original phase plan. The root fallback "Ask default agent" and Ctrl+Alt+Enter pass the query to `omarchy-agent --prompt` as a literal argv element. `AgentLauncher.qml` checks the configured agent/terminal with a bounded, question-free preflight, prevents overlapping submissions and cancels on hide/unload. `Launcher.qml` dismisses the overlay before launching through `Util.execArgv`. Errors leave the query visible. There are no new dependencies, model APIs, credentials or question-history writes. Existing CLI approval behaviour is inherited. Portable checks do not establish live terminal focus, authentication, or provider compatibility; verify those on Omarchy. Stubbed / not yet: -- No settings window, so you can't re-enable a disabled command except with Undo on the toast (Ctrl+T) or by editing `~/.local/share/oma-cast/db/settings.json` (delete its `enabled: false`). That's Phase 2. -- No deep links (`oma-cast://`); Phase 2 or 9. +- No settings window, so you can't re-enable a disabled command except with Undo on the toast (Ctrl+T) or by editing `~/.local/share/omacast/db/settings.json` (delete its `enabled: false`). That's Phase 2. +- No deep links (`omacast://`); Phase 2 or 9. Won't do (decided 2026-10-22): - Keystroke buffering. Keys sent within ~40 ms of the hotkey go to the window underneath; fixing it needs a parked surface, which Omarchy avoids (SPEC §12 Phase 1). diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..243a323 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 typecraft and omacast contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugin/Launcher.qml b/Launcher.qml similarity index 94% rename from plugin/Launcher.qml rename to Launcher.qml index ce42f89..2cf7bb5 100644 --- a/plugin/Launcher.qml +++ b/Launcher.qml @@ -12,7 +12,7 @@ Item { property var shell: null property var manifest: null - readonly property string pluginId: (root.manifest && root.manifest.id) || "typecraft.oma-cast" + readonly property string pluginId: (root.manifest && root.manifest.id) || "typecraft.omacast" property bool opened: false property double openedAt: 0 @@ -56,7 +56,7 @@ Item { } function run(commandId) { - // `oma-cast run` is explicit, so it skips the confirmation alert. + // `omacast run` is explicit, so it skips the confirmation alert. var r = backend.callSync("rootSearch.performAction", { id: commandId, action: "open", query: "", confirmed: true }) if (!r.ok) return r var outcome = r.data || {} @@ -96,14 +96,14 @@ Item { } GlobalShortcut { - appid: "oma-cast" + appid: "omacast" name: "toggle" - description: "Toggle oma-cast" + description: "Toggle omacast" onPressed: root.toggle() } IpcHandler { - target: "oma-cast" + target: "omacast" function toggle(): string { root.toggle() diff --git a/README.md b/README.md index a143e33..5f1eeff 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@
-# oma-cast +# omacast **A Raycast-esque launcher for [Omarchy](https://omarchy.org).** It learns what you use, searches your apps and every Omarchy action, and looks like it shipped with your theme. -oma-cast showing suggestions for apps and Omarchy commands +omacast showing suggestions for apps and Omarchy commands
@@ -13,7 +13,7 @@ It learns what you use, searches your apps and every Omarchy action, and looks l ## Why -Omarchy's built-in menu is great at what it does. oma-cast adds what Raycast users miss on Linux: +Omarchy's built-in menu is great at what it does. omacast adds what Raycast users miss on Linux: * **Learns your habits.** Results are ranked with a port of Raycast's root-search algorithm, plus frecency and learned search terms. The things you actually use float to the top, and if you type `ff` and pick Firefox, `ff` keeps meaning Firefox. * **One search for everything.** Your apps, all ~400 Omarchy menu actions (with breadcrumbs and live ✓ state), web-search fallbacks, and an explicit hand-off to your default coding agent. @@ -41,33 +41,71 @@ Omarchy's built-in menu is great at what it does. oma-cast adds what Raycast use ### Follows your Omarchy theme -There's no theme config. oma-cast binds to Omarchy's own colours, so it changes the moment you switch themes. +There's no theme config. omacast binds to Omarchy's own colours, so it changes the moment you switch themes. -oma-cast in Tokyo Night, Gruvbox, Rose Pine, Flexoki Light, Everforest and Osaka Jade +omacast in Tokyo Night, Gruvbox, Rose Pine, Flexoki Light, Everforest and Osaka Jade ## Install -Requires Omarchy 4 (Hyprland 0.56+, `omarchy-shell`) and `socat`, which Omarchy already ships. +Requires Omarchy 4 (Hyprland 0.56+, `omarchy-shell`). Install it from the +[Omarchy plugin marketplace](https://plugins.omarchy.org), or with: ```sh -git clone https://github.com/typecraft-dev/oma-cast.git -cd oma-cast -bin/oma-cast install # build search if cargo is installed, then link and enable the plugin -oma-cast setup hyprland # bind Alt+Space -oma-cast doctor # check everything is wired up +omarchy plugin add https://github.com/typecraft-dev/oma-cast --enable +~/.config/omarchy/plugins/typecraft.omacast/bin/omacast install # link the omacast CLI into ~/.local/bin +omacast setup hyprland # bind Alt+Space +omacast doctor # check everything is wired up +``` + +Press **Alt+Space**. Super+Space stays the Omarchy menu. + +`omacast setup hyprland` lists what it will change and asks before changing it. It writes +`~/.config/hypr/omacast.lua` and appends one `require("hypr.omacast")` line to +`~/.config/hypr/hyprland.lua`; it never edits Omarchy's own files. To use another key, edit +`omacast.lua`; setup never overwrites one that already exists. To bind it yourself instead, add +this to your Hyprland config: + +```lua +o.bind("ALT + SPACE", "omacast launcher", hl.dsp.global("omacast:toggle")) +``` + +Update with `omarchy plugin update typecraft.omacast`. + +### Remove + +```sh +omacast uninstall # asks to remove the hotkey, then runs: omarchy plugin remove typecraft.omacast ``` -With Rust (`cargo`) installed, installation builds the small **flea-search** helper locally. It matches titles, -alternate names, subtitles and keywords outside the shell's UI thread and tolerates transposed or missing letters. -Aliases, favorites, learned terms and frecency stay in oma-cast's existing ranker. Without Rust, installation keeps -the built-in matcher; install Rust and run `oma-cast build-search`, then `oma-cast reload`, to enable acceleration. -Run `tests/native-transport.sh` on Omarchy to check the real native transport, process failures and timeout fallback. -No binary download or background system service is required. If the helper fails or times out, search falls back -to the built-in matcher until the plugin reloads. The synchronous `rootSearch.search` IPC stays compatible. +Or remove it by hand: `omarchy plugin remove typecraft.omacast`, then delete `~/.config/hypr/omacast.lua` +and the `require("hypr.omacast")` line in `~/.config/hypr/hyprland.lua`, and `~/.local/bin/omacast`. +Your data stays until you delete it: `~/.config/omacast`, `~/.local/share/omacast`, `~/.cache/omacast` +and `~/.local/state/omacast`. + +### Dependencies and network access -Press **Alt+Space**. Super+Space stays the Omarchy menu. You can change the launcher binding in `~/.config/hypr/oma-cast.lua`. +omacast needs only what Omarchy ships: `omarchy-shell` (Quickshell), Hyprland, bash, `jq` and `socat`. +It adds no packages and no background services. -To remove it: `oma-cast uninstall`. +- **Currency rates.** When you open the launcher and its rates are over 12 hours old, the calculator downloads + ECB exchange rates from `api.frankfurter.dev` (retrying 30 minutes after a failure) and caches them in + `~/.cache/omacast/currencies.json`. This is the only network request omacast makes. Turn it off with + `"currencyRates": false` in `~/.config/omacast/config.json`. +- **Optional search helper.** With Rust (`cargo`) installed, `omacast install` (or `omacast build-search`) + builds the small **flea-search** helper from `search/` on your machine. It matches titles, alternate names, + subtitles and keywords outside the shell's UI thread and tolerates transposed or missing letters. Nothing is + downloaded prebuilt. Without it, omacast uses the built-in matcher, so a marketplace install works without + Rust. Aliases, favorites, learned terms and frecency stay in omacast's ranker either way. If the helper fails + or times out, search falls back to the built-in matcher until the plugin reloads. Rebuild it after + `omarchy plugin update`. +- **Default agent.** The optional "Ask default agent" action runs Omarchy's own `omarchy-agent` (below). + +### Upgrading from oma-cast + +The plugin used to be `typecraft.oma-cast`. On first start, omacast moves your `oma-cast` config, data, +cache and state directories to the `omacast` names. In a development checkout, `bin/omacast install` removes +the old plugin link and `~/.local/bin/oma-cast`, and `omacast setup hyprland` moves `oma-cast.lua` to +`omacast.lua`, keeping your key. `omacast doctor` reports anything left over. ## Ask your default agent @@ -85,7 +123,7 @@ Requires an Omarchy version with `omarchy-agent-prompt` and `omarchy-agent --prompt` (verified against `quattro` revision `3ac4365`). Select your defaults in Omarchy Settings. Agent authentication, accounts, approval behaviour, session working directory and terminal selection remain owned by -Omarchy and the agent CLI. oma-cast does not store the question in search history, +Omarchy and the agent CLI. omacast does not store the question in search history, read credentials, or make model API calls. Successful preflight checks establish launch prerequisites, not successful sign-in or a running terminal; those still need live desktop validation. @@ -112,15 +150,15 @@ need live desktop validation. ## CLI ```sh -oma-cast toggle | show | hide -oma-cast run # e.g. app:com.mitchellh.ghostty, omarchy:appearance.theme -oma-cast call [json] # call any backend method -oma-cast doctor +omacast toggle | show | hide +omacast run # e.g. app:com.mitchellh.ghostty, omarchy:appearance.theme +omacast call [json] # call any backend method +omacast doctor ``` ## Roadmap -oma-cast is early. Search, ranking and the Omarchy integration are done. Coming next: +omacast is early. Search, ranking and the Omarchy integration are done. Coming next: - [ ] Settings window - [ ] Script Commands @@ -134,13 +172,17 @@ The full plan is in [`SPEC.md`](SPEC.md). ## Development ```sh +git clone https://github.com/typecraft-dev/oma-cast.git +cd oma-cast +bin/omacast install # symlink this checkout into omarchy-shell instead of a marketplace copy node --test tests/*.test.js # unit tests, no npm install needed -tests/smoke.sh # live checks against the running shell -oma-cast dev # reload on every save +tests/smoke.sh # live checks against the running shell +omacast dev # reload on every save ``` -Quickshell caches QML for the life of the process, so run `oma-cast reload` after editing anything under `plugin/`. See [`CLAUDE.md`](CLAUDE.md) for the layout and conventions. +Remove a marketplace install first (`omarchy plugin remove typecraft.omacast`); both use the same plugin id. +Quickshell caches QML for the life of the process, so run `omacast reload` after editing a checkout. See [`CLAUDE.md`](CLAUDE.md) for the layout and conventions. ## Notes -oma-cast is an independent, clean-room project. It isn't affiliated with or endorsed by Raycast, and it contains no Raycast code or assets. It never contacts Raycast's servers and has no telemetry. Its agent action explicitly hands your question to Omarchy's existing coding-agent launcher; it provides no embedded AI runtime. +omacast is an independent, clean-room project. It isn't affiliated with or endorsed by Raycast, and it contains no Raycast code or assets. It never contacts Raycast's servers and has no telemetry. Its agent action explicitly hands your question to Omarchy's existing coding-agent launcher; it provides no embedded AI runtime. diff --git a/SPEC.md b/SPEC.md index c1744ed..2169780 100644 --- a/SPEC.md +++ b/SPEC.md @@ -74,7 +74,7 @@ Consequences for Linux: ### 2.0 Quickshell build (current) [D, 2026-10-19] **Search acceleration [D, 2026-10-28].** An optional Rust helper vendors Flea's MIT typed matcher; this is an -approved exception to the QML/JS-only runtime. The launcher searches asynchronously over JSON lines while oma-cast +approved exception to the QML/JS-only runtime. The launcher searches asynchronously over JSON lines while omacast still applies personalization, filtering, calculator and fallback sections. Exact, prefix, word, subsequence and typo matches use Flea's tiers, with shorter titles breaking prefix/word ties after frecency. High sensitivity excludes typo-only hits; medium and low use Flea's bounded edit budget (one edit from four alphanumeric letters, two from eight). @@ -84,29 +84,29 @@ and timeout all have a bounded fallback. Build-time dependencies are Rust, serde system daemon. Flea's source provenance and license live in `search/`. Results update the existing ListModel in place and reuse visible delegates, following Flea 0.3.12's stable-model technique. Unchanged answers produce no model writes. -**This supersedes the Tauri + Node design below for Omarchy.** Omarchy's desktop (bar, menus, launcher, notifications, lock screen) runs in one long-lived Quickshell process, `omarchy-shell`, whose features are plugins. oma-cast is one more plugin there, built the way Omarchy builds its own menu and emoji picker. The reasons: +**This supersedes the Tauri + Node design below for Omarchy.** Omarchy's desktop (bar, menus, launcher, notifications, lock screen) runs in one long-lived Quickshell process, `omarchy-shell`, whose features are plugins. omacast is one more plugin there, built the way Omarchy builds its own menu and emoji picker. The reasons: - **No external dependencies.** No Tauri, WebKitGTK, Node runtime, npm packages or native SQLite modules. It needs only what Omarchy already ships: Quickshell, Qt, bash, socat and Hyprland. - **Native look.** The plugin reads the active Omarchy theme's `[menu]` tokens (`qs.Commons.Color`, `Style`), so `omarchy theme set` restyles it live with no theme parser. - **Speed.** The shell process is always warm. A hotkey reaches the plugin as a Hyprland global shortcut with no process spawn, and the CLI goes through the shell's socket (about 5 ms). ``` omarchy-shell (Quickshell, one process) - └─ plugin typecraft.oma-cast (~/.config/omarchy/plugins/ → repo/plugin) - ├─ Launcher.qml lifecycle open()/close(), ShellIpc target "oma-cast", GlobalShortcut oma-cast:toggle - ├─ ui/ launcher surface on Omarchy's OverlayWindow (wlr-layer-shell, namespace "oma-cast") + └─ plugin typecraft.omacast (~/.config/omarchy/plugins/typecraft.omacast: a marketplace clone of the repo, or a link to a checkout) + ├─ Launcher.qml lifecycle open()/close(), ShellIpc target "omacast", GlobalShortcut omacast:toggle + ├─ ui/ launcher surface on Omarchy's OverlayWindow (wlr-layer-shell, namespace "omacast") ├─ Backend.qml the "backend": paths, config.json, stores, method registry ├─ services/ QML services with I/O (JsonStore = FileView + migrations; later clipboard, apps…) └─ core/*.js pure logic, no Qt: Rpc, Paths, Migrate, Log, Schema. Unit-tested with `node --test` -bin/oma-cast bash CLI → omarchy-shell oma-cast (socket), plus install/reload/doctor/setup +bin/omacast bash CLI → omarchy-shell omacast (socket), plus install/reload/doctor/setup ``` How the rest of this spec maps onto it: -- **§3 IPC.** There is no wire protocol between UI and backend; both live in one QML engine. The *method surface* stays: services register `namespace.method` handlers in one registry (`core/Rpc.js`), using Raycast's names (§3.4). `call()` returns a Promise and `callSync()` returns `{ok,data|error}`. Notifications (`window.visibilityChanged`, `settings.generalSettingsChanged`) go through `subscribe()`/`emit()`. External callers use `ShellIpc` (`oma-cast call `). The NDJSON host↔backend contract and supervisor (§3.3) are **deferred to Phase 5**: only Raycast extensions need Node, and they will run as a supervised child `Process` that speaks §3.3/§9.2. +- **§3 IPC.** There is no wire protocol between UI and backend; both live in one QML engine. The *method surface* stays: services register `namespace.method` handlers in one registry (`core/Rpc.js`), using Raycast's names (§3.4). `call()` returns a Promise and `callSync()` returns `{ok,data|error}`. Notifications (`window.visibilityChanged`, `settings.generalSettingsChanged`) go through `subscribe()`/`emit()`. External callers use `ShellIpc` (`omacast call `). The NDJSON host↔backend contract and supervisor (§3.3) are **deferred to Phase 5**: only Raycast extensions need Node, and they will run as a supervised child `Process` that speaks §3.3/§9.2. - **§4 platform.** Omarchy = Hyprland, so Phase 0 targets Hyprland only. Its config is **Lua** (`hyprland.lua`, `o.bind(...)`, `hl.dsp.global(...)`), not `.conf`. - **§5.1 window.** It uses Omarchy's `OverlayWindow`: a fullscreen transparent layer surface with exclusive keyboard focus, and the 750×475 card drawn inside it. Clicking outside the card counts as focus loss. The surface is mapped fresh on every open, which is how Omarchy avoids stale surfaces when monitors change. -- **§6 data.** Persisted state is one versioned JSON document per store under `$XDG_DATA_HOME/oma-cast/db/` (`core/Migrate.js`: numbered migrations, history, atomic writes, never overwrite an unreadable or newer file). There is **no encryption at rest** and no libsecret key: Qt's FileView has no cipher, and full-disk encryption is the Omarchy default. If a store outgrows JSON (clipboard history, file index), revisit with Qt's built-in `QtQuick.LocalStorage` (SQLite) before adding a native dependency. +- **§6 data.** Persisted state is one versioned JSON document per store under `$XDG_DATA_HOME/omacast/db/` (`core/Migrate.js`: numbered migrations, history, atomic writes, never overwrite an unreadable or newer file). There is **no encryption at rest** and no libsecret key: Qt's FileView has no cipher, and full-disk encryption is the Omarchy default. If a store outgrows JSON (clipboard history, file index), revisit with Qt's built-in `QtQuick.LocalStorage` (SQLite) before adding a native dependency. - **§10 frontend.** QML instead of React, with themes from Omarchy's tokens. The 8 Raycast themes (§10.4) become optional palettes over the same tokens. -- **Logging** goes to the shell's log (`qs log -n -p "$OMARCHY_PATH/shell"`, lines prefixed `[oma-cast]`), with the level from `config.json`. There are no separate log files. +- **Logging** goes to the shell's log (`qs log -n -p "$OMARCHY_PATH/shell"`, lines prefixed `[omacast]`), with the level from `config.json`. There are no separate log files. **Default-agent hand-off [D, fork, 2026-10-20].** Non-empty root queries add an "Ask default agent" row after the web-search fallbacks. Selecting it or pressing @@ -172,7 +172,7 @@ Why this shape: - **A Node backend is unavoidable**: Raycast extensions are Node/React programs. Putting the rest of the business logic there too mirrors Raycast and keeps one language for the services. - Write the host in Rust, not Node, for anything that needs Wayland protocols, uinput/evdev, D-Bus signals or low latency. -**Working name:** `` throughout. Pick one, e.g. `oma-cast`. Use app id `dev..` and binary ``. +**Working name:** `` throughout. Pick one, e.g. `omacast`. Use app id `dev..` and binary ``. --- @@ -776,11 +776,11 @@ Repo layout [D]: ``` ### Phase 0: Skeleton and IPC (Quickshell build, §2.0) [D] -- Omarchy shell plugin `typecraft.oma-cast` (`plugin/`, kind `menu` so the shell hands it the shared app library, `keepLoaded`). `bin/oma-cast install` links it into `~/.config/omarchy/plugins/` and enables it. -- Launcher surface (750×475, 66 header, 42 footer) on the active Omarchy theme. It starts hidden and is toggled by `oma-cast toggle`, `omarchy-shell oma-cast toggle` or the global shortcut `oma-cast:toggle` (`oma-cast setup hyprland` binds Alt+Space). +- Omarchy shell plugin `typecraft.omacast` (`plugin/`, kind `menu` so the shell hands it the shared app library, `keepLoaded`). `bin/omacast install` links it into `~/.config/omarchy/plugins/` and enables it. +- Launcher surface (750×475, 66 header, 42 footer) on the active Omarchy theme. It starts hidden and is toggled by `omacast toggle`, `omarchy-shell omacast toggle` or the global shortcut `omacast:toggle` (`omacast setup hyprland` binds Alt+Space). - In-process backend: method registry with Raycast names, `system.healthPing`, `system.healthDatabase`, `system.info`, `system.getPaths`, `settings.getGeneralSettings` / `updateGeneralSettings`, and notifications. The footer shows a live `system.healthPing` round trip. - XDG paths (§6.3), `config.json` (hot reload), logging to the shell log, and versioned JSON stores with a migrations framework. -- **Accept:** `oma-cast toggle` shows and hides in under 100 ms warm, measured from the CLI call to Hyprland's `openlayer`/`closelayer` event (`tests/smoke.sh`). A backend error or an unreadable store never takes the launcher down: calls answer `{ok:false,error}`, and the store goes read-only without overwriting the file, then recovers when the file is fixed. `node --test tests/` covers the registry, paths, migrations and logging. +- **Accept:** `omacast toggle` shows and hides in under 100 ms warm, measured from the CLI call to Hyprland's `openlayer`/`closelayer` event (`tests/smoke.sh`). A backend error or an unreadable store never takes the launcher down: calls answer `{ok:false,error}`, and the store goes read-only without overwriting the file, then recovers when the file is fixed. `node --test tests/` covers the registry, paths, migrations and logging. ### Phase 0 (original Tauri plan, superseded for Omarchy) - Tauri app with a main window. Hidden at start, toggled by ` toggle` (D-Bus single instance). @@ -798,7 +798,7 @@ Repo layout [D]: - Action panel, footer, toasts, HUD window, alerts, navigation stack, all shortcuts in §10.3. - **Accept:** type "fir" → Firefox first. Launching bumps frecency. Alias "ff" → exact top. Ctrl+K opens actions. Esc behaviour matches the setting. Golden tests for the ranker. - **Quickshell build [D, 2026-10-19]:** - - **Omarchy menu.** Every item from `omarchy-menu.jsonc` (default plus the user's `~/.config/omarchy/extensions/` file) is a root-search command (`plugin/core/OmarchyMenu.js`). Its subtitle is the breadcrumb ("Trigger › Toggle"). `when` guards hide rows, `checked` adds ✓, and `disabled` dims a row. The `fonts` and `power-profiles` provider rows are searchable too. Top-level menus show in the empty root's Commands section; deeper items appear only while searching. Opening a submenu pushes it as a view, and Ctrl+↵ opens the item in the original Omarchy menu. + - **Omarchy menu.** Every item from `omarchy-menu.jsonc` (default plus the user's `~/.config/omarchy/extensions/` file) is a root-search command (`core/OmarchyMenu.js`). Its subtitle is the breadcrumb ("Trigger › Toggle"). `when` guards hide rows, `checked` adds ✓, and `disabled` dims a row. The `fonts` and `power-profiles` provider rows are searchable too. Top-level menus show in the empty root's Commands section; deeper items appear only while searching. Opening a submenu pushes it as a view, and Ctrl+↵ opens the item in the original Omarchy menu. - **Apps** come from the shell's `appLibrary`, which handles hidden entries, icons and `uwsm-app` launching. - **Themes.** The 8 Raycast themes and the CSS variables are replaced by the live Omarchy theme tokens (§2.0). - **HUD.** The HUD is Omarchy's OSD (`omarchy-shell osd show`). @@ -809,7 +809,7 @@ Repo layout [D]: - **Ctrl+T** opens the toast's actions. Failure toasts offer "Copy Error Message"; "Disable Command" offers "Undo". - **Ctrl+Shift+K** About panel: `rootSearch.getItemInfo` → `RootSearch.aboutFor`. - **Argument pills.** Builtins may declare `arguments` (`{name, placeholder, required}`). "Search Google" and "Search DuckDuckGo" are root commands with a `query` argument. Tab enters the pills, Shift+Tab / Backspace on an empty pill goes back, ↵ with an empty required argument focuses it. - - **Alerts.** `rootSearch.performAction` returns `{confirm}` for Shut Down / Restart / Log Out and Delete All Entries until called with `confirmed: true`. `oma-cast run` is explicit and skips it. + - **Alerts.** `rootSearch.performAction` returns `{confirm}` for Shut Down / Restart / Log Out and Delete All Entries until called with `confirmed: true`. `omacast run` is explicit and skips it. - **Keystroke buffering: won't do.** A parked surface conflicts with Omarchy's remap-on-open design (note above). - **"fir" → Firefox:** on a list where another title starts with "Fire", the literal port ties at score 8 and the collator decides until Firefox has been launched once (`tests/ranker.test.js`). @@ -868,4 +868,4 @@ Repo layout [D]: - **Snippet expansion needs input-device access.** This is a security trade-off; keep it opt-in, and do the IBus/Fcitx5 engine as the cleaner long-term path. - **Unrecovered numbers** [I]: backend timeouts and restart limits, HUD duration, the Suggestions section size, and window y-offset. Pick sensible values (given above) and tune them. - **Frecency epoch:** Raycast's anchor epoch wasn't confirmed. It doesn't matter for a clone that uses Unix seconds consistently, but convert carefully when importing `frecency` from `.rayconfig` (check whether values look like 2001-epoch seconds, i.e. ≈ 8×10⁸ vs Unix ≈ 1.7×10⁹). -- **Calculator parity.** Soulver-style natural language ("$30 + 20%", "3 days from now", time zones) exceeds `fend`. Consider libqalculate as an alternate engine behind the same interface. **[D] 2026-10-19:** the Quickshell build uses neither. `plugin/core/Calculator.js` is a self-contained JS evaluator that covers these cases (see CLAUDE.md Status). libqalculate isn't an Omarchy dependency, and `qalc` reads "15% of 80" and "3 days from now" differently from Soulver. +- **Calculator parity.** Soulver-style natural language ("$30 + 20%", "3 days from now", time zones) exceeds `fend`. Consider libqalculate as an alternate engine behind the same interface. **[D] 2026-10-19:** the Quickshell build uses neither. `core/Calculator.js` is a self-contained JS evaluator that covers these cases (see CLAUDE.md Status). libqalculate isn't an Omarchy dependency, and `qalc` reads "15% of 80" and "3 days from now" differently from Soulver. diff --git a/bin/build-search b/bin/build-search index 30cd3fd..1993f25 100755 --- a/bin/build-search +++ b/bin/build-search @@ -2,14 +2,15 @@ set -euo pipefail repo=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd -P) -command -v cargo >/dev/null || { echo "oma-cast: building search needs Rust (cargo)" >&2; exit 1; } -target_dir=${CARGO_TARGET_DIR:-$repo/search/target} +command -v cargo >/dev/null || { echo "omacast: building search needs Rust (cargo)" >&2; exit 1; } +# The build goes outside the plugin folder: omarchy-shell watches that folder +# and would reload the plugin for every file cargo writes. +target_dir=${CARGO_TARGET_DIR:-${XDG_CACHE_HOME:-$HOME/.cache}/omacast/search-target} [[ $target_dir == /* ]] || target_dir="$PWD/$target_dir" cargo build --locked --release --manifest-path "$repo/search/Cargo.toml" --target-dir "$target_dir" -mkdir -p "$repo/plugin/bin" -temporary=$(mktemp "$repo/plugin/bin/.search.XXXXXXXX") +temporary=$(mktemp "$repo/bin/.search.XXXXXXXX") trap 'rm -f -- "$temporary"' EXIT -cp "$target_dir/release/oma-cast-search" "$temporary" +cp "$target_dir/release/omacast-search" "$temporary" chmod 755 "$temporary" -mv -f -- "$temporary" "$repo/plugin/bin/oma-cast-search" -echo "built $repo/plugin/bin/oma-cast-search" +mv -f -- "$temporary" "$repo/bin/omacast-search" +echo "built $repo/bin/omacast-search" diff --git a/bin/oma-cast b/bin/oma-cast deleted file mode 100755 index b4d96aa..0000000 --- a/bin/oma-cast +++ /dev/null @@ -1,187 +0,0 @@ -#!/bin/bash - -set -uo pipefail - -PLUGIN_ID="typecraft.oma-cast" -IPC_TARGET="oma-cast" - -self=$(readlink -f "${BASH_SOURCE[0]}") -repo=$(cd "$(dirname "$self")/.." && pwd) -plugin_src="$repo/plugin" -plugins_dir="${XDG_CONFIG_HOME:-$HOME/.config}/omarchy/plugins" -plugin_link="$plugins_dir/$PLUGIN_ID" - -installed_links() { - local link - for link in "$plugin_link" "$plugin_link".dev-*; do - [[ -L $link && $(readlink -f "$link") == "$plugin_src" ]] && printf '%s\n' "$link" - done -} - -current_link() { installed_links | tail -n1; } -hypr_dir="${XDG_CONFIG_HOME:-$HOME/.config}/hypr" - -usage() { - cat < [args] - -Launcher - toggle Show or hide the launcher - show | hide Show or hide it - run Open a command directly - call [json] Call a backend method, e.g. oma-cast call system.info - -Setup - build-search Build the optional flea-search helper (needs Rust/cargo) - install Link the plugin into omarchy-shell, enable it, and link this CLI into ~/.local/bin - uninstall Disable and unlink the plugin - reload Make the shell reload the plugin after editing it - dev Reload the plugin on every save under plugin/ - setup hyprland Bind Alt+Space to the launcher in ~/.config/hypr/oma-cast.lua - doctor Check that the pieces are in place -USAGE -} - -die() { echo "oma-cast: $*" >&2; exit 1; } - -ipc() { omarchy-shell "$IPC_TARGET" "$@"; } - -need_shell() { - command -v omarchy-shell >/dev/null || die "omarchy-shell not found; oma-cast runs inside the Omarchy shell" -} - -cmd_install() { - need_shell - [[ -f $plugin_src/manifest.json ]] || die "plugin source missing at $plugin_src" - if command -v cargo >/dev/null; then - "$repo/bin/build-search" || die "search helper build failed; plugin was not installed" - else - echo "Rust not found; skipping the helper build (using an existing helper or the built-in matcher)" - fi - mkdir -p "$plugins_dir" - if [[ -e $plugin_link && ! -L $plugin_link ]]; then - die "$plugin_link exists and is not a symlink; move it away first" - fi - ln -sfn "$plugin_src" "$plugin_link" - echo "linked $plugin_link -> $plugin_src" - - mkdir -p "$HOME/.local/bin" - if [[ ! -e $HOME/.local/bin/oma-cast || -L $HOME/.local/bin/oma-cast ]]; then - ln -sfn "$self" "$HOME/.local/bin/oma-cast" - echo "linked ~/.local/bin/oma-cast" - fi - - omarchy-shell -q shell rescanPlugins - local out i - for i in $(seq 1 50); do - out=$(omarchy plugin enable "$PLUGIN_ID" 2>&1) && break - [[ $out == *"not ready"* || $out == *"could not find"* || $out == *"not known"* ]] || break - sleep 0.1 - done - [[ -n $out ]] && echo "$out" - - for i in $(seq 1 100); do - [[ $(omarchy-shell "$IPC_TARGET" ping 2>/dev/null) == "ok" ]] && { echo "oma-cast is running"; return 0; } - sleep 0.1 - done - die "plugin did not answer; check the shell log with: qs log -n -p \"\$OMARCHY_PATH/shell\"" -} - -cmd_uninstall() { - need_shell - omarchy plugin disable "$PLUGIN_ID" 2>/dev/null || true - local link - while IFS= read -r link; do - [[ -n $link ]] && rm "$link" && echo "removed $link" - done < <(installed_links) - omarchy-shell -q shell rescanPlugins - if [[ -L $HOME/.local/bin/oma-cast && $(readlink -f "$HOME/.local/bin/oma-cast") == "$self" ]]; then - rm "$HOME/.local/bin/oma-cast" && echo "removed ~/.local/bin/oma-cast" - fi -} - -cmd_reload() { - [[ -n $(current_link) ]] || die "plugin is not installed; run: oma-cast install" - local old - while IFS= read -r old; do rm "$old"; done < <(installed_links) - ln -s "$plugin_src" "$plugin_link.dev-$(date +%s%N)" -} - -cmd_dev() { - command -v inotifywait >/dev/null || die "inotifywait not found (inotify-tools)" - cmd_reload - echo "watching $plugin_src; Ctrl+C to stop" - inotifywait -m -r -q -e close_write,create,delete,move --format '%w%f' "$plugin_src" | - while read -r path; do - echo "changed ${path#"$plugin_src"/}" - cmd_reload - done -} - -cmd_setup_hyprland() { - [[ -f $hypr_dir/hyprland.lua ]] || die "no $hypr_dir/hyprland.lua; this setup targets Lua-configured Hyprland (hyprctl version: $(hyprctl version 2>/dev/null | head -1))" - - local conflicts - conflicts=$(grep -rnE '"ALT \+ SPACE"|ALT, ?SPACE' "$hypr_dir" "${OMARCHY_PATH:-/usr/share/omarchy}/default/hypr" 2>/dev/null | grep -v "$hypr_dir/oma-cast.lua" | grep -vE '^\S+:[0-9]+:\s*(--|#)') - if [[ -n $conflicts ]]; then - echo "Alt+Space is already bound:" >&2 - echo "$conflicts" >&2 - die "unbind it first, or edit $hypr_dir/oma-cast.lua to use another key" - fi - - cat >"$hypr_dir/oma-cast.lua" <<'LUA' -o.bind("ALT + SPACE", "oma-cast launcher", hl.dsp.global("oma-cast:toggle")) - -LUA - echo "wrote $hypr_dir/oma-cast.lua" - - if ! grep -qE '^\s*require\("hypr\.oma-cast"\)' "$hypr_dir/hyprland.lua"; then - printf '\nrequire("hypr.oma-cast")\n' >>"$hypr_dir/hyprland.lua" - echo "added require(\"hypr.oma-cast\") to $hypr_dir/hyprland.lua" - fi - hyprctl reload >/dev/null && echo "reloaded Hyprland; Alt+Space toggles oma-cast" -} - -cmd_doctor() { - local bad=0 - check() { - local label=$1; shift - if "$@" >/dev/null 2>&1; then printf ' ok %s\n' "$label"; else printf ' FAIL %s\n' "$label"; bad=1; fi - } - echo "oma-cast doctor" - check "omarchy-shell is installed" command -v omarchy-shell - check "omarchy-shell is running" omarchy-shell shell ping - check "socat is installed (fast shell IPC)" command -v socat - check "Hyprland socket is reachable" hyprctl version - check "plugin is linked into $plugins_dir" test -n "$(current_link)" - check "plugin is enabled" bash -c "omarchy plugin list --json 2>/dev/null | grep -q '\"id\":\"$PLUGIN_ID\"[^}]*\"enabled\":true'" - check "plugin answers IPC" bash -c "[[ \$(omarchy-shell $IPC_TARGET ping) == ok ]]" - check "backend answers system.healthPing" bash -c "omarchy-shell $IPC_TARGET call system.healthPing '{}' | grep -q '\"ok\":true'" - if [[ -f $hypr_dir/oma-cast.lua ]]; then - printf ' ok hotkey file %s\n' "$hypr_dir/oma-cast.lua" - else - printf ' info no hotkey yet; run: oma-cast setup hyprland\n' - fi - return $bad -} - -case "${1:-}" in - toggle|show|hide) need_shell; ipc "$1" >/dev/null ;; - run) need_shell; [[ -n ${2:-} ]] || die "usage: oma-cast run "; ipc run "$2" ;; - call) need_shell; [[ -n ${2:-} ]] || die "usage: oma-cast call [json]"; ipc call "$2" "${3:-}" ;; - ping) need_shell; ipc ping ;; - build-search) "$repo/bin/build-search" ;; - install) cmd_install ;; - uninstall) cmd_uninstall ;; - reload) cmd_reload ;; - dev) cmd_dev ;; - setup) - case "${2:-}" in - hyprland) cmd_setup_hyprland ;; - *) die "usage: oma-cast setup hyprland" ;; - esac - ;; - doctor) cmd_doctor ;; - -h|--help|help|"") usage ;; - *) usage >&2; exit 1 ;; -esac diff --git a/bin/omacast b/bin/omacast new file mode 100755 index 0000000..8210a48 --- /dev/null +++ b/bin/omacast @@ -0,0 +1,333 @@ +#!/bin/bash + +set -uo pipefail + +PLUGIN_ID="typecraft.omacast" +IPC_TARGET="omacast" +# The name before 2026-11-01; install, setup and doctor clean up after it. +LEGACY_ID="typecraft.oma-cast" +LEGACY_NAME="oma-cast" + +self=$(readlink -f "${BASH_SOURCE[0]}") +repo=$(cd "$(dirname "$self")/.." && pwd -P) +plugins_dir="${XDG_CONFIG_HOME:-$HOME/.config}/omarchy/plugins" +plugin_link="$plugins_dir/$PLUGIN_ID" +hypr_dir="${XDG_CONFIG_HOME:-$HOME/.config}/hypr" +cli_link="$HOME/.local/bin/omacast" + +# A marketplace install (`omarchy plugin add`) is this repo cloned straight into +# the plugins dir. A development checkout lives elsewhere and is symlinked in. +managed() { [[ $repo == "$(cd "$plugins_dir" 2>/dev/null && pwd -P)/$PLUGIN_ID" ]]; } + +installed_links() { + local link + for link in "$plugin_link" "$plugin_link".dev-*; do + [[ -L $link && $(readlink -f "$link") == "$repo" ]] && printf '%s\n' "$link" + done +} + +current_link() { installed_links | tail -n1; } + +usage() { + cat < [args] + +Launcher + toggle Show or hide the launcher + show | hide Show or hide it + run Open a command directly + call [json] Call a backend method, e.g. omacast call system.info + +Setup + install Enable the plugin and link this CLI into ~/.local/bin + (a development checkout is also linked into omarchy-shell) + uninstall Disable and remove the plugin, offering to remove the hotkey + setup hyprland [--yes] Bind Alt+Space to the launcher in ~/.config/hypr/omacast.lua + build-search Build the optional flea-search helper (needs Rust/cargo) + doctor Check that the pieces are in place + +Development checkout + reload Make the shell reload the plugin after editing it + dev Reload the plugin on every save +USAGE +} + +die() { echo "omacast: $*" >&2; exit 1; } + +ipc() { omarchy-shell "$IPC_TARGET" "$@"; } + +need_shell() { + command -v omarchy-shell >/dev/null || die "omarchy-shell not found; omacast runs inside the Omarchy shell" +} + +interactive() { [[ -t 0 && -t 1 ]]; } + +# confirm +confirm() { + (( $2 )) && return 0 + interactive || die "refusing to change your config without confirmation; pass --yes" + if command -v gum >/dev/null; then + gum confirm "$1" + else + local answer + read -r -p "$1 [y/N] " answer + [[ $answer == [yY]* ]] + fi +} + +link_cli() { + mkdir -p "$HOME/.local/bin" + if [[ ! -e $cli_link || -L $cli_link ]]; then + ln -sfn "$self" "$cli_link" + echo "linked $cli_link" + else + echo "left $cli_link alone; it is not a symlink" + fi +} + +# Undo what the oma-cast install left behind: its plugin links, its enable +# entry and its CLI link. Hyprland files are handled by setup hyprland. +remove_legacy_install() { + local link removed=0 + for link in "$plugins_dir/$LEGACY_ID" "$plugins_dir/$LEGACY_ID".dev-*; do + [[ -L $link ]] || continue + rm "$link" && echo "removed old link $link" && removed=1 + done + if omarchy plugin list --json 2>/dev/null | jq -e --arg id "$LEGACY_ID" 'any(.[]; .id == $id and .enabled)' >/dev/null 2>&1 || + jq -e --arg id "$LEGACY_ID" '.plugins // [] | any(.id == $id)' "${XDG_CONFIG_HOME:-$HOME/.config}/omarchy/shell.json" >/dev/null 2>&1; then + omarchy plugin disable "$LEGACY_ID" >/dev/null 2>&1 && echo "disabled $LEGACY_ID" + fi + local old_cli="$HOME/.local/bin/$LEGACY_NAME" + if [[ -L $old_cli && ( ! -e $old_cli || $(readlink "$old_cli") == "$repo"/* ) ]]; then + rm "$old_cli" && echo "removed old $old_cli" + fi + (( removed )) && omarchy-shell -q shell rescanPlugins + return 0 +} + +# Same rule as core/Paths.js legacyMoves, run before build-search creates the +# new cache dir and so stops the plugin from moving the old one. +move_legacy_dirs() { + local base + for base in "${XDG_CONFIG_HOME:-$HOME/.config}" "${XDG_DATA_HOME:-$HOME/.local/share}" \ + "${XDG_CACHE_HOME:-$HOME/.cache}" "${XDG_STATE_HOME:-$HOME/.local/state}"; do + [[ -d $base/$LEGACY_NAME && ! -e $base/omacast ]] || continue + mv -T -- "$base/$LEGACY_NAME" "$base/omacast" && echo "moved $base/$LEGACY_NAME to $base/omacast" + done +} + +cmd_install() { + need_shell + [[ -f $repo/manifest.json ]] || die "plugin manifest missing at $repo" + move_legacy_dirs + if command -v cargo >/dev/null; then + "$repo/bin/build-search" || die "search helper build failed; plugin was not installed" + else + echo "Rust not found; skipping the helper build (using an existing helper or the built-in matcher)" + fi + remove_legacy_install + + if ! managed; then + mkdir -p "$plugins_dir" + if [[ -e $plugin_link && ! -L $plugin_link ]]; then + die "$plugin_link exists and is not a symlink; remove it with: omarchy plugin remove $PLUGIN_ID" + fi + ln -sfn "$repo" "$plugin_link" + echo "linked $plugin_link -> $repo" + fi + link_cli + + omarchy-shell -q shell rescanPlugins + local out i + for i in $(seq 1 50); do + out=$(omarchy plugin enable "$PLUGIN_ID" 2>&1) && break + [[ $out == *"not ready"* || $out == *"could not find"* || $out == *"not known"* ]] || break + sleep 0.1 + done + [[ -n $out ]] && echo "$out" + + for i in $(seq 1 100); do + if [[ $(omarchy-shell "$IPC_TARGET" ping 2>/dev/null) == "ok" ]]; then + echo "omacast is running" + [[ -f $hypr_dir/omacast.lua ]] || echo "bind a hotkey with: omacast setup hyprland" + return 0 + fi + sleep 0.1 + done + die "plugin did not answer; check the shell log with: qs log -n -p \"\$OMARCHY_PATH/shell\"" +} + +cmd_uninstall() { + need_shell + local assume_yes=0 + [[ ${1:-} == --yes || ${1:-} == -y ]] && assume_yes=1 + + if [[ -L $cli_link && $(readlink -f "$cli_link") == "$self" ]]; then + rm "$cli_link" && echo "removed $cli_link" + fi + if [[ -f $hypr_dir/omacast.lua ]]; then + if ! (( assume_yes )) && ! interactive; then + echo "kept the hotkey; remove $hypr_dir/omacast.lua and require(\"hypr.omacast\") yourself, or pass --yes" + elif confirm "Remove the hotkey ($hypr_dir/omacast.lua and its require in hyprland.lua)?" "$assume_yes"; then + sed -i -E '/^\s*require\("hypr\.omacast"\)\s*$/d; /^-- omacast launcher bindings$/d' "$hypr_dir/hyprland.lua" + rm "$hypr_dir/omacast.lua" && echo "removed $hypr_dir/omacast.lua" + hyprctl reload >/dev/null 2>&1 + fi + fi + + if managed; then + local args=() + (( assume_yes )) && args=(--yes) + exec omarchy plugin remove "$PLUGIN_ID" "${args[@]}" + fi + omarchy plugin disable "$PLUGIN_ID" 2>/dev/null || true + local link + while IFS= read -r link; do + [[ -n $link ]] && rm "$link" && echo "removed $link" + done < <(installed_links) + omarchy-shell -q shell rescanPlugins +} + +need_checkout() { + managed && die "$1 is for development checkouts; edits under $repo reload automatically" + [[ -n $(current_link) ]] || die "plugin is not installed; run: omacast install" +} + +cmd_reload() { + need_checkout reload + local old + while IFS= read -r old; do rm "$old"; done < <(installed_links) + ln -s "$repo" "$plugin_link.dev-$(date +%s%N)" +} + +cmd_dev() { + command -v inotifywait >/dev/null || die "inotifywait not found (inotify-tools)" + need_checkout dev + cmd_reload + echo "watching $repo; Ctrl+C to stop" + inotifywait -m -r -q -e close_write,create,delete,move --format '%w%f' \ + --exclude '/(\.git|search|tests|reference|docs)/' "$repo" | + while read -r path; do + echo "changed ${path#"$repo"/}" + cmd_reload + done +} + +cmd_setup_hyprland() { + local assume_yes=0 + [[ ${1:-} == --yes || ${1:-} == -y ]] && assume_yes=1 + local main="$hypr_dir/hyprland.lua" file="$hypr_dir/omacast.lua" legacy="$hypr_dir/$LEGACY_NAME.lua" + [[ -f $main ]] || die "no $main; this setup targets Lua-configured Hyprland (hyprctl version: $(hyprctl version 2>/dev/null | head -1))" + + local conflicts + conflicts=$(grep -rnE '"ALT \+ SPACE"|ALT, ?SPACE' "$hypr_dir" "${OMARCHY_PATH:-/usr/share/omarchy}/default/hypr" 2>/dev/null | + grep -vF -e "$file:" -e "$legacy:" | grep -vE '^\S+:[0-9]+:\s*(--|#)') + if [[ -n $conflicts ]]; then + echo "Alt+Space is already bound:" >&2 + echo "$conflicts" >&2 + die "unbind it first, or write $file yourself with another key" + fi + + local legacy_require=0 needs_require=1 plan=() + grep -qE '^\s*require\("hypr\.oma-cast"\)' "$main" && legacy_require=1 + grep -qE '^\s*require\("hypr\.omacast"\)' "$main" && needs_require=0 + if [[ -f $file ]]; then + plan+=("keep your existing $file") + elif [[ -f $legacy ]]; then + plan+=("move $legacy to $file, renaming oma-cast:toggle to omacast:toggle") + else + plan+=("write $file, binding Alt+Space to omacast:toggle") + fi + if (( legacy_require )); then + plan+=("replace require(\"hypr.oma-cast\") with require(\"hypr.omacast\") in $main") + elif (( needs_require )); then + plan+=("append require(\"hypr.omacast\") to $main") + fi + plan+=("reload Hyprland") + + echo "omacast setup hyprland will:" + printf ' - %s\n' "${plan[@]}" + confirm "Make these changes?" "$assume_yes" || die "nothing changed" + + if [[ ! -f $file && -f $legacy ]]; then + sed 's/oma-cast/omacast/g; s/rerunning setup overwrites it/rerunning setup keeps it/' "$legacy" >"$file" && rm "$legacy" && echo "moved $legacy to $file" + elif [[ ! -f $file ]]; then + cat >"$file" <<'LUA' +-- Written by `omacast setup hyprland`. Safe to edit; rerunning setup keeps it. +-- Alt+Space reaches the plugin's global shortcut directly, so no process +-- starts per keypress. Omarchy's own menu stays on Super+Space. +o.bind("ALT + SPACE", "omacast launcher", hl.dsp.global("omacast:toggle")) +LUA + echo "wrote $file" + fi + + if (( legacy_require )); then + sed -i -E 's/^(\s*)require\("hypr\.oma-cast"\)/\1require("hypr.omacast")/; s/^-- oma-cast launcher bindings$/-- omacast launcher bindings/' "$main" + echo "updated the require in $main" + elif (( needs_require )); then + printf '\nrequire("hypr.omacast")\n' >>"$main" + echo "added require(\"hypr.omacast\") to $main" + fi + hyprctl reload >/dev/null && echo "reloaded Hyprland; Alt+Space toggles omacast" +} + +cmd_doctor() { + local bad=0 + check() { + local label=$1; shift + if "$@" >/dev/null 2>&1; then printf ' ok %s\n' "$label"; else printf ' FAIL %s\n' "$label"; bad=1; fi + } + echo "omacast doctor" + check "omarchy-shell is installed" command -v omarchy-shell + check "omarchy-shell is running" omarchy-shell shell ping + check "socat is installed (fast shell IPC)" command -v socat + check "Hyprland socket is reachable" hyprctl version + if managed; then + printf ' ok plugin is installed in %s\n' "$repo" + else + check "plugin is linked into $plugins_dir" test -n "$(current_link)" + fi + check "plugin is enabled" bash -c "omarchy plugin list --json 2>/dev/null | jq -e --arg id '$PLUGIN_ID' 'any(.[]; .id == \$id and .enabled)'" + check "plugin answers IPC" bash -c "[[ \$(omarchy-shell $IPC_TARGET ping) == ok ]]" + check "backend answers system.healthPing" bash -c "omarchy-shell $IPC_TARGET call system.healthPing '{}' | grep -q '\"ok\":true'" + if [[ -x $repo/bin/omacast-search ]]; then + printf ' ok flea-search helper is built\n' + else + printf ' info no flea-search helper; using the built-in matcher (build it with: omacast build-search)\n' + fi + local base + for base in "${XDG_CONFIG_HOME:-$HOME/.config}" "${XDG_DATA_HOME:-$HOME/.local/share}" \ + "${XDG_CACHE_HOME:-$HOME/.cache}" "${XDG_STATE_HOME:-$HOME/.local/state}"; do + [[ -d $base/$LEGACY_NAME ]] && printf ' info %s is left from oma-cast; omacast uses %s\n' "$base/$LEGACY_NAME" "$base/omacast" + done + if [[ -f $hypr_dir/$LEGACY_NAME.lua ]] || grep -qE '^\s*require\("hypr\.oma-cast"\)' "$hypr_dir/hyprland.lua" 2>/dev/null; then + printf ' FAIL the hotkey still uses the old oma-cast name; run: omacast setup hyprland\n' + bad=1 + elif [[ -f $hypr_dir/omacast.lua ]]; then + printf ' ok hotkey file %s\n' "$hypr_dir/omacast.lua" + else + printf ' info no hotkey yet; run: omacast setup hyprland\n' + fi + return $bad +} + +case "${1:-}" in + toggle|show|hide) need_shell; ipc "$1" >/dev/null ;; + run) need_shell; [[ -n ${2:-} ]] || die "usage: omacast run "; ipc run "$2" ;; + call) need_shell; [[ -n ${2:-} ]] || die "usage: omacast call [json]"; ipc call "$2" "${3:-}" ;; + ping) need_shell; ipc ping ;; + build-search) move_legacy_dirs; "$repo/bin/build-search" ;; + install) cmd_install ;; + uninstall) cmd_uninstall "${2:-}" ;; + reload) cmd_reload ;; + dev) cmd_dev ;; + setup) + case "${2:-}" in + hyprland) cmd_setup_hyprland "${3:-}" ;; + *) die "usage: omacast setup hyprland [--yes]" ;; + esac + ;; + doctor) cmd_doctor ;; + -h|--help|help|"") usage ;; + *) usage >&2; exit 1 ;; +esac diff --git a/plugin/core/Agent.js b/core/Agent.js similarity index 100% rename from plugin/core/Agent.js rename to core/Agent.js diff --git a/plugin/core/Calculator.js b/core/Calculator.js similarity index 100% rename from plugin/core/Calculator.js rename to core/Calculator.js diff --git a/plugin/core/FleaSearch.js b/core/FleaSearch.js similarity index 100% rename from plugin/core/FleaSearch.js rename to core/FleaSearch.js diff --git a/plugin/core/Frecency.js b/core/Frecency.js similarity index 100% rename from plugin/core/Frecency.js rename to core/Frecency.js diff --git a/plugin/core/Log.js b/core/Log.js similarity index 92% rename from plugin/core/Log.js rename to core/Log.js index 257fd19..8e54bfc 100644 --- a/plugin/core/Log.js +++ b/core/Log.js @@ -11,7 +11,7 @@ function shouldLog(level, threshold) { } function format(level, category, message, metadata) { - var line = "[oma-cast] [" + LEVELS[levelIndex(level)] + "]" + var line = "[omacast] [" + LEVELS[levelIndex(level)] + "]" if (category) line += " [" + category + "]" line += " " + String(message) if (metadata !== undefined && metadata !== null) { diff --git a/plugin/core/Migrate.js b/core/Migrate.js similarity index 100% rename from plugin/core/Migrate.js rename to core/Migrate.js diff --git a/plugin/core/OmarchyMenu.js b/core/OmarchyMenu.js similarity index 100% rename from plugin/core/OmarchyMenu.js rename to core/OmarchyMenu.js diff --git a/plugin/core/Paths.js b/core/Paths.js similarity index 71% rename from plugin/core/Paths.js rename to core/Paths.js index bae506d..921b624 100644 --- a/plugin/core/Paths.js +++ b/core/Paths.js @@ -1,5 +1,7 @@ -var APP = "oma-cast" +var APP = "omacast" +// The name before 2026-11-01. Its directories move to APP on first start. [D] +var LEGACY_APP = "oma-cast" function xdg(env, name, homeFallback) { var value = String(env(name) || "") @@ -37,10 +39,18 @@ function resolve(env) { } } +// [from, to] pairs for the base directories still under LEGACY_APP. +function legacyMoves(paths) { + var suffix = "/" + APP + return [paths.config, paths.data, paths.cache, paths.state].map(function(dir) { + return [dir.slice(0, -suffix.length) + "/" + LEGACY_APP, dir] + }) +} + function directoriesToCreate(paths) { return [paths.config, paths.db, paths.cache, paths.logs, paths.backups, paths.runtime] } if (typeof module !== "undefined") { - module.exports = { APP: APP, resolve: resolve, directoriesToCreate: directoriesToCreate } + module.exports = { APP: APP, LEGACY_APP: LEGACY_APP, resolve: resolve, legacyMoves: legacyMoves, directoriesToCreate: directoriesToCreate } } diff --git a/plugin/core/Ranker.js b/core/Ranker.js similarity index 100% rename from plugin/core/Ranker.js rename to core/Ranker.js diff --git a/plugin/core/RootSearch.js b/core/RootSearch.js similarity index 100% rename from plugin/core/RootSearch.js rename to core/RootSearch.js diff --git a/plugin/core/Rows.js b/core/Rows.js similarity index 100% rename from plugin/core/Rows.js rename to core/Rows.js diff --git a/plugin/core/Rpc.js b/core/Rpc.js similarity index 100% rename from plugin/core/Rpc.js rename to core/Rpc.js diff --git a/plugin/core/Schema.js b/core/Schema.js similarity index 97% rename from plugin/core/Schema.js rename to core/Schema.js index 66d807b..cdac573 100644 --- a/plugin/core/Schema.js +++ b/core/Schema.js @@ -67,7 +67,7 @@ var configDefaults = { logLevel: "info", keepVisibleOnFocusLoss: false, // Daily ECB reference rates from frankfurter.dev for currency conversion - // (SPEC §8 Calculator). The only network request oma-cast makes. [D] + // (SPEC §8 Calculator). The only network request omacast makes. [D] currencyRates: true, // Calculator preferences named after Raycast's (ref 04 App. B) [O]. remToPxRate: 16, diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..cdb448f --- /dev/null +++ b/manifest.json @@ -0,0 +1,15 @@ +{ + "schemaVersion": 1, + "id": "typecraft.omacast", + "name": "omacast", + "version": "0.1.0", + "author": "typecraft", + "description": "A Raycast-style launcher for Omarchy: apps, every Omarchy action, calculator and frecency ranking", + "kinds": [ + "menu" + ], + "keepLoaded": true, + "entryPoints": { + "menu": "Launcher.qml" + } +} diff --git a/plugin/manifest.json b/plugin/manifest.json deleted file mode 100644 index d25c020..0000000 --- a/plugin/manifest.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "schemaVersion": 1, - "id": "typecraft.oma-cast", - "name": "Oma Cast", - "version": "0.0.1", - "author": "typecraft", - "description": "A Raycast-style launcher for Omarchy", - "kinds": [ - "menu" - ], - "keepLoaded": true, - "entryPoints": { - "menu": "Launcher.qml" - } -} diff --git a/search/Cargo.lock b/search/Cargo.lock index 7c05199..98f1365 100644 --- a/search/Cargo.lock +++ b/search/Cargo.lock @@ -15,7 +15,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] -name = "oma-cast-search" +name = "omacast-search" version = "0.1.0" dependencies = [ "serde", diff --git a/search/Cargo.toml b/search/Cargo.toml index cb98de6..451e2e7 100644 --- a/search/Cargo.toml +++ b/search/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "oma-cast-search" +name = "omacast-search" version = "0.1.0" edition = "2021" license = "MIT" diff --git a/search/PROVENANCE.md b/search/PROVENANCE.md index f679de9..b00c13e 100644 --- a/search/PROVENANCE.md +++ b/search/PROVENANCE.md @@ -37,7 +37,7 @@ license and notice are retained verbatim in `LICENSE`, SHA-256 ## Adapter contract -`oma-cast-search` uses synchronous NDJSON on stdin and stdout. Each response is +`omacast-search` uses synchronous NDJSON on stdin and stdout. Each response is flushed before reading another request. A write, flush, or input I/O failure ends the process with failure. Unknown object properties are accepted. Requests must contain exactly one of `entries` or `query` and an unsigned 64-bit integer `id`. diff --git a/search/src/main.rs b/search/src/main.rs index 289a63a..6c0ef4e 100644 --- a/search/src/main.rs +++ b/search/src/main.rs @@ -14,7 +14,7 @@ fn main() -> ExitCode { match protocol::run(stdin.lock(), &mut output) { Ok(()) => ExitCode::SUCCESS, Err(error) => { - eprintln!("oma-cast-search: {error}"); + eprintln!("omacast-search: {error}"); ExitCode::FAILURE } } diff --git a/search/tests/protocol.rs b/search/tests/protocol.rs index ff476d8..3a46727 100644 --- a/search/tests/protocol.rs +++ b/search/tests/protocol.rs @@ -8,7 +8,7 @@ const MAX_FIELDS: usize = 1_024; const MAX_ENTRIES: usize = 20_000; fn exchange(input: &[u8]) -> Vec { - let mut child = Command::new(env!("CARGO_BIN_EXE_oma-cast-search")) + let mut child = Command::new(env!("CARGO_BIN_EXE_omacast-search")) .stdin(Stdio::piped()).stdout(Stdio::piped()).stderr(Stdio::piped()) .spawn().unwrap(); child.stdin.take().unwrap().write_all(input).unwrap(); diff --git a/plugin/services/AgentLauncher.qml b/services/AgentLauncher.qml similarity index 100% rename from plugin/services/AgentLauncher.qml rename to services/AgentLauncher.qml diff --git a/plugin/services/AppFocuser.qml b/services/AppFocuser.qml similarity index 96% rename from plugin/services/AppFocuser.qml rename to services/AppFocuser.qml index 13d2921..3087f8e 100644 --- a/plugin/services/AppFocuser.qml +++ b/services/AppFocuser.qml @@ -25,7 +25,7 @@ Item { // Focusing the window is what moves you to its workspace. Hyprland refuses // focus to any window while the launcher's layer holds exclusive keyboard // focus, and refocuses the previous window when it unmaps, so wait (up to a - // second) for the "oma-cast" layer to go before dispatching. The Lua-config + // second) for the "omacast" layer to go before dispatching. The Lua-config // dispatcher is tried first and the classic keyword form is the fallback; // the dispatch is retried for half a second in case it still lands early. // On floating workspaces focus doesn't raise, so the window is then brought @@ -34,7 +34,7 @@ Item { function focusWindow(address, minimized) { Quickshell.execDetached(["bash", "-c", 'for _ in $(seq 20); do' - + ' hyprctl layers -j 2>/dev/null | grep -q \'"namespace": *"oma-cast"\' || break;' + + ' hyprctl layers -j 2>/dev/null | grep -q \'"namespace": *"omacast"\' || break;' + ' sleep 0.05;' + ' done;' + ' if [[ $1 == 1 ]]; then' diff --git a/plugin/services/CalculatorData.qml b/services/CalculatorData.qml similarity index 93% rename from plugin/services/CalculatorData.qml rename to services/CalculatorData.qml index f28d0e6..f192d0a 100644 --- a/plugin/services/CalculatorData.qml +++ b/services/CalculatorData.qml @@ -9,7 +9,7 @@ import "../core/Calculator.js" as Calculator Item { id: data - // $XDG_CACHE_HOME/oma-cast; empty until the directory exists. + // $XDG_CACHE_HOME/omacast; empty until the directory exists. property string cacheDir: "" property bool ratesEnabled: true @@ -50,7 +50,8 @@ Item { var xhr = new XMLHttpRequest() data.request = xhr xhr.onreadystatechange = function() { - if (xhr.readyState !== XMLHttpRequest.DONE || data.request !== xhr) return + // data is null once the plugin reloads with this request in flight. + if (!data || xhr.readyState !== XMLHttpRequest.DONE || data.request !== xhr) return data.request = null requestTimeout.stop() var parsed = null @@ -105,7 +106,7 @@ Item { Process { id: zoneProcess - command: ["bash", "-c", "for z in \"$@\"; do TZ=$z printf '%s %(%z)T\\n' \"$z\" -1; done", "oma-cast-zones"].concat(Calculator.zoneList()) + command: ["bash", "-c", "for z in \"$@\"; do TZ=$z printf '%s %(%z)T\\n' \"$z\" -1; done", "omacast-zones"].concat(Calculator.zoneList()) stdout: StdioCollector { onStreamFinished: { var next = ({}) diff --git a/plugin/services/JsonStore.qml b/services/JsonStore.qml similarity index 100% rename from plugin/services/JsonStore.qml rename to services/JsonStore.qml diff --git a/plugin/services/NativeSearch.qml b/services/NativeSearch.qml similarity index 95% rename from plugin/services/NativeSearch.qml rename to services/NativeSearch.qml index 6ba914e..7f8f7c5 100644 --- a/plugin/services/NativeSearch.qml +++ b/services/NativeSearch.qml @@ -6,7 +6,7 @@ Item { id: service property var entries: [] property var ids: [] - property string executable: decodeURIComponent(Qt.resolvedUrl("../bin/oma-cast-search").toString().replace(/^file:\/\//, "")) + property string executable: decodeURIComponent(Qt.resolvedUrl("../bin/omacast-search").toString().replace(/^file:\/\//, "")) property bool disabled: false property bool loaded: false property int serial: 0 @@ -88,7 +88,7 @@ Item { Process { id: helper // Bash emits a normal process exit when the helper is missing or cannot execute. - command: ["bash", "-c", 'exec -- "$1"', "oma-cast-search", service.executable] + command: ["bash", "-c", 'exec -- "$1"', "omacast-search", service.executable] stdinEnabled: true stdout: SplitParser { onRead: function(line) { service.receive(line) } } onStarted: service.load() diff --git a/plugin/services/OmarchyMenuSource.qml b/services/OmarchyMenuSource.qml similarity index 100% rename from plugin/services/OmarchyMenuSource.qml rename to services/OmarchyMenuSource.qml diff --git a/test-search.qml b/test-search.qml index 9d7c521..1d419ba 100644 --- a/test-search.qml +++ b/test-search.qml @@ -1,13 +1,13 @@ import QtQuick import Quickshell -import "plugin/services" +import "services" ShellRoot { id: root - property bool expectFallback: Quickshell.env("OMA_CAST_EXPECT_FALLBACK") === "1" + property bool expectFallback: Quickshell.env("OMACAST_EXPECT_FALLBACK") === "1" property int at: 0 property string failureMessage: "" - property string expectedFailure: Quickshell.env("OMA_CAST_EXPECT_FAILURE") || "" + property string expectedFailure: Quickshell.env("OMACAST_EXPECT_FAILURE") || "" property var queries: ["chormium", "cafe", "lcok"] property var expected: ["chrome", "cafe", "lock"] @@ -34,7 +34,7 @@ ShellRoot { } Component.onCompleted: { - var override = Quickshell.env("OMA_CAST_TEST_HELPER") + var override = Quickshell.env("OMACAST_TEST_HELPER") if (override) search.executable = override Qt.callLater(root.next) } diff --git a/tests/agent-lifecycle.test.js b/tests/agent-lifecycle.test.js index b1f885d..e8e0e74 100644 --- a/tests/agent-lifecycle.test.js +++ b/tests/agent-lifecycle.test.js @@ -3,9 +3,9 @@ const assert = require("node:assert/strict") const fs = require("node:fs") const path = require("node:path") const vm = require("node:vm") -const Agent = require("../plugin/core/Agent.js") +const Agent = require("../core/Agent.js") -const source = fs.readFileSync(path.join(__dirname, "../plugin/services/AgentLauncher.qml"), "utf8") +const source = fs.readFileSync(path.join(__dirname, "../services/AgentLauncher.qml"), "utf8") function body(text, signature, indentation) { const start = text.indexOf(signature) assert.ok(start >= 0, signature) @@ -74,7 +74,7 @@ test("failure, crash and timeout never prepare a terminal launch", () => { }) test("showing refreshes calculator data and hiding cancels an agent hand-off", () => { - const text = fs.readFileSync(path.join(__dirname, "../plugin/Backend.qml"), "utf8") + const text = fs.readFileSync(path.join(__dirname, "../Backend.qml"), "utf8") const events = [] const context = vm.createContext({ method: "window.visibilityChanged", data: { visible: true }, @@ -97,7 +97,7 @@ test("showing refreshes calculator data and hiding cancels an agent hand-off", ( }) test("entry point dismisses and clears the launcher before starting the terminal", () => { - const text = fs.readFileSync(path.join(__dirname, "../plugin/Launcher.qml"), "utf8") + const text = fs.readFileSync(path.join(__dirname, "../Launcher.qml"), "utf8") const events = [] const argv = Agent.launchArgv("Question") const context = vm.createContext({ @@ -114,7 +114,7 @@ test("entry point dismisses and clears the launcher before starting the terminal }) test("agent shortcut is limited to root search and preserves normal Enter actions", () => { - const text = fs.readFileSync(path.join(__dirname, "../plugin/ui/LauncherWindow.qml"), "utf8") + const text = fs.readFileSync(path.join(__dirname, "../ui/LauncherWindow.qml"), "utf8") const events = [] let next = 16 const Qt = new Proxy({ ControlModifier: 1, ShiftModifier: 2, AltModifier: 4 }, { diff --git a/tests/agent.test.js b/tests/agent.test.js index 2ad711e..84dfd8f 100644 --- a/tests/agent.test.js +++ b/tests/agent.test.js @@ -4,10 +4,10 @@ const fs = require("node:fs") const os = require("node:os") const path = require("node:path") const { spawnSync } = require("node:child_process") -const Agent = require("../plugin/core/Agent.js") +const Agent = require("../core/Agent.js") function fixture(t) { - const dir = fs.mkdtempSync(path.join(os.tmpdir(), "oma-cast-agent-")) + const dir = fs.mkdtempSync(path.join(os.tmpdir(), "omacast-agent-")) t.after(() => fs.rmSync(dir, { recursive: true, force: true })) const script = (name, source) => fs.writeFileSync(path.join(dir, name), "#!/bin/bash\n" + source, { mode: 0o700 }) for (const tool of ["omarchy-agent", "omarchy-agent-prompt", "omarchy-launch-tui", "uwsm-app", "codex"]) script(tool, "exit 0\n") diff --git a/tests/calculator.test.js b/tests/calculator.test.js index cd69408..41ce592 100644 --- a/tests/calculator.test.js +++ b/tests/calculator.test.js @@ -1,7 +1,7 @@ const test = require("node:test") const assert = require("node:assert/strict") -const C = require("../plugin/core/Calculator.js") -const RS = require("../plugin/core/RootSearch.js") +const C = require("../core/Calculator.js") +const RS = require("../core/RootSearch.js") // Monday 19 Oct 2026, 16:06 in New York (UTC-4). Dates use the process // zone, so pin it. @@ -164,7 +164,7 @@ test("history is newest first, unique, pruned after 90 days and capped", () => { }) test("root search puts the Calculator section first; ↵ copies, Ctrl ↵ pastes", () => { - const deps = { Ranker: require("../plugin/core/Ranker.js"), Frecency: require("../plugin/core/Frecency.js"), OmarchyMenu: require("../plugin/core/OmarchyMenu.js") } + const deps = { Ranker: require("../core/Ranker.js"), Frecency: require("../core/Frecency.js"), OmarchyMenu: require("../core/OmarchyMenu.js") } const ctx = { commands: {}, frecency: {}, nowMs: NOW, sensitivity: "medium", calculation: C.evaluate("2+2", env) } const sections = RS.rootSections(RS.BUILTINS.map(RS.builtinCandidate), "2+2", ctx, deps) assert.equal(sections[0].id, "calculator") diff --git a/tests/frecency.test.js b/tests/frecency.test.js index 6159b79..b29a798 100644 --- a/tests/frecency.test.js +++ b/tests/frecency.test.js @@ -1,6 +1,6 @@ const test = require("node:test") const assert = require("node:assert/strict") -const F = require("../plugin/core/Frecency.js") +const F = require("../core/Frecency.js") const T = 1_800_000_000 const DAY = 86400 diff --git a/tests/launcher-paste.test.js b/tests/launcher-paste.test.js index 989fd85..68e8645 100644 --- a/tests/launcher-paste.test.js +++ b/tests/launcher-paste.test.js @@ -4,7 +4,7 @@ const fs = require("node:fs") const path = require("node:path") const vm = require("node:vm") -const source = fs.readFileSync(path.join(__dirname, "../plugin/ui/LauncherWindow.qml"), "utf8") +const source = fs.readFileSync(path.join(__dirname, "../ui/LauncherWindow.qml"), "utf8") function body(signature) { const start = source.indexOf(signature) diff --git a/tests/loading-feedback.test.js b/tests/loading-feedback.test.js index ef6e2f7..30b6474 100644 --- a/tests/loading-feedback.test.js +++ b/tests/loading-feedback.test.js @@ -5,7 +5,7 @@ const os = require("node:os") const path = require("node:path") const { spawnSync } = require("node:child_process") -const source = fs.readFileSync(path.join(__dirname, "../plugin/ui/LauncherWindow.qml"), "utf8") +const source = fs.readFileSync(path.join(__dirname, "../ui/LauncherWindow.qml"), "utf8") // QML block sample: " onBusyChanged: {\n loadingDelay.stop()\n }". function qmlBlock(signature) { @@ -16,15 +16,15 @@ function qmlBlock(signature) { return source.slice(start, end + 4) } -test("loading feedback delays fast work, preserves toasts and resets across hide and reopen", { skip: !process.env.OMA_CAST_QML_RUNNER }, t => { +test("loading feedback delays fast work, preserves toasts and resets across hide and reopen", { skip: !process.env.OMACAST_QML_RUNNER }, t => { const parent = fs.realpathSync(os.tmpdir()) - const root = fs.mkdtempSync(path.join(parent, "oma-cast-loading-probe-")) - const marker = path.join(root, ".oma-cast-loading-probe") + const root = fs.mkdtempSync(path.join(parent, "omacast-loading-probe-")) + const marker = path.join(root, ".omacast-loading-probe") fs.writeFileSync(marker, "loading feedback fixture\n") t.after(() => { assert.ok(path.isAbsolute(root)) assert.equal(path.dirname(root), parent) - assert.ok(path.basename(root).startsWith("oma-cast-loading-probe-")) + assert.ok(path.basename(root).startsWith("omacast-loading-probe-")) assert.equal(fs.readFileSync(marker, "utf8"), "loading feedback fixture\n") fs.rmSync(root, { recursive: true, force: true }) }) @@ -50,7 +50,7 @@ ShellRoot { property QtObject backend: QtObject { property bool loading: false } property bool shown: false property var toast: null - property var view: ({ title: "oma-cast" }) + property var view: ({ title: "omacast" }) ${declarations} ${qmlBlock("onBusyChanged: {")} ${qmlBlock("Timer {\n id: loadingDelay")} @@ -58,17 +58,17 @@ ShellRoot { property int stage: 0 function check(ok, detail) { if (!ok) throw new Error(detail) } property var stages: [ - { wait: 50, run: function() { check(!window.loadingVisible && window.footerText === "oma-cast", "fast work flashed"); backend.loading = false } }, + { wait: 50, run: function() { check(!window.loadingVisible && window.footerText === "omacast", "fast work flashed"); backend.loading = false } }, { wait: loadingFeedbackDelay + 80, run: function() { check(!window.loadingVisible, "completed work left a pending cue"); backend.loading = true } }, { wait: loadingFeedbackDelay + 80, run: function() { check(window.loadingVisible && window.footerText === "Loading…", "slow work lacks feedback"); window.toast = { title: "Copied" } } }, { wait: 30, run: function() { check(window.footerText === "Copied", "toast lost priority"); window.toast = null; backend.loading = false } }, - { wait: 30, run: function() { check(!window.loadingVisible && window.footerText === "oma-cast", "completion did not restore context"); backend.loading = true } }, + { wait: 30, run: function() { check(!window.loadingVisible && window.footerText === "omacast", "completion did not restore context"); backend.loading = true } }, { wait: 100, run: function() { window.shown = false } }, { wait: loadingFeedbackDelay + 80, run: function() { check(!window.loadingVisible, "hidden window retained feedback"); window.shown = true } }, { wait: 100, run: function() { check(!window.loadingVisible, "reopen reused an old delay") } }, { wait: loadingFeedbackDelay + 80, run: function() { check(window.loadingVisible, "reopen lost persistent loading"); window.shown = false } }, { wait: 30, run: function() { check(!window.loadingVisible, "close retained visible feedback"); backend.loading = false; window.shown = true } }, - { wait: loadingFeedbackDelay + 80, run: function() { check(!window.loadingVisible && window.footerText === "oma-cast", "idle reopen flashed"); console.log("OMA_CAST_LOADING_PROBE:OK"); Qt.quit() } } + { wait: loadingFeedbackDelay + 80, run: function() { check(!window.loadingVisible && window.footerText === "omacast", "idle reopen flashed"); console.log("OMACAST_LOADING_PROBE:OK"); Qt.quit() } } ] Timer { id: tick @@ -80,7 +80,7 @@ ShellRoot { tick.interval = window.stages[window.stage].wait tick.restart() } - } catch (error) { console.error("OMA_CAST_LOADING_PROBE:FAIL " + error); Qt.quit() } + } catch (error) { console.error("OMACAST_LOADING_PROBE:FAIL " + error); Qt.quit() } } } Component.onCompleted: Qt.callLater(function() { @@ -91,10 +91,10 @@ ShellRoot { }) } `) - const result = spawnSync(process.env.OMA_CAST_QML_RUNNER, ["-p", config], { cwd: root, env, encoding: "utf8", timeout: 10000, killSignal: "SIGKILL" }) + const result = spawnSync(process.env.OMACAST_QML_RUNNER, ["-p", config], { cwd: root, env, encoding: "utf8", timeout: 10000, killSignal: "SIGKILL" }) assert.ifError(result.error) const output = result.stdout + result.stderr assert.equal(result.status, 0, output) - assert.match(output, /OMA_CAST_LOADING_PROBE:OK/) - assert.doesNotMatch(output, /OMA_CAST_LOADING_PROBE:FAIL/) + assert.match(output, /OMACAST_LOADING_PROBE:OK/) + assert.doesNotMatch(output, /OMACAST_LOADING_PROBE:FAIL/) }) diff --git a/tests/log.test.js b/tests/log.test.js index 1d74c36..1ac7eee 100644 --- a/tests/log.test.js +++ b/tests/log.test.js @@ -1,6 +1,6 @@ const test = require("node:test") const assert = require("node:assert/strict") -const Log = require("../plugin/core/Log.js") +const Log = require("../core/Log.js") test("levels filter by threshold, unknown levels count as info", () => { assert.ok(Log.shouldLog("error", "info")) @@ -10,6 +10,6 @@ test("levels filter by threshold, unknown levels count as info", () => { }) test("lines carry level, category and one-line metadata", () => { - assert.equal(Log.format("warning", "store", "slow", { ms: 3 }), '[oma-cast] [warning] [store] slow {"ms":3}') - assert.equal(Log.format("info", "", "hi"), "[oma-cast] [info] hi") + assert.equal(Log.format("warning", "store", "slow", { ms: 3 }), '[omacast] [warning] [store] slow {"ms":3}') + assert.equal(Log.format("info", "", "hi"), "[omacast] [info] hi") }) diff --git a/tests/marketplace.test.js b/tests/marketplace.test.js new file mode 100644 index 0000000..f06091e --- /dev/null +++ b/tests/marketplace.test.js @@ -0,0 +1,45 @@ +const test = require("node:test") +const assert = require("node:assert/strict") +const fs = require("node:fs") +const path = require("node:path") +const { execFileSync } = require("node:child_process") + +// The repo root is what `omarchy plugin add` installs. These mirror +// omarchy-plugin-validate and the marketplace's SUBMISSION.md, so CI catches +// a broken listing without Omarchy installed. +const root = path.join(__dirname, "..") +const manifest = JSON.parse(fs.readFileSync(path.join(root, "manifest.json"), "utf8")) + +test("manifest has every field the marketplace lists", () => { + assert.equal(manifest.schemaVersion, 1) + for (const field of ["id", "name", "version", "author", "description", "kinds", "entryPoints"]) { + assert.ok(manifest[field], `missing ${field}`) + } + assert.equal(manifest.id, "typecraft.omacast") + assert.equal(manifest.name, "omacast") + assert.match(manifest.id, /^[A-Za-z0-9][A-Za-z0-9._-]*$/) + assert.ok(!manifest.id.startsWith("omarchy.")) + assert.ok(manifest.version.length <= 64) +}) + +test("every kind has an entry point that exists", () => { + for (const kind of manifest.kinds) { + const entry = manifest.entryPoints[kind] + assert.ok(entry, `kind ${kind} has no entry point`) + assert.ok(!path.isAbsolute(entry) && !entry.includes("..")) + assert.ok(fs.statSync(path.join(root, entry)).isFile(), `${entry} not found`) + } +}) + +test("root has a README and a license", () => { + assert.ok(fs.existsSync(path.join(root, "README.md"))) + assert.match(fs.readFileSync(path.join(root, "LICENSE"), "utf8"), /^MIT License/) +}) + +const inGit = fs.existsSync(path.join(root, ".git")) + +test("no tracked symlinks, which the shell refuses inside a plugin", { skip: !inGit && "not a git checkout" }, () => { + const files = execFileSync("git", ["ls-files", "-s"], { cwd: root, encoding: "utf8" }) + const links = files.split("\n").filter((line) => line.startsWith("120000")) + assert.deepEqual(links, []) +}) diff --git a/tests/menu-compatibility.test.js b/tests/menu-compatibility.test.js index 14b6306..e80117d 100644 --- a/tests/menu-compatibility.test.js +++ b/tests/menu-compatibility.test.js @@ -5,13 +5,13 @@ const os = require("node:os") const path = require("node:path") const vm = require("node:vm") const { execFileSync } = require("node:child_process") -const OmarchyMenu = require("../plugin/core/OmarchyMenu.js") -const RootSearch = require("../plugin/core/RootSearch.js") -const Ranker = require("../plugin/core/Ranker.js") -const Frecency = require("../plugin/core/Frecency.js") +const OmarchyMenu = require("../core/OmarchyMenu.js") +const RootSearch = require("../core/RootSearch.js") +const Ranker = require("../core/Ranker.js") +const Frecency = require("../core/Frecency.js") const deps = { OmarchyMenu, Ranker, Frecency } -const backendSource = fs.readFileSync(path.join(__dirname, "../plugin/Backend.qml"), "utf8") +const backendSource = fs.readFileSync(path.join(__dirname, "../Backend.qml"), "utf8") function backendFunction(name, params, context) { const signature = "function " + name + "(" + params + ")" @@ -97,7 +97,7 @@ test("kernel rows obey the menu visibility guard and remain searchable when visi }) test("kernel enumeration reads list/get and set receives the selected value literally", t => { - const dir = fs.mkdtempSync(path.join(os.tmpdir(), "oma-cast-kernels-")) + const dir = fs.mkdtempSync(path.join(os.tmpdir(), "omacast-kernels-")) t.after(() => fs.rmSync(dir, { recursive: true, force: true })) fs.writeFileSync(path.join(dir, "omarchy-kernel"), '#!/bin/bash\ncase "$1" in\nget) echo linux-lts ;;\nlist) printf "linux\\nlinux-lts\\n" ;;\nset) printf "%s\\0" "$@" ;;\n*) exit 1 ;;\nesac\n', { mode: 0o755 }) const env = { ...process.env, PATH: dir + ":" + process.env.PATH } diff --git a/tests/migrate.test.js b/tests/migrate.test.js index 7e14d7b..0e27640 100644 --- a/tests/migrate.test.js +++ b/tests/migrate.test.js @@ -1,7 +1,7 @@ const test = require("node:test") const assert = require("node:assert/strict") -const Migrate = require("../plugin/core/Migrate.js") -const Schema = require("../plugin/core/Schema.js") +const Migrate = require("../core/Migrate.js") +const Schema = require("../core/Schema.js") const migrations = [ { version: 1, name: "init", up: (d) => { d.items = []; return d } }, diff --git a/tests/native-search.test.js b/tests/native-search.test.js index de7e781..5d0b6cf 100644 --- a/tests/native-search.test.js +++ b/tests/native-search.test.js @@ -3,10 +3,10 @@ const assert = require("node:assert/strict") const fs = require("node:fs") const path = require("node:path") const vm = require("node:vm") -const F = require("../plugin/core/FleaSearch.js") -const R = require("../plugin/core/Ranker.js") +const F = require("../core/FleaSearch.js") +const R = require("../core/Ranker.js") -const source = fs.readFileSync(path.join(__dirname, "../plugin/services/NativeSearch.qml"), "utf8") +const source = fs.readFileSync(path.join(__dirname, "../services/NativeSearch.qml"), "utf8") function harness() { const events = [], writes = [] const service = { entries: [{ title: "Files" }], ids: ["files"], serial: 0, loadId: 0, loaded: false, disabled: false, pending: null, failed: m => events.push(m) } diff --git a/tests/native-transport.sh b/tests/native-transport.sh index 9747738..fe69106 100755 --- a/tests/native-transport.sh +++ b/tests/native-transport.sh @@ -3,11 +3,11 @@ set -euo pipefail repo=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd -P) command -v qs >/dev/null || { echo 'native transport tests need Quickshell' >&2; exit 1; } -[[ -x $repo/plugin/bin/oma-cast-search ]] || { echo 'run bin/build-search before native transport tests' >&2; exit 1; } -fixture=$(mktemp -d /tmp/oma-cast-search.XXXXXXXX) -touch "$fixture/.oma-cast-search-test" +[[ -x $repo/bin/omacast-search ]] || { echo 'run bin/build-search before native transport tests' >&2; exit 1; } +fixture=$(mktemp -d /tmp/omacast-search.XXXXXXXX) +touch "$fixture/.omacast-search-test" cleanup() { - [[ $fixture == /tmp/oma-cast-search.* && -f $fixture/.oma-cast-search-test ]] || return 1 + [[ $fixture == /tmp/omacast-search.* && -f $fixture/.omacast-search-test ]] || return 1 rm -rf -- "$fixture" } trap cleanup EXIT @@ -29,8 +29,8 @@ for name in native missing nonexecutable exit0 exit1 malformed hang; do malformed) expected="SyntaxError" ;; hang) expected="timed out" ;; esac - if [[ $name == native ]]; then helper="$repo/plugin/bin/oma-cast-search"; fallback=0; fi - OMA_CAST_TEST_HELPER="$helper" OMA_CAST_EXPECT_FALLBACK="$fallback" OMA_CAST_EXPECT_FAILURE="$expected" QT_QPA_PLATFORM=offscreen \ + if [[ $name == native ]]; then helper="$repo/bin/omacast-search"; fallback=0; fi + OMACAST_TEST_HELPER="$helper" OMACAST_EXPECT_FALLBACK="$fallback" OMACAST_EXPECT_FAILURE="$expected" QT_QPA_PLATFORM=offscreen \ timeout 8 qs -p "$repo/test-search.qml" > "$fixture/$name.log" 2>&1 || { cat "$fixture/$name.log" >&2 echo "native transport test failed: $name" >&2 diff --git a/tests/omarchy-menu.test.js b/tests/omarchy-menu.test.js index dfbcbdf..0810176 100644 --- a/tests/omarchy-menu.test.js +++ b/tests/omarchy-menu.test.js @@ -3,7 +3,7 @@ const assert = require("node:assert/strict") const fs = require("node:fs") const path = require("node:path") const { execFileSync } = require("node:child_process") -const M = require("../plugin/core/OmarchyMenu.js") +const M = require("../core/OmarchyMenu.js") const sample = `{ // comment line diff --git a/tests/omarchy-native-guards.test.js b/tests/omarchy-native-guards.test.js index 35b7e1f..c4ba8f1 100644 --- a/tests/omarchy-native-guards.test.js +++ b/tests/omarchy-native-guards.test.js @@ -5,9 +5,9 @@ const path = require("node:path") const vm = require("node:vm") const { spawnSync } = require("node:child_process") const { fileURLToPath, pathToFileURL } = require("node:url") -const OmarchyMenu = require("../plugin/core/OmarchyMenu.js") +const OmarchyMenu = require("../core/OmarchyMenu.js") -const sourcePath = path.join(__dirname, "../plugin/services/OmarchyMenuSource.qml") +const sourcePath = path.join(__dirname, "../services/OmarchyMenuSource.qml") const text = fs.readFileSync(sourcePath, "utf8") const methods = ["createGuardCompiler", "guardItems", "compileGuards", "guardKeys", "finishGuards", "refresh"] @@ -232,21 +232,21 @@ test("empty guard scripts do not launch a process", () => { function sandbox(t) { const parent = fs.realpathSync("/tmp") - const root = fs.mkdtempSync(path.join(parent, "oma-cast-guard-probe-")) - const marker = path.join(root, ".oma-cast-guard-probe") + const root = fs.mkdtempSync(path.join(parent, "omacast-guard-probe-")) + const marker = path.join(root, ".omacast-guard-probe") fs.writeFileSync(marker, "guard import fixtures\n") t.after(() => { assert.ok(path.isAbsolute(root)) assert.equal(path.dirname(root), parent) - assert.ok(path.basename(root).startsWith("oma-cast-guard-probe-")) + assert.ok(path.basename(root).startsWith("omacast-guard-probe-")) assert.equal(fs.readFileSync(marker, "utf8"), "guard import fixtures\n") fs.rmSync(root, { recursive: true, force: true }) }) return root } -// Opt in on Omarchy: OMA_CAST_QML_RUNNER=/usr/bin/qs node --test tests/omarchy-native-guards.test.js -test("real QML imports present, missing, broken, throwing and quoted-path OEM fixtures", { skip: !process.env.OMA_CAST_QML_RUNNER }, t => { +// Opt in on Omarchy: OMACAST_QML_RUNNER=/usr/bin/qs node --test tests/omarchy-native-guards.test.js +test("real QML imports present, missing, broken, throwing and quoted-path OEM fixtures", { skip: !process.env.OMACAST_QML_RUNNER }, t => { const root = sandbox(t) const paths = {} const fixtures = { @@ -268,7 +268,7 @@ test("real QML imports present, missing, broken, throwing and quoted-path OEM fi env[key] = path.join(root, key) fs.mkdirSync(env[key], { mode: 0o700 }) } - const coreUrl = pathToFileURL(path.join(__dirname, "../plugin/core/OmarchyMenu.js")).href + const coreUrl = pathToFileURL(path.join(__dirname, "../core/OmarchyMenu.js")).href const config = path.join(root, "shell.qml") fs.writeFileSync(config, `import QtQml import Quickshell @@ -317,16 +317,16 @@ ShellRoot { check(script === (available ? "stock:__proto__,constructor,probe" : fallback), "wrong compiler: " + name) if (source.guardCompiler) { source.guardCompiler.destroy(); source.guardCompiler = null } } - console.log("OMA_CAST_GUARD_PROBE:OK") - } catch (error) { console.error("OMA_CAST_GUARD_PROBE:FAIL " + error) } + console.log("OMACAST_GUARD_PROBE:OK") + } catch (error) { console.error("OMACAST_GUARD_PROBE:FAIL " + error) } Qt.quit() }) } `) - const result = spawnSync(process.env.OMA_CAST_QML_RUNNER, ["-p", config], { cwd: root, env, encoding: "utf8", timeout: 15000, killSignal: "SIGKILL" }) + const result = spawnSync(process.env.OMACAST_QML_RUNNER, ["-p", config], { cwd: root, env, encoding: "utf8", timeout: 15000, killSignal: "SIGKILL" }) assert.ifError(result.error) const output = result.stdout + result.stderr assert.equal(result.status, 0, output) - assert.match(output, /OMA_CAST_GUARD_PROBE:OK/) - assert.doesNotMatch(output, /OMA_CAST_GUARD_PROBE:FAIL/) + assert.match(output, /OMACAST_GUARD_PROBE:OK/) + assert.doesNotMatch(output, /OMACAST_GUARD_PROBE:FAIL/) }) diff --git a/tests/paths.test.js b/tests/paths.test.js index ed00154..f7a1d21 100644 --- a/tests/paths.test.js +++ b/tests/paths.test.js @@ -1,19 +1,19 @@ const test = require("node:test") const assert = require("node:assert/strict") -const Paths = require("../plugin/core/Paths.js") +const Paths = require("../core/Paths.js") const envOf = (vars) => (name) => vars[name] || "" test("defaults follow the XDG base directory spec", () => { const p = Paths.resolve(envOf({ HOME: "/home/u", XDG_RUNTIME_DIR: "/run/user/1000" })) - assert.equal(p.config, "/home/u/.config/oma-cast") - assert.equal(p.configFile, "/home/u/.config/oma-cast/config.json") - assert.equal(p.db, "/home/u/.local/share/oma-cast/db") - assert.equal(p.extensions, "/home/u/.local/share/oma-cast/extensions") - assert.equal(p.cache, "/home/u/.cache/oma-cast") - assert.equal(p.logs, "/home/u/.local/state/oma-cast/logs") - assert.equal(p.runtime, "/run/user/1000/oma-cast") - assert.equal(p.scriptCommands, "/home/u/.config/oma-cast/script-commands") + assert.equal(p.config, "/home/u/.config/omacast") + assert.equal(p.configFile, "/home/u/.config/omacast/config.json") + assert.equal(p.db, "/home/u/.local/share/omacast/db") + assert.equal(p.extensions, "/home/u/.local/share/omacast/extensions") + assert.equal(p.cache, "/home/u/.cache/omacast") + assert.equal(p.logs, "/home/u/.local/state/omacast/logs") + assert.equal(p.runtime, "/run/user/1000/omacast") + assert.equal(p.scriptCommands, "/home/u/.config/omacast/script-commands") }) test("absolute XDG overrides win, relative ones are ignored", () => { @@ -23,9 +23,9 @@ test("absolute XDG overrides win, relative ones are ignored", () => { XDG_DATA_HOME: "relative/data", XDG_STATE_HOME: "/st" })) - assert.equal(p.config, "/cfg/oma-cast") - assert.equal(p.data, "/home/u/.local/share/oma-cast") - assert.equal(p.state, "/st/oma-cast") + assert.equal(p.config, "/cfg/omacast") + assert.equal(p.data, "/home/u/.local/share/omacast") + assert.equal(p.state, "/st/omacast") }) test("missing HOME is an error", () => { @@ -35,7 +35,17 @@ test("missing HOME is an error", () => { test("startup creates the persistent dirs and the runtime dir", () => { const p = Paths.resolve(envOf({ HOME: "/h", XDG_RUNTIME_DIR: "/r" })) assert.deepEqual(Paths.directoriesToCreate(p), [ - "/h/.config/oma-cast", "/h/.local/share/oma-cast/db", "/h/.cache/oma-cast", - "/h/.local/state/oma-cast/logs", "/h/.local/state/oma-cast/backups", "/r/oma-cast" + "/h/.config/omacast", "/h/.local/share/omacast/db", "/h/.cache/omacast", + "/h/.local/state/omacast/logs", "/h/.local/state/omacast/backups", "/r/omacast" + ]) +}) + +test("directories under the old oma-cast name move to omacast", () => { + const p = Paths.resolve(envOf({ HOME: "/h", XDG_CONFIG_HOME: "/cfg" })) + assert.deepEqual(Paths.legacyMoves(p), [ + ["/cfg/oma-cast", "/cfg/omacast"], + ["/h/.local/share/oma-cast", "/h/.local/share/omacast"], + ["/h/.cache/oma-cast", "/h/.cache/omacast"], + ["/h/.local/state/oma-cast", "/h/.local/state/omacast"] ]) }) diff --git a/tests/ranker.test.js b/tests/ranker.test.js index 19398e0..1c273b1 100644 --- a/tests/ranker.test.js +++ b/tests/ranker.test.js @@ -1,6 +1,6 @@ const test = require("node:test") const assert = require("node:assert/strict") -const R = require("../plugin/core/Ranker.js") +const R = require("../core/Ranker.js") const NOW = 1_800_000_000_000 const DAY_MS = 86_400_000 diff --git a/tests/rootsearch.test.js b/tests/rootsearch.test.js index 0c3c09f..18556ba 100644 --- a/tests/rootsearch.test.js +++ b/tests/rootsearch.test.js @@ -1,9 +1,9 @@ const test = require("node:test") const assert = require("node:assert/strict") -const Ranker = require("../plugin/core/Ranker.js") -const Frecency = require("../plugin/core/Frecency.js") -const OmarchyMenu = require("../plugin/core/OmarchyMenu.js") -const RS = require("../plugin/core/RootSearch.js") +const Ranker = require("../core/Ranker.js") +const Frecency = require("../core/Frecency.js") +const OmarchyMenu = require("../core/OmarchyMenu.js") +const RS = require("../core/RootSearch.js") const deps = { Ranker, Frecency, OmarchyMenu } const NOW = Date.UTC(2026, 9, 19, 12) diff --git a/tests/rows.test.js b/tests/rows.test.js index aca4d4f..372be95 100644 --- a/tests/rows.test.js +++ b/tests/rows.test.js @@ -1,6 +1,6 @@ const test = require("node:test") const assert = require("node:assert/strict") -const { update, snapshot } = require("../plugin/core/Rows.js") +const { update, snapshot } = require("../core/Rows.js") test("stable updates keep unchanged rows and batch additions without resetting the model", () => { const records = [{ itemId: "a", title: "A" }, { itemId: "b", title: "B" }], calls = [] @@ -25,7 +25,7 @@ test("stable updates keep unchanged rows and batch additions without resetting t test("a failed search removes retained rows before they can be clicked", () => { const fs = require("node:fs"), path = require("node:path"), vm = require("node:vm") - const source = fs.readFileSync(path.join(__dirname, "../plugin/ui/LauncherWindow.qml"), "utf8") + const source = fs.readFileSync(path.join(__dirname, "../ui/LauncherWindow.qml"), "utf8") const start = source.indexOf(" function applySearch(") const body = source.slice(source.indexOf("{", start) + 1, source.indexOf("\n }", start)) const records = [{ itemId: "old-result" }] diff --git a/tests/rpc.test.js b/tests/rpc.test.js index c948b5d..38f76f5 100644 --- a/tests/rpc.test.js +++ b/tests/rpc.test.js @@ -1,6 +1,6 @@ const test = require("node:test") const assert = require("node:assert/strict") -const Rpc = require("../plugin/core/Rpc.js") +const Rpc = require("../core/Rpc.js") function registryWithSystem() { const reg = Rpc.createRegistry() diff --git a/tests/search-integration.test.js b/tests/search-integration.test.js index 594302a..8a0e887 100644 --- a/tests/search-integration.test.js +++ b/tests/search-integration.test.js @@ -4,11 +4,11 @@ const fs = require("node:fs") const path = require("node:path") const { spawn } = require("node:child_process") const readline = require("node:readline") -const R = require("../plugin/core/Ranker.js") -const F = require("../plugin/core/FleaSearch.js") -const Root = require("../plugin/core/RootSearch.js") -const Frecency = require("../plugin/core/Frecency.js") -const binary = path.join(__dirname, "../plugin/bin/oma-cast-search") +const R = require("../core/Ranker.js") +const F = require("../core/FleaSearch.js") +const Root = require("../core/RootSearch.js") +const Frecency = require("../core/Frecency.js") +const binary = path.join(__dirname, "../bin/omacast-search") test("built helper feeds the actual root ranker and sections", { skip: !fs.existsSync(binary), timeout: 10000 }, async t => { const child = spawn(binary, [], { stdio: ["pipe", "pipe", "inherit"] }) diff --git a/tests/smoke.sh b/tests/smoke.sh index 166cbf2..310c0fb 100755 --- a/tests/smoke.sh +++ b/tests/smoke.sh @@ -2,7 +2,7 @@ set -uo pipefail cd "$(dirname "$0")/.." || exit 1 -cli=bin/oma-cast +cli=bin/omacast fail=0 pass() { printf ' ok %s\n' "$1"; } bad() { printf ' FAIL %s\n' "$1"; fail=1; } @@ -28,7 +28,7 @@ echo "toggle latency (show -> layer mapped, hide -> unmapped; budget 100 ms)" sock="$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock" events=$(mktemp) socat -u "UNIX-CONNECT:$sock" - 2>/dev/null | while IFS= read -r line; do - case $line in *layer\>\>oma-cast*) echo "$(date +%s%N) ${line%%>>*}" >>"$events" ;; esac + case $line in *layer\>\>omacast*) echo "$(date +%s%N) ${line%%>>*}" >>"$events" ;; esac done & watcher=$! sleep 0.3 diff --git a/plugin/ui/ActionPanel.qml b/ui/ActionPanel.qml similarity index 100% rename from plugin/ui/ActionPanel.qml rename to ui/ActionPanel.qml diff --git a/plugin/ui/Alert.qml b/ui/Alert.qml similarity index 100% rename from plugin/ui/Alert.qml rename to ui/Alert.qml diff --git a/plugin/ui/InfoPanel.qml b/ui/InfoPanel.qml similarity index 100% rename from plugin/ui/InfoPanel.qml rename to ui/InfoPanel.qml diff --git a/plugin/ui/KeyHint.qml b/ui/KeyHint.qml similarity index 100% rename from plugin/ui/KeyHint.qml rename to ui/KeyHint.qml diff --git a/plugin/ui/LauncherWindow.qml b/ui/LauncherWindow.qml similarity index 99% rename from plugin/ui/LauncherWindow.qml rename to ui/LauncherWindow.qml index 4ccd2cf..bbf043d 100644 --- a/plugin/ui/LauncherWindow.qml +++ b/ui/LauncherWindow.qml @@ -38,7 +38,7 @@ PanelWindow { anchors { top: true; bottom: true; left: true; right: true } color: "transparent" exclusionMode: ExclusionMode.Ignore - WlrLayershell.namespace: "oma-cast" + WlrLayershell.namespace: "omacast" WlrLayershell.layer: WlrLayer.Overlay WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive @@ -59,7 +59,7 @@ PanelWindow { }) readonly property var borderSpec: Border.surfaceSpec("menu", "border", Commons.Color.menu.border, Math.max(1, Style.space(2))) - property var stack: [{ kind: "root", title: "oma-cast", query: "" }] + property var stack: [{ kind: "root", title: "omacast", query: "" }] readonly property var view: window.stack[window.stack.length - 1] property string query: "" property int selectedIndex: -1 @@ -148,7 +148,7 @@ PanelWindow { } function popToRoot() { - window.stack = [{ kind: "root", title: "oma-cast", query: "" }] + window.stack = [{ kind: "root", title: "omacast", query: "" }] window.query = "" window.rootFilter = "all" window.rebuild(true) diff --git a/plugin/ui/ResultRow.qml b/ui/ResultRow.qml similarity index 100% rename from plugin/ui/ResultRow.qml rename to ui/ResultRow.qml From 9ebe4c9062e06cec99946ed1ed890b27d9e2c048 Mon Sep 17 00:00:00 2001 From: chris power Date: Mon, 2 Nov 2026 18:02:16 -0500 Subject: [PATCH 13/15] Add marketplace preview image Co-Authored-By: Claude Opus 5.5 --- preview.png | Bin 0 -> 713958 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 preview.png diff --git a/preview.png b/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..116c36a7f8a7f84fefc678b5e0919bb032fea7a7 GIT binary patch literal 713958 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

GJpc@WO!lQ#a^4HF?3;GX& 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ⅅV2jpCW^<%9iuWbT_cO^4 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%0Atms2!7n}L2ppq4@d0Jv;)k=_{iG$Eg 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≪BV?_S&Jux1N}Fs55`}vII5M(Vd5eOo42_F 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℘-EppHv=;>d?qUJc3EiFeptP{pmC&E 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

o_1j`MxvdX8FCN8OL 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ƍq+;9TAODWwqb$&4b&6Y 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 Date: Mon, 2 Nov 2026 18:38:50 -0500 Subject: [PATCH 14/15] Keep histories and typed text private for the marketplace review - Create omacast's dirs 0700 and store files 0600 before the first write, and tighten readable ones from older builds (never broadening a mode). - Keep a private oma-cast.lua's mode when setup hyprland migrates it. - Send clipboard text to wl-copy on stdin; paste with Shift+Insert, so no calculator or toast text reaches any process's argv. - Remove the Ask default agent hand-off: omarchy-agent passes the prompt to every agent CLI as an argument, with no private transport. - Replace the AGENTS.md symlink with a plain file; the validator rejects symlinks inside a plugin. - Add tests/privacy.test.js covering all of the above under umask 022. Co-Authored-By: Claude Opus 5.5 --- AGENTS.md | 6 +- Backend.qml | 41 +++++----- CLAUDE.md | 9 ++- Launcher.qml | 10 --- README.md | 33 +++----- SPEC.md | 40 ++++------ bin/omacast | 5 +- core/Agent.js | 24 ------ core/Paths.js | 41 +++++++++- core/RootSearch.js | 3 +- services/AgentLauncher.qml | 59 -------------- services/ClipboardWriter.qml | 45 +++++++++++ tests/agent-lifecycle.test.js | 145 ---------------------------------- tests/agent.test.js | 63 --------------- tests/calculator.test.js | 2 +- tests/privacy.test.js | 141 +++++++++++++++++++++++++++++++++ tests/rootsearch.test.js | 13 +-- ui/LauncherWindow.qml | 12 +-- 18 files changed, 286 insertions(+), 406 deletions(-) mode change 120000 => 100644 AGENTS.md delete mode 100644 core/Agent.js delete mode 100644 services/AgentLauncher.qml create mode 100644 services/ClipboardWriter.qml delete mode 100644 tests/agent-lifecycle.test.js delete mode 100644 tests/agent.test.js create mode 100644 tests/privacy.test.js diff --git a/AGENTS.md b/AGENTS.md deleted file mode 120000 index 681311e..0000000 --- a/AGENTS.md +++ /dev/null @@ -1 +0,0 @@ -CLAUDE.md \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..5c256b9 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,5 @@ +# AGENTS.md + +Project instructions for coding agents live in [CLAUDE.md](CLAUDE.md). Read it first. + +(This is a plain file, not a symlink: `omarchy plugin validate` rejects symlinks inside a plugin.) diff --git a/Backend.qml b/Backend.qml index 5fe1099..8895670 100644 --- a/Backend.qml +++ b/Backend.qml @@ -11,7 +11,6 @@ import "core/FleaSearch.js" as FleaSearch import "core/Frecency.js" as Frecency import "core/OmarchyMenu.js" as OmarchyMenu import "core/RootSearch.js" as RootSearch -import "core/Agent.js" as Agent import "core/Calculator.js" as Calculator import "services" @@ -36,7 +35,7 @@ Item { property var candidates: [] property var candidatesById: ({}) property int candidatesRevision: 0 - readonly property bool loading: menuSource.loading || agentLauncher.checking || nativeSearch.pending !== null + readonly property bool loading: menuSource.loading || nativeSearch.pending !== null // Bumped when exchange rates or zone offsets arrive, so an open // calculator row re-evaluates. readonly property int calculatorRevision: (calculatorData.rates ? 1 : 0) + calculatorData.ratesFetchedAt + calculatorData.zonesAt @@ -171,16 +170,16 @@ Item { case "open": case "copy-answer": if (!historyId) backend.saveCalculation(entry) - Util.execArgv(["wl-copy", "--", entry.copy]) + clipboard.copy(entry.copy) return { close: true, hud: "Copied to Clipboard" } case "paste-answer": if (!historyId) backend.saveCalculation(entry) - // Omarchy's own paste: copies, waits for our window to unmap, types. - Util.execArgv(["omarchy-clipboard-paste-text", entry.copy]) + // Copies, waits for our window to unmap, then pastes. + clipboard.paste(entry.copy) return { close: true } case "copy-question-answer": if (!historyId) backend.saveCalculation(entry) - Util.execArgv(["wl-copy", "--", entry.query + " = " + entry.result]) + clipboard.copy(entry.query + " = " + entry.result) return { close: true, hud: "Copied to Clipboard" } case "open-history": return { push: { kind: "calculator-history", title: "Calculator History" } } @@ -313,7 +312,7 @@ Item { return { close: true } case "copy-command": case "copy-id": - Util.execArgv(["wl-copy", "--", action === "copy-id" ? candidate.appId + ".desktop" : candidate.action]) + clipboard.copy(action === "copy-id" ? candidate.appId + ".desktop" : candidate.action) return { close: true, hud: "Copied to Clipboard" } case "favorite-add": case "favorite-remove": @@ -478,10 +477,6 @@ Item { } var fallback = RootSearch.FALLBACKS.filter(function(f) { return f.id === (data && data.id) })[0] if (fallback) { - if (fallback.id === Agent.FALLBACK_ID) { - agentLauncher.start(data.query) - return { pending: true } - } Util.execArgv(["omarchy-launch-browser", RootSearch.fallbackUrl(fallback, data.query)]) return { close: true } } @@ -559,7 +554,14 @@ Item { menuSource.refresh() calculatorData.refresh() } - if (method === "window.visibilityChanged" && data && !data.visible) agentLauncher.cancel() + } + + // Clipboard text goes over stdin, never argv (other users can read argv). + function copyText(text) { clipboard.copy(text) } + + ClipboardWriter { + id: clipboard + onFailed: function(message) { backend.log("error", "clipboard", message, null) } } AppFocuser { @@ -567,20 +569,13 @@ Item { onLaunchRequested: function(candidate) { backend.launchApp(candidate) } } - AgentLauncher { - id: agentLauncher - onPrepared: function(argv) { backend.emit("agent.launchReady", { argv: argv }) } - onFailed: function(message) { backend.emit("agent.launchFailed", { message: message }) } - } - Process { id: mkdirs - // Move each directory left under the old name first, unless the new one already exists. - command: ["bash", "-c", - 'while [[ $1 != -- ]]; do [[ -d $1 && ! -e $2 ]] && mv -T -- "$1" "$2"; shift 2; done; shift; exec mkdir -p -- "$@"', - "omacast-mkdirs"] - .concat([].concat.apply([], Paths.legacyMoves(backend.paths)), ["--"], Paths.directoriesToCreate(backend.paths)) + // Moves directories left under the old name, then creates everything + // owner-only and repairs modes left readable by older builds. + command: Paths.setupArgv(backend.paths, [Schema.documents.settings.file, Schema.documents.frecency.file, Schema.documents.calculator.file] + .map(function(file) { return backend.paths.db + "/" + file })) onExited: function(exitCode) { if (exitCode !== 0) backend.log("error", "paths", "could not create data directories", { exitCode: exitCode }) backend.directoriesReady = true diff --git a/CLAUDE.md b/CLAUDE.md index 4ed16cd..b9d6019 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -22,8 +22,9 @@ Spec legend: **[O]** observed in Raycast, **[I]** inferred, **[D]** design decis 1. **Clean room.** Never copy, bundle or redistribute anything from `Raycast.app` (JS, icons, fonts, `.node` modules). Allowed: the public npm `@raycast/api` / `@raycast/utils` packages (check the license of the pinned version) and the MIT `raycast/extensions` repo. 2. **Never call `*.raycast.com`.** No store, account, sync, telemetry or currency APIs. Build extensions from a local `raycast/extensions` clone. 3. **No telemetry.** No Sentry, no PostHog. -4. **No embedded AI features.** The fork's user-authorized exception is an explicit hand-off of root-search text to Omarchy's existing default-agent terminal launcher (SPEC §2.0). No model API, credential handling or automatic submission while typing. Other built-ins remain non-AI. +4. **No embedded AI features.** No model API or credential handling. (The default-agent hand-off was removed on 2026-11-02; see SPEC §2.0.) 5. **Port the root-search ranker exactly** from `reference/02-backend.md §4.2–4.5`. Do not substitute fzf, nucleo or fuse.js. The user-authorized flea-search matcher in SPEC §2.0 is the matching exception; personalization still uses this ranker. +6. **No user text in argv; private files stay private.** Queries, calculator text and anything else the user typed go to other processes on stdin (`services/ClipboardWriter.qml`), never as arguments. omacast dirs are `0700` and store files `0600` (SPEC §2.0 "Privacy"). The marketplace review enforces this. ## How to work @@ -147,11 +148,11 @@ Works: config.json sets `remToPxRate` (16), `workHoursPerDay` (8) and `clockFormat` (`auto` follows the Qt locale, or `12h` / `24h`). - ↵ copies the answer (HUD), Ctrl+↵ pastes it through `omarchy-clipboard-paste-text`, Ctrl+Shift+C copies "question = answer". Each one saves to **Calculator History** (`db/calculator.json`, 4096 rows / 90 days): a built-in command and pushed view, searchable, Ctrl+D deletes an entry, Ctrl+Shift+D deletes all. RPC: `calculator.calculate|historyGetAll|historyDelete|historyDeleteAll|refreshCurrencies|getCurrencies`. A bare number, word or quantity (`42`, `firefox`, `5 kg`) never produces a row, because the section takes ↵. + ↵ copies the answer (HUD), Ctrl+↵ pastes it (wl-copy on stdin, then Shift+Insert), Ctrl+Shift+C copies "question = answer". Each one saves to **Calculator History** (`db/calculator.json`, 4096 rows / 90 days): a built-in command and pushed view, searchable, Ctrl+D deletes an entry, Ctrl+Shift+D deletes all. RPC: `calculator.calculate|historyGetAll|historyDelete|historyDeleteAll|refreshCurrencies|getCurrencies`. A bare number, word or quantity (`42`, `firefox`, `5 kg`) never produces a row, because the section takes ↵. - **Latency:** show → mapped in 59–66 ms, hide in 24–42 ms on Omarchy 4.0.6 (`tests/smoke.sh`; it was 37–44 ms on the old `OverlayWindow`). -- **Tests:** root search, calculator and default-agent hand-off coverage (`node --test tests/*.test.js`). +- **Tests:** root search, calculator and privacy coverage (`node --test tests/*.test.js`). -**Default-agent hand-off (fork, 2026-10-20):** user-authorized addition outside the original phase plan. The root fallback "Ask default agent" and Ctrl+Alt+Enter pass the query to `omarchy-agent --prompt` as a literal argv element. `AgentLauncher.qml` checks the configured agent/terminal with a bounded, question-free preflight, prevents overlapping submissions and cancels on hide/unload. `Launcher.qml` dismisses the overlay before launching through `Util.execArgv`. Errors leave the query visible. There are no new dependencies, model APIs, credentials or question-history writes. Existing CLI approval behaviour is inherited. Portable checks do not establish live terminal focus, authentication, or provider compatibility; verify those on Omarchy. +**Default-agent hand-off:** removed 2026-11-02 after the marketplace review; it exposed the question in process arguments (SPEC §2.0). Stubbed / not yet: - No settings window, so you can't re-enable a disabled command except with Undo on the toast (Ctrl+T) or by editing `~/.local/share/omacast/db/settings.json` (delete its `enabled: false`). That's Phase 2. diff --git a/Launcher.qml b/Launcher.qml index 2cf7bb5..f14679f 100644 --- a/Launcher.qml +++ b/Launcher.qml @@ -77,16 +77,6 @@ Item { summon: function(id, payload) { return root.shell ? root.shell.summon(id, payload) : false } } - Connections { - target: backend - function onNotification(method, data) { - if (method !== "agent.launchReady") return - root.hide() - launcher.popToRoot() - Util.execArgv(data.argv) - } - } - LauncherWindow { id: launcher shown: root.opened diff --git a/README.md b/README.md index 5f1eeff..5900ced 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ It learns what you use, searches your apps and every Omarchy action, and looks l Omarchy's built-in menu is great at what it does. omacast adds what Raycast users miss on Linux: * **Learns your habits.** Results are ranked with a port of Raycast's root-search algorithm, plus frecency and learned search terms. The things you actually use float to the top, and if you type `ff` and pick Firefox, `ff` keeps meaning Firefox. -* **One search for everything.** Your apps, all ~400 Omarchy menu actions (with breadcrumbs and live ✓ state), web-search fallbacks, and an explicit hand-off to your default coding agent. +* **One search for everything.** Your apps, all ~400 Omarchy menu actions (with breadcrumbs and live ✓ state), and web-search fallbacks. * **Your shortcuts.** Give anything an alias, pin favorites, and hide the commands you never touch. * **Keyboard-first.** A Ctrl+K action panel, Ctrl+1–9 quick picks, search history on ↑, section jumping, and emacs-style navigation. * **Native to Omarchy.** It runs inside `omarchy-shell` as a plugin, with no Electron, no Node and no extra daemons. It opens in about 40 ms and follows your theme live when you run `omarchy theme set`. @@ -98,7 +98,14 @@ It adds no packages and no background services. Rust. Aliases, favorites, learned terms and frecency stay in omacast's ranker either way. If the helper fails or times out, search falls back to the built-in matcher until the plugin reloads. Rebuild it after `omarchy plugin update`. -- **Default agent.** The optional "Ask default agent" action runs Omarchy's own `omarchy-agent` (below). + +### Privacy + +Your search history, learned search terms and calculator history stay on your machine, in owner-only +files: omacast creates its `~/.config`, `~/.local/share`, `~/.cache` and `~/.local/state` directories as +`0700` and its database files as `0600`, and tightens any it finds readable by other users. Text you copy +or paste from the calculator goes to `wl-copy` on stdin, never on a command line, so other local users +can't read it from the process list. Paste sends Shift+Insert after copying, as Omarchy's clipboard history does. ### Upgrading from oma-cast @@ -107,27 +114,6 @@ cache and state directories to the `omacast` names. In a development checkout, ` the old plugin link and `~/.local/bin/oma-cast`, and `omacast setup hyprland` moves `oma-cast.lua` to `omacast.lua`, keeping your key. `omacast doctor` reports anything left over. -## Ask your default agent - -Type a question, select **Ask default agent** under the web-search fallbacks, -and press Enter. **Ctrl+Alt+Enter** sends the current root-search text directly. -This opens a new session with your question in Omarchy's configured default -agent and terminal (Foot, Ghostty, Kitty or Alacritty). - -The action checks your setup first. Missing agent/terminal setup leaves the -launcher open with your question and an error. Closing the launcher during the -check cancels the pending hand-off. Normal app search and Enter selection keep -working as before; typing alone never submits a question. - -Requires an Omarchy version with `omarchy-agent-prompt` and -`omarchy-agent --prompt` (verified against `quattro` revision `3ac4365`). Select -your defaults in Omarchy Settings. Agent authentication, accounts, approval -behaviour, session working directory and terminal selection remain owned by -Omarchy and the agent CLI. omacast does not store the question in search history, -read credentials, or make model API calls. Successful preflight checks establish -launch prerequisites, not successful sign-in or a running terminal; those still -need live desktop validation. - ## Keyboard | Key | Does | @@ -136,7 +122,6 @@ need live desktop validation. | `Shift+↵` | Open a new window of an app (`↵` switches to the one already open) | | `Ctrl+K` | Open the action panel | | `Super+V` / `Ctrl+V` / `Ctrl+Shift+V` / `Shift+Insert` | Paste text into the query (also accepts clipboard-history selections) | -| `Ctrl+Alt+↵` | Ask the default agent using the current root-search text | | `Ctrl+1`…`9` | Pick a result | | `↑` on an empty search | Search history | | `Ctrl+↑` / `Ctrl+↓` | Jump between sections | diff --git a/SPEC.md b/SPEC.md index 2169780..4e3a823 100644 --- a/SPEC.md +++ b/SPEC.md @@ -2,7 +2,7 @@ **Source:** static reverse engineering of Raycast **2.8.2** (`com.raycast.macos`, macOS 26, arm64) installed on this machine, done 2026-10-19. **Target:** a clean-room, feature-equivalent launcher for **Arch Linux**, Wayland first (Hyprland → KDE → GNOME), with an X11 fallback. -**Scope:** all Raycast features **except AI** (AI Chat, Quick AI, AI Commands, MCP, Screen Awareness, Browser-context-for-AI, "Ask X" commands, Dictate-to-AI, Remote). This fork adds a user-authorized explicit hand-off to Omarchy's default agent in its default terminal (§2.0); it does not implement those Raycast AI features. +**Scope:** all Raycast features **except AI** (AI Chat, Quick AI, AI Commands, MCP, Screen Awareness, Browser-context-for-AI, "Ask X" commands, Dictate-to-AI, Remote). This file is the plan. Claude Code should read it first. The `reference/` folder holds the detailed evidence (verbatim schemas, method lists, wire formats), and this spec points into it by section. @@ -25,7 +25,7 @@ Legend: **[O]** = observed in the shipped binaries or JS. **[I]** = inferred. ** 1. **Clean room.** Do not copy, bundle or redistribute anything from `/Applications/Raycast.app`: no frontend JS, `index.mjs`, `@raycast/api/index.js` from the app bundle, icons, PNGs, fonts or `.node` modules. They are proprietary. This spec describes *behaviour and interfaces* so you can write your own implementation. The open-source pieces you can use are the public npm package `@raycast/api` (type definitions and the `ray` CLI; check its license for the version you pin), `@raycast/utils`, and the `raycast/extensions` GitHub repo (MIT), which is the corpus you test compatibility against. 2. **Don't call Raycast's servers.** Store, account, sync, currency rates, translation and telemetry all go to `*.raycast.com`. A third-party client must not use them. Get extensions from the `raycast/extensions` repo and build them locally (§9.8). Use your own or public data sources for everything else. 3. **No telemetry.** Drop Sentry and PostHog completely. -4. **Embedded AI is out of scope.** The explicit default-agent terminal hand-off in §2.0 is the fork's authorized exception. Where another built-in mixes AI with non-AI behaviour (Dictation, Translator), build only the non-AI path and leave a `// AI: not implemented` seam. +4. **Embedded AI is out of scope.** Where another built-in mixes AI with non-AI behaviour (Dictation, Translator), build only the non-AI path and leave a `// AI: not implemented` seam. 5. **Prior art to study, not copy:** Vicinae (an open-source Linux launcher with Raycast-extension compatibility; check its current state), Espanso (text expansion via evdev/uinput), cliphist/clipse (Wayland clipboard history), plocate/fsearch (file index), Ulauncher/Walker/Anyrun (launcher UX on Wayland). --- @@ -108,29 +108,19 @@ How the rest of this spec maps onto it: - **§10 frontend.** QML instead of React, with themes from Omarchy's tokens. The 8 Raycast themes (§10.4) become optional palettes over the same tokens. - **Logging** goes to the shell's log (`qs log -n -p "$OMARCHY_PATH/shell"`, lines prefixed `[omacast]`), with the level from `config.json`. There are no separate log files. -**Default-agent hand-off [D, fork, 2026-10-20].** Non-empty root queries add an -"Ask default agent" row after the web-search fallbacks. Selecting it or pressing -Ctrl+Alt+Enter explicitly submits the current query to `omarchy-agent --prompt` -as one literal argument. Omarchy owns agent/account choice, authentication, -approval flags, working directory and terminal selection via `omarchy-launch-tui` -and `xdg-terminal-exec`. No agent SDK, network endpoint, credentials or new -package is introduced. Reference: Omarchy `quattro` `3ac43659dcbf88e84d951e3ce979b48a60a7d1f2`, -`shell/plugins/agents/Panel.qml` (`startPrompt`) and `bin/omarchy-agent{,-prompt}`. - -`services/AgentLauncher.qml` owns one bounded preflight at a time; core argv -validation and the fixed check script live in `core/Agent.js`. Missing tooling, -unset/uninstalled agent or unavailable terminal reports a visible error without -clearing the query. Hide, timeout or plugin unload cancels the pending request. -On success the entry point closes the overlay, clears the query and forwards -argv using `Util.execArgv`. This checks prerequisites only: authentication and -terminal startup failures remain the existing launcher's responsibility. - -Accept: normal app ranking/Enter selection is unchanged; fallback and shortcut -launch a fresh default-agent session in the selected terminal; quotes, Unicode, -multiline text, shell metacharacters and leading dashes arrive literally; blank -queries never submit; missing setup and cancellation never launch. Portable -fixtures cover argv/preflight and lifecycle; live Omarchy focus, terminal and -account acceptance remains required. Embedded chat and model calls are deferred. +**Default-agent hand-off: removed 2026-11-02 [D].** It passed the question to +`omarchy-agent --prompt`, which hands it to every agent CLI as an argument, so other +local users could read it from `/proc`. The marketplace review blocked that, and +Omarchy has no private prompt transport, so the row, Ctrl+Alt+Enter, +`core/Agent.js` and `services/AgentLauncher.qml` are gone. Revisit if +`omarchy-agent` gains a stdin or file prompt. + +**Privacy [D, 2026-11-02].** No user text (queries, calculator questions or +answers, prompts) may reach any process's argv: clipboard writes go through +`services/ClipboardWriter.qml` on stdin. Startup (`Paths.SETUP_SCRIPT`) creates +the base dirs `0700` and store files `0600` before the first atomic write, and +repairs readable ones with `chmod go-rwx` (never broadening). Covered by +`tests/privacy.test.js` under `umask 022`. The original Tauri design follows, kept for reference and for non-Omarchy targets. diff --git a/bin/omacast b/bin/omacast index 8210a48..f6ab97e 100755 --- a/bin/omacast +++ b/bin/omacast @@ -250,7 +250,10 @@ cmd_setup_hyprland() { confirm "Make these changes?" "$assume_yes" || die "nothing changed" if [[ ! -f $file && -f $legacy ]]; then - sed 's/oma-cast/omacast/g; s/rerunning setup overwrites it/rerunning setup keeps it/' "$legacy" >"$file" && rm "$legacy" && echo "moved $legacy to $file" + # cp -p keeps the old file's mode (it may be private); sed -i keeps it too. + cp -p -- "$legacy" "$file" && + sed -i 's/oma-cast/omacast/g; s/rerunning setup overwrites it/rerunning setup keeps it/' "$file" && + rm -- "$legacy" && echo "moved $legacy to $file" elif [[ ! -f $file ]]; then cat >"$file" <<'LUA' -- Written by `omacast setup hyprland`. Safe to edit; rerunning setup keeps it. diff --git a/core/Agent.js b/core/Agent.js deleted file mode 100644 index 2e53237..0000000 --- a/core/Agent.js +++ /dev/null @@ -1,24 +0,0 @@ -var FALLBACK_ID = "fallback:agent" - -function launchArgv(query) { - var prompt = String(query === undefined || query === null ? "" : query) - if (!prompt.trim()) throw new Error("Type a question first") - if (prompt.indexOf("\u0000") >= 0) throw new Error("Questions cannot contain a NUL character") - if (prompt.length > 16384) throw new Error("Keep the question under 16,385 characters") - return ["omarchy-agent", "--prompt", prompt] -} - -var CHECK_SCRIPT = [ - 'for tool in omarchy-agent omarchy-agent-prompt omarchy-default-agent omarchy-launch-tui xdg-terminal-exec uwsm-app; do', - ' command -v "$tool" >/dev/null 2>&1 || { printf "Agent launch unavailable: missing %s. Update Omarchy.\\n" "$tool"; exit 1; }', - 'done', - 'agent=$(omarchy-default-agent) || { printf "Could not read the default agent\\n"; exit 1; }', - '[[ -n $agent ]] || { printf "Choose a default agent in Omarchy Settings first\\n"; exit 1; }', - 'command -v "$agent" >/dev/null 2>&1 || { printf "Your default agent is not installed\\n"; exit 1; }', - 'terminal=$(xdg-terminal-exec --print-id 2>/dev/null) || { printf "Choose an installed default terminal in Omarchy Settings\\n"; exit 1; }', - '[[ -n $terminal ]] || { printf "Choose an installed default terminal in Omarchy Settings\\n"; exit 1; }' -].join("\n") - -if (typeof module !== "undefined") { - module.exports = { FALLBACK_ID: FALLBACK_ID, launchArgv: launchArgv, CHECK_SCRIPT: CHECK_SCRIPT } -} diff --git a/core/Paths.js b/core/Paths.js index 921b624..75bcdcc 100644 --- a/core/Paths.js +++ b/core/Paths.js @@ -51,6 +51,45 @@ function directoriesToCreate(paths) { return [paths.config, paths.db, paths.cache, paths.logs, paths.backups, paths.runtime] } +// Histories and settings are private: other local users must not read them. +// Every base dir is made owner-only; config, data and state are repaired +// recursively (the cache holds only rates and a cargo build, so its 0700 root +// is enough). Store files are created 0600 before the first write, because +// atomic saves keep an existing file's mode but give a new one 0666 & umask. +function privateRoots(paths) { + return [paths.config, paths.data, paths.cache, paths.state, paths.runtime] +} + +function privateTrees(paths) { + return [paths.config, paths.data, paths.state] +} + +// argv after the script name: legacy [from, to] pairs, --, dirs to create, --, +// private roots, --, private trees, --, files to create. chmod go-rwx only +// ever removes access, so a stricter existing mode stays as it is. +var SETUP_SCRIPT = [ + 'umask 077', + 'while [[ $1 != -- ]]; do [[ -d $1 && ! -e $2 ]] && mv -T -- "$1" "$2"; shift 2; done; shift', + 'dirs=(); while [[ $1 != -- ]]; do dirs+=("$1"); shift; done; shift', + 'roots=(); while [[ $1 != -- ]]; do roots+=("$1"); shift; done; shift', + 'trees=(); while [[ $1 != -- ]]; do trees+=("$1"); shift; done; shift', + 'mkdir -p -- "${dirs[@]}" || exit', + 'status=0', + 'chmod go-rwx -- "${roots[@]}" || status=1', + 'find "${trees[@]}" -xdev ! -type l -perm /077 -exec chmod go-rwx -- {} + || status=1', + 'for file; do [[ -e $file || -L $file ]] || : >"$file" || status=1; done', + 'exit $status' +].join("\n") + +function setupArgv(paths, files) { + return ["bash", "-c", SETUP_SCRIPT, "omacast-setup"] + .concat([].concat.apply([], legacyMoves(paths)), ["--"], directoriesToCreate(paths), ["--"], + privateRoots(paths), ["--"], privateTrees(paths), ["--"], files) +} + if (typeof module !== "undefined") { - module.exports = { APP: APP, LEGACY_APP: LEGACY_APP, resolve: resolve, legacyMoves: legacyMoves, directoriesToCreate: directoriesToCreate } + module.exports = { + APP: APP, LEGACY_APP: LEGACY_APP, resolve: resolve, legacyMoves: legacyMoves, directoriesToCreate: directoriesToCreate, + privateRoots: privateRoots, privateTrees: privateTrees, SETUP_SCRIPT: SETUP_SCRIPT, setupArgv: setupArgv + } } diff --git a/core/RootSearch.js b/core/RootSearch.js index 6ad7673..b424a03 100644 --- a/core/RootSearch.js +++ b/core/RootSearch.js @@ -3,8 +3,7 @@ var SUGGESTIONS_LIMIT = 6 var FALLBACKS = [ { id: "fallback:google", title: "Search Google", icon: "", url: "https://www.google.com/search?q={query}" }, - { id: "fallback:duckduckgo", title: "Search DuckDuckGo", icon: "", url: "https://duckduckgo.com/?q={query}" }, - { id: "fallback:agent", title: "Ask default agent", icon: "󰚩", subtitle: "New terminal session · Ctrl+Alt+Enter" } + { id: "fallback:duckduckgo", title: "Search DuckDuckGo", icon: "", url: "https://duckduckgo.com/?q={query}" } ] // Web searches as root commands with an inline argument pill (ref 04 §2.2 diff --git a/services/AgentLauncher.qml b/services/AgentLauncher.qml deleted file mode 100644 index 13f780b..0000000 --- a/services/AgentLauncher.qml +++ /dev/null @@ -1,59 +0,0 @@ -import QtQuick -import Quickshell.Io -import "../core/Agent.js" as Agent - -Item { - id: service - property bool checking: false - property var pendingArgv: null - property string output: "" - signal prepared(var argv) - signal failed(string message) - - function start(query) { - var argv = Agent.launchArgv(query) - if (service.checking) throw new Error("Agent launch is already being checked") - service.pendingArgv = argv - service.output = "" - service.checking = true - timeout.restart() - check.running = true - } - - function cancel() { - service.pendingArgv = null - timeout.stop() - check.running = false - } - - Component.onDestruction: service.cancel() - - Timer { - id: timeout - interval: 5000 - onTriggered: { - service.cancel() - service.failed("Agent launch check timed out. Try again.") - } - } - - Process { - id: check - command: ["bash", "-lc", Agent.CHECK_SCRIPT] - stdout: SplitParser { - onRead: function(line) { service.output = (service.output + line + "\n").slice(0, 400) } - } - onExited: function(exitCode, exitStatus) { - timeout.stop() - var argv = service.pendingArgv - service.pendingArgv = null - service.checking = false - if (!argv) return - if (exitCode !== 0 || exitStatus !== 0) { - service.failed(service.output.trim() || "Could not check the default agent. Update Omarchy and try again.") - return - } - service.prepared(argv) - } - } -} diff --git a/services/ClipboardWriter.qml b/services/ClipboardWriter.qml new file mode 100644 index 0000000..4df6c6c --- /dev/null +++ b/services/ClipboardWriter.qml @@ -0,0 +1,45 @@ +import QtQuick +import Quickshell.Io + +// Copies (and optionally pastes) text without putting it in any process's +// argv, where other local users could read it from /proc. The text goes to +// wl-copy on stdin; the paste is Shift+Insert, the keystroke Omarchy's own +// omarchy-clipboard-paste-text sends for clipboard-history entries. +Item { + id: writer + + property var queued: null + signal failed(string message) + + function copy(text) { writer.send(String(text), false) } + function paste(text) { writer.send(String(text), true) } + + function send(text, paste) { + if (proc.running) { writer.queued = { text: text, paste: paste }; return } + proc.text = text + proc.command = ["bash", "-lc", paste ? writer.pasteScript : writer.copyScript] + proc.stdinEnabled = true + proc.running = true + } + + // Constant scripts: no caller data ever reaches the command line. + readonly property string copyScript: 'exec wl-copy' + // Wait for the launcher to unmap, as omarchy-clipboard-paste-text does. + readonly property string pasteScript: 'wl-copy || exit; sleep 0.15; wtype -M shift -k Insert -m shift 2>/dev/null || true' + + Process { + id: proc + property string text: "" + onStarted: { + write(proc.text) + proc.text = "" + proc.stdinEnabled = false + } + onExited: function(exitCode) { + if (exitCode !== 0) writer.failed("Could not copy to the clipboard") + var next = writer.queued + writer.queued = null + if (next) writer.send(next.text, next.paste) + } + } +} diff --git a/tests/agent-lifecycle.test.js b/tests/agent-lifecycle.test.js deleted file mode 100644 index e8e0e74..0000000 --- a/tests/agent-lifecycle.test.js +++ /dev/null @@ -1,145 +0,0 @@ -const test = require("node:test") -const assert = require("node:assert/strict") -const fs = require("node:fs") -const path = require("node:path") -const vm = require("node:vm") -const Agent = require("../core/Agent.js") - -const source = fs.readFileSync(path.join(__dirname, "../services/AgentLauncher.qml"), "utf8") -function body(text, signature, indentation) { - const start = text.indexOf(signature) - assert.ok(start >= 0, signature) - const open = text.indexOf("{", start) + 1 - const end = text.indexOf("\n" + " ".repeat(indentation) + "}", open) - assert.ok(end > open, signature) - return "(function() {\n" + text.slice(open, end) + "\n})()" -} - -function harness() { - const events = [] - const service = { - checking: false, pendingArgv: null, output: "", - prepared: argv => events.push({ argv }), failed: message => events.push({ message }) - } - const check = { running: false } - const timeout = { restart() {}, stop() {} } - const context = vm.createContext({ service, check, timeout, Agent }) - service.cancel = () => vm.runInContext(body(source, "function cancel()", 2), context) - return { - service, check, events, - start(query) { context.query = query; vm.runInContext(body(source, "function start(query)", 2), context) }, - exit(exitCode, exitStatus = 0) { Object.assign(context, { exitCode, exitStatus }); vm.runInContext(body(source, "onExited: function(exitCode, exitStatus)", 4), context) }, - timeout() { vm.runInContext(body(source, "onTriggered:", 4), context) } - } -} - -test("successful preflight hands off exactly once and prevents overlapping submissions", () => { - const h = harness() - h.start("First question?") - assert.throws(() => h.start("Second question?"), /already being checked/) - assert.deepEqual(h.service.pendingArgv, Agent.launchArgv("First question?")) - h.exit(0) - h.exit(0) - assert.deepEqual(h.events, [{ argv: Agent.launchArgv("First question?") }]) - assert.equal(h.service.checking, false) -}) - -test("closing during preflight suppresses stale success and allows retry after exit", () => { - const h = harness() - h.start("Do not launch") - h.service.cancel() - assert.equal(h.check.running, false) - assert.throws(() => h.start("Wait for teardown"), /already being checked/) - h.exit(0) - assert.deepEqual(h.events, []) - h.start("New question") - h.exit(0) - assert.deepEqual(h.events, [{ argv: Agent.launchArgv("New question") }]) -}) - -test("failure, crash and timeout never prepare a terminal launch", () => { - for (const [code, status] of [[1, 0], [0, 1]]) { - const h = harness() - h.start("Question") - h.service.output = "Choose a default agent first\n" - h.exit(code, status) - assert.deepEqual(h.events, [{ message: "Choose a default agent first" }]) - h.start("Retry") - } - const h = harness() - h.start("Timed out") - h.timeout() - h.exit(0) - assert.deepEqual(h.events, [{ message: "Agent launch check timed out. Try again." }]) -}) - -test("showing refreshes calculator data and hiding cancels an agent hand-off", () => { - const text = fs.readFileSync(path.join(__dirname, "../Backend.qml"), "utf8") - const events = [] - const context = vm.createContext({ - method: "window.visibilityChanged", data: { visible: true }, - menuSource: { refresh: () => events.push("menu") }, - calculatorData: { refresh: () => events.push("calculator") }, - agentLauncher: { cancel: () => events.push("cancel") } - }) - const notify = body(text, "onNotification: function(method, data)", 2) - vm.runInContext(notify, context) - assert.deepEqual(events, ["menu", "calculator"]) - context.data = { visible: false } - vm.runInContext(notify, context) - assert.deepEqual(events, ["menu", "calculator", "cancel"]) - context.data = null - vm.runInContext(notify, context) - context.method = "calculator.historyStateChanged" - context.data = { visible: true } - vm.runInContext(notify, context) - assert.equal(events.length, 3) -}) - -test("entry point dismisses and clears the launcher before starting the terminal", () => { - const text = fs.readFileSync(path.join(__dirname, "../Launcher.qml"), "utf8") - const events = [] - const argv = Agent.launchArgv("Question") - const context = vm.createContext({ - method: "agent.launchReady", data: { argv }, - root: { hide: () => events.push("hide") }, - launcher: { popToRoot: () => events.push("clear") }, - Util: { execArgv: value => events.push(value) } - }) - vm.runInContext(body(text, "function onNotification(method, data)", 4), context) - assert.deepEqual(events, ["hide", "clear", argv]) - context.method = "agent.launchFailed" - vm.runInContext(body(text, "function onNotification(method, data)", 4), context) - assert.equal(events.length, 3) -}) - -test("agent shortcut is limited to root search and preserves normal Enter actions", () => { - const text = fs.readFileSync(path.join(__dirname, "../ui/LauncherWindow.qml"), "utf8") - const events = [] - let next = 16 - const Qt = new Proxy({ ControlModifier: 1, ShiftModifier: 2, AltModifier: 4 }, { - get(target, key) { if (!(key in target)) target[key] = next++; return target[key] } - }) - const window = { - atRoot: true, actionPanelOpen: false, view: { kind: "root" }, - askAgent: () => events.push("agent"), performNth: n => events.push(n), - saveAlias: () => events.push("save-alias"), - argFocus: -1, argDefs: [], - isActionPanelKey: () => false, - direction: () => 0 - } - const context = vm.createContext({ Qt, window, event: null }) - function press(modifiers) { - context.event = { key: Qt.Key_Return, modifiers } - vm.runInContext(body(text, "function handleKey(event)", 2), context) - } - press(Qt.ControlModifier | Qt.AltModifier) - press(0) - press(Qt.ControlModifier) - window.atRoot = false - window.view.kind = "menu" - press(Qt.ControlModifier | Qt.AltModifier) - window.view.kind = "alias" - press(Qt.ControlModifier | Qt.AltModifier) - assert.deepEqual(events, ["agent", 0, 1, 1, "save-alias"]) -}) diff --git a/tests/agent.test.js b/tests/agent.test.js deleted file mode 100644 index 84dfd8f..0000000 --- a/tests/agent.test.js +++ /dev/null @@ -1,63 +0,0 @@ -const test = require("node:test") -const assert = require("node:assert/strict") -const fs = require("node:fs") -const os = require("node:os") -const path = require("node:path") -const { spawnSync } = require("node:child_process") -const Agent = require("../core/Agent.js") - -function fixture(t) { - const dir = fs.mkdtempSync(path.join(os.tmpdir(), "omacast-agent-")) - t.after(() => fs.rmSync(dir, { recursive: true, force: true })) - const script = (name, source) => fs.writeFileSync(path.join(dir, name), "#!/bin/bash\n" + source, { mode: 0o700 }) - for (const tool of ["omarchy-agent", "omarchy-agent-prompt", "omarchy-launch-tui", "uwsm-app", "codex"]) script(tool, "exit 0\n") - script("omarchy-default-agent", 'printf "%s" "${TEST_AGENT-codex}"\n') - script("xdg-terminal-exec", '[[ $1 == --print-id ]] || exit 9\nprintf "%s" "${TEST_TERMINAL-foot.desktop}"\n') - const env = { ...process.env, PATH: dir } - return { dir, env, script, check: extra => spawnSync("/bin/bash", ["-c", Agent.CHECK_SCRIPT], { env: { ...env, ...extra }, encoding: "utf8" }) } -} - -test("preflight accepts configured agents and terminal providers without starting a session", t => { - const f = fixture(t) - f.script("omarchy-agent", "exit 99\n") - for (const terminal of ["foot.desktop", "com.mitchellh.ghostty.desktop", "kitty.desktop", "Alacritty.desktop"]) { - const r = f.check({ TEST_TERMINAL: terminal }) - assert.equal(r.status, 0, r.stdout + r.stderr) - assert.equal(r.stdout, "") - } -}) - -test("preflight distinguishes missing tooling, default agent, installation and terminal", t => { - const f = fixture(t) - for (const [env, message] of [ - [{ TEST_AGENT: "" }, /Choose a default agent/], - [{ TEST_AGENT: "not-installed" }, /default agent is not installed/], - [{ TEST_TERMINAL: "" }, /default terminal/] - ]) { - const r = f.check(env) - assert.equal(r.status, 1) - assert.match(r.stdout, message) - } - fs.unlinkSync(path.join(f.dir, "omarchy-agent-prompt")) - assert.match(f.check().stdout, /missing omarchy-agent-prompt/) -}) - -test("questions remain one literal argument, including CLI flags and shell metacharacters", t => { - const f = fixture(t) - f.script("omarchy-agent", '[[ $# == 2 && $1 == --prompt ]] || exit 8\nprintf "%s" "$2"\n') - const marker = path.join(f.dir, "must-not-exist") - for (const prompt of ["--inline", "--pick", "--prompt", " Why? ", 'Quotes: "hello" and \'hi\'', "line one\nline two 🚀", `$(touch ${marker}); \`touch ${marker}\`; >${marker}`]) { - const argv = Agent.launchArgv(prompt) - const r = spawnSync("/bin/bash", ["-c", 'exec "$@"', "bash", ...argv], { env: f.env, encoding: "utf8" }) - assert.equal(r.status, 0, r.stderr) - assert.equal(r.stdout, prompt) - assert.ok(!fs.existsSync(marker)) - } -}) - -test("empty, NUL and oversized prompts fail before any process starts", () => { - for (const query of [null, undefined, "", " \n\t "]) assert.throws(() => Agent.launchArgv(query), /Type a question/) - assert.throws(() => Agent.launchArgv("a\0b"), /NUL/) - assert.throws(() => Agent.launchArgv("x".repeat(16385)), /characters/) - assert.equal(Agent.launchArgv("x".repeat(16384))[2].length, 16384) -}) diff --git a/tests/calculator.test.js b/tests/calculator.test.js index 41ce592..bde8917 100644 --- a/tests/calculator.test.js +++ b/tests/calculator.test.js @@ -170,7 +170,7 @@ test("root search puts the Calculator section first; ↵ copies, Ctrl ↵ pastes assert.equal(sections[0].id, "calculator") assert.equal(sections[0].rows[0].candidate.calcResult, "4") assert.equal(sections.at(-1).id, "fallback-commands") - assert.deepEqual(sections.at(-1).rows.map((r) => r.candidate.id), ["fallback:google", "fallback:duckduckgo", "fallback:agent"]) + assert.deepEqual(sections.at(-1).rows.map((r) => r.candidate.id), ["fallback:google", "fallback:duckduckgo"]) const actions = RS.actionsFor({ kind: "calculator" }).map((a) => a.id) assert.deepEqual(actions.slice(0, 2), ["copy-answer", "paste-answer"]) const calcHistory = RS.rootSections(RS.BUILTINS.map(RS.builtinCandidate), "calc hist", { commands: {}, frecency: {}, nowMs: NOW }, deps) diff --git a/tests/privacy.test.js b/tests/privacy.test.js new file mode 100644 index 0000000..af350cb --- /dev/null +++ b/tests/privacy.test.js @@ -0,0 +1,141 @@ +const test = require("node:test") +const assert = require("node:assert/strict") +const fs = require("node:fs") +const os = require("node:os") +const path = require("node:path") +const { spawnSync } = require("node:child_process") +const Paths = require("../core/Paths.js") + +// Marketplace review: histories must stay private under a normal umask 022, +// with every ancestor traversable, and no private text may reach any argv. +const root = path.join(__dirname, "..") +const mode = (p) => fs.statSync(p).mode & 0o777 + +function tempHome(t) { + const home = fs.mkdtempSync(path.join(os.tmpdir(), "omacast-privacy-")) + fs.chmodSync(home, 0o755) + t.after(() => fs.rmSync(home, { recursive: true, force: true })) + return home +} + +function runSetup(home) { + const p = Paths.resolve((name) => ({ HOME: home, XDG_RUNTIME_DIR: home + "/run" })[name] || "") + fs.mkdirSync(home + "/run", { mode: 0o755 }) + const files = ["settings.json", "frecency.json", "calculator.json"].map((f) => p.db + "/" + f) + const [cmd, ...args] = Paths.setupArgv(p, files) + const r = spawnSync("bash", ["-c", "umask 022; exec \"$@\"", "umask-022", cmd, ...args], { encoding: "utf8" }) + assert.equal(r.status, 0, r.stderr) + return p +} + +test("first start under umask 022 creates owner-only dirs and 0600 store files", (t) => { + const p = runSetup(tempHome(t)) + for (const dir of Paths.privateRoots(p)) assert.equal(mode(dir), 0o700, dir) + for (const dir of Paths.directoriesToCreate(p)) assert.equal(mode(dir), 0o700, dir) + for (const f of ["settings.json", "frecency.json", "calculator.json"]) assert.equal(mode(p.db + "/" + f), 0o600, f) +}) + +test("an atomic save into a pre-created file keeps it private", (t) => { + const p = runSetup(tempHome(t)) + // QSaveFile copies the target's permissions onto its temp file before the rename. + const target = p.db + "/frecency.json" + const temp = target + ".tmp" + fs.writeFileSync(temp, '{"searchHistory":["secret"]}', { mode: 0o644 }) + fs.chmodSync(temp, mode(target)) + fs.renameSync(temp, target) + assert.equal(mode(target), 0o600) +}) + +test("readable histories from older builds are repaired; stricter modes are kept", (t) => { + const home = tempHome(t) + const db = home + "/.local/share/omacast/db" + fs.mkdirSync(db, { recursive: true, mode: 0o755 }) + fs.chmodSync(home + "/.local/share/omacast", 0o755) + fs.writeFileSync(db + "/frecency.json", "{}", { mode: 0o644 }) + fs.writeFileSync(db + "/calculator.json", "{}", { mode: 0o644 }) + fs.writeFileSync(db + "/settings.json", "{}") + fs.chmodSync(db + "/frecency.json", 0o644) + fs.chmodSync(db + "/calculator.json", 0o664) + fs.chmodSync(db + "/settings.json", 0o400) + const p = runSetup(home) + assert.equal(mode(p.data), 0o700) + assert.equal(mode(p.db), 0o700) + assert.equal(mode(db + "/frecency.json"), 0o600) + assert.equal(mode(db + "/calculator.json"), 0o600) + assert.equal(mode(db + "/settings.json"), 0o400) + assert.equal(fs.readFileSync(db + "/frecency.json", "utf8"), "{}", "repair never rewrites contents") +}) + +test("legacy oma-cast data moves and comes out private", (t) => { + const home = tempHome(t) + const old = home + "/.local/share/oma-cast/db" + fs.mkdirSync(old, { recursive: true }) + fs.chmodSync(home + "/.local/share/oma-cast", 0o755) + fs.writeFileSync(old + "/calculator.json", '{"history":[]}', { mode: 0o644 }) + fs.chmodSync(old + "/calculator.json", 0o644) + const p = runSetup(home) + assert.ok(!fs.existsSync(home + "/.local/share/oma-cast")) + assert.equal(mode(p.data), 0o700) + assert.equal(mode(p.db + "/calculator.json"), 0o600) +}) + +test("setup hyprland keeps a private legacy oma-cast.lua private", (t) => { + const home = tempHome(t) + const hypr = home + "/.config/hypr" + const bin = home + "/bin" + fs.mkdirSync(hypr, { recursive: true }) + fs.mkdirSync(bin) + fs.mkdirSync(home + "/omarchy") + fs.writeFileSync(hypr + "/hyprland.lua", 'require("hypr.oma-cast")\n') + fs.writeFileSync(hypr + "/oma-cast.lua", 'o.bind("ALT + SPACE", "oma-cast launcher", hl.dsp.global("oma-cast:toggle"))\n-- token = "private"\n') + fs.chmodSync(hypr + "/oma-cast.lua", 0o600) + fs.writeFileSync(bin + "/hyprctl", "#!/bin/bash\nexit 0\n", { mode: 0o755 }) + const r = spawnSync("bash", ["-c", 'umask 022; exec "$@"', "umask-022", path.join(root, "bin/omacast"), "setup", "hyprland", "--yes"], { + env: { HOME: home, XDG_CONFIG_HOME: home + "/.config", OMARCHY_PATH: home + "/omarchy", PATH: bin + ":" + process.env.PATH }, + encoding: "utf8" + }) + assert.equal(r.status, 0, r.stdout + r.stderr) + assert.ok(!fs.existsSync(hypr + "/oma-cast.lua")) + assert.equal(mode(hypr + "/omacast.lua"), 0o600) + assert.match(fs.readFileSync(hypr + "/omacast.lua", "utf8"), /omacast:toggle/) +}) + +// The clipboard scripts run with the text on stdin. A fake wl-copy/wtype on +// PATH records each process's /proc cmdline while the text is in flight. +function clipboardScripts() { + const source = fs.readFileSync(path.join(root, "services/ClipboardWriter.qml"), "utf8") + const grab = (name) => source.match(new RegExp("property string " + name + ": '([^']*)'"))[1] + return { copy: grab("copyScript"), paste: grab("pasteScript") } +} + +for (const kind of ["copy", "paste"]) { + test(`calculator ${kind} keeps the text out of every command line`, (t) => { + const home = tempHome(t) + const log = home + "/cmdlines" + const fake = '#!/bin/bash\ntr "\\0" " " >"$LOG"; echo >>"$LOG"\n' + fs.writeFileSync(home + "/wl-copy", fake + 'cat >"$LOG.clipboard"\n', { mode: 0o755 }) + fs.writeFileSync(home + "/wtype", fake, { mode: 0o755 }) + fs.writeFileSync(home + "/sleep", "#!/bin/bash\nexit 0\n", { mode: 0o755 }) + const secret = "1234 * 5678 = 7006652 my private question" + const script = clipboardScripts()[kind] + const r = spawnSync("bash", ["-c", script], { + input: secret, encoding: "utf8", + env: { ...process.env, LOG: log, PATH: home + ":" + process.env.PATH } + }) + assert.equal(r.status, 0, r.stderr) + assert.equal(fs.readFileSync(log + ".clipboard", "utf8"), secret) + const cmdlines = fs.readFileSync(log, "utf8") + assert.ok(!cmdlines.includes("private"), cmdlines) + assert.ok(!script.includes("$"), "the script takes no arguments") + if (kind === "paste") assert.match(cmdlines, /wtype -M shift -k Insert -m shift/) + }) +} + +test("no QML hands clipboard text or prompts to a process's argv", () => { + const files = ["Backend.qml", "Launcher.qml", ...["ui", "services"].flatMap((d) => + fs.readdirSync(path.join(root, d)).filter((f) => f.endsWith(".qml")).map((f) => d + "/" + f))] + for (const file of files) { + const source = fs.readFileSync(path.join(root, file), "utf8") + assert.doesNotMatch(source, /\["wl-copy"|omarchy-clipboard-paste-text"|omarchy-agent/, file) + } +}) diff --git a/tests/rootsearch.test.js b/tests/rootsearch.test.js index 18556ba..f745aa4 100644 --- a/tests/rootsearch.test.js +++ b/tests/rootsearch.test.js @@ -51,18 +51,7 @@ test("a query always ends with the fallback section", () => { assert.equal(sections.length, 1) assert.equal(sections[0].id, "fallback-commands") assert.equal(sections[0].title, "Use “zzzz-nothing” with…") - assert.deepEqual(titles(sections[0]), ["Search Google", "Search DuckDuckGo", "Ask default agent"]) -}) - -test("agent hand-off is explicit, stays after apps/web search, and only appears at root with a query", () => { - const sections = results("firefox") - assert.equal(sections[0].rows[0].candidate.id, "app:firefox") - const row = sections.at(-1).rows.at(-1).candidate - assert.equal(row.id, "fallback:agent") - assert.match(row.subtitle, /Ctrl\+Alt\+Enter/) - assert.deepEqual(RS.actionsFor(row).map(a => a.id), ["open"]) - assert.ok(!results("").flatMap(s => s.rows).some(r => r.candidate.id === row.id)) - assert.ok(!RS.submenuSections(candidates(), "trigger", "question?", ctx(), deps).flatMap(s => s.rows).some(r => r.candidate.id === row.id)) + assert.deepEqual(titles(sections[0]), ["Search Google", "Search DuckDuckGo"]) }) test("an exact alias puts its command on top (Phase 1 accept)", () => { diff --git a/ui/LauncherWindow.qml b/ui/LauncherWindow.qml index bbf043d..618a8ad 100644 --- a/ui/LauncherWindow.qml +++ b/ui/LauncherWindow.qml @@ -4,7 +4,6 @@ import Quickshell.Wayland import qs.Commons import qs.Commons as Commons import qs.Ui -import "../core/Agent.js" as Agent import "../core/RootSearch.js" as RootSearch import "../core/Rows.js" as Rows @@ -398,7 +397,7 @@ PanelWindow { window.toastPanelOpen = false if (!action) return if (action.copy !== undefined) { - Util.execArgv(["wl-copy", "--", action.copy]) + window.backend.copyText(action.copy) window.showToast("success", "Copied to Clipboard") return } @@ -431,11 +430,6 @@ PanelWindow { return false } - function askAgent() { - var r = window.backend.callSync("rootSearch.performAction", { id: Agent.FALLBACK_ID, action: "open", query: window.query }) - if (!r.ok) window.showToast("failure", r.error) - } - function saveAlias() { var r = window.backend.callSync("settings.updateCommandSettings", { commandId: window.view.commandId, alias: window.query }) if (!r.ok) { window.showToast("failure", r.error); return } @@ -604,7 +598,6 @@ PanelWindow { if (enter) { window.saveAlias(); return true } if (key === Qt.Key_Space) return true } else { - if (window.atRoot && enter && ctrl && alt && !shift) { window.askAgent(); return true } if (ctrl && shift && key === Qt.Key_K) { window.toggleAbout(); return true } if (window.isActionPanelKey(ctrl, alt, shift, key)) { window.toggleActionPanel(); return true } if (ctrl && !shift && key === Qt.Key_P) { window.toggleDropdown(); return true } @@ -657,9 +650,6 @@ PanelWindow { Connections { target: window.backend function onCandidatesRevisionChanged() { if (window.shown && !window.actionPanelOpen && !window.alert) window.rebuild(false) } - function onNotification(method, data) { - if (method === "agent.launchFailed" && window.shown) window.showToast("failure", data.message) - } // Exchange rates or zone offsets arrived: re-evaluate a calculation on screen. function onCalculatorRevisionChanged() { if (window.shown && !window.actionPanelOpen && window.query) window.rebuild(false) } } From 743a1139215020d4a8107d931f011b4beb3fb9e5 Mon Sep 17 00:00:00 2001 From: digitalbase Date: Mon, 9 Nov 2026 08:55:27 +0100 Subject: [PATCH 15/15] Use omacast camera plugin id --- addons/camera-preview/README.md | 10 +++++----- addons/camera-preview/manifest.json | 2 +- addons/camera-preview/menu-entry.json | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/camera-preview/README.md b/addons/camera-preview/README.md index ec62c33..1375d5d 100644 --- a/addons/camera-preview/README.md +++ b/addons/camera-preview/README.md @@ -19,9 +19,9 @@ Run these commands from the omacast checkout, which must remain in place: ```sh mkdir -p ~/.config/omarchy/plugins -ln -s "$PWD/addons/camera-preview" ~/.config/omarchy/plugins/oma-cast.camera-preview +ln -s "$PWD/addons/camera-preview" ~/.config/omarchy/plugins/omacast.camera-preview omarchy-shell shell rescanPlugins -omarchy plugin enable oma-cast.camera-preview +omarchy plugin enable omacast.camera-preview ``` Merge the object in `menu-entry.json` into @@ -32,7 +32,7 @@ up menu extensions automatically. Search for **Open camera** and press Enter. To test the plugin directly: ```sh -omarchy-shell shell summon oma-cast.camera-preview '{}' +omarchy-shell shell summon omacast.camera-preview '{}' ``` ## Remove @@ -40,8 +40,8 @@ omarchy-shell shell summon oma-cast.camera-preview '{}' Remove the `camera-preview` entry from your menu extension file, then run: ```sh -omarchy plugin disable oma-cast.camera-preview -rm ~/.config/omarchy/plugins/oma-cast.camera-preview +omarchy plugin disable omacast.camera-preview +rm ~/.config/omarchy/plugins/omacast.camera-preview omarchy-shell shell rescanPlugins ``` diff --git a/addons/camera-preview/manifest.json b/addons/camera-preview/manifest.json index 0cf1ddd..33d4b9d 100644 --- a/addons/camera-preview/manifest.json +++ b/addons/camera-preview/manifest.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "id": "oma-cast.camera-preview", + "id": "omacast.camera-preview", "name": "Camera preview", "version": "0.1.0", "description": "Check your camera before a meeting, without recording or audio", diff --git a/addons/camera-preview/menu-entry.json b/addons/camera-preview/menu-entry.json index e91e9f6..e9f06a2 100644 --- a/addons/camera-preview/menu-entry.json +++ b/addons/camera-preview/menu-entry.json @@ -4,6 +4,6 @@ "label": "Open camera", "description": "Check your camera before a meeting", "aliases": ["camera", "webcam", "preview", "meeting"], - "action": "omarchy-shell shell summon oma-cast.camera-preview '{}'" + "action": "omarchy-shell shell summon omacast.camera-preview '{}'" } }