Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
3da7ffb
feat(desktop): add create workflow button to channel header
wesbillman Apr 3, 2026
92efbdf
refactor(desktop): clean up Phase 1 workflow dialog code
wesbillman Apr 3, 2026
01b8f04
fix(desktop): disable create workflow button on DM channels
wesbillman Apr 3, 2026
b758d43
fix(desktop): address Phase 1 review — permission guard and adaptive …
wesbillman Apr 3, 2026
f2f2d62
feat(desktop): replace YAML textarea with form-based workflow builder
wesbillman Apr 3, 2026
bbb1580
refactor(desktop): extract shared form primitives from workflow compo…
wesbillman Apr 3, 2026
011a416
refactor(desktop): deduplicate form primitives and fix step ID collision
wesbillman Apr 3, 2026
c65e719
fix(desktop): address Phase 2 review — method default and UUID step IDs
wesbillman Apr 3, 2026
6ac6257
fix(desktop): add steps array guard and wire up a11y ids on step inputs
wesbillman Apr 3, 2026
627785a
fix(desktop): wire up id/htmlFor on step card inputs for a11y
wesbillman Apr 3, 2026
989aa4e
feat(desktop): add edit and duplicate workflow support (Phase 3)
wesbillman Apr 3, 2026
5b8134e
refactor(desktop): stabilize mutation callbacks in WorkflowsView
wesbillman Apr 3, 2026
080f679
fix(desktop): unknown type guard + delete confirmation dialog (Phase 4)
wesbillman Apr 3, 2026
ef18d50
test(desktop): add Playwright E2E tests for workflow CRUD (Phase 5)
wesbillman Apr 3, 2026
b146133
fix(desktop): start in YAML mode when initial definition is unparseable
wesbillman Apr 3, 2026
b8d6516
fix(desktop): PR feedback — dialog layout, autocapitalize, step IDs, …
wesbillman Apr 3, 2026
9b2b74b
fix(desktop): address spec details — min-h-0, autoCorrect, step ID logic
wesbillman Apr 3, 2026
99408e7
refactor(desktop): clean up workflow form components
wesbillman Apr 3, 2026
89a751f
refactor(desktop): move nextStepId to workflowFormTypes
wesbillman Apr 3, 2026
716b457
fix: scope Create button selector in integration tests
wesbillman Apr 4, 2026
0213eab
fix(desktop): scope Create button selectors in e2e tests to stream form
wesbillman Apr 4, 2026
61a8a77
fix: scope Create button selectors in remaining test files
wesbillman Apr 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion desktop/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@
"react-markdown": "^10.1.0",
"remark-breaks": "^4.0.0",
"remark-gfm": "^4.0.1",
"tailwind-merge": "^3.5.0"
"tailwind-merge": "^3.5.0",
"yaml": "^2.8.3"
},
"devDependencies": {
"@biomejs/biome": "^2.4.6",
Expand Down
1 change: 1 addition & 0 deletions desktop/playwright.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ export default defineConfig({
"**/channel-browser.spec.ts",
"**/messaging.spec.ts",
"**/mentions.spec.ts",
"**/workflows.spec.ts",
],
use: {
...devices["Desktop Chrome"],
Expand Down
47 changes: 29 additions & 18 deletions desktop/pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

26 changes: 25 additions & 1 deletion desktop/src/features/channels/ui/ChannelMembersBar.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Bot, Plus, Settings2, UserRound } from "lucide-react";
import { Bot, Plus, Settings2, UserRound, Zap } from "lucide-react";
import * as React from "react";

import {
Expand All @@ -8,6 +8,7 @@ import {
useRelayAgentsQuery,
} from "@/features/agents/hooks";
import { useChannelMembersQuery } from "@/features/channels/hooks";
import { CreateWorkflowDialog } from "@/features/workflows/ui/CreateWorkflowDialog";
import type { Channel } from "@/shared/api/types";
import { normalizePubkey } from "@/shared/lib/pubkey";
import { Button } from "@/shared/ui/button";
Expand Down Expand Up @@ -47,6 +48,7 @@ export function ChannelMembersBar({
onManageChannel,
}: ChannelMembersBarProps) {
const [isAddBotOpen, setIsAddBotOpen] = React.useState(false);
const [isCreateWorkflowOpen, setIsCreateWorkflowOpen] = React.useState(false);
const membersQuery = useChannelMembersQuery(channel.id);
const providersQuery = useAcpProvidersQuery();
const backendProvidersQuery = useBackendProvidersQuery();
Expand Down Expand Up @@ -111,6 +113,7 @@ export function ChannelMembersBar({

previousChannelIdRef.current = channel.id;
setIsAddBotOpen(false);
setIsCreateWorkflowOpen(false);
}, [channel.id]);

const dialogErrorMessage =
Expand Down Expand Up @@ -154,6 +157,21 @@ export function ChannelMembersBar({
<Plus className="h-4 w-4" />
</Button>

<Button
aria-label="Create workflow"
className="h-9 w-9 rounded-full"
data-testid="channel-create-workflow-trigger"
disabled={!canAddAgents}
onClick={() => {
setIsCreateWorkflowOpen(true);
}}
size="icon"
type="button"
variant="outline"
>
<Zap className="h-4 w-4" />
</Button>

<Button
aria-label="Manage channel"
className="h-9 w-9 rounded-full"
Expand All @@ -167,6 +185,12 @@ export function ChannelMembersBar({
</Button>
</div>

<CreateWorkflowDialog
channels={[channel]}
onOpenChange={setIsCreateWorkflowOpen}
open={isCreateWorkflowOpen}
/>

<AddChannelBotDialog
backendProviders={backendProvidersQuery.data ?? []}
backendProvidersLoading={backendProvidersQuery.isLoading}
Expand Down
Loading
Loading