Skip to content

Commit 75326b2

Browse files
authored
plugin system (#44)
* plugin system * resend plugin * linear plugin * ai gateway plugin * slack plugin * split step and config * fix build * cleanup * add contributing.md
1 parent cb2e421 commit 75326b2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+2919
-506
lines changed

CONTRIBUTING.md

Lines changed: 826 additions & 0 deletions
Large diffs are not rendered by default.

biome.jsonc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
"!components/ui",
88
"!components/ai-elements",
99
"!lib/utils.ts",
10-
"!hooks/use-mobile.ts"
10+
"!hooks/use-mobile.ts",
11+
"!plugins"
1112
]
1213
}
1314
}

components/settings/resend-settings.tsx

Lines changed: 0 additions & 92 deletions
This file was deleted.

components/workflow/utils/code-generators.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33
*/
44

55
import conditionTemplate from "@/lib/codegen-templates/condition";
6-
import createTicketTemplate from "@/lib/codegen-templates/create-ticket";
76
import databaseQueryTemplate from "@/lib/codegen-templates/database-query";
8-
import firecrawlScrapeTemplate from "@/lib/codegen-templates/firecrawl-scrape";
9-
import firecrawlSearchTemplate from "@/lib/codegen-templates/firecrawl-search";
10-
import generateImageTemplate from "@/lib/codegen-templates/generate-image";
11-
import generateTextTemplate from "@/lib/codegen-templates/generate-text";
127
import httpRequestTemplate from "@/lib/codegen-templates/http-request";
13-
import sendEmailTemplate from "@/lib/codegen-templates/send-email";
14-
import sendSlackMessageTemplate from "@/lib/codegen-templates/send-slack-message";
8+
import { generateImageCodegenTemplate } from "@/plugins/ai-gateway/codegen/generate-image";
9+
import { generateTextCodegenTemplate } from "@/plugins/ai-gateway/codegen/generate-text";
10+
import { scrapeCodegenTemplate } from "@/plugins/firecrawl/codegen/scrape";
11+
import { searchCodegenTemplate } from "@/plugins/firecrawl/codegen/search";
12+
import { createTicketCodegenTemplate } from "@/plugins/linear/codegen/create-ticket";
13+
import { sendEmailCodegenTemplate } from "@/plugins/resend/codegen/send-email";
14+
import { sendSlackMessageCodegenTemplate } from "@/plugins/slack/codegen/send-slack-message";
1515

1616
// Generate code snippet for a single node
1717
export const generateNodeCode = (node: {
@@ -64,26 +64,26 @@ export async function POST(request: NextRequest) {
6464
// Map action types to templates
6565
switch (actionType) {
6666
case "Send Email":
67-
return sendEmailTemplate;
67+
return sendEmailCodegenTemplate;
6868
case "Send Slack Message":
69-
return sendSlackMessageTemplate;
69+
return sendSlackMessageCodegenTemplate;
7070
case "Create Ticket":
7171
case "Create Linear Issue":
72-
return createTicketTemplate;
72+
return createTicketCodegenTemplate;
7373
case "Generate Text":
74-
return generateTextTemplate;
74+
return generateTextCodegenTemplate;
7575
case "Generate Image":
76-
return generateImageTemplate;
76+
return generateImageCodegenTemplate;
7777
case "Database Query":
7878
return databaseQueryTemplate;
7979
case "HTTP Request":
8080
return httpRequestTemplate;
8181
case "Condition":
8282
return conditionTemplate;
8383
case "Scrape":
84-
return firecrawlScrapeTemplate;
84+
return scrapeCodegenTemplate;
8585
case "Search":
86-
return firecrawlSearchTemplate;
86+
return searchCodegenTemplate;
8787
default:
8888
return `async function actionStep(input: Record<string, unknown>) {
8989
"use step";

lib/codegen-templates/firecrawl.ts

Lines changed: 0 additions & 42 deletions
This file was deleted.

lib/steps/firecrawl.ts

Lines changed: 0 additions & 86 deletions
This file was deleted.

lib/steps/index.ts

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,17 @@
44
* without code generation or eval()
55
*/
66

7+
import type { generateImageStep } from "../../plugins/ai-gateway/steps/generate-image/step";
8+
import type { generateTextStep } from "../../plugins/ai-gateway/steps/generate-text/step";
9+
import type { firecrawlScrapeStep } from "../../plugins/firecrawl/steps/scrape/step";
10+
import type { firecrawlSearchStep } from "../../plugins/firecrawl/steps/search/step";
11+
import type { createTicketStep } from "../../plugins/linear/steps/create-ticket/step";
12+
import type { sendEmailStep } from "../../plugins/resend/steps/send-email/step";
13+
import type { sendSlackMessageStep } from "../../plugins/slack/steps/send-slack-message/step";
714
import type { conditionStep } from "./condition";
8-
import type { createTicketStep } from "./create-ticket";
915
import type { databaseQueryStep } from "./database-query";
10-
import type { firecrawlScrapeStep, firecrawlSearchStep } from "./firecrawl";
11-
import type { generateImageStep } from "./generate-image";
12-
import type { generateTextStep } from "./generate-text";
1316
import type { httpRequestStep } from "./http-request";
1417
import type { logNodeCompleteStep, logNodeStartStep } from "./logging";
15-
import type { sendEmailStep } from "./send-email";
16-
import type { sendSlackMessageStep } from "./send-slack-message";
1718

1819
// Step function type
1920
export type StepFunction = (input: Record<string, unknown>) => Promise<unknown>;
@@ -33,29 +34,29 @@ export const stepRegistry: Record<string, StepFunction> = {
3334
input as Parameters<typeof conditionStep>[0]
3435
),
3536
"Send Email": async (input) =>
36-
(await import("./send-email")).sendEmailStep(
37+
(await import("../../plugins/resend/steps/send-email/step")).sendEmailStep(
3738
input as Parameters<typeof sendEmailStep>[0]
3839
),
3940
"Send Slack Message": async (input) =>
40-
(await import("./send-slack-message")).sendSlackMessageStep(
41-
input as Parameters<typeof sendSlackMessageStep>[0]
42-
),
41+
(
42+
await import("../../plugins/slack/steps/send-slack-message/step")
43+
).sendSlackMessageStep(input as Parameters<typeof sendSlackMessageStep>[0]),
4344
"Create Ticket": async (input) =>
44-
(await import("./create-ticket")).createTicketStep(
45-
input as Parameters<typeof createTicketStep>[0]
46-
),
45+
(
46+
await import("../../plugins/linear/steps/create-ticket/step")
47+
).createTicketStep(input as Parameters<typeof createTicketStep>[0]),
4748
"Find Issues": async (input) =>
48-
(await import("./create-ticket")).createTicketStep(
49-
input as Parameters<typeof createTicketStep>[0]
50-
), // TODO: Implement separate findIssuesStep
49+
(
50+
await import("../../plugins/linear/steps/create-ticket/step")
51+
).createTicketStep(input as Parameters<typeof createTicketStep>[0]), // TODO: Implement separate findIssuesStep
5152
"Generate Text": async (input) =>
52-
(await import("./generate-text")).generateTextStep(
53-
input as Parameters<typeof generateTextStep>[0]
54-
),
53+
(
54+
await import("../../plugins/ai-gateway/steps/generate-text/step")
55+
).generateTextStep(input as Parameters<typeof generateTextStep>[0]),
5556
"Generate Image": async (input) =>
56-
(await import("./generate-image")).generateImageStep(
57-
input as Parameters<typeof generateImageStep>[0]
58-
),
57+
(
58+
await import("../../plugins/ai-gateway/steps/generate-image/step")
59+
).generateImageStep(input as Parameters<typeof generateImageStep>[0]),
5960
"Log Node Start": async (input) =>
6061
(await import("./logging")).logNodeStartStep(
6162
input as Parameters<typeof logNodeStartStep>[0]
@@ -65,13 +66,13 @@ export const stepRegistry: Record<string, StepFunction> = {
6566
input as Parameters<typeof logNodeCompleteStep>[0]
6667
),
6768
Scrape: async (input) =>
68-
(await import("./firecrawl")).firecrawlScrapeStep(
69-
input as Parameters<typeof firecrawlScrapeStep>[0]
70-
),
69+
(
70+
await import("../../plugins/firecrawl/steps/scrape/step")
71+
).firecrawlScrapeStep(input as Parameters<typeof firecrawlScrapeStep>[0]),
7172
Search: async (input) =>
72-
(await import("./firecrawl")).firecrawlSearchStep(
73-
input as Parameters<typeof firecrawlSearchStep>[0]
74-
),
73+
(
74+
await import("../../plugins/firecrawl/steps/search/step")
75+
).firecrawlSearchStep(input as Parameters<typeof firecrawlSearchStep>[0]),
7576
};
7677

7778
// Helper to check if a step exists

0 commit comments

Comments
 (0)