@juspay/neurolink 8.38.0 → 8.40.0

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 (35) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +3 -0
  3. package/dist/core/conversationMemoryFactory.d.ts +2 -2
  4. package/dist/core/conversationMemoryFactory.js +2 -2
  5. package/dist/core/conversationMemoryInitializer.d.ts +2 -1
  6. package/dist/core/conversationMemoryInitializer.js +2 -2
  7. package/dist/core/redisConversationMemoryManager.d.ts +6 -1
  8. package/dist/core/redisConversationMemoryManager.js +19 -7
  9. package/dist/features/ppt/index.d.ts +1 -0
  10. package/dist/features/ppt/index.js +2 -0
  11. package/dist/features/ppt/slideGenerator.d.ts +96 -0
  12. package/dist/features/ppt/slideGenerator.js +376 -0
  13. package/dist/features/ppt/slideRenderers.d.ts +182 -0
  14. package/dist/features/ppt/slideRenderers.js +992 -0
  15. package/dist/features/ppt/types.d.ts +1 -1
  16. package/dist/lib/core/conversationMemoryFactory.d.ts +2 -2
  17. package/dist/lib/core/conversationMemoryFactory.js +2 -2
  18. package/dist/lib/core/conversationMemoryInitializer.d.ts +2 -1
  19. package/dist/lib/core/conversationMemoryInitializer.js +2 -2
  20. package/dist/lib/core/redisConversationMemoryManager.d.ts +6 -1
  21. package/dist/lib/core/redisConversationMemoryManager.js +19 -7
  22. package/dist/lib/features/ppt/index.d.ts +1 -0
  23. package/dist/lib/features/ppt/index.js +2 -0
  24. package/dist/lib/features/ppt/slideGenerator.d.ts +96 -0
  25. package/dist/lib/features/ppt/slideGenerator.js +377 -0
  26. package/dist/lib/features/ppt/slideRenderers.d.ts +182 -0
  27. package/dist/lib/features/ppt/slideRenderers.js +993 -0
  28. package/dist/lib/features/ppt/types.d.ts +1 -1
  29. package/dist/lib/neurolink.js +1 -1
  30. package/dist/lib/types/common.d.ts +1 -0
  31. package/dist/lib/types/pptTypes.d.ts +217 -0
  32. package/dist/neurolink.js +1 -1
  33. package/dist/types/common.d.ts +1 -0
  34. package/dist/types/pptTypes.d.ts +217 -0
  35. package/package.json +2 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## [8.40.0](https://github.com/juspay/neurolink/compare/v8.39.0...v8.40.0) (2026-01-28)
2
+
3
+ ### Features
4
+
5
+ - **(events):** Emit event when title generation is finished ([aab4a1f](https://github.com/juspay/neurolink/commit/aab4a1f9d336a9b1fa20a5b6196155ab1d8673ed))
6
+
7
+ ## [8.39.0](https://github.com/juspay/neurolink/compare/v8.38.0...v8.39.0) (2026-01-27)
8
+
9
+ ### Features
10
+
11
+ - **(ppt):** Implement SlideGenerator() for PPT Gen ([c804e97](https://github.com/juspay/neurolink/commit/c804e97ceda8d90bfc5ee5b976b1a8b3864f86ef))
12
+
1
13
  ## [8.38.0](https://github.com/juspay/neurolink/compare/v8.37.0...v8.38.0) (2026-01-23)
2
14
 
3
15
  ### Features
package/README.md CHANGED
@@ -37,10 +37,13 @@ Extracted from production systems at Juspay and battle-tested at enterprise scal
37
37
 
38
38
  | Feature | Version | Description | Guide |
39
39
  | ---------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ |
40
+ | **Title Generation Events** | v8.38.0 | Emit `conversation:titleGenerated` event when conversation title is generated. Supports custom title prompts via `NEUROLINK_TITLE_PROMPT`. | [Conversation Memory Guide](docs/conversation-memory.md) |
40
41
  | **Video Generation with Veo** | v8.32.0 | Video generation using Veo 3.1 (`veo-3.1`). Realistic video generation with many parameter options | [Video Generation Guide](docs/features/video-generation.md) |
41
42
  | **Image Generation with Gemini** | v8.31.0 | Native image generation using Gemini 2.0 Flash Experimental (`imagen-3.0-generate-002`). High-quality image synthesis directly from Google AI. | [Image Generation Guide](docs/image-generation-streaming.md) |
42
43
  | **HTTP/Streamable HTTP Transport** | v8.29.0 | Connect to remote MCP servers via HTTP with authentication headers, automatic retry with exponential backoff, and configurable rate limiting. | [HTTP Transport Guide](docs/mcp-http-transport.md) |
43
44
 
45
+ - **Title Generation Events** – Emit real-time events when conversation titles are auto-generated. Listen to `conversation:titleGenerated` for session tracking. → [Conversation Memory Guide](docs/conversation-memory.md#title-generation-events)
46
+ - **Custom Title Prompts** – Customize conversation title generation with `NEUROLINK_TITLE_PROMPT` environment variable. Use `${userMessage}` placeholder for dynamic prompts. → [Conversation Memory Guide](docs/conversation-memory.md#customizing-the-title-prompt)
44
47
  - **Video Generation** – Transform images into 8-second videos with synchronized audio using Google Veo 3.1 via Vertex AI. Supports 720p/1080p resolutions, portrait/landscape aspect ratios. → [Video Generation Guide](docs/features/video-generation.md)
45
48
  - **Image Generation** – Generate images from text prompts using Gemini models via Vertex AI or Google AI Studio. Supports streaming mode with automatic file saving. → [Image Generation Guide](docs/IMAGE-GENERATION-STREAMING.md)
46
49
  - **HTTP/Streamable HTTP Transport for MCP** – Connect to remote MCP servers via HTTP with authentication headers, retry logic, and rate limiting. → [HTTP Transport Guide](docs/MCP-HTTP-TRANSPORT.md)
@@ -3,13 +3,13 @@
3
3
  * Creates appropriate conversation memory manager based on configuration
4
4
  */
5
5
  import type { ConversationMemoryConfig, RedisStorageConfig } from "../types/conversation.js";
6
- import type { StorageType } from "../types/common.js";
6
+ import type { StorageType, TypedEventEmitter, NeuroLinkEvents } from "../types/common.js";
7
7
  import { ConversationMemoryManager } from "./conversationMemoryManager.js";
8
8
  import { RedisConversationMemoryManager } from "./redisConversationMemoryManager.js";
9
9
  /**
10
10
  * Creates a conversation memory manager based on configuration
11
11
  */
12
- export declare function createConversationMemoryManager(config: ConversationMemoryConfig, storageType?: StorageType, redisConfig?: RedisStorageConfig): ConversationMemoryManager | RedisConversationMemoryManager;
12
+ export declare function createConversationMemoryManager(config: ConversationMemoryConfig, storageType?: StorageType, redisConfig?: RedisStorageConfig, eventEmitter?: TypedEventEmitter<NeuroLinkEvents>): ConversationMemoryManager | RedisConversationMemoryManager;
13
13
  /**
14
14
  * Get storage type from environment variable or configuration
15
15
  */
@@ -8,7 +8,7 @@ import { logger } from "../utils/logger.js";
8
8
  /**
9
9
  * Creates a conversation memory manager based on configuration
10
10
  */
11
- export function createConversationMemoryManager(config, storageType = "memory", redisConfig) {
11
+ export function createConversationMemoryManager(config, storageType = "memory", redisConfig, eventEmitter) {
12
12
  logger.debug("[conversationMemoryFactory] Creating conversation memory manager", {
13
13
  storageType,
14
14
  config: {
@@ -38,7 +38,7 @@ export function createConversationMemoryManager(config, storageType = "memory",
38
38
  ttl: redisConfig?.ttl || 86400,
39
39
  hasConnectionOptions: !!redisConfig?.connectionOptions,
40
40
  });
41
- const redisManager = new RedisConversationMemoryManager(config, redisConfig);
41
+ const redisManager = new RedisConversationMemoryManager(config, redisConfig, eventEmitter);
42
42
  logger.debug("[conversationMemoryFactory] Redis conversation manager created successfully", {
43
43
  managerType: redisManager.constructor.name,
44
44
  config: {
@@ -5,10 +5,11 @@
5
5
  import type { ConversationMemoryConfig } from "../types/conversation.js";
6
6
  import type { ConversationMemoryManager } from "./conversationMemoryManager.js";
7
7
  import type { RedisConversationMemoryManager } from "./redisConversationMemoryManager.js";
8
+ import type { TypedEventEmitter, NeuroLinkEvents } from "../types/common.js";
8
9
  /**
9
10
  * Initialize conversation memory for NeuroLink
10
11
  * This function decides whether to use in-memory or Redis storage
11
12
  */
12
13
  export declare function initializeConversationMemory(config?: {
13
14
  conversationMemory?: Partial<ConversationMemoryConfig>;
14
- }): Promise<ConversationMemoryManager | RedisConversationMemoryManager | null>;
15
+ }, eventEmitter?: TypedEventEmitter<NeuroLinkEvents>): Promise<ConversationMemoryManager | RedisConversationMemoryManager | null>;
@@ -9,7 +9,7 @@ import { logger } from "../utils/logger.js";
9
9
  * Initialize conversation memory for NeuroLink
10
10
  * This function decides whether to use in-memory or Redis storage
11
11
  */
12
- export async function initializeConversationMemory(config) {
12
+ export async function initializeConversationMemory(config, eventEmitter) {
13
13
  logger.debug("[conversationMemoryInitializer] Initialize conversation memory called", {
14
14
  hasConfig: !!config,
15
15
  hasMemoryConfig: !!config?.conversationMemory,
@@ -55,7 +55,7 @@ export async function initializeConversationMemory(config) {
55
55
  });
56
56
  // Create Redis-based conversation memory manager
57
57
  logger.debug("[conversationMemoryInitializer] Creating Redis conversation memory manager");
58
- const redisMemoryManager = createConversationMemoryManager(memoryConfig, "redis", redisConfig);
58
+ const redisMemoryManager = createConversationMemoryManager(memoryConfig, "redis", redisConfig, eventEmitter);
59
59
  logger.debug("[conversationMemoryInitializer] Checking Redis manager creation result", {
60
60
  managerType: redisMemoryManager?.constructor?.name || "unknown",
61
61
  isRedisType: redisMemoryManager?.constructor?.name ===
@@ -3,6 +3,7 @@
3
3
  * Redis-based implementation of conversation storage with same interface as ConversationMemoryManager
4
4
  */
5
5
  import type { ConversationMemoryConfig, ConversationMemoryStats, ChatMessage, RedisStorageConfig, SessionMetadata, RedisConversationObject, StoreConversationTurnOptions } from "../types/conversation.js";
6
+ import type { TypedEventEmitter, NeuroLinkEvents } from "../types/common.js";
6
7
  /**
7
8
  * Redis-based implementation of the ConversationMemoryManager
8
9
  * Uses the same interface but stores data in Redis
@@ -12,6 +13,10 @@ export declare class RedisConversationMemoryManager {
12
13
  private isInitialized;
13
14
  private redisConfig;
14
15
  private redisClient;
16
+ /**
17
+ * Event emitter for conversation memory events
18
+ */
19
+ private eventEmitter?;
15
20
  /**
16
21
  * Temporary storage for tool execution data to prevent race conditions
17
22
  * Key format: "${sessionId}:${userId}"
@@ -27,7 +32,7 @@ export declare class RedisConversationMemoryManager {
27
32
  * Key format: "${sessionId}:${userId}"
28
33
  */
29
34
  private summarizationInProgress;
30
- constructor(config: ConversationMemoryConfig, redisConfig?: RedisStorageConfig);
35
+ constructor(config: ConversationMemoryConfig, redisConfig?: RedisStorageConfig, eventEmitter?: TypedEventEmitter<NeuroLinkEvents>);
31
36
  /**
32
37
  * Initialize the memory manager with Redis connection
33
38
  */
@@ -19,6 +19,10 @@ export class RedisConversationMemoryManager {
19
19
  isInitialized = false;
20
20
  redisConfig;
21
21
  redisClient = null;
22
+ /**
23
+ * Event emitter for conversation memory events
24
+ */
25
+ eventEmitter;
22
26
  /**
23
27
  * Temporary storage for tool execution data to prevent race conditions
24
28
  * Key format: "${sessionId}:${userId}"
@@ -34,9 +38,10 @@ export class RedisConversationMemoryManager {
34
38
  * Key format: "${sessionId}:${userId}"
35
39
  */
36
40
  summarizationInProgress = new Set();
37
- constructor(config, redisConfig = {}) {
41
+ constructor(config, redisConfig = {}, eventEmitter) {
38
42
  this.config = config;
39
43
  this.redisConfig = getNormalizedConfig(redisConfig);
44
+ this.eventEmitter = eventEmitter;
40
45
  }
41
46
  /**
42
47
  * Initialize the memory manager with Redis connection
@@ -253,6 +258,14 @@ export class RedisConversationMemoryManager {
253
258
  if (this.redisConfig.ttl > 0) {
254
259
  await this.redisClient?.expire(updatedRedisKey, this.redisConfig.ttl);
255
260
  }
261
+ if (this.eventEmitter) {
262
+ this.eventEmitter.emit("conversation:titleGenerated", {
263
+ sessionId: options.sessionId,
264
+ userId: normalizedUserId,
265
+ title,
266
+ timestamp: Date.now(),
267
+ });
268
+ }
256
269
  }
257
270
  }
258
271
  catch (titleError) {
@@ -687,12 +700,11 @@ export class RedisConversationMemoryManager {
687
700
  const titleGenerator = new NeuroLink({
688
701
  conversationMemory: { enabled: false },
689
702
  });
690
- const titlePrompt = `Generate a clear, concise, and descriptive title (5–8 words maximum) for a conversation based on the following user message.
691
- The title must meaningfully reflect the topic or intent of the message.
692
- Do not output anything unrelated, vague, or generic.
693
- Do not say you cannot create a title. Always return a valid title.
694
-
695
- User message: "${userMessage}`;
703
+ const fallbackTitlePrompt = `\nYou are an expert at generating ultra-concise conversation titles.\n\nGenerate a single clear, descriptive title that accurately reflects the core topic of the user's message.\n\nStrict rules:\n- The title MUST be 18 characters or fewer (including spaces).\n- Output ONLY the title text (no quotes, no punctuation, no explanations).\n- Use natural words; abbreviations are allowed only if they improve clarity.\n- Avoid generic words like "issue", "problem", "help", or "discussion".\n- Do not say you cannot generate a title.\n- Always return exactly one valid title within the character limit.\n\nUser message:\n"${userMessage}"\n`;
704
+ const envPrompt = process.env.NEUROLINK_TITLE_PROMPT;
705
+ const titlePrompt = envPrompt
706
+ ? envPrompt.replace(/\$\{userMessage\}/g, userMessage)
707
+ : fallbackTitlePrompt;
696
708
  const result = await titleGenerator.generate({
697
709
  input: { text: titlePrompt },
698
710
  provider: this.config.summarizationProvider || "vertex",
@@ -14,3 +14,4 @@ export type { SlideType, SlideLayout, BulletPoint, SlideContent, SlideSchema, Co
14
14
  export { PPTError, PPT_ERROR_CODES, extractPPTContext, MIN_SLIDES, MAX_SLIDES, SLIDE_DIMENSIONS, isValidHexColor, normalizeHexColor, } from "./types.js";
15
15
  export { THEMES, getTheme, SLIDE_TYPE_TO_LAYOUT, SLIDE_TYPE_CATEGORIES, getLayoutForType, DIAGRAM_SLIDE_TYPES, IMAGE_SLIDE_TYPES, isDiagramSlideType, isImageSlideType, AUDIENCE_GUIDELINES, TONE_GUIDELINES, CONTENT_PLANNING_SYSTEM_PROMPT, buildContentPlanningPrompt, enhanceImagePrompt, MIN_PAGES, MAX_PAGES, MIN_TOPIC_LENGTH, MAX_TOPIC_LENGTH, VALID_THEMES, VALID_AUDIENCES, VALID_TONES, VALID_ASPECT_RATIOS, CONTENT_PLANNING_TIMEOUT_MS, IMAGE_GENERATION_TIMEOUT_MS, MAX_CONCURRENT_IMAGE_GENERATIONS, PPT_GENERATION_TIMEOUT_MS, } from "./constants.js";
16
16
  export { generateContentPlan, ensureTitleSlide, ensureThankYouSlide, postProcessPlan, } from "./contentPlanner.js";
17
+ export { SlideGenerator, createSlideGenerator, generateSlidesFromPlan, PptxGenJS, type SlideGeneratorConfig, type SlideGenerationBatchResult, type LogoConfig, type LogoPosition, } from "./slideGenerator.js";
@@ -23,3 +23,5 @@ MIN_PAGES, MAX_PAGES, MIN_TOPIC_LENGTH, MAX_TOPIC_LENGTH, VALID_THEMES, VALID_AU
23
23
  CONTENT_PLANNING_TIMEOUT_MS, IMAGE_GENERATION_TIMEOUT_MS, MAX_CONCURRENT_IMAGE_GENERATIONS, PPT_GENERATION_TIMEOUT_MS, } from "./constants.js";
24
24
  // Content Planner
25
25
  export { generateContentPlan, ensureTitleSlide, ensureThankYouSlide, postProcessPlan, } from "./contentPlanner.js";
26
+ // Slide Generator
27
+ export { SlideGenerator, createSlideGenerator, generateSlidesFromPlan, PptxGenJS, } from "./slideGenerator.js";
@@ -0,0 +1,96 @@
1
+ /**
2
+ * PPT Slide Generator
3
+ *
4
+ * Generates individual complete slides with content, images, and layout.
5
+ * Uses existing NeuroLink image generation capabilities and pptxgenjs for slide creation.
6
+ *
7
+ * Architecture:
8
+ * - Receives SlideSchema from ContentPlanner
9
+ * - Generates AI images for applicable slide types
10
+ * - Creates pptxgenjs slides with proper layouts
11
+ * - Returns CompleteSlide objects ready for assembly
12
+ *
13
+ * @module presentation/slideGenerator
14
+ */
15
+ import PptxGenJS from "pptxgenjs";
16
+ import type { SlideSchema, CompleteSlide, PresentationTheme, AspectRatioOption, PptxSlide, PptxPresentation } from "./types.js";
17
+ import { NeuroLink } from "../../neurolink.js";
18
+ /**
19
+ * Logo position options for slides
20
+ */
21
+ export type LogoPosition = "top-left" | "top-right" | "bottom-left" | "bottom-right" | "title-only";
22
+ /**
23
+ * Logo configuration options
24
+ */
25
+ export type LogoConfig = {
26
+ /** Logo data - Buffer, base64 string, data URI, or file path */
27
+ data: Buffer | string;
28
+ /** Position on slides (default: "bottom-right") */
29
+ position?: LogoPosition;
30
+ /** Width in inches (default: 1) */
31
+ width?: number;
32
+ /** Height in inches (default: 0.4) */
33
+ height?: number;
34
+ /** Show on all slides or specific types (default: "all-slides") */
35
+ showOn?: "all-slides" | "title-only" | "title-and-closing";
36
+ };
37
+ /**
38
+ * Configuration for slide generation
39
+ */
40
+ export type SlideGeneratorConfig = {
41
+ /** Theme name or custom theme */
42
+ theme: string | PresentationTheme;
43
+ /** Whether to generate AI images */
44
+ includeImages: boolean;
45
+ /** Aspect ratio for slides */
46
+ aspectRatio: AspectRatioOption;
47
+ /** Provider for image generation */
48
+ provider?: string;
49
+ /** Model for image generation */
50
+ imageModel?: string;
51
+ /** Logo configuration */
52
+ logo?: Buffer | string | LogoConfig;
53
+ /** NeuroLink instance for image generation */
54
+ neurolink?: NeuroLink;
55
+ };
56
+ /**
57
+ * Result from generating a batch of slides
58
+ */
59
+ export type SlideGenerationBatchResult = {
60
+ slides: CompleteSlide[];
61
+ totalImages: number;
62
+ failedImages: number;
63
+ generationTime: number;
64
+ };
65
+ /**
66
+ * Generates individual slides with content, images, and proper layouts
67
+ */
68
+ export declare class SlideGenerator {
69
+ private theme;
70
+ private config;
71
+ private neurolink;
72
+ private imageLimit;
73
+ constructor(config: SlideGeneratorConfig);
74
+ /**
75
+ * Generate a single complete slide
76
+ */
77
+ generateSlide(slideSchema: SlideSchema): Promise<CompleteSlide>;
78
+ /**
79
+ * Generate multiple slides in parallel (with concurrency limit)
80
+ */
81
+ generateSlides(schemas: SlideSchema[]): Promise<SlideGenerationBatchResult>;
82
+ /**
83
+ * Render a CompleteSlide to a pptxgenjs slide
84
+ */
85
+ renderSlide(ppt: PptxPresentation, completeSlide: CompleteSlide, slideNumber: number, totalSlides: number): PptxSlide;
86
+ private generateImage;
87
+ private applyBackground;
88
+ private applyLayout;
89
+ private getLogoConfig;
90
+ private getLogoDataUri;
91
+ private addLogo;
92
+ private addSlideNumber;
93
+ }
94
+ export { PptxGenJS };
95
+ export declare function createSlideGenerator(config: SlideGeneratorConfig): SlideGenerator;
96
+ export declare function generateSlidesFromPlan(schemas: SlideSchema[], config: SlideGeneratorConfig): Promise<SlideGenerationBatchResult>;