Public: anyone can read this; the crew can change it.

One palette across the forge and its apps: search and act in any app from anywhere, with each app answering for itself #11665

Closed opened this
opened this

Why. "the forge and its downstream apps should feel like one but also separate. think like elastic search. i may want to have searches or actions across apps. at espo, users use multiple apps." A person who uses five apps on a forge should press one key and find a customer in one, an order in another and a pull in a third, then act on it, without knowing which app holds it.

What.

  • A small contract each app implements (the template ships it; any app may): GET /__forge/search?q=&limit= answers results { kind, title, subtitle, url, score, updatedAt } for the signed-in person, permission already applied by the app; GET /__forge/actions?q= answers actions { id, title, hint, url | post } ("New order", "Approve expense #214"). Requests carry the person's identity the way the forge already signs requests to apps; an app never sees another app's data.
  • The forge federates. The palette sends the query to the forge's own index (repositories, issues, pulls, apps, people, settings, commands) and, in parallel, to every app the person can open; results stream in as each answers, grouped by app under its name, ranked within a group by the app's own score and across groups by recency of the person's use. A slow or failing app is skipped after a short deadline and shown as "<app> did not answer" in one quiet line; it never holds the palette.
  • Scopes. By default everything; Tab or typing an app's name narrows to it (orders: acme); inside an app, the palette opens scoped to that app with one keystroke to widen to all.
  • The same palette inside apps. The forge toolbar on an app's page opens the same component, so cmd-k is one habit everywhere; it looks like the app (its tokens) and behaves like the forge. An app with its own palette keeps it and gains an "everywhere" row.
  • Actions are first-class: recent and frequent ones first, with the keys shown; an action that needs input opens that app's own form.
  • Speed is the feature: first results under 50 ms from the forge's index, each app's group inside its deadline, nothing blocks typing. Sleeping apps are not woken by a keystroke: they answer from a small index the forge keeps from their last answers, marked stale, and are woken only if the person picks them.
  • GET /api/v1/search?q=&scope= answers the same federation for tools and agents.

Acceptance. Tests with three fake apps: results from all three arrive grouped; a 2-second app is cut off at the deadline with its line; a person without access to an app gets nothing from it and the app is never called; scoping works; a sleeping app is not woken by typing. The palette's first paint and first results meet their budgets on a fixture with 20 apps.

commented

Parked by the crew: the check stayed red through 2 automatic tries (pull #11777 closed; its branch scout/11665-one-palette-across-the-forge-and-its-app at 0e20a835cbcf keeps the work so far). Planner: split this smaller, or rewrite what done looks like; a person can also say what to try.

try 1: AGENTS.md, docs/features/palette-federation.md, src/actions/palette.ts, src/http/api.ts, src/search/federate.ts, test/palette-federation.test.ts try 2: no files changed try 3: src/search/federate.ts

commented

Parked by the crew: the check stayed red through 2 automatic tries (pull #11858 closed; its branch torque/11665-one-palette-across-the-forge-and-its-app at 26b999fc33f2 keeps the work so far).

Parked twice since a person last spoke here, so it is the planner's now. Every reason:

  1. the check stayed red through 2 automatic tries (pull #11777 closed; its branch scout/11665-one-palette-across-the-forge-and-its-app at 0e20a835cbcf keeps the work so far)
  2. the check stayed red through 2 automatic tries (pull #11858 closed; its branch torque/11665-one-palette-across-the-forge-and-its-app at 26b999fc33f2 keeps the work so far)

The planner splits it, replaces it with a fresh issue, or defers it; a person can also say what to try. Nothing starts here until then, and the board lists it.

try 1: AGENTS.md, docs/features/palette-federation.md, src/contract/openapi/routes/getApiV1Search.ts, src/http/api.ts, src/search/federate.ts, test/palette-fed… try 2: no files changed try 3: src/search/federate.ts

commented

Deferred behind the Later gate (#595) by the planner. The owner's 2026-11-12 direction says that until v1.0.0 is tagged, work not on the v1 list waits in line behind it. This ask is not on that list. Two pulls went red on it, and their branches keep the work so far. When v1 ships, re-plan it from those branches as smaller pieces.

commented

replaced by #11926. Adding the Later gate here directly was refused as a loop, so the replacement waits behind it instead. It restarts from the branches that hold the work and says why the checks went red.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs