Add Activepieces integration for workflow automation

- Add Activepieces fork with SmoothSchedule custom piece
- Create integrations app with Activepieces service layer
- Add embed token endpoint for iframe integration
- Create Automations page with embedded workflow builder
- Add sidebar visibility fix for embed mode
- Add list inactive customers endpoint to Public API
- Include SmoothSchedule triggers: event created/updated/cancelled
- Include SmoothSchedule actions: create/update/cancel events, list resources/services/customers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
poduck
2025-12-18 22:59:37 -05:00
parent 9848268d34
commit 3aa7199503
16292 changed files with 1284892 additions and 4708 deletions

View File

@@ -0,0 +1,98 @@
import { t } from 'i18next';
import { ChevronDown, Puzzle, Workflow } from 'lucide-react';
import { useState } from 'react';
import { Button } from '@/components/ui/button';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
import { AgentTool, AgentToolType } from '@activepieces/shared';
import { AgentFlowToolDialog } from './flow-tool-dialog';
import { AgentPieceDialog } from './piece-tool-dialog';
type AddAgentToolDropdownProps = {
tools: AgentTool[];
disabled?: boolean;
onToolsUpdate: (tools: AgentTool[]) => void;
};
export const AddAgentToolDropdown = ({
tools,
disabled,
onToolsUpdate,
}: AddAgentToolDropdownProps) => {
const [openDropdown, setOpenDropdown] = useState(false);
const [showAddPieceDialog, setShowAddPieceDialog] = useState(false);
const [showAddFlowDialog, setShowAddFlowDialog] = useState(false);
return (
<DropdownMenu
modal={false}
open={openDropdown}
onOpenChange={setOpenDropdown}
>
<DropdownMenuTrigger disabled={disabled} asChild>
<Button variant="basic">
<span>{t('Add tool')}</span>
<ChevronDown className="h-4 w-4" />
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent>
<AgentPieceDialog
tools={tools}
open={showAddPieceDialog}
onToolsUpdate={(tools) => {
onToolsUpdate(tools);
setShowAddPieceDialog(false);
setOpenDropdown(false);
}}
onClose={() => {
setShowAddPieceDialog(false);
setOpenDropdown(false);
}}
>
<DropdownMenuItem
onSelect={(e) => {
e.preventDefault();
setShowAddPieceDialog(true);
}}
>
<Puzzle className="h-4 w-4 me-2" />
<span>{t('From piece')}</span>
</DropdownMenuItem>
</AgentPieceDialog>
<AgentFlowToolDialog
open={showAddFlowDialog}
selectedFlows={tools
.filter((tool) => tool.type === AgentToolType.FLOW)
.map((tool) => tool.flowId!)}
onToolsUpdate={(newTools) => {
onToolsUpdate(newTools);
setShowAddFlowDialog(false);
setOpenDropdown(false);
}}
onClose={() => {
setShowAddFlowDialog(false);
setOpenDropdown(false);
}}
tools={tools}
>
<DropdownMenuItem
onSelect={(e) => {
e.stopPropagation();
e.preventDefault();
setShowAddFlowDialog(true);
}}
>
<Workflow className="h-4 w-4 me-2" />
<span>{t('From flow')}</span>
</DropdownMenuItem>
</AgentFlowToolDialog>
</DropdownMenuContent>
</DropdownMenu>
);
};