@jam-nodes/nodes 0.2.4 → 0.2.5

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.
Files changed (50) hide show
  1. package/dist/ai/analyze-posts.d.ts +4 -2
  2. package/dist/ai/analyze-posts.d.ts.map +1 -1
  3. package/dist/ai/analyze-posts.js +48 -44
  4. package/dist/ai/analyze-posts.js.map +1 -1
  5. package/dist/ai/draft-emails.d.ts +4 -2
  6. package/dist/ai/draft-emails.d.ts.map +1 -1
  7. package/dist/ai/draft-emails.js +57 -42
  8. package/dist/ai/draft-emails.js.map +1 -1
  9. package/dist/ai/keyword-generator.d.ts +1 -1
  10. package/dist/ai/keyword-generator.d.ts.map +1 -1
  11. package/dist/ai/keyword-generator.js +45 -20
  12. package/dist/ai/keyword-generator.js.map +1 -1
  13. package/dist/index.d.ts +25 -8
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/integrations/apollo/search-contacts.d.ts +8 -8
  16. package/dist/integrations/apollo/search-contacts.d.ts.map +1 -1
  17. package/dist/integrations/apollo/search-contacts.js +110 -26
  18. package/dist/integrations/apollo/search-contacts.js.map +1 -1
  19. package/dist/integrations/dataforseo/keyword-research.d.ts +1 -1
  20. package/dist/integrations/dataforseo/keyword-research.d.ts.map +1 -1
  21. package/dist/integrations/dataforseo/keyword-research.js +59 -9
  22. package/dist/integrations/dataforseo/keyword-research.js.map +1 -1
  23. package/dist/integrations/dataforseo/seo-audit.d.ts +1 -1
  24. package/dist/integrations/dataforseo/seo-audit.d.ts.map +1 -1
  25. package/dist/integrations/dataforseo/seo-audit.js +52 -23
  26. package/dist/integrations/dataforseo/seo-audit.js.map +1 -1
  27. package/dist/integrations/openai/sora-video.d.ts +1 -1
  28. package/dist/integrations/openai/sora-video.d.ts.map +1 -1
  29. package/dist/integrations/openai/sora-video.js +82 -7
  30. package/dist/integrations/openai/sora-video.js.map +1 -1
  31. package/dist/integrations/social/linkedin-monitor.d.ts +1 -1
  32. package/dist/integrations/social/linkedin-monitor.d.ts.map +1 -1
  33. package/dist/integrations/social/linkedin-monitor.js +69 -36
  34. package/dist/integrations/social/linkedin-monitor.js.map +1 -1
  35. package/dist/integrations/social/reddit-monitor.d.ts.map +1 -1
  36. package/dist/integrations/social/reddit-monitor.js +5 -12
  37. package/dist/integrations/social/reddit-monitor.js.map +1 -1
  38. package/dist/integrations/social/twitter-monitor.d.ts +20 -3
  39. package/dist/integrations/social/twitter-monitor.d.ts.map +1 -1
  40. package/dist/integrations/social/twitter-monitor.js +44 -28
  41. package/dist/integrations/social/twitter-monitor.js.map +1 -1
  42. package/dist/utils/http.d.ts +60 -0
  43. package/dist/utils/http.d.ts.map +1 -0
  44. package/dist/utils/http.js +126 -0
  45. package/dist/utils/http.js.map +1 -0
  46. package/dist/utils/index.d.ts +2 -0
  47. package/dist/utils/index.d.ts.map +1 -0
  48. package/dist/utils/index.js +2 -0
  49. package/dist/utils/index.js.map +1 -0
  50. package/package.json +1 -1
@@ -5,8 +5,10 @@ export { SocialAiAnalyzeInputSchema, SocialAiAnalyzeOutputSchema, type SocialAiA
5
5
  * Uses Claude to analyze social media posts for relevance, sentiment,
6
6
  * complaint detection, and urgency. Batches posts to stay within context limits.
7
7
  *
8
- * Requires `context.services.anthropic` to be provided by the host application.
9
- * Optionally uses `context.services.analyzedPosts` to store results.
8
+ * Requires `context.credentials.anthropic.apiKey` to be provided.
9
+ *
10
+ * Note: This node analyzes posts but does NOT store results.
11
+ * Storage is the responsibility of the host application.
10
12
  *
11
13
  * @example
12
14
  * ```typescript
@@ -1 +1 @@
1
- {"version":3,"file":"analyze-posts.d.ts","sourceRoot":"","sources":["../../src/ai/analyze-posts.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,EAC3B,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,UAAU,EACf,KAAK,YAAY,GAClB,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6K9B,CAAC"}
1
+ {"version":3,"file":"analyze-posts.d.ts","sourceRoot":"","sources":["../../src/ai/analyze-posts.ts"],"names":[],"mappings":"AAoFA,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,EAC3B,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,UAAU,EACf,KAAK,YAAY,GAClB,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsI9B,CAAC"}
@@ -1,6 +1,45 @@
1
1
  import { defineNode } from '@jam-nodes/core';
2
+ import { fetchWithRetry } from '../utils/http.js';
2
3
  import { SocialAiAnalyzeInputSchema, SocialAiAnalyzeOutputSchema, } from '../schemas/ai.js';
3
4
  import { buildAnalysisPrompt, normalizeSentiment, normalizeUrgency, MIN_RELEVANCE_SCORE, ANALYSIS_BATCH_SIZE, } from '../prompts/analyze-posts.js';
5
+ // =============================================================================
6
+ // Constants
7
+ // =============================================================================
8
+ const ANTHROPIC_API_BASE = 'https://api.anthropic.com/v1';
9
+ const ANTHROPIC_VERSION = '2023-06-01';
10
+ // =============================================================================
11
+ // API Functions
12
+ // =============================================================================
13
+ /**
14
+ * Generate text using Anthropic Claude API
15
+ */
16
+ async function generateText(apiKey, prompt, options = {}) {
17
+ const { model = 'claude-sonnet-4-20250514', maxTokens = 4000 } = options;
18
+ const response = await fetchWithRetry(`${ANTHROPIC_API_BASE}/messages`, {
19
+ method: 'POST',
20
+ headers: {
21
+ 'Content-Type': 'application/json',
22
+ 'x-api-key': apiKey,
23
+ 'anthropic-version': ANTHROPIC_VERSION,
24
+ },
25
+ body: JSON.stringify({
26
+ model,
27
+ max_tokens: maxTokens,
28
+ messages: [
29
+ {
30
+ role: 'user',
31
+ content: prompt,
32
+ },
33
+ ],
34
+ }),
35
+ }, { maxRetries: 3, backoffMs: 1000, timeoutMs: 120000 });
36
+ if (!response.ok) {
37
+ const errorText = await response.text();
38
+ throw new Error(`Anthropic API error: ${response.status} - ${errorText}`);
39
+ }
40
+ const data = await response.json();
41
+ return data.content[0]?.text || '';
42
+ }
4
43
  // Re-export schemas and types for convenience
5
44
  export { SocialAiAnalyzeInputSchema, SocialAiAnalyzeOutputSchema, } from '../schemas/ai.js';
6
45
  /**
@@ -9,8 +48,10 @@ export { SocialAiAnalyzeInputSchema, SocialAiAnalyzeOutputSchema, } from '../sch
9
48
  * Uses Claude to analyze social media posts for relevance, sentiment,
10
49
  * complaint detection, and urgency. Batches posts to stay within context limits.
11
50
  *
12
- * Requires `context.services.anthropic` to be provided by the host application.
13
- * Optionally uses `context.services.analyzedPosts` to store results.
51
+ * Requires `context.credentials.anthropic.apiKey` to be provided.
52
+ *
53
+ * Note: This node analyzes posts but does NOT store results.
54
+ * Storage is the responsibility of the host application.
14
55
  *
15
56
  * @example
16
57
  * ```typescript
@@ -36,11 +77,12 @@ export const socialAiAnalyzeNode = defineNode({
36
77
  },
37
78
  executor: async (input, context) => {
38
79
  try {
39
- // Require Anthropic service
40
- if (!context.services?.anthropic) {
80
+ // Check for API key
81
+ const apiKey = context.credentials?.anthropic?.apiKey;
82
+ if (!apiKey) {
41
83
  return {
42
84
  success: false,
43
- error: 'Anthropic service not configured. Please provide context.services.anthropic.',
85
+ error: 'Anthropic API key not configured. Please provide context.credentials.anthropic.apiKey.',
44
86
  };
45
87
  }
46
88
  // Combine posts from all platforms
@@ -69,8 +111,7 @@ export const socialAiAnalyzeNode = defineNode({
69
111
  for (let i = 0; i < allPosts.length; i += ANALYSIS_BATCH_SIZE) {
70
112
  const batch = allPosts.slice(i, i + ANALYSIS_BATCH_SIZE);
71
113
  const prompt = buildAnalysisPrompt(input.topic, input.userIntent, batch);
72
- const responseText = await context.services.anthropic.generateText({
73
- prompt,
114
+ const responseText = await generateText(apiKey, prompt, {
74
115
  model: 'claude-sonnet-4-20250514',
75
116
  maxTokens: 4000,
76
117
  });
@@ -111,43 +152,6 @@ export const socialAiAnalyzeNode = defineNode({
111
152
  ? Math.round(allAnalyzedPosts.reduce((sum, p) => sum + p.relevanceScore, 0) /
112
153
  allAnalyzedPosts.length)
113
154
  : 0;
114
- // Store analyzed posts if service available
115
- if (context.services?.analyzedPosts && input.monitoringConfigId && allAnalyzedPosts.length > 0) {
116
- await context.services.analyzedPosts.storePosts({
117
- monitoringConfigId: input.monitoringConfigId,
118
- posts: allAnalyzedPosts.map(post => ({
119
- platform: post.platform,
120
- externalId: post.id,
121
- url: post.url,
122
- text: post.text,
123
- authorName: post.authorName,
124
- authorHandle: post.authorHandle,
125
- authorUrl: post.authorUrl,
126
- authorFollowers: post.authorFollowers,
127
- engagement: post.engagement,
128
- relevanceScore: post.relevanceScore,
129
- sentiment: post.sentiment,
130
- isComplaint: post.isComplaint,
131
- urgencyLevel: post.urgencyLevel,
132
- aiSummary: post.aiSummary,
133
- matchedKeywords: post.matchedKeywords,
134
- postedAt: new Date(post.postedAt),
135
- })),
136
- });
137
- }
138
- // Optional: send notification if service available
139
- if (context.services?.notifications && allAnalyzedPosts.length > 0) {
140
- await context.services.notifications.send({
141
- userId: context.userId,
142
- title: 'Social Posts Analyzed',
143
- message: `Analyzed ${allAnalyzedPosts.length} posts (${highPriorityPosts.length} high priority)`,
144
- data: {
145
- totalAnalyzed: allAnalyzedPosts.length,
146
- highPriority: highPriorityPosts.length,
147
- complaints: complaints.length,
148
- },
149
- });
150
- }
151
155
  return {
152
156
  success: true,
153
157
  output: {
@@ -1 +1 @@
1
- {"version":3,"file":"analyze-posts.js","sourceRoot":"","sources":["../../src/ai/analyze-posts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analyze-posts.js","sourceRoot":"","sources":["../../src/ai/analyze-posts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,GAG5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AAErC,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,MAAM,kBAAkB,GAAG,8BAA8B,CAAC;AAC1D,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAavC,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF;;GAEG;AACH,KAAK,UAAU,YAAY,CACzB,MAAc,EACd,MAAc,EACd,UAGI,EAAE;IAEN,MAAM,EAAE,KAAK,GAAG,0BAA0B,EAAE,SAAS,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAEzE,MAAM,QAAQ,GAAG,MAAM,cAAc,CACnC,GAAG,kBAAkB,WAAW,EAChC;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,WAAW,EAAE,MAAM;YACnB,mBAAmB,EAAE,iBAAiB;SACvC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK;YACL,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,MAAM;iBAChB;aACF;SACF,CAAC;KACH,EACD,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CACtD,CAAC;IAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,IAAI,GAA8B,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC9D,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;AACrC,CAAC;AAED,8CAA8C;AAC9C,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,GAK5B,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAC;IAC5C,IAAI,EAAE,mBAAmB;IACzB,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,2EAA2E;IACxF,QAAQ,EAAE,QAAQ;IAClB,WAAW,EAAE,0BAA0B;IACvC,YAAY,EAAE,2BAA2B;IACzC,iBAAiB,EAAE,EAAE;IACrB,YAAY,EAAE;QACZ,aAAa,EAAE,IAAI;QACnB,mBAAmB,EAAE,IAAI;KAC1B;IAED,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACjC,IAAI,CAAC;YACH,oBAAoB;YACpB,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC;YACtD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,wFAAwF;iBAChG,CAAC;YACJ,CAAC;YAED,mCAAmC;YACnC,MAAM,QAAQ,GAAiB;gBAC7B,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC;gBAC7B,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;gBAC5B,GAAG,CAAC,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC;gBAC9B,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;aACvB,CAAC;YAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE;wBACN,aAAa,EAAE,EAAE;wBACjB,iBAAiB,EAAE,EAAE;wBACrB,UAAU,EAAE,EAAE;wBACd,aAAa,EAAE,CAAC;wBAChB,iBAAiB,EAAE,CAAC;wBACpB,cAAc,EAAE,CAAC;wBACjB,gBAAgB,EAAE,CAAC;qBACpB;iBACF,CAAC;YACJ,CAAC;YAED,yDAAyD;YACzD,MAAM,gBAAgB,GAAmB,EAAE,CAAC;YAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,mBAAmB,EAAE,CAAC;gBAC9D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,mBAAmB,CAAC,CAAC;gBAEzD,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;gBAEzE,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE;oBACtD,KAAK,EAAE,0BAA0B;oBACjC,SAAS,EAAE,IAAI;iBAChB,CAAC,CAAC;gBAEH,2BAA2B;gBAC3B,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBACpD,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAQtC,CAAC;oBAEH,yCAAyC;oBACzC,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;wBAChC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAC,CAAC;wBAC7D,IAAI,YAAY,IAAI,QAAQ,CAAC,cAAc,IAAI,mBAAmB,EAAE,CAAC;4BACnE,gBAAgB,CAAC,IAAI,CAAC;gCACpB,GAAG,YAAY;gCACf,cAAc,EAAE,QAAQ,CAAC,cAAc;gCACvC,SAAS,EAAE,kBAAkB,CAAC,QAAQ,CAAC,SAAS,CAAC;gCACjD,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;gCAC1C,YAAY,EAAE,gBAAgB,CAAC,QAAQ,CAAC,YAAY,CAAC;gCACrD,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,EAAE;gCACnC,eAAe,EAAE,QAAQ,CAAC,eAAe,IAAI,EAAE;6BAChD,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;YACH,CAAC;YAED,oCAAoC;YACpC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC;YAErE,sCAAsC;YACtC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,MAAM,CAC/C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,MAAM,IAAI,CAAC,CAAC,cAAc,IAAI,EAAE,CAC3D,CAAC;YACF,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;YAEjE,8BAA8B;YAC9B,MAAM,gBAAgB,GACpB,gBAAgB,CAAC,MAAM,GAAG,CAAC;gBACzB,CAAC,CAAC,IAAI,CAAC,KAAK,CACR,gBAAgB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;oBAC5D,gBAAgB,CAAC,MAAM,CAC1B;gBACH,CAAC,CAAC,CAAC,CAAC;YAER,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE;oBACN,aAAa,EAAE,gBAAgB;oBAC/B,iBAAiB;oBACjB,UAAU;oBACV,aAAa,EAAE,gBAAgB,CAAC,MAAM;oBACtC,iBAAiB,EAAE,iBAAiB,CAAC,MAAM;oBAC3C,cAAc,EAAE,UAAU,CAAC,MAAM;oBACjC,gBAAgB;iBACjB;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,yBAAyB;aAC1E,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
@@ -3,8 +3,10 @@ export { DraftEmailsInputSchema, DraftEmailsOutputSchema, DraftEmailInfoSchema,
3
3
  * Draft Emails Node
4
4
  *
5
5
  * Uses Claude to generate personalized email drafts for each contact.
6
- * Requires `context.services.anthropic` for AI generation and
7
- * `context.services.emailDrafts` for storing drafts.
6
+ * Requires `context.credentials.anthropic.apiKey` to be provided.
7
+ *
8
+ * Note: This node generates email content but does NOT store drafts.
9
+ * Storage is the responsibility of the host application.
8
10
  *
9
11
  * @example
10
12
  * ```typescript
@@ -1 +1 @@
1
- {"version":3,"file":"draft-emails.d.ts","sourceRoot":"","sources":["../../src/ai/draft-emails.ts"],"names":[],"mappings":"AAeA,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,oBAAoB,EACpB,aAAa,EACb,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,OAAO,GACb,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmI1B,CAAC"}
1
+ {"version":3,"file":"draft-emails.d.ts","sourceRoot":"","sources":["../../src/ai/draft-emails.ts"],"names":[],"mappings":"AAmFA,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,oBAAoB,EACpB,aAAa,EACb,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,OAAO,GACb,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsG1B,CAAC"}
@@ -1,14 +1,55 @@
1
1
  import { defineNode } from '@jam-nodes/core';
2
+ import { fetchWithRetry, sleep } from '../utils/http.js';
2
3
  import { DraftEmailsInputSchema, DraftEmailsOutputSchema, } from '../schemas/ai.js';
3
4
  import { buildEmailPrompt, buildSubjectPrompt, cleanEmailBody, cleanSubjectLine, } from '../prompts/draft-emails.js';
5
+ // =============================================================================
6
+ // Constants
7
+ // =============================================================================
8
+ const ANTHROPIC_API_BASE = 'https://api.anthropic.com/v1';
9
+ const ANTHROPIC_VERSION = '2023-06-01';
10
+ // =============================================================================
11
+ // API Functions
12
+ // =============================================================================
13
+ /**
14
+ * Generate text using Anthropic Claude API
15
+ */
16
+ async function generateText(apiKey, prompt, options = {}) {
17
+ const { model = 'claude-sonnet-4-20250514', maxTokens = 1000 } = options;
18
+ const response = await fetchWithRetry(`${ANTHROPIC_API_BASE}/messages`, {
19
+ method: 'POST',
20
+ headers: {
21
+ 'Content-Type': 'application/json',
22
+ 'x-api-key': apiKey,
23
+ 'anthropic-version': ANTHROPIC_VERSION,
24
+ },
25
+ body: JSON.stringify({
26
+ model,
27
+ max_tokens: maxTokens,
28
+ messages: [
29
+ {
30
+ role: 'user',
31
+ content: prompt,
32
+ },
33
+ ],
34
+ }),
35
+ }, { maxRetries: 3, backoffMs: 1000, timeoutMs: 60000 });
36
+ if (!response.ok) {
37
+ const errorText = await response.text();
38
+ throw new Error(`Anthropic API error: ${response.status} - ${errorText}`);
39
+ }
40
+ const data = await response.json();
41
+ return data.content[0]?.text || '';
42
+ }
4
43
  // Re-export schemas for convenience
5
44
  export { DraftEmailsInputSchema, DraftEmailsOutputSchema, DraftEmailInfoSchema, ContactSchema, } from '../schemas/ai.js';
6
45
  /**
7
46
  * Draft Emails Node
8
47
  *
9
48
  * Uses Claude to generate personalized email drafts for each contact.
10
- * Requires `context.services.anthropic` for AI generation and
11
- * `context.services.emailDrafts` for storing drafts.
49
+ * Requires `context.credentials.anthropic.apiKey` to be provided.
50
+ *
51
+ * Note: This node generates email content but does NOT store drafts.
52
+ * Storage is the responsibility of the host application.
12
53
  *
13
54
  * @example
14
55
  * ```typescript
@@ -32,24 +73,12 @@ export const draftEmailsNode = defineNode({
32
73
  },
33
74
  executor: async (input, context) => {
34
75
  try {
35
- // Require Anthropic service
36
- if (!context.services?.anthropic) {
37
- return {
38
- success: false,
39
- error: 'Anthropic service not configured. Please provide context.services.anthropic.',
40
- };
41
- }
42
- // Require email drafts service
43
- if (!context.services?.emailDrafts) {
76
+ // Check for API key
77
+ const apiKey = context.credentials?.anthropic?.apiKey;
78
+ if (!apiKey) {
44
79
  return {
45
80
  success: false,
46
- error: 'Email drafts service not configured. Please provide context.services.emailDrafts.',
47
- };
48
- }
49
- if (!context.campaignId) {
50
- return {
51
- success: false,
52
- error: 'Campaign ID is required in execution context',
81
+ error: 'Anthropic API key not configured. Please provide context.credentials.anthropic.apiKey.',
53
82
  };
54
83
  }
55
84
  // Get sender name from workflow variables
@@ -57,11 +86,11 @@ export const draftEmailsNode = defineNode({
57
86
  if (!senderName) {
58
87
  return {
59
88
  success: false,
60
- error: 'Please set your name in settings before creating email campaigns.',
89
+ error: 'Please set senderName in context.variables before creating email campaigns.',
61
90
  };
62
91
  }
63
92
  const emails = [];
64
- // Generate and save drafts for each contact
93
+ // Generate drafts for each contact
65
94
  for (const contact of input.contacts) {
66
95
  if (!contact.email) {
67
96
  continue;
@@ -69,8 +98,7 @@ export const draftEmailsNode = defineNode({
69
98
  try {
70
99
  // Generate personalized email body using prompt helper
71
100
  const emailPrompt = buildEmailPrompt(contact, input.productDescription, senderName, input.emailTemplate);
72
- const rawBody = await context.services.anthropic.generateText({
73
- prompt: emailPrompt,
101
+ const rawBody = await generateText(apiKey, emailPrompt, {
74
102
  model: 'claude-sonnet-4-20250514',
75
103
  maxTokens: 250,
76
104
  });
@@ -78,37 +106,24 @@ export const draftEmailsNode = defineNode({
78
106
  const emailBody = cleanEmailBody(rawBody);
79
107
  // Generate subject line
80
108
  const subjectPrompt = buildSubjectPrompt(contact, emailBody);
81
- const rawSubject = await context.services.anthropic.generateText({
82
- prompt: subjectPrompt,
109
+ const rawSubject = await generateText(apiKey, subjectPrompt, {
83
110
  model: 'claude-sonnet-4-20250514',
84
111
  maxTokens: 50,
85
112
  });
86
113
  // Clean up subject
87
114
  const emailSubject = cleanSubjectLine(rawSubject);
88
- // Save to database via service
89
- const savedEmail = await context.services.emailDrafts.createDraft({
90
- campaignId: context.campaignId,
91
- userId: context.userId,
115
+ emails.push({
116
+ id: `draft-${contact.id}-${Date.now()}`,
92
117
  toEmail: contact.email,
93
118
  toName: contact.name,
94
- toCompany: contact.company ?? undefined,
95
- toTitle: contact.title ?? undefined,
119
+ toCompany: contact.company || '',
120
+ toTitle: contact.title || '',
96
121
  subject: emailSubject,
97
122
  body: emailBody,
98
- contactId: contact.id,
99
- });
100
- emails.push({
101
- id: savedEmail.id,
102
- toEmail: savedEmail.toEmail,
103
- toName: savedEmail.toName || '',
104
- toCompany: savedEmail.toCompany || '',
105
- toTitle: savedEmail.toTitle || '',
106
- subject: savedEmail.subject,
107
- body: savedEmail.body,
108
- status: savedEmail.status,
123
+ status: 'draft',
109
124
  });
110
125
  // Small delay between API calls to avoid rate limiting
111
- await new Promise(resolve => setTimeout(resolve, 200));
126
+ await sleep(200);
112
127
  }
113
128
  catch {
114
129
  // Continue with other contacts even if one fails
@@ -1 +1 @@
1
- {"version":3,"file":"draft-emails.js","sourceRoot":"","sources":["../../src/ai/draft-emails.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"draft-emails.js","sourceRoot":"","sources":["../../src/ai/draft-emails.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ export { SocialKeywordGeneratorInputSchema, SocialKeywordGeneratorOutputSchema,
6
6
  * natural language topic description. Outputs ready-to-use search queries
7
7
  * for Twitter, Reddit, and LinkedIn.
8
8
  *
9
- * Requires `context.services.anthropic` to be provided by the host application.
9
+ * Requires `context.credentials.anthropic.apiKey` to be provided.
10
10
  *
11
11
  * @example
12
12
  * ```typescript
@@ -1 +1 @@
1
- {"version":3,"file":"keyword-generator.d.ts","sourceRoot":"","sources":["../../src/ai/keyword-generator.ts"],"names":[],"mappings":"AASA,OAAO,EACL,iCAAiC,EACjC,kCAAkC,EAClC,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,GAClC,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;EAmHrC,CAAC"}
1
+ {"version":3,"file":"keyword-generator.d.ts","sourceRoot":"","sources":["../../src/ai/keyword-generator.ts"],"names":[],"mappings":"AA6EA,OAAO,EACL,iCAAiC,EACjC,kCAAkC,EAClC,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,GAClC,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;EAoGrC,CAAC"}
@@ -1,6 +1,45 @@
1
1
  import { defineNode } from '@jam-nodes/core';
2
+ import { fetchWithRetry } from '../utils/http.js';
2
3
  import { SocialKeywordGeneratorInputSchema, SocialKeywordGeneratorOutputSchema, } from '../schemas/ai.js';
3
4
  import { buildKeywordPrompt } from '../prompts/keyword-generator.js';
5
+ // =============================================================================
6
+ // Constants
7
+ // =============================================================================
8
+ const ANTHROPIC_API_BASE = 'https://api.anthropic.com/v1';
9
+ const ANTHROPIC_VERSION = '2023-06-01';
10
+ // =============================================================================
11
+ // API Functions
12
+ // =============================================================================
13
+ /**
14
+ * Generate text using Anthropic Claude API
15
+ */
16
+ async function generateText(apiKey, prompt, options = {}) {
17
+ const { model = 'claude-sonnet-4-20250514', maxTokens = 2000 } = options;
18
+ const response = await fetchWithRetry(`${ANTHROPIC_API_BASE}/messages`, {
19
+ method: 'POST',
20
+ headers: {
21
+ 'Content-Type': 'application/json',
22
+ 'x-api-key': apiKey,
23
+ 'anthropic-version': ANTHROPIC_VERSION,
24
+ },
25
+ body: JSON.stringify({
26
+ model,
27
+ max_tokens: maxTokens,
28
+ messages: [
29
+ {
30
+ role: 'user',
31
+ content: prompt,
32
+ },
33
+ ],
34
+ }),
35
+ }, { maxRetries: 3, backoffMs: 1000, timeoutMs: 60000 });
36
+ if (!response.ok) {
37
+ const errorText = await response.text();
38
+ throw new Error(`Anthropic API error: ${response.status} - ${errorText}`);
39
+ }
40
+ const data = await response.json();
41
+ return data.content[0]?.text || '';
42
+ }
4
43
  // Re-export schemas for convenience
5
44
  export { SocialKeywordGeneratorInputSchema, SocialKeywordGeneratorOutputSchema, } from '../schemas/ai.js';
6
45
  /**
@@ -10,7 +49,7 @@ export { SocialKeywordGeneratorInputSchema, SocialKeywordGeneratorOutputSchema,
10
49
  * natural language topic description. Outputs ready-to-use search queries
11
50
  * for Twitter, Reddit, and LinkedIn.
12
51
  *
13
- * Requires `context.services.anthropic` to be provided by the host application.
52
+ * Requires `context.credentials.anthropic.apiKey` to be provided.
14
53
  *
15
54
  * @example
16
55
  * ```typescript
@@ -33,18 +72,18 @@ export const socialKeywordGeneratorNode = defineNode({
33
72
  },
34
73
  executor: async (input, context) => {
35
74
  try {
36
- // Require Anthropic service
37
- if (!context.services?.anthropic) {
75
+ // Check for API key
76
+ const apiKey = context.credentials?.anthropic?.apiKey;
77
+ if (!apiKey) {
38
78
  return {
39
79
  success: false,
40
- error: 'Anthropic service not configured. Please provide context.services.anthropic.',
80
+ error: 'Anthropic API key not configured. Please provide context.credentials.anthropic.apiKey.',
41
81
  };
42
82
  }
43
83
  // Build prompt using helper
44
84
  const prompt = buildKeywordPrompt(input.topic, input.userKeywords);
45
85
  // Call Claude to generate keywords
46
- const responseText = await context.services.anthropic.generateText({
47
- prompt,
86
+ const responseText = await generateText(apiKey, prompt, {
48
87
  model: 'claude-sonnet-4-20250514',
49
88
  maxTokens: 2000,
50
89
  });
@@ -94,20 +133,6 @@ export const socialKeywordGeneratorNode = defineNode({
94
133
  },
95
134
  allKeywords,
96
135
  };
97
- // Optional: send notification if service available
98
- if (context.services?.notifications) {
99
- await context.services.notifications.send({
100
- userId: context.userId,
101
- title: 'Keywords Generated',
102
- message: `Generated ${allKeywords.length} keywords for "${input.topic}"`,
103
- data: {
104
- totalKeywords: allKeywords.length,
105
- twitterKeywords: mergedTwitterKeywords.length,
106
- redditKeywords: mergedRedditKeywords.length,
107
- linkedinKeywords: mergedLinkedInKeywords.length,
108
- },
109
- });
110
- }
111
136
  return {
112
137
  success: true,
113
138
  output,
@@ -1 +1 @@
1
- {"version":3,"file":"keyword-generator.js","sourceRoot":"","sources":["../../src/ai/keyword-generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"keyword-generator.js","sourceRoot":"","sources":["../../src/ai/keyword-generator.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -88,9 +88,26 @@ export declare const builtInNodes: (import("@jam-nodes/core").NodeDefinition<{
88
88
  lang?: string | undefined;
89
89
  sinceDays?: number | undefined;
90
90
  }, {
91
- posts: import("./integrations/index.js").TwitterPost[];
91
+ posts: {
92
+ url: string;
93
+ id: string;
94
+ platform: "twitter";
95
+ text: string;
96
+ authorName: string;
97
+ authorHandle: string;
98
+ authorUrl: string;
99
+ engagement: {
100
+ comments: number;
101
+ likes: number;
102
+ shares: number;
103
+ views: number;
104
+ };
105
+ postedAt: string;
106
+ authorFollowers: number;
107
+ }[];
92
108
  totalFound: number;
93
109
  hasMore: boolean;
110
+ cursor?: string | undefined;
94
111
  }> | import("@jam-nodes/core").NodeDefinition<{
95
112
  keywords: string[];
96
113
  timeFilter?: string | undefined;
@@ -181,18 +198,18 @@ export declare const builtInNodes: (import("@jam-nodes/core").NodeDefinition<{
181
198
  industryTagIds?: string[] | undefined;
182
199
  departments?: string[] | undefined;
183
200
  }, {
184
- totalFound: number;
185
201
  contacts: {
186
202
  id: string;
187
- company: string;
188
203
  name: string;
204
+ firstName?: string;
205
+ lastName?: string;
189
206
  email: string;
190
- title?: string | undefined;
191
- firstName?: string | undefined;
192
- lastName?: string | undefined;
193
- linkedinUrl?: string | null | undefined;
194
- location?: string | null | undefined;
207
+ title?: string;
208
+ company: string;
209
+ linkedinUrl?: string | null;
210
+ location?: string | null;
195
211
  }[];
212
+ totalFound: number;
196
213
  }> | import("@jam-nodes/core").NodeDefinition<{
197
214
  topic: string;
198
215
  userKeywords?: string[] | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -113,7 +113,7 @@ export type SearchContactsOutput = z.infer<typeof SearchContactsOutputSchema>;
113
113
  * Search Contacts Node
114
114
  *
115
115
  * Searches for contacts using Apollo.io API with email enrichment.
116
- * Requires `context.services.apollo` to be provided by the host application.
116
+ * Requires `context.credentials.apollo.apiKey` to be provided.
117
117
  *
118
118
  * Process:
119
119
  * 1. Search Apollo for contacts matching criteria
@@ -142,17 +142,17 @@ export declare const searchContactsNode: import("@jam-nodes/core").NodeDefinitio
142
142
  industryTagIds?: string[] | undefined;
143
143
  departments?: string[] | undefined;
144
144
  }, {
145
- totalFound: number;
146
145
  contacts: {
147
146
  id: string;
148
- company: string;
149
147
  name: string;
148
+ firstName?: string;
149
+ lastName?: string;
150
150
  email: string;
151
- title?: string | undefined;
152
- firstName?: string | undefined;
153
- lastName?: string | undefined;
154
- linkedinUrl?: string | null | undefined;
155
- location?: string | null | undefined;
151
+ title?: string;
152
+ company: string;
153
+ linkedinUrl?: string | null;
154
+ location?: string | null;
156
155
  }[];
156
+ totalFound: number;
157
157
  }>;
158
158
  //# sourceMappingURL=search-contacts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"search-contacts.d.ts","sourceRoot":"","sources":["../../../src/integrations/apollo/search-contacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,yBAAyB;IACpC,+BAA+B;;IAE/B,0CAA0C;;IAE1C,6BAA6B;;IAE7B,4DAA4D;;IAE5D,0BAA0B;;IAE1B,2CAA2C;;IAE3C,iCAAiC;;IAEjC,2DAA2D;;IAE3D,uCAAuC;;IAEvC,uBAAuB;;IAEvB,iDAAiD;;;;;;;;;;;;;;;;;;;;;;;;;;EAEjD,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAarC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAM9E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;EA4G7B,CAAC"}
1
+ {"version":3,"file":"search-contacts.d.ts","sourceRoot":"","sources":["../../../src/integrations/apollo/search-contacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAyDxB,eAAO,MAAM,yBAAyB;IACpC,+BAA+B;;IAE/B,0CAA0C;;IAE1C,6BAA6B;;IAE7B,4DAA4D;;IAE5D,0BAA0B;;IAE1B,2CAA2C;;IAE3C,iCAAiC;;IAEjC,2DAA2D;;IAE3D,uCAAuC;;IAEvC,uBAAuB;;IAEvB,iDAAiD;;;;;;;;;;;;;;;;;;;;;;;;;;EAEjD,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAarC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAyH9E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;YAoDnB,MAAM;cACJ,MAAM;oBACA,MAAM;mBACP,MAAM;eACV,MAAM;gBACL,MAAM;iBACL,MAAM;sBACD,MAAM,GAAG,IAAI;mBAChB,MAAM,GAAG,IAAI;;;EAgD9B,CAAC"}