From 62df67c117ee0c082da65dfd602affdf07cdef2b Mon Sep 17 00:00:00 2001 From: Ramnique Singh <30795890+ramnique@users.noreply.github.com> Date: Tue, 19 Aug 2025 14:47:42 +0530 Subject: [PATCH 01/15] update billing modal pro display --- apps/rowboat/components/common/billing-upgrade-modal.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/rowboat/components/common/billing-upgrade-modal.tsx b/apps/rowboat/components/common/billing-upgrade-modal.tsx index fe087517..abc0863d 100644 --- a/apps/rowboat/components/common/billing-upgrade-modal.tsx +++ b/apps/rowboat/components/common/billing-upgrade-modal.tsx @@ -84,7 +84,6 @@ export function BillingUpgradeModal({ isOpen, onClose, errorMessage }: BillingUp description: "Great for power users or teams", features: [ "20,000 credits", - "o3 and o3-pro", "Priority support", ], recommended: true From 07e8baeee600548ef0f5a22e21231cb55a1ca441 Mon Sep 17 00:00:00 2001 From: Ramnique Singh <30795890+ramnique@users.noreply.github.com> Date: Tue, 19 Aug 2025 18:55:14 +0530 Subject: [PATCH 02/15] improve user icon --- .../app/lib/components/user_button.tsx | 21 ++++++++++++------- .../projects/layout/components/sidebar.tsx | 21 ++++++------------- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/apps/rowboat/app/lib/components/user_button.tsx b/apps/rowboat/app/lib/components/user_button.tsx index e612492f..04180ab1 100644 --- a/apps/rowboat/app/lib/components/user_button.tsx +++ b/apps/rowboat/app/lib/components/user_button.tsx @@ -2,24 +2,29 @@ import { useUser } from '@auth0/nextjs-auth0'; import { Avatar, Dropdown, DropdownItem, DropdownSection, DropdownTrigger, DropdownMenu } from "@heroui/react"; import { useRouter } from 'next/navigation'; -import Link from 'next/link'; -export function UserButton({ useBilling }: { useBilling?: boolean }) { +export function UserButton({ useBilling, collapsed }: { useBilling?: boolean, collapsed?: boolean }) { const router = useRouter(); const { user } = useUser(); if (!user) { return <>; } + const title = user.email ?? user.name ?? 'Unknown user'; const name = user.name ?? user.email ?? 'Unknown user'; return - +
+ + {!collapsed && {name}} +
{ @@ -31,7 +36,7 @@ export function UserButton({ useBilling }: { useBilling?: boolean }) { } }} > - + {useBilling ? ( Billing diff --git a/apps/rowboat/app/projects/layout/components/sidebar.tsx b/apps/rowboat/app/projects/layout/components/sidebar.tsx index bd1a92c3..8f4d89db 100644 --- a/apps/rowboat/app/projects/layout/components/sidebar.tsx +++ b/apps/rowboat/app/projects/layout/components/sidebar.tsx @@ -282,21 +282,12 @@ export default function Sidebar({ projectId, useAuth, collapsed = false, onToggl )} - {useAuth && ( - -
- - {!collapsed && Account} -
-
- )} + {useAuth && <> + {collapsed && + + } + {!collapsed && } + } From 82e8b6fadf94cded8c9f0966aade7fe70506d98c Mon Sep 17 00:00:00 2001 From: Ramnique Singh <30795890+ramnique@users.noreply.github.com> Date: Tue, 19 Aug 2025 18:57:25 +0530 Subject: [PATCH 03/15] fix logo tooltip --- apps/rowboat/app/projects/layout/components/sidebar.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/rowboat/app/projects/layout/components/sidebar.tsx b/apps/rowboat/app/projects/layout/components/sidebar.tsx index 8f4d89db..6dc37b2f 100644 --- a/apps/rowboat/app/projects/layout/components/sidebar.tsx +++ b/apps/rowboat/app/projects/layout/components/sidebar.tsx @@ -148,7 +148,7 @@ export default function Sidebar({ projectId, useAuth, collapsed = false, onToggl
{/* Rowboat Logo */}
- + } {!collapsed && Date: Tue, 19 Aug 2025 21:35:03 +0800 Subject: [PATCH 04/15] Triggers revamp (#212) * Simplify composio trigger name to be computed directly from Slug * Show log and friendly name in composio trigger cards * Standardize buttons in all trigger creation flows * Update trigger cards look * Remove extra ring around fields in trigger config form * Add copilot welcome message * Update copilot welcome message * Fix @ mentions deletion glitch --- .../app/lib/components/input-field.tsx | 8 +- .../app/lib/components/mentions_editor.tsx | 64 +++++++++++---- .../create-recurring-job-rule-form.tsx | 10 +-- .../components/recurring-job-rule-view.tsx | 44 ++++------- .../components/recurring-job-rules-list.tsx | 11 +-- .../job-rules/components/triggers-tab.tsx | 78 ++++++++----------- .../create-scheduled-job-rule-form.tsx | 10 +-- .../components/scheduled-job-rule-view.tsx | 24 ++---- .../components/scheduled-job-rules-list.tsx | 11 +-- .../components/ComposioTriggerTypesPanel.tsx | 51 +++++++----- .../workflow/components/TriggerConfigForm.tsx | 9 ++- .../components/common/panel-common.tsx | 42 +++++++++- 12 files changed, 201 insertions(+), 161 deletions(-) diff --git a/apps/rowboat/app/lib/components/input-field.tsx b/apps/rowboat/app/lib/components/input-field.tsx index 42ef48a6..a2b96dac 100644 --- a/apps/rowboat/app/lib/components/input-field.tsx +++ b/apps/rowboat/app/lib/components/input-field.tsx @@ -251,7 +251,7 @@ function TextInputField({
- {value ? ( + {(mentions ? localValue : value) ? ( <> {markdown ? (
@@ -355,7 +355,7 @@ function TextInputField({ "max-h-[420px] overflow-y-auto": multiline })}> diff --git a/apps/rowboat/app/lib/components/mentions_editor.tsx b/apps/rowboat/app/lib/components/mentions_editor.tsx index 0f0bd72e..35b0aef3 100644 --- a/apps/rowboat/app/lib/components/mentions_editor.tsx +++ b/apps/rowboat/app/lib/components/mentions_editor.tsx @@ -97,13 +97,20 @@ export default function MentionEditor({ }) { const containerRef = useRef(null); const quillRef = useRef(null); + const atValuesRef = useRef(atValues); + const onValueChangeRef = useRef(onValueChange); + const externalValueRef = useRef(value); + const isApplyingExternalRef = useRef(false); function getMarkdown(): string { if (!quillRef.current) { return ""; } // generate markdown representation of content - const markdown = quillRef.current.getContents().map((op) => { + const delta = quillRef.current.getContents() as unknown as Delta; + // Quill Delta has .ops + const ops: any[] = (delta as any).ops || []; + const markdown = ops.map((op) => { if (op.insert && typeof op.insert === 'object' && 'mention' in op.insert) { const mentionOp = op.insert as { mention: Match }; return `[@${mentionOp.mention.id}](#mention)`; @@ -120,6 +127,20 @@ export default function MentionEditor({ navigator.clipboard.writeText(getMarkdown()); } + // Keep refs up to date without re-initializing Quill + useEffect(() => { + atValuesRef.current = atValues; + }, [atValues]); + + useEffect(() => { + onValueChangeRef.current = onValueChange; + }, [onValueChange]); + + useEffect(() => { + externalValueRef.current = value; + }, [value]); + + // Initialize Quill once useEffect(() => { if (!containerRef.current) { return; @@ -140,15 +161,14 @@ export default function MentionEditor({ mentionDenotationChars: ["@"], showDenotationChar: true, source: async function (searchTerm: string, renderList: (values: Match[], searchTerm: string) => void) { + const list = atValuesRef.current || []; if (searchTerm.length === 0) { - renderList(atValues, searchTerm); + renderList(list, searchTerm); } else { - const matches = []; - for (let i = 0; i < atValues.length; i++) { - if ( - atValues[i].value.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1 - ) { - matches.push(atValues[i]); + const matches: Match[] = []; + for (let i = 0; i < list.length; i++) { + if (list[i].value.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1) { + matches.push(list[i]); } } renderList(matches, searchTerm); @@ -165,15 +185,18 @@ export default function MentionEditor({ }); // clear the quill contents - quill.setContents([]); + quill.setText('', Quill.sources.SILENT); // convert the markdown to parts - const parts = markdownToParts(value, atValues); + const parts = markdownToParts(externalValueRef.current, atValuesRef.current); insertPartsIntoQuill(quill, parts); quill.on(Quill.events.TEXT_CHANGE, (delta: Delta, oldDelta: Delta, source: string) => { - if (onValueChange) { - onValueChange(getMarkdown()); + if (isApplyingExternalRef.current) { + return; + } + if (onValueChangeRef.current) { + onValueChangeRef.current(getMarkdown()); } }); quillRef.current = quill; @@ -193,7 +216,22 @@ export default function MentionEditor({ quillRef.current.off(Quill.events.TEXT_CHANGE); } } - }, [atValues, onValueChange, placeholder, value, autoFocus]); + // Mount once + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + // Sync external value into the editor without re-initializing + useEffect(() => { + if (!quillRef.current) return; + const current = getMarkdown(); + if (value === current) return; + const quill = quillRef.current; + isApplyingExternalRef.current = true; + quill.setText('', Quill.sources.SILENT); + const parts = markdownToParts(value, atValuesRef.current); + insertPartsIntoQuill(quill, parts); + isApplyingExternalRef.current = false; + }, [value]); return
@@ -181,9 +180,9 @@ export function CreateRecurringJobRuleForm({ projectId }: { projectId: string }) onClick={addMessage} variant="secondary" size="sm" - className="flex items-center gap-2" + startContent={} + className="whitespace-nowrap" > - Add Message
@@ -231,7 +230,8 @@ export function CreateRecurringJobRuleForm({ projectId }: { projectId: string }) diff --git a/apps/rowboat/app/projects/[projectId]/job-rules/components/recurring-job-rule-view.tsx b/apps/rowboat/app/projects/[projectId]/job-rules/components/recurring-job-rule-view.tsx index 18c672ff..890f13ff 100644 --- a/apps/rowboat/app/projects/[projectId]/job-rules/components/recurring-job-rule-view.tsx +++ b/apps/rowboat/app/projects/[projectId]/job-rules/components/recurring-job-rule-view.tsx @@ -134,8 +134,7 @@ export function RecurringJobRuleView({ projectId, ruleId }: { projectId: string; title={
- @@ -149,31 +148,21 @@ export function RecurringJobRuleView({ projectId, ruleId }: { projectId: string;
@@ -297,6 +286,7 @@ export function RecurringJobRuleView({ projectId, ruleId }: { projectId: string; variant="secondary" onClick={() => setShowDeleteConfirm(false)} disabled={deleting} + className="whitespace-nowrap" > Cancel @@ -304,19 +294,11 @@ export function RecurringJobRuleView({ projectId, ruleId }: { projectId: string; variant="secondary" onClick={handleDelete} disabled={deleting} - className="flex items-center gap-2 bg-red-50 hover:bg-red-100 text-red-700 dark:bg-red-950 dark:hover:bg-red-900 dark:text-red-400 border border-red-200 dark:border-red-800" + isLoading={deleting} + startContent={} + className="bg-red-50 hover:bg-red-100 text-red-700 dark:bg-red-950 dark:hover:bg-red-900 dark:text-red-400 border border-red-200 dark:border-red-800 whitespace-nowrap" > - {deleting ? ( - <> - - Deleting... - - ) : ( - <> - - Delete - - )} + {deleting ? 'Deleting...' : 'Delete'}
diff --git a/apps/rowboat/app/projects/[projectId]/job-rules/components/recurring-job-rules-list.tsx b/apps/rowboat/app/projects/[projectId]/job-rules/components/recurring-job-rules-list.tsx index 008ae461..99e30593 100644 --- a/apps/rowboat/app/projects/[projectId]/job-rules/components/recurring-job-rules-list.tsx +++ b/apps/rowboat/app/projects/[projectId]/job-rules/components/recurring-job-rules-list.tsx @@ -220,15 +220,10 @@ export function RecurringJobRulesList({ projectId }: { projectId: string }) { disabled={loadingMore} variant="secondary" size="sm" + isLoading={loadingMore} + className="whitespace-nowrap" > - {loadingMore ? ( - <> - - Loading... - - ) : ( - 'Load More' - )} + {loadingMore ? 'Loading...' : 'Load More'}
)} diff --git a/apps/rowboat/app/projects/[projectId]/job-rules/components/triggers-tab.tsx b/apps/rowboat/app/projects/[projectId]/job-rules/components/triggers-tab.tsx index a68594db..3fab04b3 100644 --- a/apps/rowboat/app/projects/[projectId]/job-rules/components/triggers-tab.tsx +++ b/apps/rowboat/app/projects/[projectId]/job-rules/components/triggers-tab.tsx @@ -4,12 +4,12 @@ import React, { useState, useEffect, useCallback, useMemo } from 'react'; import { Spinner, Link } from '@heroui/react'; import { Button } from '@/components/ui/button'; import { Panel } from '@/components/common/panel-common'; -import { Plus, Trash2, ZapIcon, ChevronDown, ChevronUp } from 'lucide-react'; +import { Plus, Trash2, ZapIcon, ChevronDown, ChevronUp, ArrowLeftIcon } from 'lucide-react'; import { z } from 'zod'; import { ComposioTriggerDeployment } from '@/src/entities/models/composio-trigger-deployment'; import { ComposioTriggerType } from '@/src/entities/models/composio-trigger-type'; import { isToday, isThisWeek, isThisMonth } from '@/lib/utils/date'; -import { listComposioTriggerDeployments, deleteComposioTriggerDeployment, createComposioTriggerDeployment, listComposioTriggerTypes } from '@/app/actions/composio.actions'; +import { listComposioTriggerDeployments, deleteComposioTriggerDeployment, createComposioTriggerDeployment } from '@/app/actions/composio.actions'; import { SelectComposioToolkit } from '../../tools/components/SelectComposioToolkit'; import { ComposioTriggerTypesPanel } from '../../workflow/components/ComposioTriggerTypesPanel'; import { TriggerConfigForm } from '../../workflow/components/TriggerConfigForm'; @@ -20,6 +20,8 @@ import { fetchProject } from '@/app/actions/project.actions'; type TriggerDeployment = z.infer; +// Removed friendly name computation; backend now provides friendly trigger name + export function TriggersTab({ projectId }: { projectId: string }) { const [triggers, setTriggers] = useState([]); const [loading, setLoading] = useState(true); @@ -31,7 +33,6 @@ export function TriggersTab({ projectId }: { projectId: string }) { const [isSubmittingTrigger, setIsSubmittingTrigger] = useState(false); const [deletingTrigger, setDeletingTrigger] = useState(null); const [projectConfig, setProjectConfig] = useState | null>(null); - const [triggerTypeNames, setTriggerTypeNames] = useState>({}); const [expandedTrigger, setExpandedTrigger] = useState(null); const [cursor, setCursor] = useState(null); const [hasMore, setHasMore] = useState(false); @@ -46,31 +47,6 @@ export function TriggersTab({ projectId }: { projectId: string }) { } }, [projectId]); - const loadTriggerTypeNames = useCallback(async () => { - try { - const names: Record = {}; - - // Get unique toolkit slugs from existing triggers - const uniqueToolkits = [...new Set(triggers.map(t => t.toolkitSlug))]; - - // Fetch trigger types for each toolkit - for (const toolkitSlug of uniqueToolkits) { - try { - const response = await listComposioTriggerTypes(toolkitSlug); - response.items.forEach(triggerType => { - names[triggerType.slug] = triggerType.name; - }); - } catch (err) { - console.error(`Error fetching trigger types for ${toolkitSlug}:`, err); - } - } - - setTriggerTypeNames(names); - } catch (err: any) { - console.error('Error loading trigger type names:', err); - } - }, [triggers]); - const sections = useMemo(() => { const groups: Record = { Today: [], @@ -225,10 +201,8 @@ export function TriggersTab({ projectId }: { projectId: string }) { }, [showCreateFlow, loadTriggers]); useEffect(() => { - if (triggers.length > 0) { - loadTriggerTypeNames(); - } - }, [triggers, loadTriggerTypeNames]); + // No-op: trigger names are now derived from slug locally + }, [triggers]); const renderTriggerList = () => { if (loading) { @@ -261,7 +235,7 @@ export function TriggersTab({ projectId }: { projectId: string }) {
} rightActions={ - } @@ -350,12 +324,25 @@ export function TriggersTab({ projectId }: { projectId: string }) {
-
- - Active - +
+ {trigger.logo && ( + {`${trigger.toolkitSlug} + )} + {trigger.toolkitSlug && ( + + {trigger.toolkitSlug} + + )} +
+
+
+ Active - {triggerTypeNames[trigger.triggerTypeSlug] || trigger.triggerTypeSlug} + {trigger.triggerTypeName}
@@ -422,15 +409,10 @@ export function TriggersTab({ projectId }: { projectId: string }) { disabled={loadingMore} variant="secondary" size="sm" + isLoading={loadingMore} + className="whitespace-nowrap" > - {loadingMore ? ( - <> - - Loading... - - ) : ( - 'Load More' - )} + {loadingMore ? 'Loading...' : 'Load More'}
)} @@ -471,8 +453,10 @@ export function TriggersTab({ projectId }: { projectId: string }) {
diff --git a/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/create-scheduled-job-rule-form.tsx b/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/create-scheduled-job-rule-form.tsx index 1fb4605e..f41aeb3c 100644 --- a/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/create-scheduled-job-rule-form.tsx +++ b/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/create-scheduled-job-rule-form.tsx @@ -106,8 +106,7 @@ export function CreateScheduledJobRuleForm({ projectId }: { projectId: string }) title={
- @@ -147,9 +146,9 @@ export function CreateScheduledJobRuleForm({ projectId }: { projectId: string }) onClick={addMessage} variant="secondary" size="sm" - className="flex items-center gap-2" + startContent={} + className="whitespace-nowrap" > - Add Message
@@ -197,7 +196,8 @@ export function CreateScheduledJobRuleForm({ projectId }: { projectId: string }) diff --git a/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/scheduled-job-rule-view.tsx b/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/scheduled-job-rule-view.tsx index 73c07ae3..445a39de 100644 --- a/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/scheduled-job-rule-view.tsx +++ b/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/scheduled-job-rule-view.tsx @@ -81,8 +81,7 @@ export function ScheduledJobRuleView({ projectId, ruleId }: { projectId: string; title={
- @@ -97,9 +96,9 @@ export function ScheduledJobRuleView({ projectId, ruleId }: { projectId: string; onClick={() => setShowDeleteConfirm(true)} variant="secondary" size="sm" - className="flex items-center gap-2 bg-red-50 hover:bg-red-100 text-red-700 dark:bg-red-950 dark:hover:bg-red-900 dark:text-red-400 border border-red-200 dark:border-red-800" + startContent={} + className="bg-red-50 hover:bg-red-100 text-red-700 dark:bg-red-950 dark:hover:bg-red-900 dark:text-red-400 border border-red-200 dark:border-red-800 whitespace-nowrap" > - Delete
@@ -204,6 +203,7 @@ export function ScheduledJobRuleView({ projectId, ruleId }: { projectId: string; variant="secondary" onClick={() => setShowDeleteConfirm(false)} disabled={deleting} + className="whitespace-nowrap" > Cancel @@ -211,19 +211,11 @@ export function ScheduledJobRuleView({ projectId, ruleId }: { projectId: string; variant="secondary" onClick={handleDelete} disabled={deleting} - className="flex items-center gap-2 bg-red-50 hover:bg-red-100 text-red-700 dark:bg-red-950 dark:hover:bg-red-900 dark:text-red-400 border border-red-200 dark:border-red-800" + isLoading={deleting} + startContent={} + className="bg-red-50 hover:bg-red-100 text-red-700 dark:bg-red-950 dark:hover:bg-red-900 dark:text-red-400 border border-red-200 dark:border-red-800 whitespace-nowrap" > - {deleting ? ( - <> - - Deleting... - - ) : ( - <> - - Delete - - )} + {deleting ? 'Deleting...' : 'Delete'}
diff --git a/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/scheduled-job-rules-list.tsx b/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/scheduled-job-rules-list.tsx index da980452..69c1d33f 100644 --- a/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/scheduled-job-rules-list.tsx +++ b/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/scheduled-job-rules-list.tsx @@ -190,15 +190,10 @@ export function ScheduledJobRulesList({ projectId }: { projectId: string }) { disabled={loadingMore} variant="secondary" size="sm" + isLoading={loadingMore} + className="whitespace-nowrap" > - {loadingMore ? ( - <> - - Loading... - - ) : ( - 'Load More' - )} + {loadingMore ? 'Loading...' : 'Load More'}
)} diff --git a/apps/rowboat/app/projects/[projectId]/workflow/components/ComposioTriggerTypesPanel.tsx b/apps/rowboat/app/projects/[projectId]/workflow/components/ComposioTriggerTypesPanel.tsx index 3e906be7..41426bf5 100644 --- a/apps/rowboat/app/projects/[projectId]/workflow/components/ComposioTriggerTypesPanel.tsx +++ b/apps/rowboat/app/projects/[projectId]/workflow/components/ComposioTriggerTypesPanel.tsx @@ -1,12 +1,13 @@ 'use client'; import React, { useState, useEffect, useCallback } from 'react'; -import { Button, Card, CardBody, CardHeader, Spinner } from '@heroui/react'; +import { Button, Card, CardBody, Spinner } from '@heroui/react'; import { ChevronLeft, ChevronRight, ZapIcon, ArrowLeft } from 'lucide-react'; import { z } from 'zod'; import { ComposioTriggerType } from '@/src/entities/models/composio-trigger-type'; import { listComposioTriggerTypes } from '@/app/actions/composio.actions'; import { ZToolkit } from "@/src/application/lib/composio/types"; +import { PictureImg } from '@/components/ui/picture-img'; interface ComposioTriggerTypesPanelProps { toolkit: z.infer; @@ -151,32 +152,42 @@ export function ComposioTriggerTypesPanel({ ) : (
-
+
{triggerTypes.map((triggerType) => ( - handleTriggerTypeSelect(triggerType)} > - -
- -
-
-

+

+ {toolkit.meta?.logo ? ( + + ) : ( +
+ +
+ )} +
+

{triggerType.name} +

+
+
+ +
+

+ {triggerType.description}

- - -

- {triggerType.description} -

-
- @@ -284,7 +295,7 @@ export default function Sidebar({ projectId, useAuth, collapsed = false, onToggl {useAuth && <> {collapsed && - + } {!collapsed && } } @@ -294,8 +305,8 @@ export default function Sidebar({ projectId, useAuth, collapsed = false, onToggl {/* Create Assistant Modal */} - From e1f87a8db9aecbb611ce293d83bea0a982b20a4a Mon Sep 17 00:00:00 2001 From: akhisud3195 Date: Tue, 19 Aug 2025 19:39:42 +0530 Subject: [PATCH 06/15] Add query params in URLs for tabs in triggers to route correctly --- .../composio-trigger-deployment-view.tsx | 4 ++-- .../create-recurring-job-rule-form.tsx | 4 ++-- .../job-rules/components/job-rules-tabs.tsx | 23 ++++++++++++++++--- .../components/recurring-job-rule-view.tsx | 4 ++-- .../job-rules/components/triggers-tab.tsx | 6 ++++- .../create-scheduled-job-rule-form.tsx | 4 ++-- .../components/scheduled-job-rule-view.tsx | 4 ++-- 7 files changed, 35 insertions(+), 14 deletions(-) diff --git a/apps/rowboat/app/projects/[projectId]/job-rules/components/composio-trigger-deployment-view.tsx b/apps/rowboat/app/projects/[projectId]/job-rules/components/composio-trigger-deployment-view.tsx index 19d54c0c..e6ecfd69 100644 --- a/apps/rowboat/app/projects/[projectId]/job-rules/components/composio-trigger-deployment-view.tsx +++ b/apps/rowboat/app/projects/[projectId]/job-rules/components/composio-trigger-deployment-view.tsx @@ -47,7 +47,7 @@ export function ComposioTriggerDeploymentView({ projectId, deploymentId }: { pro setDeleting(true); try { await deleteComposioTriggerDeployment({ projectId, deploymentId: deployment.id }); - window.location.href = `/projects/${projectId}/job-rules`; + window.location.href = `/projects/${projectId}/job-rules?tab=triggers`; } catch (e) { console.error(e); alert('Failed to delete trigger'); @@ -62,7 +62,7 @@ export function ComposioTriggerDeploymentView({ projectId, deploymentId }: { pro - + diff --git a/apps/rowboat/app/projects/[projectId]/job-rules/components/job-rules-tabs.tsx b/apps/rowboat/app/projects/[projectId]/job-rules/components/job-rules-tabs.tsx index 7afb463a..d1e99622 100644 --- a/apps/rowboat/app/projects/[projectId]/job-rules/components/job-rules-tabs.tsx +++ b/apps/rowboat/app/projects/[projectId]/job-rules/components/job-rules-tabs.tsx @@ -1,18 +1,35 @@ 'use client'; -import { useState } from "react"; +import { useEffect, useState } from "react"; +import { usePathname, useRouter, useSearchParams } from "next/navigation"; import { Tabs, Tab } from "@/components/ui/tabs"; import { ScheduledJobRulesList } from "../scheduled/components/scheduled-job-rules-list"; import { RecurringJobRulesList } from "./recurring-job-rules-list"; import { TriggersTab } from "./triggers-tab"; export function JobRulesTabs({ projectId }: { projectId: string }) { - const [activeTab, setActiveTab] = useState("triggers"); + const router = useRouter(); + const pathname = usePathname(); + const searchParams = useSearchParams(); + const initialTab = (searchParams.get('tab') ?? 'triggers'); + const [activeTab, setActiveTab] = useState(initialTab); const handleTabChange = (key: React.Key) => { - setActiveTab(key.toString()); + const nextTab = key.toString(); + setActiveTab(nextTab); + const params = new URLSearchParams(searchParams.toString()); + params.set('tab', nextTab); + router.replace(`${pathname}?${params.toString()}`); }; + useEffect(() => { + const current = searchParams.get('tab') ?? 'triggers'; + if (current !== activeTab) { + setActiveTab(current); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [searchParams]); + return (
- + diff --git a/apps/rowboat/app/projects/[projectId]/job-rules/components/triggers-tab.tsx b/apps/rowboat/app/projects/[projectId]/job-rules/components/triggers-tab.tsx index 3fab04b3..3a6d0111 100644 --- a/apps/rowboat/app/projects/[projectId]/job-rules/components/triggers-tab.tsx +++ b/apps/rowboat/app/projects/[projectId]/job-rules/components/triggers-tab.tsx @@ -180,7 +180,11 @@ export function TriggersTab({ projectId }: { projectId: string }) { triggerConfig, }); - // Success! Go back to triggers list and reload + // Success! Go back to triggers list tab and reload + if (typeof window !== 'undefined') { + window.location.href = `/projects/${projectId}/job-rules?tab=triggers`; + return; + } handleBackToList(); } catch (err: any) { console.error('Error creating trigger:', err); diff --git a/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/create-scheduled-job-rule-form.tsx b/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/create-scheduled-job-rule-form.tsx index f41aeb3c..3d315424 100644 --- a/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/create-scheduled-job-rule-form.tsx +++ b/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/create-scheduled-job-rule-form.tsx @@ -90,7 +90,7 @@ export function CreateScheduledJobRuleForm({ projectId }: { projectId: string }) input: { messages: convertedMessages }, scheduledTime: scheduledTimeString, }); - router.push(`/projects/${projectId}/job-rules`); + router.push(`/projects/${projectId}/job-rules?tab=scheduled`); } catch (error) { console.error("Failed to create scheduled job rule:", error); alert("Failed to create scheduled job rule"); @@ -105,7 +105,7 @@ export function CreateScheduledJobRuleForm({ projectId }: { projectId: string }) - + diff --git a/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/scheduled-job-rule-view.tsx b/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/scheduled-job-rule-view.tsx index 445a39de..de873a5d 100644 --- a/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/scheduled-job-rule-view.tsx +++ b/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/scheduled-job-rule-view.tsx @@ -46,7 +46,7 @@ export function ScheduledJobRuleView({ projectId, ruleId }: { projectId: string; ruleId: rule.id, }); // Redirect back to job rules list - router.push(`/projects/${projectId}/job-rules`); + router.push(`/projects/${projectId}/job-rules?tab=scheduled`); } catch (error) { console.error("Failed to delete rule:", error); alert("Failed to delete rule"); @@ -80,7 +80,7 @@ export function ScheduledJobRuleView({ projectId, ruleId }: { projectId: string; - + From 5ff6e4377db484715e42887a27877d022fcd113d Mon Sep 17 00:00:00 2001 From: akhisud3195 Date: Tue, 19 Aug 2025 19:48:26 +0530 Subject: [PATCH 07/15] Fix buttons and image loading in external triggers --- .../composio-trigger-deployment-view.tsx | 16 ++++++++-------- .../job-rules/components/triggers-tab.tsx | 13 ++++++++----- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/apps/rowboat/app/projects/[projectId]/job-rules/components/composio-trigger-deployment-view.tsx b/apps/rowboat/app/projects/[projectId]/job-rules/components/composio-trigger-deployment-view.tsx index e6ecfd69..a2fa8307 100644 --- a/apps/rowboat/app/projects/[projectId]/job-rules/components/composio-trigger-deployment-view.tsx +++ b/apps/rowboat/app/projects/[projectId]/job-rules/components/composio-trigger-deployment-view.tsx @@ -63,8 +63,7 @@ export function ComposioTriggerDeploymentView({ projectId, deploymentId }: { pro title={
- @@ -77,9 +76,9 @@ export function ComposioTriggerDeploymentView({ projectId, deploymentId }: { pro onClick={() => setShowDeleteConfirm(true)} variant="secondary" size="sm" - className="flex items-center gap-2 bg-red-50 hover:bg-red-100 text-red-700 dark:bg-red-950 dark:hover:bg-red-900 dark:text-red-400 border border-red-200 dark:border-red-800" + startContent={} + className="bg-red-50 hover:bg-red-100 text-red-700 dark:bg-red-950 dark:hover:bg-red-900 dark:text-red-400 border border-red-200 dark:border-red-800 whitespace-nowrap" > - Delete
@@ -151,14 +150,15 @@ export function ComposioTriggerDeploymentView({ projectId, deploymentId }: { pro

Delete External Trigger

Are you sure you want to delete this external trigger? This will remove the linked webhook in Composio and delete this deployment.

- +
diff --git a/apps/rowboat/app/projects/[projectId]/job-rules/components/triggers-tab.tsx b/apps/rowboat/app/projects/[projectId]/job-rules/components/triggers-tab.tsx index 3a6d0111..59fdd94c 100644 --- a/apps/rowboat/app/projects/[projectId]/job-rules/components/triggers-tab.tsx +++ b/apps/rowboat/app/projects/[projectId]/job-rules/components/triggers-tab.tsx @@ -5,6 +5,7 @@ import { Spinner, Link } from '@heroui/react'; import { Button } from '@/components/ui/button'; import { Panel } from '@/components/common/panel-common'; import { Plus, Trash2, ZapIcon, ChevronDown, ChevronUp, ArrowLeftIcon } from 'lucide-react'; +import Image from 'next/image'; import { z } from 'zod'; import { ComposioTriggerDeployment } from '@/src/entities/models/composio-trigger-deployment'; import { ComposioTriggerType } from '@/src/entities/models/composio-trigger-type'; @@ -330,10 +331,13 @@ export function TriggersTab({ projectId }: { projectId: string }) {
{trigger.logo && ( - {`${trigger.toolkitSlug} )} {trigger.toolkitSlug && ( @@ -364,10 +368,9 @@ export function TriggersTab({ projectId }: { projectId: string }) { size="sm" isLoading={deletingTrigger === trigger.id} onClick={() => handleDeleteTrigger(trigger.id)} + startContent={} className="text-red-600 hover:text-red-700 hover:bg-red-50 dark:text-red-400 dark:hover:text-red-300 dark:hover:bg-red-950" - > - - + />
{/* Advanced Details Section - Collapsible */} From c99cd9ccd3b59072990894a85d3d34e971dc7fe3 Mon Sep 17 00:00:00 2001 From: akhisud3195 Date: Tue, 19 Aug 2025 20:01:08 +0530 Subject: [PATCH 08/15] Update job-rules routes to manage-triggers to better reflect purpose --- .../app/projects/[projectId]/jobs/components/job-view.tsx | 6 +++--- .../app/projects/[projectId]/jobs/components/jobs-list.tsx | 6 +++--- .../components/composio-trigger-deployment-view.tsx | 4 ++-- .../components/create-recurring-job-rule-form.tsx | 4 ++-- .../components/job-rules-tabs.tsx | 0 .../components/recurring-job-rule-view.tsx | 6 +++--- .../components/recurring-job-rules-list.tsx | 4 ++-- .../components/triggers-tab.tsx | 4 ++-- .../[projectId]/{job-rules => manage-triggers}/page.tsx | 0 .../recurring/[ruleId]/page.tsx | 0 .../{job-rules => manage-triggers}/recurring/new/page.tsx | 0 .../scheduled/[ruleId]/page.tsx | 0 .../scheduled/components/create-scheduled-job-rule-form.tsx | 4 ++-- .../scheduled/components/scheduled-job-rule-view.tsx | 4 ++-- .../scheduled/components/scheduled-job-rules-list.tsx | 4 ++-- .../{job-rules => manage-triggers}/scheduled/new/page.tsx | 0 .../triggers/[deploymentId]/page.tsx | 0 .../app/projects/[projectId]/workflow/components/TopBar.tsx | 2 +- apps/rowboat/app/projects/layout/components/sidebar.tsx | 2 +- 19 files changed, 25 insertions(+), 25 deletions(-) rename apps/rowboat/app/projects/[projectId]/{job-rules => manage-triggers}/components/composio-trigger-deployment-view.tsx (98%) rename apps/rowboat/app/projects/[projectId]/{job-rules => manage-triggers}/components/create-recurring-job-rule-form.tsx (98%) rename apps/rowboat/app/projects/[projectId]/{job-rules => manage-triggers}/components/job-rules-tabs.tsx (100%) rename apps/rowboat/app/projects/[projectId]/{job-rules => manage-triggers}/components/recurring-job-rule-view.tsx (98%) rename apps/rowboat/app/projects/[projectId]/{job-rules => manage-triggers}/components/recurring-job-rules-list.tsx (98%) rename apps/rowboat/app/projects/[projectId]/{job-rules => manage-triggers}/components/triggers-tab.tsx (98%) rename apps/rowboat/app/projects/[projectId]/{job-rules => manage-triggers}/page.tsx (100%) rename apps/rowboat/app/projects/[projectId]/{job-rules => manage-triggers}/recurring/[ruleId]/page.tsx (100%) rename apps/rowboat/app/projects/[projectId]/{job-rules => manage-triggers}/recurring/new/page.tsx (100%) rename apps/rowboat/app/projects/[projectId]/{job-rules => manage-triggers}/scheduled/[ruleId]/page.tsx (100%) rename apps/rowboat/app/projects/[projectId]/{job-rules => manage-triggers}/scheduled/components/create-scheduled-job-rule-form.tsx (98%) rename apps/rowboat/app/projects/[projectId]/{job-rules => manage-triggers}/scheduled/components/scheduled-job-rule-view.tsx (98%) rename apps/rowboat/app/projects/[projectId]/{job-rules => manage-triggers}/scheduled/components/scheduled-job-rules-list.tsx (98%) rename apps/rowboat/app/projects/[projectId]/{job-rules => manage-triggers}/scheduled/new/page.tsx (100%) rename apps/rowboat/app/projects/[projectId]/{job-rules => manage-triggers}/triggers/[deploymentId]/page.tsx (100%) diff --git a/apps/rowboat/app/projects/[projectId]/jobs/components/job-view.tsx b/apps/rowboat/app/projects/[projectId]/jobs/components/job-view.tsx index c39b941e..f36054a2 100644 --- a/apps/rowboat/app/projects/[projectId]/jobs/components/job-view.tsx +++ b/apps/rowboat/app/projects/[projectId]/jobs/components/job-view.tsx @@ -55,7 +55,7 @@ export function JobView({ projectId, jobId }: { projectId: string; jobId: string 'Deployment ID': reason.triggerDeploymentId, }, payload: reason.payload, - link: reason.triggerDeploymentId ? `/projects/${projectId}/job-rules/triggers/${reason.triggerDeploymentId}` : null + link: reason.triggerDeploymentId ? `/projects/${projectId}/manage-triggers/triggers/${reason.triggerDeploymentId}` : null }; } if (reason.type === 'scheduled_job_rule') { @@ -65,7 +65,7 @@ export function JobView({ projectId, jobId }: { projectId: string; jobId: string 'Rule ID': reason.ruleId, }, payload: null, - link: `/projects/${projectId}/job-rules/scheduled/${reason.ruleId}` + link: `/projects/${projectId}/manage-triggers/scheduled/${reason.ruleId}` }; } if (reason.type === 'recurring_job_rule') { @@ -75,7 +75,7 @@ export function JobView({ projectId, jobId }: { projectId: string; jobId: string 'Rule ID': reason.ruleId, }, payload: null, - link: `/projects/${projectId}/job-rules/recurring/${reason.ruleId}` + link: `/projects/${projectId}/manage-triggers/recurring/${reason.ruleId}` }; } return { diff --git a/apps/rowboat/app/projects/[projectId]/jobs/components/jobs-list.tsx b/apps/rowboat/app/projects/[projectId]/jobs/components/jobs-list.tsx index 36b9d06d..ceac96b1 100644 --- a/apps/rowboat/app/projects/[projectId]/jobs/components/jobs-list.tsx +++ b/apps/rowboat/app/projects/[projectId]/jobs/components/jobs-list.tsx @@ -99,21 +99,21 @@ export function JobsList({ projectId, filters, showTitle = true, customTitle }: return { type: 'Composio Trigger', display: `Composio: ${reason.triggerTypeSlug}`, - link: reason.triggerDeploymentId ? `/projects/${projectId}/job-rules/triggers/${reason.triggerDeploymentId}` : null + link: reason.triggerDeploymentId ? `/projects/${projectId}/manage-triggers/triggers/${reason.triggerDeploymentId}` : null }; } if (reason.type === 'scheduled_job_rule') { return { type: 'Scheduled Job Rule', display: `Scheduled Rule`, - link: `/projects/${projectId}/job-rules/scheduled/${reason.ruleId}` + link: `/projects/${projectId}/manage-triggers/scheduled/${reason.ruleId}` }; } if (reason.type === 'recurring_job_rule') { return { type: 'Recurring Job Rule', display: `Recurring Rule`, - link: `/projects/${projectId}/job-rules/recurring/${reason.ruleId}` + link: `/projects/${projectId}/manage-triggers/recurring/${reason.ruleId}` }; } return { diff --git a/apps/rowboat/app/projects/[projectId]/job-rules/components/composio-trigger-deployment-view.tsx b/apps/rowboat/app/projects/[projectId]/manage-triggers/components/composio-trigger-deployment-view.tsx similarity index 98% rename from apps/rowboat/app/projects/[projectId]/job-rules/components/composio-trigger-deployment-view.tsx rename to apps/rowboat/app/projects/[projectId]/manage-triggers/components/composio-trigger-deployment-view.tsx index a2fa8307..5efe0f22 100644 --- a/apps/rowboat/app/projects/[projectId]/job-rules/components/composio-trigger-deployment-view.tsx +++ b/apps/rowboat/app/projects/[projectId]/manage-triggers/components/composio-trigger-deployment-view.tsx @@ -47,7 +47,7 @@ export function ComposioTriggerDeploymentView({ projectId, deploymentId }: { pro setDeleting(true); try { await deleteComposioTriggerDeployment({ projectId, deploymentId: deployment.id }); - window.location.href = `/projects/${projectId}/job-rules?tab=triggers`; + window.location.href = `/projects/${projectId}/manage-triggers?tab=triggers`; } catch (e) { console.error(e); alert('Failed to delete trigger'); @@ -62,7 +62,7 @@ export function ComposioTriggerDeploymentView({ projectId, deploymentId }: { pro - + diff --git a/apps/rowboat/app/projects/[projectId]/job-rules/components/create-recurring-job-rule-form.tsx b/apps/rowboat/app/projects/[projectId]/manage-triggers/components/create-recurring-job-rule-form.tsx similarity index 98% rename from apps/rowboat/app/projects/[projectId]/job-rules/components/create-recurring-job-rule-form.tsx rename to apps/rowboat/app/projects/[projectId]/manage-triggers/components/create-recurring-job-rule-form.tsx index 549f2e3a..ccdd3dee 100644 --- a/apps/rowboat/app/projects/[projectId]/job-rules/components/create-recurring-job-rule-form.tsx +++ b/apps/rowboat/app/projects/[projectId]/manage-triggers/components/create-recurring-job-rule-form.tsx @@ -89,7 +89,7 @@ export function CreateRecurringJobRuleForm({ projectId }: { projectId: string }) input: { messages: convertedMessages }, cron: cronExpression, }); - router.push(`/projects/${projectId}/job-rules?tab=recurring`); + router.push(`/projects/${projectId}/manage-triggers?tab=recurring`); } catch (error) { console.error("Failed to create recurring job rule:", error); alert("Failed to create recurring job rule"); @@ -102,7 +102,7 @@ export function CreateRecurringJobRuleForm({ projectId }: { projectId: string }) - + diff --git a/apps/rowboat/app/projects/[projectId]/job-rules/components/job-rules-tabs.tsx b/apps/rowboat/app/projects/[projectId]/manage-triggers/components/job-rules-tabs.tsx similarity index 100% rename from apps/rowboat/app/projects/[projectId]/job-rules/components/job-rules-tabs.tsx rename to apps/rowboat/app/projects/[projectId]/manage-triggers/components/job-rules-tabs.tsx diff --git a/apps/rowboat/app/projects/[projectId]/job-rules/components/recurring-job-rule-view.tsx b/apps/rowboat/app/projects/[projectId]/manage-triggers/components/recurring-job-rule-view.tsx similarity index 98% rename from apps/rowboat/app/projects/[projectId]/job-rules/components/recurring-job-rule-view.tsx rename to apps/rowboat/app/projects/[projectId]/manage-triggers/components/recurring-job-rule-view.tsx index 368f8cb9..3b55cc31 100644 --- a/apps/rowboat/app/projects/[projectId]/job-rules/components/recurring-job-rule-view.tsx +++ b/apps/rowboat/app/projects/[projectId]/manage-triggers/components/recurring-job-rule-view.tsx @@ -65,7 +65,7 @@ export function RecurringJobRuleView({ projectId, ruleId }: { projectId: string; ruleId: rule.id, }); // Redirect back to job rules list - router.push(`/projects/${projectId}/job-rules?tab=recurring`); + router.push(`/projects/${projectId}/manage-triggers?tab=recurring`); } catch (error) { console.error("Failed to delete rule:", error); alert("Failed to delete rule"); @@ -118,7 +118,7 @@ export function RecurringJobRuleView({ projectId, ruleId }: { projectId: string;

The requested rule could not be found.

- + @@ -133,7 +133,7 @@ export function RecurringJobRuleView({ projectId, ruleId }: { projectId: string; - + diff --git a/apps/rowboat/app/projects/[projectId]/job-rules/components/recurring-job-rules-list.tsx b/apps/rowboat/app/projects/[projectId]/manage-triggers/components/recurring-job-rules-list.tsx similarity index 98% rename from apps/rowboat/app/projects/[projectId]/job-rules/components/recurring-job-rules-list.tsx rename to apps/rowboat/app/projects/[projectId]/manage-triggers/components/recurring-job-rules-list.tsx index 99e30593..d5444eaa 100644 --- a/apps/rowboat/app/projects/[projectId]/job-rules/components/recurring-job-rules-list.tsx +++ b/apps/rowboat/app/projects/[projectId]/manage-triggers/components/recurring-job-rules-list.tsx @@ -134,7 +134,7 @@ export function RecurringJobRulesList({ projectId }: { projectId: string }) { } rightActions={
- + @@ -168,7 +168,7 @@ export function RecurringJobRulesList({ projectId }: { projectId: string }) {
diff --git a/apps/rowboat/app/projects/[projectId]/job-rules/components/triggers-tab.tsx b/apps/rowboat/app/projects/[projectId]/manage-triggers/components/triggers-tab.tsx similarity index 98% rename from apps/rowboat/app/projects/[projectId]/job-rules/components/triggers-tab.tsx rename to apps/rowboat/app/projects/[projectId]/manage-triggers/components/triggers-tab.tsx index 59fdd94c..ede8bf28 100644 --- a/apps/rowboat/app/projects/[projectId]/job-rules/components/triggers-tab.tsx +++ b/apps/rowboat/app/projects/[projectId]/manage-triggers/components/triggers-tab.tsx @@ -183,7 +183,7 @@ export function TriggersTab({ projectId }: { projectId: string }) { // Success! Go back to triggers list tab and reload if (typeof window !== 'undefined') { - window.location.href = `/projects/${projectId}/job-rules?tab=triggers`; + window.location.href = `/projects/${projectId}/manage-triggers?tab=triggers`; return; } handleBackToList(); @@ -328,7 +328,7 @@ export function TriggersTab({ projectId }: { projectId: string }) { >
- +
{trigger.logo && ( - + diff --git a/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/scheduled-job-rule-view.tsx b/apps/rowboat/app/projects/[projectId]/manage-triggers/scheduled/components/scheduled-job-rule-view.tsx similarity index 98% rename from apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/scheduled-job-rule-view.tsx rename to apps/rowboat/app/projects/[projectId]/manage-triggers/scheduled/components/scheduled-job-rule-view.tsx index de873a5d..7b44fb46 100644 --- a/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/scheduled-job-rule-view.tsx +++ b/apps/rowboat/app/projects/[projectId]/manage-triggers/scheduled/components/scheduled-job-rule-view.tsx @@ -46,7 +46,7 @@ export function ScheduledJobRuleView({ projectId, ruleId }: { projectId: string; ruleId: rule.id, }); // Redirect back to job rules list - router.push(`/projects/${projectId}/job-rules?tab=scheduled`); + router.push(`/projects/${projectId}/manage-triggers?tab=scheduled`); } catch (error) { console.error("Failed to delete rule:", error); alert("Failed to delete rule"); @@ -80,7 +80,7 @@ export function ScheduledJobRuleView({ projectId, ruleId }: { projectId: string; - + diff --git a/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/scheduled-job-rules-list.tsx b/apps/rowboat/app/projects/[projectId]/manage-triggers/scheduled/components/scheduled-job-rules-list.tsx similarity index 98% rename from apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/scheduled-job-rules-list.tsx rename to apps/rowboat/app/projects/[projectId]/manage-triggers/scheduled/components/scheduled-job-rules-list.tsx index 69c1d33f..b8baf176 100644 --- a/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/components/scheduled-job-rules-list.tsx +++ b/apps/rowboat/app/projects/[projectId]/manage-triggers/scheduled/components/scheduled-job-rules-list.tsx @@ -112,7 +112,7 @@ export function ScheduledJobRulesList({ projectId }: { projectId: string }) { } rightActions={
- + @@ -146,7 +146,7 @@ export function ScheduledJobRulesList({ projectId }: { projectId: string }) {
diff --git a/apps/rowboat/app/projects/[projectId]/job-rules/scheduled/new/page.tsx b/apps/rowboat/app/projects/[projectId]/manage-triggers/scheduled/new/page.tsx similarity index 100% rename from apps/rowboat/app/projects/[projectId]/job-rules/scheduled/new/page.tsx rename to apps/rowboat/app/projects/[projectId]/manage-triggers/scheduled/new/page.tsx diff --git a/apps/rowboat/app/projects/[projectId]/job-rules/triggers/[deploymentId]/page.tsx b/apps/rowboat/app/projects/[projectId]/manage-triggers/triggers/[deploymentId]/page.tsx similarity index 100% rename from apps/rowboat/app/projects/[projectId]/job-rules/triggers/[deploymentId]/page.tsx rename to apps/rowboat/app/projects/[projectId]/manage-triggers/triggers/[deploymentId]/page.tsx diff --git a/apps/rowboat/app/projects/[projectId]/workflow/components/TopBar.tsx b/apps/rowboat/app/projects/[projectId]/workflow/components/TopBar.tsx index 4a948f50..cc4d79e9 100644 --- a/apps/rowboat/app/projects/[projectId]/workflow/components/TopBar.tsx +++ b/apps/rowboat/app/projects/[projectId]/workflow/components/TopBar.tsx @@ -166,7 +166,7 @@ export function TopBar({ } - onPress={() => { if (projectId) { router.push(`/projects/${projectId}/job-rules`); } }} + onPress={() => { if (projectId) { router.push(`/projects/${projectId}/manage-triggers`); } }} > Manage triggers diff --git a/apps/rowboat/app/projects/layout/components/sidebar.tsx b/apps/rowboat/app/projects/layout/components/sidebar.tsx index 60b49d4c..739d3821 100644 --- a/apps/rowboat/app/projects/layout/components/sidebar.tsx +++ b/apps/rowboat/app/projects/layout/components/sidebar.tsx @@ -104,7 +104,7 @@ export default function Sidebar({ projectId, useAuth, collapsed = false, onToggl icon: WorkflowIcon, }, { - href: 'job-rules', + href: 'manage-triggers', label: 'Triggers', icon: ZapIcon, }, From 892c6d4bee858387d6654ec15c07041cda2bd88d Mon Sep 17 00:00:00 2001 From: akhisud3195 Date: Tue, 19 Aug 2025 20:04:17 +0530 Subject: [PATCH 09/15] Set mock tools to false when creating any new tool --- .../app/projects/[projectId]/workflow/workflow_editor.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/rowboat/app/projects/[projectId]/workflow/workflow_editor.tsx b/apps/rowboat/app/projects/[projectId]/workflow/workflow_editor.tsx index f677f96d..0acf666d 100644 --- a/apps/rowboat/app/projects/[projectId]/workflow/workflow_editor.tsx +++ b/apps/rowboat/app/projects/[projectId]/workflow/workflow_editor.tsx @@ -376,7 +376,7 @@ function reducer(state: State, action: Action): State { properties: {}, required: [] }, - mockTool: true, + mockTool: false, ...action.tool }); draft.selection = { From 3027bf02535c86be05db71865e64a713c2723197 Mon Sep 17 00:00:00 2001 From: akhisud3195 Date: Tue, 19 Aug 2025 20:55:22 +0530 Subject: [PATCH 10/15] Move agent config description to instructions --- .../app/lib/components/input-field.tsx | 9 +++-- .../[projectId]/entities/agent_config.tsx | 33 ++++++++++--------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/apps/rowboat/app/lib/components/input-field.tsx b/apps/rowboat/app/lib/components/input-field.tsx index a2b96dac..1dab3020 100644 --- a/apps/rowboat/app/lib/components/input-field.tsx +++ b/apps/rowboat/app/lib/components/input-field.tsx @@ -41,6 +41,7 @@ interface TextInputFieldProps extends BaseInputFieldProps { showSaveButton?: boolean; showDiscardButton?: boolean; immediateSave?: boolean; + minHeight?: string; } // Select input specific props @@ -109,6 +110,7 @@ function TextInputField({ showSaveButton = false, showDiscardButton = false, immediateSave = false, + minHeight, }: TextInputFieldProps) { const [isEditing, setIsEditing] = useState(false); const [localValue, setLocalValue] = useState(value); @@ -248,7 +250,7 @@ function TextInputField({ {/* Input field */} {mentions ? ( -
+
!locked && !disabled && setIsEditing(true)} > {/* Content */} diff --git a/apps/rowboat/app/projects/[projectId]/entities/agent_config.tsx b/apps/rowboat/app/projects/[projectId]/entities/agent_config.tsx index 6f6c332a..f44432f4 100644 --- a/apps/rowboat/app/projects/[projectId]/entities/agent_config.tsx +++ b/apps/rowboat/app/projects/[projectId]/entities/agent_config.tsx @@ -319,6 +319,22 @@ export function AgentConfig({
) : (
+ {/* Description Section */} +
+ + { + handleUpdate({ ...agent, description: value }); + showSavedMessage(); + }} + multiline={true} + placeholder="Enter a description for this agent" + minHeight="40px" + className="w-full" + /> +
{/* Instructions Section */}
@@ -493,22 +509,7 @@ export function AgentConfig({ />
-
- -
- { - handleUpdate({ ...agent, description: value }); - showSavedMessage(); - }} - multiline={true} - placeholder="Enter a description for this agent" - className="w-full" - /> -
-
+
{/* Behavior Section Card */} From 1368a9d0c7aa3d53dc6b07d057e7b03b14ee95eb Mon Sep 17 00:00:00 2001 From: Ramnique Singh <30795890+ramnique@users.noreply.github.com> Date: Tue, 19 Aug 2025 21:52:47 +0530 Subject: [PATCH 11/15] set stream response duration to 300s --- .../rowboat/app/api/copilot-stream-response/[streamId]/route.ts | 2 ++ apps/rowboat/app/api/stream-response/[streamId]/route.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/apps/rowboat/app/api/copilot-stream-response/[streamId]/route.ts b/apps/rowboat/app/api/copilot-stream-response/[streamId]/route.ts index 8dd95289..3b743a3a 100644 --- a/apps/rowboat/app/api/copilot-stream-response/[streamId]/route.ts +++ b/apps/rowboat/app/api/copilot-stream-response/[streamId]/route.ts @@ -4,6 +4,8 @@ import { redisClient } from "@/app/lib/redis"; import { CopilotAPIRequest } from "@/src/application/lib/copilot/types"; import { streamMultiAgentResponse } from "@/src/application/lib/copilot/copilot"; +export const maxDuration = 300; + export async function GET(request: Request, props: { params: Promise<{ streamId: string }> }) { const params = await props.params; // get the payload from redis diff --git a/apps/rowboat/app/api/stream-response/[streamId]/route.ts b/apps/rowboat/app/api/stream-response/[streamId]/route.ts index 0f873ff8..4fc9de3f 100644 --- a/apps/rowboat/app/api/stream-response/[streamId]/route.ts +++ b/apps/rowboat/app/api/stream-response/[streamId]/route.ts @@ -4,6 +4,8 @@ import { requireAuth } from "@/app/lib/auth"; import { z } from "zod"; import { TurnEvent } from "@/src/entities/models/turn"; +export const maxDuration = 300; + export async function GET(request: Request, props: { params: Promise<{ streamId: string }> }) { const params = await props.params; From 883e23a1152fcbd03ee7862020840c99a4d8dda6 Mon Sep 17 00:00:00 2001 From: akhisud3195 Date: Tue, 19 Aug 2025 22:49:01 +0530 Subject: [PATCH 12/15] Move API and SDK settings to project settings page --- .../[projectId]/config/components/project.tsx | 2 ++ .../workflow/components/TopBar.tsx | 4 +-- .../[projectId]/workflow/workflow_editor.tsx | 27 ++----------------- 3 files changed, 5 insertions(+), 28 deletions(-) diff --git a/apps/rowboat/app/projects/[projectId]/config/components/project.tsx b/apps/rowboat/app/projects/[projectId]/config/components/project.tsx index 18dabf8f..3fc4f39a 100644 --- a/apps/rowboat/app/projects/[projectId]/config/components/project.tsx +++ b/apps/rowboat/app/projects/[projectId]/config/components/project.tsx @@ -818,7 +818,9 @@ export function SimpleProjectSection({ return (
+ +
diff --git a/apps/rowboat/app/projects/[projectId]/workflow/components/TopBar.tsx b/apps/rowboat/app/projects/[projectId]/workflow/components/TopBar.tsx index cc4d79e9..a0053fcb 100644 --- a/apps/rowboat/app/projects/[projectId]/workflow/components/TopBar.tsx +++ b/apps/rowboat/app/projects/[projectId]/workflow/components/TopBar.tsx @@ -22,7 +22,6 @@ interface TopBarProps { onChangeMode: (mode: 'draft' | 'live') => void; onRevertToLive: () => void; onToggleCopilot: () => void; - onSettingsModalOpen: () => void; } export function TopBar({ @@ -43,7 +42,6 @@ export function TopBar({ onChangeMode, onRevertToLive, onToggleCopilot, - onSettingsModalOpen, }: TopBarProps) { const router = useRouter(); const params = useParams(); @@ -159,7 +157,7 @@ export function TopBar({ } - onPress={onSettingsModalOpen} + onPress={() => { if (projectId) { router.push(`/projects/${projectId}/config`); } }} > API & SDK settings diff --git a/apps/rowboat/app/projects/[projectId]/workflow/workflow_editor.tsx b/apps/rowboat/app/projects/[projectId]/workflow/workflow_editor.tsx index 0acf666d..9788e7a4 100644 --- a/apps/rowboat/app/projects/[projectId]/workflow/workflow_editor.tsx +++ b/apps/rowboat/app/projects/[projectId]/workflow/workflow_editor.tsx @@ -34,7 +34,7 @@ import { ModelsResponse } from "@/app/lib/types/billing_types"; import { AgentGraphVisualizer } from "../entities/AgentGraphVisualizer"; import { Panel } from "@/components/common/panel-common"; import { Button as CustomButton } from "@/components/ui/button"; -import { ConfigApp } from "../config/app"; + import { InputField } from "@/app/lib/components/input-field"; import { VoiceSection } from "../config/components/voice"; import { TopBar } from "./components/TopBar"; @@ -872,9 +872,6 @@ export function WorkflowEditor({ // Modal state for revert confirmation const { isOpen: isRevertModalOpen, onOpen: onRevertModalOpen, onClose: onRevertModalClose } = useDisclosure(); - // Modal state for settings - const { isOpen: isSettingsModalOpen, onOpen: onSettingsModalOpen, onClose: onSettingsModalClose } = useDisclosure(); - // Modal state for phone/Twilio configuration const { isOpen: isPhoneModalOpen, onOpen: onPhoneModalOpen, onClose: onPhoneModalClose } = useDisclosure(); @@ -1280,7 +1277,6 @@ export function WorkflowEditor({ onChangeMode={onChangeMode} onRevertToLive={handleRevertToLive} onToggleCopilot={() => setShowCopilot(!showCopilot)} - onSettingsModalOpen={onSettingsModalOpen} /> {/* Content Area */} @@ -1498,26 +1494,7 @@ export function WorkflowEditor({ - {/* Settings Modal */} - - - - API & SDK - - - - - - + {/* Phone/Twilio Modal */} Date: Tue, 19 Aug 2025 23:23:14 +0530 Subject: [PATCH 13/15] Update publish and deploy dropdowns in the topbar --- .../workflow/components/TopBar.tsx | 93 +++++++++++-------- 1 file changed, 55 insertions(+), 38 deletions(-) diff --git a/apps/rowboat/app/projects/[projectId]/workflow/components/TopBar.tsx b/apps/rowboat/app/projects/[projectId]/workflow/components/TopBar.tsx index a0053fcb..98707fd2 100644 --- a/apps/rowboat/app/projects/[projectId]/workflow/components/TopBar.tsx +++ b/apps/rowboat/app/projects/[projectId]/workflow/components/TopBar.tsx @@ -1,7 +1,7 @@ "use client"; import React from "react"; import { Button, Dropdown, DropdownItem, DropdownMenu, DropdownTrigger, Spinner, Tooltip, Input } from "@heroui/react"; -import { RadioIcon, RedoIcon, UndoIcon, RocketIcon, PenLine, AlertTriangle, DownloadIcon, SettingsIcon, ChevronDownIcon, ZapIcon, Clock } from "lucide-react"; +import { RadioIcon, RedoIcon, UndoIcon, RocketIcon, PenLine, AlertTriangle, DownloadIcon, SettingsIcon, ChevronDownIcon, ZapIcon, Clock, Plug } from "lucide-react"; import { useParams, useRouter } from "next/navigation"; interface TopBarProps { @@ -105,7 +105,7 @@ export function TopBar({
Copied to clipboard
}
- {isLive &&
+ {isLive &&
This version is locked. Changes applied will not be reflected. @@ -133,43 +133,59 @@ export function TopBar({ {/* Deploy CTA - always visible */}
- - - + {isLive ? ( + + + + + + } + onPress={() => { if (projectId) { router.push(`/projects/${projectId}/config`); } }} + > + API & SDK Settings + + } + onPress={() => { if (projectId) { router.push(`/projects/${projectId}/manage-triggers`); } }} + > + Manage Triggers + + + + ) : ( + <> - - - } - onPress={() => { if (projectId) { router.push(`/projects/${projectId}/config`); } }} - > - API & SDK settings - - } - onPress={() => { if (projectId) { router.push(`/projects/${projectId}/manage-triggers`); } }} - > - Manage triggers - - {!isLive ? ( - <> + + + + + } @@ -185,10 +201,10 @@ export function TopBar({ > Reset to live version - - ) : null} - - + + + + )}
{isLive &&
); From a8e7ea5d2aa6b59a0b967094809d0818b236569a Mon Sep 17 00:00:00 2001 From: arkml Date: Wed, 20 Aug 2025 00:11:33 +0530 Subject: [PATCH 15/15] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 5927b2d1..9ab8d36b 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,9 @@ LinkedIn + + Twitter + Y Combinator