@jam-nodes/nodes 0.2.7 → 0.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,82 @@
1
+ import { z } from 'zod';
2
+ export declare const FirecrawlExtractInputSchema: z.ZodObject<{
3
+ /** URLs to extract data from (supports glob patterns) */
4
+ urls: z.ZodArray<z.ZodString, "many">;
5
+ /** Prompt to guide the extraction process */
6
+ prompt: z.ZodOptional<z.ZodString>;
7
+ /** JSON Schema defining the structure of the extracted data */
8
+ schema: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
9
+ }, "strip", z.ZodTypeAny, {
10
+ urls: string[];
11
+ prompt?: string | undefined;
12
+ schema?: Record<string, unknown> | undefined;
13
+ }, {
14
+ urls: string[];
15
+ prompt?: string | undefined;
16
+ schema?: Record<string, unknown> | undefined;
17
+ }>;
18
+ export type FirecrawlExtractInput = z.infer<typeof FirecrawlExtractInputSchema>;
19
+ export declare const FirecrawlExtractOutputSchema: z.ZodObject<{
20
+ success: z.ZodBoolean;
21
+ status: z.ZodEnum<["completed", "failed", "cancelled"]>;
22
+ /** Extracted data matching the provided schema */
23
+ data: z.ZodRecord<z.ZodString, z.ZodUnknown>;
24
+ /** Number of tokens used by the extract job */
25
+ tokensUsed: z.ZodOptional<z.ZodNumber>;
26
+ expiresAt: z.ZodOptional<z.ZodString>;
27
+ }, "strip", z.ZodTypeAny, {
28
+ status: "completed" | "failed" | "cancelled";
29
+ success: boolean;
30
+ data: Record<string, unknown>;
31
+ expiresAt?: string | undefined;
32
+ tokensUsed?: number | undefined;
33
+ }, {
34
+ status: "completed" | "failed" | "cancelled";
35
+ success: boolean;
36
+ data: Record<string, unknown>;
37
+ expiresAt?: string | undefined;
38
+ tokensUsed?: number | undefined;
39
+ }>;
40
+ export type FirecrawlExtractOutput = z.infer<typeof FirecrawlExtractOutputSchema>;
41
+ /**
42
+ * Firecrawl Extract Node
43
+ *
44
+ * Extracts structured data from one or more URLs using AI-powered extraction.
45
+ * Starts an extract job then polls until completion.
46
+ *
47
+ * @example
48
+ * ```typescript
49
+ * const result = await firecrawlExtractNode.executor({
50
+ * urls: ['https://example.com/pricing'],
51
+ * prompt: 'Extract the pricing plans with their features',
52
+ * schema: {
53
+ * type: 'object',
54
+ * properties: {
55
+ * plans: {
56
+ * type: 'array',
57
+ * items: {
58
+ * type: 'object',
59
+ * properties: {
60
+ * name: { type: 'string' },
61
+ * price: { type: 'number' },
62
+ * features: { type: 'array', items: { type: 'string' } },
63
+ * },
64
+ * },
65
+ * },
66
+ * },
67
+ * },
68
+ * }, context);
69
+ * ```
70
+ */
71
+ export declare const firecrawlExtractNode: import("@jam-nodes/core").NodeDefinition<{
72
+ urls: string[];
73
+ prompt?: string | undefined;
74
+ schema?: Record<string, unknown> | undefined;
75
+ }, {
76
+ status: "completed" | "failed" | "cancelled";
77
+ success: boolean;
78
+ data: Record<string, unknown>;
79
+ expiresAt?: string | undefined;
80
+ tokensUsed?: number | undefined;
81
+ }>;
82
+ //# sourceMappingURL=extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../../src/integrations/firecrawl/extract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAkCxB,eAAO,MAAM,2BAA2B;IACtC,yDAAyD;;IAEzD,6CAA6C;;IAE7C,+DAA+D;;;;;;;;;;EAE/D,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,eAAO,MAAM,4BAA4B;;;IAGvC,kDAAkD;;IAElD,+CAA+C;;;;;;;;;;;;;;;EAG/C,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAoFlF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;EA2D/B,CAAC"}
@@ -0,0 +1,168 @@
1
+ import { z } from 'zod';
2
+ import { defineNode } from '@jam-nodes/core';
3
+ import { fetchWithRetry, sleep } from '../../utils/http.js';
4
+ // =============================================================================
5
+ // Constants
6
+ // =============================================================================
7
+ const FIRECRAWL_API_BASE = 'https://api.firecrawl.dev/v2';
8
+ const POLL_INTERVAL_MS = 2000;
9
+ const MAX_POLL_ATTEMPTS = 150; // 5 minutes at 2s intervals
10
+ // =============================================================================
11
+ // Schemas
12
+ // =============================================================================
13
+ export const FirecrawlExtractInputSchema = z.object({
14
+ /** URLs to extract data from (supports glob patterns) */
15
+ urls: z.array(z.string()).min(1),
16
+ /** Prompt to guide the extraction process */
17
+ prompt: z.string().optional(),
18
+ /** JSON Schema defining the structure of the extracted data */
19
+ schema: z.record(z.unknown()).optional(),
20
+ });
21
+ export const FirecrawlExtractOutputSchema = z.object({
22
+ success: z.boolean(),
23
+ status: z.enum(['completed', 'failed', 'cancelled']),
24
+ /** Extracted data matching the provided schema */
25
+ data: z.record(z.unknown()),
26
+ /** Number of tokens used by the extract job */
27
+ tokensUsed: z.number().int().optional(),
28
+ expiresAt: z.string().optional(),
29
+ });
30
+ // =============================================================================
31
+ // Firecrawl API Functions
32
+ // =============================================================================
33
+ /**
34
+ * Start a Firecrawl extract job (POST /v2/extract)
35
+ */
36
+ async function startExtractJob(bearerToken, params) {
37
+ const requestBody = {
38
+ urls: params.urls,
39
+ ...(params.prompt && { prompt: params.prompt }),
40
+ ...(params.schema && { schema: params.schema }),
41
+ };
42
+ const response = await fetchWithRetry(`${FIRECRAWL_API_BASE}/extract`, {
43
+ method: 'POST',
44
+ headers: {
45
+ 'Content-Type': 'application/json',
46
+ Authorization: `Bearer ${bearerToken}`,
47
+ },
48
+ body: JSON.stringify(requestBody),
49
+ }, { maxRetries: 3, backoffMs: 1000, timeoutMs: 30000 });
50
+ if (!response.ok) {
51
+ const errorText = await response.text();
52
+ throw new Error(`Firecrawl extract POST error: ${response.status} - ${errorText}`);
53
+ }
54
+ return response.json();
55
+ }
56
+ /**
57
+ * Poll a Firecrawl extract job until completion (GET /v2/extract/:id)
58
+ */
59
+ async function pollExtractJob(bearerToken, jobId) {
60
+ for (let attempt = 0; attempt < MAX_POLL_ATTEMPTS; attempt++) {
61
+ const response = await fetchWithRetry(`${FIRECRAWL_API_BASE}/extract/${jobId}`, {
62
+ method: 'GET',
63
+ headers: {
64
+ Authorization: `Bearer ${bearerToken}`,
65
+ },
66
+ }, { maxRetries: 3, backoffMs: 1000, timeoutMs: 30000 });
67
+ if (!response.ok) {
68
+ const errorText = await response.text();
69
+ throw new Error(`Firecrawl extract GET error: ${response.status} - ${errorText}`);
70
+ }
71
+ const result = await response.json();
72
+ if (result.status === 'completed' || result.status === 'failed' || result.status === 'cancelled') {
73
+ return result;
74
+ }
75
+ await sleep(POLL_INTERVAL_MS);
76
+ }
77
+ throw new Error('Firecrawl extract timed out waiting for completion');
78
+ }
79
+ // =============================================================================
80
+ // Node Definition
81
+ // =============================================================================
82
+ /**
83
+ * Firecrawl Extract Node
84
+ *
85
+ * Extracts structured data from one or more URLs using AI-powered extraction.
86
+ * Starts an extract job then polls until completion.
87
+ *
88
+ * @example
89
+ * ```typescript
90
+ * const result = await firecrawlExtractNode.executor({
91
+ * urls: ['https://example.com/pricing'],
92
+ * prompt: 'Extract the pricing plans with their features',
93
+ * schema: {
94
+ * type: 'object',
95
+ * properties: {
96
+ * plans: {
97
+ * type: 'array',
98
+ * items: {
99
+ * type: 'object',
100
+ * properties: {
101
+ * name: { type: 'string' },
102
+ * price: { type: 'number' },
103
+ * features: { type: 'array', items: { type: 'string' } },
104
+ * },
105
+ * },
106
+ * },
107
+ * },
108
+ * },
109
+ * }, context);
110
+ * ```
111
+ */
112
+ export const firecrawlExtractNode = defineNode({
113
+ type: 'firecrawl_extract',
114
+ name: 'Firecrawl Extract',
115
+ description: 'Extract structured data from URLs using AI-powered extraction via Firecrawl',
116
+ category: 'integration',
117
+ inputSchema: FirecrawlExtractInputSchema,
118
+ outputSchema: FirecrawlExtractOutputSchema,
119
+ estimatedDuration: 30,
120
+ capabilities: {
121
+ supportsRerun: true,
122
+ supportsCancel: true,
123
+ },
124
+ executor: async (input, context) => {
125
+ try {
126
+ // Check for Bearer Token
127
+ const bearerToken = context.credentials?.firecrawl?.bearerToken;
128
+ if (!bearerToken) {
129
+ return {
130
+ success: false,
131
+ error: 'Firecrawl Bearer Token not configured. Please provide context.credentials.firecrawl.bearerToken.',
132
+ };
133
+ }
134
+ // Start extraction job
135
+ const job = await startExtractJob(bearerToken, {
136
+ urls: input.urls,
137
+ prompt: input.prompt,
138
+ schema: input.schema,
139
+ });
140
+ if (!job.success) {
141
+ return {
142
+ success: false,
143
+ error: 'Failed to start Firecrawl extract job',
144
+ };
145
+ }
146
+ // Poll extraction jobs for extracted data
147
+ const result = await pollExtractJob(bearerToken, job.id);
148
+ const status = result.status;
149
+ return {
150
+ success: true,
151
+ output: {
152
+ success: result.success,
153
+ status,
154
+ data: result.data,
155
+ tokensUsed: result.tokensUsed,
156
+ expiresAt: result.expiresAt,
157
+ },
158
+ };
159
+ }
160
+ catch (error) {
161
+ return {
162
+ success: false,
163
+ error: error instanceof Error ? error.message : 'Failed to extract data',
164
+ };
165
+ }
166
+ },
167
+ });
168
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../../src/integrations/firecrawl/extract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAE5D,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,MAAM,kBAAkB,GAAG,8BAA8B,CAAC;AAC1D,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,iBAAiB,GAAG,GAAG,CAAC,CAAC,4BAA4B;AAoB3D,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,yDAAyD;IACzD,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChC,6CAA6C;IAC7C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,+DAA+D;IAC/D,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;CACzC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IACnD,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IACpD,kDAAkD;IAClD,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC3B,+CAA+C;IAC/C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACvC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC,CAAC;AAIH,gFAAgF;AAChF,0BAA0B;AAC1B,gFAAgF;AAEhF;;GAEG;AACH,KAAK,UAAU,eAAe,CAC5B,WAAmB,EACnB,MAIC;IAED,MAAM,WAAW,GAA4B;QAC3C,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QAC/C,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;KAChD,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,cAAc,CACnC,GAAG,kBAAkB,UAAU,EAC/B;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,WAAW,EAAE;SACvC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;KAClC,EACD,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CACrD,CAAC;IAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAC3B,WAAmB,EACnB,KAAa;IAEb,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,iBAAiB,EAAE,OAAO,EAAE,EAAE,CAAC;QAC7D,MAAM,QAAQ,GAAG,MAAM,cAAc,CACnC,GAAG,kBAAkB,YAAY,KAAK,EAAE,EACxC;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,WAAW,EAAE;aACvC;SACF,EACD,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CACrD,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,MAAM,MAAM,GAAuB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEzD,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACjG,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;AACxE,CAAC;AAED,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,UAAU,CAAC;IAC7C,IAAI,EAAE,mBAAmB;IACzB,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,6EAA6E;IAC1F,QAAQ,EAAE,aAAa;IACvB,WAAW,EAAE,2BAA2B;IACxC,YAAY,EAAE,4BAA4B;IAC1C,iBAAiB,EAAE,EAAE;IACrB,YAAY,EAAE;QACZ,aAAa,EAAE,IAAI;QACnB,cAAc,EAAE,IAAI;KACrB;IAED,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACjC,IAAI,CAAC;YACH,yBAAyB;YACzB,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC;YAChE,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,kGAAkG;iBAC1G,CAAC;YACJ,CAAC;YAED,uBAAuB;YACvB,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,WAAW,EAAE;gBAC7C,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,CAAC,CAAC;YAEH,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,uCAAuC;iBAC/C,CAAC;YACJ,CAAC;YAED,0CAA0C;YAC1C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,MAAM,CAAC,MAA8C,CAAC;YAErE,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE;oBACN,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,MAAM;oBACN,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;iBAC5B;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB;aACzE,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { firecrawlScrapeNode, FirecrawlScrapeInputSchema, FirecrawlScrapeOutputSchema, type FirecrawlScrapeInput, type FirecrawlScrapeOutput, } from './scrape.js';
2
+ export { firecrawlCrawlNode, FirecrawlCrawlInputSchema, FirecrawlCrawlOutputSchema, type FirecrawlCrawlInput, type FirecrawlCrawlOutput, } from './crawl.js';
3
+ export { firecrawlExtractNode, FirecrawlExtractInputSchema, FirecrawlExtractOutputSchema, type FirecrawlExtractInput, type FirecrawlExtractOutput, } from './extract.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/integrations/firecrawl/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,2BAA2B,EAC3B,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,GAC3B,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,0BAA0B,EAC1B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,GAC1B,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,4BAA4B,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,cAAc,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { firecrawlScrapeNode, FirecrawlScrapeInputSchema, FirecrawlScrapeOutputSchema, } from './scrape.js';
2
+ export { firecrawlCrawlNode, FirecrawlCrawlInputSchema, FirecrawlCrawlOutputSchema, } from './crawl.js';
3
+ export { firecrawlExtractNode, FirecrawlExtractInputSchema, FirecrawlExtractOutputSchema, } from './extract.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/firecrawl/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,2BAA2B,GAG5B,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,0BAA0B,GAG3B,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,4BAA4B,GAG7B,MAAM,cAAc,CAAC"}