Skip to content

feat(react): SourceOperations, RunOperationPanel, OperationDetail, SourceHeader - #311

Closed
mrzmyr wants to merge 6 commits into
UsefulSoftwareCo:mainfrom
mrzmyr:mrzmyr/source-detail-04b-operations-run
Closed

mrzmyr wants to merge 6 commits into
UsefulSoftwareCo:mainfrom
mrzmyr:mrzmyr/source-detail-04b-operations-run

Conversation

@mrzmyr

@mrzmyr mrzmyr commented Apr 18, 2026

Copy link
Copy Markdown
Contributor

Adds the remaining reusable primitives the rewritten source-detail
page and the migrated Add/Edit flows need:

  • SourceOperations — operation/tool tree with filterable sidebar.
  • RunOperationPanel — form-driven invocation panel using the new
    executeCode mutation atom.
  • OperationDetail — schema / TypeScript / run tabs for an
    operation.
  • SourceHeader — favicon + title header used across source pages.

Also exposes a new executeCode mutation atom in
packages/react/src/api/atoms.tsx so the run panel can invoke
operations without each caller wiring its own client.

Stack role

PR 04b of 12. Together with PR 04a (SourceConfig), this completes
the set of new primitives the source-detail rewrite (PR 08) relies
on. Still purely additive — no call sites migrate yet.

Changes

  • NEW packages/react/src/plugins/source-operations.tsx (199 LOC):
    OperationEntry type + tree component.
  • NEW packages/react/src/plugins/run-operation.tsx (435 LOC):
    RunOperationPanel, form generated from operation inputSchema.
  • NEW packages/react/src/components/operation-detail.tsx (99 LOC):
    combines SchemaExplorer + ExpandableCodeBlock + FilterTabs.
  • NEW packages/react/src/components/source-header.tsx (22 LOC):
    thin favicon + title wrapper for reuse across source pages.
  • packages/react/src/api/atoms.tsx: add executeCode mutation
    atom bound to the executions.execute endpoint.

All four new files reuse existing primitives (SchemaExplorer,
ExpandableCodeBlock, CardStack, FilterTabs, Tabs, SourceFavicon).

Relationship to neighbours

  • Previous (PR 04a — SourceConfig + SourceIdentity extensions):
    completes the "configure a source" UI. This PR completes the
    "operate on a source" UI.
  • Next (PR 05 — OpenAPI SDK schema/oauth2/probe-rename): SDK-side
    contract changes so the OpenAPI plugin's Add/Edit (migrated in
    PR 07c) and source-detail (PR 08) have the data they need
    (inputSchema / outputSchema on PreviewOperation; oauth2 update
    support).

mrzmyr added 6 commits April 18, 2026 10:05
Removes the `shadow-xs` class from 6 form primitive components
(Input, Textarea, Select, NativeSelect, Combobox, InputGroup). This
flattens the inputs to match the visual direction that the upcoming
source-config refactor builds on.

## Stack role

First PR in the `source-detail-refactor` stack (12 PRs total). The
overall goal is to rewrite the source-detail page against a new set
of reusable building blocks (KeyValueList, SourceConfig,
SourceOperations, RunOperationPanel). This PR is purely cosmetic and
unblocks nothing — it only lands here so the shipping PR (PR 08) isn't
reviewed simultaneously with a global style change.

## Changes
- Remove `shadow-xs` from Input, Textarea, Select, NativeSelect,
  Combobox, InputGroup className strings. 12 LOC, no behaviour change.

## Relationship to neighbours
- Previous: none (stack base).
- Next (PR 02 — lucide-react + shell icon swap): unrelated chore;
  kept separate so reviewers of either don't have to reason about
  the other.
Adds `lucide-react` as a dependency of both `@executor/cloud` and
`@executor/local`, and migrates the shell chrome to import icons
from `lucide-react` instead of the hand-maintained
`@executor/react/components/icons` module. Also folds in minor
shell-level styling tweaks that came in the same sweep
(text-xs → text-sm on source list rows, drop redundant
`transition-colors`, align CheckIcon).

PR 02 of 12 in the `source-detail-refactor` stack. Unrelated to the
refactor's load-bearing work, but splits cleanly so reviewers of
either this PR or the later ones aren't reading icon import changes
mixed with component rewrites.

- `apps/cloud/package.json` + `apps/local/package.json`: add
  `lucide-react@^1.7.0`.
- `apps/cloud/src/web/shell.tsx` + `apps/local/src/web/shell.tsx`:
  import `CheckIcon`, `ChevronDownIcon`, `MenuIcon`, `XIcon` from
  `lucide-react`; remove local icon re-exports at call sites; minor
  text-size + transition tweaks.
- `bun.lock`: regenerated for the new dep.

- Previous (PR 01 — shadow-xs drop): unrelated styling chore.
- Next (PR 03a — secret-picker/AddSecretDialog): first PR that adds
  new `packages/react` primitives. Imports `lucide-react` icons which
  this PR makes available in the apps.
…etDialog

Adds an `AddSecretDialog` component and wires the `SecretPicker`
popover to offer "+ New secret" inline. Also adds two opt-in
styling props to `SecretPicker` (`showChevron`, `invalid`) that the
upcoming `SourceConfig` primitive relies on to make the picker
visually consistent with a select/input.

PR 03a of 12. This is the first of the new shared primitives the
source-detail refactor is built on. Purely additive — existing
callers get no behaviour change because both new props default to
the old behaviour. Lets PR 03b (KeyValueList) and PR 04a
(SourceConfig) reuse inline secret creation without re-implementing
the dialog.

- NEW `packages/react/src/plugins/add-secret-dialog.tsx`: small,
  self-contained dialog that creates a secret via the
  `setSecret` mutation atom and refreshes `secretsAtom`.
- `packages/react/src/plugins/secret-picker.tsx`:
  - Add `showChevron` prop — renders a dropdown chevron affordance.
  - Add `invalid` prop — applies a destructive-ring style.
  - Add a separator + "New secret" entry in the Command popover
    that opens `AddSecretDialog`.
  - Auto-selects the newly-created secret via the dialog's onCreated
    callback.

- Previous (PR 02 — lucide-react + shell): supplies the icon package
  the new lucide imports resolve against in the apps that consume
  `@executor/react`. packages/react already had lucide-react as a
  dep, so no dep change here.
- Next (PR 03b — KeyValueList): uses the enhanced `SecretPicker`
  (with `invalid`) for rows whose value type is `secret`.
…r PRs)

Introduces a new `key-value-list` primitive: a generic list where
each row has a `key`, a `value`, and a `type` of `"text" | "secret"`.
When the row is of secret-type, the value renders as a `SecretPicker`.
Each row has a stable `id` so React's reconciliation never loses
input focus across re-orders/removes.

## Stack role

PR 03b of 12. This is the load-bearing replacement for the existing
`headers-list` + `secret-header-auth` primitives, which are still in
use on main. This PR is purely additive — the old files stay for now
and are deleted in PR 07c once every call site has migrated.

## Changes
- NEW `packages/react/src/plugins/key-value-list.tsx`:
  - `KeyValueEntry` type (stable `id`, `key`, `value`, `type`).
  - `newKeyValueEntry()` helper that mints a fresh `id` — the preferred
    constructor so callers don't forget to assign one (losing focus on
    re-render otherwise).
  - `KeyValueList` component: renders an `Input` for `key`, a
    `NativeSelect` for `type`, and either an `Input` (text) or
    `SecretPicker` (secret) for `value`.
  - Empty-state prop, customisable placeholders.

## Relationship to neighbours
- Previous (PR 03a — SecretPicker/AddSecretDialog): provides the
  enhanced picker used by `type === "secret"` rows.
- Next (PR 04a — SourceConfig): the SourceConfig component consumes
  `KeyValueList` / `KeyValueEntry` for its "Headers" and
  "Query params" sections.
Adds the `SourceConfig` component — the central source-authoring
surface used by every Add/Edit flow — and extends
`SourceIdentityFields` / `useSourceIdentity` with the props needed
to support it (endpoint row, hints, custom labels, prepend slot).

## Stack role

PR 04a of 12. Purely additive: no call sites migrate to it yet.
PRs 07a/07b/07c wire Add/Edit flows in the graphql, mcp, and
openapi plugins onto this primitive; PR 08 uses it in the
source-detail page's edit card.

## Changes
- NEW `packages/react/src/plugins/source-config.tsx`: builds on
  `KeyValueList` + `SecretPicker` to render Name/Namespace/Endpoint
  +  Auth (none/basic/apikey/bearer/oauth) + Headers + Query params
  in a single `CardStack`. Exposes the `AuthMode` union type.
- `packages/react/src/plugins/source-identity.tsx`:
  - `useSourceIdentity`: add `userProvidedName` /
    `userProvidedNamespace` booleans so callers know whether the
    current value is user-entered (avoids clobbering user intent
    when a fallback later becomes available).
  - `SourceIdentityFields`: add `endpoint` / `onEndpointChange` /
    `endpointLabel` / `endpointPlaceholder` / `endpointHints` /
    `endpointLabelAction` / `endpointExtra` / `prepend` props so the
    component can render the endpoint row and plugin-specific rows
    without the caller stitching its own CardStack.
  - Default name label changed from "Display Name" → "Name".

## Relationship to neighbours
- Previous (PR 03b — KeyValueList): SourceConfig consumes
  `KeyValueList` + `KeyValueEntry` for Headers and Query params.
- Next (PR 04b — SourceOperations / RunOperationPanel /
  OperationDetail / SourceHeader): the remaining building blocks
  that combine with SourceConfig to power the rewritten source
  detail page in PR 08.
…urceHeader

Adds the remaining reusable primitives the rewritten source-detail
page and the migrated Add/Edit flows need:

- `SourceOperations` — operation/tool tree with filterable sidebar.
- `RunOperationPanel` — form-driven invocation panel using the new
  `executeCode` mutation atom.
- `OperationDetail` — schema / TypeScript / run tabs for an
  operation.
- `SourceHeader` — favicon + title header used across source pages.

Also exposes a new `executeCode` mutation atom in
`packages/react/src/api/atoms.tsx` so the run panel can invoke
operations without each caller wiring its own client.

## Stack role

PR 04b of 12. Together with PR 04a (SourceConfig), this completes
the set of new primitives the source-detail rewrite (PR 08) relies
on. Still purely additive — no call sites migrate yet.

## Changes
- NEW `packages/react/src/plugins/source-operations.tsx` (199 LOC):
  `OperationEntry` type + tree component.
- NEW `packages/react/src/plugins/run-operation.tsx` (435 LOC):
  `RunOperationPanel`, form generated from operation inputSchema.
- NEW `packages/react/src/components/operation-detail.tsx` (99 LOC):
  combines `SchemaExplorer` + `ExpandableCodeBlock` + `FilterTabs`.
- NEW `packages/react/src/components/source-header.tsx` (22 LOC):
  thin favicon + title wrapper for reuse across source pages.
- `packages/react/src/api/atoms.tsx`: add `executeCode` mutation
  atom bound to the executions.execute endpoint.

All four new files reuse existing primitives (SchemaExplorer,
ExpandableCodeBlock, CardStack, FilterTabs, Tabs, SourceFavicon).

## Relationship to neighbours
- Previous (PR 04a — SourceConfig + SourceIdentity extensions):
  completes the "configure a source" UI. This PR completes the
  "operate on a source" UI.
- Next (PR 05 — OpenAPI SDK schema/oauth2/probe-rename): SDK-side
  contract changes so the OpenAPI plugin's Add/Edit (migrated in
  PR 07c) and source-detail (PR 08) have the data they need
  (inputSchema / outputSchema on PreviewOperation; oauth2 update
  support).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant