Copy disabled (too large)
Download .txt
Showing preview only (16,447K chars total). Download the full file to get everything.
Repository: conductor-oss/conductor
Branch: main
Commit: f150c843f7c0
Files: 2905
Total size: 15.5 MB
Directory structure:
gitextract_qhhcr7te/
├── .claude/
│ └── agents/
│ └── docs-writer.md
├── .dockerignore
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── bug_report.yml
│ │ ├── config.yml
│ │ ├── documentation.md
│ │ ├── documentation.yaml
│ │ ├── feature_request.md
│ │ └── feature_request.yaml
│ ├── dependabot.yml
│ ├── pull_request_template.md
│ ├── release-drafter.yml
│ └── workflows/
│ ├── ci.yml
│ ├── debug-docker-credentials.yml
│ ├── generate_gh_pages.yml
│ ├── publish.yml
│ ├── publish_build.yaml
│ ├── publish_s3.yaml
│ ├── release_draft.yml
│ └── ui-next-ci.yml
├── .gitignore
├── .opencode/
│ └── plans/
│ └── video-generation-implementation.md
├── AGENTS.md
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── OPENSEARCH_TESTING_PLAN.md
├── OSSMETADATA
├── README.md
├── RELATED.md
├── ROADMAP.md
├── SECURITY.md
├── USERS.md
├── ai/
│ ├── CONTRIBUTING.md
│ ├── JDBC_CONFIGURATION.md
│ ├── README.md
│ ├── VECTORDB_CONFIGURATION.md
│ ├── build.gradle
│ ├── examples/
│ │ ├── 01-chat-completion.json
│ │ ├── 02-generate-embeddings.json
│ │ ├── 03-image-generation.json
│ │ ├── 04-audio-generation.json
│ │ ├── 05-semantic-search.json
│ │ ├── 06-rag-basic.json
│ │ ├── 07-rag-complete.json
│ │ ├── 08-mcp-list-tools.json
│ │ ├── 09-mcp-call-tool.json
│ │ ├── 10-mcp-ai-agent.json
│ │ ├── 11-video-openai-sora.json
│ │ ├── 12-video-gemini-veo.json
│ │ ├── 13-image-to-video-pipeline.json
│ │ ├── 14-stabilityai-image.json
│ │ ├── 15-pdf-generation.json
│ │ ├── 16-llm-to-pdf-pipeline.json
│ │ └── README.md
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── org/
│ │ └── conductoross/
│ │ └── conductor/
│ │ ├── ai/
│ │ │ ├── AIModel.java
│ │ │ ├── AIModelProvider.java
│ │ │ ├── LLMHelper.java
│ │ │ ├── LLMs.java
│ │ │ ├── MimeExtensionResolver.java
│ │ │ ├── ModelConfiguration.java
│ │ │ ├── document/
│ │ │ │ ├── DocumentAccessDeniedException.java
│ │ │ │ ├── DocumentAccessPolicy.java
│ │ │ │ ├── DocumentLoader.java
│ │ │ │ ├── FileSystemDocumentLoader.java
│ │ │ │ └── HttpDocumentLoader.java
│ │ │ ├── mcp/
│ │ │ │ ├── JsonTextParser.java
│ │ │ │ └── MCPService.java
│ │ │ ├── models/
│ │ │ │ ├── AudioGenRequest.java
│ │ │ │ ├── ChatCompletion.java
│ │ │ │ ├── ChatMessage.java
│ │ │ │ ├── EmbeddingGenRequest.java
│ │ │ │ ├── GetConversationHistoryRequest.java
│ │ │ │ ├── ImageGenRequest.java
│ │ │ │ ├── IndexDocInput.java
│ │ │ │ ├── IndexedDoc.java
│ │ │ │ ├── LLMResponse.java
│ │ │ │ ├── LLMWorkerInput.java
│ │ │ │ ├── MCPListToolsRequest.java
│ │ │ │ ├── MCPToolCallRequest.java
│ │ │ │ ├── MarkdownToPdfRequest.java
│ │ │ │ ├── Media.java
│ │ │ │ ├── StoreEmbeddingsInput.java
│ │ │ │ ├── TextCompletion.java
│ │ │ │ ├── ToolCall.java
│ │ │ │ ├── ToolSpec.java
│ │ │ │ ├── VectorDBInput.java
│ │ │ │ └── VideoGenRequest.java
│ │ │ ├── pdf/
│ │ │ │ ├── MarkdownToPdfConverter.java
│ │ │ │ ├── PdfDocumentRenderer.java
│ │ │ │ ├── PdfImageResolver.java
│ │ │ │ └── PdfRenderContext.java
│ │ │ ├── providers/
│ │ │ │ ├── anthropic/
│ │ │ │ │ ├── Anthropic.java
│ │ │ │ │ └── AnthropicConfiguration.java
│ │ │ │ ├── azureopenai/
│ │ │ │ │ ├── AzureOpenAI.java
│ │ │ │ │ └── AzureOpenAIConfiguration.java
│ │ │ │ ├── bedrock/
│ │ │ │ │ ├── Bedrock.java
│ │ │ │ │ └── BedrockConfiguration.java
│ │ │ │ ├── cohere/
│ │ │ │ │ ├── CohereAI.java
│ │ │ │ │ ├── CohereAIConfiguration.java
│ │ │ │ │ ├── CohereChatModel.java
│ │ │ │ │ ├── CohereChatOptions.java
│ │ │ │ │ ├── CohereEmbeddingModel.java
│ │ │ │ │ └── api/
│ │ │ │ │ └── CohereApi.java
│ │ │ │ ├── gemini/
│ │ │ │ │ ├── GeminiGenAI.java
│ │ │ │ │ ├── GeminiVertex.java
│ │ │ │ │ ├── GeminiVertexConfiguration.java
│ │ │ │ │ └── GeminiVideoModel.java
│ │ │ │ ├── grok/
│ │ │ │ │ ├── Grok.java
│ │ │ │ │ └── GrokAIConfiguration.java
│ │ │ │ ├── huggingface/
│ │ │ │ │ ├── HuggingFace.java
│ │ │ │ │ └── HuggingFaceConfiguration.java
│ │ │ │ ├── mistral/
│ │ │ │ │ ├── MistralAI.java
│ │ │ │ │ └── MistralAIConfiguration.java
│ │ │ │ ├── ollama/
│ │ │ │ │ ├── Ollama.java
│ │ │ │ │ └── OllamaConfiguration.java
│ │ │ │ ├── openai/
│ │ │ │ │ ├── OpenAI.java
│ │ │ │ │ ├── OpenAIConfiguration.java
│ │ │ │ │ ├── OpenAIVideoModel.java
│ │ │ │ │ └── api/
│ │ │ │ │ └── OpenAIVideoApi.java
│ │ │ │ ├── perplexity/
│ │ │ │ │ ├── PerplexityAI.java
│ │ │ │ │ └── PerplexityAIConfiguration.java
│ │ │ │ └── stabilityai/
│ │ │ │ ├── StabilityAI.java
│ │ │ │ ├── StabilityAIConfiguration.java
│ │ │ │ └── StabilityAiApi.java
│ │ │ ├── sql/
│ │ │ │ ├── JDBCConnectionConfig.java
│ │ │ │ ├── JDBCInput.java
│ │ │ │ ├── JDBCInstanceConfig.java
│ │ │ │ ├── JDBCProvider.java
│ │ │ │ └── JDBCWorker.java
│ │ │ ├── tasks/
│ │ │ │ ├── mapper/
│ │ │ │ │ ├── AIModelTaskMapper.java
│ │ │ │ │ ├── AudioGenerationTaskMapper.java
│ │ │ │ │ ├── CallMCPToolTaskMapper.java
│ │ │ │ │ ├── ChatCompleteTaskMapper.java
│ │ │ │ │ ├── GenEmbeddingsTaskMapper.java
│ │ │ │ │ ├── GetEmbeddingsTaskMapper.java
│ │ │ │ │ ├── ImageGenerationTaskMapper.java
│ │ │ │ │ ├── IndexTextTaskMapper.java
│ │ │ │ │ ├── ListMCPToolsTaskMapper.java
│ │ │ │ │ ├── PdfGenerationTaskMapper.java
│ │ │ │ │ ├── SearchIndexTaskMapper.java
│ │ │ │ │ ├── StoreEmbeddingsTaskMapper.java
│ │ │ │ │ ├── TextCompleteTaskMapper.java
│ │ │ │ │ └── VideoGenerationTaskMapper.java
│ │ │ │ └── worker/
│ │ │ │ ├── DocumentGenWorkers.java
│ │ │ │ ├── LLMWorkers.java
│ │ │ │ ├── MCPWorkers.java
│ │ │ │ └── VectorDBWorkers.java
│ │ │ ├── vectordb/
│ │ │ │ ├── VectorDB.java
│ │ │ │ ├── VectorDBConfig.java
│ │ │ │ ├── VectorDBInstanceConfig.java
│ │ │ │ ├── VectorDBProvider.java
│ │ │ │ ├── VectorDBs.java
│ │ │ │ ├── mongodb/
│ │ │ │ │ ├── MongoDBConfig.java
│ │ │ │ │ └── MongoVectorDB.java
│ │ │ │ ├── pinecone/
│ │ │ │ │ ├── PineconeConfig.java
│ │ │ │ │ └── PineconeDB.java
│ │ │ │ └── postgres/
│ │ │ │ ├── PostgresConfig.java
│ │ │ │ └── PostgresVectorDB.java
│ │ │ └── video/
│ │ │ ├── AsyncVideoModel.java
│ │ │ ├── Video.java
│ │ │ ├── VideoGeneration.java
│ │ │ ├── VideoGenerationMetadata.java
│ │ │ ├── VideoMessage.java
│ │ │ ├── VideoModel.java
│ │ │ ├── VideoOptions.java
│ │ │ ├── VideoOptionsBuilder.java
│ │ │ ├── VideoPrompt.java
│ │ │ ├── VideoResponse.java
│ │ │ └── VideoResponseMetadata.java
│ │ └── config/
│ │ └── AIIntegrationEnabledCondition.java
│ └── test/
│ ├── java/
│ │ └── org/
│ │ └── conductoross/
│ │ └── conductor/
│ │ └── ai/
│ │ ├── AIModelProviderTest.java
│ │ ├── LLMHelperTest.java
│ │ ├── LLMsTest.java
│ │ ├── document/
│ │ │ └── DocumentAccessPolicyTest.java
│ │ ├── integration/
│ │ │ └── AIModelIntegrationTest.java
│ │ ├── mapper/
│ │ │ ├── GenEmbeddingsTaskMapperTest.java
│ │ │ ├── GetEmbeddingsTaskMapperTest.java
│ │ │ ├── IndexTextTaskMapperTest.java
│ │ │ ├── PdfGenerationTaskMapperTest.java
│ │ │ ├── SearchIndexTaskMapperTest.java
│ │ │ ├── StoreEmbeddingsTaskMapperTest.java
│ │ │ └── TextCompleteTaskMapperTest.java
│ │ ├── mcp/
│ │ │ └── JsonTextParserTest.java
│ │ ├── pdf/
│ │ │ ├── DocumentGenWorkersTest.java
│ │ │ ├── MarkdownToPdfConverterTest.java
│ │ │ ├── PdfImageResolverTest.java
│ │ │ └── PdfRenderContextTest.java
│ │ ├── providers/
│ │ │ ├── anthropic/
│ │ │ │ ├── AnthropicConfigurationTest.java
│ │ │ │ └── AnthropicTest.java
│ │ │ ├── azureopenai/
│ │ │ │ ├── AzureOpenAIConfigurationTest.java
│ │ │ │ └── AzureOpenAITest.java
│ │ │ ├── bedrock/
│ │ │ │ ├── BedrockConfigurationTest.java
│ │ │ │ └── BedrockTest.java
│ │ │ ├── cohere/
│ │ │ │ ├── CohereAIConfigurationTest.java
│ │ │ │ └── CohereAITest.java
│ │ │ ├── gemini/
│ │ │ │ ├── GeminiVertexConfigurationTest.java
│ │ │ │ └── GeminiVertexTest.java
│ │ │ ├── grok/
│ │ │ │ ├── GrokAIConfigurationTest.java
│ │ │ │ └── GrokTest.java
│ │ │ ├── huggingface/
│ │ │ │ ├── HuggingFaceConfigurationTest.java
│ │ │ │ └── HuggingFaceTest.java
│ │ │ ├── mistral/
│ │ │ │ ├── MistralAIConfigurationTest.java
│ │ │ │ └── MistralAITest.java
│ │ │ ├── ollama/
│ │ │ │ ├── OllamaConfigurationTest.java
│ │ │ │ └── OllamaTest.java
│ │ │ ├── openai/
│ │ │ │ ├── OpenAIConfigurationTest.java
│ │ │ │ └── OpenAITest.java
│ │ │ └── perplexity/
│ │ │ ├── PerplexityAIConfigurationTest.java
│ │ │ └── PerplexityAITest.java
│ │ ├── sql/
│ │ │ ├── JDBCConnectionConfigTest.java
│ │ │ ├── JDBCEndToEndTest.java
│ │ │ ├── JDBCInstanceConfigTest.java
│ │ │ └── JDBCProviderTest.java
│ │ ├── vectordb/
│ │ │ ├── MongoVectorDBTest.java
│ │ │ ├── PostgresVectorDBTest.java
│ │ │ ├── VectorDBProviderTest.java
│ │ │ └── VectorDBsTest.java
│ │ └── video/
│ │ ├── VideoMemoryTest.java
│ │ ├── VideoModelTest.java
│ │ └── VideoProviderMemoryTest.java
│ └── resources/
│ └── ai-test-env.sh
├── amqp/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── contribs/
│ │ └── queue/
│ │ └── amqp/
│ │ ├── AMQPConnection.java
│ │ ├── AMQPObservableQueue.java
│ │ ├── config/
│ │ │ ├── AMQPEventQueueConfiguration.java
│ │ │ ├── AMQPEventQueueProperties.java
│ │ │ ├── AMQPEventQueueProvider.java
│ │ │ └── AMQPRetryPattern.java
│ │ └── util/
│ │ ├── AMQPConfigurations.java
│ │ ├── AMQPConstants.java
│ │ ├── AMQPSettings.java
│ │ ├── ConnectionType.java
│ │ └── RetryType.java
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── contribs/
│ └── queue/
│ └── amqp/
│ ├── AMQPEventQueueProviderTest.java
│ ├── AMQPObservableQueueTest.java
│ └── AMQPSettingsTest.java
├── annotations/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── annotations/
│ └── protogen/
│ ├── ProtoEnum.java
│ ├── ProtoField.java
│ └── ProtoMessage.java
├── annotations-processor/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── example/
│ │ └── java/
│ │ └── com/
│ │ └── example/
│ │ └── Example.java
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── annotationsprocessor/
│ │ │ └── protogen/
│ │ │ ├── AbstractMessage.java
│ │ │ ├── Enum.java
│ │ │ ├── Message.java
│ │ │ ├── ProtoFile.java
│ │ │ ├── ProtoGen.java
│ │ │ ├── ProtoGenTask.java
│ │ │ └── types/
│ │ │ ├── AbstractType.java
│ │ │ ├── ExternMessageType.java
│ │ │ ├── GenericType.java
│ │ │ ├── ListType.java
│ │ │ ├── MapType.java
│ │ │ ├── MessageType.java
│ │ │ ├── ScalarType.java
│ │ │ ├── TypeMapper.java
│ │ │ └── WrappedType.java
│ │ └── resources/
│ │ └── templates/
│ │ ├── file.proto
│ │ └── message.proto
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── annotationsprocessor/
│ │ └── protogen/
│ │ └── ProtoGenTest.java
│ └── resources/
│ └── example.proto.txt
├── awss3-storage/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ └── main/
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── s3/
│ │ ├── config/
│ │ │ ├── S3Configuration.java
│ │ │ └── S3Properties.java
│ │ └── storage/
│ │ └── S3PayloadStorage.java
│ └── resources/
│ └── META-INF/
│ └── additional-spring-configuration-metadata.json
├── awssqs-event-queue/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── sqs/
│ │ │ ├── config/
│ │ │ │ ├── SQSEventQueueConfiguration.java
│ │ │ │ ├── SQSEventQueueProperties.java
│ │ │ │ └── SQSEventQueueProvider.java
│ │ │ └── eventqueue/
│ │ │ └── SQSObservableQueue.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── additional-spring-configuration-metadata.json
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── sqs/
│ └── eventqueue/
│ ├── DefaultEventQueueProcessorTest.java
│ └── SQSObservableQueueTest.java
├── azureblob-storage/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── azureblob/
│ │ ├── config/
│ │ │ ├── AzureBlobConfiguration.java
│ │ │ └── AzureBlobProperties.java
│ │ └── storage/
│ │ └── AzureBlobPayloadStorage.java
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── azureblob/
│ └── storage/
│ └── AzureBlobPayloadStorageTest.java
├── build.gradle
├── build_ui.sh
├── cassandra-persistence/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── cassandra/
│ │ │ ├── config/
│ │ │ │ ├── CassandraConfiguration.java
│ │ │ │ ├── CassandraProperties.java
│ │ │ │ └── cache/
│ │ │ │ ├── CacheableEventHandlerDAO.java
│ │ │ │ ├── CacheableMetadataDAO.java
│ │ │ │ └── CachingConfig.java
│ │ │ ├── dao/
│ │ │ │ ├── CassandraBaseDAO.java
│ │ │ │ ├── CassandraEventHandlerDAO.java
│ │ │ │ ├── CassandraExecutionDAO.java
│ │ │ │ ├── CassandraMetadataDAO.java
│ │ │ │ └── CassandraPollDataDAO.java
│ │ │ └── util/
│ │ │ ├── Constants.java
│ │ │ └── Statements.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── additional-spring-configuration-metadata.json
│ └── test/
│ └── groovy/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── cassandra/
│ ├── dao/
│ │ ├── CassandraEventHandlerDAOSpec.groovy
│ │ ├── CassandraExecutionDAOSpec.groovy
│ │ ├── CassandraMetadataDAOSpec.groovy
│ │ └── CassandraSpec.groovy
│ └── util/
│ └── StatementsSpec.groovy
├── common/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ └── java/
│ │ ├── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ ├── annotations/
│ │ │ │ └── protogen/
│ │ │ │ ├── ProtoEnum.java
│ │ │ │ ├── ProtoField.java
│ │ │ │ └── ProtoMessage.java
│ │ │ ├── common/
│ │ │ │ ├── config/
│ │ │ │ │ ├── ObjectMapperBuilderConfiguration.java
│ │ │ │ │ ├── ObjectMapperConfiguration.java
│ │ │ │ │ └── ObjectMapperProvider.java
│ │ │ │ ├── constraints/
│ │ │ │ │ ├── NoSemiColonConstraint.java
│ │ │ │ │ ├── OwnerEmailMandatoryConstraint.java
│ │ │ │ │ ├── TaskReferenceNameUniqueConstraint.java
│ │ │ │ │ ├── TaskTimeoutConstraint.java
│ │ │ │ │ └── ValidNameConstraint.java
│ │ │ │ ├── jackson/
│ │ │ │ │ └── JsonProtoModule.java
│ │ │ │ ├── metadata/
│ │ │ │ │ ├── Auditable.java
│ │ │ │ │ ├── BaseDef.java
│ │ │ │ │ ├── SchemaDef.java
│ │ │ │ │ ├── acl/
│ │ │ │ │ │ └── Permission.java
│ │ │ │ │ ├── events/
│ │ │ │ │ │ ├── EventExecution.java
│ │ │ │ │ │ └── EventHandler.java
│ │ │ │ │ ├── tasks/
│ │ │ │ │ │ ├── ExecutionMetadata.java
│ │ │ │ │ │ ├── PollData.java
│ │ │ │ │ │ ├── Task.java
│ │ │ │ │ │ ├── TaskDef.java
│ │ │ │ │ │ ├── TaskExecLog.java
│ │ │ │ │ │ ├── TaskResult.java
│ │ │ │ │ │ └── TaskType.java
│ │ │ │ │ └── workflow/
│ │ │ │ │ ├── CacheConfig.java
│ │ │ │ │ ├── DynamicForkJoinTask.java
│ │ │ │ │ ├── DynamicForkJoinTaskList.java
│ │ │ │ │ ├── IdempotencyStrategy.java
│ │ │ │ │ ├── RateLimitConfig.java
│ │ │ │ │ ├── RerunWorkflowRequest.java
│ │ │ │ │ ├── SkipTaskRequest.java
│ │ │ │ │ ├── StartWorkflowRequest.java
│ │ │ │ │ ├── StateChangeEvent.java
│ │ │ │ │ ├── SubWorkflowParams.java
│ │ │ │ │ ├── UpgradeWorkflowRequest.java
│ │ │ │ │ ├── WorkflowDef.java
│ │ │ │ │ ├── WorkflowDefSummary.java
│ │ │ │ │ └── WorkflowTask.java
│ │ │ │ ├── model/
│ │ │ │ │ └── BulkResponse.java
│ │ │ │ ├── run/
│ │ │ │ │ ├── ExternalStorageLocation.java
│ │ │ │ │ ├── SearchResult.java
│ │ │ │ │ ├── TaskSummary.java
│ │ │ │ │ ├── Workflow.java
│ │ │ │ │ ├── WorkflowSummary.java
│ │ │ │ │ ├── WorkflowSummaryExtended.java
│ │ │ │ │ └── WorkflowTestRequest.java
│ │ │ │ ├── utils/
│ │ │ │ │ ├── ConstraintParamUtil.java
│ │ │ │ │ ├── EnvUtils.java
│ │ │ │ │ ├── ExternalPayloadStorage.java
│ │ │ │ │ ├── SummaryUtil.java
│ │ │ │ │ └── TaskUtils.java
│ │ │ │ └── validation/
│ │ │ │ ├── ErrorResponse.java
│ │ │ │ └── ValidationError.java
│ │ │ └── sdk/
│ │ │ └── workflow/
│ │ │ └── executor/
│ │ │ └── task/
│ │ │ ├── NonRetryableException.java
│ │ │ └── TaskContext.java
│ │ └── org/
│ │ └── conductoross/
│ │ └── conductor/
│ │ ├── ai/
│ │ │ └── TokenUsageLog.java
│ │ ├── common/
│ │ │ ├── Documented.java
│ │ │ ├── JsonSchemaValidator.java
│ │ │ └── utils/
│ │ │ ├── StringTemplate.java
│ │ │ └── TextUtils.java
│ │ ├── core/
│ │ │ └── execution/
│ │ │ └── tasks/
│ │ │ └── AnnotatedSystemTaskWorker.java
│ │ └── model/
│ │ ├── SignalResponse.java
│ │ ├── TaskRun.java
│ │ ├── WorkflowRun.java
│ │ └── WorkflowSignalReturnStrategy.java
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── common/
│ │ ├── config/
│ │ │ └── TestObjectMapperConfiguration.java
│ │ ├── constraints/
│ │ │ └── NameValidatorTest.java
│ │ ├── events/
│ │ │ └── EventHandlerTest.java
│ │ ├── run/
│ │ │ └── TaskSummaryTest.java
│ │ ├── tasks/
│ │ │ ├── TaskDefTest.java
│ │ │ ├── TaskResultTest.java
│ │ │ └── TaskTest.java
│ │ ├── utils/
│ │ │ ├── ConstraintParamUtilTest.java
│ │ │ └── SummaryUtilTest.java
│ │ └── workflow/
│ │ ├── SubWorkflowParamsTest.java
│ │ ├── WorkflowDefValidatorTest.java
│ │ └── WorkflowTaskTest.java
│ └── resources/
│ └── application.properties
├── common-persistence/
│ ├── build.gradle
│ └── src/
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── dao/
│ ├── ExecutionDAOTest.java
│ └── TestBase.java
├── conductor-clients/
│ └── README.md
├── conductor_server.bat
├── conductor_server.ps1
├── conductor_server.sh
├── core/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ ├── com/
│ │ │ │ └── netflix/
│ │ │ │ └── conductor/
│ │ │ │ ├── annotations/
│ │ │ │ │ ├── Audit.java
│ │ │ │ │ ├── Trace.java
│ │ │ │ │ └── VisibleForTesting.java
│ │ │ │ ├── core/
│ │ │ │ │ ├── LifecycleAwareComponent.java
│ │ │ │ │ ├── WorkflowContext.java
│ │ │ │ │ ├── config/
│ │ │ │ │ │ ├── ConductorCoreConfiguration.java
│ │ │ │ │ │ ├── ConductorProperties.java
│ │ │ │ │ │ └── SchedulerConfiguration.java
│ │ │ │ │ ├── dal/
│ │ │ │ │ │ └── ExecutionDAOFacade.java
│ │ │ │ │ ├── events/
│ │ │ │ │ │ ├── ActionProcessor.java
│ │ │ │ │ │ ├── DefaultEventProcessor.java
│ │ │ │ │ │ ├── DefaultEventQueueManager.java
│ │ │ │ │ │ ├── EventQueueManager.java
│ │ │ │ │ │ ├── EventQueueProvider.java
│ │ │ │ │ │ ├── EventQueues.java
│ │ │ │ │ │ ├── ScriptEvaluator.java
│ │ │ │ │ │ ├── SimpleActionProcessor.java
│ │ │ │ │ │ └── queue/
│ │ │ │ │ │ ├── ConductorEventQueueProvider.java
│ │ │ │ │ │ ├── ConductorObservableQueue.java
│ │ │ │ │ │ ├── DefaultEventQueueProcessor.java
│ │ │ │ │ │ ├── Message.java
│ │ │ │ │ │ └── ObservableQueue.java
│ │ │ │ │ ├── exception/
│ │ │ │ │ │ ├── ConflictException.java
│ │ │ │ │ │ ├── NonTransientException.java
│ │ │ │ │ │ ├── NotFoundException.java
│ │ │ │ │ │ ├── TerminateWorkflowException.java
│ │ │ │ │ │ └── TransientException.java
│ │ │ │ │ ├── execution/
│ │ │ │ │ │ ├── AsyncSystemTaskExecutor.java
│ │ │ │ │ │ ├── DeciderService.java
│ │ │ │ │ │ ├── NotificationResult.java
│ │ │ │ │ │ ├── StartWorkflowInput.java
│ │ │ │ │ │ ├── WorkflowExecutor.java
│ │ │ │ │ │ ├── WorkflowExecutorOps.java
│ │ │ │ │ │ ├── evaluators/
│ │ │ │ │ │ │ ├── ConsoleBridge.java
│ │ │ │ │ │ │ ├── Evaluator.java
│ │ │ │ │ │ │ ├── GraalJSEvaluator.java
│ │ │ │ │ │ │ ├── JavascriptEvaluator.java
│ │ │ │ │ │ │ ├── PythonEvaluator.java
│ │ │ │ │ │ │ └── ValueParamEvaluator.java
│ │ │ │ │ │ ├── mapper/
│ │ │ │ │ │ │ ├── DecisionTaskMapper.java
│ │ │ │ │ │ │ ├── DoWhileTaskMapper.java
│ │ │ │ │ │ │ ├── DynamicTaskMapper.java
│ │ │ │ │ │ │ ├── EventTaskMapper.java
│ │ │ │ │ │ │ ├── ExclusiveJoinTaskMapper.java
│ │ │ │ │ │ │ ├── ForkJoinDynamicTaskMapper.java
│ │ │ │ │ │ │ ├── ForkJoinTaskMapper.java
│ │ │ │ │ │ │ ├── HTTPTaskMapper.java
│ │ │ │ │ │ │ ├── HumanTaskMapper.java
│ │ │ │ │ │ │ ├── InlineTaskMapper.java
│ │ │ │ │ │ │ ├── JoinTaskMapper.java
│ │ │ │ │ │ │ ├── JsonJQTransformTaskMapper.java
│ │ │ │ │ │ │ ├── KafkaPublishTaskMapper.java
│ │ │ │ │ │ │ ├── LambdaTaskMapper.java
│ │ │ │ │ │ │ ├── NoopTaskMapper.java
│ │ │ │ │ │ │ ├── SetVariableTaskMapper.java
│ │ │ │ │ │ │ ├── SimpleTaskMapper.java
│ │ │ │ │ │ │ ├── StartWorkflowTaskMapper.java
│ │ │ │ │ │ │ ├── SubWorkflowTaskMapper.java
│ │ │ │ │ │ │ ├── SwitchTaskMapper.java
│ │ │ │ │ │ │ ├── TaskMapper.java
│ │ │ │ │ │ │ ├── TaskMapperContext.java
│ │ │ │ │ │ │ ├── TerminateTaskMapper.java
│ │ │ │ │ │ │ ├── UserDefinedTaskMapper.java
│ │ │ │ │ │ │ └── WaitTaskMapper.java
│ │ │ │ │ │ └── tasks/
│ │ │ │ │ │ ├── Decision.java
│ │ │ │ │ │ ├── DoWhile.java
│ │ │ │ │ │ ├── Event.java
│ │ │ │ │ │ ├── ExclusiveJoin.java
│ │ │ │ │ │ ├── ExecutionConfig.java
│ │ │ │ │ │ ├── Fork.java
│ │ │ │ │ │ ├── Human.java
│ │ │ │ │ │ ├── Inline.java
│ │ │ │ │ │ ├── IsolatedTaskQueueProducer.java
│ │ │ │ │ │ ├── Join.java
│ │ │ │ │ │ ├── Lambda.java
│ │ │ │ │ │ ├── Noop.java
│ │ │ │ │ │ ├── SetVariable.java
│ │ │ │ │ │ ├── StartWorkflow.java
│ │ │ │ │ │ ├── SubWorkflow.java
│ │ │ │ │ │ ├── Switch.java
│ │ │ │ │ │ ├── SystemTaskRegistry.java
│ │ │ │ │ │ ├── SystemTaskWorker.java
│ │ │ │ │ │ ├── SystemTaskWorkerCoordinator.java
│ │ │ │ │ │ ├── Terminate.java
│ │ │ │ │ │ ├── Wait.java
│ │ │ │ │ │ └── WorkflowSystemTask.java
│ │ │ │ │ ├── index/
│ │ │ │ │ │ ├── NoopIndexDAO.java
│ │ │ │ │ │ └── NoopIndexDAOConfiguration.java
│ │ │ │ │ ├── listener/
│ │ │ │ │ │ ├── TaskStatusListener.java
│ │ │ │ │ │ ├── TaskStatusListenerStub.java
│ │ │ │ │ │ ├── WorkflowStatusListener.java
│ │ │ │ │ │ └── WorkflowStatusListenerStub.java
│ │ │ │ │ ├── metadata/
│ │ │ │ │ │ └── MetadataMapperService.java
│ │ │ │ │ ├── reconciliation/
│ │ │ │ │ │ ├── WorkflowReconciler.java
│ │ │ │ │ │ ├── WorkflowRepairService.java
│ │ │ │ │ │ └── WorkflowSweeper.java
│ │ │ │ │ ├── storage/
│ │ │ │ │ │ └── DummyPayloadStorage.java
│ │ │ │ │ ├── sync/
│ │ │ │ │ │ ├── Lock.java
│ │ │ │ │ │ ├── local/
│ │ │ │ │ │ │ ├── LocalOnlyLock.java
│ │ │ │ │ │ │ └── LocalOnlyLockConfiguration.java
│ │ │ │ │ │ └── noop/
│ │ │ │ │ │ └── NoopLock.java
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── DateTimeUtils.java
│ │ │ │ │ ├── ExternalPayloadStorageUtils.java
│ │ │ │ │ ├── IDGenerator.java
│ │ │ │ │ ├── JsonUtils.java
│ │ │ │ │ ├── ParametersUtils.java
│ │ │ │ │ ├── QueueUtils.java
│ │ │ │ │ ├── SemaphoreUtil.java
│ │ │ │ │ └── Utils.java
│ │ │ │ ├── dao/
│ │ │ │ │ ├── ConcurrentExecutionLimitDAO.java
│ │ │ │ │ ├── EventHandlerDAO.java
│ │ │ │ │ ├── ExecutionDAO.java
│ │ │ │ │ ├── IndexDAO.java
│ │ │ │ │ ├── MetadataDAO.java
│ │ │ │ │ ├── PollDataDAO.java
│ │ │ │ │ ├── QueueDAO.java
│ │ │ │ │ └── RateLimitingDAO.java
│ │ │ │ ├── metrics/
│ │ │ │ │ ├── Monitors.java
│ │ │ │ │ └── WorkflowMonitor.java
│ │ │ │ ├── model/
│ │ │ │ │ ├── TaskModel.java
│ │ │ │ │ ├── WorkflowModel.java
│ │ │ │ │ └── WorkflowNotifications.java
│ │ │ │ ├── sdk/
│ │ │ │ │ └── workflow/
│ │ │ │ │ └── task/
│ │ │ │ │ ├── InputParam.java
│ │ │ │ │ ├── OutputParam.java
│ │ │ │ │ └── WorkerTask.java
│ │ │ │ ├── service/
│ │ │ │ │ ├── AdminService.java
│ │ │ │ │ ├── AdminServiceImpl.java
│ │ │ │ │ ├── EventService.java
│ │ │ │ │ ├── EventServiceImpl.java
│ │ │ │ │ ├── ExecutionLockService.java
│ │ │ │ │ ├── ExecutionService.java
│ │ │ │ │ ├── MetadataService.java
│ │ │ │ │ ├── MetadataServiceImpl.java
│ │ │ │ │ ├── TaskService.java
│ │ │ │ │ ├── TaskServiceImpl.java
│ │ │ │ │ ├── VersionService.java
│ │ │ │ │ ├── WorkflowBulkService.java
│ │ │ │ │ ├── WorkflowBulkServiceImpl.java
│ │ │ │ │ ├── WorkflowService.java
│ │ │ │ │ ├── WorkflowServiceImpl.java
│ │ │ │ │ └── WorkflowTestService.java
│ │ │ │ └── validations/
│ │ │ │ ├── ValidationContext.java
│ │ │ │ └── WorkflowTaskTypeConstraint.java
│ │ │ └── org/
│ │ │ └── conductoross/
│ │ │ └── conductor/
│ │ │ └── core/
│ │ │ └── execution/
│ │ │ ├── ExecutorUtils.java
│ │ │ ├── SweeperProperties.java
│ │ │ ├── WorkflowSweeper.java
│ │ │ ├── mapper/
│ │ │ │ ├── AnnotatedSystemTaskMapper.java
│ │ │ │ └── TaskMapperValidator.java
│ │ │ └── tasks/
│ │ │ └── annotated/
│ │ │ ├── AnnotatedMethodParameterMapper.java
│ │ │ ├── AnnotatedMethodResultMapper.java
│ │ │ ├── AnnotatedWorkflowSystemTask.java
│ │ │ ├── SampleWorkers.java
│ │ │ └── WorkerTaskAnnotationScanner.java
│ │ └── resources/
│ │ └── META-INF/
│ │ ├── additional-spring-configuration-metadata.json
│ │ ├── validation/
│ │ │ └── constraints.xml
│ │ └── validation.xml
│ └── test/
│ ├── groovy/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ ├── core/
│ │ │ └── execution/
│ │ │ ├── AsyncSystemTaskExecutorTest.groovy
│ │ │ └── tasks/
│ │ │ ├── DoWhileSpec.groovy
│ │ │ ├── EventSpec.groovy
│ │ │ ├── IsolatedTaskQueueProducerSpec.groovy
│ │ │ └── StartWorkflowSpec.groovy
│ │ └── model/
│ │ ├── TaskModelSpec.groovy
│ │ └── WorkflowModelSpec.groovy
│ ├── java/
│ │ ├── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ ├── TestUtils.java
│ │ │ ├── core/
│ │ │ │ ├── dal/
│ │ │ │ │ └── ExecutionDAOFacadeTest.java
│ │ │ │ ├── events/
│ │ │ │ │ ├── MockObservableQueue.java
│ │ │ │ │ ├── MockQueueProvider.java
│ │ │ │ │ ├── TestDefaultEventProcessor.java
│ │ │ │ │ ├── TestGraalJSFeatures.java
│ │ │ │ │ ├── TestScriptEval.java
│ │ │ │ │ └── TestSimpleActionProcessor.java
│ │ │ │ ├── execution/
│ │ │ │ │ ├── NotificationResultTest.java
│ │ │ │ │ ├── TestDeciderOutcomes.java
│ │ │ │ │ ├── TestDeciderService.java
│ │ │ │ │ ├── TestWorkflowDef.java
│ │ │ │ │ ├── TestWorkflowExecutor.java
│ │ │ │ │ ├── TestWorkflowExecutorDecideLoop.java
│ │ │ │ │ ├── WorkflowSystemTaskStub.java
│ │ │ │ │ ├── evaluators/
│ │ │ │ │ │ ├── GraalJSEvaluatorTest.java
│ │ │ │ │ │ └── JavascriptEvaluatorTest.java
│ │ │ │ │ ├── mapper/
│ │ │ │ │ │ ├── DecisionTaskMapperTest.java
│ │ │ │ │ │ ├── DoWhileTaskMapperTest.java
│ │ │ │ │ │ ├── DynamicTaskMapperTest.java
│ │ │ │ │ │ ├── EventTaskMapperTest.java
│ │ │ │ │ │ ├── ForkJoinDynamicTaskMapperTest.java
│ │ │ │ │ │ ├── ForkJoinTaskMapperTest.java
│ │ │ │ │ │ ├── HTTPTaskMapperTest.java
│ │ │ │ │ │ ├── HumanTaskMapperTest.java
│ │ │ │ │ │ ├── InlineTaskMapperTest.java
│ │ │ │ │ │ ├── JoinTaskMapperTest.java
│ │ │ │ │ │ ├── JsonJQTransformTaskMapperTest.java
│ │ │ │ │ │ ├── KafkaPublishTaskMapperTest.java
│ │ │ │ │ │ ├── LambdaTaskMapperTest.java
│ │ │ │ │ │ ├── NoopTaskMapperTest.java
│ │ │ │ │ │ ├── SetVariableTaskMapperTest.java
│ │ │ │ │ │ ├── SimpleTaskMapperTest.java
│ │ │ │ │ │ ├── SubWorkflowTaskMapperTest.java
│ │ │ │ │ │ ├── SwitchTaskMapperTest.java
│ │ │ │ │ │ ├── TerminateTaskMapperTest.java
│ │ │ │ │ │ ├── UserDefinedTaskMapperTest.java
│ │ │ │ │ │ └── WaitTaskMapperTest.java
│ │ │ │ │ └── tasks/
│ │ │ │ │ ├── DoWhileIntegrationTest.java
│ │ │ │ │ ├── DoWhileTest.java
│ │ │ │ │ ├── EventQueueResolutionTest.java
│ │ │ │ │ ├── InlineTest.java
│ │ │ │ │ ├── JoinTest.java
│ │ │ │ │ ├── TestJoin.java
│ │ │ │ │ ├── TestLambda.java
│ │ │ │ │ ├── TestNoop.java
│ │ │ │ │ ├── TestSubWorkflow.java
│ │ │ │ │ ├── TestSystemTaskWorker.java
│ │ │ │ │ ├── TestSystemTaskWorkerCoordinator.java
│ │ │ │ │ └── TestTerminate.java
│ │ │ │ ├── metadata/
│ │ │ │ │ └── MetadataMapperServiceTest.java
│ │ │ │ ├── reconciliation/
│ │ │ │ │ ├── TestWorkflowRepairService.java
│ │ │ │ │ └── TestWorkflowSweeper.java
│ │ │ │ ├── storage/
│ │ │ │ │ └── DummyPayloadStorageTest.java
│ │ │ │ ├── sync/
│ │ │ │ │ └── local/
│ │ │ │ │ └── LocalOnlyLockTest.java
│ │ │ │ └── utils/
│ │ │ │ ├── DateTimeUtilsTest.java
│ │ │ │ ├── ExternalPayloadStorageUtilsTest.java
│ │ │ │ ├── JsonUtilsTest.java
│ │ │ │ ├── ParametersUtilsTest.java
│ │ │ │ ├── QueueUtilsTest.java
│ │ │ │ └── SemaphoreUtilTest.java
│ │ │ ├── dao/
│ │ │ │ ├── ExecutionDAOTest.java
│ │ │ │ └── PollDataDAOTest.java
│ │ │ ├── metrics/
│ │ │ │ └── WorkflowMonitorTest.java
│ │ │ ├── service/
│ │ │ │ ├── EventServiceTest.java
│ │ │ │ ├── ExecutionServiceTest.java
│ │ │ │ ├── MetadataServiceTest.java
│ │ │ │ ├── TaskServiceTest.java
│ │ │ │ ├── WorkflowBulkServiceTest.java
│ │ │ │ └── WorkflowServiceTest.java
│ │ │ └── validations/
│ │ │ ├── WorkflowDefConstraintTest.java
│ │ │ └── WorkflowTaskTypeConstraintTest.java
│ │ └── org/
│ │ └── conductoross/
│ │ └── conductor/
│ │ └── core/
│ │ └── execution/
│ │ ├── ExecutorUtilsTest.java
│ │ ├── WorkflowSweeperTest.java
│ │ └── tasks/
│ │ └── annotated/
│ │ ├── TestAnnotatedMethodParameterMapper.java
│ │ ├── TestAnnotatedMethodResultMapper.java
│ │ ├── TestAnnotatedSystemTaskIntegration.java
│ │ ├── TestAnnotatedWorkflowSystemTask.java
│ │ └── TestTaskContext.java
│ └── resources/
│ ├── completed.json
│ ├── conditional_flow.json
│ ├── conditional_flow_with_switch.json
│ ├── payload.json
│ └── test.json
├── dependencies.gradle
├── deploy.gradle
├── docker/
│ ├── README.md
│ ├── ci/
│ │ └── Dockerfile
│ ├── docker-compose-es8.yaml
│ ├── docker-compose-mysql.yaml
│ ├── docker-compose-postgres-es7.yaml
│ ├── docker-compose-postgres.yaml
│ ├── docker-compose-redis-os.yaml
│ ├── docker-compose-redis-os2.yaml
│ ├── docker-compose-redis-os3.yaml
│ ├── docker-compose.yaml
│ ├── server/
│ │ ├── Dockerfile
│ │ ├── config/
│ │ │ ├── config-mysql.properties
│ │ │ ├── config-postgres-es7.properties
│ │ │ ├── config-postgres.properties
│ │ │ ├── config-redis-es8.properties
│ │ │ ├── config-redis-os.properties
│ │ │ ├── config-redis-os2.properties
│ │ │ ├── config-redis-os3.properties
│ │ │ ├── config-redis.properties
│ │ │ ├── config.properties
│ │ │ ├── log4j-file-appender.properties
│ │ │ ├── log4j.properties
│ │ │ └── redis.conf
│ │ ├── libs/
│ │ │ └── .gitignore
│ │ └── nginx/
│ │ └── nginx.conf
│ └── ui/
│ ├── Dockerfile
│ └── README.md
├── docs/
│ ├── architecture/
│ │ ├── durable-execution.md
│ │ └── json-native.md
│ ├── css/
│ │ └── custom.css
│ ├── devguide/
│ │ ├── ai/
│ │ │ ├── durable-agents.md
│ │ │ ├── dynamic-workflows.md
│ │ │ ├── failure-semantics.md
│ │ │ ├── first-ai-agent.md
│ │ │ ├── human-in-the-loop.md
│ │ │ ├── index.md
│ │ │ ├── llm-orchestration.md
│ │ │ ├── mcp-guide.md
│ │ │ ├── production-agent-architecture.md
│ │ │ ├── token-efficiency.md
│ │ │ └── why-conductor.md
│ │ ├── architecture/
│ │ │ ├── directed-acyclic-graph.md
│ │ │ ├── index.md
│ │ │ └── tasklifecycle.md
│ │ ├── bestpractices.md
│ │ ├── concepts/
│ │ │ ├── conductor.md
│ │ │ ├── index.md
│ │ │ ├── tasks.md
│ │ │ ├── workers.md
│ │ │ └── workflows.md
│ │ ├── cookbook/
│ │ │ ├── ai-llm.md
│ │ │ ├── dynamic-parallelism.md
│ │ │ ├── dynamic-workflows.md
│ │ │ ├── event-driven.md
│ │ │ ├── index.md
│ │ │ ├── microservice-orchestration.md
│ │ │ └── wait-and-timers.md
│ │ ├── faq.md
│ │ ├── how-tos/
│ │ │ ├── Tasks/
│ │ │ │ ├── choosing-tasks.md
│ │ │ │ ├── creating-tasks.md
│ │ │ │ └── task-inputs.md
│ │ │ ├── Workers/
│ │ │ │ └── scaling-workers.md
│ │ │ ├── Workflows/
│ │ │ │ ├── creating-workflows.md
│ │ │ │ ├── debugging-workflows.md
│ │ │ │ ├── handling-errors.md
│ │ │ │ ├── searching-workflows.md
│ │ │ │ ├── starting-workflows.md
│ │ │ │ ├── versioning-workflows.md
│ │ │ │ └── viewing-workflow-executions.md
│ │ │ ├── conductor-skills.md
│ │ │ └── event-bus.md
│ │ ├── labs/
│ │ │ ├── eventhandlers.md
│ │ │ ├── first-workflow.md
│ │ │ ├── index.md
│ │ │ └── kitchensink.md
│ │ └── running/
│ │ ├── deploy.md
│ │ ├── hosted.md
│ │ └── source.md
│ ├── documentation/
│ │ ├── advanced/
│ │ │ ├── annotation-processor.md
│ │ │ ├── archival-of-workflows.md
│ │ │ ├── extend.md
│ │ │ ├── externalpayloadstorage.md
│ │ │ ├── isolationgroups.md
│ │ │ ├── opensearch.md
│ │ │ ├── postgresql.md
│ │ │ └── redis.md
│ │ ├── api/
│ │ │ ├── bulk.md
│ │ │ ├── eventhandlers.md
│ │ │ ├── index.md
│ │ │ ├── metadata.md
│ │ │ ├── startworkflow.md
│ │ │ ├── task.md
│ │ │ ├── taskdomains.md
│ │ │ └── workflow.md
│ │ ├── clientsdks/
│ │ │ ├── csharp-sdk.md
│ │ │ ├── go-sdk.md
│ │ │ ├── index.md
│ │ │ ├── java-sdk.md
│ │ │ ├── js-sdk.md
│ │ │ ├── python-sdk.md
│ │ │ ├── ruby-sdk.md
│ │ │ └── rust-sdk.md
│ │ ├── configuration/
│ │ │ ├── appconf.md
│ │ │ ├── eventhandlers.md
│ │ │ ├── taskdef.md
│ │ │ └── workflowdef/
│ │ │ ├── index.md
│ │ │ ├── operators/
│ │ │ │ ├── do-while-task.md
│ │ │ │ ├── dynamic-fork-task.md
│ │ │ │ ├── dynamic-task.md
│ │ │ │ ├── fork-task.md
│ │ │ │ ├── index.md
│ │ │ │ ├── join-task.md
│ │ │ │ ├── set-variable-task.md
│ │ │ │ ├── start-workflow-task.md
│ │ │ │ ├── sub-workflow-task.md
│ │ │ │ ├── switch-task.md
│ │ │ │ └── terminate-task.md
│ │ │ └── systemtasks/
│ │ │ ├── event-task.md
│ │ │ ├── http-task.md
│ │ │ ├── human-task.md
│ │ │ ├── index.md
│ │ │ ├── inline-task.md
│ │ │ ├── jdbc-task.md
│ │ │ ├── json-jq-transform-task.md
│ │ │ ├── kafka-publish-task.md
│ │ │ ├── noop-task.md
│ │ │ └── wait-task.md
│ │ └── metrics/
│ │ ├── client.md
│ │ └── server.md
│ ├── home/
│ │ └── redirect.html
│ ├── index.md
│ ├── overrides/
│ │ ├── 404.html
│ │ ├── main.html
│ │ └── partials/
│ │ └── logo.html
│ ├── quickstart/
│ │ ├── index.md
│ │ └── workflow.json
│ ├── resources/
│ │ ├── contributing.md
│ │ ├── license.md
│ │ └── related.md
│ └── robots.txt
├── es6-persistence/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── es6/
│ │ └── config/
│ │ ├── ElasticSearch6DeprecationConfiguration.java
│ │ └── ElasticSearchConditions.java
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── es6/
│ └── config/
│ └── ElasticSearch6DeprecationTest.java
├── es7-persistence/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── es7/
│ │ │ ├── config/
│ │ │ │ ├── ElasticSearchConditions.java
│ │ │ │ ├── ElasticSearchProperties.java
│ │ │ │ └── ElasticSearchV7Configuration.java
│ │ │ └── dao/
│ │ │ ├── index/
│ │ │ │ ├── BulkRequestBuilderWrapper.java
│ │ │ │ ├── BulkRequestWrapper.java
│ │ │ │ ├── ElasticSearchBaseDAO.java
│ │ │ │ └── ElasticSearchRestDAOV7.java
│ │ │ └── query/
│ │ │ └── parser/
│ │ │ ├── Expression.java
│ │ │ ├── FilterProvider.java
│ │ │ ├── GroupedExpression.java
│ │ │ ├── NameValue.java
│ │ │ └── internal/
│ │ │ ├── AbstractNode.java
│ │ │ ├── BooleanOp.java
│ │ │ ├── ComparisonOp.java
│ │ │ ├── ConstValue.java
│ │ │ ├── FunctionThrowingException.java
│ │ │ ├── ListConst.java
│ │ │ ├── Name.java
│ │ │ ├── ParserException.java
│ │ │ └── Range.java
│ │ └── resources/
│ │ ├── mappings_docType_task.json
│ │ ├── mappings_docType_workflow.json
│ │ ├── template_event.json
│ │ ├── template_message.json
│ │ └── template_task_log.json
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── es7/
│ │ ├── config/
│ │ │ └── ElasticSearchPropertiesTest.java
│ │ ├── dao/
│ │ │ ├── index/
│ │ │ │ ├── ElasticSearchRestDaoBaseTest.java
│ │ │ │ ├── ElasticSearchTest.java
│ │ │ │ ├── TestBulkRequestBuilderWrapper.java
│ │ │ │ ├── TestElasticSearchRestDAOV7.java
│ │ │ │ └── TestElasticSearchRestDAOV7Batch.java
│ │ │ └── query/
│ │ │ └── parser/
│ │ │ ├── TestExpression.java
│ │ │ ├── TestGroupedExpression.java
│ │ │ └── internal/
│ │ │ ├── AbstractParserTest.java
│ │ │ ├── TestBooleanOp.java
│ │ │ ├── TestComparisonOp.java
│ │ │ ├── TestConstValue.java
│ │ │ └── TestName.java
│ │ └── utils/
│ │ └── TestUtils.java
│ └── resources/
│ ├── expected_template_task_log.json
│ ├── task_summary.json
│ └── workflow_summary.json
├── es8-persistence/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── conductoross/
│ │ │ └── conductor/
│ │ │ └── es8/
│ │ │ ├── config/
│ │ │ │ ├── ElasticSearchConditions.java
│ │ │ │ ├── ElasticSearchProperties.java
│ │ │ │ └── ElasticSearchV8Configuration.java
│ │ │ └── dao/
│ │ │ ├── index/
│ │ │ │ ├── ElasticSearchRestDAOV8.java
│ │ │ │ ├── Es8BulkIngestionSupport.java
│ │ │ │ ├── Es8IndexManagementSupport.java
│ │ │ │ └── Es8SearchSupport.java
│ │ │ └── query/
│ │ │ └── parser/
│ │ │ ├── Expression.java
│ │ │ ├── FilterProvider.java
│ │ │ ├── GroupedExpression.java
│ │ │ ├── NameValue.java
│ │ │ └── internal/
│ │ │ ├── AbstractNode.java
│ │ │ ├── BooleanOp.java
│ │ │ ├── ComparisonOp.java
│ │ │ ├── ConstValue.java
│ │ │ ├── FunctionThrowingException.java
│ │ │ ├── ListConst.java
│ │ │ ├── Name.java
│ │ │ ├── ParserException.java
│ │ │ └── Range.java
│ │ └── resources/
│ │ ├── template_event.json
│ │ ├── template_message.json
│ │ ├── template_task.json
│ │ ├── template_task_log.json
│ │ └── template_workflow.json
│ └── test/
│ ├── java/
│ │ └── org/
│ │ └── conductoross/
│ │ └── conductor/
│ │ └── es8/
│ │ ├── config/
│ │ │ ├── ElasticSearchConditionsTest.java
│ │ │ └── ElasticSearchPropertiesTest.java
│ │ ├── dao/
│ │ │ ├── index/
│ │ │ │ ├── ElasticSearchRestDAOV8ResourceExistenceTest.java
│ │ │ │ ├── ElasticSearchRestDaoBaseTest.java
│ │ │ │ ├── ElasticSearchTest.java
│ │ │ │ ├── Es8BulkIngestionSupportTest.java
│ │ │ │ ├── Es8SearchSupportTest.java
│ │ │ │ ├── TestElasticSearchRestDAOV8.java
│ │ │ │ └── TestElasticSearchRestDAOV8Batch.java
│ │ │ └── query/
│ │ │ └── parser/
│ │ │ ├── TestExpression.java
│ │ │ ├── TestGroupedExpression.java
│ │ │ ├── TestNameValueQueryBuilder.java
│ │ │ └── internal/
│ │ │ ├── AbstractParserTest.java
│ │ │ ├── TestBooleanOp.java
│ │ │ ├── TestComparisonOp.java
│ │ │ ├── TestConstValue.java
│ │ │ └── TestName.java
│ │ └── utils/
│ │ └── TestUtils.java
│ └── resources/
│ ├── expected_template_task_log.json
│ ├── task_summary.json
│ └── workflow_summary.json
├── family.properties
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── grpc/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── grpc/
│ │ │ ├── AbstractProtoMapper.java
│ │ │ └── ProtoMapper.java
│ │ └── proto/
│ │ ├── grpc/
│ │ │ ├── event_service.proto
│ │ │ ├── metadata_service.proto
│ │ │ ├── search.proto
│ │ │ ├── task_service.proto
│ │ │ └── workflow_service.proto
│ │ └── model/
│ │ ├── cacheconfig.proto
│ │ ├── dynamicforkjointask.proto
│ │ ├── dynamicforkjointasklist.proto
│ │ ├── eventexecution.proto
│ │ ├── eventhandler.proto
│ │ ├── executionmetadata.proto
│ │ ├── polldata.proto
│ │ ├── ratelimitconfig.proto
│ │ ├── rerunworkflowrequest.proto
│ │ ├── schemadef.proto
│ │ ├── skiptaskrequest.proto
│ │ ├── startworkflowrequest.proto
│ │ ├── statechangeevent.proto
│ │ ├── subworkflowparams.proto
│ │ ├── task.proto
│ │ ├── taskdef.proto
│ │ ├── taskexeclog.proto
│ │ ├── taskresult.proto
│ │ ├── tasksummary.proto
│ │ ├── upgradeworkflowrequest.proto
│ │ ├── workflow.proto
│ │ ├── workflowdef.proto
│ │ ├── workflowdefsummary.proto
│ │ ├── workflowsummary.proto
│ │ └── workflowtask.proto
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── grpc/
│ └── TestProtoMapper.java
├── grpc-client/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── client/
│ │ └── grpc/
│ │ ├── ClientBase.java
│ │ ├── EventClient.java
│ │ ├── MetadataClient.java
│ │ ├── TaskClient.java
│ │ └── WorkflowClient.java
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── client/
│ │ └── grpc/
│ │ ├── EventClientTest.java
│ │ ├── TaskClientTest.java
│ │ └── WorkflowClientTest.java
│ └── resources/
│ └── mockito-extensions/
│ └── org.mockito.plugins.MockMaker
├── grpc-server/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── grpc/
│ │ └── server/
│ │ ├── GRPCServer.java
│ │ ├── GRPCServerProperties.java
│ │ ├── GrpcConfiguration.java
│ │ └── service/
│ │ ├── EventServiceImpl.java
│ │ ├── GRPCHelper.java
│ │ ├── HealthServiceImpl.java
│ │ ├── MetadataServiceImpl.java
│ │ ├── TaskServiceImpl.java
│ │ └── WorkflowServiceImpl.java
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── grpc/
│ │ └── server/
│ │ └── service/
│ │ ├── HealthServiceImplTest.java
│ │ ├── TaskServiceImplTest.java
│ │ └── WorkflowServiceImplTest.java
│ └── resources/
│ └── log4j.properties
├── hooks/
│ └── pre-commit
├── http-task/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── tasks/
│ │ │ └── http/
│ │ │ ├── HttpTask.java
│ │ │ └── providers/
│ │ │ ├── DefaultRestTemplateProvider.java
│ │ │ └── RestTemplateProvider.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── additional-spring-configuration-metadata.json
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── tasks/
│ └── http/
│ ├── HttpTaskTest.java
│ ├── HttpTaskUnitTest.java
│ └── providers/
│ └── DefaultRestTemplateProviderTest.java
├── json-jq-task/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── tasks/
│ │ └── json/
│ │ └── JsonJqTransform.java
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── tasks/
│ └── json/
│ └── JsonJqTransformTest.java
├── kafka/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ ├── contribs/
│ │ │ └── tasks/
│ │ │ └── kafka/
│ │ │ ├── KafkaProducerManager.java
│ │ │ └── KafkaPublishTask.java
│ │ └── core/
│ │ └── execution/
│ │ └── mapper/
│ │ └── KafkaPublishTaskMapper.java
│ └── test/
│ ├── groovy/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── test/
│ │ └── integration/
│ │ └── KafkaPublishTaskSpec.groovy
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ ├── contribs/
│ │ │ └── tasks/
│ │ │ └── kafka/
│ │ │ ├── KafkaProducerManagerTest.java
│ │ │ └── KafkaPublishTaskTest.java
│ │ └── core/
│ │ └── execution/
│ │ └── mapper/
│ │ └── KafkaPublishTaskMapperTest.java
│ └── resources/
│ ├── application-integrationtest.properties
│ ├── input.json
│ ├── output.json
│ └── simple_json_jq_transform_integration_test.json
├── kafka-event-queue/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── kafkaeq/
│ │ │ ├── config/
│ │ │ │ ├── KafkaEventQueueConfiguration.java
│ │ │ │ ├── KafkaEventQueueProperties.java
│ │ │ │ └── KafkaEventQueueProvider.java
│ │ │ └── eventqueue/
│ │ │ └── KafkaObservableQueue.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── additional-spring-configuration-metadata.json
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── kafkaeq/
│ └── eventqueue/
│ └── KafkaObservableQueueTest.java
├── licenseheader.txt
├── main.py
├── metrics/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── contribs/
│ └── metrics/
│ ├── AzureMonitorMetricsConfiguration.java
│ ├── CloudWatchMetricsConfiguration.java
│ ├── LoggingMetricsConfiguration.java
│ └── MetricsCollector.java
├── mkdocs.yml
├── mysql-persistence/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── mysql/
│ │ │ ├── config/
│ │ │ │ ├── MySQLConfiguration.java
│ │ │ │ └── MySQLProperties.java
│ │ │ ├── dao/
│ │ │ │ ├── MySQLBaseDAO.java
│ │ │ │ ├── MySQLExecutionDAO.java
│ │ │ │ ├── MySQLMetadataDAO.java
│ │ │ │ └── MySQLQueueDAO.java
│ │ │ └── util/
│ │ │ ├── ExecuteFunction.java
│ │ │ ├── LazyToString.java
│ │ │ ├── Query.java
│ │ │ ├── QueryFunction.java
│ │ │ ├── ResultSetHandler.java
│ │ │ └── TransactionalFunction.java
│ │ └── resources/
│ │ └── db/
│ │ └── migration/
│ │ ├── V1__initial_schema.sql
│ │ ├── V2__queue_message_timestamps.sql
│ │ ├── V3__queue_add_priority.sql
│ │ ├── V4__1009_Fix_MySQLExecutionDAO_Index.sql
│ │ ├── V5__correlation_id_index.sql
│ │ ├── V6__new_qm_index_with_priority.sql
│ │ ├── V7__new_queue_message_pk.sql
│ │ └── V8__update_pk.sql
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ ├── mysql/
│ │ │ └── dao/
│ │ │ ├── MySQLExecutionDAOTest.java
│ │ │ ├── MySQLMetadataDAOTest.java
│ │ │ └── MySQLQueueDAOTest.java
│ │ └── test/
│ │ └── integration/
│ │ └── grpc/
│ │ └── mysql/
│ │ └── MySQLGrpcEndToEndTest.java
│ └── resources/
│ └── application.properties
├── nats/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── contribs/
│ │ └── queue/
│ │ └── nats/
│ │ ├── JetStreamObservableQueue.java
│ │ ├── JsmMessage.java
│ │ ├── LoggingNatsErrorListener.java
│ │ ├── NATSAbstractQueue.java
│ │ ├── NATSObservableQueue.java
│ │ ├── NatsException.java
│ │ └── config/
│ │ ├── JetStreamConfiguration.java
│ │ ├── JetStreamEventQueueProvider.java
│ │ ├── JetStreamProperties.java
│ │ ├── NATSConfiguration.java
│ │ └── NATSEventQueueProvider.java
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── contribs/
│ └── queue/
│ └── nats/
│ └── JetStreamObservableQueueTest.java
├── nats-streaming/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── contribs/
│ └── queue/
│ └── stan/
│ ├── NATSAbstractQueue.java
│ ├── NATSObservableQueue.java
│ ├── NATSStreamObservableQueue.java
│ └── config/
│ ├── NATSConfiguration.java
│ ├── NATSEventQueueProvider.java
│ ├── NATSStreamConfiguration.java
│ ├── NATSStreamEventQueueProvider.java
│ └── NATSStreamProperties.java
├── os-persistence/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── os/
│ │ └── config/
│ │ └── OpenSearchDeprecationConfiguration.java
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── os/
│ └── config/
│ └── OpenSearchDeprecationTest.java
├── os-persistence-v2/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── conductoross/
│ │ │ └── conductor/
│ │ │ └── os2/
│ │ │ ├── config/
│ │ │ │ ├── OpenSearchConditions.java
│ │ │ │ ├── OpenSearchConfiguration.java
│ │ │ │ └── OpenSearchProperties.java
│ │ │ └── dao/
│ │ │ ├── index/
│ │ │ │ ├── BulkRequestBuilderWrapper.java
│ │ │ │ ├── BulkRequestWrapper.java
│ │ │ │ ├── OpenSearchBaseDAO.java
│ │ │ │ └── OpenSearchRestDAO.java
│ │ │ └── query/
│ │ │ └── parser/
│ │ │ ├── Expression.java
│ │ │ ├── FilterProvider.java
│ │ │ ├── GroupedExpression.java
│ │ │ ├── NameValue.java
│ │ │ └── internal/
│ │ │ ├── AbstractNode.java
│ │ │ ├── BooleanOp.java
│ │ │ ├── ComparisonOp.java
│ │ │ ├── ConstValue.java
│ │ │ ├── FunctionThrowingException.java
│ │ │ ├── ListConst.java
│ │ │ ├── Name.java
│ │ │ ├── ParserException.java
│ │ │ └── Range.java
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ ├── mappings_docType_task.json
│ │ ├── mappings_docType_workflow.json
│ │ ├── template_event.json
│ │ ├── template_message.json
│ │ └── template_task_log.json
│ └── test/
│ ├── java/
│ │ └── org/
│ │ └── conductoross/
│ │ └── conductor/
│ │ └── os2/
│ │ ├── config/
│ │ │ └── OpenSearchPropertiesTest.java
│ │ ├── dao/
│ │ │ ├── index/
│ │ │ │ ├── OpenSearchRestDaoBaseTest.java
│ │ │ │ ├── OpenSearchTest.java
│ │ │ │ ├── TestBulkRequestBuilderWrapper.java
│ │ │ │ ├── TestOpenSearchRestDAO.java
│ │ │ │ └── TestOpenSearchRestDAOBatch.java
│ │ │ └── query/
│ │ │ └── parser/
│ │ │ ├── TestExpression.java
│ │ │ ├── TestGroupedExpression.java
│ │ │ └── internal/
│ │ │ ├── AbstractParserTest.java
│ │ │ ├── TestBooleanOp.java
│ │ │ ├── TestComparisonOp.java
│ │ │ ├── TestConstValue.java
│ │ │ └── TestName.java
│ │ └── utils/
│ │ └── TestUtils.java
│ └── resources/
│ ├── expected_template_task_log.json
│ ├── task_summary.json
│ └── workflow_summary.json
├── os-persistence-v3/
│ ├── MIGRATION_GUIDE.md
│ ├── MIGRATION_PLAN.md
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── conductoross/
│ │ │ └── conductor/
│ │ │ └── os3/
│ │ │ ├── config/
│ │ │ │ ├── OpenSearchConditions.java
│ │ │ │ ├── OpenSearchConfiguration.java
│ │ │ │ └── OpenSearchProperties.java
│ │ │ └── dao/
│ │ │ ├── index/
│ │ │ │ ├── OpenSearchBaseDAO.java
│ │ │ │ ├── OpenSearchRestDAO.java
│ │ │ │ └── QueryHelper.java
│ │ │ └── query/
│ │ │ └── parser/
│ │ │ ├── Expression.java
│ │ │ ├── FilterProvider.java
│ │ │ ├── GroupedExpression.java
│ │ │ ├── NameValue.java
│ │ │ └── internal/
│ │ │ ├── AbstractNode.java
│ │ │ ├── BooleanOp.java
│ │ │ ├── ComparisonOp.java
│ │ │ ├── ConstValue.java
│ │ │ ├── FunctionThrowingException.java
│ │ │ ├── ListConst.java
│ │ │ ├── Name.java
│ │ │ ├── ParserException.java
│ │ │ └── Range.java
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ ├── mappings_docType_task.json
│ │ ├── mappings_docType_workflow.json
│ │ ├── template_event.json
│ │ ├── template_message.json
│ │ └── template_task_log.json
│ └── test/
│ ├── java/
│ │ └── org/
│ │ └── conductoross/
│ │ └── conductor/
│ │ └── os3/
│ │ ├── config/
│ │ │ ├── OpenSearchModuleActivationTest.java.bak
│ │ │ ├── OpenSearchModuleActivationTest.java.bak2
│ │ │ └── OpenSearchPropertiesTest.java
│ │ ├── dao/
│ │ │ ├── index/
│ │ │ │ ├── OpenSearchRestDaoBaseTest.java
│ │ │ │ ├── OpenSearchTest.java
│ │ │ │ ├── QuickV3Test.java
│ │ │ │ ├── TestOpenSearchRestDAO.java
│ │ │ │ └── TestOpenSearchRestDAOBatch.java
│ │ │ └── query/
│ │ │ └── parser/
│ │ │ ├── TestExpression.java
│ │ │ ├── TestGroupedExpression.java
│ │ │ └── internal/
│ │ │ ├── AbstractParserTest.java
│ │ │ ├── TestBooleanOp.java
│ │ │ ├── TestComparisonOp.java
│ │ │ ├── TestConstValue.java
│ │ │ └── TestName.java
│ │ └── utils/
│ │ └── TestUtils.java
│ └── resources/
│ ├── expected_template_task_log.json
│ ├── task_summary.json
│ └── workflow_summary.json
├── polyglot-clients/
│ └── README.md
├── postgres-external-storage/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── postgres/
│ │ │ ├── config/
│ │ │ │ ├── PostgresPayloadConfiguration.java
│ │ │ │ └── PostgresPayloadProperties.java
│ │ │ ├── controller/
│ │ │ │ └── ExternalPostgresPayloadResource.java
│ │ │ └── storage/
│ │ │ └── PostgresPayloadStorage.java
│ │ └── resources/
│ │ └── db/
│ │ └── migration_external_postgres/
│ │ └── R__initial_schema.sql
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── postgres/
│ ├── controller/
│ │ └── ExternalPostgresPayloadResourceTest.java
│ └── storage/
│ ├── PostgresPayloadStorageTest.java
│ └── PostgresPayloadTestUtil.java
├── postgres-persistence/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── postgres/
│ │ │ ├── config/
│ │ │ │ ├── PostgresConfiguration.java
│ │ │ │ └── PostgresProperties.java
│ │ │ ├── dao/
│ │ │ │ ├── PostgresBaseDAO.java
│ │ │ │ ├── PostgresExecutionDAO.java
│ │ │ │ ├── PostgresIndexDAO.java
│ │ │ │ ├── PostgresLockDAO.java
│ │ │ │ ├── PostgresMetadataDAO.java
│ │ │ │ ├── PostgresPollDataDAO.java
│ │ │ │ └── PostgresQueueDAO.java
│ │ │ └── util/
│ │ │ ├── ExecuteFunction.java
│ │ │ ├── ExecutorsUtil.java
│ │ │ ├── LazyToString.java
│ │ │ ├── PostgresIndexQueryBuilder.java
│ │ │ ├── PostgresQueueListener.java
│ │ │ ├── Query.java
│ │ │ ├── QueryFunction.java
│ │ │ ├── QueueStats.java
│ │ │ ├── ResultSetHandler.java
│ │ │ └── TransactionalFunction.java
│ │ └── resources/
│ │ └── db/
│ │ ├── migration_postgres/
│ │ │ ├── V10__poll_data_check.sql
│ │ │ ├── V11__locking.sql
│ │ │ ├── V12__task_index_columns.sql
│ │ │ ├── V13.1__workflow_index_columns.sql
│ │ │ ├── V1__initial_schema.sql
│ │ │ ├── V2__1009_Fix_PostgresExecutionDAO_Index.sql
│ │ │ ├── V3__correlation_id_index.sql
│ │ │ ├── V4__new_qm_index_with_priority.sql
│ │ │ ├── V5__new_queue_message_pk.sql
│ │ │ ├── V6__update_pk.sql
│ │ │ ├── V7__new_qm_index_desc_priority.sql
│ │ │ ├── V8__indexing.sql
│ │ │ └── V9__indexing_index_fix.sql
│ │ ├── migration_postgres_data/
│ │ │ └── V13.2__workflow_index_backfill_update_time.sql
│ │ └── migration_postgres_notify/
│ │ └── V10.1__notify.sql
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ ├── postgres/
│ │ │ ├── config/
│ │ │ │ └── PostgresConfigurationDataMigrationTest.java
│ │ │ ├── dao/
│ │ │ │ ├── PostgresExecutionDAOTest.java
│ │ │ │ ├── PostgresIndexDAOStatusChangeOnlyTest.java
│ │ │ │ ├── PostgresIndexDAOTest.java
│ │ │ │ ├── PostgresLockDAOTest.java
│ │ │ │ ├── PostgresMetadataDAOTest.java
│ │ │ │ ├── PostgresPollDataDAOCacheTest.java
│ │ │ │ ├── PostgresPollDataDAONoCacheTest.java
│ │ │ │ └── PostgresQueueDAOTest.java
│ │ │ ├── performance/
│ │ │ │ └── PerformanceTest.java
│ │ │ └── util/
│ │ │ ├── PostgresIndexQueryBuilderTest.java
│ │ │ └── PostgresQueueListenerTest.java
│ │ └── test/
│ │ └── integration/
│ │ └── grpc/
│ │ └── postgres/
│ │ └── PostgresGrpcEndToEndTest.java
│ └── resources/
│ └── application.properties
├── redis-concurrency-limit/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── redis/
│ │ └── limit/
│ │ ├── RedisConcurrentExecutionLimitDAO.java
│ │ └── config/
│ │ ├── RedisConcurrentExecutionLimitConfiguration.java
│ │ └── RedisConcurrentExecutionLimitProperties.java
│ └── test/
│ └── groovy/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── redis/
│ └── limit/
│ └── RedisConcurrentExecutionLimitDAOSpec.groovy
├── redis-lock/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── redislock/
│ │ │ ├── config/
│ │ │ │ ├── RedisHealthIndicator.java
│ │ │ │ ├── RedisLockConfiguration.java
│ │ │ │ └── RedisLockProperties.java
│ │ │ └── lock/
│ │ │ └── RedisLock.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── additional-spring-configuration-metadata.json
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ ├── redis/
│ │ └── lock/
│ │ └── RedisLockTest.java
│ └── redislock/
│ └── config/
│ └── RedisHealthIndicatorTest.java
├── redis-persistence/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── netflix/
│ │ ├── conductor/
│ │ │ └── redis/
│ │ │ ├── config/
│ │ │ │ ├── AnyRedisCondition.java
│ │ │ │ ├── InMemoryRedisConfiguration.java
│ │ │ │ ├── JedisCommandsConfigurer.java
│ │ │ │ ├── RedisClusterConfiguration.java
│ │ │ │ ├── RedisProperties.java
│ │ │ │ ├── RedisSentinelConfiguration.java
│ │ │ │ └── RedisStandaloneConfiguration.java
│ │ │ ├── dao/
│ │ │ │ ├── BaseDynoDAO.java
│ │ │ │ ├── RedisEventHandlerDAO.java
│ │ │ │ ├── RedisExecutionDAO.java
│ │ │ │ ├── RedisMetadataDAO.java
│ │ │ │ ├── RedisPollDataDAO.java
│ │ │ │ └── RedisRateLimitingDAO.java
│ │ │ ├── dynoqueue/
│ │ │ │ ├── ConfigurationHostSupplier.java
│ │ │ │ └── LocalhostHostSupplier.java
│ │ │ └── jedis/
│ │ │ ├── JedisCluster.java
│ │ │ ├── JedisMock.java
│ │ │ ├── JedisProxy.java
│ │ │ ├── JedisSentinel.java
│ │ │ └── JedisStandalone.java
│ │ └── dyno/
│ │ └── connectionpool/
│ │ ├── Host.java
│ │ ├── HostBuilder.java
│ │ └── HostSupplier.java
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── redis/
│ ├── dao/
│ │ ├── BaseDynoDAOTest.java
│ │ ├── RedisEventHandlerDAOTest.java
│ │ ├── RedisExecutionDAOTest.java
│ │ ├── RedisMetadataDAOTest.java
│ │ ├── RedisPollDataDAOTest.java
│ │ └── RedisRateLimitDAOTest.java
│ └── jedis/
│ ├── ConfigurationHostSupplierTest.java
│ ├── JedisClusterTest.java
│ └── JedisSentinelTest.java
├── requirements.txt
├── rest/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ ├── com/
│ │ │ │ └── netflix/
│ │ │ │ └── conductor/
│ │ │ │ └── rest/
│ │ │ │ ├── config/
│ │ │ │ │ └── RequestMappingConstants.java
│ │ │ │ ├── controllers/
│ │ │ │ │ ├── AdminResource.java
│ │ │ │ │ ├── ApplicationExceptionMapper.java
│ │ │ │ │ ├── EventResource.java
│ │ │ │ │ ├── HealthCheckResource.java
│ │ │ │ │ ├── MetadataResource.java
│ │ │ │ │ ├── QueueAdminResource.java
│ │ │ │ │ ├── TaskResource.java
│ │ │ │ │ ├── ValidationExceptionMapper.java
│ │ │ │ │ ├── WorkflowBulkResource.java
│ │ │ │ │ └── WorkflowResource.java
│ │ │ │ └── startup/
│ │ │ │ └── KitchenSinkInitializer.java
│ │ │ └── org/
│ │ │ └── conductoross/
│ │ │ └── conductor/
│ │ │ ├── RestConfiguration.java
│ │ │ ├── SpaInterceptor.java
│ │ │ └── controllers/
│ │ │ └── VersionResource.java
│ │ └── resources/
│ │ ├── kitchensink/
│ │ │ ├── kitchenSink-ephemeralWorkflowWithEphemeralTasks.json
│ │ │ ├── kitchenSink-ephemeralWorkflowWithStoredTasks.json
│ │ │ ├── kitchensink.json
│ │ │ ├── sub_flow_1.json
│ │ │ ├── wf1.json
│ │ │ └── wf2.json
│ │ └── static/
│ │ └── index.html
│ └── test/
│ └── java/
│ ├── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── rest/
│ │ └── controllers/
│ │ ├── AdminResourceTest.java
│ │ ├── ApplicationExceptionMapperTest.java
│ │ ├── EventResourceTest.java
│ │ ├── MetadataResourceTest.java
│ │ ├── TaskResourceTest.java
│ │ └── WorkflowResourceTest.java
│ └── org/
│ └── conductoross/
│ └── conductor/
│ └── SpaInterceptorTest.java
├── scheduler/
│ ├── SCHEDULER_DAO_TEST_PLAN.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── conductoross/
│ │ │ └── conductor/
│ │ │ └── scheduler/
│ │ │ ├── config/
│ │ │ │ ├── SchedulerProperties.java
│ │ │ │ └── WorkflowSchedulerConfiguration.java
│ │ │ ├── dao/
│ │ │ │ ├── SchedulerCacheDAO.java
│ │ │ │ └── SchedulerDAO.java
│ │ │ ├── model/
│ │ │ │ ├── WorkflowSchedule.java
│ │ │ │ └── WorkflowScheduleExecution.java
│ │ │ ├── rest/
│ │ │ │ └── SchedulerResource.java
│ │ │ └── service/
│ │ │ └── SchedulerService.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── spring/
│ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ ├── test/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── conductoross/
│ │ │ └── conductor/
│ │ │ └── scheduler/
│ │ │ ├── config/
│ │ │ │ └── TestObjectMapperConfiguration.java
│ │ │ ├── rest/
│ │ │ │ ├── SchedulerResourceHttpTest.java
│ │ │ │ └── SchedulerResourceTest.java
│ │ │ └── service/
│ │ │ ├── SchedulerServicePhase2Test.java
│ │ │ ├── SchedulerServiceStressTest.java
│ │ │ └── SchedulerServiceTest.java
│ │ └── resources/
│ │ └── application.properties
│ └── testFixtures/
│ └── java/
│ └── org/
│ └── conductoross/
│ └── conductor/
│ └── scheduler/
│ ├── config/
│ │ └── AbstractSchedulerAutoConfigurationSmokeTest.java
│ ├── dao/
│ │ └── AbstractSchedulerDAOTest.java
│ └── service/
│ └── AbstractSchedulerServiceIntegrationTest.java
├── scheduler-mysql-persistence/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── conductoross/
│ │ │ └── conductor/
│ │ │ └── scheduler/
│ │ │ └── mysql/
│ │ │ ├── config/
│ │ │ │ └── MySQLSchedulerConfiguration.java
│ │ │ └── dao/
│ │ │ └── MySQLSchedulerDAO.java
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── db/
│ │ └── migration_scheduler_mysql/
│ │ └── V1__scheduler_tables.sql
│ └── test/
│ ├── java/
│ │ └── org/
│ │ └── conductoross/
│ │ └── conductor/
│ │ └── scheduler/
│ │ └── mysql/
│ │ ├── config/
│ │ │ └── MySQLSchedulerAutoConfigurationSmokeTest.java
│ │ ├── dao/
│ │ │ └── MySQLSchedulerDAOTest.java
│ │ └── service/
│ │ └── MySQLSchedulerServiceIntegrationTest.java
│ └── resources/
│ └── application.properties
├── scheduler-postgres-persistence/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── conductoross/
│ │ │ └── conductor/
│ │ │ └── scheduler/
│ │ │ └── postgres/
│ │ │ ├── config/
│ │ │ │ └── PostgresSchedulerConfiguration.java
│ │ │ └── dao/
│ │ │ └── PostgresSchedulerDAO.java
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── db/
│ │ └── migration_scheduler/
│ │ └── V1__scheduler_tables.sql
│ └── test/
│ ├── java/
│ │ └── org/
│ │ └── conductoross/
│ │ └── conductor/
│ │ └── scheduler/
│ │ └── postgres/
│ │ ├── config/
│ │ │ └── PostgresSchedulerAutoConfigurationSmokeTest.java
│ │ ├── dao/
│ │ │ └── PostgresSchedulerDAOTest.java
│ │ └── service/
│ │ └── PostgresSchedulerServiceIntegrationTest.java
│ └── resources/
│ └── application.properties
├── schemas/
│ ├── README.md
│ ├── Task.json
│ ├── TaskDef.json
│ ├── Workflow.json
│ └── WorkflowDef.json
├── scripts/
│ └── fetch-sdk-docs.py
├── serve-docs.sh
├── server/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── Conductor.java
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ └── additional-spring-configuration-metadata.json
│ │ ├── application.properties
│ │ ├── banner.txt
│ │ └── log4j2.xml
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── common/
│ └── config/
│ └── ConductorObjectMapperTest.java
├── server-lite/
│ ├── build.gradle
│ ├── build_ui.sh
│ └── src/
│ └── main/
│ ├── java/
│ │ └── org/
│ │ └── conductoross/
│ │ └── conductor/
│ │ └── Conductor.java
│ └── resources/
│ └── application.properties
├── settings.gradle
├── springboot-bom-overrides.gradle
├── sqlite-persistence/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── sqlite/
│ │ │ ├── config/
│ │ │ │ ├── SqliteConfiguration.java
│ │ │ │ └── SqliteProperties.java
│ │ │ ├── dao/
│ │ │ │ ├── SqliteBaseDAO.java
│ │ │ │ ├── SqliteExecutionDAO.java
│ │ │ │ ├── SqliteIndexDAO.java
│ │ │ │ ├── SqlitePollDataDAO.java
│ │ │ │ ├── SqliteQueueDAO.java
│ │ │ │ └── metadata/
│ │ │ │ ├── SqliteEventHandlerMetadataDAO.java
│ │ │ │ ├── SqliteMetadataDAO.java
│ │ │ │ ├── SqliteTaskMetadataDAO.java
│ │ │ │ └── SqliteWorkflowMetadataDAO.java
│ │ │ └── util/
│ │ │ ├── ExecuteFunction.java
│ │ │ ├── ExecutorsUtil.java
│ │ │ ├── LazyToString.java
│ │ │ ├── Query.java
│ │ │ ├── QueryFunction.java
│ │ │ ├── QueueStats.java
│ │ │ ├── ResultSetHandler.java
│ │ │ ├── SqliteIndexQueryBuilder.java
│ │ │ └── TransactionalFunction.java
│ │ └── resources/
│ │ └── db/
│ │ └── migration_sqlite/
│ │ └── V1__initial_schema.sql
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── sqlite/
│ │ └── dao/
│ │ ├── SqliteExecutionDAOTest.java
│ │ ├── SqliteIndexDAOTest.java
│ │ ├── SqliteMetadataDAOTest.java
│ │ ├── SqlitePollDataTest.java
│ │ └── SqliteQueueDAOTest.java
│ └── resources/
│ └── application.properties
├── task-status-listener/
│ ├── build.gradle
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── contribs/
│ └── listener/
│ ├── RestClientManager.java
│ ├── StatusNotifier.java
│ ├── StatusNotifierNotificationProperties.java
│ ├── TaskNotification.java
│ ├── TaskStatusPublisher.java
│ └── TaskStatusPublisherConfiguration.java
├── test-harness/
│ ├── build.gradle
│ └── src/
│ └── test/
│ ├── groovy/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── test/
│ │ ├── base/
│ │ │ ├── AbstractResiliencySpecification.groovy
│ │ │ └── AbstractSpecification.groovy
│ │ ├── integration/
│ │ │ ├── DecisionTaskSpec.groovy
│ │ │ ├── DoWhileSpec.groovy
│ │ │ ├── DynamicForkJoinSpec.groovy
│ │ │ ├── EventTaskSpec.groovy
│ │ │ ├── ExclusiveJoinSpec.groovy
│ │ │ ├── ExternalPayloadStorageSpec.groovy
│ │ │ ├── FailureWorkflowSpec.groovy
│ │ │ ├── ForkJoinSpec.groovy
│ │ │ ├── HierarchicalForkJoinSubworkflowRerunSpec.groovy
│ │ │ ├── HierarchicalForkJoinSubworkflowRestartSpec.groovy
│ │ │ ├── HierarchicalForkJoinSubworkflowRetrySpec.groovy
│ │ │ ├── JsonJQTransformSpec.groovy
│ │ │ ├── LambdaAndTerminateTaskSpec.groovy
│ │ │ ├── NestedForkJoinSubWorkflowSpec.groovy
│ │ │ ├── S3ExternalPayloadStorageE2ESpec.groovy
│ │ │ ├── SQSEventQueueE2ESpec.groovy
│ │ │ ├── SetVariableTaskSpec.groovy
│ │ │ ├── SimpleWorkflowSpec.groovy
│ │ │ ├── StartWorkflowSpec.groovy
│ │ │ ├── SubWorkflowRerunSpec.groovy
│ │ │ ├── SubWorkflowRestartSpec.groovy
│ │ │ ├── SubWorkflowRetrySpec.groovy
│ │ │ ├── SubWorkflowSpec.groovy
│ │ │ ├── SwitchTaskSpec.groovy
│ │ │ ├── SystemTaskSpec.groovy
│ │ │ ├── TaskLimitsWorkflowSpec.groovy
│ │ │ ├── TestWorkflowSpec.groovy
│ │ │ ├── WaitTaskSpec.groovy
│ │ │ └── WorkflowAndTaskConfigurationSpec.groovy
│ │ ├── resiliency/
│ │ │ ├── QueueResiliencySpec.groovy
│ │ │ └── TaskResiliencySpec.groovy
│ │ └── util/
│ │ └── WorkflowTestUtil.groovy
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ ├── ConductorTestApp.java
│ │ └── test/
│ │ ├── config/
│ │ │ ├── LocalStackS3Configuration.java
│ │ │ └── LocalStackSQSConfiguration.java
│ │ ├── integration/
│ │ │ ├── TestHarnessAbstractEndToEndTest.java
│ │ │ ├── grpc/
│ │ │ │ ├── GrpcEndToEndTest.java
│ │ │ │ └── TestHarnessAbstractGrpcEndToEndTest.java
│ │ │ └── http/
│ │ │ ├── ForkJoinSyncModeIntegrationTest.java
│ │ │ ├── HttpEndToEndTestTestHarness.java
│ │ │ └── TestHarnessAbstractHttpEndToEndTest.java
│ │ └── utils/
│ │ ├── MockExternalPayloadStorage.java
│ │ └── UserTask.java
│ └── resources/
│ ├── application-integrationtest.properties
│ ├── application-s3test.properties
│ ├── application-sqstest.properties
│ ├── concurrency_limited_task_workflow_integration_test.json
│ ├── conditional_switch_task_workflow_integration_test.json
│ ├── conditional_system_task_workflow_integration_test.json
│ ├── conditional_task_workflow_integration_test.json
│ ├── decision_and_fork_join_integration_test.json
│ ├── decision_and_terminate_integration_test.json
│ ├── do_while_as_subtask_integration_test.json
│ ├── do_while_cleanup_demo.json
│ ├── do_while_five_loop_over_integration_test.json
│ ├── do_while_high_iteration_test.json
│ ├── do_while_integration_test.json
│ ├── do_while_iteration_fix_test.json
│ ├── do_while_multiple_integration_test.json
│ ├── do_while_set_variable_fix.json
│ ├── do_while_sub_workflow_integration_test.json
│ ├── do_while_system_tasks.json
│ ├── do_while_timeline_ui_demo.json
│ ├── do_while_with_decision_task.json
│ ├── dynamic_fork_join_integration_test.json
│ ├── event_workflow_integration_test.json
│ ├── exclusive_join_integration_test.json
│ ├── failure_workflow_for_terminate_task_workflow.json
│ ├── fork_join_integration_test.json
│ ├── fork_join_permissive_integration_test.json
│ ├── fork_join_sub_workflow.json
│ ├── fork_join_sync_mode_integration_test.json
│ ├── fork_join_sync_nested_integration_test.json
│ ├── fork_join_sync_optional_fail_integration_test.json
│ ├── fork_join_with_no_permissive_task_retry_integration_test.json
│ ├── fork_join_with_no_task_retry_integration_test.json
│ ├── fork_join_with_optional_sub_workflow_forks_integration_test.json
│ ├── hierarchical_fork_join_swf.json
│ ├── input.json
│ ├── json_jq_transform_result_integration_test.json
│ ├── nested_fork_join_integration_test.json
│ ├── nested_fork_join_swf.json
│ ├── nested_fork_join_with_sub_workflow_integration_test.json
│ ├── output.json
│ ├── rate_limited_simple_task_workflow_integration_test.json
│ ├── rate_limited_system_task_workflow_integration_test.json
│ ├── sequential_json_jq_transform_integration_test.json
│ ├── set_variable_workflow_integration_test.json
│ ├── simple_decision_task_integration_test.json
│ ├── simple_json_jq_transform_integration_test.json
│ ├── simple_lambda_workflow_integration_test.json
│ ├── simple_one_task_sub_workflow_integration_test.json
│ ├── simple_set_variable_workflow_integration_test.json
│ ├── simple_switch_task_integration_test.json
│ ├── simple_wait_task_workflow_integration_test.json
│ ├── simple_workflow_1_input_template_integration_test.json
│ ├── simple_workflow_1_integration_test.json
│ ├── simple_workflow_3_integration_test.json
│ ├── simple_workflow_with_async_complete_system_task_integration_test.json
│ ├── simple_workflow_with_optional_task_integration_test.json
│ ├── simple_workflow_with_permissive_optional_task_integration_test.json
│ ├── simple_workflow_with_permissive_task_integration_test.json
│ ├── simple_workflow_with_resp_time_out_integration_test.json
│ ├── simple_workflow_with_sub_workflow_inline_def_integration_test.json
│ ├── sqs-complete-wait-event-handler.json
│ ├── sqs-test-workflow.json
│ ├── start_workflow_input.json
│ ├── switch_and_fork_join_integration_test.json
│ ├── switch_and_terminate_integration_test.json
│ ├── switch_with_no_default_case_integration_test.json
│ ├── terminate_task_completed_workflow_integration_test.json
│ ├── terminate_task_failed_workflow_integration.json
│ ├── terminate_task_parent_workflow.json
│ ├── terminate_task_sub_workflow.json
│ ├── terminate_task_terminated_status_in_do_while_test.json
│ ├── terminate_task_terminated_status_test.json
│ ├── test_task_failed_parent_workflow.json
│ ├── test_task_failed_sub_workflow.json
│ ├── wait_workflow_integration_test.json
│ ├── workflow_that_starts_another_workflow.json
│ ├── workflow_with_sub_workflow_1_integration_test.json
│ └── workflow_with_synchronous_system_task.json
├── test-util/
│ ├── build.gradle
│ └── src/
│ └── test/
│ ├── groovy/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── test/
│ │ ├── base/
│ │ │ ├── AbstractResiliencySpecification.groovy
│ │ │ └── AbstractSpecification.groovy
│ │ └── util/
│ │ └── WorkflowTestUtil.groovy
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ ├── ConductorTestApp.java
│ │ ├── common/
│ │ │ └── config/
│ │ │ └── TestObjectMapperConfiguration.java
│ │ └── test/
│ │ └── integration/
│ │ ├── AbstractEndToEndTest.java
│ │ └── grpc/
│ │ └── AbstractGrpcEndToEndTest.java
│ └── resources/
│ └── application-integrationtest.properties
├── test-workflow.sh
├── ui/
│ ├── .eslintrc
│ ├── .gitignore
│ ├── .prettierignore
│ ├── .prettierrc.json
│ ├── README.md
│ ├── cypress/
│ │ ├── e2e/
│ │ │ └── spec.cy.js
│ │ ├── fixtures/
│ │ │ ├── doWhile/
│ │ │ │ └── doWhileSwitch.json
│ │ │ ├── dynamicFork/
│ │ │ │ ├── externalizedInput.json
│ │ │ │ ├── noneSpawned.json
│ │ │ │ ├── notExecuted.json
│ │ │ │ ├── oneFailed.json
│ │ │ │ └── success.json
│ │ │ ├── dynamicFork.json
│ │ │ ├── metadataTasks.json
│ │ │ ├── metadataWorkflow.json
│ │ │ ├── taskSearch.json
│ │ │ └── workflowSearch.json
│ │ └── support/
│ │ ├── commands.ts
│ │ ├── component-index.html
│ │ ├── component.ts
│ │ └── e2e.ts
│ ├── cypress.config.ts
│ ├── package.json
│ ├── public/
│ │ ├── index.html
│ │ └── robots.txt
│ ├── src/
│ │ ├── App.jsx
│ │ ├── components/
│ │ │ ├── Banner.jsx
│ │ │ ├── Button.jsx
│ │ │ ├── ButtonGroup.jsx
│ │ │ ├── ConfirmChoiceDialog.jsx
│ │ │ ├── CustomButtons.jsx
│ │ │ ├── DataTable.jsx
│ │ │ ├── DateRangePicker.jsx
│ │ │ ├── Dropdown.jsx
│ │ │ ├── DropdownButton.jsx
│ │ │ ├── Heading.jsx
│ │ │ ├── Input.jsx
│ │ │ ├── KeyValueTable.jsx
│ │ │ ├── LinearProgress.jsx
│ │ │ ├── NavLink.jsx
│ │ │ ├── Paper.jsx
│ │ │ ├── Pill.jsx
│ │ │ ├── PrimaryButton.jsx
│ │ │ ├── ReactJson.jsx
│ │ │ ├── SecondaryButton.jsx
│ │ │ ├── Select.jsx
│ │ │ ├── SplitButton.jsx
│ │ │ ├── StatusBadge.jsx
│ │ │ ├── Tabs.jsx
│ │ │ ├── TaskLink.jsx
│ │ │ ├── TaskNameInput.jsx
│ │ │ ├── TertiaryButton.jsx
│ │ │ ├── Text.jsx
│ │ │ ├── WorkflowNameInput.jsx
│ │ │ ├── definitionList/
│ │ │ │ └── DefinitionList.jsx
│ │ │ ├── diagram/
│ │ │ │ ├── PanAndZoomWrapper.jsx
│ │ │ │ ├── TaskPointer.d.ts
│ │ │ │ ├── TaskResult.d.ts
│ │ │ │ ├── WorkflowDAG.js
│ │ │ │ ├── WorkflowGraph.jsx
│ │ │ │ ├── WorkflowGraph.test.cy.js
│ │ │ │ ├── ZoomControlButton.jsx
│ │ │ │ ├── ZoomControls.jsx
│ │ │ │ └── diagram.scss
│ │ │ ├── formik/
│ │ │ │ ├── FormikCronEditor.jsx
│ │ │ │ ├── FormikDropdown.jsx
│ │ │ │ ├── FormikInput.jsx
│ │ │ │ ├── FormikJsonInput.jsx
│ │ │ │ ├── FormikStatusDropdown.jsx
│ │ │ │ ├── FormikSwitch.jsx
│ │ │ │ ├── FormikVersionDropdown.jsx
│ │ │ │ ├── FormikWorkflowNameInput.jsx
│ │ │ │ └── cron.css
│ │ │ ├── icons/
│ │ │ │ ├── FitToFrame.jsx
│ │ │ │ ├── Home.jsx
│ │ │ │ ├── Minus.jsx
│ │ │ │ └── Plus.jsx
│ │ │ └── index.js
│ │ ├── data/
│ │ │ ├── actions.js
│ │ │ ├── bulkactions.js
│ │ │ ├── common.js
│ │ │ ├── eventHandler.js
│ │ │ ├── misc.js
│ │ │ ├── task.js
│ │ │ └── workflow.js
│ │ ├── hooks/
│ │ │ └── useTime.js
│ │ ├── index.css
│ │ ├── index.js
│ │ ├── pages/
│ │ │ ├── definition/
│ │ │ │ ├── EventHandlerDefinition.jsx
│ │ │ │ ├── ResetConfirmationDialog.jsx
│ │ │ │ ├── SaveEventHandlerDialog.jsx
│ │ │ │ ├── SaveTaskDialog.jsx
│ │ │ │ ├── SaveWorkflowDialog.jsx
│ │ │ │ ├── TaskDefinition.jsx
│ │ │ │ └── WorkflowDefinition.jsx
│ │ │ ├── definitions/
│ │ │ │ ├── EventHandler.jsx
│ │ │ │ ├── Header.jsx
│ │ │ │ ├── Task.jsx
│ │ │ │ └── Workflow.jsx
│ │ │ ├── errors/
│ │ │ │ ├── ErrorsInspector.jsx
│ │ │ │ ├── components/
│ │ │ │ │ ├── FailureReasonChart.jsx
│ │ │ │ │ ├── LiveTailButton.jsx
│ │ │ │ │ ├── Notification.jsx
│ │ │ │ │ ├── StatusChart.jsx
│ │ │ │ │ ├── SummaryCard.jsx
│ │ │ │ │ ├── TimeRangeDropdown.jsx
│ │ │ │ │ ├── TimeSeriesChart.jsx
│ │ │ │ │ └── WorkflowTypeChart.jsx
│ │ │ │ ├── errorsInspectorStyles.js
│ │ │ │ └── hooks/
│ │ │ │ └── useWorkflowErrorGroups.js
│ │ │ ├── execution/
│ │ │ │ ├── ActionModule.jsx
│ │ │ │ ├── Execution.jsx
│ │ │ │ ├── ExecutionInputOutput.jsx
│ │ │ │ ├── ExecutionJson.jsx
│ │ │ │ ├── ExecutionSummary.jsx
│ │ │ │ ├── Legend.jsx
│ │ │ │ ├── RightPanel.jsx
│ │ │ │ ├── TaskDetails.jsx
│ │ │ │ ├── TaskHuman.jsx
│ │ │ │ ├── TaskHumanForm.jsx
│ │ │ │ ├── TaskList.jsx
│ │ │ │ ├── TaskLogs.jsx
│ │ │ │ ├── TaskPollData.jsx
│ │ │ │ ├── TaskSummary.jsx
│ │ │ │ ├── Timeline.jsx
│ │ │ │ ├── Timeline.test.cy.js
│ │ │ │ └── timeline.scss
│ │ │ ├── executions/
│ │ │ │ ├── BulkActionModule.jsx
│ │ │ │ ├── ResultsTable.jsx
│ │ │ │ ├── SearchTabs.jsx
│ │ │ │ ├── TaskResultsTable.jsx
│ │ │ │ ├── TaskSearch.jsx
│ │ │ │ ├── WorkflowSearch.jsx
│ │ │ │ └── executionsStyles.js
│ │ │ ├── kitchensink/
│ │ │ │ ├── DataTableDemo.jsx
│ │ │ │ ├── DiagramTest.jsx
│ │ │ │ ├── Dropdown.jsx
│ │ │ │ ├── EnhancedTable.jsx
│ │ │ │ ├── Examples.jsx
│ │ │ │ ├── Gantt.jsx
│ │ │ │ ├── KitchenSink.jsx
│ │ │ │ └── sampleMovieData.js
│ │ │ ├── misc/
│ │ │ │ └── TaskQueue.jsx
│ │ │ ├── styles.js
│ │ │ └── workbench/
│ │ │ ├── ExecutionHistory.jsx
│ │ │ ├── RunHistory.tsx
│ │ │ ├── Workbench.jsx
│ │ │ └── WorkbenchForm.jsx
│ │ ├── plugins/
│ │ │ ├── AppBarModules.jsx
│ │ │ ├── AppLogo.jsx
│ │ │ ├── CustomAppBarButtons.jsx
│ │ │ ├── CustomRoutes.jsx
│ │ │ ├── constants.js
│ │ │ ├── customTypeRenderers.jsx
│ │ │ ├── env.js
│ │ │ └── fetch.js
│ │ ├── react-app-env.d.ts
│ │ ├── schema/
│ │ │ ├── eventHandler.js
│ │ │ ├── task.js
│ │ │ └── workflow.js
│ │ ├── serviceWorker.js
│ │ ├── setupProxy.js
│ │ ├── setupTests.js
│ │ ├── theme/
│ │ │ ├── colorOverrides.js
│ │ │ ├── colors.js
│ │ │ ├── index.js
│ │ │ ├── provider.jsx
│ │ │ ├── theme.js
│ │ │ └── variables.js
│ │ └── utils/
│ │ ├── constants.js
│ │ ├── helperFunctions.js
│ │ ├── helpers.js
│ │ ├── localstorage.ts
│ │ └── path.js
│ ├── test-karbon.sh
│ └── tsconfig.json
├── ui-next/
│ ├── .gitignore
│ ├── .npmrc
│ ├── .prettierignore
│ ├── .prettierrc.json
│ ├── README.md
│ ├── eslint.config.mjs
│ ├── index.html
│ ├── package.json
│ ├── public/
│ │ ├── context.js
│ │ ├── context.js.example
│ │ └── robots.txt
│ ├── src/
│ │ ├── commonServices/
│ │ │ ├── execution.ts
│ │ │ └── index.ts
│ │ ├── components/
│ │ │ ├── ActionButton.tsx
│ │ │ ├── App.tsx
│ │ │ ├── AutoCompleteWithDescription.tsx
│ │ │ ├── AutoRefreshButton.tsx
│ │ │ ├── Banner.jsx
│ │ │ ├── ButtonGroup.jsx
│ │ │ ├── ButtonTooltip.tsx
│ │ │ ├── CenteredSpinner.tsx
│ │ │ ├── ClipboardCopy.tsx
│ │ │ ├── CodeBlockInput.tsx
│ │ │ ├── ConfirmChoiceDialog.tsx
│ │ │ ├── CustomButton.tsx
│ │ │ ├── DataTable/
│ │ │ │ ├── ColumnSelector.tsx
│ │ │ │ ├── DataTable.tsx
│ │ │ │ ├── Filter.tsx
│ │ │ │ ├── QuickSearch.tsx
│ │ │ │ ├── TableRefreshButton.tsx
│ │ │ │ ├── TagFilter.tsx
│ │ │ │ ├── helpers.test.ts
│ │ │ │ ├── helpers.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── state/
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── guards.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── services.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── styles.ts
│ │ │ │ └── types.ts
│ │ │ ├── DateRangePicker.tsx
│ │ │ ├── DiffEditor/
│ │ │ │ ├── DiffEditor.tsx
│ │ │ │ └── diff-editor.css
│ │ │ ├── DocLink.tsx
│ │ │ ├── Dropdown.tsx
│ │ │ ├── DropdownButton.tsx
│ │ │ ├── EditInPlace.tsx
│ │ │ ├── EmptyPageIntro.tsx
│ │ │ ├── ErrorBoundary.tsx
│ │ │ ├── FeatureDisabledComponent.tsx
│ │ │ ├── FeatureDisabledWrapper.tsx
│ │ │ ├── FloatingMuiAlert.tsx
│ │ │ ├── GetStartedSample/
│ │ │ │ ├── GetStartedSample.tsx
│ │ │ │ ├── components/
│ │ │ │ │ └── CodeSnippet.tsx
│ │ │ │ └── types.ts
│ │ │ ├── Header.tsx
│ │ │ ├── Heading.jsx
│ │ │ ├── HelperText.jsx
│ │ │ ├── InlineEdit.tsx
│ │ │ ├── Input.tsx
│ │ │ ├── InputNumber.tsx
│ │ │ ├── IntegrationIcon.tsx
│ │ │ ├── IntegrationsIcon.tsx
│ │ │ ├── KeyValueTable.jsx
│ │ │ ├── LinearProgress.tsx
│ │ │ ├── MetricsChart.tsx
│ │ │ ├── MuiAlert.tsx
│ │ │ ├── MuiButton.tsx
│ │ │ ├── MuiButtonGroup.tsx
│ │ │ ├── MuiCheckbox.tsx
│ │ │ ├── MuiIconButton.tsx
│ │ │ ├── MuiTypography.tsx
│ │ │ ├── NavLink.jsx
│ │ │ ├── NavLink.tsx
│ │ │ ├── NoDataComponent.tsx
│ │ │ ├── PanelAccordion.tsx
│ │ │ ├── Paper.tsx
│ │ │ ├── PromptVariables.tsx
│ │ │ ├── Puller.tsx
│ │ │ ├── RadioButtonGroup.tsx
│ │ │ ├── ReactJson.tsx
│ │ │ ├── RoleTagChip.tsx
│ │ │ ├── SafariWarning.tsx
│ │ │ ├── SearchEverything.tsx
│ │ │ ├── Select.tsx
│ │ │ ├── Sidebar/
│ │ │ │ ├── BaseSubMenu.tsx
│ │ │ │ ├── ClosedLogo.tsx
│ │ │ │ ├── HotKeysButton.tsx
│ │ │ │ ├── OpenedLogo.tsx
│ │ │ │ ├── RunWorkflowButton.tsx
│ │ │ │ ├── Sidebar.tsx
│ │ │ │ ├── SidebarFooter.tsx
│ │ │ │ ├── SidebarHeader.tsx
│ │ │ │ ├── SidebarItem.tsx
│ │ │ │ ├── SidebarMenu.tsx
│ │ │ │ ├── SidebarToggleButton.tsx
│ │ │ │ ├── SidebarVersionBlock.tsx
│ │ │ │ ├── SubMenu.tsx
│ │ │ │ ├── UiSidebar.tsx
│ │ │ │ ├── UserInfo.tsx
│ │ │ │ ├── constants.ts
│ │ │ │ ├── context/
│ │ │ │ │ ├── SidebarContext.tsx
│ │ │ │ │ └── SidebarContextProvider.tsx
│ │ │ │ ├── createSidebar.ts
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── usePendingTasksCount.ts
│ │ │ │ │ └── useSidebarHover.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── sidebarCoreItems.tsx
│ │ │ │ ├── styles.ts
│ │ │ │ └── types.ts
│ │ │ ├── SnackbarMessage.tsx
│ │ │ ├── SplitButton.jsx
│ │ │ ├── StackTrace.tsx
│ │ │ ├── StatusBadge.tsx
│ │ │ ├── StatusTagChip.tsx
│ │ │ ├── StrikedText.tsx
│ │ │ ├── StringArrayFormField.tsx
│ │ │ ├── SubjectSelector/
│ │ │ │ ├── SubjectMultiPicker.tsx
│ │ │ │ ├── SubjectSelector.tsx
│ │ │ │ ├── helpers.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── types.ts
│ │ │ ├── SubmitFormWrapper.jsx
│ │ │ ├── Tabs.jsx
│ │ │ ├── TagChip.tsx
│ │ │ ├── Text.jsx
│ │ │ ├── TwoPanesDivider.jsx
│ │ │ ├── UIModal.tsx
│ │ │ ├── WorkflowStatusBadge.tsx
│ │ │ ├── agent/
│ │ │ │ ├── Agent.tsx
│ │ │ │ ├── AgentContext.tsx
│ │ │ │ ├── AgentEditorController.tsx
│ │ │ │ ├── agent-types.ts
│ │ │ │ └── helpers.ts
│ │ │ ├── auth/
│ │ │ │ └── AuthGuard.tsx
│ │ │ ├── charts/
│ │ │ │ ├── CacheChart.tsx
│ │ │ │ ├── ErrorsChart.tsx
│ │ │ │ ├── LatencyChart.tsx
│ │ │ │ ├── RequestsChart.tsx
│ │ │ │ ├── chartUtils.ts
│ │ │ │ └── index.ts
│ │ │ ├── coPilot/
│ │ │ │ └── CoPilot.tsx
│ │ │ ├── conductorTooltip/
│ │ │ │ └── ConductorTooltip.tsx
│ │ │ ├── definitionList/
│ │ │ │ └── DefinitionList.jsx
│ │ │ ├── diagram/
│ │ │ │ └── diagram.scss
│ │ │ ├── flow/
│ │ │ │ ├── Flow.tsx
│ │ │ │ ├── FlowFullscreen.scss
│ │ │ │ ├── ReaflowOverrides.scss
│ │ │ │ ├── components/
│ │ │ │ │ ├── RichAddTaskMenu/
│ │ │ │ │ │ ├── AddTaskSidebar.tsx
│ │ │ │ │ │ ├── IntegrationDrillDownContent.tsx
│ │ │ │ │ │ ├── QuickAddMenu.tsx
│ │ │ │ │ │ ├── helpers.ts
│ │ │ │ │ │ ├── iconsForTaskTypes.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── state/
│ │ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ │ ├── guards.ts
│ │ │ │ │ │ │ ├── hook.ts
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ │ ├── services.ts
│ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ ├── supportedTasks.ts
│ │ │ │ │ │ └── taskGenerator.ts
│ │ │ │ │ ├── graphs/
│ │ │ │ │ │ ├── CustomEdgeButton.tsx
│ │ │ │ │ │ ├── CustomLabel.tsx
│ │ │ │ │ │ ├── CustomNode.jsx
│ │ │ │ │ │ ├── CustomPort.jsx
│ │ │ │ │ │ ├── PanAndZoomWrapper/
│ │ │ │ │ │ │ ├── PanAndZoomProvider.tsx
│ │ │ │ │ │ │ ├── PanAndZoomWrapper.tsx
│ │ │ │ │ │ │ ├── SearchBox.tsx
│ │ │ │ │ │ │ ├── ZoomControls.tsx
│ │ │ │ │ │ │ ├── constants.ts
│ │ │ │ │ │ │ ├── icons/
│ │ │ │ │ │ │ │ ├── DragNDrop.tsx
│ │ │ │ │ │ │ │ ├── Home.tsx
│ │ │ │ │ │ │ │ ├── Minus.tsx
│ │ │ │ │ │ │ │ ├── Plus.tsx
│ │ │ │ │ │ │ │ └── Search.tsx
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── state/
│ │ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ │ ├── context.tsx
│ │ │ │ │ │ │ ├── helpers.test.ts
│ │ │ │ │ │ │ ├── helpers.ts
│ │ │ │ │ │ │ ├── hook.ts
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── shapes/
│ │ │ │ │ ├── DecisionOperator.tsx
│ │ │ │ │ ├── DoWhileTask.jsx
│ │ │ │ │ ├── DynamicTasksCards.jsx
│ │ │ │ │ ├── StarShape.jsx
│ │ │ │ │ ├── SubWorkflowTask.jsx
│ │ │ │ │ ├── SwitchJoinPseudoTask.jsx
│ │ │ │ │ ├── TaskCard/
│ │ │ │ │ │ ├── AddPathButton.tsx
│ │ │ │ │ │ ├── CardAttemptsBadge.jsx
│ │ │ │ │ │ ├── CardIcon.jsx
│ │ │ │ │ │ ├── CardLabel.jsx
│ │ │ │ │ │ ├── CardStatusBadge.jsx
│ │ │ │ │ │ ├── DeleteButton.tsx
│ │ │ │ │ │ ├── DynamicTask.tsx
│ │ │ │ │ │ ├── EventTask.jsx
│ │ │ │ │ │ ├── ForkJoinDynamicTask.jsx
│ │ │ │ │ │ ├── HTTPPollTask.jsx
│ │ │ │ │ │ ├── HTTPTask.jsx
│ │ │ │ │ │ ├── INLINETask.jsx
│ │ │ │ │ │ ├── JDBCTask.tsx
│ │ │ │ │ │ ├── JSONJQTransformTask.jsx
│ │ │ │ │ │ ├── KAFKATask.jsx
│ │ │ │ │ │ ├── SimpleTask.jsx
│ │ │ │ │ │ ├── StartWorkflowTask.jsx
│ │ │ │ │ │ ├── SwitchAdd.tsx
│ │ │ │ │ │ ├── TaskCard.tsx
│ │ │ │ │ │ ├── WaitTaskInfo.tsx
│ │ │ │ │ │ ├── helpers.test.ts
│ │ │ │ │ │ ├── helpers.ts
│ │ │ │ │ │ └── icons/
│ │ │ │ │ │ ├── Buildings.jsx
│ │ │ │ │ │ ├── BusinessRule.tsx
│ │ │ │ │ │ ├── CheckIcon.jsx
│ │ │ │ │ │ ├── DeleteIcon.jsx
│ │ │ │ │ │ ├── DynamicFanout.tsx
│ │ │ │ │ │ ├── DynamicFork.tsx
│ │ │ │ │ │ ├── Event.tsx
│ │ │ │ │ │ ├── ExclamationCircleIcon.jsx
│ │ │ │ │ │ ├── ForkIcon.tsx
│ │ │ │ │ │ ├── ForkJoinIcon.tsx
│ │ │ │ │ │ ├── GetDocument.tsx
│ │ │ │ │ │ ├── GetWorkflow.tsx
│ │ │ │ │ │ ├── Http.tsx
│ │ │ │ │ │ ├── HttpPoll.tsx
│ │ │ │ │ │ ├── Inline.tsx
│ │ │ │ │ │ ├── Json.tsx
│ │ │ │ │ │ ├── Kafka.jsx
│ │ │ │ │ │ ├── LlmChatComplete.tsx
│ │ │ │ │ │ ├── LlmGenerateEmbeddings.tsx
│ │ │ │ │ │ ├── LlmGetEmbeddings.tsx
│ │ │ │ │ │ ├── LlmIndexDocument.tsx
│ │ │ │ │ │ ├── LlmIndexText.tsx
│ │ │ │ │ │ ├── LlmSearchIndex.tsx
│ │ │ │ │ │ ├── LlmStoreEmbeddings.jsx
│ │ │ │ │ │ ├── LlmTextComplete.tsx
│ │ │ │ │ │ ├── LoopIcon.tsx
│ │ │ │ │ │ ├── MCPIcon.tsx
│ │ │ │ │ │ ├── MergeIcon.tsx
│ │ │ │ │ │ ├── MinusIcon.jsx
│ │ │ │ │ │ ├── OpsGenie.tsx
│ │ │ │ │ │ ├── PlusIcon.jsx
│ │ │ │ │ │ ├── QueryProcessor.tsx
│ │ │ │ │ │ ├── Sendgrid.tsx
│ │ │ │ │ │ ├── Simple.tsx
│ │ │ │ │ │ ├── StackIcon.jsx
│ │ │ │ │ │ ├── SubWorkflow.tsx
│ │ │ │ │ │ ├── Switch.tsx
│ │ │ │ │ │ ├── Terminate.tsx
│ │ │ │ │ │ ├── TerminateWorkFlow.tsx
│ │ │ │ │ │ ├── UpdateSecret.tsx
│ │ │ │ │ │ ├── UpdateTaskIcon.tsx
│ │ │ │ │ │ ├── Variable.tsx
│ │ │ │ │ │ ├── Wait.tsx
│ │ │ │ │ │ ├── WaitForWebhook.tsx
│ │ │ │ │ │ ├── WarningIcon.jsx
│ │ │ │ │ │ ├── WorkFlow.tsx
│ │ │ │ │ │ ├── Worker.tsx
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ ├── TaskDescription.tsx
│ │ │ │ │ ├── TaskShape/
│ │ │ │ │ │ ├── Shape.tsx
│ │ │ │ │ │ ├── TaskShape.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── TaskSummary.jsx
│ │ │ │ │ ├── TerminalTask.jsx
│ │ │ │ │ ├── styles.ts
│ │ │ │ │ └── testDiagrams.js
│ │ │ │ ├── dragDrop/
│ │ │ │ │ ├── DraggableOverlay.tsx
│ │ │ │ │ ├── Handle.tsx
│ │ │ │ │ ├── boxCollision.ts
│ │ │ │ │ ├── hooks.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── nodes/
│ │ │ │ │ ├── constants.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── layoutTestData.js
│ │ │ │ │ └── mapper/
│ │ │ │ │ ├── common.test.ts
│ │ │ │ │ ├── common.ts
│ │ │ │ │ ├── constants.ts
│ │ │ │ │ ├── core.test.js
│ │ │ │ │ ├── core.ts
│ │ │ │ │ ├── crumbs.test.ts
│ │ │ │ │ ├── crumbs.ts
│ │ │ │ │ ├── doWhile.ts
│ │ │ │ │ ├── edgeMapper.test.js
│ │ │ │ │ ├── edgeMapper.ts
│ │ │ │ │ ├── forkJoin.test.js
│ │ │ │ │ ├── forkJoin.ts
│ │ │ │ │ ├── forkJoinDynamic.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── join.test.js
│ │ │ │ │ ├── join.ts
│ │ │ │ │ ├── layout.js
│ │ │ │ │ ├── ports.ts
│ │ │ │ │ ├── predicates.ts
│ │ │ │ │ ├── subWorkflow.test.js
│ │ │ │ │ ├── subWorkflow.ts
│ │ │ │ │ ├── switch.test.js
│ │ │ │ │ ├── switch.ts
│ │ │ │ │ ├── terminal.ts
│ │ │ │ │ ├── terminate.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── state/
│ │ │ │ │ ├── FlowActorContext.tsx
│ │ │ │ │ ├── action.ts
│ │ │ │ │ ├── context.tsx
│ │ │ │ │ ├── guards.ts
│ │ │ │ │ ├── helpers.js
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── selectors.ts
│ │ │ │ │ ├── service.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── testUtils.js
│ │ │ │ └── theme.ts
│ │ │ ├── index.ts
│ │ │ ├── reactHookForm/
│ │ │ │ ├── ReactHookFormDropdown.tsx
│ │ │ │ └── ReactHookFormInput.tsx
│ │ │ ├── searchWrapper/
│ │ │ │ ├── SearchWrapper.tsx
│ │ │ │ └── state/
│ │ │ │ ├── actions.ts
│ │ │ │ ├── helpers.test.ts
│ │ │ │ ├── helpers.ts
│ │ │ │ ├── hook.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── machine.ts
│ │ │ │ ├── services.ts
│ │ │ │ └── types.ts
│ │ │ ├── tags/
│ │ │ │ ├── AddTagDialog.tsx
│ │ │ │ └── ReplaceTagsInput.tsx
│ │ │ └── v1/
│ │ │ ├── ActionAlert.tsx
│ │ │ ├── AdvancedSearchFieldPopper.tsx
│ │ │ ├── ApiSearchModal/
│ │ │ │ ├── ApiSearchModal.tsx
│ │ │ │ └── index.ts
│ │ │ ├── ArrowBox.tsx
│ │ │ ├── CodeBlockInputWrapper.tsx
│ │ │ ├── CodeSnippet.tsx
│ │ │ ├── ConductorArrayField.tsx
│ │ │ ├── ConductorAutoComplete.tsx
│ │ │ ├── ConductorAutoCompleteWithDescription.tsx
│ │ │ ├── ConductorBreadcrumbs.tsx
│ │ │ ├── ConductorCheckbox.tsx
│ │ │ ├── ConductorCodeBlockInput.tsx
│ │ │ ├── ConductorEmptyGroupField.tsx
│ │ │ ├── ConductorGroupContainer.tsx
│ │ │ ├── ConductorGroupFieldTitle.tsx
│ │ │ ├── ConductorInput.tsx
│ │ │ ├── ConductorInputNumber.tsx
│ │ │ ├── ConductorMultiSelect.tsx
│ │ │ ├── ConductorNameVersionField.tsx
│ │ │ ├── ConductorSelect.tsx
│ │ │ ├── ConductorSlider/
│ │ │ │ ├── ConductorSlider.tsx
│ │ │ │ └── ConductorSliderStateless.tsx
│ │ │ ├── ConductorSplitButton.tsx
│ │ │ ├── ConductorStringArrayFormField.tsx
│ │ │ ├── ConductorTabs.tsx
│ │ │ ├── ConductorUpdateTaskFromEvent.tsx
│ │ │ ├── CopyClipboardButton.tsx
│ │ │ ├── EventExpressionHelp.tsx
│ │ │ ├── FileUploadButton.tsx
│ │ │ ├── FlatMapForm/
│ │ │ │ ├── ConductorAutocompleteArrayField.tsx
│ │ │ │ ├── ConductorAutocompleteVariables.tsx
│ │ │ │ ├── ConductorFieldTypeDropdown.tsx
│ │ │ │ ├── ConductorFlatMapForm.tsx
│ │ │ │ ├── ConductorKeyValueInput.tsx
│ │ │ │ ├── ConductorStringOrJsonInput.tsx
│ │ │ │ ├── customFilter.test.ts
│ │ │ │ └── formOptions.ts
│ │ │ ├── HeadTabs.tsx
│ │ │ ├── Modal/
│ │ │ │ ├── ConfirmModal.tsx
│ │ │ │ ├── UnsavedChangesDialog.tsx
│ │ │ │ ├── commonStyles.ts
│ │ │ │ └── useDialogHelper.tsx
│ │ │ ├── MultiOptionSelect.tsx
│ │ │ ├── RoundedInput.tsx
│ │ │ ├── SpinningIcon.tsx
│ │ │ ├── SwaggerTestComponent.tsx
│ │ │ ├── TagList.tsx
│ │ │ ├── TestTask/
│ │ │ │ ├── TestTask.tsx
│ │ │ │ └── index.ts
│ │ │ ├── TooltipModal.tsx
│ │ │ ├── TooltipStateless.tsx
│ │ │ ├── UnderlinedText.tsx
│ │ │ ├── date-time/
│ │ │ │ ├── ConductorDateRangePicker.tsx
│ │ │ │ ├── ConductorDateTimePicker.tsx
│ │ │ │ ├── ConductorSingleDateRangePicker.tsx
│ │ │ │ ├── ConductorTimePicker.tsx
│ │ │ │ └── CustomDateRangePicker.scss
│ │ │ ├── error/
│ │ │ │ └── Error.tsx
│ │ │ ├── icons/
│ │ │ │ ├── AddIcon.tsx
│ │ │ │ ├── AnnouncementIcon.tsx
│ │ │ │ ├── ArrowDownIcon.tsx
│ │ │ │ ├── ArrowUpIcon.tsx
│ │ │ │ ├── ChatIcon.tsx
│ │ │ │ ├── CircleCheckIcon.tsx
│ │ │ │ ├── CopyIcon.tsx
│ │ │ │ ├── DatetimeIcon.tsx
│ │ │ │ ├── DocsIcon.tsx
│ │ │ │ ├── DoubleArrowLeftIcon.tsx
│ │ │ │ ├── DoubleArrowRightIcon.tsx
│ │ │ │ ├── DownloadIcon.tsx
│ │ │ │ ├── DropdownIcon.tsx
│ │ │ │ ├── EnterIcon.tsx
│ │ │ │ ├── ExitIcon.tsx
│ │ │ │ ├── ExpandIcon.tsx
│ │ │ │ ├── FilterIcon.tsx
│ │ │ │ ├── InfoIcon.tsx
│ │ │ │ ├── NewIntegration.tsx
│ │ │ │ ├── OpenIcon.tsx
│ │ │ │ ├── PlayIcon.tsx
│ │ │ │ ├── PythonIcon.tsx
│ │ │ │ ├── RefreshIcon.tsx
│ │ │ │ ├── RequestACallIcon.tsx
│ │ │ │ ├── ResetIcon.tsx
│ │ │ │ ├── RunIcon.tsx
│ │ │ │ ├── Save.tsx
│ │ │ │ ├── SaveIcon.tsx
│ │ │ │ ├── SearchIcon.tsx
│ │ │ │ ├── ShowViewIcon.tsx
│ │ │ │ ├── TestIcon.tsx
│ │ │ │ ├── TimeIcon.tsx
│ │ │ │ ├── TrashIcon.tsx
│ │ │ │ ├── UnlockIcon.tsx
│ │ │ │ └── XCloseIcon.tsx
│ │ │ ├── index.ts
│ │ │ ├── layout/
│ │ │ │ ├── MessageContext/
│ │ │ │ │ ├── MessageContext.tsx
│ │ │ │ │ ├── MessageProvider.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── header/
│ │ │ │ │ ├── AnnouncementBanner.tsx
│ │ │ │ │ ├── ButtonLinks.tsx
│ │ │ │ │ └── bannerUtils.ts
│ │ │ │ └── section/
│ │ │ │ └── ConductorSectionHeader.tsx
│ │ │ ├── quiz/
│ │ │ │ └── OnboardingQuiz.tsx
│ │ │ ├── react-hook-form/
│ │ │ │ ├── ReactHookFormCheckbox.test.tsx
│ │ │ │ ├── ReactHookFormCheckbox.tsx
│ │ │ │ ├── ReactHookFormDropdown.test.tsx
│ │ │ │ ├── ReactHookFormDropdown.tsx
│ │ │ │ ├── ReactHookFormEditor.tsx
│ │ │ │ ├── ReactHookFormFlatMapForm.tsx
│ │ │ │ ├── ReactHookFormIdempotencyForm.test.tsx
│ │ │ │ ├── ReactHookFormIdempotencyForm.tsx
│ │ │ │ ├── ReactHookFormInput.test.tsx
│ │ │ │ ├── ReactHookFormInput.tsx
│ │ │ │ ├── ReactHookFormNameVersionField.test.tsx
│ │ │ │ └── ReactHookFormNameVersionField.tsx
│ │ │ └── theme/
│ │ │ ├── index.ts
│ │ │ ├── material/
│ │ │ │ ├── components/
│ │ │ │ │ ├── buttons.ts
│ │ │ │ │ ├── buttonsGroup.ts
│ │ │ │ │ └── formControls.ts
│ │ │ │ ├── context.tsx
│ │ │ │ └── provider.tsx
│ │ │ ├── styles.ts
│ │ │ └── theme.ts
│ │ ├── growthbook/
│ │ │ ├── MaybeGrowthbookProvider.tsx
│ │ │ ├── growthbookInstance.ts
│ │ │ ├── plugins.ts
│ │ │ └── useMaybeIdentifyGrowthbook.tsx
│ │ ├── index.css
│ │ ├── index.ts
│ │ ├── main.tsx
│ │ ├── pages/
│ │ │ ├── apiDocs/
│ │ │ │ └── ApiReferencePage.tsx
│ │ │ ├── creatorFlags/
│ │ │ │ └── CreatorFlags.tsx
│ │ │ ├── definition/
│ │ │ │ ├── ConfirmDialog.tsx
│ │ │ │ ├── ConfirmLocalCopyDialog/
│ │ │ │ │ ├── ConfirmLocalCopyDialog.tsx
│ │ │ │ │ └── state/
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── service.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── EditorPanel/
│ │ │ │ │ ├── AssistantPanel.tsx
│ │ │ │ │ ├── AssistantPanelHeader.tsx
│ │ │ │ │ ├── CodeEditorTab/
│ │ │ │ │ │ ├── CodeTab.tsx
│ │ │ │ │ │ ├── MonacoDefinitionOverrides.scss
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── state/
│ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ ├── hook.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ ├── ConfirmationDialogs.tsx
│ │ │ │ │ ├── CustomTooltip.tsx
│ │ │ │ │ ├── DependenciesTab/
│ │ │ │ │ │ └── DependenciesTab.tsx
│ │ │ │ │ ├── EditorPanel.tsx
│ │ │ │ │ ├── EditorTabs.tsx
│ │ │ │ │ ├── HeadActionButtons.tsx
│ │ │ │ │ ├── RunWorkflowButton.tsx
│ │ │ │ │ ├── TabContent.tsx
│ │ │ │ │ ├── TaskFormTab/
│ │ │ │ │ │ ├── TaskForm.tsx
│ │ │ │ │ │ ├── TaskFormContent.tsx
│ │ │ │ │ │ ├── TaskStats/
│ │ │ │ │ │ │ ├── CountBar.tsx
│ │ │ │ │ │ │ ├── RangeButtons.tsx
│ │ │ │ │ │ │ ├── TaskRateChart.tsx
│ │ │ │ │ │ │ ├── TaskStats.tsx
│ │ │ │ │ │ │ └── state/
│ │ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ │ ├── guards.ts
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ │ ├── services.ts
│ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ ├── forms/
│ │ │ │ │ │ │ ├── ArrayForm.tsx
│ │ │ │ │ │ │ ├── BusinessRuleForm.tsx
│ │ │ │ │ │ │ ├── ChunkTextTaskForm.tsx
│ │ │ │ │ │ │ ├── ConductorCacheOutputForm.tsx
│ │ │ │ │ │ │ ├── ConductorFlexibleAutoCompleteVariables.tsx
│ │ │ │ │ │ │ ├── ConductorObjectOrStringInput.tsx
│ │ │ │ │ │ │ ├── ConductorValueInput.tsx
│ │ │ │ │ │ │ ├── DoWhileTaskForm/
│ │ │ │ │ │ │ │ ├── DoWhileCodeBlock.tsx
│ │ │ │ │ │ │ │ ├── DoWhileForm.tsx
│ │ │ │ │ │ │ │ ├── common.ts
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── sampleScripts.ts
│ │ │ │ │ │ │ ├── DynamicForkOperatorForm.tsx
│ │ │ │ │ │ │ ├── DynamicOperatorForm.tsx
│ │ │ │ │ │ │ ├── EnforceSchemaForm.tsx
│ │ │ │ │ │ │ ├── EventTaskForm/
│ │ │ │ │ │ │ │ ├── EventTaskForm.tsx
│ │ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ │ ├── FieldTypeDropdown.tsx
│ │ │ │ │ │ │ ├── FlexibleAutoCompleteVariables.tsx
│ │ │ │ │ │ │ ├── GRPCTaskForm/
│ │ │ │ │ │ │ │ ├── GRPCTaskForm.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ │ ├── GetDocumentTaskForm.tsx
│ │ │ │ │ │ │ ├── GetSignedJwtForm.tsx
│ │ │ │ │ │ │ ├── GetWorkflowTaskForm/
│ │ │ │ │ │ │ │ ├── GetWorkflowTaskForm.tsx
│ │ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ │ ├── HTTPTaskForm/
│ │ │ │ │ │ │ │ ├── ConductorAdditionalHeaders.tsx
│ │ │ │ │ │ │ │ ├── EditTaskDefConfigModal.tsx
│ │ │ │ │ │ │ │ ├── Encode.tsx
│ │ │ │ │ │ │ │ ├── HTTPPollTaskForm.tsx
│ │ │ │ │ │ │ │ ├── HTTPTaskForm.tsx
│ │ │ │ │ │ │ │ ├── common.ts
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ ├── state/
│ │ │ │ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ │ │ │ ├── helper.ts
│ │ │ │ │ │ │ │ │ ├── hook.ts
│ │ │ │ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ │ │ │ ├── services.ts
│ │ │ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ │ ├── HedgingConfigForm.tsx
│ │ │ │ │ │ │ ├── INLINETaskForm/
│ │ │ │ │ │ │ │ ├── INLINETaskForm.tsx
│ │ │ │ │ │ │ │ ├── InlineCodeBlock.tsx
│ │ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ │ ├── JDBCTaskForm.tsx
│ │ │ │ │ │ │ ├── JOINTaskForm/
│ │ │ │ │ │ │ │ ├── JOINTaskForm.tsx
│ │ │ │ │ │ │ │ ├── JoinCodeBlock.tsx
│ │ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ │ ├── JSONField.tsx
│ │ │ │ │ │ │ ├── JSONJQTransformForm.tsx
│ │ │ │ │ │ │ ├── KafkaTaskForm.tsx
│ │ │ │ │ │ │ ├── LLMChainTaskForm.tsx
│ │ │ │ │ │ │ ├── LLMChatCompleteTaskForm.tsx
│ │ │ │ │ │ │ ├── LLMFormFields/
│ │ │ │ │ │ │ │ ├── ConductorArrayMapForm.tsx
│ │ │ │ │ │ │ │ ├── LLMFormFields.tsx
│ │ │ │ │ │ │ │ ├── LLMFormFieldsWrapper.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── state/
│ │ │ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ │ │ ├── services.ts
│ │ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ │ ├── LLMGenerateEmbeddingsTaskForm.tsx
│ │ │ │ │ │ │ ├── LLMGetEmbeddingsTaskForm.tsx
│ │ │ │ │ │ │ ├── LLMIndexDocumentTaskForm.tsx
│ │ │ │ │ │ │ ├── LLMIndexTextTaskForm.tsx
│ │ │ │ │ │ │ ├── LLMSearchIndexTaskForm.tsx
│ │ │ │ │ │ │ ├── LLMStoreEmbeddingsTaskForm.tsx
│ │ │ │ │ │ │ ├── LLMTextCompleteTaskForm.tsx
│ │ │ │ │ │ │ ├── ListFilesTaskForm.tsx
│ │ │ │ │ │ │ ├── MCPTaskForm.tsx
│ │ │ │ │ │ │ ├── MaybeVariable.tsx
│ │ │ │ │ │ │ ├── OpsGenieTaskForm.tsx
│ │ │ │ │ │ │ ├── OptionalFieldForm.tsx
│ │ │ │ │ │ │ ├── ParseDocumentTaskForm.tsx
│ │ │ │ │ │ │ ├── QueryProcessorTaskForm/
│ │ │ │ │ │ │ │ ├── MetricsTypeForm.tsx
│ │ │ │ │ │ │ │ ├── QueryProcessorTaskForm.tsx
│ │ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ │ ├── RateLimitConfigForm.tsx
│ │ │ │ │ │ │ ├── SchemaForm.tsx
│ │ │ │ │ │ │ ├── SendgridForm.tsx
│ │ │ │ │ │ │ ├── ServiceRegistrySelector.tsx
│ │ │ │ │ │ │ ├── SetVariableOperatorForm.tsx
│ │ │ │ │ │ │ ├── SimpleTaskForm/
│ │ │ │ │ │ │ │ ├── SampleCode.ts
│ │ │ │ │ │ │ │ ├── SimpleTaskForm.tsx
│ │ │ │ │ │ │ │ ├── TemplateKeys.tsx
│ │ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ │ ├── SimpleTaskNameInput.tsx
│ │ │ │ │ │ │ ├── StartWorkflowTaskForm/
│ │ │ │ │ │ │ │ ├── StartWorkflowTaskForm.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── state/
│ │ │ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ │ │ ├── hook.ts
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ ├── machine.test.ts
│ │ │ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ │ │ ├── service.ts
│ │ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ │ ├── SubWorkflowOperatorForm/
│ │ │ │ │ │ │ │ ├── SubWorkflowOperatorForm.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ │ ├── SwitchTaskForm/
│ │ │ │ │ │ │ │ ├── SwitchCodeBlock.tsx
│ │ │ │ │ │ │ │ ├── SwitchOperatorForm.tsx
│ │ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ │ ├── TaskFormFooter.tsx
│ │ │ │ │ │ │ ├── TaskFormHeader/
│ │ │ │ │ │ │ │ ├── TaskFormHeader.tsx
│ │ │ │ │ │ │ │ ├── TaskFormHeaderSimple.tsx
│ │ │ │ │ │ │ │ ├── TaskFormHeaderTasks.tsx
│ │ │ │ │ │ │ │ └── state/
│ │ │ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ │ │ ├── hook.ts
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ │ ├── TaskFormSection.tsx
│ │ │ │ │ │ │ ├── TaskFormStyles.ts
│ │ │ │ │ │ │ ├── TerminateOperatorForm.tsx
│ │ │ │ │ │ │ ├── TerminateWorkflowForm.tsx
│ │ │ │ │ │ │ ├── TestTaskButton/
│ │ │ │ │ │ │ │ ├── OpenTestTaskButton.tsx
│ │ │ │ │ │ │ │ ├── TestTaskButton.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── state/
│ │ │ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ │ │ ├── hook.ts
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ │ │ ├── service.ts
│ │ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ │ ├── UnknownTaskForm.tsx
│ │ │ │ │ │ │ ├── UpdateSecretForm/
│ │ │ │ │ │ │ │ ├── UpdateSecretTaskForm.tsx
│ │ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ │ ├── UpdateTaskForm/
│ │ │ │ │ │ │ │ ├── UpdateTaskForm.tsx
│ │ │ │ │ │ │ │ ├── UpdateTaskFromEvent.tsx
│ │ │ │ │ │ │ │ ├── common.ts
│ │ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ │ ├── WaitForWebhookForm/
│ │ │ │ │ │ │ │ ├── WaitForWebhookTaskForm.tsx
│ │ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ │ ├── WaitTaskForm/
│ │ │ │ │ │ │ │ ├── DurationWaitTaskForm.tsx
│ │ │ │ │ │ │ │ ├── SelectWaitType.tsx
│ │ │ │ │ │ │ │ ├── UntilWaitTaskForm.tsx
│ │ │ │ │ │ │ │ ├── WaitTaskForm.tsx
│ │ │ │ │ │ │ │ ├── helpers.ts
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ │ ├── YieldTaskForm.tsx
│ │ │ │ │ │ │ ├── editorConfig.ts
│ │ │ │ │ │ │ ├── hooks/
│ │ │ │ │ │ │ │ ├── useSchemaFormHandler.ts
│ │ │ │ │ │ │ │ └── useTaskForm.ts
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ ├── maybeVariableHOC.tsx
│ │ │ │ │ │ │ ├── types.ts
│ │ │ │ │ │ │ └── useGetSetHandler.ts
│ │ │ │ │ │ ├── helpers.test.ts
│ │ │ │ │ │ ├── helpers.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── state/
│ │ │ │ │ │ │ ├── TaskFormContext/
│ │ │ │ │ │ │ │ ├── TaskFormContext.tsx
│ │ │ │ │ │ │ │ ├── TaskFormProvider.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ │ ├── guards.ts
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ └── taskDescription.ts
│ │ │ │ │ ├── WorkflowPropertiesFormTab/
│ │ │ │ │ │ ├── ActorToHandlerValue.tsx
│ │ │ │ │ │ ├── WorkflowPropertiesForm.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── state/
│ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ ├── hook.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ └── selectors.ts
│ │ │ │ ├── EventHandler/
│ │ │ │ │ ├── EventHandler.tsx
│ │ │ │ │ ├── SaveProtectionPrompt.tsx
│ │ │ │ │ ├── eventhandlers/
│ │ │ │ │ │ ├── EventHandlerButton.tsx
│ │ │ │ │ │ ├── EventHandlerEditor.tsx
│ │ │ │ │ │ ├── FormComponent/
│ │ │ │ │ │ │ ├── ActionForms/
│ │ │ │ │ │ │ │ ├── CompleteTask.tsx
│ │ │ │ │ │ │ │ ├── FailTask.tsx
│ │ │ │ │ │ │ │ ├── StartWorkflowTask.tsx
│ │ │ │ │ │ │ │ ├── TerminateWorkflowTask.tsx
│ │ │ │ │ │ │ │ ├── UpdateWorkflowTask.tsx
│ │ │ │ │ │ │ │ └── common.ts
│ │ │ │ │ │ │ ├── EventHandlerForm.tsx
│ │ │ │ │ │ │ └── state/
│ │ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ │ ├── hook.ts
│ │ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ ├── eventHandlerSchema.ts
│ │ │ │ │ │ └── state/
│ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ ├── guards.ts
│ │ │ │ │ │ ├── hook.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ ├── services.ts
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── GraphPanel.jsx
│ │ │ │ ├── ImportSuccessfulDialog.tsx
│ │ │ │ ├── PromptIfChanges.tsx
│ │ │ │ ├── RunWorkflow/
│ │ │ │ │ ├── RunWorkflowForm.tsx
│ │ │ │ │ ├── RunWorkflowHistoryTable.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── state/
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── services.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── WorkflowDefinition.tsx
│ │ │ │ ├── WorkflowMetadata/
│ │ │ │ │ ├── EditInPlaceWrapper/
│ │ │ │ │ │ ├── EditInPlaceFieldWrapper.tsx
│ │ │ │ │ │ └── state/
│ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ ├── guards.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ ├── WorkflowMetaBar.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── state/
│ │ │ │ │ ├── WorkflowMetadataContext/
│ │ │ │ │ │ ├── WorkflowMetadataContext.tsx
│ │ │ │ │ │ ├── WorkflowMetadataProvider.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── guards.ts
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── services.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── commonService.ts
│ │ │ │ ├── confirmSave/
│ │ │ │ │ ├── ConfirmSaveButtonGroup.tsx
│ │ │ │ │ ├── ConfirmSaveDiffEditor.tsx
│ │ │ │ │ ├── ConfirmWorkflowOverride.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── state/
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── guards.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── services.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── errorInspector/
│ │ │ │ │ ├── AccordionErrorSummary.tsx
│ │ │ │ │ ├── ErrorInspector.tsx
│ │ │ │ │ ├── ImportSummary.tsx
│ │ │ │ │ ├── ServerErrorDisplayer.tsx
│ │ │ │ │ ├── TaskErrorsDisplayer.tsx
│ │ │ │ │ ├── WorkflowErrorDisplayer.tsx
│ │ │ │ │ └── state/
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── helpers.test.ts
│ │ │ │ │ ├── helpers.ts
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── schemaValidator.ts
│ │ │ │ │ ├── service.test.ts
│ │ │ │ │ ├── service.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── helper.test.ts
│ │ │ │ ├── helpers.ts
│ │ │ │ ├── progressicons.jsx
│ │ │ │ ├── state/
│ │ │ │ │ ├── WorkflowEditContext/
│ │ │ │ │ │ ├── WorkflowEditContext.tsx
│ │ │ │ │ │ ├── WorkflowEditProvider.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ ├── action.ts
│ │ │ │ │ ├── constants.js
│ │ │ │ │ ├── guards.ts
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── services.ts
│ │ │ │ │ ├── taskModifier/
│ │ │ │ │ │ ├── constants.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── taskModifier.test.js
│ │ │ │ │ │ └── taskModifier.ts
│ │ │ │ │ ├── types.ts
│ │ │ │ │ ├── useGetVariablesForSelectedTasks.ts
│ │ │ │ │ ├── useMadeChanges.ts
│ │ │ │ │ ├── usePanelChanges.ts
│ │ │ │ │ └── usePerformOperationOnDefintion.ts
│ │ │ │ └── task/
│ │ │ │ ├── CreationInfo.tsx
│ │ │ │ ├── NameDescription.tsx
│ │ │ │ ├── SaveProtectionPrompt.tsx
│ │ │ │ ├── TaskDefErrorInspector.tsx
│ │ │ │ ├── TaskDefinition.tsx
│ │ │ │ ├── TaskDefinitionButtons.tsx
│ │ │ │ ├── TaskDefinitionDiffEditor.tsx
│ │ │ │ ├── TestTaskForm.tsx
│ │ │ │ ├── dialogs/
│ │ │ │ │ ├── TaskDefinitionDialogs.tsx
│ │ │ │ │ └── state/
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── guards.ts
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── form/
│ │ │ │ │ ├── TaskDefinitionForm.tsx
│ │ │ │ │ └── state/
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── guards.ts
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── services.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── state/
│ │ │ │ ├── actions.ts
│ │ │ │ ├── guards.ts
│ │ │ │ ├── helpers.ts
│ │ │ │ ├── hook.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── machine.ts
│ │ │ │ ├── services.ts
│ │ │ │ ├── types.ts
│ │ │ │ └── validator.ts
│ │ │ ├── definitions/
│ │ │ │ ├── EventHandler.tsx
│ │ │ │ ├── Scheduler/
│ │ │ │ │ ├── BulkActionModule.tsx
│ │ │ │ │ └── Schedules.tsx
│ │ │ │ ├── Task.tsx
│ │ │ │ ├── Workflow.tsx
│ │ │ │ ├── dialog/
│ │ │ │ │ ├── CloneDialog.tsx
│ │ │ │ │ ├── CloneScheduleDialog.tsx
│ │ │ │ │ ├── CloneWorkflowDialog.tsx
│ │ │ │ │ └── ShareWorkflowDialog.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── rowColorHelpers.ts
│ │ │ ├── error/
│ │ │ │ ├── ErrorPage.tsx
│ │ │ │ ├── Forbidden.tsx
│ │ │ │ ├── UserNotFound.tsx
│ │ │ │ └── types.ts
│ │ │ ├── eventMonitor/
│ │ │ │ ├── EventMonitor.tsx
│ │ │ │ ├── EventMonitorDetail/
│ │ │ │ │ ├── EventMonitorDetail.tsx
│ │ │ │ │ ├── ExpandedGroupedItem.tsx
│ │ │ │ │ ├── PayloadModal.tsx
│ │ │ │ │ └── Refresher/
│ │ │ │ │ ├── RefreshEvent.tsx
│ │ │ │ │ └── state/
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── services.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── types.ts
│ │ │ │ └── utils.ts
│ │ │ ├── execution/
│ │ │ │ ├── ActionModule.jsx
│ │ │ │ ├── Execution.jsx
│ │ │ │ ├── ExecutionInputOutput.tsx
│ │ │ │ ├── ExecutionJson.jsx
│ │ │ │ ├── ExecutionSummary.jsx
│ │ │ │ ├── LeftPanelTabs.tsx
│ │ │ │ ├── NoAnimRangeSlider.tsx
│ │ │ │ ├── RightPanel/
│ │ │ │ │ ├── RightPanel.tsx
│ │ │ │ │ ├── SummaryTask.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── state/
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── guards.ts
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── services.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── TaskList/
│ │ │ │ │ ├── StatusSelect.tsx
│ │ │ │ │ ├── TaskList.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── state/
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── services.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── TaskLogs.tsx
│ │ │ │ ├── TaskSummary.tsx
│ │ │ │ ├── Timeline.jsx
│ │ │ │ ├── Timeline.test.ts
│ │ │ │ ├── UpdateTaskStatusForm.tsx
│ │ │ │ ├── WorkflowIntrospection.tsx
│ │ │ │ ├── componentHelpers.tsx
│ │ │ │ ├── helpers.test.ts
│ │ │ │ ├── helpers.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── state/
│ │ │ │ │ ├── FlowExecutionContext/
│ │ │ │ │ │ ├── FlowExecutionContext.tsx
│ │ │ │ │ │ ├── FlowExecutionProvider.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ ├── StatusMapTypes.ts
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── constants.ts
│ │ │ │ │ ├── countdownActions.ts
│ │ │ │ │ ├── countdownMachine.ts
│ │ │ │ │ ├── executionMapper.test.js
│ │ │ │ │ ├── executionMapper.ts
│ │ │ │ │ ├── guards.ts
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── sampleExecutions.js
│ │ │ │ │ ├── services.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── timeline.scss
│ │ │ │ └── timelineUtils.ts
│ │ │ ├── executions/
│ │ │ │ ├── ApiSearchModalIntegration.tsx
│ │ │ │ ├── BulkActionModule.tsx
│ │ │ │ ├── DateControlComponent.tsx
│ │ │ │ ├── DatePickerComponent.tsx
│ │ │ │ ├── ResultsTable.tsx
│ │ │ │ ├── SchedulerApiSearchModal.tsx
│ │ │ │ ├── SchedulerExecutions.tsx
│ │ │ │ ├── SchedulerResultsTable.tsx
│ │ │ │ ├── SearchExampleQuery.tsx
│ │ │ │ ├── SplitWorkflowDefinitionButton/
│ │ │ │ │ ├── ImportBPNFileDialog.tsx
│ │ │ │ │ ├── SplitWorkflowDefinitionButton.tsx
│ │ │ │ │ └── hook.ts
│ │ │ │ ├── Task/
│ │ │ │ │ ├── AdvanceSearch.tsx
│ │ │ │ │ ├── BasicSearch.tsx
│ │ │ │ │ ├── SwitchComponent.tsx
│ │ │ │ │ └── TaskApiSearchModal.tsx
│ │ │ │ ├── TaskResultsTable.tsx
│ │ │ │ ├── TaskSearch.tsx
│ │ │ │ ├── WorkflowSearch.tsx
│ │ │ │ ├── executionsStyles.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── workflowSearchComponents/
│ │ │ │ ├── AdvancedSearch.tsx
│ │ │ │ └── BasicSearch.tsx
│ │ │ ├── kitchensink/
│ │ │ │ ├── DataTableDemo.jsx
│ │ │ │ ├── EnhancedTable.jsx
│ │ │ │ ├── Examples.jsx
│ │ │ │ ├── Gantt.jsx
│ │ │ │ ├── KitchenSink.jsx
│ │ │ │ ├── ThemeSampler.jsx
│ │ │ │ └── sampleMovieData.js
│ │ │ ├── queueMonitor/
│ │ │ │ ├── PollDataTable.tsx
│ │ │ │ ├── PollWorkerDetails.tsx
│ │ │ │ ├── QuickSearchAndRefresh.tsx
│ │ │ │ ├── TaskQueue.tsx
│ │ │ │ ├── filter/
│ │ │ │ │ ├── FilterSection.tsx
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── helpers.ts
│ │ │ │ ├── refresher/
│ │ │ │ │ ├── RefreshOptions.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── state/
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── guards.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ └── types.ts
│ │ │ │ └── state/
│ │ │ │ ├── QueueMonitorContext/
│ │ │ │ │ ├── QueueMonitorContext.tsx
│ │ │ │ │ ├── QueueMonitorProvider.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── actions.ts
│ │ │ │ ├── guards.ts
│ │ │ │ ├── hook.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── machine.ts
│ │ │ │ ├── service.ts
│ │ │ │ └── types.ts
│ │ │ ├── runWorkflow/
│ │ │ │ ├── IdempotencyForm.tsx
│ │ │ │ ├── RunWorkflow.tsx
│ │ │ │ ├── RunWorkflowApiSearchModal.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── runWorkflowUtils.ts
│ │ │ │ └── types.ts
│ │ │ ├── scheduler/
│ │ │ │ ├── CronExpressionHelp.tsx
│ │ │ │ ├── SaveProtectionPrompt.tsx
│ │ │ │ ├── Schedule.tsx
│ │ │ │ ├── ScheduleButtons.tsx
│ │ │ │ ├── ScheduleDiffEditor.jsx
│ │ │ │ ├── TimezonePicker.tsx
│ │ │ │ ├── __tests__/
│ │ │ │ │ └── Schedule.test.tsx
│ │ │ │ ├── components/
│ │ │ │ │ ├── CronExpressionSection.tsx
│ │ │ │ │ ├── ScheduleTimingSection.tsx
│ │ │ │ │ └── WorkflowConfigSection.tsx
│ │ │ │ ├── constants.ts
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── useCronExpression.ts
│ │ │ │ │ ├── useScheduleFormHandlers.ts
│ │ │ │ │ ├── useScheduleState.ts
│ │ │ │ │ └── useWorkflowConfig.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── schedulerHooks.js
│ │ │ │ ├── timezones.json
│ │ │ │ └── utils/
│ │ │ │ └── scheduleTransformers.ts
│ │ │ ├── styles.js
│ │ │ └── tags/
│ │ │ ├── TagsDashboard.tsx
│ │ │ └── TagsList.jsx
│ │ ├── plugins/
│ │ │ ├── AppBarModules.jsx
│ │ │ ├── AppLogo.jsx
│ │ │ ├── ConductorLogo.jsx
│ │ │ ├── constants.js
│ │ │ ├── customTypeRenderers.jsx
│ │ │ ├── env.js
│ │ │ ├── fetch.ts
│ │ │ ├── index.ts
│ │ │ └── registry/
│ │ │ ├── index.ts
│ │ │ ├── registry.ts
│ │ │ └── types.ts
│ │ ├── queryClient.ts
│ │ ├── routes/
│ │ │ ├── __tests__/
│ │ │ │ ├── router.test.tsx
│ │ │ │ └── test-utils.tsx
│ │ │ ├── router.tsx
│ │ │ └── routes.tsx
│ │ ├── setupTests.ts
│ │ ├── shared/
│ │ │ ├── BaseLayout.tsx
│ │ │ ├── BlockNavigationWithConfirmation.tsx
│ │ │ ├── CodeModal/
│ │ │ │ ├── curlHeader.ts
│ │ │ │ ├── hook.ts
│ │ │ │ └── types.ts
│ │ │ ├── PersistableSidebar/
│ │ │ │ └── state/
│ │ │ │ ├── actions.ts
│ │ │ │ ├── hook.ts
│ │ │ │ ├── machine.ts
│ │ │ │ ├── services.ts
│ │ │ │ └── types.ts
│ │ │ ├── SectionContainer.tsx
│ │ │ ├── SectionHeader.tsx
│ │ │ ├── SectionHeaderActions.tsx
│ │ │ ├── SideAndTopBarsLayout.tsx
│ │ │ ├── UserSettingsContext.ts
│ │ │ ├── UserSettingsProvider.tsx
│ │ │ ├── ZoomControlsButton.tsx
│ │ │ ├── agent/
│ │ │ │ ├── agentAtomsStore.ts
│ │ │ │ └── useAiContext.ts
│ │ │ ├── auth/
│ │ │ │ ├── AuthProvider.tsx
│ │ │ │ ├── NoAuthProvider/
│ │ │ │ │ ├── NoAuthProvider.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── constants.ts
│ │ │ │ ├── context.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── silentRefresh.ts
│ │ │ │ ├── tokenManagerJotai.ts
│ │ │ │ ├── types.ts
│ │ │ │ └── useAuth.ts
│ │ │ ├── createAndDisplayApplication/
│ │ │ │ ├── MetadataBanner.tsx
│ │ │ │ └── state/
│ │ │ │ ├── actions.ts
│ │ │ │ ├── guards.ts
│ │ │ │ ├── machine.ts
│ │ │ │ ├── services.ts
│ │ │ │ └── types.ts
│ │ │ ├── editor.ts
│ │ │ ├── icons/
│ │ │ │ └── FitToFrame.tsx
│ │ │ ├── state/
│ │ │ │ ├── index.ts
│ │ │ │ ├── machine.ts
│ │ │ │ ├── selectors.ts
│ │ │ │ ├── types.ts
│ │ │ │ └── userSettingsMachine/
│ │ │ │ ├── actions.ts
│ │ │ │ ├── guards.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── machine.ts
│ │ │ │ ├── services.ts
│ │ │ │ └── types.ts
│ │ │ ├── styles.ts
│ │ │ ├── useSaveProtection.ts
│ │ │ └── useUserSettings.ts
│ │ ├── templates/
│ │ │ └── JSONSchemaWorkflow.js
│ │ ├── testData/
│ │ │ └── diagramTests.js
│ │ ├── theme/
│ │ │ ├── index.ts
│ │ │ ├── material/
│ │ │ │ ├── ColorModeContext/
│ │ │ │ │ ├── ColorModeContext.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── baseTheme.ts
│ │ │ │ ├── components/
│ │ │ │ │ ├── appBar.ts
│ │ │ │ │ ├── atoms.ts
│ │ │ │ │ ├── buttons.ts
│ │ │ │ │ ├── buttonsGroup.ts
│ │ │ │ │ ├── dropdownsMenusPopovers.ts
│ │ │ │ │ ├── formControls.ts
│ │ │ │ │ ├── modals.ts
│ │ │ │ │ ├── paper.ts
│ │ │ │ │ ├── tables.ts
│ │ │ │ │ └── tabs.ts
│ │ │ │ ├── getPaletteForMode.ts
│ │ │ │ ├── provider.tsx
│ │ │ │ └── types/
│ │ │ │ └── Palette.d.ts
│ │ │ ├── theme.ts
│ │ │ └── tokens/
│ │ │ ├── colorOverrides.ts
│ │ │ ├── colors.js
│ │ │ ├── globalConstants.js
│ │ │ ├── orkes-theme.js
│ │ │ └── variables.ts
│ │ ├── types/
│ │ │ ├── Application.ts
│ │ │ ├── CloudTemplateResults.ts
│ │ │ ├── CloudTemplateType.ts
│ │ │ ├── Crumbs.ts
│ │ │ ├── EnvVariables.ts
│ │ │ ├── Environment.ts
│ │ │ ├── Events.ts
│ │ │ ├── Execution.ts
│ │ │ ├── FormFieldTypes.ts
│ │ │ ├── HumanTaskTypes.ts
│ │ │ ├── Integrations.ts
│ │ │ ├── Messages.ts
│ │ │ ├── MetricsTypes.ts
│ │ │ ├── Prompts.ts
│ │ │ ├── RemoteServiceTypes.ts
│ │ │ ├── Schedulers.ts
│ │ │ ├── SchemaDefinition.ts
│ │ │ ├── Schemas.ts
│ │ │ ├── SchemasAjv.ts
│ │ │ ├── Secret.ts
│ │ │ ├── ServiceDefinition.ts
│ │ │ ├── Tag.ts
│ │ │ ├── TaskDefinition.ts
│ │ │ ├── TaskExecution.ts
│ │ │ ├── TaskLog.ts
│ │ │ ├── TaskStatus.ts
│ │ │ ├── TaskType.ts
│ │ │ ├── TestTaskTypes.ts
│ │ │ ├── TimeoutPolicy.ts
│ │ │ ├── UpdateTaskStatus.ts
│ │ │ ├── User.ts
│ │ │ ├── WebhookDefinition.ts
│ │ │ ├── WorkflowDef.ts
│ │ │ ├── WorkflowExecution.ts
│ │ │ ├── common.ts
│ │ │ ├── helperTypes.ts
│ │ │ ├── index.ts
│ │ │ └── svg.d.ts
│ │ ├── useArrowNavigation.tsx
│ │ └── utils/
│ │ ├── __tests__/
│ │ │ ├── date.test.ts
│ │ │ ├── json.test.ts
│ │ │ ├── object.test.ts
│ │ │ ├── string.test.ts
│ │ │ ├── toMaybeQueryString.test.ts
│ │ │ ├── typeHelpers.test.ts
│ │ │ ├── utils.test.ts
│ │ │ └── workflow.test.ts
│ │ ├── accessControl.ts
│ │ ├── array.ts
│ │ ├── checkPathFlag.ts
│ │ ├── cloudTemplates.ts
│ │ ├── constants/
│ │ │ ├── api.ts
│ │ │ ├── common.ts
│ │ │ ├── dateTimePicker.ts
│ │ │ ├── docLink.ts
│ │ │ ├── emailContentTypeSuggestions.ts
│ │ │ ├── event.ts
│ │ │ ├── httpStatusCode.ts
│ │ │ ├── httpSuggestions.ts
│ │ │ ├── index.ts
│ │ │ ├── jsonSchema.ts
│ │ │ ├── regex.ts
│ │ │ ├── route.ts
│ │ │ ├── switch.ts
│ │ │ ├── task.ts
│ │ │ ├── webhook.ts
│ │ │ ├── workflow.ts
│ │ │ └── workflowScheduleExecution.ts
│ │ ├── constants.ts
│ │ ├── cronHelpers.ts
│ │ ├── date.ts
│ │ ├── deprecatedRadioFilter.ts
│ │ ├── fieldHelpers.tsx
│ │ ├── flags.ts
│ │ ├── gtag.ts
│ │ ├── handleValidChars.ts
│ │ ├── helpers.ts
│ │ ├── hooks/
│ │ │ ├── index.ts
│ │ │ ├── useAutoCompleteInputValidation.ts
│ │ │ ├── useBatchedTagsData.ts
│ │ │ ├── useConductorProjectBuilder.ts
│ │ │ ├── useCustomPagination.ts
│ │ │ ├── useEditorForm.ts
│ │ │ ├── useEntityAvailableVersions.ts
│ │ │ ├── useEventNameSuggestions.ts
│ │ │ ├── useGetEntities.ts
│ │ │ ├── useGetEnvironmentVariables.ts
│ │ │ ├── useGetIntegrations.ts
│ │ │ ├── useGetSchedulerDefinitions.ts
│ │ │ ├── useGetSchemas.ts
│ │ │ ├── useGetSecrets.ts
│ │ │ ├── useMCPIntegrations.ts
│ │ │ ├── usePushHistory.ts
│ │ │ ├── useReplaceHistory.ts
│ │ │ ├── useToastMessage.ts
│ │ │ ├── useWorkflowNamesAndVersionsQuery.ts
│ │ │ └── useXStateEventListener.ts
│ │ ├── httpStatus.ts
│ │ ├── human.ts
│ │ ├── index.ts
│ │ ├── json.ts
│ │ ├── jsonSchema.ts
│ │ ├── localstorage.ts
│ │ ├── logger.ts
│ │ ├── logrocket.ts
│ │ ├── maybeTriggerWorkflow.ts
│ │ ├── monacoUtils/
│ │ │ ├── CodeEditorUtils.ts
│ │ │ └── promql.ts
│ │ ├── monitoring.ts
│ │ ├── object.ts
│ │ ├── pipe.ts
│ │ ├── query.ts
│ │ ├── reactHookForm.ts
│ │ ├── regex.ts
│ │ ├── releaseVersion.ts
│ │ ├── remoteServices.ts
│ │ ├── roles.ts
│ │ ├── strings.ts
│ │ ├── task.ts
│ │ ├── themeVariables.ts
│ │ ├── toMaybeQueryString.ts
│ │ ├── tracker.tsx
│ │ ├── useGetGroups.ts
│ │ ├── useGetUsers.ts
│ │ ├── useIntegrationProviders.ts
│ │ ├── useInterval.ts
│ │ ├── useLazyWorkflowNameAutoComplete.ts
│ │ ├── utils.ts
│ │ └── workflow.ts
│ ├── tsconfig.json
│ ├── vite-plugin-csp-nonce.ts
│ └── vite.config.ts
├── venv/
│ └── pyvenv.cfg
└── workflow-event-listener/
├── README.md
├── build.gradle
└── src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── contribs/
│ │ └── listener/
│ │ ├── archive/
│ │ │ ├── ArchivingWithTTLWorkflowStatusListener.java
│ │ │ ├── ArchivingWorkflowListenerConfiguration.java
│ │ │ ├── ArchivingWorkflowListenerProperties.java
│ │ │ ├── ArchivingWorkflowStatusListener.java
│ │ │ └── ArchivingWorkflowToS3.java
│ │ ├── conductorqueue/
│ │ │ ├── ConductorQueueStatusPublisher.java
│ │ │ ├── ConductorQueueStatusPublisherConfiguration.java
│ │ │ └── ConductorQueueStatusPublisherProperties.java
│ │ ├── kafka/
│ │ │ ├── KafkaWorkflowStatusPublisher.java
│ │ │ ├── KafkaWorkflowStatusPublisherConfiguration.java
│ │ │ └── KafkaWorkflowStatusPublisherProperties.java
│ │ └── statuschange/
│ │ ├── StatusChangeNotification.java
│ │ ├── StatusChangePublisher.java
│ │ └── StatusChangePublisherConfiguration.java
│ └── resources/
│ └── META-INF/
│ └── additional-spring-configuration-metadata.json
└── test/
├── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ ├── contribs/
│ │ └── listener/
│ │ ├── ArchivingWorkflowStatusListenerTest.java
│ │ └── statuschange/
│ │ └── StatusChangePublisherTest.java
│ └── test/
│ └── listener/
│ └── WorkflowStatusPublisherIntegrationTest.java
└── resources/
└── application-integrationtest.properties
================================================
FILE CONTENTS
================================================
================================================
FILE: .claude/agents/docs-writer.md
================================================
---
name: docs-writer
description: Technical documentation specialist for Conductor workflow orchestration features. Creates clear, comprehensive documentation for APIs, workflows, tasks, and system architecture.
tools: Read, Grep, Glob, Write, Edit, Bash
model: inherit
---
You are a technical documentation specialist for Conductor, an open-source workflow orchestration engine built at Netflix.
## Your Role
Create clear, comprehensive, and accurate documentation for Conductor features, including:
- Workflow definitions and task types
- REST API endpoints and payloads
- System architecture and components
- Configuration options and database integrations
- SDK usage examples (Java, Python, JavaScript, Go, C#)
- Developer guides and tutorials
## Documentation Process
1. **Understand the Feature**
- Read relevant source code to understand implementation
- Identify key classes, methods, and APIs
- Test functionality if possible
- Review existing related documentation
2. **Structure Documentation**
- Start with a clear overview/summary
- Include purpose and use cases
- Provide syntax and parameters
- Add practical examples
- Document edge cases and limitations
- Link to related documentation
3. **Follow Conductor Style**
- Use clear, concise language
- Include code examples in relevant languages
- Use Markdown formatting consistently
- Add diagrams or JSON examples for workflows
- Follow existing documentation patterns in `/docs`
4. **Quality Standards**
- Ensure technical accuracy
- Test all code examples
- Use proper terminology (workflows, tasks, workers, etc.)
- Include error handling examples
- Add troubleshooting sections when relevant
## Key Conductor Concepts to Reference
- **Workflows**: JSON-based orchestration definitions
- **Tasks**: Units of work (HTTP, Lambda, Sub-workflow, etc.)
- **Workers**: Services that execute tasks
- **Task Definitions**: Reusable task configurations
- **System Tasks**: Built-in task types
- **Event Handlers**: Trigger workflows from events
## Output Format
Provide documentation in Markdown format suitable for the `/docs` directory, with:
- Clear headings and sections
- Code blocks with proper syntax highlighting
- Tables for parameters and options
- Links to related documentation
- Version information when relevant
Always prioritize clarity and practical usefulness for developers using Conductor.
================================================
FILE: .dockerignore
================================================
# Git/VCS
.git
.gitignore
.gitattributes
.github
# IDE/editor
.idea
.vscode
.classpath
.project
.settings
*.iml
# OS/filesystem noise
.DS_Store
# Caches & temp
**/.gradle
**/.cache
**/tmp
**/logs
**/*.log
# Build outputs (keep source in docker build)
**/build
**/out
**/target
**/dist
**/coverage
# Python
venv
**/__pycache__/
**/.pytest_cache/
# JS tooling
**/node_modules
**/.npm
**/.yarn
**/.pnpm-store
**/.eslintcache
**/.parcel-cache
**/.next
# UI build artifacts (explicit)
ui/build
================================================
FILE: .gitattributes
================================================
gradlew eol=lf
*.gradle eol=lf
*.java eol=lf
*.groovy eol=lf
spring.factories eol=lf
*.sh eol=lf
docs/* linguist-documentation
server/src/main/resources/swagger-ui/* linguist-vendored
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ""
labels: 'type: bug'
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**Details**
Conductor version:
Persistence implementation: Cassandra, Postgres, MySQL, Dynomite etc
Queue implementation: Postgres, MySQL, Dynoqueues etc
Lock: Redis or Zookeeper?
Workflow definition:
Task definition:
Event handler definition:
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Additional context**
Add any other context about the problem here.
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug Report
description: Create a report to help us reproduce and fix the bug
body:
- type: markdown
attributes:
value: >
#### Before submitting a bug, please make sure the issue hasn't been already addressed by searching through [the existing and past issues](https://github.com/conductor-oss/conductor/issues?q=is%3Aissue%20label%3Abug).
- type: textarea
attributes:
label: Describe the bug
description: |
Please provide a clear and concise description of what the bug is.
If relevant, add a minimal example so that we can reproduce the error by running the code. It is very important for the snippet to be as succinct (minimal) as possible, so please take time to trim down any irrelevant code to help us debug efficiently.
Your example should be fully self-contained and not rely on any artifact that should be downloaded.
For example:
```python
# All necessary imports at the beginning
import os
import re
# A succinct reproducing example trimmed down to the essential parts:
xxxxx
```
If the code is too long (hopefully, it isn't), feel free to put it in a public gist and link it in the issue: https://gist.github.com.
Please also paste or describe the results you observe instead of the expected results. If you observe an error, please paste the error message including the **full** traceback of the exception. It may be relevant to wrap error messages in ```` ```triple quotes blocks``` ````.
placeholder: |
A clear and concise description of what the bug is.
```python
# Sample code to reproduce the problem
```
```
The error message you got, with the full traceback.
```
validations:
required: true
- type: markdown
attributes:
value: >
Thanks for contributing!
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: true
contact_links:
- name: Questions
url: https://orkes-conductor.slack.com/join/shared_invite/zt-2vdbx239s-Eacdyqya9giNLHfrCavfaA#/shared-invite/email
about: Ask questions and discuss with other Conductor community members
================================================
FILE: .github/ISSUE_TEMPLATE/documentation.md
================================================
---
name: Documentation
about: Something in the documentation that needs improvement
title: "[DOC]: "
labels: 'type: docs'
assignees: ''
---
## What are you missing in the docs
## Proposed text
================================================
FILE: .github/ISSUE_TEMPLATE/documentation.yaml
================================================
name: Documentation
description: Report an issue related to https://docs.conductor-oss.org/index.html
body:
- type: markdown
attributes:
value: >
#### Note: Please report your documentation issue in English to ensure it can be understood and addressed by the development team.
- type: textarea
attributes:
label: The doc issue
description: >
A clear and concise description of what content on https://docs.conductor-oss.org/index.html is an issue.
validations:
required: true
- type: textarea
attributes:
label: Suggest a potential alternative/fix
description: >
Tell us how we could improve the documentation in this regard.
- type: markdown
attributes:
value: >
Thanks for contributing!
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Propose a new feature
title: "[FEATURE]: "
labels: 'type: feature'
assignees: ''
---
Please read our [contributor guide](https://github.com/conductor-oss/conductor/blob/main/CONTRIBUTING.md) before creating an issue.
Also consider discussing your idea on the [discussion forum](https://github.com/conductor-oss/conductor/discussions) first.
## Describe the Feature Request
_A clear and concise description of what the feature request is._
## Describe Preferred Solution
_A clear and concise description of what you want to happen._
## Describe Alternatives
_A clear and concise description of any alternative solutions or features you've considered._
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yaml
================================================
name: Feature request
description: Submit a proposal/request for a new Conductor feature
body:
- type: markdown
attributes:
value: >
#### Note: Please write your feature request in English to ensure it can be understood and addressed by the development team.
- type: textarea
attributes:
label: The feature, motivation and pitch
description: >
A clear and concise description of the feature proposal. Please outline the motivation for the proposal. Is your feature request related to a specific problem? e.g., *"I'm working on X and would like Y to be possible"*. If this is related to another GitHub issue, please link here too.
validations:
required: true
- type: textarea
attributes:
label: Alternatives
description: >
A description of any alternative solutions or features you've considered, if any.
- type: textarea
attributes:
label: Additional context
description: >
Add any other context or screenshots about the feature request.
- type: markdown
attributes:
value: >
Thanks for contributing!
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: "gradle"
directory: "/"
schedule:
interval: "weekly"
reviewers:
- "v1r3n"
- "boney9"
- "c4lm"
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
================================================
FILE: .github/pull_request_template.md
================================================
Pull Request type
----
- [ ] Bugfix
- [ ] Feature
- [ ] Refactoring (no functional changes, no api changes)
- [ ] Build related changes
- [ ] WHOSUSING.md
- [ ] Other (please describe):
**NOTE**: Please remember to run `./gradlew spotlessApply` to fix any format violations.
Changes in this PR
----
_Describe the new behavior from this PR, and why it's needed_
Issue #
Alternatives considered
----
_Describe alternative implementation you have considered_
================================================
FILE: .github/release-drafter.yml
================================================
template: |
## What’s Changed
$CHANGES
name-template: 'v$RESOLVED_VERSION'
tag-template: 'v$RESOLVED_VERSION'
categories:
- title: 'IMPORTANT'
label: 'type: important'
- title: 'New'
label: 'type: feature'
- title: 'Bug Fixes'
label: 'type: bug'
- title: 'Refactor'
label: 'type: maintenance'
- title: 'Documentation'
label: 'type: docs'
- title: 'Dependency Updates'
label: 'type: dependencies'
version-resolver:
minor:
labels:
- 'type: important'
patch:
labels:
- 'type: bug'
- 'type: maintenance'
- 'type: docs'
- 'type: dependencies'
- 'type: feature'
exclude-labels:
- 'skip-changelog'
- 'gradle-wrapper'
- 'github_actions'
================================================
FILE: .github/workflows/ci.yml
================================================
name: CI
on:
push:
paths-ignore:
- "conductor-clients/**"
pull_request:
paths-ignore:
- "conductor-clients/**"
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0
- name: Gradle wrapper validation
uses: gradle/wrapper-validation-action@v3
- name: Set up Zulu JDK 21
uses: actions/setup-java@v5
with:
distribution: "zulu"
java-version: "21"
- name: Cache SonarCloud packages
uses: actions/cache@v5
with:
path: ~/.sonar/cache
key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar
- name: Cache Gradle packages
uses: actions/cache@v5
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: ${{ runner.os }}-gradle-
- name: Force Docker API Version
run: echo 'api.version=1.44' > ~/.docker-java.properties
- name: Build with Gradle
if: github.ref != 'refs/heads/main'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: |
./gradlew build --scan
- name: Build and Publish snapshot
if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main'
run: |
echo "Running build for commit ${{ github.sha }}"
./gradlew build
- name: Publish Test Report
uses: mikepenz/action-junit-report@v6
if: always()
with:
report_paths: "**/build/test-results/test/TEST-*.xml"
- name: Upload build artifacts
uses: actions/upload-artifact@v6
with:
name: build-artifacts
path: "**/build/reports"
- name: Store Buildscan URL
uses: actions/upload-artifact@v6
with:
name: build-scan
path: "buildscan.log"
build-ui:
runs-on: ubuntu-latest
container: cypress/browsers:node-22.11.0-chrome-130.0.6723.116-1-ff-132.0.1-edge-130.0.2849.68-1
defaults:
run:
working-directory: ui
steps:
- uses: actions/checkout@v6
- name: Install Dependencies
run: yarn install
- name: Build UI
run: yarn run build
- name: Run E2E Tests
uses: cypress-io/github-action@v7
with:
working-directory: ui
install: false
start: yarn run serve-build
wait-on: "http://localhost:5000"
- name: Run Component Tests
uses: cypress-io/github-action@v7
with:
working-directory: ui
install: false
component: true
- name: Archive test screenshots
uses: actions/upload-artifact@v6
if: failure()
with:
name: cypress-screenshots
path: ui/cypress/screenshots
- name: Archive test videos
uses: actions/upload-artifact@v6
if: always()
with:
name: cypress-videos
path: ui/cypress/videos
================================================
FILE: .github/workflows/debug-docker-credentials.yml
================================================
name: Debug Docker Credentials
on:
workflow_dispatch:
jobs:
check-docker-user:
runs-on: ubuntu-latest
steps:
- name: Check Docker Hub user for API key
env:
DOCKER_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }}
run: |
echo "Fetching JWT from Docker Hub..."
RESPONSE=$(curl -s -X POST \
-H "Content-Type: application/json" \
-d "{\"username\": \"${DOCKER_USERNAME}\", \"password\": \"${DOCKER_PASSWORD}\"}" \
https://hub.docker.com/v2/users/login)
JWT=$(echo "$RESPONSE" | jq -r '.token // empty')
if [ -z "$JWT" ]; then
echo "Login failed. Response:"
echo "$RESPONSE" | jq .
exit 1
fi
echo "Login successful. Fetching user info..."
USER_INFO=$(curl -s -H "Authorization: Bearer $JWT" https://hub.docker.com/v2/user/)
echo "Raw response:"
echo "$USER_INFO" | jq .
echo "Docker Hub account info:"
echo "$USER_INFO" | jq '{username: .username, full_name: .full_name, email: .email, company: .company, date_joined: .date_joined}'
================================================
FILE: .github/workflows/generate_gh_pages.yml
================================================
name: Publish docs via GitHub Pages
permissions:
contents: write
on:
push:
branches:
- main
workflow_dispatch:
jobs:
build:
name: Deploy docs
runs-on: ubuntu-latest
steps:
- name: Checkout main
uses: actions/checkout@v6
- name: Deploy docs
uses: mhausenblas/mkdocs-deploy-gh-pages@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CONFIG_FILE: mkdocs.yml
REQUIREMENTS: requirements.txt
================================================
FILE: .github/workflows/publish.yml
================================================
name: Publish Conductor OSS toMaven Central
on:
release:
types:
- released
- prereleased
workflow_dispatch:
inputs:
version:
description: 'Version to publish (e.g., v1.0.0)'
required: true
permissions:
contents: read
jobs:
publish:
runs-on: ubuntu-latest
name: Gradle Build and Publish
steps:
- uses: actions/checkout@v6
- name: Set up Zulu JDK 21
uses: actions/setup-java@v5
with:
distribution: 'zulu'
java-version: '21'
- name: Cache Gradle packages
uses: actions/cache@v5
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Publish release
run: |
export VERSION="${{github.ref_name}}"
export PUBLISH_VERSION=`echo ${VERSION:1}`
echo Publishing version $PUBLISH_VERSION
./gradlew publish -PmavenCentral -Pversion=$PUBLISH_VERSION -Pusername=${{ secrets.SONATYPE_USERNAME }} -Ppassword=${{ secrets.SONATYPE_PASSWORD }}
env:
ORG_GRADLE_PROJECT_signingKeyId: ${{ secrets.SIGNING_KEY_ID }}
ORG_GRADLE_PROJECT_signingKey: ${{ secrets.SIGNING_KEY }}
ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.SIGNING_PASSWORD }}
publish-docker:
runs-on: ubuntu-latest
name: Gradle Build and Publish to Container Registry
steps:
- uses: actions/checkout@v6
- name: Set up Zulu JDK 21
uses: actions/setup-java@v5
with:
distribution: 'zulu'
java-version: '21'
- name: Login to Docker Hub Container Registry
uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build Server JAR
run: |
export VERSION="${{github.ref_name}}"
export PUBLISH_VERSION=`echo ${VERSION:1}`
echo "RELEASE_VERSION=$PUBLISH_VERSION" >> $GITHUB_ENV
echo Publishing version $PUBLISH_VERSION
./gradlew :conductor-server:build -x test -x spotlessCheck -x shadowJar -x :conductor-os-persistence-v3:build \
-Pversion=$PUBLISH_VERSION
- name: Set up Node.js
uses: actions/setup-node@v6
with:
node-version: 'lts/*'
- name: Build UI
run: |
cd ui
corepack enable && corepack prepare yarn@stable --activate
export REACT_APP_MONACO_EDITOR_USING_CDN=false
export REACT_APP_ENABLE_ERRORS_INSPECTOR=true
yarn config set network-timeout 600000 -g
yarn install && cp -r node_modules/monaco-editor public/ && yarn build
- name: Stage artifacts for Docker build
run: |
mkdir -p docker/server/libs
cp server/build/libs/*boot*.jar docker/server/libs/conductor-server.jar
- name: Set up QEMU
uses: docker/setup-qemu-action@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
- name: Build and push Server
uses: docker/build-push-action@v7
with:
context: .
file: docker/server/Dockerfile
platforms: linux/arm64,linux/amd64
push: true
build-args: |
PREBUILT=true
tags: |
conductoross/conductor:${{ env.RELEASE_VERSION }}
orkesio/orkes-conductor-community-standalone:${{ env.RELEASE_VERSION }}
orkesio/orkes-conductor-community:${{ env.RELEASE_VERSION }}
${{ (github.event_name == 'release' && !github.event.release.prerelease) && 'conductoross/conductor:latest' || '' }}
${{ (github.event_name == 'release' && !github.event.release.prerelease) && 'orkesio/orkes-conductor-community-standalone:latest' || '' }}
${{ (github.event_name == 'release' && !github.event.release.prerelease) && 'orkesio/orkes-conductor-community:latest' || '' }}
================================================
FILE: .github/workflows/publish_build.yaml
================================================
name: Publish Conductor OSS Server Lite
on:
release:
types:
- released
- prereleased
workflow_dispatch:
inputs:
version:
description: 'Version to publish (e.g., v1.0.0)'
required: true
permissions:
contents: read
jobs:
publish:
runs-on: ubuntu-latest
name: Build and Publish the server-lite
permissions:
contents: write
steps:
- uses: actions/checkout@v6
- name: Set up Zulu JDK 21
uses: actions/setup-java@v5
with:
distribution: 'zulu'
java-version: '21'
- name: Cache Gradle packages
uses: actions/cache@v5
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Set version
id: version
run: |
# Use inputs.version for workflow_dispatch, or ref_name for release events
VERSION="${{ github.event.inputs.version || github.ref_name }}"
# Strip the 'v' prefix if present
PUBLISH_VERSION="${VERSION#v}"
echo "version=$PUBLISH_VERSION" >> $GITHUB_OUTPUT
echo "RELEASE_VERSION=$PUBLISH_VERSION" >> $GITHUB_ENV
echo "Publishing version: $PUBLISH_VERSION"
- name: Create Standalone server
run: |
cd server-lite
# ./build_ui.sh
../gradlew clean build -x test -Pversion=${{ steps.version.outputs.version }}
- name: Prepare JAR for distribution
run: |
# Find the standalone JAR and copy with standardized names
JAR_FILE=$(find server-lite/build/libs -name "*standalone.jar" | head -1)
cp "$JAR_FILE" "server-lite/build/libs/conductor-lite-${{ steps.version.outputs.version }}.jar"
# Create "latest" version for stable download link - only for Release
if [[ "${{ github.event_name }}" == "release" && "${{ github.event.release.prerelease }}" == "false" ]]; then
cp "$JAR_FILE" "server-lite/build/libs/conductor-server-lite-latest.jar"
fi
- name: Upload JARs to GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.event.inputs.version || github.ref_name }}
files: |
server-lite/build/libs/conductor-lite-*.jar
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Build Server JAR
run: |
./gradlew :conductor-server:build -x test -x spotlessCheck -x shadowJar -x :conductor-os-persistence-v3:build \
-Pversion=${{ steps.version.outputs.version }}
- name: Set up Node.js
uses: actions/setup-node@v6
with:
node-version: 'lts/*'
- name: Build UI
run: |
cd ui
corepack enable && corepack prepare yarn@stable --activate
export REACT_APP_MONACO_EDITOR_USING_CDN=false
export REACT_APP_ENABLE_ERRORS_INSPECTOR=true
yarn config set network-timeout 600000 -g
yarn install && cp -r node_modules/monaco-editor public/ && yarn build
- name: Stage artifacts for Docker build
run: |
mkdir -p docker/server/libs
cp server/build/libs/*boot*.jar docker/server/libs/conductor-server.jar
- name: Login to Docker Hub Container Registry
uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
- name: Build and push Server
uses: docker/build-push-action@v7
with:
context: .
file: docker/server/Dockerfile
platforms: linux/arm64,linux/amd64
push: true
build-args: |
PREBUILT=true
tags: |
conductoross/conductor:${{ env.RELEASE_VERSION }}
orkesio/orkes-conductor-community-standalone:${{ env.RELEASE_VERSION }}
orkesio/orkes-conductor-community:${{ env.RELEASE_VERSION }}
${{ (github.event_name == 'release' && !github.event.release.prerelease) && 'conductoross/conductor:latest' || '' }}
${{ (github.event_name == 'release' && !github.event.release.prerelease) && 'orkesio/orkes-conductor-community-standalone:latest' || '' }}
${{ (github.event_name == 'release' && !github.event.release.prerelease) && 'orkesio/orkes-conductor-community:latest' || '' }}
================================================
FILE: .github/workflows/publish_s3.yaml
================================================
name: Publish Conductor Server to S3
on:
push:
branches:
- docker_build # TEMPORARY - remove before merging to main
release:
types:
- released
- prereleased
workflow_dispatch:
inputs:
version:
description: 'Version to publish (e.g., v1.0.0)'
required: true
permissions:
contents: read
jobs:
publish-s3:
runs-on: ubuntu-latest
name: Build and Publish Server JAR to S3
steps:
- uses: actions/checkout@v6
- name: Set up Zulu JDK 21
uses: actions/setup-java@v5
with:
distribution: 'zulu'
java-version: '21'
- name: Cache Gradle packages
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Set version
id: version
run: |
# Use inputs.version for workflow_dispatch, or ref_name for release events
VERSION="${{ github.event.inputs.version || github.ref_name }}"
# Strip the 'v' prefix if present
PUBLISH_VERSION="${VERSION#v}"
echo "version=$PUBLISH_VERSION" >> $GITHUB_OUTPUT
echo "Publishing version: $PUBLISH_VERSION"
- name: Build Server module
run: |
./build_ui.sh
./gradlew :conductor-server:bootJar -x test -Pversion=${{ steps.version.outputs.version }}
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v6
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Upload Server JAR to S3 (Versioned)
run: |
aws s3 cp server/build/libs/conductor-server-${{ steps.version.outputs.version }}-boot.jar \
s3://${{ secrets.AWS_S3_BUCKET }}/conductor-server-${{ steps.version.outputs.version }}.jar
- name: Upload Server JAR to S3 (Latest)
if: github.event_name == 'release' && !github.event.release.prerelease
run: |
aws s3 cp server/build/libs/conductor-server-${{ steps.version.outputs.version }}-boot.jar \
s3://${{ secrets.AWS_S3_BUCKET }}/conductor-server-latest.jar
- name: Verify uploads
run: |
echo "Uploaded conductor-server-${{ steps.version.outputs.version }}.jar"
echo "S3 bucket: ${{ secrets.AWS_S3_BUCKET }}"
================================================
FILE: .github/workflows/release_draft.yml
================================================
name: Release Drafter
on:
push:
branches:
- main
paths-ignore:
- 'conductor-clients/**'
permissions:
contents: read
jobs:
update_release_draft:
permissions:
contents: write # for release-drafter/release-drafter to create a github release
pull-requests: write # for release-drafter/release-drafter to add label to PR
runs-on: ubuntu-latest
steps:
- uses: release-drafter/release-drafter@v7
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
================================================
FILE: .github/workflows/ui-next-ci.yml
================================================
name: UI v2 CI
on:
pull_request:
branches:
- main
paths:
- "ui-next/**"
permissions:
contents: read
jobs:
lint-format-test:
name: Lint, Format & Test
runs-on: ubuntu-latest
defaults:
run:
working-directory: ui-next
steps:
- uses: actions/checkout@v6
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: 22
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10.32.0
- name: Get pnpm store directory
id: pnpm-cache
run: echo "store=$(pnpm store path)" >> $GITHUB_OUTPUT
- name: Cache pnpm store
uses: actions/cache@v4
with:
path: ${{ steps.pnpm-cache.outputs.store }}
key: ${{ runner.os }}-pnpm-${{ hashFiles('ui-next/pnpm-lock.yaml') }}
restore-keys: ${{ runner.os }}-pnpm-
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Prettier check
run: pnpm prettier:check
- name: Lint
run: pnpm lint
- name: Type check
run: pnpm typecheck
- name: Test
run: pnpm test
- name: Build
run: pnpm build
================================================
FILE: .gitignore
================================================
# Java Build
.gradle
.classpath
dump.rdb
out
bin
target
buildscan.log
/docs/site
# Python
/polyglot-clients/python/conductor.egg-info
*.pyc
# OS & IDE
.DS_Store
.settings
.vscode
.idea
.project
*.iml
# JS & UI Related
node_modules
/ui/build
/ui/public/monaco-editor
# publishing secrets
secrets/signing-key
# local builds
lib/
build/
*/build/
# asdf version file
.tool-versions
# jenv version file
.java-version
.qodo
conductorosstest.db
conductorosstest.db
/server-lite/src/main/resources/static
yarn.lock
.java-version
server-lite/conductorosstest.db-shm
server-lite/conductorosstest.db-wal
/server/src/main/resources/static
*.factorypath
server/*.db*
/site
================================================
FILE: .opencode/plans/video-generation-implementation.md
================================================
# Video Generation Implementation Plan - Phases 2-5
## Decisions Made
1. **Full Spring AI mirror** for the video framework (PR-able to spring-ai)
2. **InputStream support** in DocumentLoader for streaming large video files
3. **Download bytes always** for Gemini Veo (don't pass through GCS URIs)
4. Phase 2 must complete first; then Phases 3, 4, 5 can proceed in any order
---
## Phase 2: Restructure Video Framework (Spring AI Pattern)
All files in `ai/src/main/java/org/conductoross/conductor/ai/video/`.
### Type Hierarchy (mirroring Spring AI Image*)
```
ModelOptions (spring-ai marker)
+-- VideoOptions (interface)
ResultMetadata (spring-ai marker)
+-- VideoGenerationMetadata (marker interface)
MutableResponseMetadata (spring-ai class)
+-- VideoResponseMetadata (class: jobId, status, errorMessage)
ModelResult<Video>
+-- VideoGeneration (class)
ModelRequest<List<VideoMessage>>
+-- VideoPrompt (class)
ModelResponse<VideoGeneration>
+-- VideoResponse (class)
Model<VideoPrompt, VideoResponse>
+-- VideoModel (@FunctionalInterface)
+-- AsyncVideoModel (adds checkStatus)
```
### 2a. REWRITE: `VideoModel.java`
Current: has `call()` + `default checkStatus()`.
Target: `@FunctionalInterface extends Model<VideoPrompt, VideoResponse>`, only `call()`.
```java
package org.conductoross.conductor.ai.video;
import org.springframework.ai.model.Model;
@FunctionalInterface
public interface VideoModel extends Model<VideoPrompt, VideoResponse> {
@Override
VideoResponse call(VideoPrompt prompt);
}
```
### 2b. NEW: `AsyncVideoModel.java`
```java
package org.conductoross.conductor.ai.video;
public interface AsyncVideoModel extends VideoModel {
VideoResponse checkStatus(String jobId);
}
```
### 2c. REWRITE: `VideoOptions.java`
Current: standalone interface with video getters.
Target: `extends ModelOptions`, add new fields for OpenAI/Gemini.
```java
package org.conductoross.conductor.ai.video;
import org.springframework.ai.model.ModelOptions;
public interface VideoOptions extends ModelOptions {
// Core params (mirror ImageOptions: getN, getModel, getWidth, getHeight, getResponseFormat, getStyle)
String getModel();
Integer getN();
Integer getWidth();
Integer getHeight();
String getOutputFormat();
String getStyle();
// Video-specific
Integer getDuration();
Integer getFps();
String getAspectRatio();
String getInputImage(); // URL or base64 for image-to-video
String getSize(); // "1280x720" format (OpenAI Sora)
// Advanced
String getMotion();
Integer getSeed();
Float getGuidanceScale();
String getNegativePrompt(); // Gemini Veo
String getPersonGeneration(); // Gemini: "dont_allow" / "allow_adult"
String getResolution(); // Gemini: "720p" / "1080p"
Boolean getGenerateAudio(); // Gemini Veo 3+
// Thumbnail
Boolean getGenerateThumbnail();
Integer getThumbnailTimestamp();
}
```
### 2d. EDIT: `VideoOptionsBuilder.java`
Add new fields to existing Lombok @Data @Builder class:
```java
// ADD these fields after existing ones:
private String inputImage;
private String negativePrompt;
private String personGeneration;
private String resolution;
private Boolean generateAudio;
private String size;
```
### 2e. NEW: `VideoMessage.java`
Extract from `VideoPrompt.VideoMessage` inner class. Mirror `ImageMessage`:
```java
package org.conductoross.conductor.ai.video;
public class VideoMessage {
private String text;
private Float weight;
public VideoMessage(String text) { this(text, null); }
public VideoMessage(String text, Float weight) {
this.text = text;
this.weight = weight;
}
public String getText() { return text; }
public Float getWeight() { return weight; }
}
```
### 2f. REWRITE: `VideoPrompt.java`
Implement `ModelRequest<List<VideoMessage>>`. Remove `inputImage` (now in VideoOptions).
```java
package org.conductoross.conductor.ai.video;
import java.util.Collections;
import java.util.List;
import org.springframework.ai.model.ModelRequest;
public class VideoPrompt implements ModelRequest<List<VideoMessage>> {
private final List<VideoMessage> messages;
private VideoOptions videoOptions;
public VideoPrompt(List<VideoMessage> messages) {
this(messages, new VideoOptionsBuilder());
}
public VideoPrompt(List<VideoMessage> messages, VideoOptions options) {
this.messages = List.copyOf(messages);
this.videoOptions = options;
}
public VideoPrompt(String instructions) {
this(instructions, new VideoOptionsBuilder());
}
public VideoPrompt(String instructions, VideoOptions options) {
this(List.of(new VideoMessage(instructions)), options);
}
@Override
public List<VideoMessage> getInstructions() { return messages; }
@Override
public VideoOptions getOptions() { return videoOptions; }
}
```
### 2g. NEW: `VideoGenerationMetadata.java`
```java
package org.conductoross.conductor.ai.video;
import org.springframework.ai.model.ResultMetadata;
public interface VideoGenerationMetadata extends ResultMetadata {
// Marker interface, same pattern as ImageGenerationMetadata
}
```
### 2h. NEW: `VideoGeneration.java`
Extract from `VideoResponse.VideoGeneration`. Implement `ModelResult<Video>`:
```java
package org.conductoross.conductor.ai.video;
import org.springframework.ai.model.ModelResult;
public class VideoGeneration implements ModelResult<Video> {
private Video video;
private VideoGenerationMetadata videoGenerationMetadata;
public VideoGeneration(Video video) {
this(video, null);
}
public VideoGeneration(Video video, VideoGenerationMetadata metadata) {
this.video = video;
this.videoGenerationMetadata = metadata;
}
@Override
public Video getOutput() { return video; }
@Override
public VideoGenerationMetadata getMetadata() { return videoGenerationMetadata; }
}
```
### 2i. NEW: `VideoResponseMetadata.java`
Extract from `VideoResponse.VideoResponseMetadata`. Extend Spring AI's `MutableResponseMetadata`:
```java
package org.conductoross.conductor.ai.video;
import org.springframework.ai.model.MutableResponseMetadata;
public class VideoResponseMetadata extends MutableResponseMetadata {
private final Long created;
public static final String KEY_JOB_ID = "jobId";
public static final String KEY_STATUS = "status";
public static final String KEY_ERROR_MESSAGE = "errorMessage";
public VideoResponseMetadata() { this(System.currentTimeMillis()); }
public VideoResponseMetadata(Long created) { this.created = created; }
public Long getCreated() { return created; }
// Convenience accessors for common video metadata
public String getJobId() { return get(KEY_JOB_ID); }
public void setJobId(String jobId) { put(KEY_JOB_ID, jobId); }
public String getStatus() { return get(KEY_STATUS); }
public void setStatus(String status) { put(KEY_STATUS, status); }
public String getErrorMessage() { return get(KEY_ERROR_MESSAGE); }
public void setErrorMessage(String msg) { put(KEY_ERROR_MESSAGE, msg); }
}
```
### 2j. REWRITE: `VideoResponse.java`
Implement `ModelResponse<VideoGeneration>`. Remove inner classes.
```java
package org.conductoross.conductor.ai.video;
import java.util.List;
import org.springframework.ai.model.ModelResponse;
public class VideoResponse implements ModelResponse<VideoGeneration> {
private final List<VideoGeneration> videoGenerations;
private final VideoResponseMetadata videoResponseMetadata;
public VideoResponse(List<VideoGeneration> generations) {
this(generations, new VideoResponseMetadata());
}
public VideoResponse(List<VideoGeneration> generations, VideoResponseMetadata metadata) {
this.videoGenerations = List.copyOf(generations);
this.videoResponseMetadata = metadata;
}
@Override
public VideoGeneration getResult() {
return videoGenerations.isEmpty() ? null : videoGenerations.getFirst();
}
@Override
public List<VideoGeneration> getResults() { return videoGenerations; }
@Override
public VideoResponseMetadata getMetadata() { return videoResponseMetadata; }
}
```
### 2k. REWRITE: `Video.java`
Simplify to match `Image(url, b64Json)`:
```java
package org.conductoross.conductor.ai.video;
public class Video {
private String url;
private String b64Json;
public Video(String url, String b64Json) {
this.url = url;
this.b64Json = b64Json;
}
public String getUrl() { return url; }
public void setUrl(String url) { this.url = url; }
public String getB64Json() { return b64Json; }
public void setB64Json(String b64Json) { this.b64Json = b64Json; }
}
```
### 2l. EDIT: `AIModel.java` (line 119-136)
Update `getVideoOptions()` to include new fields:
```java
default VideoOptions getVideoOptions(VideoGenRequest input) {
return VideoOptionsBuilder.builder()
.model(input.getModel())
.duration(input.getDuration())
.width(input.getWidth())
.height(input.getHeight())
.fps(input.getFps())
.outputFormat(input.getOutputFormat())
.n(input.getN())
.style(input.getStyle())
.motion(input.getMotion())
.seed(input.getSeed())
.guidanceScale(input.getGuidanceScale())
.aspectRatio(input.getAspectRatio())
.generateThumbnail(input.getGenerateThumbnail())
.thumbnailTimestamp(input.getThumbnailTimestamp())
// New fields for OpenAI Sora and Gemini Veo
.inputImage(input.getInputImage())
.negativePrompt(input.getNegativePrompt())
.personGeneration(input.getPersonGeneration())
.resolution(input.getResolution())
.generateAudio(input.getGenerateAudio())
.size(input.getSize())
.build();
}
```
### 2m. EDIT: `VideoGenRequest.java`
Add new fields after existing ones (around line 49):
```java
// New fields for OpenAI Sora and Gemini Veo
private String negativePrompt; // Gemini Veo: what to exclude
private String personGeneration; // Gemini: "dont_allow" / "allow_adult"
private String resolution; // Gemini: "720p" / "1080p"
private Boolean generateAudio; // Gemini Veo 3+
private String size; // OpenAI: "1280x720" format string
```
Update class javadoc: replace "Stability AI" references with "OpenAI Sora, Gemini Veo".
### 2n. ADD InputStream support to DocumentLoader
**EDIT: `DocumentLoader.java`** - Add default method:
```java
// Add after existing upload method:
default String upload(Map<String, String> headers, String contentType,
java.io.InputStream data, String fileURI) {
try {
return upload(headers, contentType, data.readAllBytes(), fileURI);
} catch (java.io.IOException e) {
throw new RuntimeException("Failed to read InputStream", e);
}
}
```
**EDIT: `FileSystemDocumentLoader.java`** - Override with streaming implementation:
```java
@Override
public String upload(Map<String, String> headers, String contentType,
java.io.InputStream data, String fileURI) {
try {
if (data == null) {
return null;
}
Path path = Path.of(fileURI.replace("file://", ""));
var result = path.toFile().getParentFile().mkdirs();
Files.copy(data, path, java.nio.file.StandardCopyOption.REPLACE_EXISTING);
return path.toAbsolutePath().toString();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
```
**EDIT: `LLMHelper.java`** - Add InputStream-aware `storeMedia` overload:
```java
// New method alongside existing storeMedia:
void storeMediaStream(String location, String mimeType,
java.io.InputStream stream,
org.conductoross.conductor.ai.models.Media mediaRef) {
Optional<DocumentLoader> docLoader = documentLoaders.stream()
.filter(dl -> dl.supports(location))
.findFirst();
docLoader.ifPresent(loader -> {
String ext = getExtensionFromMimeType(mimeType);
String uniqueLocation = location + "_" + java.util.UUID.randomUUID() + ext;
loader.upload(Map.of(), mimeType, stream, uniqueLocation);
mediaRef.setLocation(uniqueLocation);
});
}
```
### Phase 2 File Summary
| File | Action | Lines Changed |
|------|--------|--------------|
| `video/VideoModel.java` | REWRITE | Remove checkStatus, add @FunctionalInterface, extends Model |
| `video/AsyncVideoModel.java` | **NEW** | Interface with checkStatus(String) |
| `video/VideoOptions.java` | REWRITE | extends ModelOptions, add 6 new getters |
| `video/VideoOptionsBuilder.java` | EDIT | Add 6 new fields |
| `video/VideoMessage.java` | **NEW** | Top-level class (text, weight) |
| `video/VideoPrompt.java` | REWRITE | implements ModelRequest, remove inputImage |
| `video/VideoGenerationMetadata.java` | **NEW** | Marker interface extends ResultMetadata |
| `video/VideoGeneration.java` | **NEW** | implements ModelResult<Video> |
| `video/VideoResponseMetadata.java` | **NEW** | extends MutableResponseMetadata |
| `video/VideoResponse.java` | REWRITE | implements ModelResponse, remove inner classes |
| `video/Video.java` | REWRITE | Simplify to (url, b64Json) |
| `AIModel.java` | EDIT | Update getVideoOptions() for new fields |
| `models/VideoGenRequest.java` | EDIT | Add 5 new fields |
| `document/DocumentLoader.java` | EDIT | Add default InputStream upload method |
| `document/FileSystemDocumentLoader.java` | EDIT | Override with Files.copy() |
| `LLMHelper.java` | EDIT | Add storeMediaStream() method |
---
## Phase 3: OpenAI Sora Video Provider
### 3a. NEW: `providers/openai/api/OpenAIVideoApi.java`
REST client using `java.net.http.HttpClient` for the OpenAI Video API.
**Endpoints (from official docs, verified):**
- `POST https://api.openai.com/v1/videos` (multipart/form-data) - Submit job
- `GET https://api.openai.com/v1/videos/{id}` (JSON) - Poll status
- `GET https://api.openai.com/v1/videos/{id}/content` (binary stream) - Download MP4
- `GET https://api.openai.com/v1/videos/{id}/content?variant=thumbnail` (binary) - Download thumbnail
**Inner records:**
```java
record VideoCreateParams(
String prompt,
String model, // sora-2, sora-2-pro
String size, // "1280x720"
String seconds, // "5", "8", "10" (NOTE: string, not int)
byte[] inputReference, // optional image bytes
String inputReferenceMimeType
)
record VideoStatusResponse(
String id,
String object,
long created_at,
String status, // queued, in_progress, completed, failed
String model,
int progress, // 0-100
String seconds,
String size
)
```
**Methods:**
```java
public class OpenAIVideoApi {
private final String apiKey;
private final String baseUrl; // e.g., "https://api.openai.com"
private final HttpClient httpClient;
private final ObjectMapper objectMapper;
public OpenAIVideoApi(String apiKey, String baseUrl)
// Submit - builds multipart/form-data, returns status
public VideoStatusResponse submitVideoJob(VideoCreateParams params)
// Poll - GET JSON
public VideoStatusResponse getVideoStatus(String videoId)
// Download MP4 - returns InputStream for streaming to DocumentLoader
public InputStream downloadVideoStream(String videoId)
// Download thumbnail - returns byte[]
public byte[] downloadThumbnail(String videoId)
}
```
Key implementation details:
- `submitVideoJob`: Build multipart/form-data with boundary. Fields: `prompt`, `model`, `size`, `seconds`. If `inputReference` present, add as file part with Content-Type.
- `downloadVideoStream`: Returns `HttpResponse<InputStream>` body directly (streaming, not buffered). This feeds into `DocumentLoader.upload(InputStream)`.
- Auth header: `Authorization: Bearer {apiKey}`
### 3b. NEW: `providers/openai/OpenAIVideoModel.java`
Implements `AsyncVideoModel`:
```java
public class OpenAIVideoModel implements AsyncVideoModel {
private final OpenAIVideoApi api;
private final List<DocumentLoader> documentLoaders; // For streaming storage
@Override
public VideoResponse call(VideoPrompt prompt) {
// 1. Extract text + options
// 2. Resolve inputImage if present (download URL / decode base64)
// 3. Build size string from options
// 4. Submit via api.submitVideoJob()
// 5. Return VideoResponse with jobId in metadata, status = "PROCESSING"
}
@Override
public VideoResponse checkStatus(String jobId) {
// 1. Poll via api.getVideoStatus(jobId)
// 2. If completed:
// - Get InputStream via api.downloadVideoStream(jobId)
// - Create Video with b64Json = null (will be stored via streaming)
// - Store the InputStream reference for LLMHelper to handle
// Actually: download as byte[], create Media with byte[] data
// (DocumentLoader InputStream support is an optimization path;
// for now we can download to byte[] and let storeMedia handle it)
// 3. If failed: set error in metadata
// 4. If still processing: return processing status
}
}
```
**Revised approach for video download:** Since the existing `LLMHelper.storeMedia()` flow expects `Media` objects with `byte[] data`, and we're adding InputStream support as an enhancement, the OpenAIVideoModel will:
1. Download video bytes via `api.downloadVideo(jobId)` (returns byte[])
2. Optionally download thumbnail bytes
3. Build `VideoGeneration` with `Video(null, base64encoded)`
4. The caller (OpenAI.checkVideoStatus) converts to `Media` with byte[] data
5. `LLMHelper.storeMedia()` writes to disk
For the InputStream optimization: `OpenAIVideoApi.downloadVideoStream()` returns InputStream. The provider can call `documentLoader.upload(InputStream)` directly instead of buffering. This can be wired through `LLMHelper.storeMediaStream()`.
### 3c. MODIFY: `providers/openai/OpenAI.java`
Add after line 63 (field declarations):
```java
private final OpenAIVideoModel videoModel;
```
Add in constructor after `this.speechModel = ...`:
```java
this.videoModel = createVideoModel();
```
Add new methods:
```java
@Override
public VideoModel getVideoModel() {
return this.videoModel;
}
@Override
public LLMResponse generateVideo(VideoGenRequest request) {
VideoOptions options = getVideoOptions(request);
VideoPrompt videoPrompt = new VideoPrompt(request.getPrompt(), options);
VideoResponse response = videoModel.call(videoPrompt);
return LLMResponse.builder()
.result(response.getMetadata().getJobId())
.finishReason(response.getMetadata().getStatus())
.build();
}
@Override
public LLMResponse checkVideoStatus(VideoGenRequest request) {
VideoResponse response = videoModel.checkStatus(request.getJobId());
String status = response.getMetadata().getStatus();
LLMResponse.LLMResponseBuilder builder = LLMResponse.builder()
.finishReason(status);
if ("COMPLETED".equals(status)) {
List<Media> mediaList = new ArrayList<>();
for (VideoGeneration gen : response.getResults()) {
Video video = gen.getOutput();
if (video.getB64Json() != null) {
mediaList.add(Media.builder()
.data(Base64.getDecoder().decode(video.getB64Json()))
.mimeType("video/mp4")
.build());
}
}
builder.media(mediaList);
}
return builder.build();
}
private OpenAIVideoModel createVideoModel() {
// Remove /v1 suffix for base URL (OpenAIVideoApi adds its own paths)
String baseUrl = config.getBaseURL();
if (baseUrl != null && baseUrl.endsWith("/v1")) {
baseUrl = baseUrl.substring(0, baseUrl.length() - 3);
}
OpenAIVideoApi videoApi = new OpenAIVideoApi(config.getApiKey(), baseUrl);
return new OpenAIVideoModel(videoApi);
}
```
New imports:
```java
import org.conductoross.conductor.ai.models.VideoGenRequest;
import org.conductoross.conductor.ai.video.*;
import org.conductoross.conductor.ai.providers.openai.api.OpenAIVideoApi;
```
### Phase 3 File Summary
| File | Action |
|------|--------|
| `providers/openai/api/OpenAIVideoApi.java` | **NEW** (~200 lines) |
| `providers/openai/OpenAIVideoModel.java` | **NEW** (~150 lines) |
| `providers/openai/OpenAI.java` | EDIT (add ~60 lines) |
---
## Phase 4: Gemini Veo Video Provider
### 4a. NEW: `providers/gemini/GeminiVideoModel.java`
Implements `AsyncVideoModel` using the Google GenAI SDK (already in dependencies).
```java
package org.conductoross.conductor.ai.providers.gemini;
import com.google.genai.Client;
import com.google.genai.types.*;
import org.conductoross.conductor.ai.video.*;
import java.util.*;
public class GeminiVideoModel implements AsyncVideoModel {
private final Client client;
public GeminiVideoModel(Client client) { this.client = client; }
@Override
public VideoResponse call(VideoPrompt prompt) {
VideoOptions opts = prompt.getOptions();
String text = prompt.getInstructions().getFirst().getText();
// Build GenerateVideosConfig from VideoOptions
GenerateVideosConfig.Builder configBuilder = GenerateVideosConfig.builder()
.numberOfVideos(opts.getN() != null ? opts.getN() : 1);
if (opts.getDuration() != null) configBuilder.durationSeconds(opts.getDuration());
if (opts.getAspectRatio() != null) configBuilder.aspectRatio(opts.getAspectRatio());
if (opts.getSeed() != null) configBuilder.seed(opts.getSeed());
if (opts.getNegativePrompt() != null) configBuilder.negativePrompt(opts.getNegativePrompt());
if (opts.getPersonGeneration() != null) configBuilder.personGeneration(opts.getPersonGeneration());
if (opts.getResolution() != null) configBuilder.resolution(opts.getResolution());
if (opts.getGenerateAudio() != null) configBuilder.generateAudio(opts.getGenerateAudio());
if (opts.getFps() != null) configBuilder.fps(opts.getFps());
// Resolve input image for image-to-video
Image inputImage = null;
if (opts.getInputImage() != null) {
inputImage = resolveGeminiImage(opts.getInputImage());
}
// Submit async operation
GenerateVideosOperation operation = client.models.generateVideos(
opts.getModel(), text, inputImage, configBuilder.build());
// Return operation name as job ID
String operationName = operation.name().orElse(null);
VideoResponseMetadata metadata = new VideoResponseMetadata();
metadata.setJobId(operationName);
metadata.setStatus("PROCESSING");
return new VideoResponse(List.of(), metadata);
}
@Override
public VideoResponse checkStatus(String jobId) {
// Build operation reference for polling
GenerateVideosOperation opRef = GenerateVideosOperation.builder()
.name(jobId).build();
GenerateVideosOperation operation = client.operations.getVideosOperation(opRef, null);
boolean isDone = operation.done().orElse(false);
VideoResponseMetadata metadata = new VideoResponseMetadata();
metadata.setJobId(jobId);
if (isDone) {
if (operation.error().isPresent()) {
metadata.setStatus("FAILED");
metadata.setErrorMessage(operation.error().get().toString());
return new VideoResponse(List.of(), metadata);
}
// Extract videos
GenerateVideosResponse response = operation.response().orElse(null);
List<VideoGeneration> generations = new ArrayList<>();
if (response != null) {
for (GeneratedVideo gv : response.generatedVideos().orElse(List.of())) {
gv.video().ifPresent(video -> {
byte[] bytes = video.videoBytes().orElse(null);
String b64 = bytes != null ? Base64.getEncoder().encodeToString(bytes) : null;
String url = video.uri().orElse(null);
// If we got a GCS URI but no bytes, download the bytes
if (b64 == null && url != null && url.startsWith("gs://")) {
// Download from GCS URI via the SDK or HTTP
// The SDK typically returns bytes for Vertex AI
// For now, pass the URL and handle download in the provider
}
generations.add(new VideoGeneration(new Video(url, b64)));
});
}
}
metadata.setStatus("COMPLETED");
return new VideoResponse(generations, metadata);
} else {
metadata.setStatus("PROCESSING");
return new VideoResponse(List.of(), metadata);
}
}
private Image resolveGeminiImage(String inputImage) {
if (inputImage.startsWith("data:")) {
String base64Part = inputImage.substring(inputImage.indexOf(",") + 1);
byte[] bytes = Base64.getDecoder().decode(base64Part);
String mimeType = inputImage.substring(5, inputImage.indexOf(";"));
return Image.builder().imageBytes(bytes).mimeType(mimeType).build();
} else if (inputImage.startsWith("http://") || inputImage.startsWith("https://")) {
byte[] bytes = downloadFromUrl(inputImage);
return Image.builder().imageBytes(bytes).mimeType("image/png").build();
} else {
// Assume raw base64
byte[] bytes = Base64.getDecoder().decode(inputImage);
return Image.builder().imageBytes(bytes).mimeType("image/png").build();
}
}
private byte[] downloadFromUrl(String url) {
try {
var client = java.net.http.HttpClient.newHttpClient();
var request = java.net.http.HttpRequest.newBuilder()
.uri(java.net.URI.create(url)).GET().build();
var response = client.send(request, java.net.http.HttpResponse.BodyHandlers.ofByteArray());
return response.body();
} catch (Exception e) {
throw new RuntimeException("Failed to download image from " + url, e);
}
}
}
```
### 4b. MODIFY: `providers/gemini/GeminiVertex.java`
Extract `Client` creation to reusable method (currently duplicated in `getImageModel()` and `generateAudio()`):
```java
// Add private helper (refactoring existing duplication):
private Client createGenAIClient() {
return Client.builder()
.vertexAI(true)
.credentials(config.getGoogleCredentials())
.location(config.getLocation())
.project(config.getProjectId())
.build();
}
```
Update existing `getImageModel()` (line 158-166) and `generateAudio()` (lines 170-175) to use `createGenAIClient()`.
Add new video methods:
```java
@Override
public VideoModel getVideoModel() {
return new GeminiVideoModel(createGenAIClient());
}
@Override
public LLMResponse generateVideo(VideoGenRequest request) {
VideoOptions options = getVideoOptions(request);
VideoPrompt videoPrompt = new VideoPrompt(request.getPrompt(), options);
GeminiVideoModel videoModel = new GeminiVideoModel(createGenAIClient());
VideoResponse response = videoModel.call(videoPrompt);
return LLMResponse.builder()
.result(response.getMetadata().getJobId())
.finishReason(response.getMetadata().getStatus())
.build();
}
@Override
public LLMResponse checkVideoStatus(VideoGenRequest request) {
GeminiVideoModel videoModel = new GeminiVideoModel(createGenAIClient());
VideoResponse response = videoModel.checkStatus(request.getJobId());
String status = response.getMetadata().getStatus();
LLMResponse.LLMResponseBuilder builder = LLMResponse.builder().finishReason(status);
if ("COMPLETED".equals(status)) {
List<org.conductoross.conductor.ai.models.Media> mediaList = new ArrayList<>();
for (VideoGeneration gen : response.getResults()) {
Video video = gen.getOutput();
if (video.getB64Json() != null) {
mediaList.add(org.conductoross.conductor.ai.models.Media.builder()
.data(Base64.getDecoder().decode(video.getB64Json()))
.mimeType("video/mp4")
.build());
} else if (video.getUrl() != null) {
// Download from URL (e.g., GCS URI) to get bytes
byte[] bytes = downloadFromUrl(video.getUrl());
mediaList.add(org.conductoross.conductor.ai.models.Media.builder()
.data(bytes)
.mimeType("video/mp4")
.build());
}
}
builder.media(mediaList);
}
return builder.build();
}
private byte[] downloadFromUrl(String url) {
try {
var httpClient = java.net.http.HttpClient.newHttpClient();
var request = java.net.http.HttpRequest.newBuilder()
.uri(java.net.URI.create(url)).GET().build();
var response = httpClient.send(request, java.net.http.HttpResponse.BodyHandlers.ofByteArray());
return response.body();
} catch (Exception e) {
throw new RuntimeException("Failed to download from " + url, e);
}
}
```
New imports:
```java
import org.conductoross.conductor.ai.models.VideoGenRequest;
import org.conductoross.conductor.ai.video.*;
import java.util.Base64;
```
### Phase 4 File Summary
| File | Action |
|------|--------|
| `providers/gemini/GeminiVideoModel.java` | **NEW** (~150 lines) |
| `providers/gemini/GeminiVertex.java` | EDIT (~80 lines added, refactor Client creation) |
---
## Phase 5: Stability AI Image Provider (via Spring AI)
### 5a. EDIT: `ai/build.gradle`
Add after line 29 (`api "org.springframework.ai:spring-ai-ollama:${revSpringAI}"`):
```gradle
api "org.springframework.ai:spring-ai-stability-ai:${revSpringAI}"
```
### 5b. NEW: `providers/stabilityai/StabilityAIConfiguration.java`
```java
package org.conductoross.conductor.ai.providers.stabilityai;
import org.conductoross.conductor.ai.ModelConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Component
@ConfigurationProperties(prefix = "conductor.ai.stabilityai")
@NoArgsConstructor
@AllArgsConstructor
public class StabilityAIConfiguration implements ModelConfiguration<StabilityAI> {
private String apiKey;
@Override
public StabilityAI get() {
return new StabilityAI(this);
}
}
```
### 5c. NEW: `providers/stabilityai/StabilityAI.java`
Image-only provider:
```java
package org.conductoross.conductor.ai.providers.stabilityai;
import java.util.List;
import org.conductoross.conductor.ai.AIModel;
import org.conductoross.conductor.ai.models.EmbeddingGenRequest;
import org.conductoross.conductor.ai.models.ImageGenRequest;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.image.ImageModel;
import org.springframework.ai.image.ImageOptions;
import org.springframework.ai.stabilityai.StabilityAiImageModel;
import org.springframework.ai.stabilityai.api.StabilityAiApi;
import org.springframework.ai.stabilityai.api.StabilityAiImageOptions;
public class StabilityAI implements AIModel {
public static final String NAME = "stabilityai";
private final StabilityAiImageModel imageModel;
public StabilityAI(StabilityAIConfiguration config) {
StabilityAiApi api = new StabilityAiApi(config.getApiKey());
this.imageModel = new StabilityAiImageModel(api);
}
@Override
public String getModelProvider() { return NAME; }
@Override
public ImageModel getImageModel() { return this.imageModel; }
@Override
public ImageOptions getImageOptions(ImageGenRequest input) {
return StabilityAiImageOptions.builder()
.model(input.getModel())
.N(input.getN())
.width(input.getWidth())
.height(input.getHeight())
.responseFormat("b64_json")
.stylePreset(input.getStyle())
.build();
}
@Override
public ChatModel getChatModel() {
throw new UnsupportedOperationException(
"Chat completion not supported by Stability AI provider");
}
@Override
public List<Float> generateEmbeddings(EmbeddingGenRequest req) {
throw new UnsupportedOperationException(
"Embeddings not supported by Stability AI provider");
}
}
```
### Phase 5 File Summary
| File | Action |
|------|--------|
| `ai/build.gradle` | EDIT (add 1 line) |
| `providers/stabilityai/StabilityAIConfiguration.java` | **NEW** (~25 lines) |
| `providers/stabilityai/StabilityAI.java` | **NEW** (~50 lines) |
---
## Execution Order
1. **Phase 2** first (framework restructure) - all other phases depend on this
2. **Phases 3, 4, 5** can be done in parallel after Phase 2
3. Run `./gradlew :conductor-ai:spotlessApply :conductor-ai:compileJava` after each phase
4. Final full build verification: `./gradlew :conductor-ai:spotlessApply && ./gradlew :conductor-ai:compileJava`
## Total New/Modified Files
| Category | New Files | Modified Files |
|----------|-----------|----------------|
| Phase 2 (Framework) | 5 | 11 |
| Phase 3 (OpenAI) | 2 | 1 |
| Phase 4 (Gemini) | 1 | 1 |
| Phase 5 (Stability) | 2 | 1 |
| **Total** | **10** | **14** |
================================================
FILE: AGENTS.md
================================================
# AGENTS.md
Instructions for AI coding agents working on the Conductor codebase.
## Project Overview
Conductor is an open-source, distributed workflow orchestration engine designed for microservices.
It uses a pluggable architecture with interface-based abstractions for persistence, queuing, and indexing.
The project is built with Java 21 and uses Gradle as the build system.
## Setup Commands
| Command | Description |
|---------|-------------|
| `./gradlew build` | Build the entire project |
| `./gradlew test` | Run all tests |
| `./gradlew :module-name:test` | Run tests for a specific module |
| `./gradlew spotlessApply` | Apply code formatting |
| `./gradlew clean build` | Clean and rebuild |
> **Important**: Always run `./gradlew spotlessApply` after making code changes to ensure consistent formatting.
## Code Style
- Use the Spotless plugin for uniform code formatting—always run before committing
- Conductor is pluggable: when introducing new concepts, always use an **interface-based approach**
- DAO interfaces **MUST** be defined in the `core` module
- Implementation classes go in their respective persistence modules (e.g., `postgres-persistence`, `redis-persistence`)
- Follow existing patterns in the codebase for consistency
- Do not use emojis such as ✅ in the code, logs, or comments. Keep comments professionals
- When adding new logic, comment the algorithm, design etc.
## Architecture Guidelines
### Module Structure
- **core**: Contains interfaces, domain models, and core business logic
- **persistence modules**: Implementations of DAO interfaces (postgres, redis, mysql, etc.)
- **server**: Spring Boot application that brings everything together
- **client**: SDK for interacting with Conductor
- **ui**: React-based user interface
### Key Patterns
- DAOs are defined as interfaces in `core` and implemented in persistence modules
- System tasks extend `WorkflowSystemTask` and are registered via Spring
- Worker tasks use the `@WorkerTask` annotation for automatic discovery
- Configuration is primarily done through Spring properties
## Testing
- **Avoid mocks**: Use real implementations whenever possible
- **Test actual behavior**: Tests must verify real implementation logic, not duplicate it
- **Use Testcontainers**: For database, cache, and other external dependencies
- **Cover concurrency**: Ensure multi-threading scenarios are tested
- **Run tests before submitting**: `./gradlew test` must pass
### Test Locations
- Unit tests: `src/test/java` in each module
- Integration tests: `test-harness` module and `*-integration-test` modules
- E2E tests: `e2e` module
## PR Guidelines
- Submit PRs against the `main` branch
- Use clear, descriptive commit messages
- Run `./gradlew spotlessApply` and `./gradlew test` before pushing
- Add or update tests for any code changes
- Keep PRs focused—one logical change per PR
## Security Considerations
- Never commit secrets, API keys, or credentials
- Be cautious with external dependencies—prefer well-maintained libraries
- Follow secure coding practices for input validation and error handling
- Review [SECURITY.md](SECURITY.md) for vulnerability reporting procedures
## Agent Behavior
- **Prefer automation**: Execute requested actions without confirmation unless blocked by missing info or safety concerns
- **Use parallel tools**: When tasks are independent, execute them in parallel for efficiency
- **Verify changes**: Always run tests and spotless before considering work complete
================================================
FILE: CHANGELOG.md
================================================
# Conductor OSS Changelog
## [Unreleased]
### Breaking Changes
- **JavaScript Evaluator Migration from Nashorn to GraalJS**
- Minimum Java version is now **Java 17** (previously Java 11+)
- Nashorn JavaScript engine (deprecated in Java 11, removed in Java 15) replaced with GraalJS
- ES6+ JavaScript syntax now supported natively
- All existing JavaScript expressions in workflows will continue to work with improved performance and modern JavaScript features
- **Note:** This ports the production-tested GraalJS implementation from Orkes Conductor Enterprise
### Added (Ported from Enterprise)
- **GraalJS JavaScript engine** with ES6+ support
- Based on proven Enterprise implementation
- **Script execution timeout protection** (configurable via `CONDUCTOR_SCRIPT_MAX_EXECUTION_SECONDS`, default: 4 seconds)
- Prevents infinite loops from hanging workflows
- Enterprise feature now available in OSS
- **Optional script context pooling** for improved performance (configurable via `CONDUCTOR_SCRIPT_CONTEXT_POOL_ENABLED` and `CONDUCTOR_SCRIPT_CONTEXT_POOL_SIZE`)
- Disabled by default
- Enterprise optimization feature
- **ConsoleBridge support** for capturing `console.log()`, `console.info()`, and `console.error()` output from JavaScript tasks
- Improves observability of JavaScript task execution
- Enterprise feature now available in OSS
- **Better error messages** with line number information for JavaScript evaluation failures
- Enhanced debugging capabilities from Enterprise
- **Deep copy protection** to prevent PolyglotMap issues in workflow task data
- Enterprise stability improvement
### Fixed
- JavaScript evaluation now works on Java 17, 21, and future LTS versions
- Improved security with sandboxed JavaScript execution
- Deep copy protection to prevent PolyglotMap issues in workflow task data
### Configuration
New environment variables for JavaScript evaluation (all optional):
- `CONDUCTOR_SCRIPT_MAX_EXECUTION_SECONDS` - Maximum script execution time (default: 4)
- `CONDUCTOR_SCRIPT_CONTEXT_POOL_SIZE` - Context pool size when enabled (default: 10)
- `CONDUCTOR_SCRIPT_CONTEXT_POOL_ENABLED` - Enable context pooling (default: false)
### Migration Notes
- Update your deployment environment to **Java 17 or higher**
- No changes required to existing workflows - all JavaScript expressions remain compatible
- Modern JavaScript features (const, let, arrow functions, template literals, etc.) are now available
- `CONDUCTOR_NASHORN_ES6_ENABLED` environment variable is no longer needed (ES6+ supported by default)
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Code of Conduct
Hello valued community members! 👋
Our Conductor community has grown tremendously, and as part of ensuring a harmonious experience for everyone,
we've outlined some guidelines that we'd love for all members to uphold.
Our community thrives when everyone engages with kindness, respect, and a collaborative spirit. Here's what we hope to see:
### 1. Maintain a Positive Tone.
Every interaction is an opportunity to lift someone up. Let's ensure our words and actions reflect optimism and encouragement.
### 2. Be Respectful to the Community
Every member here comes with a unique background and perspective. Please honor those differences by being courteous, considerate, and open-minded.
Remember, mutual respect is the foundation of a thriving community. Be careful in the words that you choose.
We are a community of professionals, and we conduct ourselves professionally.
Be kind to others. Do not insult or put down other participants. Harassment and other exclusionary behaviors aren't acceptable.
This includes, but is not limited to:
* Violent threats or language directed against another person Discriminatory jokes and language
* Posting sexualized language or imagery
* Posting (or threatening to post) other people's personally identifying information (“doxing”)
* Personal insults, especially those using racist or sexist terms
* Unwelcome sexual attention
* Advocating for, or encouraging, any of the above behavior
* Repeated harassment of others. In general, if someone asks you to stop, then stop
### 3. Preserve Our Community's Unity
We understand that as we grow, there might be differing opinions and interests.
However, we kindly request not to create splinter groups or fork out the community.
Let's work through our differences and continue building this space together.
### 4. Focus on Constructive Discussions
We all have moments of frustration, but let's express ourselves in ways that are constructive.
Avoid comments that could come off as sarcastic, condescending, or disdainful.
Remember, it's always possible to give feedback or express disagreement without belittling others.
We are here to learn from each other and make Conductor the best platform out there.
A big part of that are the exchanges of ideas and approaches that are grounded in data and sound reasoning.
We kindly request that you adhere to that pattern and be thoughtful and responsible in your discussions.
This also means that you are required to have discussions focused on the community and not on promotion of any services, products or goods.
### 5. When we disagree, try to understand why.
Disagreements, both social and technical, happen all the time and this community is no exception.
It is important that we resolve disagreements and differing views constructively.
Remember that we’re all different. The strength of this community comes from its varied community of people from a wide range of backgrounds.
Different people have different perspectives on issues. Being unable to understand why someone holds a viewpoint doesn’t mean that they’re wrong.
Don’t forget that it is human to err and blaming each other doesn’t get us anywhere.
Instead, focus on helping to resolve issues and learning from mistakes.
Our community's strength lies in our collective spirit.
By following these guidelines, we ensure that our community remains an inspiring, respectful, and welcoming place for everyone.
If you have any concerns or suggestions or if you need to report on any behavior that violates this Code of Conduct, please feel free to reach out to the admins - community@orkes.io.
Let's continue to support and uplift each other!
### Enforcement
We have a variety of ways of enforcing the code of conduct, including, but not limited to
* Asking you nicely to knock it off
* Asking you less nicely
* Temporary or permanent suspension of the account
* Removal of privileges and/or adding restrictions to the account
* Removal of content
* Banning from the community
Thank you,
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing
Thanks for your interest in Conductor!
This guide helps to find the most efficient way to contribute, ask questions, and report issues.
Code of conduct
-----
Please review our [Code of Conduct](CODE_OF_CONDUCT.md)
I have a question!
-----
We have a dedicated [Slack](https://orkes-conductor.slack.com/join/shared_invite/zt-2vdbx239s-Eacdyqya9giNLHfrCavfaA#/shared-invite/email) channel for asking "how to" questions and to discuss ideas. The channel is a great place to start if you're considering creating a feature request or work on a Pull Request.
*Please do not create issues to ask questions.*
I want to contribute!
------
We welcome Pull Requests and already have many outstanding community contributions!
Creating and reviewing Pull Requests takes time, so this section helps you to set up a smooth Pull Request experience.
The stable branch is [main](https://github.com/conductor-oss/conductor/tree/main).
Please create pull requests for your contributions against [main](https://github.com/conductor-oss/conductor/tree/main) only.
It's a great idea to discuss the new feature you're considering in the [Slack channel](https://orkes-conductor.slack.com/join/shared_invite/zt-2vdbx239s-Eacdyqya9giNLHfrCavfaA#/shared-invite/email) before writing any code. There are often different ways you can implement a feature. Getting some discussion about different options helps shape the best solution. When starting directly with a Pull Request, there is the risk of having to make considerable changes. Sometimes that is the best approach, though! Showing an idea with code can be very helpful; be aware that it might be throw-away work. Some of our best Pull Requests came out of multiple competing implementations, which helped shape it to perfection.
Also, consider that not every feature is a good fit for Conductor. A few things to consider are:
* Is it increasing complexity for the user, or might it be confusing?
* Does it, in any way, break backward compatibility (this is seldom acceptable)
* Does it require new dependencies (this is rarely acceptable for core modules)
* Should the feature be opt-in or enabled by default. For integration with a new Queuing recipe or persistence module, a separate module which can be optionally enabled is the right choice.
* Should the feature be implemented in the main Conductor repository, or would it be better to set up a separate repository? Especially for integration with other systems, a separate repository is often the right choice because the life-cycle of it will be different.
* Is it part of the Conductor project roadmap?
Of course, for more minor bug fixes and improvements, the process can be more light-weight.
We'll try to be responsive to Pull Requests. Do keep in mind that because of the inherently distributed nature of open source projects, responses to a PR might take some time because of time zones, weekends, and other things we may be working on.
I want to report an issue
-----
If you found a bug, please create an issue at https://github.com/conductor-oss/conductor/issues/new. Include clear instructions on how to reproduce the issue, or even better, include a test case on a branch. Make sure to come up with a descriptive title for the issue because this helps while organizing issues.
I have a great idea for a new feature
----
Many features in Conductor have come from ideas from the community. If you think something is missing or certain use cases could be supported better, let us know!
You can do so by starting a discussion in the [Slack channel](https://orkes-conductor.slack.com/join/shared_invite/zt-2vdbx239s-Eacdyqya9giNLHfrCavfaA#/shared-invite/email). Provide as much relevant context to why and when the feature would be helpful. Providing context is especially important for "Support XYZ" issues since we might not be familiar with what "XYZ" is and why it's useful. If you have an idea of how to implement the feature, include that as well.
Once we have decided on a direction, it's time to summarize the idea by creating a new issue.
## Code Style
We use [spotless](https://github.com/diffplug/spotless) to enforce consistent code style for the project, so make sure to run `gradlew spotlessApply` to fix any violations after code changes.
## License
All files are released with the [Apache 2.0 license](LICENSE).
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright {yyyy} Orkes, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: OPENSEARCH_TESTING_PLAN.md
================================================
# OpenSearch Persistence Modules Testing Plan
## Overview
This document provides a comprehensive testing plan for the new OpenSearch version-specific modules (`os-persistence-v2` and `os-persistence-v3`) introduced in PR #736.
**Branch:** `pr-736` (678-opensearch-version-modules-v2-v3)
**Epic:** #678 - Phase 2
## Current Status
✅ **Modules Created:**
- `os-persistence-v2` - OpenSearch 2.x support (opensearch-java:2.18.0)
- `os-persistence-v3` - OpenSearch 3.x support (opensearch-java:3.0.0)
- `os-persistence` - Migration stub (throws helpful error)
✅ **Configuration:**
- Both modules use shared `conductor.opensearch.*` namespace
- Activation via `conductor.indexing.type` property
⚠️ **Issue Identified:**
- Current `docker/server/config/config-redis-os.properties` uses OLD config style:
- `conductor.indexing.type=opensearch` (triggers deprecation stub)
- Needs update to `opensearch2` or `opensearch3`
## Prerequisites
### Java Environment
```bash
# This project requires Java 21 for compilation (per PR notes)
java -version # Should show Java 21+
```
### Docker & Docker Compose
```bash
docker --version
docker-compose --version
```
## Testing Strategy
We'll test three scenarios:
1. **OpenSearch 2.x with os-persistence-v2** (production-ready)
2. **OpenSearch 3.x with os-persistence-v3** (upgraded client)
3. **Legacy config detection** (deprecation stub)
---
## Test 1: OpenSearch 2.x (os-persistence-v2)
### Step 1: Update Configuration File
Create/update config file for OpenSearch 2.x:
**File:** `docker/server/config/config-redis-os2.properties`
```properties
# Database persistence type
conductor.db.type=redis_standalone
conductor.queue.type=redis_standalone
conductor.redis.hosts=rs:6379:us-east-1c
conductor.redis-lock.serverAddress=redis://rs:6379
conductor.redis.taskDefCacheRefreshInterval=1
conductor.redis.workflowNamespacePrefix=conductor
conductor.redis.queueNamespacePrefix=conductor_queues
conductor.workflow-execution-lock.type=redis
conductor.app.workflowExecutionLockEnabled=true
conductor.app.lockTimeToTry=500
conductor.app.systemTaskWorkerThreadCount=20
conductor.app.systemTaskMaxPollCount=20
# NEW: OpenSearch 2.x configuration
conductor.indexing.enabled=true
conductor.indexing.type=opensearch2
# Shared OpenSearch namespace (from PR #675)
conductor.opensearch.url=http://os:9200
conductor.opensearch.indexPrefix=conductor
conductor.opensearch.indexReplicasCount=0
conductor.opensearch.clusterHealthColor=green
# Metrics (optional)
conductor.metrics-prometheus.enabled=true
management.endpoints.web.exposure.include=health,prometheus
management.health.redis.enabled=true
# Load sample workflow
loadSample=true
```
### Step 2: Create Docker Compose for OS 2.x
**File:** `docker/docker-compose-redis-os2.yaml`
```yaml
version: '2.3'
services:
conductor-server:
environment:
- CONFIG_PROP=config-redis-os2.properties
- JAVA_OPTS=-Dpolyglot.engine.WarnInterpreterOnly=false
image: conductor:server
container_name: conductor-server-os2
build:
context: ../
dockerfile: docker/server/Dockerfile
args:
YARN_OPTS: ${YARN_OPTS}
INDEXING_BACKEND: opensearch
networks:
- internal
ports:
- 8080:8080
- 8127:5000
healthcheck:
test: ["CMD", "curl","-I" ,"-XGET", "http://localhost:8080/health"]
interval: 60s
timeout: 30s
retries: 12
links:
- conductor-opensearch:os
- conductor-redis:rs
depends_on:
conductor-opensearch:
condition: service_healthy
conductor-redis:
condition: service_healthy
logging:
driver: "json-file"
options:
max-size: "1k"
max-file: "3"
conductor-redis:
image: redis:6.2.3-alpine
volumes:
- ../server/config/redis.conf:/usr/local/etc/redis/redis.conf
networks:
- internal
ports:
- 6379:6379
healthcheck:
test: [ "CMD", "redis-cli","ping" ]
conductor-opensearch:
image: opensearchproject/opensearch:2.18.0
container_name: opensearch-2
environment:
- plugins.security.disabled=true
- cluster.name=opensearch-cluster
- node.name=conductor-opensearch
- discovery.seed_hosts=conductor-opensearch
- cluster.initial_cluster_manager_nodes=conductor-opensearch
- OPENSEARCH_INITIAL_ADMIN_PASSWORD=P4zzW)rd>>123_
volumes:
- osdata2-conductor:/usr/share/opensearch/data
networks:
- internal
ports:
- 9201:9200
healthcheck:
test: curl http://localhost:9200/_cluster/health -o /dev/null
interval: 5s
timeout: 5s
retries: 12
logging:
driver: "json-file"
options:
max-size: "1k"
max-file: "3"
volumes:
osdata2-conductor:
driver: local
networks:
internal:
```
### Step 3: Build & Run
```bash
cd docker
# Build the server image with OpenSearch support
docker-compose -f docker-compose-redis-os2.yaml build
# Start services
docker-compose -f docker-compose-redis-os2.yaml up
# Watch logs
docker-compose -f docker-compose-redis-os2.yaml logs -f conductor-server
```
### Step 4: Verify OpenSearch 2.x Module Activation
Check server logs for confirmation that `os-persistence-v2` module loaded:
```bash
# Look for Spring Boot conditionals activation
docker-compose -f docker-compose-redis-os2.yaml logs conductor-server | grep -i "opensearch"
docker-compose -f docker-compose-redis-os2.yaml logs conductor-server | grep -i "os2"
```
Expected log indicators:
- No deprecation warnings
- Index creation logs showing OpenSearch connection
- No class conflicts
### Step 5: Test Workflows
```bash
# Access Conductor UI
open http://localhost:8127
# Access API
curl http://localhost:8080/api/metadata/workflow
# Run sample workflow (loaded via loadSample=true)
# Check that workflow execution creates indices in OpenSearch
```
### Step 6: Verify OpenSearch Indices
```bash
# Check indices created
curl http://localhost:9201/_cat/indices?v
# Should see conductor_* indices
# Expected: conductor_workflow, conductor_task, etc.
```
---
## Test 2: OpenSearch 3.x (os-persistence-v3)
### Step 1: Update Configuration File
Create config file for OpenSearch 3.x:
**File:** `docker/server/config/config-redis-os3.properties`
```properties
# Database persistence type
conductor.db.type=redis_standalone
conductor.queue.type=redis_standalone
conductor.redis.hosts=rs:6379:us-east-1c
conductor.redis-lock.serverAddress=redis://rs:6379
conductor.redis.taskDefCacheRefreshInterval=1
conductor.redis.workflowNamespacePrefix=conductor
conductor.redis.queueNamespacePrefix=conductor_queues
conductor.workflow-execution-lock.type=redis
conductor.app.workflowExecutionLockEnabled=true
conductor.app.lockTimeToTry=500
conductor.app.systemTaskWorkerThreadCount=20
conductor.app.systemTaskMaxPollCount=20
# NEW: OpenSearch 3.x configuration
conductor.indexing.enabled=true
conductor.indexing.type=opensearch3
# Shared OpenSearch namespace (from PR #675)
conductor.opensearch.url=http://os:9200
conductor.opensearch.indexPrefix=conductor
conductor.opensearch.indexReplicasCount=0
conductor.opensearch.clusterHealthColor=green
# Metrics (optional)
conductor.metrics-prometheus.enabled=true
management.endpoints.web.exposure.include=health,prometheus
management.health.redis.enabled=true
# Load sample workflow
loadSample=true
```
### Step 2: Create Docker Compose for OS 3.x
**File:** `docker/docker-compose-redis-os3.yaml`
```yaml
version: '2.3'
services:
conductor-server:
environment:
- CONFIG_PROP=config-redis-os3.properties
- JAVA_OPTS=-Dpolyglot.engine.WarnInterpreterOnly=false
image: conductor:server
container_name: conductor-server-os3
build:
context: ../
dockerfile: docker/server/Dockerfile
args:
YARN_OPTS: ${YARN_OPTS}
INDEXING_BACKEND: opensearch
networks:
- internal
ports:
- 8081:8080
- 8128:5000
healthcheck:
test: ["CMD", "curl","-I" ,"-XGET", "http://localhost:8080/health"]
interval: 60s
timeout: 30s
retries: 12
links:
- conductor-opensearch:os
- conductor-redis:rs
depends_on:
conductor-opensearch:
condition: service_healthy
conductor-redis:
condition: service_healthy
logging:
driver: "json-file"
options:
max-size: "1k"
max-file: "3"
conductor-redis:
image: redis:6.2.3-alpine
volumes:
- ../server/config/redis.conf:/usr/local/etc/redis/redis.conf
networks:
- internal
ports:
- 6380:6379
healthcheck:
test: [ "CMD", "redis-cli","ping" ]
conductor-opensearch:
image: opensearchproject/opensearch:3.0.0
container_name: opensearch-3
environment:
- plugins.security.disabled=true
- cluster.name=opensearch-cluster
- node.name=conductor-opensearch
- discovery.seed_hosts=conductor-opensearch
- cluster.initial_cluster_manager_nodes=conductor-opensearch
- OPENSEARCH_INITIAL_ADMIN_PASSWORD=P4zzW)rd>>123_
volumes:
- osdata3-conductor:/usr/share/opensearch/data
networks:
- internal
ports:
- 9202:9200
healthcheck:
test: curl http://localhost:9200/_cluster/health -o /dev/null
interval: 5s
timeout: 5s
retries: 12
logging:
driver: "json-file"
options:
max-size: "1k"
max-file: "3"
volumes:
osdata3-conductor:
driver: local
networks:
internal:
```
**Note:** Different ports to avoid conflicts if running both tests:
- Server: 8081 (instead of 8080)
- UI: 8128 (instead of 8127)
- Redis: 6380 (instead of 6379)
- OpenSearch: 9202 (instead of 9201)
### Step 3: Build & Run
```bash
cd docker
# Clean up previous test if needed
docker-compose -f docker-compose-redis-os2.yaml down -v
# Build for OS 3.x
docker-compose -f docker-compose-redis-os3.yaml build
# Start services
docker-compose -f docker-compose-redis-os3.yaml up
# Watch logs
docker-compose -f docker-compose-redis-os3.yaml logs -f conductor-server
```
### Step 4: Verify OpenSearch 3.x Module Activation
Check server logs for `os-persistence-v3` activation:
```bash
docker-compose -f docker-compose-redis-os3.yaml logs conductor-server | grep -i "opensearch"
docker-compose -f docker-compose-redis-os3.yaml logs conductor-server | grep -i "os3"
```
**Important:** Watch for breaking changes in opensearch-java 3.x:
- SearchAfter type changes
- DanglingIndex field type changes
- Statistics field types
- Task info/state unification
### Step 5: Test Workflows
```bash
# Access Conductor UI
open http://localhost:8128
# Access API
curl http://localhost:8081/api/metadata/workflow
# Test workflow execution
```
### Step 6: Verify OpenSearch 3.x Indices
```bash
# Check indices
curl http://localhost:9202/_cat/indices?v
# Verify OpenSearch 3.x API compatibility
curl http://localhost:9202/
```
---
## Test 3: Legacy Configuration Detection
This test verifies that the migration stub correctly detects old configuration and provides helpful guidance.
### Step 1: Use Existing Config
Keep the existing `config-redis-os.properties` unchanged:
```properties
conductor.indexing.type=opensearch # OLD style - triggers stub
```
### Step 2: Run with Legacy Config
```bash
cd docker
docker-compose -f docker-compose-redis-os.yaml up
```
### Step 3: Verify Deprecation Error
Expected behavior:
- Server should start but log a clear deprecation error
- Error message should guide users to use `opensearch2` or `opensearch3`
- No actual indexing should occur (stub prevents activation)
```bash
# Check logs for deprecation message
docker-compose -f docker-compose-redis-os.yaml logs conductor-server | grep -i "deprecat"
docker-compose -f docker-compose-redis-os.yaml logs conductor-server | grep -i "opensearch"
```
Expected error message format:
```
OpenSearch persistence is deprecated with conductor.indexing.type=opensearch.
Please use conductor.indexing.type=opensearch2 or opensearch3 instead.
See: https://github.com/conductor-oss/conductor/issues/678
```
---
## Test 4: Classpath Isolation (Critical!)
This test verifies that shading prevents conflicts when both modules are present.
### Verification Steps
```bash
# 1. Ensure both modules are in the build
./gradlew :conductor-server:dependencies | grep -E "os-persistence-(v2|v3)"
# 2. Check that shaded packages are relocated
# Extract v2 jar
cd os-persistence-v2/build/libs
jar -tf conductor-os-persistence-v2.jar | grep "opensearch"
# Should show: com/netflix/conductor/os2/shaded/opensearch/client/*
# Extract v3 jar
cd ../../os-persistence-v3/build/libs
jar -tf conductor-os-persistence-v3.jar | grep "opensearch"
# Should show: com/netflix/conductor/os3/shaded/opensearch/client/*
# 3. Verify no unshaded opensearch classes leak
cd ../../../server/build/libs
jar -tf conductor-server-*.jar | grep "org/opensearch/client" | grep -v "shaded"
# Should return EMPTY (no unshaded packages)
```
### Expected Results
✅ Both modules present in server classpath
✅ Packages relocated to separate namespaces
✅ No duplicate class errors at runtime
✅ Only configured module activates
---
## Comprehensive Test Checklist
### Pre-Flight
- [ ] Java 21+ installed
- [ ] Docker & Docker Compose working
- [ ] On `pr-736` branch
- [ ] Build successful: `./gradlew build`
### OpenSearch 2.x Tests
- [ ] Config file created: `config-redis-os2.properties`
- [ ] Docker compose created: `docker-compose-redis-os2.yaml`
- [ ] Build succeeds
- [ ] Services start without errors
- [ ] os-persistence-v2 module activates (check logs)
- [ ] OpenSearch 2.18.0 accessible
- [ ] Indices created successfully
- [ ] Sample workflow executes
- [ ] UI accessible at localhost:8127
- [ ] API returns workflow metadata
- [ ] No class conflict errors
### OpenSearch 3.x Tests
- [ ] Config file created: `config-redis-os3.properties`
- [ ] Docker compose created: `docker-compose-redis-os3.yaml`
- [ ] Build succeeds
- [ ] Services start without errors
- [ ] os-persistence-v3 module activates (check logs)
- [ ] OpenSearch 3.0.0 accessible
- [ ] Indices created successfully
- [ ] Sample workflow executes
- [ ] UI accessible at localhost:8128
- [ ] API returns workflow metadata
- [ ] Breaking changes handled correctly
- [ ] No class conflict errors
### Legacy Config Tests
- [ ] Uses old config: `conductor.indexing.type=opensearch`
- [ ] Deprecation error logged
- [ ] Clear migration guidance provided
- [ ] No actual indexing occurs
- [ ] Server continues to run (doesn't crash)
### Classpath Isolation Tests
- [ ] Both modules in server build
- [ ] Shaded packages properly relocated
- [ ] No unshaded opensearch classes in server jar
- [ ] No duplicate class errors at runtime
- [ ] Correct module activates based on config
### Functional Tests
- [ ] Create workflow via API
- [ ] Execute workflow
- [ ] Query workflow status
- [ ] Search workflows in UI
- [ ] Verify data persisted in OpenSearch
- [ ] Test workflow termination (#615 bug fix)
- [ ] Test workflow archival (#615 bug fix)
---
## Known Issues & Blockers
### From PR Description
1. **Java 21 Required** - Compilation blocked locally without Java 21
2. **opensearch-java 3.x Breaking Changes** - Need to handle in v3 module:
- SearchAfter: String → FieldValue
- DanglingIndex.creationDateMillis: String → long
- Statistics field types: Number → int/Integer
- tasks.Info/State unification
### Related Issues
- #615 - Workflow archival/termination bugs (should test both versions)
- #650 - Blocked upgrade PR (will unblock after this merges)
- #348 - Build spotless issues (may affect this PR)
---
## Success Criteria
Before marking Phase 2 complete:
- [ ] Both modules build successfully
- [ ] Both modules pass all tests
- [ ] Docker compose examples work for v2 and v3
- [ ] Shading prevents classpath conflicts
- [ ] Only configured module activates at runtime
- [ ] Migration stub provides clear guidance
- [ ] No regressions in core functionality
- [ ] Issue #615 bugs fixed (or tracked separately)
---
## Next Steps After Testing
1. **Fix compilation issues** (if Java 21 unavailable locally)
2. **Handle opensearch-java 3.x breaking changes** in v3 module
3. **Add docker-compose files** to PR
4. **Update documentation** with new configuration
5. **Create migration guide** for users
6. **Test on CI** (should have Java 21)
7. **Mark PR ready for review**
8. **Merge** and unblock #650
---
## Quick Start (TL;DR)
```bash
# Prerequisites
java -version # Must be 21+
docker --version
# Get on the right branch
git checkout pr-736
# Test OpenSearch 2.x
cd docker
docker-compose -f docker-compose-redis-os2.yaml build
docker-compose -f docker-compose-redis-os2.yaml up
# In another terminal - verify
curl http://localhost:8080/api/metadata/workflow
curl http://localhost:9201/_cat/indices?v
open http://localhost:8127
# Test OpenSearch 3.x
docker-compose -f docker-compose-redis-os2.yaml down -v
docker-compose -f docker-compose-redis-os3.yaml build
docker-compose -f docker-compose-redis-os3.yaml up
# Verify
curl http://localhost:8081/api/metadata/workflow
curl http://localhost:9202/_cat/indices?v
open http://localhost:8128
```
---
## Troubleshooting
### Issue: Build fails with Java version error
**Solution:** Install Java 21 or use CI
```bash
# Check Java version
java -version
# If using jenv (macOS)
jenv versions
jenv local 21
# Or use JAVA_HOME
export JAVA_HOME=$(/usr/libexec/java_home -v 21)
./gradlew build
```
### Issue: OpenSearch container fails to start
**Solution:** Check Docker resources, increase memory
```bash
# Check logs
docker-compose logs conductor-opensearch
# Common issues:
# - Insufficient memory (need 2GB+)
# - Port conflicts (9201/9202 in use)
# - Volume permission issues
```
### Issue: Server can't connect to OpenSearch
**Solution:** Verify networking
```bash
# Check if OpenSearch is healthy
curl http://localhost:9201/_cluster/health
# Check Docker network
docker network ls
docker network inspect docker_internal
```
### Issue: Wrong module activates
**Solution:** Check configuration
```bash
# Verify config file
cat docker/server/config/config-redis-os2.properties | grep "indexing.type"
# Should be: conductor.indexing.type=opensearch2 (not opensearch!)
# Check server logs for which module loaded
docker-compose logs conductor-server | grep -i "conditional"
```
### Issue: Class conflicts at runtime
**Solution:** Verify shading worked
```bash
# Check shaded JAR contents
jar -tf os-persistence-v2/build/libs/conductor-os-persistence-v2.jar | grep opensearch
# Should see relocated paths like:
# com/netflix/conductor/os2/shaded/opensearch/client/*
```
---
## References
- **Epic:** #678
- **PR:** #736
- **Related PRs:** #675 (merged), #650 (blocked)
- **Related Issues:** #615, #539, #505, #348
- **Conductor Docs:** https://conductor-oss.org/devguide/how-tos/persistence/
- **OpenSearch Docs:** https://opensearch.org/docs/latest/
================================================
FILE: OSSMETADATA
================================================
osslifecycle=active
================================================
FILE: README.md
================================================
<picture>
<!-- Dark mode logo -->
<source srcset="https://github.com/user-attachments/assets/104b3a67-6013-4622-8075-a45da3a9e726" media="(prefers-color-scheme: dark)">
<!-- Light mode logo -->
<img src="https://assets.conductor-oss.org/logo.png" alt="Logo">
</picture>
<h1 align="center" style="border-bottom: none">
Conductor - {agentic, durable, scalable} Workflow Engine
</h1>
[](https://github.com/conductor-oss/conductor/stargazers)
[](https://github.com/conductor-oss/conductor/releases)
[](http://www.apache.org/licenses/LICENSE-2.0)
[](https://join.slack.com/t/orkes-conductor/shared_invite/zt-2vdbx239s-Eacdyqya9giNLHfrCavfaA)
[](https://conductor-oss.org)
Conductor is an open-source, durable workflow engine built at [Netflix](https://netflixtechblog.com/netflix-conductor-a-microservices-orchestrator-2e8d4771bf40) for orchestrating microservices, AI agents, and event-driven workflows at internet scale. Actively maintained by [Orkes](https://orkes.io) and a growing [community](https://join.slack.com/t/orkes-conductor/shared_invite/zt-2vdbx239s-Eacdyqya9giNLHfrCavfaA).
[](https://youtu.be/4azDdDlx27M)
---
# Get Running in 60 Seconds
```shell
npm install -g @conductor-oss/conductor-cli
conductor server start
```
Open [http://localhost:8080](http://localhost:8080) — your server is running with the built-in UI.
**Run your first workflow:**
```shell
# Create a workflow that calls an API and parses the response — no workers needed
curl -s https://raw.githubusercontent.com/conductor-oss/conductor/main/docs/quickstart/workflow.json -o workflow.json
conductor workflow create workflow.json
conductor workflow start -w hello_workflow --sync
```
See the [Quickstart guide](https://conductor-oss.org/quickstart) for the full walkthrough, including writing workers and replaying workflows.
<details>
<summary><strong>Prefer Docker?</strong></summary>
```shell
docker run -p 8080:8080 conductoross/conductor:latest
```
All CLI commands have equivalent cURL/API calls. See the [Quickstart](https://conductor-oss.org/quickstart) for details.
</details>
---
# Conductor Skills for AI Agents
**[Conductor Skills](https://github.com/conductor-oss/conductor-skills)** are pre-built, production-ready workflow packages that give your AI agents superpowers — retrieval, web search, document processing, and more. Install a skill, wire it into your agent, and ship.
```shell
# Install the skills CLI
npm install -g @conductor-oss/conductor-skills
# List available skills
conductor-skills list
# Install a skill
conductor-skills install <skill-name>
```
**[Browse available skills →](https://github.com/conductor-oss/conductor-skills)**
---
# Why Conductor
| | |
|---|---|
| **Durable execution** | Every step is persisted. Survive crashes, restarts, and network failures. At-least-once task delivery with configurable retries, timeouts, and compensation flows. |
| **Deterministic workflows** | JSON definitions separate orchestration from implementation — no side effects, no hidden state. Every run produces the same task graph. Replay any workflow months later. |
| **AI agent orchestration** | 14+ native LLM providers, MCP tool calling, function calling, human-in-the-loop approval, vector databases (Pinecone, pgvector, MongoDB Atlas) for RAG. |
| **Dynamic at runtime** | Dynamic forks, dynamic tasks, and dynamic sub-workflows — all resolved at runtime. LLMs can generate workflow definitions as JSON and Conductor executes them immediately. No compile/deploy cycle. |
| **Full replayability** | Restart from the beginning, rerun from any task, or retry just the failed step — on any workflow, at any time, indefinitely. |
| **Internet scale** | Battle-tested at Netflix, Tesla, LinkedIn, and JP Morgan. Scales horizontally to billions of workflow executions. |
| **Polyglot workers** | Write workers in Java, Python, Go, JavaScript, C#, Ruby, or Rust. Workers poll, execute, and report — run them anywhere. |
| **Self-hosted, no lock-in** | Apache 2.0 licensed. 8+ persistence backends, 6 message brokers. Runs anywhere Docker or a JVM runs. |
---
# SDKs
| Language | Repository | Install |
|----------|------------|---------|
| ☕ Java | [conductor-oss/java-sdk](https://github.com/conductor-oss/java-sdk) | [Maven Central](https://mvnrepository.com/artifact/org.conductoross/conductor-client) |
| 🐍 Python | [conductor-oss/python-sdk](https://github.com/conductor-oss/python-sdk) | `pip install conductor-python` |
| 🟨 JavaScript | [conductor-oss/javascript-sdk](https://github.com/conductor-oss/javascript-sdk) | `npm install @io-orkes/conductor-javascript` |
| 🐹 Go | [conductor-oss/go-sdk](https://github.com/conductor-oss/go-sdk) | `go get github.com/conductor-sdk/conductor-go` |
| 🟣 C# | [conductor-oss/csharp-sdk](https://github.com/conductor-oss/csharp-sdk) | `dotnet add package conductor-csharp` |
| 💎 Ruby | [conductor-oss/ruby-sdk](https://github.com/conductor-oss/ruby-sdk) | `gem install conductor_ruby` |
| 🦀 Rust | [conductor-oss/rust-sdk](https://github.com/conductor-oss/rust-sdk) | *(incubating)* |
---
# Documentation & Community
- **[Documentation](https://conductor-oss.org)** — Architecture, guides, API reference, and cookbook recipes.
- **[Slack](https://join.slack.com/t/orkes-conductor/shared_invite/zt-2vdbx239s-Eacdyqya9giNLHfrCavfaA)** — Community discussions and support.
- **[Community Forum](https://community.orkes.io/)** — Ask questions and share patterns.
---
# Backend Configuration
| Backend | Configuration |
|---------|---------------|
| Redis + ES7 (default) | [config-redis.properties](docker/server/config/config-redis.properties) |
| Redis + ES8 | [config-redis-es8.properties](docker/server/config/config-redis-es8.properties) |
| Redis + OpenSearch | [config-redis-os.properties](docker/server/config/config-redis-os.properties) |
| Postgres | [config-postgres.properties](docker/server/config/config-postgres.properties) |
| Postgres + ES7 | [config-postgres-es7.properties](docker/server/config/config-postgres-es7.properties) |
| MySQL + ES7 | [config-mysql.properties](docker/server/config/config-mysql.properties) |
---
# Build From Source
<details>
<summary><strong>Requirements and instructions</strong></summary>
**Requirements:** Docker Desktop, Java (JDK) 21+, Node 18 (for UI)
```shell
git clone https://github.com/conductor-oss/conductor
cd conductor
./gradlew build
# (optional) Build UI
# ./build_ui.sh
# Start local server
cd server
../gradlew bootRun
```
See the [full build guide](docs/devguide/running/source.md) for details.
</details>
---
# FAQ
<details>
<summary><strong>Is this the same as Netflix Conductor?</strong></summary>
Yes. Conductor OSS is the continuation of the original [Netflix Conductor](https://github.com/Netflix/conductor) repository after Netflix contributed the project to the open-source foundation.
</details>
<details>
<summary><strong>Is this project actively maintained?</strong></summary>
Yes. [Orkes](https://orkes.io) is the primary maintainer and offers an enterprise SaaS platform for Conductor across all major cloud providers.
</details>
<details>
<summary><strong>Can Conductor scale to handle my workload?</strong></summary>
Yes. Built at Netflix, battle-tested at internet scale. Conductor scales horizontally across multiple server instances to handle billions of workflow executions.
</details>
<details>
<summary><strong>Is Orkes Conductor compatible with Conductor OSS?</strong></summary>
100% compatible. Orkes Conductor is built on top of Conductor OSS with full API and workflow compatibility.
</details>
---
# Contributing
We welcome contributions from everyone!
- **Report Issues:** Open an [issue on GitHub](https://github.com/conductor-oss/conductor/issues).
- **Contribute code:** Check out our [Contribution Guide](CONTRIBUTING.md) and [good first issues](https://github.com/conductor-oss/conductor/labels/good%20first%20issue).
- **Improve docs:** Help keep our [documentation](https://github.com/conductor-oss/conductor/tree/main/docs) great.
## Contributors
<a href="https://github.com/conductor-oss/conductor/graphs/contributors">
<img src="https://contrib.rocks/image?repo=conductor-oss/conductor" />
</a>
---
# Roadmap
[See the Conductor OSS Roadmap](ROADMAP.md). Want to participate? [Reach out](https://forms.gle/P2i1xHrxPQLrjzTB7).
# License
Conductor is licensed under the [Apache 2.0 License](LICENSE).
================================================
FILE: RELATED.md
================================================
[Related Projects](docs/resources/related.md)
================================================
FILE: ROADMAP.md
================================================
# Conductor OSS Roadmap
## New Features
### Type safety for workflow inputs and task input/output through JSON Schema
* Allow type safe workflows and workers with support for JSON schema and protobuf
* Enable scaffolding code generation for workers through schema for workers using CLI tool
### New System Tasks
* Database task to work with relational & no-sql databases
* Polling support for HTTP task
* Operators
* * For..Each with parallel and sequential execution
* * Improved While loop
* * Try..Catch for improved error handling at the task level
### LLM Integrations
Conductor is a perfect platform to build your next LLM powered application or incorporating genAI into your applications.
Enable system tasks for LLM integrations that lets you work with various language models for:
1. Text completion
2. Chat completion with memory
3. Embedding generation
### CLI for Conductor
Allow developers to manage their conductor instance via CLI.
* Manage metadata
* Query and manage workflow executions (terminate, pause, resume, retry)
* Start | Stop manage conductor server
### Support Python as a scripting language for INLINE task
Extend usability of Conductor by allowing lightweight python code as INLINE tasks.
### New APIs for workflow state management
* Synchronous execution of workflows
* update workflow variables
* Update tasks synchronously
## SDKs
* Rust
* Kotlin
* C++
* Ruby
* Swift
* Flutter / Dart
* PHP
### Worker metrics on server
Expose an endpoint on the server that can be used by workers to publish worker specific metrics.
This will allow monitoring metrics for all the workers in a distributed system across the entire system.
## Testing
Infrastructure to make workflows easier to test and debug right from the UI and IDE.
### Workflow Debugger
* Ability to debug your workflows during development just like you would do when you write code
* All functionality of a debugger
* Breakpoints add/remove
* Step to next
* Drop to a certain task that was already executed. (going back in time)
* Ability to inspect, modify, add input / output parameters
* Watch Windows to see values of interesting parameters during execution
* Attaching to a certain WF execution
* Remote Task debugging (with SDK Support).. Enable step by step execution in a task worker from the server
## Maintenance
1. Deprecate support for Elasticsearch 6
2. Update support for newer versions of Elasticsearch
2. Improve/Fix JOIN task performance (less about making it performant and more about just fixing the usability) - Done
================================================
FILE: SECURITY.md
================================================
# Security Policy
- [Reporting a vulnerability](#reporting-a-vulnerability)
- [Supported Conductor versions](#supported-versions)
## Reporting a vulnerability
Please report security issues for Conductor using https://github.com/conductor-oss/conductor/security/advisories/new
## Supported Versions
| Version | Supported |
| ------- | ------------------ |
| 3.x.x | :white_check_mark: |
| 2.x.x | :x: |
| 1.x.x | :x: |
================================================
FILE: USERS.md
================================================
## Who uses Conductor?
We would like to keep track of whose using Conductor. Please send a pull request with your company name and Github handle.
* [Netflix](https://www.netflix.com/) [[@aravindanr](https://github.com/aravindanr)]
* [Florida Blue](http://bcbsfl.com/) [[@rickfish](https://github.com/rickfish)]
* [UWM](https://www.uwm.com/) [[@zergrushjoe](https://github.com/ZergRushJoe)]
* [Deutsche Telekom Digital Labs](https://dtdl.in) [[@jas34](https://github.com/jas34)] [[@deoramanas](https://github.com/deoramanas)]
* [VMware](https://www.vmware.com/) [[@taojwmware](https://github.com/taojwmware)] [[@venkag](https://github.com/venkag)]
* [JP Morgan Chase](https://www.chase.com/) [[@maheshyaddanapudi](https://github.com/maheshyaddanapudi)]
* [Orkes](https://orkes.io/) [[@CherishSantoshi](https://github.com/CherishSantoshi)]
* [313X](https://313x.com.br) [[@dalmoveras](https://github.com/dalmoveras)]
* [Supercharge](https://supercharge.io) [[@team-supercharge](https://github.com/team-supercharge)]
* [GE Healthcare](https://www.gehealthcare.com/) [[@flavioschuindt](https://github.com/flavioschuindt)]
* [ReliaQuest](https://www.reliaquest.com/) [[@rq-dbrady](https://github.com/rq-dbrady)] [[@alexmay48](https://github.com/alexmay48)]
* [Clari](https://www.clari.com/) [[@TeamJOF](https://github.com/clari)]
* [Atlassian](https://www.atlassian.com/) [[@LuisLainez](https://github.com/LuisLainez)] [[@aradu](https://github.com/aradu-atlassian)]
================================================
FILE: ai/CONTRIBUTING.md
================================================
# Contributing to Conductor AI Module
Thank you for your interest in contributing to the Conductor AI module! This guide will help you add new LLM providers, vector database integrations, workers, and other enhancements.
## Table of Contents
- [Architecture Overview](#architecture-overview)
- [Adding a New LLM Provider](#adding-a-new-llm-provider)
- [Adding a Vector Database Integration](#adding-a-vector-database-integration)
- [Adding New Workers/Tasks](#adding-new-workerstasks)
- [Adding MCP Tools](#adding-mcp-tools)
- [Testing Guidelines](#testing-guidelines)
- [Code Style and Best Practices](#code-style-and-best-practices)
---
## Architecture Overview
The AI module is organized into several key packages:
```
org.conductoross.conductor.ai/
├── providers/ # LLM provider implementations (OpenAI, Anthropic, etc.)
├── vectordb/ # Vector database integrations (Pinecone, MongoDB, etc.)
├── video/ # Video generation abstractions (VideoModel, AsyncVideoModel, etc.)
├── tasks/ # Worker task definitions
│ ├── mapper/ # Input/output parameter mappers
│ └── worker/ # Worker implementations
├── mcp/ # Model Context Protocol implementation
├── models/ # Request/response models
└── document/ # Document readers and parsers
```
Key interfaces:
- **`AIModel`**: Base interface for LLM providers
- **`VideoModel`**: Functional interface for synchronous video generation (mirrors Spring AI's `ImageModel`)
- **`AsyncVideoModel`**: Extends `VideoModel` with async polling via `checkStatus(String jobId)`
- **`VectorDBProvider`**: Base interface for vector databases
- **`@WorkerTask`**: Annotation for defining worker tasks
---
## Adding a New LLM Provider
### Step 1: Create Provider Package
Create a new package under `providers/`:
```
org.conductoross.conductor.ai.providers.yourprovider/
├── YourProvider.java # Main provider implementation
└── YourProviderConfiguration.java # Spring configuration
```
### Step 2: Implement AIModel Interface
Create your provider class implementing `AIModel`:
```java
package org.conductoross.conductor.ai.providers.yourprovider;
import org.conductoross.conductor.ai.AIModel;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.embedding.EmbeddingModel;
public class YourProvider implements AIModel {
private final ChatModel chatModel;
private final EmbeddingModel embeddingModel;
public YourProvider(ChatModel chatModel, EmbeddingModel embeddingModel) {
this.chatModel = chatModel;
this.embeddingModel = embeddingModel;
}
@Override
public String getModelProvider() {
return "your_provider_name"; // Used in workflow definitions
}
@Override
public ChatModel getChatModel() {
return chatModel;
}
@Override
public EmbeddingModel getEmbeddingModel() {
return embeddingModel;
}
}
```
### Step 3: Create Configuration Class
Use `@ConditionalOnProperty` to ensure the provider only loads when configured:
```java
package org.conductoross.conductor.ai.providers.yourprovider;
import org.conductoross.conductor.ai.ModelConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties(YourProviderProperties.class)
@ConditionalOnProperty(prefix = "conductor.ai.your-provider", name = "api-key")
public class YourProviderConfiguration {
@Bean
public ModelConfiguration<YourProvider> yourProviderConfiguration(
YourProviderProperties properties) {
return () -> {
// Initialize chat and embedding models
ChatModel chatModel = // ... create from properties
EmbeddingModel embeddingModel = // ... create from properties
return new YourProvider(chatModel, embeddingModel);
};
}
}
```
### Step 4: Create Properties Class
```java
package org.conductoross.conductor.ai.providers.yourprovider;
import org.springframework.boot.context.properties.ConfigurationProperties;
import lombok.Data;
@Data
@ConfigurationProperties(prefix = "conductor.ai.your-provider")
public class YourProviderProperties {
private String apiKey;
private String baseUrl = "https://api.yourprovider.com";
private String model = "default-model";
// Add other configuration properties
}
```
### Step 5: Add Tests
Create `YourProviderConfigurationTest.java`:
```java
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class YourProviderConfigurationTest {
@Test
void testProviderLoadsWhenConfigured() {
ApplicationContextRunner contextRunner =
new ApplicationContextRunner()
.withConfiguration(
AutoConfigurations.of(YourProviderConfiguration.class))
.withPropertyValues(
"conductor.ai.your-provider.api-key=test-key");
contextRunner.run(
context -> {
assertThat(context).hasSingleBean(ModelConfiguration.class);
});
}
@Test
void testProviderDoesNotLoadWithoutApiKey() {
ApplicationContextRunner contextRunner =
new ApplicationContextRunner()
.withConfiguration(
AutoConfigurations.of(YourProviderConfiguration.class));
contextRunner.run(
context -> {
assertThat(context).doesNotHaveBean(ModelConfiguration.class);
});
}
}
```
### Step 6: Add Video Generation Support (Optional)
If your provider supports video generation, implement video model support using the `video/` package abstractions. Video generation is async by nature (submit a job, poll for results), so most providers will implement `AsyncVideoModel`.
#### 6a. Create a Video Model Class
```java
package org.conductoross.conductor.ai.providers.yourprovider;
import org.conductoross.conductor.ai.video.*;
public class YourVideoModel implements AsyncVideoModel {
private final String apiKey;
public YourVideoModel(String apiKey) {
this.apiKey = apiKey;
}
@Override
public VideoResponse call(VideoPrompt prompt) {
// Submit video generation job to provider API
// Return a VideoResponse with jobId in metadata
VideoResponseMetadata metadata = new VideoResponseMetadata();
metadata.put("jobId", submittedJobId);
metadata.put("status", "PENDING");
return new VideoResponse(List.of(), metadata);
}
@Override
public VideoResponse checkStatus(String jobId) {
// Poll provider API for job status
// When complete, download video bytes and return Video objects
// Set mimeType on each Video (e.g., "video/mp4", "image/webp" for thumbnails)
Video video = new Video(videoUrl, null, "video/mp4");
VideoGeneration generation = new VideoGeneration(video);
VideoResponseMetadata metadata = new VideoResponseMetadata();
metadata.put("jobId", jobId);
metadata.put("status", "COMPLETED");
return new VideoResponse(List.of(generation), metadata);
}
}
```
#### 6b. Wire Video Model into Your Provider
Override the video-related methods in your `AIModel` implementation:
```java
@Override
public VideoModel getVideoModel() {
if (videoModel == null) {
videoModel = new YourVideoModel(apiKey);
}
return videoModel;
}
@Override
public LLMResponse generateVideo(VideoGenRequest request) {
VideoOptions options = getVideoOptions(request);
VideoPrompt prompt = new VideoPrompt(
List.of(new VideoMessage(request.getPrompt())), options);
VideoResponse response = getVideoModel().call(prompt);
// Convert to LLMResponse with jobId
}
@Override
public LLMResponse checkVideoStatus(VideoGenRequest request) {
AsyncVideoModel asyncModel = (AsyncVideoModel) getVideoModel();
VideoResponse response = asyncModel.checkStatus(request.getJobId());
// Convert to LLMResponse with media list
}
```
The `video/` package mirrors Spring AI's `Image*` abstraction pattern:
- `VideoPrompt` -> `ImagePrompt` (request wrapper)
- `VideoResponse` -> `ImageResponse` (response wrapper)
- `VideoGeneration` -> `ImageGeneration` (individual result)
- `Video` -> `Image` (the actual media, with url, b64Json, and mimeType fields)
- `VideoOptions` -> `ImageOptions` (generation parameters)
### Step 7: Update Documentation
Add your provider to `README.md` under the supported providers section with configuration examples.
---
## Adding a Vector Database Integration
### Step 1: Create Config Class
Create a new configuration class in the database package (e.g., `org.conductoross.conductor.ai.vectordb.yourdb`):
```java
@Data
@NoArgsConstructor
@AllArgsConstructor
public class YourDBConfig implements VectorDBConfig<YourVectorDB> {
private String connectionString;
// other properties
@Override
public YourVectorDB get() {
throw new UnsupportedOperationException("Use get(String name) instead");
}
public YourVectorDB get(String name) {
return new YourVectorDB(name, this);
}
}
```
### Step 2: Implement VectorDB Class
Extend the `VectorDB` abstract class:
```java
public class YourVectorDB extends VectorDB {
public static final String TYPE = "yourdb";
private final YourDBConfig config;
public YourVectorDB(String name, YourDBConfig config) {
super(name, TYPE);
this.config = config;
}
@Override
public int updateEmbeddings(String indexName, String namespace, String doc, String parentDocId, String id, List<Float> embeddings, Map<String, Object> metadata) {
// Implement logic to store embeddings
}
@Override
public List<IndexedDoc> search(String indexName, String namespace, List<Float> embeddings, int maxResults) {
// Implement logic to search embeddings
}
}
```
### Step 3: Register in VectorDBInstanceConfig
Add your database type to the `createVectorDB` method and the `VectorDBInstance` inner class in `org.conductoross.conductor.ai.vectordb.VectorDBInstanceConfig`.
### Step 4: Add Integration Tests
Use Testcontainers for integration testing:
```java
@Testcontainers
class YourVectorDBTest {
@Container
static GenericContainer<?> yourdb =
new GenericContainer<>("yourdb:latest")
.withExposedPorts(1234);
@Test
void testStoreAndSearch() {
// Test vector storage and similarity search
}
}
```
---
## Adding New Workers/Tasks
### Step 1: Create Request Model
```java
package org.conductoross.conductor.ai.models;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class YourTaskRequest extends LLMWorkerInput {
private String parameter1;
private String parameter2;
// Add task-specific parameters
}
```
### Step 2: Create Worker Class
```java
package org.conductoross.conductor.ai.tasks.worker;
import com.netflix.conductor.sdk.workflow.annotations.WorkerTask;
import org.conductoross.conductor.ai.models.YourTaskRequest;
@Component
public class YourWorker {
private final YourService yourService;
public YourWorker(YourService yourService) {
this.yourService = yourService;
}
@WorkerTask("YOUR_TASK_NAME")
public @OutputParam("result") YourTaskResult executeTask(YourTaskRequest request) {
// Implement task logic
return yourService.processRequest(request);
}
}
```
### Step 3: Add Task Tests
```java
class YourWorkerTest {
@Test
void testTaskExecution() {
YourWorker worker = new YourWorker(mockService);
YourTaskRequest request = new YourTaskRequest();
request.setParameter1("test");
YourTaskResult result = worker.executeTask(request);
assertNotNull(result);
// Add assertions
}
}
```
---
## Adding MCP Tools
Model Context Protocol (MCP) allows external tools to be called from workflows.
### Adding MCP Server Support
The `MCPService` already supports:
- HTTP/SSE transports
- stdio (local process) transports
- Direct JSON-RPC fallback
To add a new MCP server:
1. **Deploy your MCP server** (HTTP or local script)
2. **Use existing `CALL_MCP_TOOL` task** in workflows:
```json
{
"name": "call_your_tool",
"taskReferenceName": "your_tool",
"type": "CALL_MCP_TOOL",
"inputParameters": {
"mcpServer": "http://localhost:3000",
"methodName": "your_tool_name",
"param1": "value1",
"param2": "value2"
}
}
```
### Extending MCP Capabilities
To add new MCP-related features, modify:
- `MCPService.java` - Core MCP communication logic
- `MCPWorkers.java` - Worker task definitions
- `models/MCP*.java` - Request/response models
---
## Testing Guidelines
### Unit Tests
- Place in `src/test/java` mirroring the source structure
- Use MockBean for Spring dependencies
- Test individual methods and edge cases
- Aim for 80%+ code coverage
### Integration Tests
- Use `@SpringBootTest` for full context testing
- Use Testcontainers for external dependencies (databases, servers)
- Test real interactions between components
### Test Naming Convention
```java
// Unit test method format
void test<MethodName>_<Scenario>_<ExpectedResult>()
// Examples:
void testGetModel_WithValidProvider_ReturnsModel()
void testGetModel_WithInvalidProvider_ThrowsException()
```
### Running Tests
```bash
# Run all tests
./gradlew :conductor-ai:test
# Run specific test class
./gradlew :conductor-ai:test --tests YourProviderTest
# Run with coverage
./gradlew :conductor-ai:test jacocoTestReport
```
---
## Code Style and Best Practices
### Lombok Usage
Use Lombok annotations consistently:
- `@Data` for simple POJOs
- `@Builder` for complex object construction
- `@Slf4j` for logging
- `@AllArgsConstructor` / `@NoArgsConstructor` for constructors
### Logging
- Use SLF4J via `@Slf4j`
- Log levels:
- `log.debug()` - Detailed diagnostic information
- `log.info()` - Important business events
- `log.warn()` - Recoverable issues
- `log.error()` - Errors requiring attention
### Error Handling
- Throw descriptive exceptions
- Include context in error messages
- Use try-catch for recoverable errors
- Let unchecked exceptions propagate for programming errors
### Configuration Properties
- Use `@ConfigurationProperties` for type-safe configuration
- Provide sensible defaults
- Document all properties in javadoc
- Use `@ConditionalOnProperty` to make features optional
### Spring Beans
- Prefer constructor injection over field injection
- Use `@Component` for auto-detected beans
- Use `@Configuration` for explicit bean definitions
- Apply `@ConditionalOnProperty` for optional features
### Documentation
- Add Javadoc to all public classes and methods
- Include usage examples in class-level Javadoc
- Update `README.md` with new features
- Provide workflow examples for new tasks
---
## Development Workflow
### 1. Create a Feature Branch
```bash
git checkout -b feature/add-your-provider
```
### 2. Implement Your Changes
Follow the patterns above for your contribution type.
### 3. Write Tests
Ensure your code has comprehensive test coverage.
### 4. Run Tests and Checks
```bash
./gradlew :conductor-ai:test
./gradlew :conductor-ai:compileJava
```
### 5. Update Documentation
- Update `README.md` with examples
- Add Javadoc to new classes
- Update this CONTRIBUTING.md if adding new patterns
### 6. Submit Pull Request
- Provide clear description of changes
- Reference any related issues
- Include test results
- Update changelog if applicable
---
## Common Patterns
### Conditional Bean Creation
Always use `@ConditionalOnProperty` for optional integrations:
```java
@ConditionalOnProperty(
prefix = "conductor.ai.your-feature",
name = "enabled",
havingValue = "true"
)
```
### Parameter Mapping
For workers with dynamic parameters, use `@JsonAnySetter`:
```java
@JsonAnySetter
public void setAdditionalProperty(String key, Object value) {
additionalProperties.put(key, value);
}
```
### Resource Cleanup
Implement `DisposableBean` for cleanup:
```java
@Override
public void destroy() throws Exception {
// Clean up resources
}
```
---
## Getting Help
- Check existing implementations in `providers/` for examples
- Review `README.md` for usage patterns
- Look at test files for testing patterns
- Open a GitHub issue for questions
## License
By contributing, you agree that your contributions will be licensed under the Apache License 2.0.
================================================
FILE: ai/JDBC_CONFIGURATION.md
================================================
# JDBC Configuration
This document describes the configuration format for JDBC database connections in Conductor.
## Overview
Conductor supports configuring **multiple named JDBC instances** for use by the `JDBC` worker task. This allows you to:
- Connect to multiple databases (MySQL, PostgreSQL, Oracle, etc.)
- Separate environments (prod, dev, staging)
- Use different connection pool settings per use case (read-heavy vs write-heavy)
## Configuration Format
JDBC instances are configured using a list-based approach under `conductor.jdbc.instances`:
```yaml
conductor:
jdbc:
instances:
- name: "instance-name" # Unique identifier for this instance
connection: # Connection configuration
datasourceURL: "jdbc:..." # JDBC connection URL
jdbcDriver: "..." # JDBC driver class (optional, auto-detected from URL)
user: "..." # Database username
password: "..." # Database password
# ... pool settings
```
## Configuration Examples
### Single MySQL Instance
```yaml
conductor:
jdbc:
instances:
- name: "mysql-prod"
connection:
datasourceURL: "jdbc:mysql://prod-db:3306/myapp"
jdbcDriver: "com.mysql.cj.jdbc.Driver"
user: "conductor"
password: "secret"
maximumPoolSize: 20
minimumIdle: 5
```
### Multiple Instances
```yaml
conductor:
jdbc:
instances:
- name: "mysql-prod"
connection:
datasourceURL: "jdbc:mysql://prod-db:3306/myapp"
jdbcDriver: "com.mysql.cj.jdbc.Driver"
user: "conductor"
password: "prod-secret"
maximumPoolSize: 20
- name: "postgres-analytics"
connection:
datasourceURL: "jdbc:postgresql://analytics-db:5432/warehouse"
user: "analyst"
password: "analytics-secret"
maximumPoolSize: 10
- name: "mysql-staging"
connection:
datasourceURL: "jdbc:mysql://staging-db:3306/myapp"
jdbcDriver: "com.mysql.cj.jdbc.Driver"
user: "conductor"
password: "staging-secret"
maximumPoolSize: 5
minimumIdle: 1
```
## Usage in Workflows
When using the JDBC task in your workflows, reference the instance by its configured name using `connectionId`:
```json
{
"name": "query_users",
"taskReferenceName": "query_users_ref",
"type": "JDBC",
"inputParameters": {
"connectionId": "mysql-prod",
"type": "SELECT",
"statement": "SELECT id, name, email FROM users WHERE status = ?",
"parameters": ["active"]
}
}
```
### SELECT Example
```json
{
"name": "find_orders",
"taskReferenceName": "find_orders_ref",
"type": "JDBC",
"inputParameters": {
"connectionId": "postgres-analytics",
"type": "SELECT",
"statement": "SELECT order_id, total FROM orders WHERE customer_id = ?",
"parameters": ["${workflow.input.customerId}"]
}
}
```
Output:
```json
{
"result": [
{"order_id": 101, "total": 49.99},
{"order_id": 205, "total": 129.50}
]
}
```
### UPDATE Example
```json
{
"name": "update_status",
"taskReferenceName": "update_status_ref",
"type": "JDBC",
"inputParameters": {
"connectionId": "mysql-prod",
"type": "UPDATE",
"statement": "UPDATE orders SET status = ? WHERE order_id = ?",
"parameters": ["shipped", "${workflow.input.orderId}"],
"expectedUpdateCount": 1
}
}
```
Output:
```json
{
"update_count": 1
}
```
If the actual update count does not match `expectedUpdateCount`, the transaction is rolled back and the task fails.
## Connection Configuration Options
| Property | Type | Default | Description |
|----------|------|---------|-------------|
| `datasourceURL` | String | Required | JDBC connection URL |
| `jdbcDriver` | String | Auto-detected | JDBC driver class name |
| `user` | String | Optional | Database username |
| `password` | String | Optional | Database password |
| `maximumPoolSize` | Integer | 32 | Maximum connections in the pool |
| `minimumIdle` | Integer | 2 | Minimum idle connections |
| `idleTimeoutMs` | Long | 30000 | Idle connection timeout (ms) |
| `connectionTimeout` | Long | 30000 | Connection acquisition timeout (ms) |
| `leakDetectionThreshold` | Long | 60000 | Leak detection threshold (ms) |
| `maxLifetime` | Long | 1800000 | Maximum connection lifetime (ms) |
## Migration from Old Configuration
### Old Format
```properties
conductor.worker.jdbc.connectionIds=mysql,postgres
conductor.worker.jdbc.mysql.connectionURL=jdbc:mysql://localhost:3306/db
conductor.worker.jdbc.mysql.driverClassName=com.mysql.cj.jdbc.Driver
conductor.worker.jdbc.mysql.username=root
conductor.worker.jdbc.mysql.password=secret
conductor.worker.jdbc.mysql.maximum-pool-size=10
conductor.worker.jdbc.postgres.connectionURL=jdbc:postgresql://localhost:5432/db
conductor.worker.jdbc.postgres.driverClassName=org.postgresql.Driver
conductor.worker.jdbc.postgres.username=pguser
conductor.worker.jdbc.postgres.password=pgpass
```
### New Format
```yaml
conductor:
jdbc:
instances:
- name: "mysql"
connection:
datasourceURL: "jdbc:mysql://localhost:3306/db"
jdbcDriver: "com.mysql.cj.jdbc.Driver"
user: "root"
password: "secret"
maximumPoolSize: 10
- name: "postgres"
connection:
datasourceURL: "jdbc:postgresql://localhost:5432/db"
jdbcDriver: "org.postgresql.Driver"
user: "pguser"
password: "pgpass"
```
**Note:** The old `conductor.worker.jdbc.*` format is still supported for backwards compatibility. If no `conductor.jdbc.instances` are configured, the system automatically falls back to reading the legacy format. The old and new formats are mutually exclusive -- if new-format instances are found, the legacy format is ignored.
### Property Name Mapping
| Old Property | New Property |
|---|---|
| `connectionURL` | `datasourceURL` |
| `driverClassName` | `jdbcDriver` |
| `username` | `user` |
| `password` | `password` |
| `maximum-pool-size` | `maximumPoolSize` |
| `idle-timeout-ms` | `idleTimeoutMs` |
| `minimum-idle` | `minimumIdle` |
## Best Practices
1. **Use descriptive names**: Choose instance names that clearly indicate their purpose (e.g., `mysql-prod`, `postgres-analytics`, `oracle-reporting`)
2. **Separate read/write pools**: For high-throughput systems, configure separate instances for read and write operations with appropriate pool sizes
3. **Right-size connection pools**: Set `maximumPoolSize` based on your database capacity and workload. A common formula is `connections = (core_count * 2) + effective_spindle_count`
4. **Enable leak detection**: The default `leakDetectionThreshold` of 60 seconds logs warnings for connections held longer than expected
5. **Use parameterized queries**: Always use `?` placeholders with the `parameters` list instead of string concatenation to prevent SQL injection
6. **Set expectedUpdateCount**: For critical UPDATE/INSERT/DELETE operations, set `expectedUpdateCount` to automatically rollback if the affected row count doesn't match
## Troubleshooting
### Instance Not Found
If you see "JDBC instance not found: xyz", check:
1. The `connectionId` in your workflow matches the configured `name` exactly
2. The instance is properly configured in your application.yml/properties
3. The application has been restarted after configuration changes
### Connection Timeout
If connections are timing out:
1. Verify network connectivity to the database
2. Check `connectionTimeout` value (default 30 seconds)
3. Ensure the connection pool is not exhausted (increase `maximumPoolSize` if needed)
4. Check database max connections limit
### Connection Leaks
If you see leak detection warnings:
1. Ensure all connections are properly closed (the JDBC worker handles this automatically)
2. If using custom integrations, wrap connection usage in try-with-resources
3. Review `leakDetectionThreshold` setting
================================================
FILE: ai/README.md
================================================
# Conductor AI Module
The Conductor AI module provides built-in integration with 12 popular LLM providers and vector databases, enabling AI-powered workflows through simple task definitions -- including chat, embeddings, image generation, audio synthesis, video generation, document generation, and tool calling.
## Table of Contents
- [Supported Providers](#supported-providers)
- [AI Task Types](#ai-task-types)
- [Configuration](#configuration)
- [Environment Variables](#environment-variables)
- [Docker](#docker)
- [Sample Workflows](#sample-workflows)
- [Enable/Disable AI Workers](#enabledisable-ai-workers)
- [Testing](#testing)
## Supported Providers
### LLM Providers
| Provider | Chat | Embeddings | Image Gen | Audio Gen | Video Gen | Models |
|----------|:----:|:----------:|:---------:|:---------:|:---------:|--------|
| **OpenAI** | ✅ | ✅ | ✅ | ✅ | ✅ | GPT-4o, GPT-4o-mini, DALL-E-3, Sora-2, text-embedding-3-small/large |
| **Anthropic** | ✅ | ❌ | ❌ | ❌ | ❌ | Claude 3.5 Sonnet, Claude 3 Opus/Sonnet/Haiku, Claude 4 Sonnet |
| **Google Gemini** | ✅ | ✅ | ✅ | ❌ | ✅ | Gemini 1.5/2.0, Veo 2/3, Imagen, text-embedding-004 |
| **Azure OpenAI** | ✅ | ✅ | ✅ | ❌ | ❌ | GPT-4o, GPT-4, GPT-3.5-turbo, text-embedding-ada-002, DALL-E-3 |
| **AWS Bedrock** | ✅ | ✅ | ❌ | ❌ | ❌ | Claude 3.x, Titan, Llama 3.x, amazon.titan-embed-text-v2:0 |
| **Mistral AI** | ✅ | ✅ | ❌ | ❌ | ❌ | Mistral Small/Medium/Large, Mixtral 8x7B, mistral-embed |
| **Cohere** | ✅ | ✅ | ❌ | ❌ | ❌ | Command, Command-R, Command-R+, embed-english-v3.0 |
| **Grok** | ✅ | ❌ | ❌ | ❌ | ❌ | Grok-3, Grok-3-mini |
| **Perplexity AI** | ✅ | ❌ | ❌ | ❌ | ❌ | Sonar, Sonar Pro |
| **HuggingFace** | ✅ | ❌ | ❌ | ❌ | ❌ | Llama 3.x, Mistral 7B, Zephyr |
| **Ollama** | ✅ | ✅ | ❌ | ❌ | ❌ | Llama 3.x, Mistral, Phi, nomic-embed-text (local deployment) |
| **Stability AI** | ❌ | ❌ | ✅ | ❌ | ❌ | SD3.5 Large/Medium, Stable Image Core, Stable Image Ultra |
### Vector Database Providers
| Provider | Storage | Search | Description |
|----------|:-------:|:------:|-------------|
| **PostgreSQL (pgvector)** | ✅ | ✅ | Postgres with vector extension |
| **Pinecone** | ✅ | ✅ | Managed vector database |
| **MongoDB Atlas** | ✅ | ✅ | MongoDB vector search |
> **Note**: Multiple named instances of these providers can be configured. See [Vector Database Configuration](VECTORDB_CONFIGURATION.md) for details.
## AI Task Types
### Overview
| Task Type | Task Name | Description |
|-----------|-----------|-------------|
| **Chat Complete** | `LLM_CHAT_COMPLETE` | Multi-turn conversational AI with optional tool calling |
| **Text Complete** | `LLM_TEXT_COMPLETE` | Single prompt completion |
| **Generate Embeddings** | `LLM_GENERATE_EMBEDDINGS` | Convert text to vector embeddings |
| **Image Generation** | `GENERATE_IMAGE` | Generate images from text prompts |
| **Audio Generation** | `GENERATE_AUDIO` | Text-to-speech synthesis |
| **Video Generation** | `GENERATE_VIDEO` | Generate videos from text/image prompts (async) |
| **Index Text** | `LLM_INDEX_TEXT` | Store text with embeddings in vector DB |
| **Store Embeddings** | `LLM_STORE_EMBEDDINGS` | Store pre-computed embeddings |
| **Search Index** | `LLM_SEARCH_INDEX` | Semantic search using text query |
| **Search Embeddings** | `LLM_SEARCH_EMBEDDINGS` | Search using embedding vectors |
| **Get Embeddings** | `LLM_GET_EMBEDDINGS` | Retrieve stored embeddings |
| **List MCP Tools** | `LIST_MCP_TOOLS` | List tools from MCP server |
| **Generate PDF** | `GENERATE_PDF` | Convert markdown to PDF document |
| **Call MCP Tool** | `CALL_MCP_TOOL` | Call a tool on MCP server |
---
### LLM_CHAT_COMPLETE
Multi-turn conversational AI with support for tool calling.
**Inputs:**
| Parameter | Type | Required | Description |
|-----------|------|:--------:|-------------|
| `llmProvider` | String | ✅ | Provider name (e.g., `openai`, `anthropic`, `gemini`) |
| `model` | String | ✅ | Model identifier (e.g., `gpt-4o`, `claude-3-5-sonnet-20241022`) |
| `messages` | Array | ✅ | Conversation messages with `role` and `message` fields |
| `temperature` | Number | ❌ | Sampling temperature (0.0-2.0, default: 1.0) |
| `maxTokens` | Integer | ❌ | Maximum tokens in response |
| `topP` | Number | ❌ | Nucleus sampling parameter |
| `stopSequences` | Array | ❌ | Sequences that stop generation |
| `tools` | Array | ❌ | Tool definitions for function calling |
**Outputs:**
| Field | Type | Description |
|-------|------|-------------|
| `result` | String | Generated response text |
| `finishReason` | String | Why generation stopped (`STOP`, `TOOL_CALLS`, `LENGTH`) |
| `tokenUsed` | Integer | Total tokens used |
| `promptTokens` | Integer | Tokens in the prompt |
| `completionTokens` | Integer | Tokens in the response |
| `toolCalls` | Array | Tool invocations (when `finishReason` is `TOOL_CALLS`) |
---
### LLM_TEXT_COMPLETE
Single prompt text completion.
**Inputs:**
| Parameter | Type | Required | Description |
|-----------|------|:--------:|-------------|
| `llmProvider` | String | ✅ | Provider name |
| `model` | String | ✅ | Model identifier |
| `prompt` | String | ✅ | Text prompt to complete |
| `temperature` | Number | ❌ | Sampling temperature |
| `maxTokens` | Integer | ❌ | Maximum tokens in response |
**Outputs:**
| Field | Type | Description |
|-------|------|-------------|
| `result` | String | Generated completion text |
| `tokenUsed` | Integer | Total tokens used |
---
### LLM_GENERATE_EMBEDDINGS
Convert text to vector embeddings for semantic search.
**Inputs:**
| Parameter | Type | Required | Description |
|-----------|------|:--------:|-------------|
| `llmProvider` | String | ✅ | Provider name |
| `model` | String | ✅ | Embedding model (e.g., `text-embedding-3-small`) |
| `text` | String | ✅ | Text to embed |
**Outputs:**
| Field | Type | Description |
|-------|------|-------------|
| `result` | Array\<Number\> | Vector embedding (e.g., 1536 dimensions for OpenAI) |
---
### GENERATE_IMAGE
Generate images from text prompts.
**Inputs:**
| Parameter | Type | Required | Description |
|-----------|------|:--------:|-------------|
| `llmProvider` | String | ✅ | Provider name (e.g., `openai`) |
| `model` | String | ✅ | Image model (e.g., `dall-e-3`) |
| `prompt` | String | ✅ | Image description |
| `width` | Integer | ❌ | Image width in pixels |
| `height` | Integer | ❌ | Image height in pixels |
| `n` | Integer | ❌ | Number of images to generate |
| `style` | String | ❌ | Style preset (e.g., `vivid`, `natural`) |
**Outputs:**
| Field | Type | Description |
|-------|------|-------------|
| `url` | String | URL to generated image |
| `b64_json` | String | Base64-encoded image data (if requested) |
---
### GENERATE_AUDIO
Text-to-speech synthesis.
**Inputs:**
| Parameter | Type | Required | Description |
|-----------|------|:--------:|-------------|
| `llmProvider` | String | ✅ | Provider name |
| `model` | String | ✅ | TTS model (e.g., `tts-1`, `tts-1-hd`) |
| `text` | String | ✅ | Text to convert to speech |
| `voice` | String | ❌ | Voice selection (e.g., `alloy`, `echo`, `nova`) |
**Outputs:**
| Field | Type | Description |
|-------|------|-------------|
| `media` | Array | Media items with `location` (URL/path) and `mimeType` |
---
### GENERATE_VIDEO
Generate videos from text or image prompts. This is an **async task** -- it submits a generation job and polls for completion automatically.
**Supported Providers:** OpenAI (Sora-2), Google Vertex AI (Veo 2/3)
**Inputs:**
| Parameter | Type | Required | Description |
|-----------|------|:--------:|-------------|
| `llmProvider` | String | Yes | Provider name (`openai`, `vertex_ai`, or `google_gemini`) |
| `model` | String | Yes | Video model (e.g., `sora-2`, `veo-3`) |
| `prompt` | String | Yes | Text description of the video to generate |
| `duration` | Integer | No | Duration in seconds (OpenAI: 4, 8, or 12; default: 5) |
| `size` | String | No | Video dimensions, e.g., `1280x720` (OpenAI) |
| `aspectRatio` | String | No | Aspect ratio, e.g., `16:9`, `9:16` (Gemini) |
| `resolution` | String | No | Resolution preset: `720p`, `1080p` (Gemini) |
| `style` | String | No | Style preset (e.g., `cinematic`) |
| `n` | Integer | No | Number of videos to generate (default: 1) |
| `inputImage` | String | No | URL or base64 image for image-to-video generation |
| `negativePrompt` | String | No | What to exclude from the video (Gemini) |
| `personGeneration` | String | No | Person policy: `dont_allow`, `allow_adult` (Gemini) |
| `generateAudio` | Boolean | No | Generate audio with video (Gemini Veo 3+) |
| `seed` | Integer | No | Seed for reproducibility |
| `maxDurationSeconds` | Integer | No | Hard limit on video duration |
| `maxCostDollars` | Float | No | Estimated cost limit |
**Outputs:**
| Field | Type | Description |
|-------|------|-------------|
| `media` | Array | Generated media items (video MP4 + optional thumbnail) |
| `media[].location` | String | HTTP URL to the stored video or thumbnail file |
| `media[].mimeType` | String | MIME type (`video/mp4` for video, `image/webp` for thumbnail) |
| `jobId` | String | Provider's async job ID |
| `status` | String | Final status (`COMPLETED` or `FAILED`) |
| `pollCount` | Integer | Number of polling iterations |
**Provider-Specific Notes:**
- **OpenAI Sora**: Supports `sora-2` and `sora-2-pro` models. Valid durations are 4, 8, or 12 seconds. Valid sizes: `1280x720`, `720x1280`, `1792x1024`, `1024x1792`. Returns video + webp thumbnail.
- **Google Gemini Veo**: Supports `veo-2.0-generate-001`, `veo-3.0`, `veo-3.1`. Use `llmProvider` as `google_gemini` or `vertex_ai`. When using API key, no GCP credentials needed. Veo 3+ supports audio generation.
---
### LLM_INDEX_TEXT
Store text with auto-generated embeddings in a vector database.
**Inputs:**
| Parameter | Type | Required | Description |
|-----------|------|:--------:|-------------|
| `vectorDB` | String | ✅ | Configured vector database instance name |
| `namespace` | String | ✅ | Namespace for organization |
| `index` | String | ✅ | Index name |
| `embeddingModelProvider` | String | ✅ | Provider for embeddings |
| `embeddingModel` | String | ✅ | Embedding model name |
| `text` | String | ✅ | Text to index |
| `docId` | String | ❌ | Document identifier (auto-generated if not provided) |
| `metadata` | Object | ❌ | Additional metadata to store |
---
### LLM_STORE_EMBEDDINGS
Store pre-computed embeddings in a vector database.
**Inputs:**
| Parameter | Type | Required | Description |
|-----------|------|:--------:|-------------|
| `vectorDB` | String | ✅ | Configured vector database instance name |
| `namespace` | String | ✅ | Namespace for organization |
| `index` | String | ✅ | Index name |
| `embeddings` | Array\<Number\> | ✅ | Pre-computed embedding vector |
| `docId` | String | ❌ | Document identifier |
| `metadata` | Object | ❌ | Additional metadata |
---
### LLM_SEARCH_INDEX
Semantic search using a text query (auto-generates embeddings).
**Inputs:**
| Parameter | Type | Required | Description |
|-----------|------|:--------:|-------------|
| `vectorDB` | String | ✅ | Configured vector database instance name |
| `namespace` | String | ✅ | Namespace to search |
| `index` | String | ✅ | Index name |
| `embeddingModelProvider` | String | ✅ | Provider for query embedding |
| `embeddingModel` | String | ✅ | Embedding model name |
| `query` | String | ✅ | Search query text |
| `llmMaxResults` | Integer | ❌ | Maximum results to return (default: 10) |
---
### LLM_SEARCH_EMBEDDINGS
Search using pre-computed embedding vectors.
**Inputs:**
| Parameter | Type | Required | Description |
|-----------|------|:--------:|-------------|
| `vectorDB` | String | ✅ | Configured vector database instance name |
| `namespace` | String | ✅ | Namespace to search |
| `index` | String | ✅ | Index name |
| `embeddings` | Array\<Number\> | ✅ | Query embedding vector |
| `llmMaxResults` | Integer | ❌ | Maximum results to return |
---
### LLM_GET_EMBEDDINGS
Retrieve stored embeddings by document ID.
**Inputs:**
| Parameter | Type | Required | Description |
|-----------|------|:--------:|-------------|
| `vectorDB` | String | ✅ | Configured vector database instance name |
| `namespace` | String | ✅ | Namespace |
| `index` | String | ✅ | Index name |
| `docId` | String | ✅ | Document identifier |
**Outputs:**
| Field | Type | Description |
|-------|------|-------------|
| `result` | Array\<Number\> | Stored embedding vector |
---
### GENERATE_PDF
Convert markdown text to a PDF document. Supports full GitHub Flavored Markdown including headings, tables, code blocks, lists, task lists, blockquotes, images, links, and inline formatting. No external API keys required -- uses built-in Apache PDFBox rendering.
**Inputs:**
| Parameter | Type | Required | Default | Description |
|-----------|------|:--------:|---------|-------------|
| `markdown` | String | ✅ | - | Markdown text to convert to PDF |
| `pageSize` | String | ❌ | `A4` | Page size: `A4`, `LETTER`, `LEGAL`, `A3`, `A5` |
| `marginTop` | Number | ❌ | `72` | Top margin in points (72pt = 1 inch) |
| `marginRight` | Number | ❌ | `72` | Right margin in points |
| `marginBottom` | Number | ❌ | `72` | Bottom margin in points |
| `marginLeft` | Number | ❌ | `72` | Left margin in points |
| `theme` | String | ❌ | `default` | Style preset: `default` or `compact` |
| `baseFontSize` | Number | ❌ | `11` | Base font size in points |
| `outputLocation` | String | ❌ | auto | Output URI (e.g., `file:///tmp/report.pdf`). Defaults to payload store. |
| `pdfMetadata` | Object | ❌ | - | PDF metadata: `title`, `author`, `subject`, `keywords` |
| `imageBaseUrl` | String | ❌ | - | Base URL for resolving relative image paths |
**Outputs:**
| Field | Type | Description |
|-------|------|-------------|
| `result.location` | String | URI of the generated PDF file |
| `result.sizeBytes` | Integer | Size of the generated PDF in bytes |
| `media` | Array | Media items with `location` and `mimeType` (`application/pdf`) |
| `finishReason` | String | `COMPLETED` on success |
**Supported Markdown Features:**
| Feature | Syntax |
|---------|--------|
| Headings | `# H1` through `###### H6` |
| Bold / Italic | `**bold**`, `*italic*`, `***both***` |
| Tables | GFM pipe tables with header row |
| Code blocks | Fenced (` ``` `) and indented code blocks |
| Bullet lists | `- item` or `* item` (nested supported) |
| Ordered lists | `1. item` (nested supported) |
| Task lists | `- [x] done`, `- [ ] todo` |
| Blockquotes | `> quoted text` |
| Links | `[text](url)` (rendered as clickable PDF links) |
| Images | `` (HTTP/HTTPS, file://, data: URIs, relative paths) |
| Horizontal rules | `---` |
| Strikethrough | `~~strikethrough~~` |
| Inline code | `` `code` `` |
| Footnotes | `[^1]` references |
---
### LIST_MCP_TOOLS
List available tools from an MCP (Model Context Protocol) server.
**Inputs:**
| Parameter | Type | Required | Description |
|-----------|------|:--------:|-------------|
| `mcpServer` | String | ✅ | MCP server URL (e.g., `http://localhost:3000/mcp`) |
| `headers` | Object | ❌ | HTTP headers for authentication |
**Outputs:**
| Field | Type | Description |
|-------|------|-------------|
| `tools` | Array | Tool definitions with `name`, `description`, and `inputSchema` |
---
### CALL_MCP_TOOL
Call a specific tool on an MCP server.
**Inputs:**
| Parameter | Type | Required | Description |
|-----------|------|:--------:|-------------|
| `mcpServer` | String | ✅ | MCP server URL |
| `method` | String | ✅ | Tool name to call |
| `headers` | Object | ❌ | HTTP headers for authentication |
| `*` | Any | ❌ | All other parameters passed as tool arguments |
**Outputs:**
| Field | Type | Description |
|-------|------|-------------|
| `content` | Array | Result content items with `type` and `text` |
| `isError` | Boolean | Whether the call resulted in an error |
## Configuration
### Global Configuration
Add to your `application.properties` or `application.yml`:
```properties
# Enable AI integrations and workers (default: false, must be explicitly enabled)
conductor.integrations.ai.enabled=true
# Payload storage location for large AI inputs/outputs (optional)
conductor.ai.payload-store-location=/tmp/conductor-ai
```
> **Note**: AI workers are disabled by default. You must set `conductor.integrations.ai.enabled=true` to enable them.
### Vector Database Configuration
Vector databases support multiple named instances. For detailed configuration options and examples, see [Vector Database Configuration](VECTORDB_CONFIGURATION.md).
### JDBC Configuration
JDBC connections support multiple named instances for the `JDBC` worker task. For detailed configuration options, migration guide, and examples, see [JDBC Configuration](JDBC_CONFIGURATION.md).
### Provider-Specific Configuration (LLM)
#### OpenAI
```properties
conductor.ai.openai.api-key=${OPENAI_API_KEY}
conductor.ai.openai.base-url=https://api.openai.com/v1
conductor.ai.openai.organization-id=org-xxxxx
```
| Property | Required | Default | Description |
|----------|:--------:|---------|-------------|
| `api-key` | ✅ | - | OpenAI API key |
| `base-url` | ❌ | `https://api.openai.com/v1` | API base URL |
| `organization-id` | ❌ | - | Organization ID |
#### Anthropic
```properties
conductor.ai.anthropic.api-key=${ANTHROPIC_API_KEY}
conductor.ai.anthropic.base-url=https://api.anthropic.com
conductor.ai.anthropic.version=2023-06-01
conductor.ai.anthropic.beta-version=prompt-caching-2024-07-31
```
| Property | Required | Default | Description |
|----------|:--------:|---------|-------------|
| `api-key` | ✅ | - | Anthropic API key |
| `base-url` | ❌ | `https://api.anthropic.com` | API base URL |
| `version` | ❌ | - | API version |
| `beta-version` | ❌ | - | Beta features (e.g., prompt caching) |
| `completions-path` | ❌ | - | Custom completions endpoint path |
#### Google Gemini / Vertex AI
Use `llmProvider` as either `google_gemini` or `vertex_ai` (both resolve to the same provider).
```properties
# Option 1: API key (simplest — works for image/video/audio gen)
conductor.ai.gemini.api-key=${GEMINI_API_KEY}
# Option 2: Vertex AI credentials (required for chat completions and embeddings)
conductor.ai.gemini.project-id=${GOOGLE_CLOUD_PROJECT}
conductor.ai.gemini.location=us-central1
conductor.ai.gemini.publisher=google
```
| Property | Required | Default | Description |
|----------|:--------:|---------|-------------|
| `api-key` | ❌ | - | Gemini API key from [Google AI Studio](https://aistudio.google.com/) |
| `project-id` | ❌ | - | GCP project ID (required for chat/embeddings via Vertex AI) |
| `location` | ❌ | - | GCP region (e.g., us-central1) |
| `base-url` | ❌ | `{location}-aiplatform.googleapis.com:443` | API endpoint |
| `publisher` | ❌ | - | Model publisher |
> **Note**: When `api-key` is set, image/video/audio generation uses the Google AI API directly. Chat completions and embeddings require Vertex AI credentials (`project-id` + Application Default Credentials or service account). Both can be configured simultaneously.
#### Azure OpenAI
```properties
conductor.ai.azureopenai.api-key=${AZURE_OPENAI_API_KEY}
conductor.ai.azureopenai.base-url=${AZURE_OPENAI_ENDPOINT}
conductor.ai.azureopenai.deployment-name=gpt-4o-mini
conductor.ai.azureopenai.user=your-user-id
```
| Property | Required | Default | Description |
|----------|:--------:|---------|-------------|
| `api-key` | ✅ | - | Azure OpenAI API key |
| `base-url` | ✅ | - | Azure resource endpoint |
| `deployment-name` | ✅ | - | Deployment name |
| `user` | ❌ | - | User identifier for tracking |
#### AWS Bedrock
```properties
conductor.ai.bedrock.access-key=${AWS_ACCESS_KEY_ID}
conductor.ai.bedrock.secret-key=${AWS_SECRET_ACCESS_KEY}
conductor.ai.bedrock.region=us-east-1
# OR use bearer token for AWS SSO/temporary credentials
conductor.ai.bedrock.bearer-token=${AWS_SESSION_TOKEN}
```
| Property | Required | Default | Description |
|----------|:--------:|---------|-------------|
| `access-key` | ✅* | - | AWS access key ID |
| `secret-key` | ✅* | - | AWS secret access key |
| `region` | ✅ | `us-east-1` | AWS region |
| `bearer-token` | ❌ | - | AWS session token (for temporary credentials) |
\* Required unless using bearer token or IAM roles
#### Mistral AI
```properties
conductor.ai.mistral.api-key=${MISTRAL_API_KEY}
conductor.ai.mistral.base-url=https://api.mistral.ai
```
| Property | Required | Default | Description |
|----------|:--------:|---------|-------------|
| `api-key` | ✅ | - | Mistral AI API key |
| `base-url` | ❌ | `https://api.mistral.ai` | API base URL |
#### Cohere
```properties
conductor.ai.cohere.api-key=${COHERE_API_KEY}
conductor.ai.cohere.base-url=https://api.cohere.ai
```
| Property | Required | Default | Description |
|----------|:--------:|---------|-------------|
| `api-key` | ✅ | - | Cohere API key |
| `base-url` | ❌ | `https://api.cohere.ai` | API base URL |
#### Grok (xAI)
```properties
conductor.ai.grok.api-key=${GROK_API_KEY}
conductor.ai.grok.base-url=https://api.x.ai/v1
```
| Property | Required | Default | Description |
|----------|:--------:|---------|-------------|
| `api-key` | ✅ | - | Grok API key |
| `base-url` | ❌ | `https://api.x.ai/v1` | API base URL |
#### Perplexity AI
```properties
conductor.ai.perplexity.api-key=${PERPLEXITY_API_KEY}
conductor.ai.perplexity.base-url=https://api.perplexity.ai
```
| Property | Required | Default | Description |
|----------|:--------:|---------|-------------|
| `api-key` | ✅ | - | Perplexity API key |
| `base-url` | ❌ | `https://api.perplexity.ai` | API base URL |
#### HuggingFace
```properties
conductor.ai.huggingface.api-key=${HUGGINGFACE_API_KEY}
conductor.ai.huggingface.base-url=https://api-inference.huggingface.co/models
```
| Property | Required | Default | Description |
|----------|:--------:|---------|-------------|
| `api-key` | ✅ | - | HuggingFace API token |
| `base-url` | ❌ | `https://api-inference.huggingface.co/models` | API base URL |
#### Ollama (Local)
```properties
conductor.ai.ollama.base-url=http://localhost:11434
conductor.ai.ollama.auth-header-name=Authorization
conductor.ai.ollama.auth-header=Bearer token-here
```
| Property | Required | Default | Description |
|----------|:--------:|---------|-------------|
| `base-url` | ❌ | `http://localhost:11434` | Ollama server URL |
| `auth-header-name` | ❌ | - | Custom auth header name |
| `auth-header` | ❌ | - | Custom auth header value |
#### Stability AI
```properties
conductor.ai.stabilityai.api-key=${STABILITY_API_KEY}
```
| Property | Required | Default | Description |
|----------|:--------:|---------|-------------|
| `api-key` | Yes | - | Stability AI API key |
Supported models: `sd3.5-large`, `sd3.5-large-turbo`, `sd3.5-medium`, `sd3-large`, `sd3-medium`, `core` (Stable Image Core), `ultra` (Stable Image Ultra). The endpoint is selected automatically based on the model name.
## Environment Variables
The AI module reads from standard environment variables automatically. Set the environment variable for a provider and it will be enabled -- no need to edit properties files.
### Quick Reference
| Provider | Environment Variable | Description |
|----------|---------------------|-------------|
| OpenAI | `OPENAI_API_KEY` | API key from [platform.openai.com](https://platform.openai.com/api-keys) |
| OpenAI | `OPENAI_ORG_ID` | Optional organization ID |
| Anthropic | `ANTHROPIC_API_KEY` | API key from [console.anthropic.com](https://console.anthropic.com/) |
| Mistral AI | `MISTRAL_API_KEY` | API key from [console.mistral.ai](https://console.mistral.ai/) |
| Cohere | `COHERE_API_KEY` | API key from [dashboard.cohere.com](https://dashboard.cohere.com/) |
| Grok / xAI | `XAI_API_KEY` | API key from [x.ai](https://x.ai/) |
| Perplexity | `PERPLEXITY_API_KEY` | API key from [perplexity.ai](https://www.perplexity.ai/) |
| HuggingFace | `HUGGINGFACE_API_KEY` | Token from [huggingface.co/settings/tokens](https://huggingface.co/settings/tokens) |
| Stability AI | `STABILITY_API_KEY` | API key from [platform.stability.ai](https://platform.stability.ai/) |
| Azure OpenAI | `AZURE_OPENAI_API_KEY` | API key from Azure portal |
| Azure OpenAI | `AZURE_OPENAI_ENDPOINT` | Endpoint URL (e.g., `https://your-resource.openai.azure.com`) |
| Azure OpenAI | `AZURE_OPENAI_DEPLOYMENT` | Deployment name |
| AWS Bedrock | `AWS_ACCESS_KEY_ID` | AWS access key |
| AWS Bedrock | `AWS_SECRET_ACCESS_KEY` | AWS secret key |
| AWS Bedrock | `AWS_REGION` | AWS region (default: `us-east-1`) |
| Google Gemini | `GEMINI_API_KEY` | Gemini API key from [Google AI Studio](https://aistudio.google.com/) |
| Google Gemini | `GOOGLE_CLOUD_PROJECT` | GCP project ID (for Vertex AI chat/embeddings) |
| Google Gemini | `GOOGLE_CLOUD_LOCATION` | GCP region (default: `us-central1`) |
| Google Gemini | `GOOGLE_APPLICATION_CREDENTIALS` | Path to service account JSON file |
| Ollama | `OLLAMA_HOST` | Ollama server URL (default: `http://localhost:11434`) |
### Usage
**Linux/macOS:**
```bash
export OPENAI_API_KEY=sk-your-api-key
export ANTHROPIC_API_KEY=sk-ant-your-api-key
./gradlew bootRun
```
**Windows (PowerShell):**
```powershell
$env:OPENAI_API_KEY = "sk-your-api-key"
$env:ANTHROPIC_API_KEY = "sk-ant-your-api-key"
./gradlew bootRun
```
> **Note**: Explicit property values in `application.properties` or external configuration files (e.g., `conductor.properties`) take precedence over environment variables.
## Docker
### Docker Run
Pass environment variables using `-e` flags:
```bash
docker run -d \
-p 8080:8080 \
-e OPENAI_API_KEY=sk-your-api-key \
-e ANTHROPIC_API_KEY=sk-ant-your-api-key \
conductor:server
```
### Docker Compose
Create a `docker-compose.yml`:
```yaml
version: '3.8'
services:
conductor:
image: conductor:server
ports:
- "8080:8080"
environment:
- OPENAI_API_KEY=${OPENAI_API_KEY}
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
- MISTRAL_API_KEY=${MISTRAL_API_KEY}
# Add other providers as needed
```
Create a `.env` file in the same directory:
```bash
OPENAI_API_KEY=sk-your-api-key
ANTHROPIC_API_KEY=sk-ant-your-api-key
MISTRAL_API_KEY=your-mistral-key
```
Run with:
```bash
docker-compose up -d
```
### Google Gemini with Docker
**Using API key (simplest):**
```bash
docker run -d \
-p 8080:8080 \
-e GEMINI_API_KEY=your-api-key \
conductor:server
```
**Using Vertex AI credentials (for chat/embeddings):**
```bash
docker run -d \
-p 8080:8080 \
-e GOOGLE_CLOUD_PROJECT=your-project-id \
-e GOOGLE_APPLICATION_CREDENTIALS=/app/config/credentials.json \
-v /path/to/credentials.json:/app/config/credentials.json:ro \
conductor:server
```
When running on GKE with Workload Identity, credentials are provided automatically by the platform.
### AWS Bedrock with Docker
Using environment variables:
```bash
docker run -d \
-p 8080:8080 \
-e AWS_ACCESS_KEY_ID=your-access-key \
-e AWS_SECRET_ACCESS_KEY=your-secret-key \
-e AWS_REGION=us-east-1 \
conductor:server
```
Or mount your AWS credentials directory:
```bash
docker run -d \
-p 8080:8080 \
-v ~/.aws:/root/.aws:ro \
conductor:server
```
## Sample Workflows
### 1. Chat Completion (Conversational AI)
```json
{
"name": "chat_workflow",
"version": 1,
"schemaVersion": 2,
"tasks": [
{
"name": "chat_task",
"taskReferenceName": "chat",
"type": "LLM_CHAT_COMPLETE",
"inputParameters": {
"llmProvider": "openai",
"model": "gpt-4o-mini",
"messages": [
{
"role": "system",
"message": "You are a helpful assistant."
},
{
"role": "user",
"message": "What is the capital of France?"
}
],
"temperature": 0.7,
"maxTokens": 500
}
}
]
}
```
**Output:**
```json
{
"result": "The capital of France is Paris.",
"metadata": {
"usage": {
"promptTokens": 25,
"completionTokens": 8,
"totalTokens": 33
}
}
}
```
### 2. Generate Embeddings
```json
{
"name": "embedding_workflow",
"version": 1,
"schemaVersion": 2,
"tasks": [
{
"name": "generate_embeddings",
"taskReferenceName": "embeddings",
"type": "LLM_GENERATE_EMBEDDINGS",
"inputParameters": {
"llmProvider": "openai",
"model": "text-embedding-3-small",
"text": "Conductor is an orchestration platform"
}
}
]
}
```
**Output:**
```json
{
"result": [0.123, -0.456, 0.789, ...] // 1536-dimensional vector
}
```
### 3. Image Generation
```json
{
"name": "image_gen_workflow",
"version": 1,
"schemaVersion": 2,
"tasks": [
{
"name": "generate_image",
"taskReferenceName": "image",
"type": "GENERATE_IMAGE",
"inputParameters": {
"llmProvider": "openai",
"model": "dall-e-3",
"prompt": "A futuristic cityscape at sunset",
"width": 1024,
"height": 1024,
"n": 1,
"style": "vivid"
}
}
]
}
```
**Output:**
```json
{
"url": "https://...",
"b64_json": "base64-encoded-image-data"
}
```
### 4. Audio Generation (Text-to-Speech)
```json
{
"name": "tts_workflow",
"version": 1,
"schemaVersion": 2,
"tasks": [
{
"name": "generate_audio",
"taskReferenceName": "audio",
"type": "GENERATE_AUDIO",
"inputParameters": {
"llmProvider": "openai",
"model": "tts-1",
"text": "Hello, this is a test of text to speech.",
"voice": "alloy"
}
}
]
}
```
**Output:**
```json
{
"url": "https://...",
"format": "mp3"
}
```
### 5. Semantic Search with Vector DB
```json
{
"name": "semantic_search_workflow",
"version": 1,
"schemaVersion": 2,
"tasks": [
{
"name": "index_documents",
"taskReferenceName": "index",
"type": "LLM_INDEX_TEXT",
"inputParameters": {
"vectorDB": "postgres-prod",
"namespace": "documentation",
"index": "tech_docs",
"embeddingModelProvider": "openai",
"embeddingModel": "text-embedding-3-small",
"text": "Conductor is a workflow orchestration platform",
"docId": "doc_001"
}
},
{
"name": "search_documents",
"taskReferenceName": "search",
"type": "LLM_SEARCH_INDEX",
"inputParameters": {
"vectorDB": "postgres-prod",
"namespace": "documentation",
"index": "tech_docs",
"embeddingModelProvider": "openai",
"embeddingModel": "text-embedding-3-small",
"query": "workflow orchestration",
"llmMaxResults": 5
}
}
]
}
```
**Output:**
```json
{
"result": [
{
"docId": "doc_001",
"score": 0.95,
"text": "Conductor is a workflow orchestration platform"
}
]
}
```
### 6. RAG (Retrieval Augmented Generation)
A basic RAG workflow that searches a knowledge base and generates an answer:
```json
{
"name": "rag_workflow",
"version": 1,
"schemaVersion": 2,
"tasks": [
{
"name": "search_knowledge_base",
"taskReferenceName": "search",
"type": "LLM_SEARCH_INDEX",
"inputParameters": {
"vectorDB": "postgres-prod",
"namespace": "kb",
"index": "articles",
"embeddingModelProvider": "openai",
"embeddingModel": "text-embedding-3-small",
"query": "${workflow.input.question}",
"llmMaxResults": 3
}
},
{
"name": "generate_answer",
"taskReferenceName": "answer",
"type": "LLM_CHAT_COMPLETE",
"inputParameters": {
"llmProvider": "anthropic",
"model": "claude-3-5-sonnet-20241022",
"messages": [
{
"role": "system",
"message": "Answer based on the following context: ${search.output.result}"
},
{
"role": "user",
"message": "${workflow.input.question}"
}
],
"temperature": 0.3
}
}
]
}
```
#### Complete RAG Demo (Index + Search + Answer)
A self-contained workflow that indexes documents, searches them, and generates an answer:
```json
{
"name": "complete_rag_demo",
"description": "Index documents, search, and generate RAG answer",
"version": 1,
"schemaVersion": 2,
"tasks": [
{
"name": "index_doc_1",
"taskReferenceName": "index_doc_1_ref",
"type": "LLM_INDEX_TEXT",
"inputParameters": {
"vectorDB": "postgres-prod",
"index": "demo_index",
"namespace": "demo_docs",
"docId": "intro-001",
"text": "Conductor is a distributed workflow orchestration engine that runs in the cloud. It allows developers to build complex stateful applications by orchestrating microservices.",
"embeddingModelProvider": "openai",
"embeddingModel": "text-embedding-3-small",
"dimensions": 1536,
"metadata": { "category": "introduction" }
}
},
{
"name": "index_doc_2",
"taskReferenceName": "index_doc_2_ref",
"type": "LLM_INDEX_TEXT",
"inputParameters": {
"vectorDB": "postgres-prod",
"index": "demo_index",
"namespace": "demo_docs",
"docId": "features-002",
"text": "Conductor supports multiple vector databases including PostgreSQL (pgvector), MongoDB Atlas, and Pinecone. It also integrates with LLM providers like OpenAI, Anthropic, and Azure OpenAI.",
"embeddingModelProvider": "openai",
"embeddingModel": "text-embedding-3-small",
"dimensions": 1536,
"metadata": { "category": "features" }
}
},
{
"name": "index_doc_3",
"taskReferenceName": "index_doc_3_ref",
"type": "LLM_INDEX_TEXT",
"inputParameters": {
"vectorDB": "postgres-prod",
"index": "demo_index",
"namespace": "demo_docs",
"docId": "config-003",
"text": "You can configure multiple named instances of the same vector database type for different environments like production, development, and staging.",
"embeddingModelProvider": "openai",
"embeddingModel": "text-embedding-3-small",
"dimensions": 1536,
"metadata": { "category": "configuration" }
}
},
{
"name": "search_index",
"taskReferenceName": "search_ref",
"type": "LLM_SEARCH_INDEX",
"inputParameters": {
"vectorDB": "postgres-prod",
"index": "demo_index",
"namespace": "demo_docs",
"query": "What vector databases does Conductor support?",
"embeddingModelProvider": "openai",
"embeddingModel": "text-embedding-3-small",
"dimensions": 1536,
"maxResults": 3
}
},
{
"name": "generate_rag_answer",
"taskReferenceName": "answer_ref",
"type": "LLM_CHAT_COMPLETE",
"inputParameters": {
"llmProvider": "openai",
"model": "gpt-4o-mini",
"messages": [
{
"role": "system",
"message": "You are a technical expert. Answer the question using only the provided context."
},
{
"role": "user",
"message": "Context:\n${search_ref.output.result}\n\nQuestion: What vector databases does Conductor support?"
}
],
"temperature": 0.2
}
}
],
"outputParameters": {
"indexed_docs": ["${index_doc_1_ref.output}", "${index_doc_2_ref.output}", "${index_doc_3_ref.output}"],
"search_results": "${search_ref.output.result}",
"answer": "${answer_ref.output.result}"
}
}
```
**Run without input:**
```bash
curl -X POST 'http://localhost:8080/api/workflow/complete_rag_demo' \
-H 'Content-Type: application/json' \
-d '{}'
```
### 7. MCP (Model Context Protocol) Tool Integration
MCP allows workflows to interact with external tools and data sources via HTTP/HTTPS or stdio (local) servers.
#### List Tools from MCP Server
```json
{
"name": "mcp_list_tools_workflow",
"version": 1,
"schemaVersion": 2,
"tasks": [
{
"name": "list_mcp_tools",
"taskReferenceName": "list_tools",
"type": "LIST_MCP_TOOLS",
"inputParameters": {
"mcpServer": "http://localhost:3000/mcp"
}
}
]
}
```
**Output:**
```json
{
"tools": [
{
"name": "get_weather",
"description": "Get current weather for a location",
"inputSchema": {
"type": "object",
"properties": {
"location": {"type": "string"}
},
"required": ["location"]
}
}
]
}
```
The Model Context Protocol supports multiple [transport types](https://modelcontextprotocol.io/specification/2025-11-25/basic/transports):
- **Streamable HTTP** (default): Standard HTTP/HTTPS endpoints (recommended per MCP spec 2025-11-25)
- **SSE** (deprecated): Only used when URL explicitly contains `/sse` endpoint
#### Call MCP Tool (HTTP Server)
```json
{
"name": "mcp_weather_workflow",
"version": 1,
"schemaVersion": 2,
"tasks": [
{
"name": "get_weather",
"taskReferenceName": "weather",
"type": "CALL_MCP_TOOL",
"inputParameters": {
"mcpServer": "http://localhost:3000/mcp",
"method": "get_weather",
"location": "New York",
"units": "fahrenheit"
}
}
]
}
```
**Output:**
```json
{
"content": [
{
"type": "text",
"text": "Current weather in New York: 72°F, Partly cloudy"
}
],
"isError": false
}
```
**MCP Server URL Formats:**
- **HTTP**: `http://localhost:3000` (uses Streamable HTTP transport)
- **HTTP/SSE (deprecated)**: `http://localhost:3000/sse`
- **HTTP/Streamable**: `http://localhost:3000/mcp`
- **HTTPS**: `https://api.example.com/mcp`
> **Note**: All input parameters except `mcpServer`, `method`, and `headers` are automatically passed as arguments to the MCP tool.
#### MCP + AI Agent Workflow
Complete example combining MCP tools with LLM for autonomous agent behavior:
```json
{
"name": "mcp_ai_agent_workflow",
"version": 1,
"schemaVersion": 2,
"tasks": [
{
"name": "list_available_tools",
"taskReferenceName": "discover_tools",
"type": "LIST_MCP_TOOLS",
"inputParameters": {
"mcpServer": "http://localhost:3000/mcp"
}
},
{
"name": "decide_which_tools_to_use",
"taskReferenceName": "plan",
"type": "LLM_CHAT_COMPLETE",
"inputParameters": {
"llmProvider": "anthropic",
"model": "claude-3-5-sonnet-20241022",
"messages": [
{
"role": "system",
"message": "You are an AI agent. Available tools: ${discover_tools.output.tools}. User wants to: ${workflow.input.task}"
},
{
"role": "user",
"message": "Which tool should I use and what parameters? Respond with JSON: {method: string, arguments: object}"
}
],
"temperature": 0.1,
"maxTokens": 500
}
},
{
"name": "execute_tool",
"taskReferenceName": "execute",
"type": "CALL_MCP_TOOL",
"inputParameters": {
"mcpServer": "http://localhost:3000/mcp",
"method": "${plan.output.result.method}",
"arguments": "${plan.output.result.arguments}"
}
},
{
"name": "summarize_result",
"taskReferenceName": "summarize",
"type": "LLM_CHAT_COMPLETE",
"inputParameters": {
"llmProvider": "openai",
"model": "gpt-4o-mini",
"messages": [
{
"role": "user",
"message": "Summarize this result for the user: ${execute.output.content}"
}
],
"maxTokens": 200
}
}
]
}
```
**Workflow Input:**
```json
{
"task": "Get the current weather in San Francisco"
}
```
**Workflow Output:**
```json
{
"discover_tools": {
"tools": [
{"name": "get_weather", "description": "..."},
{"name": "calculate", "description": "..."}
]
},
"plan": {
"result": {
"method": "get_weather",
"arguments": {"location": "San Francisco", "units": "fahrenheit"}
}
},
"execute": {
"content": [{"type": "text", "text": "72°F, Sunny"}]
},
"summarize": {
"result": "The current weather in San Francisco is 72°F and sunny."
}
}
```
### 8. Video Generation (OpenAI Sora)
```json
{
"name": "video_gen_openai_sora",
"version": 1,
"schemaVersion": 2,
"tasks": [
{
"name": "generate_video",
"taskReferenceName": "sora_video",
"type": "GENERATE_VIDEO",
"inputParameters": {
"llmProvider": "openai",
"model": "sora-2",
"prompt": "A slow cinematic aerial shot of a coastal city at golden hour, waves crashing against cliffs",
"duration": 8,
"size": "1280x720",
"n": 1,
"style": "cinematic"
}
}
]
}
```
**Output:**
```json
{
"media": [
{
"location": "/api/media/.../video.mp4",
"mimeType": "video/mp4"
},
{
"location": "/api/media/.../thumbnail.webp",
"mimeType": "image/webp"
}
],
"jobId": "video_abc123...",
"status": "COMPLETED",
"pollCount": 14
}
```
### 9. Video Generation (Google Gemini Veo)
```json
{
"name": "video_gen_gemini_veo",
"version": 1,
"schemaVersion": 2,
"tasks": [
{
"name": "generate_video",
"taskReferenceName": "veo_video",
"type": "GENERATE_VIDEO",
"inputParameters": {
"llmProvider": "vertex_ai",
"model": "veo-3",
"prompt": "A time-lapse of a blooming flower in a sunlit garden, soft bokeh background",
"duration": 8,
"aspectRatio": "16:9",
"resolution": "720p",
"personGeneration": "dont_allow",
"generateAudio": true,
"negativePrompt": "blurry, low quality, text overlay",
"n": 1
}
}
]
}
```
### 10. Multi-Step Pipeline (Image + Video)
A workflow that generates an image and a video in sequence:
```json
{
"name": "image_to_video_pipeline",
"version": 1,
"schemaVersion": 2,
"tasks": [
{
"name": "generate_image",
"taskReferenceName": "source_image",
"type": "GENERATE_IMAGE",
"inputParameters": {
"llmProvider": "openai",
"model": "dall-e-3",
"prompt": "A serene mountain lake at dawn with mist rising from the water",
"width": 1792,
"height": 1024,
"n": 1
}
},
{
"name": "generate_video",
"taskReferenceName": "animated_video",
"type": "GENERATE_VIDEO",
"inputParameters": {
"llmProvider": "openai",
"model": "sora-2",
"prompt": "A serene mountain lake at dawn, gentle ripples spread across the water as mist slowly drifts",
"duration": 8,
"size": "1280x720",
"style": "cinematic"
}
}
]
}
```
### 11. PDF Generation (Markdown to PDF)
Generate a PDF document from markdown content with layout options and metadata:
```json
{
"name": "pdf_generation_workflow",
"version": 1,
"schemaVersion": 2,
"tasks": [
{
"name": "generate_pdf",
"taskReferenceName": "pdf",
"type": "GENERATE_PDF",
"inputParameters": {
"markdown": "# Sales Report\n\n## Summary\n\nTotal revenue: **$5.4M**\n\n| Region | Revenue | Growth |\n|--------|---------|--------|\n| North America | $2.4M | +12% |\n| Europe | $1.8M | +8% |\n\n## Recommendations\n\n1. Expand APAC sales team\n2. Launch enterprise tier in EU\n\n> *Our best quarter yet.*",
"pageSize": "LETTER",
"theme": "default",
"pdfMetadata": {
"title": "Sales Report - Q4 2025",
"author": "Conductor Workflow"
}
}
}
]
}
```
**Output:**
```json
{
"result": {
"location": "file:///tmp/conductor/wf-123/task-456/abc.pdf",
"sizeBytes": 12345
},
"media": [
{
"location": "file:///tmp/conductor/wf-123/task-456/abc.pdf",
"mimeType": "application/pdf"
}
],
"finishReason": "COMPLETED"
}
```
### 12. LLM-to-PDF Pipeline (Report Generation)
A multi-step workflow that uses an LLM to generate a markdown report and then converts it to PDF:
```json
{
"name": "llm_to_pdf_pipeline",
"version": 1,
"schemaVersion": 2,
"inputParameters": ["topic", "audience"],
"tasks": [
{
"name": "generate_report_markdown",
"taskReferenceName": "llm_report",
"type": "LLM_CHAT_COMPLETE",
"inputParameters": {
"llmProvider": "openai",
"model": "gpt-4o-mini",
"messages": [
{
"role": "system",
"message": "You are a professional report writer. Generate well-structured markdown reports."
},
{
"role": "user",
"message": "Write a report about: ${workflow.input.topic}\nAudience: ${workflow.input.audience}"
}
],
"temperature": 0.7,
"maxTokens": 2000
}
},
{
"name": "convert_to_pdf",
"taskReferenceName": "pdf_output",
"type": "GENERATE_PDF",
"inputParameters": {
"markdown": "${llm_report.output.result}",
"pageSize": "A4",
"pdfMetadata": {
"title": "${workflow.input.topic}",
"author": "Conductor AI Pipeline"
}
}
}
],
"outputParameters": {
"reportMarkdown": "${llm_report.output.result}",
"pdfLocation": "${pdf_output.output.result.location}",
"pdfSizeBytes": "${pdf_output.output.result.sizeBytes}"
}
}
```
**Workflow Input:**
```json
{
"topic": "Cloud Migration Best Practices",
"audience": "CTO and engineering leadership"
}
```
**Workflow Output:**
```json
{
"reportMarkdown": "# Cloud Migration Best Practices\n\n## Executive Summary\n...",
"pdfLocation": "file:///tmp/conductor/wf-789/task-012/report.pdf",
"pdfSizeBytes": 28456
}
```
### 13. LLM Tool Calling with MCP Tools
Use `LLM_CHAT_COMPLETE` with the `tools` parameter to let the LLM autonomously decide when to call MCP tools. When the LLM needs to use a tool, it returns `finishReason: "TOOL_CALLS"` with the tool invocations.
#### LLM Output with Tool Calls
When the LLM decides to call tools, the output looks like this:
```json
{
"result": [],
"media": [],
"finishReason": "TOOL_CALLS",
"tokenUsed": 90,
"promptTokens": 75,
"completionTokens": 15,
"toolCalls": [
{
"taskReferenceName": "call_2prFOIfVdwS4BTAi4Z43qPGe",
"name": "get_weather",
"type": "MCP_TOOL",
"inputParameters": {
"method": "get_weather",
"location": "Tokyo"
}
}
]
}
```
> **Key Points:**
> - `finishReason: "TOOL_CALLS"` indicates the LLM wants to invoke tools
> - `toolCalls` array contains all tool invocations with their parameters
> - Each tool call has a unique `taskReferenceName` for workflow orchestration
> - The `configParams.mcpServer` in each tool definition specifies the MCP server URL
## Enable/Disable AI Workers
### Global Enable/Disable
AI workers are **disabled by default** for security. Enable them explicitly:
```properties
# Enable all AI workers and integrations
conductor.integrations.ai.enabled=true
```
To disable:
```properties
# Disable all AI workers (or simply omit the property)
conductor.integrations.ai.enabled=false
```
### Conditional Provider Registration
Providers are automatically registered only when their API keys are configured. To disable a specific provider, simply remove or comment out its configuration:
```properties
# OpenAI will be registered
conductor.ai.openai.api-key=sk-xxx
# Anthropic will NOT be registered (commented out)
# conductor.ai.anthropic.api-key=sk-ant-xxx
```
### Environment-Based Configuration
Use environment variables to control which providers are enabled in different environments:
```bash
# Development - use local Ollama
export OLLAMA_BASE_URL=http://localhost:11434
./gradlew bootRun
# Production - use OpenAI and Anthropic
export OPENAI_API_KEY=sk-xxx
export ANTHROPIC_API_KEY=sk-ant-xxx
./gradlew bootRun
```
## Testing
### Integration Tests
The module includes integration tests that run against real APIs when credentials are provided via environment variables:
```bash
# Run all tests (integration tests skipped if no API keys)
./gradlew :conductor-ai:test
# Run with real OpenAI API
export OPENAI_API_KEY=sk-xxx
./gradlew :conductor-ai:test
# Run without integration tests
env -u OPENAI_API_KEY -u ANTHROPIC_API_KEY ./gradlew :conductor-ai:
gitextract_qhhcr7te/
├── .claude/
│ └── agents/
│ └── docs-writer.md
├── .dockerignore
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── bug_report.yml
│ │ ├── config.yml
│ │ ├── documentation.md
│ │ ├── documentation.yaml
│ │ ├── feature_request.md
│ │ └── feature_request.yaml
│ ├── dependabot.yml
│ ├── pull_request_template.md
│ ├── release-drafter.yml
│ └── workflows/
│ ├── ci.yml
│ ├── debug-docker-credentials.yml
│ ├── generate_gh_pages.yml
│ ├── publish.yml
│ ├── publish_build.yaml
│ ├── publish_s3.yaml
│ ├── release_draft.yml
│ └── ui-next-ci.yml
├── .gitignore
├── .opencode/
│ └── plans/
│ └── video-generation-implementation.md
├── AGENTS.md
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── OPENSEARCH_TESTING_PLAN.md
├── OSSMETADATA
├── README.md
├── RELATED.md
├── ROADMAP.md
├── SECURITY.md
├── USERS.md
├── ai/
│ ├── CONTRIBUTING.md
│ ├── JDBC_CONFIGURATION.md
│ ├── README.md
│ ├── VECTORDB_CONFIGURATION.md
│ ├── build.gradle
│ ├── examples/
│ │ ├── 01-chat-completion.json
│ │ ├── 02-generate-embeddings.json
│ │ ├── 03-image-generation.json
│ │ ├── 04-audio-generation.json
│ │ ├── 05-semantic-search.json
│ │ ├── 06-rag-basic.json
│ │ ├── 07-rag-complete.json
│ │ ├── 08-mcp-list-tools.json
│ │ ├── 09-mcp-call-tool.json
│ │ ├── 10-mcp-ai-agent.json
│ │ ├── 11-video-openai-sora.json
│ │ ├── 12-video-gemini-veo.json
│ │ ├── 13-image-to-video-pipeline.json
│ │ ├── 14-stabilityai-image.json
│ │ ├── 15-pdf-generation.json
│ │ ├── 16-llm-to-pdf-pipeline.json
│ │ └── README.md
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── org/
│ │ └── conductoross/
│ │ └── conductor/
│ │ ├── ai/
│ │ │ ├── AIModel.java
│ │ │ ├── AIModelProvider.java
│ │ │ ├── LLMHelper.java
│ │ │ ├── LLMs.java
│ │ │ ├── MimeExtensionResolver.java
│ │ │ ├── ModelConfiguration.java
│ │ │ ├── document/
│ │ │ │ ├── DocumentAccessDeniedException.java
│ │ │ │ ├── DocumentAccessPolicy.java
│ │ │ │ ├── DocumentLoader.java
│ │ │ │ ├── FileSystemDocumentLoader.java
│ │ │ │ └── HttpDocumentLoader.java
│ │ │ ├── mcp/
│ │ │ │ ├── JsonTextParser.java
│ │ │ │ └── MCPService.java
│ │ │ ├── models/
│ │ │ │ ├── AudioGenRequest.java
│ │ │ │ ├── ChatCompletion.java
│ │ │ │ ├── ChatMessage.java
│ │ │ │ ├── EmbeddingGenRequest.java
│ │ │ │ ├── GetConversationHistoryRequest.java
│ │ │ │ ├── ImageGenRequest.java
│ │ │ │ ├── IndexDocInput.java
│ │ │ │ ├── IndexedDoc.java
│ │ │ │ ├── LLMResponse.java
│ │ │ │ ├── LLMWorkerInput.java
│ │ │ │ ├── MCPListToolsRequest.java
│ │ │ │ ├── MCPToolCallRequest.java
│ │ │ │ ├── MarkdownToPdfRequest.java
│ │ │ │ ├── Media.java
│ │ │ │ ├── StoreEmbeddingsInput.java
│ │ │ │ ├── TextCompletion.java
│ │ │ │ ├── ToolCall.java
│ │ │ │ ├── ToolSpec.java
│ │ │ │ ├── VectorDBInput.java
│ │ │ │ └── VideoGenRequest.java
│ │ │ ├── pdf/
│ │ │ │ ├── MarkdownToPdfConverter.java
│ │ │ │ ├── PdfDocumentRenderer.java
│ │ │ │ ├── PdfImageResolver.java
│ │ │ │ └── PdfRenderContext.java
│ │ │ ├── providers/
│ │ │ │ ├── anthropic/
│ │ │ │ │ ├── Anthropic.java
│ │ │ │ │ └── AnthropicConfiguration.java
│ │ │ │ ├── azureopenai/
│ │ │ │ │ ├── AzureOpenAI.java
│ │ │ │ │ └── AzureOpenAIConfiguration.java
│ │ │ │ ├── bedrock/
│ │ │ │ │ ├── Bedrock.java
│ │ │ │ │ └── BedrockConfiguration.java
│ │ │ │ ├── cohere/
│ │ │ │ │ ├── CohereAI.java
│ │ │ │ │ ├── CohereAIConfiguration.java
│ │ │ │ │ ├── CohereChatModel.java
│ │ │ │ │ ├── CohereChatOptions.java
│ │ │ │ │ ├── CohereEmbeddingModel.java
│ │ │ │ │ └── api/
│ │ │ │ │ └── CohereApi.java
│ │ │ │ ├── gemini/
│ │ │ │ │ ├── GeminiGenAI.java
│ │ │ │ │ ├── GeminiVertex.java
│ │ │ │ │ ├── GeminiVertexConfiguration.java
│ │ │ │ │ └── GeminiVideoModel.java
│ │ │ │ ├── grok/
│ │ │ │ │ ├── Grok.java
│ │ │ │ │ └── GrokAIConfiguration.java
│ │ │ │ ├── huggingface/
│ │ │ │ │ ├── HuggingFace.java
│ │ │ │ │ └── HuggingFaceConfiguration.java
│ │ │ │ ├── mistral/
│ │ │ │ │ ├── MistralAI.java
│ │ │ │ │ └── MistralAIConfiguration.java
│ │ │ │ ├── ollama/
│ │ │ │ │ ├── Ollama.java
│ │ │ │ │ └── OllamaConfiguration.java
│ │ │ │ ├── openai/
│ │ │ │ │ ├── OpenAI.java
│ │ │ │ │ ├── OpenAIConfiguration.java
│ │ │ │ │ ├── OpenAIVideoModel.java
│ │ │ │ │ └── api/
│ │ │ │ │ └── OpenAIVideoApi.java
│ │ │ │ ├── perplexity/
│ │ │ │ │ ├── PerplexityAI.java
│ │ │ │ │ └── PerplexityAIConfiguration.java
│ │ │ │ └── stabilityai/
│ │ │ │ ├── StabilityAI.java
│ │ │ │ ├── StabilityAIConfiguration.java
│ │ │ │ └── StabilityAiApi.java
│ │ │ ├── sql/
│ │ │ │ ├── JDBCConnectionConfig.java
│ │ │ │ ├── JDBCInput.java
│ │ │ │ ├── JDBCInstanceConfig.java
│ │ │ │ ├── JDBCProvider.java
│ │ │ │ └── JDBCWorker.java
│ │ │ ├── tasks/
│ │ │ │ ├── mapper/
│ │ │ │ │ ├── AIModelTaskMapper.java
│ │ │ │ │ ├── AudioGenerationTaskMapper.java
│ │ │ │ │ ├── CallMCPToolTaskMapper.java
│ │ │ │ │ ├── ChatCompleteTaskMapper.java
│ │ │ │ │ ├── GenEmbeddingsTaskMapper.java
│ │ │ │ │ ├── GetEmbeddingsTaskMapper.java
│ │ │ │ │ ├── ImageGenerationTaskMapper.java
│ │ │ │ │ ├── IndexTextTaskMapper.java
│ │ │ │ │ ├── ListMCPToolsTaskMapper.java
│ │ │ │ │ ├── PdfGenerationTaskMapper.java
│ │ │ │ │ ├── SearchIndexTaskMapper.java
│ │ │ │ │ ├── StoreEmbeddingsTaskMapper.java
│ │ │ │ │ ├── TextCompleteTaskMapper.java
│ │ │ │ │ └── VideoGenerationTaskMapper.java
│ │ │ │ └── worker/
│ │ │ │ ├── DocumentGenWorkers.java
│ │ │ │ ├── LLMWorkers.java
│ │ │ │ ├── MCPWorkers.java
│ │ │ │ └── VectorDBWorkers.java
│ │ │ ├── vectordb/
│ │ │ │ ├── VectorDB.java
│ │ │ │ ├── VectorDBConfig.java
│ │ │ │ ├── VectorDBInstanceConfig.java
│ │ │ │ ├── VectorDBProvider.java
│ │ │ │ ├── VectorDBs.java
│ │ │ │ ├── mongodb/
│ │ │ │ │ ├── MongoDBConfig.java
│ │ │ │ │ └── MongoVectorDB.java
│ │ │ │ ├── pinecone/
│ │ │ │ │ ├── PineconeConfig.java
│ │ │ │ │ └── PineconeDB.java
│ │ │ │ └── postgres/
│ │ │ │ ├── PostgresConfig.java
│ │ │ │ └── PostgresVectorDB.java
│ │ │ └── video/
│ │ │ ├── AsyncVideoModel.java
│ │ │ ├── Video.java
│ │ │ ├── VideoGeneration.java
│ │ │ ├── VideoGenerationMetadata.java
│ │ │ ├── VideoMessage.java
│ │ │ ├── VideoModel.java
│ │ │ ├── VideoOptions.java
│ │ │ ├── VideoOptionsBuilder.java
│ │ │ ├── VideoPrompt.java
│ │ │ ├── VideoResponse.java
│ │ │ └── VideoResponseMetadata.java
│ │ └── config/
│ │ └── AIIntegrationEnabledCondition.java
│ └── test/
│ ├── java/
│ │ └── org/
│ │ └── conductoross/
│ │ └── conductor/
│ │ └── ai/
│ │ ├── AIModelProviderTest.java
│ │ ├── LLMHelperTest.java
│ │ ├── LLMsTest.java
│ │ ├── document/
│ │ │ └── DocumentAccessPolicyTest.java
│ │ ├── integration/
│ │ │ └── AIModelIntegrationTest.java
│ │ ├── mapper/
│ │ │ ├── GenEmbeddingsTaskMapperTest.java
│ │ │ ├── GetEmbeddingsTaskMapperTest.java
│ │ │ ├── IndexTextTaskMapperTest.java
│ │ │ ├── PdfGenerationTaskMapperTest.java
│ │ │ ├── SearchIndexTaskMapperTest.java
│ │ │ ├── StoreEmbeddingsTaskMapperTest.java
│ │ │ └── TextCompleteTaskMapperTest.java
│ │ ├── mcp/
│ │ │ └── JsonTextParserTest.java
│ │ ├── pdf/
│ │ │ ├── DocumentGenWorkersTest.java
│ │ │ ├── MarkdownToPdfConverterTest.java
│ │ │ ├── PdfImageResolverTest.java
│ │ │ └── PdfRenderContextTest.java
│ │ ├── providers/
│ │ │ ├── anthropic/
│ │ │ │ ├── AnthropicConfigurationTest.java
│ │ │ │ └── AnthropicTest.java
│ │ │ ├── azureopenai/
│ │ │ │ ├── AzureOpenAIConfigurationTest.java
│ │ │ │ └── AzureOpenAITest.java
│ │ │ ├── bedrock/
│ │ │ │ ├── BedrockConfigurationTest.java
│ │ │ │ └── BedrockTest.java
│ │ │ ├── cohere/
│ │ │ │ ├── CohereAIConfigurationTest.java
│ │ │ │ └── CohereAITest.java
│ │ │ ├── gemini/
│ │ │ │ ├── GeminiVertexConfigurationTest.java
│ │ │ │ └── GeminiVertexTest.java
│ │ │ ├── grok/
│ │ │ │ ├── GrokAIConfigurationTest.java
│ │ │ │ └── GrokTest.java
│ │ │ ├── huggingface/
│ │ │ │ ├── HuggingFaceConfigurationTest.java
│ │ │ │ └── HuggingFaceTest.java
│ │ │ ├── mistral/
│ │ │ │ ├── MistralAIConfigurationTest.java
│ │ │ │ └── MistralAITest.java
│ │ │ ├── ollama/
│ │ │ │ ├── OllamaConfigurationTest.java
│ │ │ │ └── OllamaTest.java
│ │ │ ├── openai/
│ │ │ │ ├── OpenAIConfigurationTest.java
│ │ │ │ └── OpenAITest.java
│ │ │ └── perplexity/
│ │ │ ├── PerplexityAIConfigurationTest.java
│ │ │ └── PerplexityAITest.java
│ │ ├── sql/
│ │ │ ├── JDBCConnectionConfigTest.java
│ │ │ ├── JDBCEndToEndTest.java
│ │ │ ├── JDBCInstanceConfigTest.java
│ │ │ └── JDBCProviderTest.java
│ │ ├── vectordb/
│ │ │ ├── MongoVectorDBTest.java
│ │ │ ├── PostgresVectorDBTest.java
│ │ │ ├── VectorDBProviderTest.java
│ │ │ └── VectorDBsTest.java
│ │ └── video/
│ │ ├── VideoMemoryTest.java
│ │ ├── VideoModelTest.java
│ │ └── VideoProviderMemoryTest.java
│ └── resources/
│ └── ai-test-env.sh
├── amqp/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── contribs/
│ │ └── queue/
│ │ └── amqp/
│ │ ├── AMQPConnection.java
│ │ ├── AMQPObservableQueue.java
│ │ ├── config/
│ │ │ ├── AMQPEventQueueConfiguration.java
│ │ │ ├── AMQPEventQueueProperties.java
│ │ │ ├── AMQPEventQueueProvider.java
│ │ │ └── AMQPRetryPattern.java
│ │ └── util/
│ │ ├── AMQPConfigurations.java
│ │ ├── AMQPConstants.java
│ │ ├── AMQPSettings.java
│ │ ├── ConnectionType.java
│ │ └── RetryType.java
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── contribs/
│ └── queue/
│ └── amqp/
│ ├── AMQPEventQueueProviderTest.java
│ ├── AMQPObservableQueueTest.java
│ └── AMQPSettingsTest.java
├── annotations/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── annotations/
│ └── protogen/
│ ├── ProtoEnum.java
│ ├── ProtoField.java
│ └── ProtoMessage.java
├── annotations-processor/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── example/
│ │ └── java/
│ │ └── com/
│ │ └── example/
│ │ └── Example.java
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── annotationsprocessor/
│ │ │ └── protogen/
│ │ │ ├── AbstractMessage.java
│ │ │ ├── Enum.java
│ │ │ ├── Message.java
│ │ │ ├── ProtoFile.java
│ │ │ ├── ProtoGen.java
│ │ │ ├── ProtoGenTask.java
│ │ │ └── types/
│ │ │ ├── AbstractType.java
│ │ │ ├── ExternMessageType.java
│ │ │ ├── GenericType.java
│ │ │ ├── ListType.java
│ │ │ ├── MapType.java
│ │ │ ├── MessageType.java
│ │ │ ├── ScalarType.java
│ │ │ ├── TypeMapper.java
│ │ │ └── WrappedType.java
│ │ └── resources/
│ │ └── templates/
│ │ ├── file.proto
│ │ └── message.proto
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── annotationsprocessor/
│ │ └── protogen/
│ │ └── ProtoGenTest.java
│ └── resources/
│ └── example.proto.txt
├── awss3-storage/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ └── main/
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── s3/
│ │ ├── config/
│ │ │ ├── S3Configuration.java
│ │ │ └── S3Properties.java
│ │ └── storage/
│ │ └── S3PayloadStorage.java
│ └── resources/
│ └── META-INF/
│ └── additional-spring-configuration-metadata.json
├── awssqs-event-queue/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── sqs/
│ │ │ ├── config/
│ │ │ │ ├── SQSEventQueueConfiguration.java
│ │ │ │ ├── SQSEventQueueProperties.java
│ │ │ │ └── SQSEventQueueProvider.java
│ │ │ └── eventqueue/
│ │ │ └── SQSObservableQueue.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── additional-spring-configuration-metadata.json
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── sqs/
│ └── eventqueue/
│ ├── DefaultEventQueueProcessorTest.java
│ └── SQSObservableQueueTest.java
├── azureblob-storage/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── azureblob/
│ │ ├── config/
│ │ │ ├── AzureBlobConfiguration.java
│ │ │ └── AzureBlobProperties.java
│ │ └── storage/
│ │ └── AzureBlobPayloadStorage.java
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── azureblob/
│ └── storage/
│ └── AzureBlobPayloadStorageTest.java
├── build.gradle
├── build_ui.sh
├── cassandra-persistence/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── cassandra/
│ │ │ ├── config/
│ │ │ │ ├── CassandraConfiguration.java
│ │ │ │ ├── CassandraProperties.java
│ │ │ │ └── cache/
│ │ │ │ ├── CacheableEventHandlerDAO.java
│ │ │ │ ├── CacheableMetadataDAO.java
│ │ │ │ └── CachingConfig.java
│ │ │ ├── dao/
│ │ │ │ ├── CassandraBaseDAO.java
│ │ │ │ ├── CassandraEventHandlerDAO.java
│ │ │ │ ├── CassandraExecutionDAO.java
│ │ │ │ ├── CassandraMetadataDAO.java
│ │ │ │ └── CassandraPollDataDAO.java
│ │ │ └── util/
│ │ │ ├── Constants.java
│ │ │ └── Statements.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── additional-spring-configuration-metadata.json
│ └── test/
│ └── groovy/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── cassandra/
│ ├── dao/
│ │ ├── CassandraEventHandlerDAOSpec.groovy
│ │ ├── CassandraExecutionDAOSpec.groovy
│ │ ├── CassandraMetadataDAOSpec.groovy
│ │ └── CassandraSpec.groovy
│ └── util/
│ └── StatementsSpec.groovy
├── common/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ └── java/
│ │ ├── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ ├── annotations/
│ │ │ │ └── protogen/
│ │ │ │ ├── ProtoEnum.java
│ │ │ │ ├── ProtoField.java
│ │ │ │ └── ProtoMessage.java
│ │ │ ├── common/
│ │ │ │ ├── config/
│ │ │ │ │ ├── ObjectMapperBuilderConfiguration.java
│ │ │ │ │ ├── ObjectMapperConfiguration.java
│ │ │ │ │ └── ObjectMapperProvider.java
│ │ │ │ ├── constraints/
│ │ │ │ │ ├── NoSemiColonConstraint.java
│ │ │ │ │ ├── OwnerEmailMandatoryConstraint.java
│ │ │ │ │ ├── TaskReferenceNameUniqueConstraint.java
│ │ │ │ │ ├── TaskTimeoutConstraint.java
│ │ │ │ │ └── ValidNameConstraint.java
│ │ │ │ ├── jackson/
│ │ │ │ │ └── JsonProtoModule.java
│ │ │ │ ├── metadata/
│ │ │ │ │ ├── Auditable.java
│ │ │ │ │ ├── BaseDef.java
│ │ │ │ │ ├── SchemaDef.java
│ │ │ │ │ ├── acl/
│ │ │ │ │ │ └── Permission.java
│ │ │ │ │ ├── events/
│ │ │ │ │ │ ├── EventExecution.java
│ │ │ │ │ │ └── EventHandler.java
│ │ │ │ │ ├── tasks/
│ │ │ │ │ │ ├── ExecutionMetadata.java
│ │ │ │ │ │ ├── PollData.java
│ │ │ │ │ │ ├── Task.java
│ │ │ │ │ │ ├── TaskDef.java
│ │ │ │ │ │ ├── TaskExecLog.java
│ │ │ │ │ │ ├── TaskResult.java
│ │ │ │ │ │ └── TaskType.java
│ │ │ │ │ └── workflow/
│ │ │ │ │ ├── CacheConfig.java
│ │ │ │ │ ├── DynamicForkJoinTask.java
│ │ │ │ │ ├── DynamicForkJoinTaskList.java
│ │ │ │ │ ├── IdempotencyStrategy.java
│ │ │ │ │ ├── RateLimitConfig.java
│ │ │ │ │ ├── RerunWorkflowRequest.java
│ │ │ │ │ ├── SkipTaskRequest.java
│ │ │ │ │ ├── StartWorkflowRequest.java
│ │ │ │ │ ├── StateChangeEvent.java
│ │ │ │ │ ├── SubWorkflowParams.java
│ │ │ │ │ ├── UpgradeWorkflowRequest.java
│ │ │ │ │ ├── WorkflowDef.java
│ │ │ │ │ ├── WorkflowDefSummary.java
│ │ │ │ │ └── WorkflowTask.java
│ │ │ │ ├── model/
│ │ │ │ │ └── BulkResponse.java
│ │ │ │ ├── run/
│ │ │ │ │ ├── ExternalStorageLocation.java
│ │ │ │ │ ├── SearchResult.java
│ │ │ │ │ ├── TaskSummary.java
│ │ │ │ │ ├── Workflow.java
│ │ │ │ │ ├── WorkflowSummary.java
│ │ │ │ │ ├── WorkflowSummaryExtended.java
│ │ │ │ │ └── WorkflowTestRequest.java
│ │ │ │ ├── utils/
│ │ │ │ │ ├── ConstraintParamUtil.java
│ │ │ │ │ ├── EnvUtils.java
│ │ │ │ │ ├── ExternalPayloadStorage.java
│ │ │ │ │ ├── SummaryUtil.java
│ │ │ │ │ └── TaskUtils.java
│ │ │ │ └── validation/
│ │ │ │ ├── ErrorResponse.java
│ │ │ │ └── ValidationError.java
│ │ │ └── sdk/
│ │ │ └── workflow/
│ │ │ └── executor/
│ │ │ └── task/
│ │ │ ├── NonRetryableException.java
│ │ │ └── TaskContext.java
│ │ └── org/
│ │ └── conductoross/
│ │ └── conductor/
│ │ ├── ai/
│ │ │ └── TokenUsageLog.java
│ │ ├── common/
│ │ │ ├── Documented.java
│ │ │ ├── JsonSchemaValidator.java
│ │ │ └── utils/
│ │ │ ├── StringTemplate.java
│ │ │ └── TextUtils.java
│ │ ├── core/
│ │ │ └── execution/
│ │ │ └── tasks/
│ │ │ └── AnnotatedSystemTaskWorker.java
│ │ └── model/
│ │ ├── SignalResponse.java
│ │ ├── TaskRun.java
│ │ ├── WorkflowRun.java
│ │ └── WorkflowSignalReturnStrategy.java
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── common/
│ │ ├── config/
│ │ │ └── TestObjectMapperConfiguration.java
│ │ ├── constraints/
│ │ │ └── NameValidatorTest.java
│ │ ├── events/
│ │ │ └── EventHandlerTest.java
│ │ ├── run/
│ │ │ └── TaskSummaryTest.java
│ │ ├── tasks/
│ │ │ ├── TaskDefTest.java
│ │ │ ├── TaskResultTest.java
│ │ │ └── TaskTest.java
│ │ ├── utils/
│ │ │ ├── ConstraintParamUtilTest.java
│ │ │ └── SummaryUtilTest.java
│ │ └── workflow/
│ │ ├── SubWorkflowParamsTest.java
│ │ ├── WorkflowDefValidatorTest.java
│ │ └── WorkflowTaskTest.java
│ └── resources/
│ └── application.properties
├── common-persistence/
│ ├── build.gradle
│ └── src/
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── dao/
│ ├── ExecutionDAOTest.java
│ └── TestBase.java
├── conductor-clients/
│ └── README.md
├── conductor_server.bat
├── conductor_server.ps1
├── conductor_server.sh
├── core/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ ├── com/
│ │ │ │ └── netflix/
│ │ │ │ └── conductor/
│ │ │ │ ├── annotations/
│ │ │ │ │ ├── Audit.java
│ │ │ │ │ ├── Trace.java
│ │ │ │ │ └── VisibleForTesting.java
│ │ │ │ ├── core/
│ │ │ │ │ ├── LifecycleAwareComponent.java
│ │ │ │ │ ├── WorkflowContext.java
│ │ │ │ │ ├── config/
│ │ │ │ │ │ ├── ConductorCoreConfiguration.java
│ │ │ │ │ │ ├── ConductorProperties.java
│ │ │ │ │ │ └── SchedulerConfiguration.java
│ │ │ │ │ ├── dal/
│ │ │ │ │ │ └── ExecutionDAOFacade.java
│ │ │ │ │ ├── events/
│ │ │ │ │ │ ├── ActionProcessor.java
│ │ │ │ │ │ ├── DefaultEventProcessor.java
│ │ │ │ │ │ ├── DefaultEventQueueManager.java
│ │ │ │ │ │ ├── EventQueueManager.java
│ │ │ │ │ │ ├── EventQueueProvider.java
│ │ │ │ │ │ ├── EventQueues.java
│ │ │ │ │ │ ├── ScriptEvaluator.java
│ │ │ │ │ │ ├── SimpleActionProcessor.java
│ │ │ │ │ │ └── queue/
│ │ │ │ │ │ ├── ConductorEventQueueProvider.java
│ │ │ │ │ │ ├── ConductorObservableQueue.java
│ │ │ │ │ │ ├── DefaultEventQueueProcessor.java
│ │ │ │ │ │ ├── Message.java
│ │ │ │ │ │ └── ObservableQueue.java
│ │ │ │ │ ├── exception/
│ │ │ │ │ │ ├── ConflictException.java
│ │ │ │ │ │ ├── NonTransientException.java
│ │ │ │ │ │ ├── NotFoundException.java
│ │ │ │ │ │ ├── TerminateWorkflowException.java
│ │ │ │ │ │ └── TransientException.java
│ │ │ │ │ ├── execution/
│ │ │ │ │ │ ├── AsyncSystemTaskExecutor.java
│ │ │ │ │ │ ├── DeciderService.java
│ │ │ │ │ │ ├── NotificationResult.java
│ │ │ │ │ │ ├── StartWorkflowInput.java
│ │ │ │ │ │ ├── WorkflowExecutor.java
│ │ │ │ │ │ ├── WorkflowExecutorOps.java
│ │ │ │ │ │ ├── evaluators/
│ │ │ │ │ │ │ ├── ConsoleBridge.java
│ │ │ │ │ │ │ ├── Evaluator.java
│ │ │ │ │ │ │ ├── GraalJSEvaluator.java
│ │ │ │ │ │ │ ├── JavascriptEvaluator.java
│ │ │ │ │ │ │ ├── PythonEvaluator.java
│ │ │ │ │ │ │ └── ValueParamEvaluator.java
│ │ │ │ │ │ ├── mapper/
│ │ │ │ │ │ │ ├── DecisionTaskMapper.java
│ │ │ │ │ │ │ ├── DoWhileTaskMapper.java
│ │ │ │ │ │ │ ├── DynamicTaskMapper.java
│ │ │ │ │ │ │ ├── EventTaskMapper.java
│ │ │ │ │ │ │ ├── ExclusiveJoinTaskMapper.java
│ │ │ │ │ │ │ ├── ForkJoinDynamicTaskMapper.java
│ │ │ │ │ │ │ ├── ForkJoinTaskMapper.java
│ │ │ │ │ │ │ ├── HTTPTaskMapper.java
│ │ │ │ │ │ │ ├── HumanTaskMapper.java
│ │ │ │ │ │ │ ├── InlineTaskMapper.java
│ │ │ │ │ │ │ ├── JoinTaskMapper.java
│ │ │ │ │ │ │ ├── JsonJQTransformTaskMapper.java
│ │ │ │ │ │ │ ├── KafkaPublishTaskMapper.java
│ │ │ │ │ │ │ ├── LambdaTaskMapper.java
│ │ │ │ │ │ │ ├── NoopTaskMapper.java
│ │ │ │ │ │ │ ├── SetVariableTaskMapper.java
│ │ │ │ │ │ │ ├── SimpleTaskMapper.java
│ │ │ │ │ │ │ ├── StartWorkflowTaskMapper.java
│ │ │ │ │ │ │ ├── SubWorkflowTaskMapper.java
│ │ │ │ │ │ │ ├── SwitchTaskMapper.java
│ │ │ │ │ │ │ ├── TaskMapper.java
│ │ │ │ │ │ │ ├── TaskMapperContext.java
│ │ │ │ │ │ │ ├── TerminateTaskMapper.java
│ │ │ │ │ │ │ ├── UserDefinedTaskMapper.java
│ │ │ │ │ │ │ └── WaitTaskMapper.java
│ │ │ │ │ │ └── tasks/
│ │ │ │ │ │ ├── Decision.java
│ │ │ │ │ │ ├── DoWhile.java
│ │ │ │ │ │ ├── Event.java
│ │ │ │ │ │ ├── ExclusiveJoin.java
│ │ │ │ │ │ ├── ExecutionConfig.java
│ │ │ │ │ │ ├── Fork.java
│ │ │ │ │ │ ├── Human.java
│ │ │ │ │ │ ├── Inline.java
│ │ │ │ │ │ ├── IsolatedTaskQueueProducer.java
│ │ │ │ │ │ ├── Join.java
│ │ │ │ │ │ ├── Lambda.java
│ │ │ │ │ │ ├── Noop.java
│ │ │ │ │ │ ├── SetVariable.java
│ │ │ │ │ │ ├── StartWorkflow.java
│ │ │ │ │ │ ├── SubWorkflow.java
│ │ │ │ │ │ ├── Switch.java
│ │ │ │ │ │ ├── SystemTaskRegistry.java
│ │ │ │ │ │ ├── SystemTaskWorker.java
│ │ │ │ │ │ ├── SystemTaskWorkerCoordinator.java
│ │ │ │ │ │ ├── Terminate.java
│ │ │ │ │ │ ├── Wait.java
│ │ │ │ │ │ └── WorkflowSystemTask.java
│ │ │ │ │ ├── index/
│ │ │ │ │ │ ├── NoopIndexDAO.java
│ │ │ │ │ │ └── NoopIndexDAOConfiguration.java
│ │ │ │ │ ├── listener/
│ │ │ │ │ │ ├── TaskStatusListener.java
│ │ │ │ │ │ ├── TaskStatusListenerStub.java
│ │ │ │ │ │ ├── WorkflowStatusListener.java
│ │ │ │ │ │ └── WorkflowStatusListenerStub.java
│ │ │ │ │ ├── metadata/
│ │ │ │ │ │ └── MetadataMapperService.java
│ │ │ │ │ ├── reconciliation/
│ │ │ │ │ │ ├── WorkflowReconciler.java
│ │ │ │ │ │ ├── WorkflowRepairService.java
│ │ │ │ │ │ └── WorkflowSweeper.java
│ │ │ │ │ ├── storage/
│ │ │ │ │ │ └── DummyPayloadStorage.java
│ │ │ │ │ ├── sync/
│ │ │ │ │ │ ├── Lock.java
│ │ │ │ │ │ ├── local/
│ │ │ │ │ │ │ ├── LocalOnlyLock.java
│ │ │ │ │ │ │ └── LocalOnlyLockConfiguration.java
│ │ │ │ │ │ └── noop/
│ │ │ │ │ │ └── NoopLock.java
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── DateTimeUtils.java
│ │ │ │ │ ├── ExternalPayloadStorageUtils.java
│ │ │ │ │ ├── IDGenerator.java
│ │ │ │ │ ├── JsonUtils.java
│ │ │ │ │ ├── ParametersUtils.java
│ │ │ │ │ ├── QueueUtils.java
│ │ │ │ │ ├── SemaphoreUtil.java
│ │ │ │ │ └── Utils.java
│ │ │ │ ├── dao/
│ │ │ │ │ ├── ConcurrentExecutionLimitDAO.java
│ │ │ │ │ ├── EventHandlerDAO.java
│ │ │ │ │ ├── ExecutionDAO.java
│ │ │ │ │ ├── IndexDAO.java
│ │ │ │ │ ├── MetadataDAO.java
│ │ │ │ │ ├── PollDataDAO.java
│ │ │ │ │ ├── QueueDAO.java
│ │ │ │ │ └── RateLimitingDAO.java
│ │ │ │ ├── metrics/
│ │ │ │ │ ├── Monitors.java
│ │ │ │ │ └── WorkflowMonitor.java
│ │ │ │ ├── model/
│ │ │ │ │ ├── TaskModel.java
│ │ │ │ │ ├── WorkflowModel.java
│ │ │ │ │ └── WorkflowNotifications.java
│ │ │ │ ├── sdk/
│ │ │ │ │ └── workflow/
│ │ │ │ │ └── task/
│ │ │ │ │ ├── InputParam.java
│ │ │ │ │ ├── OutputParam.java
│ │ │ │ │ └── WorkerTask.java
│ │ │ │ ├── service/
│ │ │ │ │ ├── AdminService.java
│ │ │ │ │ ├── AdminServiceImpl.java
│ │ │ │ │ ├── EventService.java
│ │ │ │ │ ├── EventServiceImpl.java
│ │ │ │ │ ├── ExecutionLockService.java
│ │ │ │ │ ├── ExecutionService.java
│ │ │ │ │ ├── MetadataService.java
│ │ │ │ │ ├── MetadataServiceImpl.java
│ │ │ │ │ ├── TaskService.java
│ │ │ │ │ ├── TaskServiceImpl.java
│ │ │ │ │ ├── VersionService.java
│ │ │ │ │ ├── WorkflowBulkService.java
│ │ │ │ │ ├── WorkflowBulkServiceImpl.java
│ │ │ │ │ ├── WorkflowService.java
│ │ │ │ │ ├── WorkflowServiceImpl.java
│ │ │ │ │ └── WorkflowTestService.java
│ │ │ │ └── validations/
│ │ │ │ ├── ValidationContext.java
│ │ │ │ └── WorkflowTaskTypeConstraint.java
│ │ │ └── org/
│ │ │ └── conductoross/
│ │ │ └── conductor/
│ │ │ └── core/
│ │ │ └── execution/
│ │ │ ├── ExecutorUtils.java
│ │ │ ├── SweeperProperties.java
│ │ │ ├── WorkflowSweeper.java
│ │ │ ├── mapper/
│ │ │ │ ├── AnnotatedSystemTaskMapper.java
│ │ │ │ └── TaskMapperValidator.java
│ │ │ └── tasks/
│ │ │ └── annotated/
│ │ │ ├── AnnotatedMethodParameterMapper.java
│ │ │ ├── AnnotatedMethodResultMapper.java
│ │ │ ├── AnnotatedWorkflowSystemTask.java
│ │ │ ├── SampleWorkers.java
│ │ │ └── WorkerTaskAnnotationScanner.java
│ │ └── resources/
│ │ └── META-INF/
│ │ ├── additional-spring-configuration-metadata.json
│ │ ├── validation/
│ │ │ └── constraints.xml
│ │ └── validation.xml
│ └── test/
│ ├── groovy/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ ├── core/
│ │ │ └── execution/
│ │ │ ├── AsyncSystemTaskExecutorTest.groovy
│ │ │ └── tasks/
│ │ │ ├── DoWhileSpec.groovy
│ │ │ ├── EventSpec.groovy
│ │ │ ├── IsolatedTaskQueueProducerSpec.groovy
│ │ │ └── StartWorkflowSpec.groovy
│ │ └── model/
│ │ ├── TaskModelSpec.groovy
│ │ └── WorkflowModelSpec.groovy
│ ├── java/
│ │ ├── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ ├── TestUtils.java
│ │ │ ├── core/
│ │ │ │ ├── dal/
│ │ │ │ │ └── ExecutionDAOFacadeTest.java
│ │ │ │ ├── events/
│ │ │ │ │ ├── MockObservableQueue.java
│ │ │ │ │ ├── MockQueueProvider.java
│ │ │ │ │ ├── TestDefaultEventProcessor.java
│ │ │ │ │ ├── TestGraalJSFeatures.java
│ │ │ │ │ ├── TestScriptEval.java
│ │ │ │ │ └── TestSimpleActionProcessor.java
│ │ │ │ ├── execution/
│ │ │ │ │ ├── NotificationResultTest.java
│ │ │ │ │ ├── TestDeciderOutcomes.java
│ │ │ │ │ ├── TestDeciderService.java
│ │ │ │ │ ├── TestWorkflowDef.java
│ │ │ │ │ ├── TestWorkflowExecutor.java
│ │ │ │ │ ├── TestWorkflowExecutorDecideLoop.java
│ │ │ │ │ ├── WorkflowSystemTaskStub.java
│ │ │ │ │ ├── evaluators/
│ │ │ │ │ │ ├── GraalJSEvaluatorTest.java
│ │ │ │ │ │ └── JavascriptEvaluatorTest.java
│ │ │ │ │ ├── mapper/
│ │ │ │ │ │ ├── DecisionTaskMapperTest.java
│ │ │ │ │ │ ├── DoWhileTaskMapperTest.java
│ │ │ │ │ │ ├── DynamicTaskMapperTest.java
│ │ │ │ │ │ ├── EventTaskMapperTest.java
│ │ │ │ │ │ ├── ForkJoinDynamicTaskMapperTest.java
│ │ │ │ │ │ ├── ForkJoinTaskMapperTest.java
│ │ │ │ │ │ ├── HTTPTaskMapperTest.java
│ │ │ │ │ │ ├── HumanTaskMapperTest.java
│ │ │ │ │ │ ├── InlineTaskMapperTest.java
│ │ │ │ │ │ ├── JoinTaskMapperTest.java
│ │ │ │ │ │ ├── JsonJQTransformTaskMapperTest.java
│ │ │ │ │ │ ├── KafkaPublishTaskMapperTest.java
│ │ │ │ │ │ ├── LambdaTaskMapperTest.java
│ │ │ │ │ │ ├── NoopTaskMapperTest.java
│ │ │ │ │ │ ├── SetVariableTaskMapperTest.java
│ │ │ │ │ │ ├── SimpleTaskMapperTest.java
│ │ │ │ │ │ ├── SubWorkflowTaskMapperTest.java
│ │ │ │ │ │ ├── SwitchTaskMapperTest.java
│ │ │ │ │ │ ├── TerminateTaskMapperTest.java
│ │ │ │ │ │ ├── UserDefinedTaskMapperTest.java
│ │ │ │ │ │ └── WaitTaskMapperTest.java
│ │ │ │ │ └── tasks/
│ │ │ │ │ ├── DoWhileIntegrationTest.java
│ │ │ │ │ ├── DoWhileTest.java
│ │ │ │ │ ├── EventQueueResolutionTest.java
│ │ │ │ │ ├── InlineTest.java
│ │ │ │ │ ├── JoinTest.java
│ │ │ │ │ ├── TestJoin.java
│ │ │ │ │ ├── TestLambda.java
│ │ │ │ │ ├── TestNoop.java
│ │ │ │ │ ├── TestSubWorkflow.java
│ │ │ │ │ ├── TestSystemTaskWorker.java
│ │ │ │ │ ├── TestSystemTaskWorkerCoordinator.java
│ │ │ │ │ └── TestTerminate.java
│ │ │ │ ├── metadata/
│ │ │ │ │ └── MetadataMapperServiceTest.java
│ │ │ │ ├── reconciliation/
│ │ │ │ │ ├── TestWorkflowRepairService.java
│ │ │ │ │ └── TestWorkflowSweeper.java
│ │ │ │ ├── storage/
│ │ │ │ │ └── DummyPayloadStorageTest.java
│ │ │ │ ├── sync/
│ │ │ │ │ └── local/
│ │ │ │ │ └── LocalOnlyLockTest.java
│ │ │ │ └── utils/
│ │ │ │ ├── DateTimeUtilsTest.java
│ │ │ │ ├── ExternalPayloadStorageUtilsTest.java
│ │ │ │ ├── JsonUtilsTest.java
│ │ │ │ ├── ParametersUtilsTest.java
│ │ │ │ ├── QueueUtilsTest.java
│ │ │ │ └── SemaphoreUtilTest.java
│ │ │ ├── dao/
│ │ │ │ ├── ExecutionDAOTest.java
│ │ │ │ └── PollDataDAOTest.java
│ │ │ ├── metrics/
│ │ │ │ └── WorkflowMonitorTest.java
│ │ │ ├── service/
│ │ │ │ ├── EventServiceTest.java
│ │ │ │ ├── ExecutionServiceTest.java
│ │ │ │ ├── MetadataServiceTest.java
│ │ │ │ ├── TaskServiceTest.java
│ │ │ │ ├── WorkflowBulkServiceTest.java
│ │ │ │ └── WorkflowServiceTest.java
│ │ │ └── validations/
│ │ │ ├── WorkflowDefConstraintTest.java
│ │ │ └── WorkflowTaskTypeConstraintTest.java
│ │ └── org/
│ │ └── conductoross/
│ │ └── conductor/
│ │ └── core/
│ │ └── execution/
│ │ ├── ExecutorUtilsTest.java
│ │ ├── WorkflowSweeperTest.java
│ │ └── tasks/
│ │ └── annotated/
│ │ ├── TestAnnotatedMethodParameterMapper.java
│ │ ├── TestAnnotatedMethodResultMapper.java
│ │ ├── TestAnnotatedSystemTaskIntegration.java
│ │ ├── TestAnnotatedWorkflowSystemTask.java
│ │ └── TestTaskContext.java
│ └── resources/
│ ├── completed.json
│ ├── conditional_flow.json
│ ├── conditional_flow_with_switch.json
│ ├── payload.json
│ └── test.json
├── dependencies.gradle
├── deploy.gradle
├── docker/
│ ├── README.md
│ ├── ci/
│ │ └── Dockerfile
│ ├── docker-compose-es8.yaml
│ ├── docker-compose-mysql.yaml
│ ├── docker-compose-postgres-es7.yaml
│ ├── docker-compose-postgres.yaml
│ ├── docker-compose-redis-os.yaml
│ ├── docker-compose-redis-os2.yaml
│ ├── docker-compose-redis-os3.yaml
│ ├── docker-compose.yaml
│ ├── server/
│ │ ├── Dockerfile
│ │ ├── config/
│ │ │ ├── config-mysql.properties
│ │ │ ├── config-postgres-es7.properties
│ │ │ ├── config-postgres.properties
│ │ │ ├── config-redis-es8.properties
│ │ │ ├── config-redis-os.properties
│ │ │ ├── config-redis-os2.properties
│ │ │ ├── config-redis-os3.properties
│ │ │ ├── config-redis.properties
│ │ │ ├── config.properties
│ │ │ ├── log4j-file-appender.properties
│ │ │ ├── log4j.properties
│ │ │ └── redis.conf
│ │ ├── libs/
│ │ │ └── .gitignore
│ │ └── nginx/
│ │ └── nginx.conf
│ └── ui/
│ ├── Dockerfile
│ └── README.md
├── docs/
│ ├── architecture/
│ │ ├── durable-execution.md
│ │ └── json-native.md
│ ├── css/
│ │ └── custom.css
│ ├── devguide/
│ │ ├── ai/
│ │ │ ├── durable-agents.md
│ │ │ ├── dynamic-workflows.md
│ │ │ ├── failure-semantics.md
│ │ │ ├── first-ai-agent.md
│ │ │ ├── human-in-the-loop.md
│ │ │ ├── index.md
│ │ │ ├── llm-orchestration.md
│ │ │ ├── mcp-guide.md
│ │ │ ├── production-agent-architecture.md
│ │ │ ├── token-efficiency.md
│ │ │ └── why-conductor.md
│ │ ├── architecture/
│ │ │ ├── directed-acyclic-graph.md
│ │ │ ├── index.md
│ │ │ └── tasklifecycle.md
│ │ ├── bestpractices.md
│ │ ├── concepts/
│ │ │ ├── conductor.md
│ │ │ ├── index.md
│ │ │ ├── tasks.md
│ │ │ ├── workers.md
│ │ │ └── workflows.md
│ │ ├── cookbook/
│ │ │ ├── ai-llm.md
│ │ │ ├── dynamic-parallelism.md
│ │ │ ├── dynamic-workflows.md
│ │ │ ├── event-driven.md
│ │ │ ├── index.md
│ │ │ ├── microservice-orchestration.md
│ │ │ └── wait-and-timers.md
│ │ ├── faq.md
│ │ ├── how-tos/
│ │ │ ├── Tasks/
│ │ │ │ ├── choosing-tasks.md
│ │ │ │ ├── creating-tasks.md
│ │ │ │ └── task-inputs.md
│ │ │ ├── Workers/
│ │ │ │ └── scaling-workers.md
│ │ │ ├── Workflows/
│ │ │ │ ├── creating-workflows.md
│ │ │ │ ├── debugging-workflows.md
│ │ │ │ ├── handling-errors.md
│ │ │ │ ├── searching-workflows.md
│ │ │ │ ├── starting-workflows.md
│ │ │ │ ├── versioning-workflows.md
│ │ │ │ └── viewing-workflow-executions.md
│ │ │ ├── conductor-skills.md
│ │ │ └── event-bus.md
│ │ ├── labs/
│ │ │ ├── eventhandlers.md
│ │ │ ├── first-workflow.md
│ │ │ ├── index.md
│ │ │ └── kitchensink.md
│ │ └── running/
│ │ ├── deploy.md
│ │ ├── hosted.md
│ │ └── source.md
│ ├── documentation/
│ │ ├── advanced/
│ │ │ ├── annotation-processor.md
│ │ │ ├── archival-of-workflows.md
│ │ │ ├── extend.md
│ │ │ ├── externalpayloadstorage.md
│ │ │ ├── isolationgroups.md
│ │ │ ├── opensearch.md
│ │ │ ├── postgresql.md
│ │ │ └── redis.md
│ │ ├── api/
│ │ │ ├── bulk.md
│ │ │ ├── eventhandlers.md
│ │ │ ├── index.md
│ │ │ ├── metadata.md
│ │ │ ├── startworkflow.md
│ │ │ ├── task.md
│ │ │ ├── taskdomains.md
│ │ │ └── workflow.md
│ │ ├── clientsdks/
│ │ │ ├── csharp-sdk.md
│ │ │ ├── go-sdk.md
│ │ │ ├── index.md
│ │ │ ├── java-sdk.md
│ │ │ ├── js-sdk.md
│ │ │ ├── python-sdk.md
│ │ │ ├── ruby-sdk.md
│ │ │ └── rust-sdk.md
│ │ ├── configuration/
│ │ │ ├── appconf.md
│ │ │ ├── eventhandlers.md
│ │ │ ├── taskdef.md
│ │ │ └── workflowdef/
│ │ │ ├── index.md
│ │ │ ├── operators/
│ │ │ │ ├── do-while-task.md
│ │ │ │ ├── dynamic-fork-task.md
│ │ │ │ ├── dynamic-task.md
│ │ │ │ ├── fork-task.md
│ │ │ │ ├── index.md
│ │ │ │ ├── join-task.md
│ │ │ │ ├── set-variable-task.md
│ │ │ │ ├── start-workflow-task.md
│ │ │ │ ├── sub-workflow-task.md
│ │ │ │ ├── switch-task.md
│ │ │ │ └── terminate-task.md
│ │ │ └── systemtasks/
│ │ │ ├── event-task.md
│ │ │ ├── http-task.md
│ │ │ ├── human-task.md
│ │ │ ├── index.md
│ │ │ ├── inline-task.md
│ │ │ ├── jdbc-task.md
│ │ │ ├── json-jq-transform-task.md
│ │ │ ├── kafka-publish-task.md
│ │ │ ├── noop-task.md
│ │ │ └── wait-task.md
│ │ └── metrics/
│ │ ├── client.md
│ │ └── server.md
│ ├── home/
│ │ └── redirect.html
│ ├── index.md
│ ├── overrides/
│ │ ├── 404.html
│ │ ├── main.html
│ │ └── partials/
│ │ └── logo.html
│ ├── quickstart/
│ │ ├── index.md
│ │ └── workflow.json
│ ├── resources/
│ │ ├── contributing.md
│ │ ├── license.md
│ │ └── related.md
│ └── robots.txt
├── es6-persistence/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── es6/
│ │ └── config/
│ │ ├── ElasticSearch6DeprecationConfiguration.java
│ │ └── ElasticSearchConditions.java
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── es6/
│ └── config/
│ └── ElasticSearch6DeprecationTest.java
├── es7-persistence/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── es7/
│ │ │ ├── config/
│ │ │ │ ├── ElasticSearchConditions.java
│ │ │ │ ├── ElasticSearchProperties.java
│ │ │ │ └── ElasticSearchV7Configuration.java
│ │ │ └── dao/
│ │ │ ├── index/
│ │ │ │ ├── BulkRequestBuilderWrapper.java
│ │ │ │ ├── BulkRequestWrapper.java
│ │ │ │ ├── ElasticSearchBaseDAO.java
│ │ │ │ └── ElasticSearchRestDAOV7.java
│ │ │ └── query/
│ │ │ └── parser/
│ │ │ ├── Expression.java
│ │ │ ├── FilterProvider.java
│ │ │ ├── GroupedExpression.java
│ │ │ ├── NameValue.java
│ │ │ └── internal/
│ │ │ ├── AbstractNode.java
│ │ │ ├── BooleanOp.java
│ │ │ ├── ComparisonOp.java
│ │ │ ├── ConstValue.java
│ │ │ ├── FunctionThrowingException.java
│ │ │ ├── ListConst.java
│ │ │ ├── Name.java
│ │ │ ├── ParserException.java
│ │ │ └── Range.java
│ │ └── resources/
│ │ ├── mappings_docType_task.json
│ │ ├── mappings_docType_workflow.json
│ │ ├── template_event.json
│ │ ├── template_message.json
│ │ └── template_task_log.json
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── es7/
│ │ ├── config/
│ │ │ └── ElasticSearchPropertiesTest.java
│ │ ├── dao/
│ │ │ ├── index/
│ │ │ │ ├── ElasticSearchRestDaoBaseTest.java
│ │ │ │ ├── ElasticSearchTest.java
│ │ │ │ ├── TestBulkRequestBuilderWrapper.java
│ │ │ │ ├── TestElasticSearchRestDAOV7.java
│ │ │ │ └── TestElasticSearchRestDAOV7Batch.java
│ │ │ └── query/
│ │ │ └── parser/
│ │ │ ├── TestExpression.java
│ │ │ ├── TestGroupedExpression.java
│ │ │ └── internal/
│ │ │ ├── AbstractParserTest.java
│ │ │ ├── TestBooleanOp.java
│ │ │ ├── TestComparisonOp.java
│ │ │ ├── TestConstValue.java
│ │ │ └── TestName.java
│ │ └── utils/
│ │ └── TestUtils.java
│ └── resources/
│ ├── expected_template_task_log.json
│ ├── task_summary.json
│ └── workflow_summary.json
├── es8-persistence/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── conductoross/
│ │ │ └── conductor/
│ │ │ └── es8/
│ │ │ ├── config/
│ │ │ │ ├── ElasticSearchConditions.java
│ │ │ │ ├── ElasticSearchProperties.java
│ │ │ │ └── ElasticSearchV8Configuration.java
│ │ │ └── dao/
│ │ │ ├── index/
│ │ │ │ ├── ElasticSearchRestDAOV8.java
│ │ │ │ ├── Es8BulkIngestionSupport.java
│ │ │ │ ├── Es8IndexManagementSupport.java
│ │ │ │ └── Es8SearchSupport.java
│ │ │ └── query/
│ │ │ └── parser/
│ │ │ ├── Expression.java
│ │ │ ├── FilterProvider.java
│ │ │ ├── GroupedExpression.java
│ │ │ ├── NameValue.java
│ │ │ └── internal/
│ │ │ ├── AbstractNode.java
│ │ │ ├── BooleanOp.java
│ │ │ ├── ComparisonOp.java
│ │ │ ├── ConstValue.java
│ │ │ ├── FunctionThrowingException.java
│ │ │ ├── ListConst.java
│ │ │ ├── Name.java
│ │ │ ├── ParserException.java
│ │ │ └── Range.java
│ │ └── resources/
│ │ ├── template_event.json
│ │ ├── template_message.json
│ │ ├── template_task.json
│ │ ├── template_task_log.json
│ │ └── template_workflow.json
│ └── test/
│ ├── java/
│ │ └── org/
│ │ └── conductoross/
│ │ └── conductor/
│ │ └── es8/
│ │ ├── config/
│ │ │ ├── ElasticSearchConditionsTest.java
│ │ │ └── ElasticSearchPropertiesTest.java
│ │ ├── dao/
│ │ │ ├── index/
│ │ │ │ ├── ElasticSearchRestDAOV8ResourceExistenceTest.java
│ │ │ │ ├── ElasticSearchRestDaoBaseTest.java
│ │ │ │ ├── ElasticSearchTest.java
│ │ │ │ ├── Es8BulkIngestionSupportTest.java
│ │ │ │ ├── Es8SearchSupportTest.java
│ │ │ │ ├── TestElasticSearchRestDAOV8.java
│ │ │ │ └── TestElasticSearchRestDAOV8Batch.java
│ │ │ └── query/
│ │ │ └── parser/
│ │ │ ├── TestExpression.java
│ │ │ ├── TestGroupedExpression.java
│ │ │ ├── TestNameValueQueryBuilder.java
│ │ │ └── internal/
│ │ │ ├── AbstractParserTest.java
│ │ │ ├── TestBooleanOp.java
│ │ │ ├── TestComparisonOp.java
│ │ │ ├── TestConstValue.java
│ │ │ └── TestName.java
│ │ └── utils/
│ │ └── TestUtils.java
│ └── resources/
│ ├── expected_template_task_log.json
│ ├── task_summary.json
│ └── workflow_summary.json
├── family.properties
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── grpc/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── grpc/
│ │ │ ├── AbstractProtoMapper.java
│ │ │ └── ProtoMapper.java
│ │ └── proto/
│ │ ├── grpc/
│ │ │ ├── event_service.proto
│ │ │ ├── metadata_service.proto
│ │ │ ├── search.proto
│ │ │ ├── task_service.proto
│ │ │ └── workflow_service.proto
│ │ └── model/
│ │ ├── cacheconfig.proto
│ │ ├── dynamicforkjointask.proto
│ │ ├── dynamicforkjointasklist.proto
│ │ ├── eventexecution.proto
│ │ ├── eventhandler.proto
│ │ ├── executionmetadata.proto
│ │ ├── polldata.proto
│ │ ├── ratelimitconfig.proto
│ │ ├── rerunworkflowrequest.proto
│ │ ├── schemadef.proto
│ │ ├── skiptaskrequest.proto
│ │ ├── startworkflowrequest.proto
│ │ ├── statechangeevent.proto
│ │ ├── subworkflowparams.proto
│ │ ├── task.proto
│ │ ├── taskdef.proto
│ │ ├── taskexeclog.proto
│ │ ├── taskresult.proto
│ │ ├── tasksummary.proto
│ │ ├── upgradeworkflowrequest.proto
│ │ ├── workflow.proto
│ │ ├── workflowdef.proto
│ │ ├── workflowdefsummary.proto
│ │ ├── workflowsummary.proto
│ │ └── workflowtask.proto
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── grpc/
│ └── TestProtoMapper.java
├── grpc-client/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── client/
│ │ └── grpc/
│ │ ├── ClientBase.java
│ │ ├── EventClient.java
│ │ ├── MetadataClient.java
│ │ ├── TaskClient.java
│ │ └── WorkflowClient.java
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── client/
│ │ └── grpc/
│ │ ├── EventClientTest.java
│ │ ├── TaskClientTest.java
│ │ └── WorkflowClientTest.java
│ └── resources/
│ └── mockito-extensions/
│ └── org.mockito.plugins.MockMaker
├── grpc-server/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── grpc/
│ │ └── server/
│ │ ├── GRPCServer.java
│ │ ├── GRPCServerProperties.java
│ │ ├── GrpcConfiguration.java
│ │ └── service/
│ │ ├── EventServiceImpl.java
│ │ ├── GRPCHelper.java
│ │ ├── HealthServiceImpl.java
│ │ ├── MetadataServiceImpl.java
│ │ ├── TaskServiceImpl.java
│ │ └── WorkflowServiceImpl.java
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── grpc/
│ │ └── server/
│ │ └── service/
│ │ ├── HealthServiceImplTest.java
│ │ ├── TaskServiceImplTest.java
│ │ └── WorkflowServiceImplTest.java
│ └── resources/
│ └── log4j.properties
├── hooks/
│ └── pre-commit
├── http-task/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── tasks/
│ │ │ └── http/
│ │ │ ├── HttpTask.java
│ │ │ └── providers/
│ │ │ ├── DefaultRestTemplateProvider.java
│ │ │ └── RestTemplateProvider.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── additional-spring-configuration-metadata.json
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── tasks/
│ └── http/
│ ├── HttpTaskTest.java
│ ├── HttpTaskUnitTest.java
│ └── providers/
│ └── DefaultRestTemplateProviderTest.java
├── json-jq-task/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── tasks/
│ │ └── json/
│ │ └── JsonJqTransform.java
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── tasks/
│ └── json/
│ └── JsonJqTransformTest.java
├── kafka/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ ├── contribs/
│ │ │ └── tasks/
│ │ │ └── kafka/
│ │ │ ├── KafkaProducerManager.java
│ │ │ └── KafkaPublishTask.java
│ │ └── core/
│ │ └── execution/
│ │ └── mapper/
│ │ └── KafkaPublishTaskMapper.java
│ └── test/
│ ├── groovy/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── test/
│ │ └── integration/
│ │ └── KafkaPublishTaskSpec.groovy
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ ├── contribs/
│ │ │ └── tasks/
│ │ │ └── kafka/
│ │ │ ├── KafkaProducerManagerTest.java
│ │ │ └── KafkaPublishTaskTest.java
│ │ └── core/
│ │ └── execution/
│ │ └── mapper/
│ │ └── KafkaPublishTaskMapperTest.java
│ └── resources/
│ ├── application-integrationtest.properties
│ ├── input.json
│ ├── output.json
│ └── simple_json_jq_transform_integration_test.json
├── kafka-event-queue/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── kafkaeq/
│ │ │ ├── config/
│ │ │ │ ├── KafkaEventQueueConfiguration.java
│ │ │ │ ├── KafkaEventQueueProperties.java
│ │ │ │ └── KafkaEventQueueProvider.java
│ │ │ └── eventqueue/
│ │ │ └── KafkaObservableQueue.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── additional-spring-configuration-metadata.json
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── kafkaeq/
│ └── eventqueue/
│ └── KafkaObservableQueueTest.java
├── licenseheader.txt
├── main.py
├── metrics/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── contribs/
│ └── metrics/
│ ├── AzureMonitorMetricsConfiguration.java
│ ├── CloudWatchMetricsConfiguration.java
│ ├── LoggingMetricsConfiguration.java
│ └── MetricsCollector.java
├── mkdocs.yml
├── mysql-persistence/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── mysql/
│ │ │ ├── config/
│ │ │ │ ├── MySQLConfiguration.java
│ │ │ │ └── MySQLProperties.java
│ │ │ ├── dao/
│ │ │ │ ├── MySQLBaseDAO.java
│ │ │ │ ├── MySQLExecutionDAO.java
│ │ │ │ ├── MySQLMetadataDAO.java
│ │ │ │ └── MySQLQueueDAO.java
│ │ │ └── util/
│ │ │ ├── ExecuteFunction.java
│ │ │ ├── LazyToString.java
│ │ │ ├── Query.java
│ │ │ ├── QueryFunction.java
│ │ │ ├── ResultSetHandler.java
│ │ │ └── TransactionalFunction.java
│ │ └── resources/
│ │ └── db/
│ │ └── migration/
│ │ ├── V1__initial_schema.sql
│ │ ├── V2__queue_message_timestamps.sql
│ │ ├── V3__queue_add_priority.sql
│ │ ├── V4__1009_Fix_MySQLExecutionDAO_Index.sql
│ │ ├── V5__correlation_id_index.sql
│ │ ├── V6__new_qm_index_with_priority.sql
│ │ ├── V7__new_queue_message_pk.sql
│ │ └── V8__update_pk.sql
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ ├── mysql/
│ │ │ └── dao/
│ │ │ ├── MySQLExecutionDAOTest.java
│ │ │ ├── MySQLMetadataDAOTest.java
│ │ │ └── MySQLQueueDAOTest.java
│ │ └── test/
│ │ └── integration/
│ │ └── grpc/
│ │ └── mysql/
│ │ └── MySQLGrpcEndToEndTest.java
│ └── resources/
│ └── application.properties
├── nats/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── contribs/
│ │ └── queue/
│ │ └── nats/
│ │ ├── JetStreamObservableQueue.java
│ │ ├── JsmMessage.java
│ │ ├── LoggingNatsErrorListener.java
│ │ ├── NATSAbstractQueue.java
│ │ ├── NATSObservableQueue.java
│ │ ├── NatsException.java
│ │ └── config/
│ │ ├── JetStreamConfiguration.java
│ │ ├── JetStreamEventQueueProvider.java
│ │ ├── JetStreamProperties.java
│ │ ├── NATSConfiguration.java
│ │ └── NATSEventQueueProvider.java
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── contribs/
│ └── queue/
│ └── nats/
│ └── JetStreamObservableQueueTest.java
├── nats-streaming/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── contribs/
│ └── queue/
│ └── stan/
│ ├── NATSAbstractQueue.java
│ ├── NATSObservableQueue.java
│ ├── NATSStreamObservableQueue.java
│ └── config/
│ ├── NATSConfiguration.java
│ ├── NATSEventQueueProvider.java
│ ├── NATSStreamConfiguration.java
│ ├── NATSStreamEventQueueProvider.java
│ └── NATSStreamProperties.java
├── os-persistence/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── os/
│ │ └── config/
│ │ └── OpenSearchDeprecationConfiguration.java
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── os/
│ └── config/
│ └── OpenSearchDeprecationTest.java
├── os-persistence-v2/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── conductoross/
│ │ │ └── conductor/
│ │ │ └── os2/
│ │ │ ├── config/
│ │ │ │ ├── OpenSearchConditions.java
│ │ │ │ ├── OpenSearchConfiguration.java
│ │ │ │ └── OpenSearchProperties.java
│ │ │ └── dao/
│ │ │ ├── index/
│ │ │ │ ├── BulkRequestBuilderWrapper.java
│ │ │ │ ├── BulkRequestWrapper.java
│ │ │ │ ├── OpenSearchBaseDAO.java
│ │ │ │ └── OpenSearchRestDAO.java
│ │ │ └── query/
│ │ │ └── parser/
│ │ │ ├── Expression.java
│ │ │ ├── FilterProvider.java
│ │ │ ├── GroupedExpression.java
│ │ │ ├── NameValue.java
│ │ │ └── internal/
│ │ │ ├── AbstractNode.java
│ │ │ ├── BooleanOp.java
│ │ │ ├── ComparisonOp.java
│ │ │ ├── ConstValue.java
│ │ │ ├── FunctionThrowingException.java
│ │ │ ├── ListConst.java
│ │ │ ├── Name.java
│ │ │ ├── ParserException.java
│ │ │ └── Range.java
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ ├── mappings_docType_task.json
│ │ ├── mappings_docType_workflow.json
│ │ ├── template_event.json
│ │ ├── template_message.json
│ │ └── template_task_log.json
│ └── test/
│ ├── java/
│ │ └── org/
│ │ └── conductoross/
│ │ └── conductor/
│ │ └── os2/
│ │ ├── config/
│ │ │ └── OpenSearchPropertiesTest.java
│ │ ├── dao/
│ │ │ ├── index/
│ │ │ │ ├── OpenSearchRestDaoBaseTest.java
│ │ │ │ ├── OpenSearchTest.java
│ │ │ │ ├── TestBulkRequestBuilderWrapper.java
│ │ │ │ ├── TestOpenSearchRestDAO.java
│ │ │ │ └── TestOpenSearchRestDAOBatch.java
│ │ │ └── query/
│ │ │ └── parser/
│ │ │ ├── TestExpression.java
│ │ │ ├── TestGroupedExpression.java
│ │ │ └── internal/
│ │ │ ├── AbstractParserTest.java
│ │ │ ├── TestBooleanOp.java
│ │ │ ├── TestComparisonOp.java
│ │ │ ├── TestConstValue.java
│ │ │ └── TestName.java
│ │ └── utils/
│ │ └── TestUtils.java
│ └── resources/
│ ├── expected_template_task_log.json
│ ├── task_summary.json
│ └── workflow_summary.json
├── os-persistence-v3/
│ ├── MIGRATION_GUIDE.md
│ ├── MIGRATION_PLAN.md
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── conductoross/
│ │ │ └── conductor/
│ │ │ └── os3/
│ │ │ ├── config/
│ │ │ │ ├── OpenSearchConditions.java
│ │ │ │ ├── OpenSearchConfiguration.java
│ │ │ │ └── OpenSearchProperties.java
│ │ │ └── dao/
│ │ │ ├── index/
│ │ │ │ ├── OpenSearchBaseDAO.java
│ │ │ │ ├── OpenSearchRestDAO.java
│ │ │ │ └── QueryHelper.java
│ │ │ └── query/
│ │ │ └── parser/
│ │ │ ├── Expression.java
│ │ │ ├── FilterProvider.java
│ │ │ ├── GroupedExpression.java
│ │ │ ├── NameValue.java
│ │ │ └── internal/
│ │ │ ├── AbstractNode.java
│ │ │ ├── BooleanOp.java
│ │ │ ├── ComparisonOp.java
│ │ │ ├── ConstValue.java
│ │ │ ├── FunctionThrowingException.java
│ │ │ ├── ListConst.java
│ │ │ ├── Name.java
│ │ │ ├── ParserException.java
│ │ │ └── Range.java
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ ├── mappings_docType_task.json
│ │ ├── mappings_docType_workflow.json
│ │ ├── template_event.json
│ │ ├── template_message.json
│ │ └── template_task_log.json
│ └── test/
│ ├── java/
│ │ └── org/
│ │ └── conductoross/
│ │ └── conductor/
│ │ └── os3/
│ │ ├── config/
│ │ │ ├── OpenSearchModuleActivationTest.java.bak
│ │ │ ├── OpenSearchModuleActivationTest.java.bak2
│ │ │ └── OpenSearchPropertiesTest.java
│ │ ├── dao/
│ │ │ ├── index/
│ │ │ │ ├── OpenSearchRestDaoBaseTest.java
│ │ │ │ ├── OpenSearchTest.java
│ │ │ │ ├── QuickV3Test.java
│ │ │ │ ├── TestOpenSearchRestDAO.java
│ │ │ │ └── TestOpenSearchRestDAOBatch.java
│ │ │ └── query/
│ │ │ └── parser/
│ │ │ ├── TestExpression.java
│ │ │ ├── TestGroupedExpression.java
│ │ │ └── internal/
│ │ │ ├── AbstractParserTest.java
│ │ │ ├── TestBooleanOp.java
│ │ │ ├── TestComparisonOp.java
│ │ │ ├── TestConstValue.java
│ │ │ └── TestName.java
│ │ └── utils/
│ │ └── TestUtils.java
│ └── resources/
│ ├── expected_template_task_log.json
│ ├── task_summary.json
│ └── workflow_summary.json
├── polyglot-clients/
│ └── README.md
├── postgres-external-storage/
│ ├── README.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── postgres/
│ │ │ ├── config/
│ │ │ │ ├── PostgresPayloadConfiguration.java
│ │ │ │ └── PostgresPayloadProperties.java
│ │ │ ├── controller/
│ │ │ │ └── ExternalPostgresPayloadResource.java
│ │ │ └── storage/
│ │ │ └── PostgresPayloadStorage.java
│ │ └── resources/
│ │ └── db/
│ │ └── migration_external_postgres/
│ │ └── R__initial_schema.sql
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── postgres/
│ ├── controller/
│ │ └── ExternalPostgresPayloadResourceTest.java
│ └── storage/
│ ├── PostgresPayloadStorageTest.java
│ └── PostgresPayloadTestUtil.java
├── postgres-persistence/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── postgres/
│ │ │ ├── config/
│ │ │ │ ├── PostgresConfiguration.java
│ │ │ │ └── PostgresProperties.java
│ │ │ ├── dao/
│ │ │ │ ├── PostgresBaseDAO.java
│ │ │ │ ├── PostgresExecutionDAO.java
│ │ │ │ ├── PostgresIndexDAO.java
│ │ │ │ ├── PostgresLockDAO.java
│ │ │ │ ├── PostgresMetadataDAO.java
│ │ │ │ ├── PostgresPollDataDAO.java
│ │ │ │ └── PostgresQueueDAO.java
│ │ │ └── util/
│ │ │ ├── ExecuteFunction.java
│ │ │ ├── ExecutorsUtil.java
│ │ │ ├── LazyToString.java
│ │ │ ├── PostgresIndexQueryBuilder.java
│ │ │ ├── PostgresQueueListener.java
│ │ │ ├── Query.java
│ │ │ ├── QueryFunction.java
│ │ │ ├── QueueStats.java
│ │ │ ├── ResultSetHandler.java
│ │ │ └── TransactionalFunction.java
│ │ └── resources/
│ │ └── db/
│ │ ├── migration_postgres/
│ │ │ ├── V10__poll_data_check.sql
│ │ │ ├── V11__locking.sql
│ │ │ ├── V12__task_index_columns.sql
│ │ │ ├── V13.1__workflow_index_columns.sql
│ │ │ ├── V1__initial_schema.sql
│ │ │ ├── V2__1009_Fix_PostgresExecutionDAO_Index.sql
│ │ │ ├── V3__correlation_id_index.sql
│ │ │ ├── V4__new_qm_index_with_priority.sql
│ │ │ ├── V5__new_queue_message_pk.sql
│ │ │ ├── V6__update_pk.sql
│ │ │ ├── V7__new_qm_index_desc_priority.sql
│ │ │ ├── V8__indexing.sql
│ │ │ └── V9__indexing_index_fix.sql
│ │ ├── migration_postgres_data/
│ │ │ └── V13.2__workflow_index_backfill_update_time.sql
│ │ └── migration_postgres_notify/
│ │ └── V10.1__notify.sql
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ ├── postgres/
│ │ │ ├── config/
│ │ │ │ └── PostgresConfigurationDataMigrationTest.java
│ │ │ ├── dao/
│ │ │ │ ├── PostgresExecutionDAOTest.java
│ │ │ │ ├── PostgresIndexDAOStatusChangeOnlyTest.java
│ │ │ │ ├── PostgresIndexDAOTest.java
│ │ │ │ ├── PostgresLockDAOTest.java
│ │ │ │ ├── PostgresMetadataDAOTest.java
│ │ │ │ ├── PostgresPollDataDAOCacheTest.java
│ │ │ │ ├── PostgresPollDataDAONoCacheTest.java
│ │ │ │ └── PostgresQueueDAOTest.java
│ │ │ ├── performance/
│ │ │ │ └── PerformanceTest.java
│ │ │ └── util/
│ │ │ ├── PostgresIndexQueryBuilderTest.java
│ │ │ └── PostgresQueueListenerTest.java
│ │ └── test/
│ │ └── integration/
│ │ └── grpc/
│ │ └── postgres/
│ │ └── PostgresGrpcEndToEndTest.java
│ └── resources/
│ └── application.properties
├── redis-concurrency-limit/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── redis/
│ │ └── limit/
│ │ ├── RedisConcurrentExecutionLimitDAO.java
│ │ └── config/
│ │ ├── RedisConcurrentExecutionLimitConfiguration.java
│ │ └── RedisConcurrentExecutionLimitProperties.java
│ └── test/
│ └── groovy/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── redis/
│ └── limit/
│ └── RedisConcurrentExecutionLimitDAOSpec.groovy
├── redis-lock/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── redislock/
│ │ │ ├── config/
│ │ │ │ ├── RedisHealthIndicator.java
│ │ │ │ ├── RedisLockConfiguration.java
│ │ │ │ └── RedisLockProperties.java
│ │ │ └── lock/
│ │ │ └── RedisLock.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── additional-spring-configuration-metadata.json
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ ├── redis/
│ │ └── lock/
│ │ └── RedisLockTest.java
│ └── redislock/
│ └── config/
│ └── RedisHealthIndicatorTest.java
├── redis-persistence/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── netflix/
│ │ ├── conductor/
│ │ │ └── redis/
│ │ │ ├── config/
│ │ │ │ ├── AnyRedisCondition.java
│ │ │ │ ├── InMemoryRedisConfiguration.java
│ │ │ │ ├── JedisCommandsConfigurer.java
│ │ │ │ ├── RedisClusterConfiguration.java
│ │ │ │ ├── RedisProperties.java
│ │ │ │ ├── RedisSentinelConfiguration.java
│ │ │ │ └── RedisStandaloneConfiguration.java
│ │ │ ├── dao/
│ │ │ │ ├── BaseDynoDAO.java
│ │ │ │ ├── RedisEventHandlerDAO.java
│ │ │ │ ├── RedisExecutionDAO.java
│ │ │ │ ├── RedisMetadataDAO.java
│ │ │ │ ├── RedisPollDataDAO.java
│ │ │ │ └── RedisRateLimitingDAO.java
│ │ │ ├── dynoqueue/
│ │ │ │ ├── ConfigurationHostSupplier.java
│ │ │ │ └── LocalhostHostSupplier.java
│ │ │ └── jedis/
│ │ │ ├── JedisCluster.java
│ │ │ ├── JedisMock.java
│ │ │ ├── JedisProxy.java
│ │ │ ├── JedisSentinel.java
│ │ │ └── JedisStandalone.java
│ │ └── dyno/
│ │ └── connectionpool/
│ │ ├── Host.java
│ │ ├── HostBuilder.java
│ │ └── HostSupplier.java
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── redis/
│ ├── dao/
│ │ ├── BaseDynoDAOTest.java
│ │ ├── RedisEventHandlerDAOTest.java
│ │ ├── RedisExecutionDAOTest.java
│ │ ├── RedisMetadataDAOTest.java
│ │ ├── RedisPollDataDAOTest.java
│ │ └── RedisRateLimitDAOTest.java
│ └── jedis/
│ ├── ConfigurationHostSupplierTest.java
│ ├── JedisClusterTest.java
│ └── JedisSentinelTest.java
├── requirements.txt
├── rest/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ ├── com/
│ │ │ │ └── netflix/
│ │ │ │ └── conductor/
│ │ │ │ └── rest/
│ │ │ │ ├── config/
│ │ │ │ │ └── RequestMappingConstants.java
│ │ │ │ ├── controllers/
│ │ │ │ │ ├── AdminResource.java
│ │ │ │ │ ├── ApplicationExceptionMapper.java
│ │ │ │ │ ├── EventResource.java
│ │ │ │ │ ├── HealthCheckResource.java
│ │ │ │ │ ├── MetadataResource.java
│ │ │ │ │ ├── QueueAdminResource.java
│ │ │ │ │ ├── TaskResource.java
│ │ │ │ │ ├── ValidationExceptionMapper.java
│ │ │ │ │ ├── WorkflowBulkResource.java
│ │ │ │ │ └── WorkflowResource.java
│ │ │ │ └── startup/
│ │ │ │ └── KitchenSinkInitializer.java
│ │ │ └── org/
│ │ │ └── conductoross/
│ │ │ └── conductor/
│ │ │ ├── RestConfiguration.java
│ │ │ ├── SpaInterceptor.java
│ │ │ └── controllers/
│ │ │ └── VersionResource.java
│ │ └── resources/
│ │ ├── kitchensink/
│ │ │ ├── kitchenSink-ephemeralWorkflowWithEphemeralTasks.json
│ │ │ ├── kitchenSink-ephemeralWorkflowWithStoredTasks.json
│ │ │ ├── kitchensink.json
│ │ │ ├── sub_flow_1.json
│ │ │ ├── wf1.json
│ │ │ └── wf2.json
│ │ └── static/
│ │ └── index.html
│ └── test/
│ └── java/
│ ├── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── rest/
│ │ └── controllers/
│ │ ├── AdminResourceTest.java
│ │ ├── ApplicationExceptionMapperTest.java
│ │ ├── EventResourceTest.java
│ │ ├── MetadataResourceTest.java
│ │ ├── TaskResourceTest.java
│ │ └── WorkflowResourceTest.java
│ └── org/
│ └── conductoross/
│ └── conductor/
│ └── SpaInterceptorTest.java
├── scheduler/
│ ├── SCHEDULER_DAO_TEST_PLAN.md
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── conductoross/
│ │ │ └── conductor/
│ │ │ └── scheduler/
│ │ │ ├── config/
│ │ │ │ ├── SchedulerProperties.java
│ │ │ │ └── WorkflowSchedulerConfiguration.java
│ │ │ ├── dao/
│ │ │ │ ├── SchedulerCacheDAO.java
│ │ │ │ └── SchedulerDAO.java
│ │ │ ├── model/
│ │ │ │ ├── WorkflowSchedule.java
│ │ │ │ └── WorkflowScheduleExecution.java
│ │ │ ├── rest/
│ │ │ │ └── SchedulerResource.java
│ │ │ └── service/
│ │ │ └── SchedulerService.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── spring/
│ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ ├── test/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── conductoross/
│ │ │ └── conductor/
│ │ │ └── scheduler/
│ │ │ ├── config/
│ │ │ │ └── TestObjectMapperConfiguration.java
│ │ │ ├── rest/
│ │ │ │ ├── SchedulerResourceHttpTest.java
│ │ │ │ └── SchedulerResourceTest.java
│ │ │ └── service/
│ │ │ ├── SchedulerServicePhase2Test.java
│ │ │ ├── SchedulerServiceStressTest.java
│ │ │ └── SchedulerServiceTest.java
│ │ └── resources/
│ │ └── application.properties
│ └── testFixtures/
│ └── java/
│ └── org/
│ └── conductoross/
│ └── conductor/
│ └── scheduler/
│ ├── config/
│ │ └── AbstractSchedulerAutoConfigurationSmokeTest.java
│ ├── dao/
│ │ └── AbstractSchedulerDAOTest.java
│ └── service/
│ └── AbstractSchedulerServiceIntegrationTest.java
├── scheduler-mysql-persistence/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── conductoross/
│ │ │ └── conductor/
│ │ │ └── scheduler/
│ │ │ └── mysql/
│ │ │ ├── config/
│ │ │ │ └── MySQLSchedulerConfiguration.java
│ │ │ └── dao/
│ │ │ └── MySQLSchedulerDAO.java
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── db/
│ │ └── migration_scheduler_mysql/
│ │ └── V1__scheduler_tables.sql
│ └── test/
│ ├── java/
│ │ └── org/
│ │ └── conductoross/
│ │ └── conductor/
│ │ └── scheduler/
│ │ └── mysql/
│ │ ├── config/
│ │ │ └── MySQLSchedulerAutoConfigurationSmokeTest.java
│ │ ├── dao/
│ │ │ └── MySQLSchedulerDAOTest.java
│ │ └── service/
│ │ └── MySQLSchedulerServiceIntegrationTest.java
│ └── resources/
│ └── application.properties
├── scheduler-postgres-persistence/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── conductoross/
│ │ │ └── conductor/
│ │ │ └── scheduler/
│ │ │ └── postgres/
│ │ │ ├── config/
│ │ │ │ └── PostgresSchedulerConfiguration.java
│ │ │ └── dao/
│ │ │ └── PostgresSchedulerDAO.java
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── db/
│ │ └── migration_scheduler/
│ │ └── V1__scheduler_tables.sql
│ └── test/
│ ├── java/
│ │ └── org/
│ │ └── conductoross/
│ │ └── conductor/
│ │ └── scheduler/
│ │ └── postgres/
│ │ ├── config/
│ │ │ └── PostgresSchedulerAutoConfigurationSmokeTest.java
│ │ ├── dao/
│ │ │ └── PostgresSchedulerDAOTest.java
│ │ └── service/
│ │ └── PostgresSchedulerServiceIntegrationTest.java
│ └── resources/
│ └── application.properties
├── schemas/
│ ├── README.md
│ ├── Task.json
│ ├── TaskDef.json
│ ├── Workflow.json
│ └── WorkflowDef.json
├── scripts/
│ └── fetch-sdk-docs.py
├── serve-docs.sh
├── server/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── Conductor.java
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ └── additional-spring-configuration-metadata.json
│ │ ├── application.properties
│ │ ├── banner.txt
│ │ └── log4j2.xml
│ └── test/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── common/
│ └── config/
│ └── ConductorObjectMapperTest.java
├── server-lite/
│ ├── build.gradle
│ ├── build_ui.sh
│ └── src/
│ └── main/
│ ├── java/
│ │ └── org/
│ │ └── conductoross/
│ │ └── conductor/
│ │ └── Conductor.java
│ └── resources/
│ └── application.properties
├── settings.gradle
├── springboot-bom-overrides.gradle
├── sqlite-persistence/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── netflix/
│ │ │ └── conductor/
│ │ │ └── sqlite/
│ │ │ ├── config/
│ │ │ │ ├── SqliteConfiguration.java
│ │ │ │ └── SqliteProperties.java
│ │ │ ├── dao/
│ │ │ │ ├── SqliteBaseDAO.java
│ │ │ │ ├── SqliteExecutionDAO.java
│ │ │ │ ├── SqliteIndexDAO.java
│ │ │ │ ├── SqlitePollDataDAO.java
│ │ │ │ ├── SqliteQueueDAO.java
│ │ │ │ └── metadata/
│ │ │ │ ├── SqliteEventHandlerMetadataDAO.java
│ │ │ │ ├── SqliteMetadataDAO.java
│ │ │ │ ├── SqliteTaskMetadataDAO.java
│ │ │ │ └── SqliteWorkflowMetadataDAO.java
│ │ │ └── util/
│ │ │ ├── ExecuteFunction.java
│ │ │ ├── ExecutorsUtil.java
│ │ │ ├── LazyToString.java
│ │ │ ├── Query.java
│ │ │ ├── QueryFunction.java
│ │ │ ├── QueueStats.java
│ │ │ ├── ResultSetHandler.java
│ │ │ ├── SqliteIndexQueryBuilder.java
│ │ │ └── TransactionalFunction.java
│ │ └── resources/
│ │ └── db/
│ │ └── migration_sqlite/
│ │ └── V1__initial_schema.sql
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── sqlite/
│ │ └── dao/
│ │ ├── SqliteExecutionDAOTest.java
│ │ ├── SqliteIndexDAOTest.java
│ │ ├── SqliteMetadataDAOTest.java
│ │ ├── SqlitePollDataTest.java
│ │ └── SqliteQueueDAOTest.java
│ └── resources/
│ └── application.properties
├── task-status-listener/
│ ├── build.gradle
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ └── contribs/
│ └── listener/
│ ├── RestClientManager.java
│ ├── StatusNotifier.java
│ ├── StatusNotifierNotificationProperties.java
│ ├── TaskNotification.java
│ ├── TaskStatusPublisher.java
│ └── TaskStatusPublisherConfiguration.java
├── test-harness/
│ ├── build.gradle
│ └── src/
│ └── test/
│ ├── groovy/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── test/
│ │ ├── base/
│ │ │ ├── AbstractResiliencySpecification.groovy
│ │ │ └── AbstractSpecification.groovy
│ │ ├── integration/
│ │ │ ├── DecisionTaskSpec.groovy
│ │ │ ├── DoWhileSpec.groovy
│ │ │ ├── DynamicForkJoinSpec.groovy
│ │ │ ├── EventTaskSpec.groovy
│ │ │ ├── ExclusiveJoinSpec.groovy
│ │ │ ├── ExternalPayloadStorageSpec.groovy
│ │ │ ├── FailureWorkflowSpec.groovy
│ │ │ ├── ForkJoinSpec.groovy
│ │ │ ├── HierarchicalForkJoinSubworkflowRerunSpec.groovy
│ │ │ ├── HierarchicalForkJoinSubworkflowRestartSpec.groovy
│ │ │ ├── HierarchicalForkJoinSubworkflowRetrySpec.groovy
│ │ │ ├── JsonJQTransformSpec.groovy
│ │ │ ├── LambdaAndTerminateTaskSpec.groovy
│ │ │ ├── NestedForkJoinSubWorkflowSpec.groovy
│ │ │ ├── S3ExternalPayloadStorageE2ESpec.groovy
│ │ │ ├── SQSEventQueueE2ESpec.groovy
│ │ │ ├── SetVariableTaskSpec.groovy
│ │ │ ├── SimpleWorkflowSpec.groovy
│ │ │ ├── StartWorkflowSpec.groovy
│ │ │ ├── SubWorkflowRerunSpec.groovy
│ │ │ ├── SubWorkflowRestartSpec.groovy
│ │ │ ├── SubWorkflowRetrySpec.groovy
│ │ │ ├── SubWorkflowSpec.groovy
│ │ │ ├── SwitchTaskSpec.groovy
│ │ │ ├── SystemTaskSpec.groovy
│ │ │ ├── TaskLimitsWorkflowSpec.groovy
│ │ │ ├── TestWorkflowSpec.groovy
│ │ │ ├── WaitTaskSpec.groovy
│ │ │ └── WorkflowAndTaskConfigurationSpec.groovy
│ │ ├── resiliency/
│ │ │ ├── QueueResiliencySpec.groovy
│ │ │ └── TaskResiliencySpec.groovy
│ │ └── util/
│ │ └── WorkflowTestUtil.groovy
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ ├── ConductorTestApp.java
│ │ └── test/
│ │ ├── config/
│ │ │ ├── LocalStackS3Configuration.java
│ │ │ └── LocalStackSQSConfiguration.java
│ │ ├── integration/
│ │ │ ├── TestHarnessAbstractEndToEndTest.java
│ │ │ ├── grpc/
│ │ │ │ ├── GrpcEndToEndTest.java
│ │ │ │ └── TestHarnessAbstractGrpcEndToEndTest.java
│ │ │ └── http/
│ │ │ ├── ForkJoinSyncModeIntegrationTest.java
│ │ │ ├── HttpEndToEndTestTestHarness.java
│ │ │ └── TestHarnessAbstractHttpEndToEndTest.java
│ │ └── utils/
│ │ ├── MockExternalPayloadStorage.java
│ │ └── UserTask.java
│ └── resources/
│ ├── application-integrationtest.properties
│ ├── application-s3test.properties
│ ├── application-sqstest.properties
│ ├── concurrency_limited_task_workflow_integration_test.json
│ ├── conditional_switch_task_workflow_integration_test.json
│ ├── conditional_system_task_workflow_integration_test.json
│ ├── conditional_task_workflow_integration_test.json
│ ├── decision_and_fork_join_integration_test.json
│ ├── decision_and_terminate_integration_test.json
│ ├── do_while_as_subtask_integration_test.json
│ ├── do_while_cleanup_demo.json
│ ├── do_while_five_loop_over_integration_test.json
│ ├── do_while_high_iteration_test.json
│ ├── do_while_integration_test.json
│ ├── do_while_iteration_fix_test.json
│ ├── do_while_multiple_integration_test.json
│ ├── do_while_set_variable_fix.json
│ ├── do_while_sub_workflow_integration_test.json
│ ├── do_while_system_tasks.json
│ ├── do_while_timeline_ui_demo.json
│ ├── do_while_with_decision_task.json
│ ├── dynamic_fork_join_integration_test.json
│ ├── event_workflow_integration_test.json
│ ├── exclusive_join_integration_test.json
│ ├── failure_workflow_for_terminate_task_workflow.json
│ ├── fork_join_integration_test.json
│ ├── fork_join_permissive_integration_test.json
│ ├── fork_join_sub_workflow.json
│ ├── fork_join_sync_mode_integration_test.json
│ ├── fork_join_sync_nested_integration_test.json
│ ├── fork_join_sync_optional_fail_integration_test.json
│ ├── fork_join_with_no_permissive_task_retry_integration_test.json
│ ├── fork_join_with_no_task_retry_integration_test.json
│ ├── fork_join_with_optional_sub_workflow_forks_integration_test.json
│ ├── hierarchical_fork_join_swf.json
│ ├── input.json
│ ├── json_jq_transform_result_integration_test.json
│ ├── nested_fork_join_integration_test.json
│ ├── nested_fork_join_swf.json
│ ├── nested_fork_join_with_sub_workflow_integration_test.json
│ ├── output.json
│ ├── rate_limited_simple_task_workflow_integration_test.json
│ ├── rate_limited_system_task_workflow_integration_test.json
│ ├── sequential_json_jq_transform_integration_test.json
│ ├── set_variable_workflow_integration_test.json
│ ├── simple_decision_task_integration_test.json
│ ├── simple_json_jq_transform_integration_test.json
│ ├── simple_lambda_workflow_integration_test.json
│ ├── simple_one_task_sub_workflow_integration_test.json
│ ├── simple_set_variable_workflow_integration_test.json
│ ├── simple_switch_task_integration_test.json
│ ├── simple_wait_task_workflow_integration_test.json
│ ├── simple_workflow_1_input_template_integration_test.json
│ ├── simple_workflow_1_integration_test.json
│ ├── simple_workflow_3_integration_test.json
│ ├── simple_workflow_with_async_complete_system_task_integration_test.json
│ ├── simple_workflow_with_optional_task_integration_test.json
│ ├── simple_workflow_with_permissive_optional_task_integration_test.json
│ ├── simple_workflow_with_permissive_task_integration_test.json
│ ├── simple_workflow_with_resp_time_out_integration_test.json
│ ├── simple_workflow_with_sub_workflow_inline_def_integration_test.json
│ ├── sqs-complete-wait-event-handler.json
│ ├── sqs-test-workflow.json
│ ├── start_workflow_input.json
│ ├── switch_and_fork_join_integration_test.json
│ ├── switch_and_terminate_integration_test.json
│ ├── switch_with_no_default_case_integration_test.json
│ ├── terminate_task_completed_workflow_integration_test.json
│ ├── terminate_task_failed_workflow_integration.json
│ ├── terminate_task_parent_workflow.json
│ ├── terminate_task_sub_workflow.json
│ ├── terminate_task_terminated_status_in_do_while_test.json
│ ├── terminate_task_terminated_status_test.json
│ ├── test_task_failed_parent_workflow.json
│ ├── test_task_failed_sub_workflow.json
│ ├── wait_workflow_integration_test.json
│ ├── workflow_that_starts_another_workflow.json
│ ├── workflow_with_sub_workflow_1_integration_test.json
│ └── workflow_with_synchronous_system_task.json
├── test-util/
│ ├── build.gradle
│ └── src/
│ └── test/
│ ├── groovy/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── test/
│ │ ├── base/
│ │ │ ├── AbstractResiliencySpecification.groovy
│ │ │ └── AbstractSpecification.groovy
│ │ └── util/
│ │ └── WorkflowTestUtil.groovy
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ ├── ConductorTestApp.java
│ │ ├── common/
│ │ │ └── config/
│ │ │ └── TestObjectMapperConfiguration.java
│ │ └── test/
│ │ └── integration/
│ │ ├── AbstractEndToEndTest.java
│ │ └── grpc/
│ │ └── AbstractGrpcEndToEndTest.java
│ └── resources/
│ └── application-integrationtest.properties
├── test-workflow.sh
├── ui/
│ ├── .eslintrc
│ ├── .gitignore
│ ├── .prettierignore
│ ├── .prettierrc.json
│ ├── README.md
│ ├── cypress/
│ │ ├── e2e/
│ │ │ └── spec.cy.js
│ │ ├── fixtures/
│ │ │ ├── doWhile/
│ │ │ │ └── doWhileSwitch.json
│ │ │ ├── dynamicFork/
│ │ │ │ ├── externalizedInput.json
│ │ │ │ ├── noneSpawned.json
│ │ │ │ ├── notExecuted.json
│ │ │ │ ├── oneFailed.json
│ │ │ │ └── success.json
│ │ │ ├── dynamicFork.json
│ │ │ ├── metadataTasks.json
│ │ │ ├── metadataWorkflow.json
│ │ │ ├── taskSearch.json
│ │ │ └── workflowSearch.json
│ │ └── support/
│ │ ├── commands.ts
│ │ ├── component-index.html
│ │ ├── component.ts
│ │ └── e2e.ts
│ ├── cypress.config.ts
│ ├── package.json
│ ├── public/
│ │ ├── index.html
│ │ └── robots.txt
│ ├── src/
│ │ ├── App.jsx
│ │ ├── components/
│ │ │ ├── Banner.jsx
│ │ │ ├── Button.jsx
│ │ │ ├── ButtonGroup.jsx
│ │ │ ├── ConfirmChoiceDialog.jsx
│ │ │ ├── CustomButtons.jsx
│ │ │ ├── DataTable.jsx
│ │ │ ├── DateRangePicker.jsx
│ │ │ ├── Dropdown.jsx
│ │ │ ├── DropdownButton.jsx
│ │ │ ├── Heading.jsx
│ │ │ ├── Input.jsx
│ │ │ ├── KeyValueTable.jsx
│ │ │ ├── LinearProgress.jsx
│ │ │ ├── NavLink.jsx
│ │ │ ├── Paper.jsx
│ │ │ ├── Pill.jsx
│ │ │ ├── PrimaryButton.jsx
│ │ │ ├── ReactJson.jsx
│ │ │ ├── SecondaryButton.jsx
│ │ │ ├── Select.jsx
│ │ │ ├── SplitButton.jsx
│ │ │ ├── StatusBadge.jsx
│ │ │ ├── Tabs.jsx
│ │ │ ├── TaskLink.jsx
│ │ │ ├── TaskNameInput.jsx
│ │ │ ├── TertiaryButton.jsx
│ │ │ ├── Text.jsx
│ │ │ ├── WorkflowNameInput.jsx
│ │ │ ├── definitionList/
│ │ │ │ └── DefinitionList.jsx
│ │ │ ├── diagram/
│ │ │ │ ├── PanAndZoomWrapper.jsx
│ │ │ │ ├── TaskPointer.d.ts
│ │ │ │ ├── TaskResult.d.ts
│ │ │ │ ├── WorkflowDAG.js
│ │ │ │ ├── WorkflowGraph.jsx
│ │ │ │ ├── WorkflowGraph.test.cy.js
│ │ │ │ ├── ZoomControlButton.jsx
│ │ │ │ ├── ZoomControls.jsx
│ │ │ │ └── diagram.scss
│ │ │ ├── formik/
│ │ │ │ ├── FormikCronEditor.jsx
│ │ │ │ ├── FormikDropdown.jsx
│ │ │ │ ├── FormikInput.jsx
│ │ │ │ ├── FormikJsonInput.jsx
│ │ │ │ ├── FormikStatusDropdown.jsx
│ │ │ │ ├── FormikSwitch.jsx
│ │ │ │ ├── FormikVersionDropdown.jsx
│ │ │ │ ├── FormikWorkflowNameInput.jsx
│ │ │ │ └── cron.css
│ │ │ ├── icons/
│ │ │ │ ├── FitToFrame.jsx
│ │ │ │ ├── Home.jsx
│ │ │ │ ├── Minus.jsx
│ │ │ │ └── Plus.jsx
│ │ │ └── index.js
│ │ ├── data/
│ │ │ ├── actions.js
│ │ │ ├── bulkactions.js
│ │ │ ├── common.js
│ │ │ ├── eventHandler.js
│ │ │ ├── misc.js
│ │ │ ├── task.js
│ │ │ └── workflow.js
│ │ ├── hooks/
│ │ │ └── useTime.js
│ │ ├── index.css
│ │ ├── index.js
│ │ ├── pages/
│ │ │ ├── definition/
│ │ │ │ ├── EventHandlerDefinition.jsx
│ │ │ │ ├── ResetConfirmationDialog.jsx
│ │ │ │ ├── SaveEventHandlerDialog.jsx
│ │ │ │ ├── SaveTaskDialog.jsx
│ │ │ │ ├── SaveWorkflowDialog.jsx
│ │ │ │ ├── TaskDefinition.jsx
│ │ │ │ └── WorkflowDefinition.jsx
│ │ │ ├── definitions/
│ │ │ │ ├── EventHandler.jsx
│ │ │ │ ├── Header.jsx
│ │ │ │ ├── Task.jsx
│ │ │ │ └── Workflow.jsx
│ │ │ ├── errors/
│ │ │ │ ├── ErrorsInspector.jsx
│ │ │ │ ├── components/
│ │ │ │ │ ├── FailureReasonChart.jsx
│ │ │ │ │ ├── LiveTailButton.jsx
│ │ │ │ │ ├── Notification.jsx
│ │ │ │ │ ├── StatusChart.jsx
│ │ │ │ │ ├── SummaryCard.jsx
│ │ │ │ │ ├── TimeRangeDropdown.jsx
│ │ │ │ │ ├── TimeSeriesChart.jsx
│ │ │ │ │ └── WorkflowTypeChart.jsx
│ │ │ │ ├── errorsInspectorStyles.js
│ │ │ │ └── hooks/
│ │ │ │ └── useWorkflowErrorGroups.js
│ │ │ ├── execution/
│ │ │ │ ├── ActionModule.jsx
│ │ │ │ ├── Execution.jsx
│ │ │ │ ├── ExecutionInputOutput.jsx
│ │ │ │ ├── ExecutionJson.jsx
│ │ │ │ ├── ExecutionSummary.jsx
│ │ │ │ ├── Legend.jsx
│ │ │ │ ├── RightPanel.jsx
│ │ │ │ ├── TaskDetails.jsx
│ │ │ │ ├── TaskHuman.jsx
│ │ │ │ ├── TaskHumanForm.jsx
│ │ │ │ ├── TaskList.jsx
│ │ │ │ ├── TaskLogs.jsx
│ │ │ │ ├── TaskPollData.jsx
│ │ │ │ ├── TaskSummary.jsx
│ │ │ │ ├── Timeline.jsx
│ │ │ │ ├── Timeline.test.cy.js
│ │ │ │ └── timeline.scss
│ │ │ ├── executions/
│ │ │ │ ├── BulkActionModule.jsx
│ │ │ │ ├── ResultsTable.jsx
│ │ │ │ ├── SearchTabs.jsx
│ │ │ │ ├── TaskResultsTable.jsx
│ │ │ │ ├── TaskSearch.jsx
│ │ │ │ ├── WorkflowSearch.jsx
│ │ │ │ └── executionsStyles.js
│ │ │ ├── kitchensink/
│ │ │ │ ├── DataTableDemo.jsx
│ │ │ │ ├── DiagramTest.jsx
│ │ │ │ ├── Dropdown.jsx
│ │ │ │ ├── EnhancedTable.jsx
│ │ │ │ ├── Examples.jsx
│ │ │ │ ├── Gantt.jsx
│ │ │ │ ├── KitchenSink.jsx
│ │ │ │ └── sampleMovieData.js
│ │ │ ├── misc/
│ │ │ │ └── TaskQueue.jsx
│ │ │ ├── styles.js
│ │ │ └── workbench/
│ │ │ ├── ExecutionHistory.jsx
│ │ │ ├── RunHistory.tsx
│ │ │ ├── Workbench.jsx
│ │ │ └── WorkbenchForm.jsx
│ │ ├── plugins/
│ │ │ ├── AppBarModules.jsx
│ │ │ ├── AppLogo.jsx
│ │ │ ├── CustomAppBarButtons.jsx
│ │ │ ├── CustomRoutes.jsx
│ │ │ ├── constants.js
│ │ │ ├── customTypeRenderers.jsx
│ │ │ ├── env.js
│ │ │ └── fetch.js
│ │ ├── react-app-env.d.ts
│ │ ├── schema/
│ │ │ ├── eventHandler.js
│ │ │ ├── task.js
│ │ │ └── workflow.js
│ │ ├── serviceWorker.js
│ │ ├── setupProxy.js
│ │ ├── setupTests.js
│ │ ├── theme/
│ │ │ ├── colorOverrides.js
│ │ │ ├── colors.js
│ │ │ ├── index.js
│ │ │ ├── provider.jsx
│ │ │ ├── theme.js
│ │ │ └── variables.js
│ │ └── utils/
│ │ ├── constants.js
│ │ ├── helperFunctions.js
│ │ ├── helpers.js
│ │ ├── localstorage.ts
│ │ └── path.js
│ ├── test-karbon.sh
│ └── tsconfig.json
├── ui-next/
│ ├── .gitignore
│ ├── .npmrc
│ ├── .prettierignore
│ ├── .prettierrc.json
│ ├── README.md
│ ├── eslint.config.mjs
│ ├── index.html
│ ├── package.json
│ ├── public/
│ │ ├── context.js
│ │ ├── context.js.example
│ │ └── robots.txt
│ ├── src/
│ │ ├── commonServices/
│ │ │ ├── execution.ts
│ │ │ └── index.ts
│ │ ├── components/
│ │ │ ├── ActionButton.tsx
│ │ │ ├── App.tsx
│ │ │ ├── AutoCompleteWithDescription.tsx
│ │ │ ├── AutoRefreshButton.tsx
│ │ │ ├── Banner.jsx
│ │ │ ├── ButtonGroup.jsx
│ │ │ ├── ButtonTooltip.tsx
│ │ │ ├── CenteredSpinner.tsx
│ │ │ ├── ClipboardCopy.tsx
│ │ │ ├── CodeBlockInput.tsx
│ │ │ ├── ConfirmChoiceDialog.tsx
│ │ │ ├── CustomButton.tsx
│ │ │ ├── DataTable/
│ │ │ │ ├── ColumnSelector.tsx
│ │ │ │ ├── DataTable.tsx
│ │ │ │ ├── Filter.tsx
│ │ │ │ ├── QuickSearch.tsx
│ │ │ │ ├── TableRefreshButton.tsx
│ │ │ │ ├── TagFilter.tsx
│ │ │ │ ├── helpers.test.ts
│ │ │ │ ├── helpers.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── state/
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── guards.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── services.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── styles.ts
│ │ │ │ └── types.ts
│ │ │ ├── DateRangePicker.tsx
│ │ │ ├── DiffEditor/
│ │ │ │ ├── DiffEditor.tsx
│ │ │ │ └── diff-editor.css
│ │ │ ├── DocLink.tsx
│ │ │ ├── Dropdown.tsx
│ │ │ ├── DropdownButton.tsx
│ │ │ ├── EditInPlace.tsx
│ │ │ ├── EmptyPageIntro.tsx
│ │ │ ├── ErrorBoundary.tsx
│ │ │ ├── FeatureDisabledComponent.tsx
│ │ │ ├── FeatureDisabledWrapper.tsx
│ │ │ ├── FloatingMuiAlert.tsx
│ │ │ ├── GetStartedSample/
│ │ │ │ ├── GetStartedSample.tsx
│ │ │ │ ├── components/
│ │ │ │ │ └── CodeSnippet.tsx
│ │ │ │ └── types.ts
│ │ │ ├── Header.tsx
│ │ │ ├── Heading.jsx
│ │ │ ├── HelperText.jsx
│ │ │ ├── InlineEdit.tsx
│ │ │ ├── Input.tsx
│ │ │ ├── InputNumber.tsx
│ │ │ ├── IntegrationIcon.tsx
│ │ │ ├── IntegrationsIcon.tsx
│ │ │ ├── KeyValueTable.jsx
│ │ │ ├── LinearProgress.tsx
│ │ │ ├── MetricsChart.tsx
│ │ │ ├── MuiAlert.tsx
│ │ │ ├── MuiButton.tsx
│ │ │ ├── MuiButtonGroup.tsx
│ │ │ ├── MuiCheckbox.tsx
│ │ │ ├── MuiIconButton.tsx
│ │ │ ├── MuiTypography.tsx
│ │ │ ├── NavLink.jsx
│ │ │ ├── NavLink.tsx
│ │ │ ├── NoDataComponent.tsx
│ │ │ ├── PanelAccordion.tsx
│ │ │ ├── Paper.tsx
│ │ │ ├── PromptVariables.tsx
│ │ │ ├── Puller.tsx
│ │ │ ├── RadioButtonGroup.tsx
│ │ │ ├── ReactJson.tsx
│ │ │ ├── RoleTagChip.tsx
│ │ │ ├── SafariWarning.tsx
│ │ │ ├── SearchEverything.tsx
│ │ │ ├── Select.tsx
│ │ │ ├── Sidebar/
│ │ │ │ ├── BaseSubMenu.tsx
│ │ │ │ ├── ClosedLogo.tsx
│ │ │ │ ├── HotKeysButton.tsx
│ │ │ │ ├── OpenedLogo.tsx
│ │ │ │ ├── RunWorkflowButton.tsx
│ │ │ │ ├── Sidebar.tsx
│ │ │ │ ├── SidebarFooter.tsx
│ │ │ │ ├── SidebarHeader.tsx
│ │ │ │ ├── SidebarItem.tsx
│ │ │ │ ├── SidebarMenu.tsx
│ │ │ │ ├── SidebarToggleButton.tsx
│ │ │ │ ├── SidebarVersionBlock.tsx
│ │ │ │ ├── SubMenu.tsx
│ │ │ │ ├── UiSidebar.tsx
│ │ │ │ ├── UserInfo.tsx
│ │ │ │ ├── constants.ts
│ │ │ │ ├── context/
│ │ │ │ │ ├── SidebarContext.tsx
│ │ │ │ │ └── SidebarContextProvider.tsx
│ │ │ │ ├── createSidebar.ts
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── usePendingTasksCount.ts
│ │ │ │ │ └── useSidebarHover.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── sidebarCoreItems.tsx
│ │ │ │ ├── styles.ts
│ │ │ │ └── types.ts
│ │ │ ├── SnackbarMessage.tsx
│ │ │ ├── SplitButton.jsx
│ │ │ ├── StackTrace.tsx
│ │ │ ├── StatusBadge.tsx
│ │ │ ├── StatusTagChip.tsx
│ │ │ ├── StrikedText.tsx
│ │ │ ├── StringArrayFormField.tsx
│ │ │ ├── SubjectSelector/
│ │ │ │ ├── SubjectMultiPicker.tsx
│ │ │ │ ├── SubjectSelector.tsx
│ │ │ │ ├── helpers.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── types.ts
│ │ │ ├── SubmitFormWrapper.jsx
│ │ │ ├── Tabs.jsx
│ │ │ ├── TagChip.tsx
│ │ │ ├── Text.jsx
│ │ │ ├── TwoPanesDivider.jsx
│ │ │ ├── UIModal.tsx
│ │ │ ├── WorkflowStatusBadge.tsx
│ │ │ ├── agent/
│ │ │ │ ├── Agent.tsx
│ │ │ │ ├── AgentContext.tsx
│ │ │ │ ├── AgentEditorController.tsx
│ │ │ │ ├── agent-types.ts
│ │ │ │ └── helpers.ts
│ │ │ ├── auth/
│ │ │ │ └── AuthGuard.tsx
│ │ │ ├── charts/
│ │ │ │ ├── CacheChart.tsx
│ │ │ │ ├── ErrorsChart.tsx
│ │ │ │ ├── LatencyChart.tsx
│ │ │ │ ├── RequestsChart.tsx
│ │ │ │ ├── chartUtils.ts
│ │ │ │ └── index.ts
│ │ │ ├── coPilot/
│ │ │ │ └── CoPilot.tsx
│ │ │ ├── conductorTooltip/
│ │ │ │ └── ConductorTooltip.tsx
│ │ │ ├── definitionList/
│ │ │ │ └── DefinitionList.jsx
│ │ │ ├── diagram/
│ │ │ │ └── diagram.scss
│ │ │ ├── flow/
│ │ │ │ ├── Flow.tsx
│ │ │ │ ├── FlowFullscreen.scss
│ │ │ │ ├── ReaflowOverrides.scss
│ │ │ │ ├── components/
│ │ │ │ │ ├── RichAddTaskMenu/
│ │ │ │ │ │ ├── AddTaskSidebar.tsx
│ │ │ │ │ │ ├── IntegrationDrillDownContent.tsx
│ │ │ │ │ │ ├── QuickAddMenu.tsx
│ │ │ │ │ │ ├── helpers.ts
│ │ │ │ │ │ ├── iconsForTaskTypes.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── state/
│ │ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ │ ├── guards.ts
│ │ │ │ │ │ │ ├── hook.ts
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ │ ├── services.ts
│ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ ├── supportedTasks.ts
│ │ │ │ │ │ └── taskGenerator.ts
│ │ │ │ │ ├── graphs/
│ │ │ │ │ │ ├── CustomEdgeButton.tsx
│ │ │ │ │ │ ├── CustomLabel.tsx
│ │ │ │ │ │ ├── CustomNode.jsx
│ │ │ │ │ │ ├── CustomPort.jsx
│ │ │ │ │ │ ├── PanAndZoomWrapper/
│ │ │ │ │ │ │ ├── PanAndZoomProvider.tsx
│ │ │ │ │ │ │ ├── PanAndZoomWrapper.tsx
│ │ │ │ │ │ │ ├── SearchBox.tsx
│ │ │ │ │ │ │ ├── ZoomControls.tsx
│ │ │ │ │ │ │ ├── constants.ts
│ │ │ │ │ │ │ ├── icons/
│ │ │ │ │ │ │ │ ├── DragNDrop.tsx
│ │ │ │ │ │ │ │ ├── Home.tsx
│ │ │ │ │ │ │ │ ├── Minus.tsx
│ │ │ │ │ │ │ │ ├── Plus.tsx
│ │ │ │ │ │ │ │ └── Search.tsx
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── state/
│ │ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ │ ├── context.tsx
│ │ │ │ │ │ │ ├── helpers.test.ts
│ │ │ │ │ │ │ ├── helpers.ts
│ │ │ │ │ │ │ ├── hook.ts
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── shapes/
│ │ │ │ │ ├── DecisionOperator.tsx
│ │ │ │ │ ├── DoWhileTask.jsx
│ │ │ │ │ ├── DynamicTasksCards.jsx
│ │ │ │ │ ├── StarShape.jsx
│ │ │ │ │ ├── SubWorkflowTask.jsx
│ │ │ │ │ ├── SwitchJoinPseudoTask.jsx
│ │ │ │ │ ├── TaskCard/
│ │ │ │ │ │ ├── AddPathButton.tsx
│ │ │ │ │ │ ├── CardAttemptsBadge.jsx
│ │ │ │ │ │ ├── CardIcon.jsx
│ │ │ │ │ │ ├── CardLabel.jsx
│ │ │ │ │ │ ├── CardStatusBadge.jsx
│ │ │ │ │ │ ├── DeleteButton.tsx
│ │ │ │ │ │ ├── DynamicTask.tsx
│ │ │ │ │ │ ├── EventTask.jsx
│ │ │ │ │ │ ├── ForkJoinDynamicTask.jsx
│ │ │ │ │ │ ├── HTTPPollTask.jsx
│ │ │ │ │ │ ├── HTTPTask.jsx
│ │ │ │ │ │ ├── INLINETask.jsx
│ │ │ │ │ │ ├── JDBCTask.tsx
│ │ │ │ │ │ ├── JSONJQTransformTask.jsx
│ │ │ │ │ │ ├── KAFKATask.jsx
│ │ │ │ │ │ ├── SimpleTask.jsx
│ │ │ │ │ │ ├── StartWorkflowTask.jsx
│ │ │ │ │ │ ├── SwitchAdd.tsx
│ │ │ │ │ │ ├── TaskCard.tsx
│ │ │ │ │ │ ├── WaitTaskInfo.tsx
│ │ │ │ │ │ ├── helpers.test.ts
│ │ │ │ │ │ ├── helpers.ts
│ │ │ │ │ │ └── icons/
│ │ │ │ │ │ ├── Buildings.jsx
│ │ │ │ │ │ ├── BusinessRule.tsx
│ │ │ │ │ │ ├── CheckIcon.jsx
│ │ │ │ │ │ ├── DeleteIcon.jsx
│ │ │ │ │ │ ├── DynamicFanout.tsx
│ │ │ │ │ │ ├── DynamicFork.tsx
│ │ │ │ │ │ ├── Event.tsx
│ │ │ │ │ │ ├── ExclamationCircleIcon.jsx
│ │ │ │ │ │ ├── ForkIcon.tsx
│ │ │ │ │ │ ├── ForkJoinIcon.tsx
│ │ │ │ │ │ ├── GetDocument.tsx
│ │ │ │ │ │ ├── GetWorkflow.tsx
│ │ │ │ │ │ ├── Http.tsx
│ │ │ │ │ │ ├── HttpPoll.tsx
│ │ │ │ │ │ ├── Inline.tsx
│ │ │ │ │ │ ├── Json.tsx
│ │ │ │ │ │ ├── Kafka.jsx
│ │ │ │ │ │ ├── LlmChatComplete.tsx
│ │ │ │ │ │ ├── LlmGenerateEmbeddings.tsx
│ │ │ │ │ │ ├── LlmGetEmbeddings.tsx
│ │ │ │ │ │ ├── LlmIndexDocument.tsx
│ │ │ │ │ │ ├── LlmIndexText.tsx
│ │ │ │ │ │ ├── LlmSearchIndex.tsx
│ │ │ │ │ │ ├── LlmStoreEmbeddings.jsx
│ │ │ │ │ │ ├── LlmTextComplete.tsx
│ │ │ │ │ │ ├── LoopIcon.tsx
│ │ │ │ │ │ ├── MCPIcon.tsx
│ │ │ │ │ │ ├── MergeIcon.tsx
│ │ │ │ │ │ ├── MinusIcon.jsx
│ │ │ │ │ │ ├── OpsGenie.tsx
│ │ │ │ │ │ ├── PlusIcon.jsx
│ │ │ │ │ │ ├── QueryProcessor.tsx
│ │ │ │ │ │ ├── Sendgrid.tsx
│ │ │ │ │ │ ├── Simple.tsx
│ │ │ │ │ │ ├── StackIcon.jsx
│ │ │ │ │ │ ├── SubWorkflow.tsx
│ │ │ │ │ │ ├── Switch.tsx
│ │ │ │ │ │ ├── Terminate.tsx
│ │ │ │ │ │ ├── TerminateWorkFlow.tsx
│ │ │ │ │ │ ├── UpdateSecret.tsx
│ │ │ │ │ │ ├── UpdateTaskIcon.tsx
│ │ │ │ │ │ ├── Variable.tsx
│ │ │ │ │ │ ├── Wait.tsx
│ │ │ │ │ │ ├── WaitForWebhook.tsx
│ │ │ │ │ │ ├── WarningIcon.jsx
│ │ │ │ │ │ ├── WorkFlow.tsx
│ │ │ │ │ │ ├── Worker.tsx
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ ├── TaskDescription.tsx
│ │ │ │ │ ├── TaskShape/
│ │ │ │ │ │ ├── Shape.tsx
│ │ │ │ │ │ ├── TaskShape.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── TaskSummary.jsx
│ │ │ │ │ ├── TerminalTask.jsx
│ │ │ │ │ ├── styles.ts
│ │ │ │ │ └── testDiagrams.js
│ │ │ │ ├── dragDrop/
│ │ │ │ │ ├── DraggableOverlay.tsx
│ │ │ │ │ ├── Handle.tsx
│ │ │ │ │ ├── boxCollision.ts
│ │ │ │ │ ├── hooks.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── nodes/
│ │ │ │ │ ├── constants.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── layoutTestData.js
│ │ │ │ │ └── mapper/
│ │ │ │ │ ├── common.test.ts
│ │ │ │ │ ├── common.ts
│ │ │ │ │ ├── constants.ts
│ │ │ │ │ ├── core.test.js
│ │ │ │ │ ├── core.ts
│ │ │ │ │ ├── crumbs.test.ts
│ │ │ │ │ ├── crumbs.ts
│ │ │ │ │ ├── doWhile.ts
│ │ │ │ │ ├── edgeMapper.test.js
│ │ │ │ │ ├── edgeMapper.ts
│ │ │ │ │ ├── forkJoin.test.js
│ │ │ │ │ ├── forkJoin.ts
│ │ │ │ │ ├── forkJoinDynamic.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── join.test.js
│ │ │ │ │ ├── join.ts
│ │ │ │ │ ├── layout.js
│ │ │ │ │ ├── ports.ts
│ │ │ │ │ ├── predicates.ts
│ │ │ │ │ ├── subWorkflow.test.js
│ │ │ │ │ ├── subWorkflow.ts
│ │ │ │ │ ├── switch.test.js
│ │ │ │ │ ├── switch.ts
│ │ │ │ │ ├── terminal.ts
│ │ │ │ │ ├── terminate.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── state/
│ │ │ │ │ ├── FlowActorContext.tsx
│ │ │ │ │ ├── action.ts
│ │ │ │ │ ├── context.tsx
│ │ │ │ │ ├── guards.ts
│ │ │ │ │ ├── helpers.js
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── selectors.ts
│ │ │ │ │ ├── service.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── testUtils.js
│ │ │ │ └── theme.ts
│ │ │ ├── index.ts
│ │ │ ├── reactHookForm/
│ │ │ │ ├── ReactHookFormDropdown.tsx
│ │ │ │ └── ReactHookFormInput.tsx
│ │ │ ├── searchWrapper/
│ │ │ │ ├── SearchWrapper.tsx
│ │ │ │ └── state/
│ │ │ │ ├── actions.ts
│ │ │ │ ├── helpers.test.ts
│ │ │ │ ├── helpers.ts
│ │ │ │ ├── hook.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── machine.ts
│ │ │ │ ├── services.ts
│ │ │ │ └── types.ts
│ │ │ ├── tags/
│ │ │ │ ├── AddTagDialog.tsx
│ │ │ │ └── ReplaceTagsInput.tsx
│ │ │ └── v1/
│ │ │ ├── ActionAlert.tsx
│ │ │ ├── AdvancedSearchFieldPopper.tsx
│ │ │ ├── ApiSearchModal/
│ │ │ │ ├── ApiSearchModal.tsx
│ │ │ │ └── index.ts
│ │ │ ├── ArrowBox.tsx
│ │ │ ├── CodeBlockInputWrapper.tsx
│ │ │ ├── CodeSnippet.tsx
│ │ │ ├── ConductorArrayField.tsx
│ │ │ ├── ConductorAutoComplete.tsx
│ │ │ ├── ConductorAutoCompleteWithDescription.tsx
│ │ │ ├── ConductorBreadcrumbs.tsx
│ │ │ ├── ConductorCheckbox.tsx
│ │ │ ├── ConductorCodeBlockInput.tsx
│ │ │ ├── ConductorEmptyGroupField.tsx
│ │ │ ├── ConductorGroupContainer.tsx
│ │ │ ├── ConductorGroupFieldTitle.tsx
│ │ │ ├── ConductorInput.tsx
│ │ │ ├── ConductorInputNumber.tsx
│ │ │ ├── ConductorMultiSelect.tsx
│ │ │ ├── ConductorNameVersionField.tsx
│ │ │ ├── ConductorSelect.tsx
│ │ │ ├── ConductorSlider/
│ │ │ │ ├── ConductorSlider.tsx
│ │ │ │ └── ConductorSliderStateless.tsx
│ │ │ ├── ConductorSplitButton.tsx
│ │ │ ├── ConductorStringArrayFormField.tsx
│ │ │ ├── ConductorTabs.tsx
│ │ │ ├── ConductorUpdateTaskFromEvent.tsx
│ │ │ ├── CopyClipboardButton.tsx
│ │ │ ├── EventExpressionHelp.tsx
│ │ │ ├── FileUploadButton.tsx
│ │ │ ├── FlatMapForm/
│ │ │ │ ├── ConductorAutocompleteArrayField.tsx
│ │ │ │ ├── ConductorAutocompleteVariables.tsx
│ │ │ │ ├── ConductorFieldTypeDropdown.tsx
│ │ │ │ ├── ConductorFlatMapForm.tsx
│ │ │ │ ├── ConductorKeyValueInput.tsx
│ │ │ │ ├── ConductorStringOrJsonInput.tsx
│ │ │ │ ├── customFilter.test.ts
│ │ │ │ └── formOptions.ts
│ │ │ ├── HeadTabs.tsx
│ │ │ ├── Modal/
│ │ │ │ ├── ConfirmModal.tsx
│ │ │ │ ├── UnsavedChangesDialog.tsx
│ │ │ │ ├── commonStyles.ts
│ │ │ │ └── useDialogHelper.tsx
│ │ │ ├── MultiOptionSelect.tsx
│ │ │ ├── RoundedInput.tsx
│ │ │ ├── SpinningIcon.tsx
│ │ │ ├── SwaggerTestComponent.tsx
│ │ │ ├── TagList.tsx
│ │ │ ├── TestTask/
│ │ │ │ ├── TestTask.tsx
│ │ │ │ └── index.ts
│ │ │ ├── TooltipModal.tsx
│ │ │ ├── TooltipStateless.tsx
│ │ │ ├── UnderlinedText.tsx
│ │ │ ├── date-time/
│ │ │ │ ├── ConductorDateRangePicker.tsx
│ │ │ │ ├── ConductorDateTimePicker.tsx
│ │ │ │ ├── ConductorSingleDateRangePicker.tsx
│ │ │ │ ├── ConductorTimePicker.tsx
│ │ │ │ └── CustomDateRangePicker.scss
│ │ │ ├── error/
│ │ │ │ └── Error.tsx
│ │ │ ├── icons/
│ │ │ │ ├── AddIcon.tsx
│ │ │ │ ├── AnnouncementIcon.tsx
│ │ │ │ ├── ArrowDownIcon.tsx
│ │ │ │ ├── ArrowUpIcon.tsx
│ │ │ │ ├── ChatIcon.tsx
│ │ │ │ ├── CircleCheckIcon.tsx
│ │ │ │ ├── CopyIcon.tsx
│ │ │ │ ├── DatetimeIcon.tsx
│ │ │ │ ├── DocsIcon.tsx
│ │ │ │ ├── DoubleArrowLeftIcon.tsx
│ │ │ │ ├── DoubleArrowRightIcon.tsx
│ │ │ │ ├── DownloadIcon.tsx
│ │ │ │ ├── DropdownIcon.tsx
│ │ │ │ ├── EnterIcon.tsx
│ │ │ │ ├── ExitIcon.tsx
│ │ │ │ ├── ExpandIcon.tsx
│ │ │ │ ├── FilterIcon.tsx
│ │ │ │ ├── InfoIcon.tsx
│ │ │ │ ├── NewIntegration.tsx
│ │ │ │ ├── OpenIcon.tsx
│ │ │ │ ├── PlayIcon.tsx
│ │ │ │ ├── PythonIcon.tsx
│ │ │ │ ├── RefreshIcon.tsx
│ │ │ │ ├── RequestACallIcon.tsx
│ │ │ │ ├── ResetIcon.tsx
│ │ │ │ ├── RunIcon.tsx
│ │ │ │ ├── Save.tsx
│ │ │ │ ├── SaveIcon.tsx
│ │ │ │ ├── SearchIcon.tsx
│ │ │ │ ├── ShowViewIcon.tsx
│ │ │ │ ├── TestIcon.tsx
│ │ │ │ ├── TimeIcon.tsx
│ │ │ │ ├── TrashIcon.tsx
│ │ │ │ ├── UnlockIcon.tsx
│ │ │ │ └── XCloseIcon.tsx
│ │ │ ├── index.ts
│ │ │ ├── layout/
│ │ │ │ ├── MessageContext/
│ │ │ │ │ ├── MessageContext.tsx
│ │ │ │ │ ├── MessageProvider.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── header/
│ │ │ │ │ ├── AnnouncementBanner.tsx
│ │ │ │ │ ├── ButtonLinks.tsx
│ │ │ │ │ └── bannerUtils.ts
│ │ │ │ └── section/
│ │ │ │ └── ConductorSectionHeader.tsx
│ │ │ ├── quiz/
│ │ │ │ └── OnboardingQuiz.tsx
│ │ │ ├── react-hook-form/
│ │ │ │ ├── ReactHookFormCheckbox.test.tsx
│ │ │ │ ├── ReactHookFormCheckbox.tsx
│ │ │ │ ├── ReactHookFormDropdown.test.tsx
│ │ │ │ ├── ReactHookFormDropdown.tsx
│ │ │ │ ├── ReactHookFormEditor.tsx
│ │ │ │ ├── ReactHookFormFlatMapForm.tsx
│ │ │ │ ├── ReactHookFormIdempotencyForm.test.tsx
│ │ │ │ ├── ReactHookFormIdempotencyForm.tsx
│ │ │ │ ├── ReactHookFormInput.test.tsx
│ │ │ │ ├── ReactHookFormInput.tsx
│ │ │ │ ├── ReactHookFormNameVersionField.test.tsx
│ │ │ │ └── ReactHookFormNameVersionField.tsx
│ │ │ └── theme/
│ │ │ ├── index.ts
│ │ │ ├── material/
│ │ │ │ ├── components/
│ │ │ │ │ ├── buttons.ts
│ │ │ │ │ ├── buttonsGroup.ts
│ │ │ │ │ └── formControls.ts
│ │ │ │ ├── context.tsx
│ │ │ │ └── provider.tsx
│ │ │ ├── styles.ts
│ │ │ └── theme.ts
│ │ ├── growthbook/
│ │ │ ├── MaybeGrowthbookProvider.tsx
│ │ │ ├── growthbookInstance.ts
│ │ │ ├── plugins.ts
│ │ │ └── useMaybeIdentifyGrowthbook.tsx
│ │ ├── index.css
│ │ ├── index.ts
│ │ ├── main.tsx
│ │ ├── pages/
│ │ │ ├── apiDocs/
│ │ │ │ └── ApiReferencePage.tsx
│ │ │ ├── creatorFlags/
│ │ │ │ └── CreatorFlags.tsx
│ │ │ ├── definition/
│ │ │ │ ├── ConfirmDialog.tsx
│ │ │ │ ├── ConfirmLocalCopyDialog/
│ │ │ │ │ ├── ConfirmLocalCopyDialog.tsx
│ │ │ │ │ └── state/
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── service.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── EditorPanel/
│ │ │ │ │ ├── AssistantPanel.tsx
│ │ │ │ │ ├── AssistantPanelHeader.tsx
│ │ │ │ │ ├── CodeEditorTab/
│ │ │ │ │ │ ├── CodeTab.tsx
│ │ │ │ │ │ ├── MonacoDefinitionOverrides.scss
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── state/
│ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ ├── hook.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ ├── ConfirmationDialogs.tsx
│ │ │ │ │ ├── CustomTooltip.tsx
│ │ │ │ │ ├── DependenciesTab/
│ │ │ │ │ │ └── DependenciesTab.tsx
│ │ │ │ │ ├── EditorPanel.tsx
│ │ │ │ │ ├── EditorTabs.tsx
│ │ │ │ │ ├── HeadActionButtons.tsx
│ │ │ │ │ ├── RunWorkflowButton.tsx
│ │ │ │ │ ├── TabContent.tsx
│ │ │ │ │ ├── TaskFormTab/
│ │ │ │ │ │ ├── TaskForm.tsx
│ │ │ │ │ │ ├── TaskFormContent.tsx
│ │ │ │ │ │ ├── TaskStats/
│ │ │ │ │ │ │ ├── CountBar.tsx
│ │ │ │ │ │ │ ├── RangeButtons.tsx
│ │ │ │ │ │ │ ├── TaskRateChart.tsx
│ │ │ │ │ │ │ ├── TaskStats.tsx
│ │ │ │ │ │ │ └── state/
│ │ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ │ ├── guards.ts
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ │ ├── services.ts
│ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ ├── forms/
│ │ │ │ │ │ │ ├── ArrayForm.tsx
│ │ │ │ │ │ │ ├── BusinessRuleForm.tsx
│ │ │ │ │ │ │ ├── ChunkTextTaskForm.tsx
│ │ │ │ │ │ │ ├── ConductorCacheOutputForm.tsx
│ │ │ │ │ │ │ ├── ConductorFlexibleAutoCompleteVariables.tsx
│ │ │ │ │ │ │ ├── ConductorObjectOrStringInput.tsx
│ │ │ │ │ │ │ ├── ConductorValueInput.tsx
│ │ │ │ │ │ │ ├── DoWhileTaskForm/
│ │ │ │ │ │ │ │ ├── DoWhileCodeBlock.tsx
│ │ │ │ │ │ │ │ ├── DoWhileForm.tsx
│ │ │ │ │ │ │ │ ├── common.ts
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── sampleScripts.ts
│ │ │ │ │ │ │ ├── DynamicForkOperatorForm.tsx
│ │ │ │ │ │ │ ├── DynamicOperatorForm.tsx
│ │ │ │ │ │ │ ├── EnforceSchemaForm.tsx
│ │ │ │ │ │ │ ├── EventTaskForm/
│ │ │ │ │ │ │ │ ├── EventTaskForm.tsx
│ │ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ │ ├── FieldTypeDropdown.tsx
│ │ │ │ │ │ │ ├── FlexibleAutoCompleteVariables.tsx
│ │ │ │ │ │ │ ├── GRPCTaskForm/
│ │ │ │ │ │ │ │ ├── GRPCTaskForm.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ │ ├── GetDocumentTaskForm.tsx
│ │ │ │ │ │ │ ├── GetSignedJwtForm.tsx
│ │ │ │ │ │ │ ├── GetWorkflowTaskForm/
│ │ │ │ │ │ │ │ ├── GetWorkflowTaskForm.tsx
│ │ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ │ ├── HTTPTaskForm/
│ │ │ │ │ │ │ │ ├── ConductorAdditionalHeaders.tsx
│ │ │ │ │ │ │ │ ├── EditTaskDefConfigModal.tsx
│ │ │ │ │ │ │ │ ├── Encode.tsx
│ │ │ │ │ │ │ │ ├── HTTPPollTaskForm.tsx
│ │ │ │ │ │ │ │ ├── HTTPTaskForm.tsx
│ │ │ │ │ │ │ │ ├── common.ts
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ ├── state/
│ │ │ │ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ │ │ │ ├── helper.ts
│ │ │ │ │ │ │ │ │ ├── hook.ts
│ │ │ │ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ │ │ │ ├── services.ts
│ │ │ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ │ ├── HedgingConfigForm.tsx
│ │ │ │ │ │ │ ├── INLINETaskForm/
│ │ │ │ │ │ │ │ ├── INLINETaskForm.tsx
│ │ │ │ │ │ │ │ ├── InlineCodeBlock.tsx
│ │ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ │ ├── JDBCTaskForm.tsx
│ │ │ │ │ │ │ ├── JOINTaskForm/
│ │ │ │ │ │ │ │ ├── JOINTaskForm.tsx
│ │ │ │ │ │ │ │ ├── JoinCodeBlock.tsx
│ │ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ │ ├── JSONField.tsx
│ │ │ │ │ │ │ ├── JSONJQTransformForm.tsx
│ │ │ │ │ │ │ ├── KafkaTaskForm.tsx
│ │ │ │ │ │ │ ├── LLMChainTaskForm.tsx
│ │ │ │ │ │ │ ├── LLMChatCompleteTaskForm.tsx
│ │ │ │ │ │ │ ├── LLMFormFields/
│ │ │ │ │ │ │ │ ├── ConductorArrayMapForm.tsx
│ │ │ │ │ │ │ │ ├── LLMFormFields.tsx
│ │ │ │ │ │ │ │ ├── LLMFormFieldsWrapper.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── state/
│ │ │ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ │ │ ├── services.ts
│ │ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ │ ├── LLMGenerateEmbeddingsTaskForm.tsx
│ │ │ │ │ │ │ ├── LLMGetEmbeddingsTaskForm.tsx
│ │ │ │ │ │ │ ├── LLMIndexDocumentTaskForm.tsx
│ │ │ │ │ │ │ ├── LLMIndexTextTaskForm.tsx
│ │ │ │ │ │ │ ├── LLMSearchIndexTaskForm.tsx
│ │ │ │ │ │ │ ├── LLMStoreEmbeddingsTaskForm.tsx
│ │ │ │ │ │ │ ├── LLMTextCompleteTaskForm.tsx
│ │ │ │ │ │ │ ├── ListFilesTaskForm.tsx
│ │ │ │ │ │ │ ├── MCPTaskForm.tsx
│ │ │ │ │ │ │ ├── MaybeVariable.tsx
│ │ │ │ │ │ │ ├── OpsGenieTaskForm.tsx
│ │ │ │ │ │ │ ├── OptionalFieldForm.tsx
│ │ │ │ │ │ │ ├── ParseDocumentTaskForm.tsx
│ │ │ │ │ │ │ ├── QueryProcessorTaskForm/
│ │ │ │ │ │ │ │ ├── MetricsTypeForm.tsx
│ │ │ │ │ │ │ │ ├── QueryProcessorTaskForm.tsx
│ │ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ │ ├── RateLimitConfigForm.tsx
│ │ │ │ │ │ │ ├── SchemaForm.tsx
│ │ │ │ │ │ │ ├── SendgridForm.tsx
│ │ │ │ │ │ │ ├── ServiceRegistrySelector.tsx
│ │ │ │ │ │ │ ├── SetVariableOperatorForm.tsx
│ │ │ │ │ │ │ ├── SimpleTaskForm/
│ │ │ │ │ │ │ │ ├── SampleCode.ts
│ │ │ │ │ │ │ │ ├── SimpleTaskForm.tsx
│ │ │ │ │ │ │ │ ├── TemplateKeys.tsx
│ │ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ │ ├── SimpleTaskNameInput.tsx
│ │ │ │ │ │ │ ├── StartWorkflowTaskForm/
│ │ │ │ │ │ │ │ ├── StartWorkflowTaskForm.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── state/
│ │ │ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ │ │ ├── hook.ts
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ ├── machine.test.ts
│ │ │ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ │ │ ├── service.ts
│ │ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ │ ├── SubWorkflowOperatorForm/
│ │ │ │ │ │ │ │ ├── SubWorkflowOperatorForm.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ │ ├── SwitchTaskForm/
│ │ │ │ │ │ │ │ ├── SwitchCodeBlock.tsx
│ │ │ │ │ │ │ │ ├── SwitchOperatorForm.tsx
│ │ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ │ ├── TaskFormFooter.tsx
│ │ │ │ │ │ │ ├── TaskFormHeader/
│ │ │ │ │ │ │ │ ├── TaskFormHeader.tsx
│ │ │ │ │ │ │ │ ├── TaskFormHeaderSimple.tsx
│ │ │ │ │ │ │ │ ├── TaskFormHeaderTasks.tsx
│ │ │ │ │ │ │ │ └── state/
│ │ │ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ │ │ ├── hook.ts
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ │ ├── TaskFormSection.tsx
│ │ │ │ │ │ │ ├── TaskFormStyles.ts
│ │ │ │ │ │ │ ├── TerminateOperatorForm.tsx
│ │ │ │ │ │ │ ├── TerminateWorkflowForm.tsx
│ │ │ │ │ │ │ ├── TestTaskButton/
│ │ │ │ │ │ │ │ ├── OpenTestTaskButton.tsx
│ │ │ │ │ │ │ │ ├── TestTaskButton.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── state/
│ │ │ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ │ │ ├── hook.ts
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ │ │ ├── service.ts
│ │ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ │ ├── UnknownTaskForm.tsx
│ │ │ │ │ │ │ ├── UpdateSecretForm/
│ │ │ │ │ │ │ │ ├── UpdateSecretTaskForm.tsx
│ │ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ │ ├── UpdateTaskForm/
│ │ │ │ │ │ │ │ ├── UpdateTaskForm.tsx
│ │ │ │ │ │ │ │ ├── UpdateTaskFromEvent.tsx
│ │ │ │ │ │ │ │ ├── common.ts
│ │ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ │ ├── WaitForWebhookForm/
│ │ │ │ │ │ │ │ ├── WaitForWebhookTaskForm.tsx
│ │ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ │ ├── WaitTaskForm/
│ │ │ │ │ │ │ │ ├── DurationWaitTaskForm.tsx
│ │ │ │ │ │ │ │ ├── SelectWaitType.tsx
│ │ │ │ │ │ │ │ ├── UntilWaitTaskForm.tsx
│ │ │ │ │ │ │ │ ├── WaitTaskForm.tsx
│ │ │ │ │ │ │ │ ├── helpers.ts
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ │ ├── YieldTaskForm.tsx
│ │ │ │ │ │ │ ├── editorConfig.ts
│ │ │ │ │ │ │ ├── hooks/
│ │ │ │ │ │ │ │ ├── useSchemaFormHandler.ts
│ │ │ │ │ │ │ │ └── useTaskForm.ts
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ ├── maybeVariableHOC.tsx
│ │ │ │ │ │ │ ├── types.ts
│ │ │ │ │ │ │ └── useGetSetHandler.ts
│ │ │ │ │ │ ├── helpers.test.ts
│ │ │ │ │ │ ├── helpers.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── state/
│ │ │ │ │ │ │ ├── TaskFormContext/
│ │ │ │ │ │ │ │ ├── TaskFormContext.tsx
│ │ │ │ │ │ │ │ ├── TaskFormProvider.tsx
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ │ ├── guards.ts
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ └── taskDescription.ts
│ │ │ │ │ ├── WorkflowPropertiesFormTab/
│ │ │ │ │ │ ├── ActorToHandlerValue.tsx
│ │ │ │ │ │ ├── WorkflowPropertiesForm.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── state/
│ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ ├── hook.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ └── selectors.ts
│ │ │ │ ├── EventHandler/
│ │ │ │ │ ├── EventHandler.tsx
│ │ │ │ │ ├── SaveProtectionPrompt.tsx
│ │ │ │ │ ├── eventhandlers/
│ │ │ │ │ │ ├── EventHandlerButton.tsx
│ │ │ │ │ │ ├── EventHandlerEditor.tsx
│ │ │ │ │ │ ├── FormComponent/
│ │ │ │ │ │ │ ├── ActionForms/
│ │ │ │ │ │ │ │ ├── CompleteTask.tsx
│ │ │ │ │ │ │ │ ├── FailTask.tsx
│ │ │ │ │ │ │ │ ├── StartWorkflowTask.tsx
│ │ │ │ │ │ │ │ ├── TerminateWorkflowTask.tsx
│ │ │ │ │ │ │ │ ├── UpdateWorkflowTask.tsx
│ │ │ │ │ │ │ │ └── common.ts
│ │ │ │ │ │ │ ├── EventHandlerForm.tsx
│ │ │ │ │ │ │ └── state/
│ │ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ │ ├── hook.ts
│ │ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ ├── eventHandlerSchema.ts
│ │ │ │ │ │ └── state/
│ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ ├── guards.ts
│ │ │ │ │ │ ├── hook.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ ├── services.ts
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── GraphPanel.jsx
│ │ │ │ ├── ImportSuccessfulDialog.tsx
│ │ │ │ ├── PromptIfChanges.tsx
│ │ │ │ ├── RunWorkflow/
│ │ │ │ │ ├── RunWorkflowForm.tsx
│ │ │ │ │ ├── RunWorkflowHistoryTable.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── state/
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── services.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── WorkflowDefinition.tsx
│ │ │ │ ├── WorkflowMetadata/
│ │ │ │ │ ├── EditInPlaceWrapper/
│ │ │ │ │ │ ├── EditInPlaceFieldWrapper.tsx
│ │ │ │ │ │ └── state/
│ │ │ │ │ │ ├── actions.ts
│ │ │ │ │ │ ├── guards.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── machine.ts
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ ├── WorkflowMetaBar.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── state/
│ │ │ │ │ ├── WorkflowMetadataContext/
│ │ │ │ │ │ ├── WorkflowMetadataContext.tsx
│ │ │ │ │ │ ├── WorkflowMetadataProvider.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── guards.ts
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── services.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── commonService.ts
│ │ │ │ ├── confirmSave/
│ │ │ │ │ ├── ConfirmSaveButtonGroup.tsx
│ │ │ │ │ ├── ConfirmSaveDiffEditor.tsx
│ │ │ │ │ ├── ConfirmWorkflowOverride.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── state/
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── guards.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── services.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── errorInspector/
│ │ │ │ │ ├── AccordionErrorSummary.tsx
│ │ │ │ │ ├── ErrorInspector.tsx
│ │ │ │ │ ├── ImportSummary.tsx
│ │ │ │ │ ├── ServerErrorDisplayer.tsx
│ │ │ │ │ ├── TaskErrorsDisplayer.tsx
│ │ │ │ │ ├── WorkflowErrorDisplayer.tsx
│ │ │ │ │ └── state/
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── helpers.test.ts
│ │ │ │ │ ├── helpers.ts
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── schemaValidator.ts
│ │ │ │ │ ├── service.test.ts
│ │ │ │ │ ├── service.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── helper.test.ts
│ │ │ │ ├── helpers.ts
│ │ │ │ ├── progressicons.jsx
│ │ │ │ ├── state/
│ │ │ │ │ ├── WorkflowEditContext/
│ │ │ │ │ │ ├── WorkflowEditContext.tsx
│ │ │ │ │ │ ├── WorkflowEditProvider.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ ├── action.ts
│ │ │ │ │ ├── constants.js
│ │ │ │ │ ├── guards.ts
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── services.ts
│ │ │ │ │ ├── taskModifier/
│ │ │ │ │ │ ├── constants.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── taskModifier.test.js
│ │ │ │ │ │ └── taskModifier.ts
│ │ │ │ │ ├── types.ts
│ │ │ │ │ ├── useGetVariablesForSelectedTasks.ts
│ │ │ │ │ ├── useMadeChanges.ts
│ │ │ │ │ ├── usePanelChanges.ts
│ │ │ │ │ └── usePerformOperationOnDefintion.ts
│ │ │ │ └── task/
│ │ │ │ ├── CreationInfo.tsx
│ │ │ │ ├── NameDescription.tsx
│ │ │ │ ├── SaveProtectionPrompt.tsx
│ │ │ │ ├── TaskDefErrorInspector.tsx
│ │ │ │ ├── TaskDefinition.tsx
│ │ │ │ ├── TaskDefinitionButtons.tsx
│ │ │ │ ├── TaskDefinitionDiffEditor.tsx
│ │ │ │ ├── TestTaskForm.tsx
│ │ │ │ ├── dialogs/
│ │ │ │ │ ├── TaskDefinitionDialogs.tsx
│ │ │ │ │ └── state/
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── guards.ts
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── form/
│ │ │ │ │ ├── TaskDefinitionForm.tsx
│ │ │ │ │ └── state/
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── guards.ts
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── services.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── state/
│ │ │ │ ├── actions.ts
│ │ │ │ ├── guards.ts
│ │ │ │ ├── helpers.ts
│ │ │ │ ├── hook.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── machine.ts
│ │ │ │ ├── services.ts
│ │ │ │ ├── types.ts
│ │ │ │ └── validator.ts
│ │ │ ├── definitions/
│ │ │ │ ├── EventHandler.tsx
│ │ │ │ ├── Scheduler/
│ │ │ │ │ ├── BulkActionModule.tsx
│ │ │ │ │ └── Schedules.tsx
│ │ │ │ ├── Task.tsx
│ │ │ │ ├── Workflow.tsx
│ │ │ │ ├── dialog/
│ │ │ │ │ ├── CloneDialog.tsx
│ │ │ │ │ ├── CloneScheduleDialog.tsx
│ │ │ │ │ ├── CloneWorkflowDialog.tsx
│ │ │ │ │ └── ShareWorkflowDialog.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── rowColorHelpers.ts
│ │ │ ├── error/
│ │ │ │ ├── ErrorPage.tsx
│ │ │ │ ├── Forbidden.tsx
│ │ │ │ ├── UserNotFound.tsx
│ │ │ │ └── types.ts
│ │ │ ├── eventMonitor/
│ │ │ │ ├── EventMonitor.tsx
│ │ │ │ ├── EventMonitorDetail/
│ │ │ │ │ ├── EventMonitorDetail.tsx
│ │ │ │ │ ├── ExpandedGroupedItem.tsx
│ │ │ │ │ ├── PayloadModal.tsx
│ │ │ │ │ └── Refresher/
│ │ │ │ │ ├── RefreshEvent.tsx
│ │ │ │ │ └── state/
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── services.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── types.ts
│ │ │ │ └── utils.ts
│ │ │ ├── execution/
│ │ │ │ ├── ActionModule.jsx
│ │ │ │ ├── Execution.jsx
│ │ │ │ ├── ExecutionInputOutput.tsx
│ │ │ │ ├── ExecutionJson.jsx
│ │ │ │ ├── ExecutionSummary.jsx
│ │ │ │ ├── LeftPanelTabs.tsx
│ │ │ │ ├── NoAnimRangeSlider.tsx
│ │ │ │ ├── RightPanel/
│ │ │ │ │ ├── RightPanel.tsx
│ │ │ │ │ ├── SummaryTask.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── state/
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── guards.ts
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── services.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── TaskList/
│ │ │ │ │ ├── StatusSelect.tsx
│ │ │ │ │ ├── TaskList.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── state/
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── services.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── TaskLogs.tsx
│ │ │ │ ├── TaskSummary.tsx
│ │ │ │ ├── Timeline.jsx
│ │ │ │ ├── Timeline.test.ts
│ │ │ │ ├── UpdateTaskStatusForm.tsx
│ │ │ │ ├── WorkflowIntrospection.tsx
│ │ │ │ ├── componentHelpers.tsx
│ │ │ │ ├── helpers.test.ts
│ │ │ │ ├── helpers.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── state/
│ │ │ │ │ ├── FlowExecutionContext/
│ │ │ │ │ │ ├── FlowExecutionContext.tsx
│ │ │ │ │ │ ├── FlowExecutionProvider.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ ├── StatusMapTypes.ts
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── constants.ts
│ │ │ │ │ ├── countdownActions.ts
│ │ │ │ │ ├── countdownMachine.ts
│ │ │ │ │ ├── executionMapper.test.js
│ │ │ │ │ ├── executionMapper.ts
│ │ │ │ │ ├── guards.ts
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ ├── sampleExecutions.js
│ │ │ │ │ ├── services.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── timeline.scss
│ │ │ │ └── timelineUtils.ts
│ │ │ ├── executions/
│ │ │ │ ├── ApiSearchModalIntegration.tsx
│ │ │ │ ├── BulkActionModule.tsx
│ │ │ │ ├── DateControlComponent.tsx
│ │ │ │ ├── DatePickerComponent.tsx
│ │ │ │ ├── ResultsTable.tsx
│ │ │ │ ├── SchedulerApiSearchModal.tsx
│ │ │ │ ├── SchedulerExecutions.tsx
│ │ │ │ ├── SchedulerResultsTable.tsx
│ │ │ │ ├── SearchExampleQuery.tsx
│ │ │ │ ├── SplitWorkflowDefinitionButton/
│ │ │ │ │ ├── ImportBPNFileDialog.tsx
│ │ │ │ │ ├── SplitWorkflowDefinitionButton.tsx
│ │ │ │ │ └── hook.ts
│ │ │ │ ├── Task/
│ │ │ │ │ ├── AdvanceSearch.tsx
│ │ │ │ │ ├── BasicSearch.tsx
│ │ │ │ │ ├── SwitchComponent.tsx
│ │ │ │ │ └── TaskApiSearchModal.tsx
│ │ │ │ ├── TaskResultsTable.tsx
│ │ │ │ ├── TaskSearch.tsx
│ │ │ │ ├── WorkflowSearch.tsx
│ │ │ │ ├── executionsStyles.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── workflowSearchComponents/
│ │ │ │ ├── AdvancedSearch.tsx
│ │ │ │ └── BasicSearch.tsx
│ │ │ ├── kitchensink/
│ │ │ │ ├── DataTableDemo.jsx
│ │ │ │ ├── EnhancedTable.jsx
│ │ │ │ ├── Examples.jsx
│ │ │ │ ├── Gantt.jsx
│ │ │ │ ├── KitchenSink.jsx
│ │ │ │ ├── ThemeSampler.jsx
│ │ │ │ └── sampleMovieData.js
│ │ │ ├── queueMonitor/
│ │ │ │ ├── PollDataTable.tsx
│ │ │ │ ├── PollWorkerDetails.tsx
│ │ │ │ ├── QuickSearchAndRefresh.tsx
│ │ │ │ ├── TaskQueue.tsx
│ │ │ │ ├── filter/
│ │ │ │ │ ├── FilterSection.tsx
│ │ │ │ │ ├── hook.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── helpers.ts
│ │ │ │ ├── refresher/
│ │ │ │ │ ├── RefreshOptions.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── state/
│ │ │ │ │ ├── actions.ts
│ │ │ │ │ ├── guards.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── machine.ts
│ │ │ │ │ └── types.ts
│ │ │ │ └── state/
│ │ │ │ ├── QueueMonitorContext/
│ │ │ │ │ ├── QueueMonitorContext.tsx
│ │ │ │ │ ├── QueueMonitorProvider.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── actions.ts
│ │ │ │ ├── guards.ts
│ │ │ │ ├── hook.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── machine.ts
│ │ │ │ ├── service.ts
│ │ │ │ └── types.ts
│ │ │ ├── runWorkflow/
│ │ │ │ ├── IdempotencyForm.tsx
│ │ │ │ ├── RunWorkflow.tsx
│ │ │ │ ├── RunWorkflowApiSearchModal.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── runWorkflowUtils.ts
│ │ │ │ └── types.ts
│ │ │ ├── scheduler/
│ │ │ │ ├── CronExpressionHelp.tsx
│ │ │ │ ├── SaveProtectionPrompt.tsx
│ │ │ │ ├── Schedule.tsx
│ │ │ │ ├── ScheduleButtons.tsx
│ │ │ │ ├── ScheduleDiffEditor.jsx
│ │ │ │ ├── TimezonePicker.tsx
│ │ │ │ ├── __tests__/
│ │ │ │ │ └── Schedule.test.tsx
│ │ │ │ ├── components/
│ │ │ │ │ ├── CronExpressionSection.tsx
│ │ │ │ │ ├── ScheduleTimingSection.tsx
│ │ │ │ │ └── WorkflowConfigSection.tsx
│ │ │ │ ├── constants.ts
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── useCronExpression.ts
│ │ │ │ │ ├── useScheduleFormHandlers.ts
│ │ │ │ │ ├── useScheduleState.ts
│ │ │ │ │ └── useWorkflowConfig.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── schedulerHooks.js
│ │ │ │ ├── timezones.json
│ │ │ │ └── utils/
│ │ │ │ └── scheduleTransformers.ts
│ │ │ ├── styles.js
│ │ │ └── tags/
│ │ │ ├── TagsDashboard.tsx
│ │ │ └── TagsList.jsx
│ │ ├── plugins/
│ │ │ ├── AppBarModules.jsx
│ │ │ ├── AppLogo.jsx
│ │ │ ├── ConductorLogo.jsx
│ │ │ ├── constants.js
│ │ │ ├── customTypeRenderers.jsx
│ │ │ ├── env.js
│ │ │ ├── fetch.ts
│ │ │ ├── index.ts
│ │ │ └── registry/
│ │ │ ├── index.ts
│ │ │ ├── registry.ts
│ │ │ └── types.ts
│ │ ├── queryClient.ts
│ │ ├── routes/
│ │ │ ├── __tests__/
│ │ │ │ ├── router.test.tsx
│ │ │ │ └── test-utils.tsx
│ │ │ ├── router.tsx
│ │ │ └── routes.tsx
│ │ ├── setupTests.ts
│ │ ├── shared/
│ │ │ ├── BaseLayout.tsx
│ │ │ ├── BlockNavigationWithConfirmation.tsx
│ │ │ ├── CodeModal/
│ │ │ │ ├── curlHeader.ts
│ │ │ │ ├── hook.ts
│ │ │ │ └── types.ts
│ │ │ ├── PersistableSidebar/
│ │ │ │ └── state/
│ │ │ │ ├── actions.ts
│ │ │ │ ├── hook.ts
│ │ │ │ ├── machine.ts
│ │ │ │ ├── services.ts
│ │ │ │ └── types.ts
│ │ │ ├── SectionContainer.tsx
│ │ │ ├── SectionHeader.tsx
│ │ │ ├── SectionHeaderActions.tsx
│ │ │ ├── SideAndTopBarsLayout.tsx
│ │ │ ├── UserSettingsContext.ts
│ │ │ ├── UserSettingsProvider.tsx
│ │ │ ├── ZoomControlsButton.tsx
│ │ │ ├── agent/
│ │ │ │ ├── agentAtomsStore.ts
│ │ │ │ └── useAiContext.ts
│ │ │ ├── auth/
│ │ │ │ ├── AuthProvider.tsx
│ │ │ │ ├── NoAuthProvider/
│ │ │ │ │ ├── NoAuthProvider.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── constants.ts
│ │ │ │ ├── context.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── silentRefresh.ts
│ │ │ │ ├── tokenManagerJotai.ts
│ │ │ │ ├── types.ts
│ │ │ │ └── useAuth.ts
│ │ │ ├── createAndDisplayApplication/
│ │ │ │ ├── MetadataBanner.tsx
│ │ │ │ └── state/
│ │ │ │ ├── actions.ts
│ │ │ │ ├── guards.ts
│ │ │ │ ├── machine.ts
│ │ │ │ ├── services.ts
│ │ │ │ └── types.ts
│ │ │ ├── editor.ts
│ │ │ ├── icons/
│ │ │ │ └── FitToFrame.tsx
│ │ │ ├── state/
│ │ │ │ ├── index.ts
│ │ │ │ ├── machine.ts
│ │ │ │ ├── selectors.ts
│ │ │ │ ├── types.ts
│ │ │ │ └── userSettingsMachine/
│ │ │ │ ├── actions.ts
│ │ │ │ ├── guards.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── machine.ts
│ │ │ │ ├── services.ts
│ │ │ │ └── types.ts
│ │ │ ├── styles.ts
│ │ │ ├── useSaveProtection.ts
│ │ │ └── useUserSettings.ts
│ │ ├── templates/
│ │ │ └── JSONSchemaWorkflow.js
│ │ ├── testData/
│ │ │ └── diagramTests.js
│ │ ├── theme/
│ │ │ ├── index.ts
│ │ │ ├── material/
│ │ │ │ ├── ColorModeContext/
│ │ │ │ │ ├── ColorModeContext.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── baseTheme.ts
│ │ │ │ ├── components/
│ │ │ │ │ ├── appBar.ts
│ │ │ │ │ ├── atoms.ts
│ │ │ │ │ ├── buttons.ts
│ │ │ │ │ ├── buttonsGroup.ts
│ │ │ │ │ ├── dropdownsMenusPopovers.ts
│ │ │ │ │ ├── formControls.ts
│ │ │ │ │ ├── modals.ts
│ │ │ │ │ ├── paper.ts
│ │ │ │ │ ├── tables.ts
│ │ │ │ │ └── tabs.ts
│ │ │ │ ├── getPaletteForMode.ts
│ │ │ │ ├── provider.tsx
│ │ │ │ └── types/
│ │ │ │ └── Palette.d.ts
│ │ │ ├── theme.ts
│ │ │ └── tokens/
│ │ │ ├── colorOverrides.ts
│ │ │ ├── colors.js
│ │ │ ├── globalConstants.js
│ │ │ ├── orkes-theme.js
│ │ │ └── variables.ts
│ │ ├── types/
│ │ │ ├── Application.ts
│ │ │ ├── CloudTemplateResults.ts
│ │ │ ├── CloudTemplateType.ts
│ │ │ ├── Crumbs.ts
│ │ │ ├── EnvVariables.ts
│ │ │ ├── Environment.ts
│ │ │ ├── Events.ts
│ │ │ ├── Execution.ts
│ │ │ ├── FormFieldTypes.ts
│ │ │ ├── HumanTaskTypes.ts
│ │ │ ├── Integrations.ts
│ │ │ ├── Messages.ts
│ │ │ ├── MetricsTypes.ts
│ │ │ ├── Prompts.ts
│ │ │ ├── RemoteServiceTypes.ts
│ │ │ ├── Schedulers.ts
│ │ │ ├── SchemaDefinition.ts
│ │ │ ├── Schemas.ts
│ │ │ ├── SchemasAjv.ts
│ │ │ ├── Secret.ts
│ │ │ ├── ServiceDefinition.ts
│ │ │ ├── Tag.ts
│ │ │ ├── TaskDefinition.ts
│ │ │ ├── TaskExecution.ts
│ │ │ ├── TaskLog.ts
│ │ │ ├── TaskStatus.ts
│ │ │ ├── TaskType.ts
│ │ │ ├── TestTaskTypes.ts
│ │ │ ├── TimeoutPolicy.ts
│ │ │ ├── UpdateTaskStatus.ts
│ │ │ ├── User.ts
│ │ │ ├── WebhookDefinition.ts
│ │ │ ├── WorkflowDef.ts
│ │ │ ├── WorkflowExecution.ts
│ │ │ ├── common.ts
│ │ │ ├── helperTypes.ts
│ │ │ ├── index.ts
│ │ │ └── svg.d.ts
│ │ ├── useArrowNavigation.tsx
│ │ └── utils/
│ │ ├── __tests__/
│ │ │ ├── date.test.ts
│ │ │ ├── json.test.ts
│ │ │ ├── object.test.ts
│ │ │ ├── string.test.ts
│ │ │ ├── toMaybeQueryString.test.ts
│ │ │ ├── typeHelpers.test.ts
│ │ │ ├── utils.test.ts
│ │ │ └── workflow.test.ts
│ │ ├── accessControl.ts
│ │ ├── array.ts
│ │ ├── checkPathFlag.ts
│ │ ├── cloudTemplates.ts
│ │ ├── constants/
│ │ │ ├── api.ts
│ │ │ ├── common.ts
│ │ │ ├── dateTimePicker.ts
│ │ │ ├── docLink.ts
│ │ │ ├── emailContentTypeSuggestions.ts
│ │ │ ├── event.ts
│ │ │ ├── httpStatusCode.ts
│ │ │ ├── httpSuggestions.ts
│ │ │ ├── index.ts
│ │ │ ├── jsonSchema.ts
│ │ │ ├── regex.ts
│ │ │ ├── route.ts
│ │ │ ├── switch.ts
│ │ │ ├── task.ts
│ │ │ ├── webhook.ts
│ │ │ ├── workflow.ts
│ │ │ └── workflowScheduleExecution.ts
│ │ ├── constants.ts
│ │ ├── cronHelpers.ts
│ │ ├── date.ts
│ │ ├── deprecatedRadioFilter.ts
│ │ ├── fieldHelpers.tsx
│ │ ├── flags.ts
│ │ ├── gtag.ts
│ │ ├── handleValidChars.ts
│ │ ├── helpers.ts
│ │ ├── hooks/
│ │ │ ├── index.ts
│ │ │ ├── useAutoCompleteInputValidation.ts
│ │ │ ├── useBatchedTagsData.ts
│ │ │ ├── useConductorProjectBuilder.ts
│ │ │ ├── useCustomPagination.ts
│ │ │ ├── useEditorForm.ts
│ │ │ ├── useEntityAvailableVersions.ts
│ │ │ ├── useEventNameSuggestions.ts
│ │ │ ├── useGetEntities.ts
│ │ │ ├── useGetEnvironmentVariables.ts
│ │ │ ├── useGetIntegrations.ts
│ │ │ ├── useGetSchedulerDefinitions.ts
│ │ │ ├── useGetSchemas.ts
│ │ │ ├── useGetSecrets.ts
│ │ │ ├── useMCPIntegrations.ts
│ │ │ ├── usePushHistory.ts
│ │ │ ├── useReplaceHistory.ts
│ │ │ ├── useToastMessage.ts
│ │ │ ├── useWorkflowNamesAndVersionsQuery.ts
│ │ │ └── useXStateEventListener.ts
│ │ ├── httpStatus.ts
│ │ ├── human.ts
│ │ ├── index.ts
│ │ ├── json.ts
│ │ ├── jsonSchema.ts
│ │ ├── localstorage.ts
│ │ ├── logger.ts
│ │ ├── logrocket.ts
│ │ ├── maybeTriggerWorkflow.ts
│ │ ├── monacoUtils/
│ │ │ ├── CodeEditorUtils.ts
│ │ │ └── promql.ts
│ │ ├── monitoring.ts
│ │ ├── object.ts
│ │ ├── pipe.ts
│ │ ├── query.ts
│ │ ├── reactHookForm.ts
│ │ ├── regex.ts
│ │ ├── releaseVersion.ts
│ │ ├── remoteServices.ts
│ │ ├── roles.ts
│ │ ├── strings.ts
│ │ ├── task.ts
│ │ ├── themeVariables.ts
│ │ ├── toMaybeQueryString.ts
│ │ ├── tracker.tsx
│ │ ├── useGetGroups.ts
│ │ ├── useGetUsers.ts
│ │ ├── useIntegrationProviders.ts
│ │ ├── useInterval.ts
│ │ ├── useLazyWorkflowNameAutoComplete.ts
│ │ ├── utils.ts
│ │ └── workflow.ts
│ ├── tsconfig.json
│ ├── vite-plugin-csp-nonce.ts
│ └── vite.config.ts
├── venv/
│ └── pyvenv.cfg
└── workflow-event-listener/
├── README.md
├── build.gradle
└── src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── netflix/
│ │ └── conductor/
│ │ └── contribs/
│ │ └── listener/
│ │ ├── archive/
│ │ │ ├── ArchivingWithTTLWorkflowStatusListener.java
│ │ │ ├── ArchivingWorkflowListenerConfiguration.java
│ │ │ ├── ArchivingWorkflowListenerProperties.java
│ │ │ ├── ArchivingWorkflowStatusListener.java
│ │ │ └── ArchivingWorkflowToS3.java
│ │ ├── conductorqueue/
│ │ │ ├── ConductorQueueStatusPublisher.java
│ │ │ ├── ConductorQueueStatusPublisherConfiguration.java
│ │ │ └── ConductorQueueStatusPublisherProperties.java
│ │ ├── kafka/
│ │ │ ├── KafkaWorkflowStatusPublisher.java
│ │ │ ├── KafkaWorkflowStatusPublisherConfiguration.java
│ │ │ └── KafkaWorkflowStatusPublisherProperties.java
│ │ └── statuschange/
│ │ ├── StatusChangeNotification.java
│ │ ├── StatusChangePublisher.java
│ │ └── StatusChangePublisherConfiguration.java
│ └── resources/
│ └── META-INF/
│ └── additional-spring-configuration-metadata.json
└── test/
├── java/
│ └── com/
│ └── netflix/
│ └── conductor/
│ ├── contribs/
│ │ └── listener/
│ │ ├── ArchivingWorkflowStatusListenerTest.java
│ │ └── statuschange/
│ │ └── StatusChangePublisherTest.java
│ └── test/
│ └── listener/
│ └── WorkflowStatusPublisherIntegrationTest.java
└── resources/
└── application-integrationtest.properties
Showing preview only (1,073K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (12854 symbols across 1582 files)
FILE: ai/src/main/java/org/conductoross/conductor/ai/AIModel.java
type AIModel (line 47) | public interface AIModel {
type ConductorTask (line 49) | enum ConductorTask {
method getModelProvider (line 61) | String getModelProvider();
method getProviderAliases (line 66) | default List<String> getProviderAliases() {
method generateEmbeddings (line 76) | List<Float> generateEmbeddings(EmbeddingGenRequest embeddingGenRequest);
method getChatModel (line 81) | ChatModel getChatModel();
method getChatOptions (line 87) | default ChatOptions getChatOptions(ChatCompletion input) {
method getImageOptions (line 106) | default ImageOptions getImageOptions(ImageGenRequest input) {
method getImageModel (line 120) | ImageModel getImageModel();
method getVideoOptions (line 126) | default VideoOptions getVideoOptions(VideoGenRequest input) {
method getVideoModel (line 154) | default VideoModel getVideoModel() {
method generateVideo (line 164) | default LLMResponse generateVideo(VideoGenRequest request) {
method checkVideoStatus (line 174) | default LLMResponse checkVideoStatus(VideoGenRequest request) {
method generateAudio (line 178) | default LLMResponse generateAudio(AudioGenRequest request) {
method getToolCallback (line 182) | default List<ToolCallback> getToolCallback(ChatCompletion input) {
method getURI (line 204) | static URI getURI(String input) {
FILE: ai/src/main/java/org/conductoross/conductor/ai/AIModelProvider.java
class AIModelProvider (line 28) | @Getter
method AIModelProvider (line 37) | public AIModelProvider(
method getModel (line 62) | public AIModel getModel(LLMWorkerInput input) {
method getTokenUsageLogger (line 74) | public Consumer<TokenUsageLog> getTokenUsageLogger() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/LLMHelper.java
class LLMHelper (line 85) | @Slf4j
method chatComplete (line 97) | public LLMResponse chatComplete(
method generateImage (line 129) | public LLMResponse generateImage(
method generateEmbeddings (line 158) | public List<Float> generateEmbeddings(
method generateAudio (line 166) | public LLMResponse generateAudio(
method generateVideo (line 187) | public LLMResponse generateVideo(
method checkVideoStatus (line 197) | public LLMResponse checkVideoStatus(
method replacePromptVariables (line 212) | private String replacePromptVariables(String prompt, Map<String, Objec...
method extractResponse (line 222) | @SneakyThrows
method tryToConvertToJSON (line 273) | @SneakyThrows
method validateJsonSchema (line 309) | private String validateJsonSchema(final SchemaDef schema, Map<String, ...
method chatComplete (line 339) | @SneakyThrows
method generateImage (line 441) | private LLMResponse generateImage(
method downloadImageFromUrl (line 504) | private byte[] downloadImageFromUrl(String url) {
method constructMessage (line 535) | @SneakyThrows
method toJSON (line 594) | private String toJSON(Object input) {
method extractMethodFromInputParameters (line 612) | @SuppressWarnings("unchecked")
method getMessage (line 634) | private Message getMessage(ChatMessage msg) {
method getMedia (line 643) | private Media getMedia(String mimeType, String content) {
method storeMedia (line 666) | private void storeMedia(
method storeMediaStream (line 705) | public String storeMediaStream(String location, String mimeType, java....
method getIntegrationNames (line 719) | private Map<String, String> getIntegrationNames(String toolCallName, L...
method parseNestedJsonStrings (line 734) | @SuppressWarnings("unchecked")
method parseNestedJsonStringsInList (line 784) | @SuppressWarnings("unchecked")
method isJsonString (line 824) | @VisibleForTesting
FILE: ai/src/main/java/org/conductoross/conductor/ai/LLMs.java
class LLMs (line 37) | @Component
method LLMs (line 50) | public LLMs(
method chatComplete (line 59) | public LLMResponse chatComplete(Task task, ChatCompletion chatCompleti...
method generateImage (line 71) | public LLMResponse generateImage(Task task, ImageGenRequest imageGenRe...
method generateAudio (line 81) | public LLMResponse generateAudio(Task task, AudioGenRequest audioGenRe...
method generateEmbeddings (line 91) | public List<Float> generateEmbeddings(Task task, EmbeddingGenRequest e...
method generateVideo (line 96) | public LLMResponse generateVideo(Task task, VideoGenRequest videoGenRe...
method checkVideoStatus (line 106) | public LLMResponse checkVideoStatus(Task task, VideoGenRequest videoGe...
method replacePromptVariables (line 111) | public String replacePromptVariables(
method getPayloadStoreLocation (line 119) | public String getPayloadStoreLocation(Task task) {
FILE: ai/src/main/java/org/conductoross/conductor/ai/MimeExtensionResolver.java
class MimeExtensionResolver (line 18) | public class MimeExtensionResolver {
method getExtension (line 97) | public static String getExtension(String input) {
method getMimeType (line 133) | public static String getMimeType(String ext) {
method getMimeTypeFromUrl (line 148) | public static String getMimeTypeFromUrl(String url, String defaultMime...
FILE: ai/src/main/java/org/conductoross/conductor/ai/ModelConfiguration.java
type ModelConfiguration (line 16) | public interface ModelConfiguration<T extends AIModel> {
method get (line 17) | T get();
FILE: ai/src/main/java/org/conductoross/conductor/ai/document/DocumentAccessDeniedException.java
class DocumentAccessDeniedException (line 19) | public class DocumentAccessDeniedException extends SecurityException {
method DocumentAccessDeniedException (line 21) | public DocumentAccessDeniedException(String message) {
FILE: ai/src/main/java/org/conductoross/conductor/ai/document/DocumentAccessPolicy.java
class DocumentAccessPolicy (line 40) | @Slf4j
method DocumentAccessPolicy (line 49) | public DocumentAccessPolicy(Environment env) {
method resolveEffectiveAllowedDirectories (line 84) | @PostConstruct
method validateAccess (line 271) | public void validateAccess(String location) {
method checkBlockedPaths (line 285) | private void checkBlockedPaths(String normalizedPath) {
method checkBlockedFileNames (line 302) | private void checkBlockedFileNames(String normalizedPath) {
method checkBlockedHosts (line 323) | private void checkBlockedHosts(String location) {
method checkResolvedAddress (line 354) | private void checkResolvedAddress(String host) {
method checkPathTraversal (line 380) | private void checkPathTraversal(String normalizedPath) {
method checkAllowedDirectories (line 394) | private void checkAllowedDirectories(String originalLocation, String n...
method normalizeLocation (line 417) | private String normalizeLocation(String location) {
method expandHome (line 442) | private String expandHome(String path) {
method extractFileName (line 449) | private String extractFileName(String path) {
method extractHost (line 457) | private String extractHost(String location) {
FILE: ai/src/main/java/org/conductoross/conductor/ai/document/DocumentLoader.java
type DocumentLoader (line 20) | public interface DocumentLoader {
method download (line 22) | byte[] download(String location);
method upload (line 24) | String upload(Map<String, String> headers, String contentType, byte[] ...
method upload (line 33) | default String upload(
method listFiles (line 42) | List<String> listFiles(String location);
method supports (line 44) | boolean supports(String location);
FILE: ai/src/main/java/org/conductoross/conductor/ai/document/FileSystemDocumentLoader.java
class FileSystemDocumentLoader (line 30) | @Component
method FileSystemDocumentLoader (line 40) | public FileSystemDocumentLoader(DocumentAccessPolicy accessPolicy) {
method download (line 44) | @Override
method upload (line 56) | @Override
method upload (line 78) | @Override
method listFiles (line 95) | @Override
method supports (line 105) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/document/HttpDocumentLoader.java
class HttpDocumentLoader (line 36) | @Slf4j
method HttpDocumentLoader (line 45) | public HttpDocumentLoader(DocumentAccessPolicy accessPolicy) {
method download (line 55) | @SuppressWarnings("unchecked")
method upload (line 78) | @Override
method listFiles (line 104) | @Override
method supports (line 109) | @Override
method isValidUrl (line 114) | private static boolean isValidUrl(String url) {
method httpCall (line 118) | protected HttpResponse httpCall(Input input) throws Exception {
method createRequestBody (line 210) | private RequestBody createRequestBody(Object body, String contentType) {
type FunctionWithException (line 231) | @FunctionalInterface
method apply (line 233) | R apply(T input) throws Exception;
method retryOperation (line 236) | private <T, R> R retryOperation(FunctionWithException<T, R> operation,...
class Input (line 262) | static class Input {
method getMethod (line 270) | public String getMethod() {
method setMethod (line 274) | public void setMethod(String method) {
method getHeaders (line 278) | public Map<String, Object> getHeaders() {
method setHeaders (line 282) | public void setHeaders(Map<String, Object> headers) {
method getBody (line 286) | public Object getBody() {
method setBody (line 290) | public void setBody(Object body) {
method getUri (line 294) | public String getUri() {
method setUri (line 298) | public void setUri(String uri) {
method getAccept (line 302) | public String getAccept() {
method setAccept (line 306) | public void setAccept(String accept) {
method getContentType (line 310) | public String getContentType() {
method setContentType (line 314) | public void setContentType(String contentType) {
class HttpResponse (line 320) | static class HttpResponse {
method isError (line 331) | public boolean isError() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/mcp/JsonTextParser.java
class JsonTextParser (line 28) | public class JsonTextParser {
method JsonTextParser (line 33) | public JsonTextParser(ObjectMapper objectMapper) {
method parseTextOrJson (line 46) | public JsonNode parseTextOrJson(String text) {
method parseTextOrJsonAsObject (line 78) | public Object parseTextOrJsonAsObject(String text) {
FILE: ai/src/main/java/org/conductoross/conductor/ai/mcp/MCPService.java
class MCPService (line 43) | @Component
method listTools (line 58) | public List<McpSchema.Tool> listTools(String serverUrl, Map<String, St...
method callTool (line 71) | public Map<String, Object> callTool(
method listToolsHttp (line 80) | private List<McpSchema.Tool> listToolsHttp(String serverUrl, Map<Strin...
method listToolsDirectHttp (line 90) | private List<McpSchema.Tool> listToolsDirectHttp(
method callToolHttp (line 192) | private Map<String, Object> callToolHttp(
method callToolDirectHttp (line 207) | private Map<String, Object> callToolDirectHttp(
method processResultJson (line 317) | private void processResultJson(JsonNode resultNode) {
method parseSseResponse (line 358) | private JsonNode parseSseResponse(String sseBody) {
method closeClient (line 388) | private void closeClient(McpSyncClient client) {
type TransportType (line 397) | private enum TransportType {
FILE: ai/src/main/java/org/conductoross/conductor/ai/models/AudioGenRequest.java
class AudioGenRequest (line 21) | @EqualsAndHashCode(callSuper = true)
FILE: ai/src/main/java/org/conductoross/conductor/ai/models/ChatCompletion.java
class ChatCompletion (line 26) | @Data
method getPrompt (line 87) | public String getPrompt() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/models/ChatMessage.java
class ChatMessage (line 22) | @Data
type Role (line 27) | public enum Role {
method ChatMessage (line 44) | public ChatMessage(Role role, String message) {
method ChatMessage (line 49) | public ChatMessage(Role role, ToolCall toolCall) {
FILE: ai/src/main/java/org/conductoross/conductor/ai/models/EmbeddingGenRequest.java
class EmbeddingGenRequest (line 21) | @EqualsAndHashCode(callSuper = true)
FILE: ai/src/main/java/org/conductoross/conductor/ai/models/GetConversationHistoryRequest.java
class GetConversationHistoryRequest (line 20) | @Data
FILE: ai/src/main/java/org/conductoross/conductor/ai/models/ImageGenRequest.java
class ImageGenRequest (line 21) | @EqualsAndHashCode(callSuper = true)
type OutputFormat (line 27) | public enum OutputFormat {
FILE: ai/src/main/java/org/conductoross/conductor/ai/models/IndexDocInput.java
class IndexDocInput (line 22) | @Data
method getNamespace (line 43) | public String getNamespace() {
method getChunkSize (line 50) | public int getChunkSize() {
method getChunkOverlap (line 54) | public int getChunkOverlap() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/models/IndexedDoc.java
class IndexedDoc (line 20) | @Data
method IndexedDoc (line 28) | public IndexedDoc(String docId, String parentDocId, String text, doubl...
method IndexedDoc (line 35) | public IndexedDoc() {}
FILE: ai/src/main/java/org/conductoross/conductor/ai/models/LLMResponse.java
class LLMResponse (line 24) | @Data
method hasToolCalls (line 39) | public boolean hasToolCalls() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/models/LLMWorkerInput.java
class LLMWorkerInput (line 21) | @Data
method getIntegrationNames (line 43) | public Map<String, String> getIntegrationNames() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/models/MCPListToolsRequest.java
class MCPListToolsRequest (line 24) | @Data
FILE: ai/src/main/java/org/conductoross/conductor/ai/models/MCPToolCallRequest.java
class MCPToolCallRequest (line 30) | @Data
FILE: ai/src/main/java/org/conductoross/conductor/ai/models/MarkdownToPdfRequest.java
class MarkdownToPdfRequest (line 24) | @Data
FILE: ai/src/main/java/org/conductoross/conductor/ai/models/Media.java
class Media (line 20) | @Data
FILE: ai/src/main/java/org/conductoross/conductor/ai/models/StoreEmbeddingsInput.java
class StoreEmbeddingsInput (line 21) | @Data
FILE: ai/src/main/java/org/conductoross/conductor/ai/models/TextCompletion.java
class TextCompletion (line 19) | @Data
FILE: ai/src/main/java/org/conductoross/conductor/ai/models/ToolCall.java
class ToolCall (line 24) | @Data
FILE: ai/src/main/java/org/conductoross/conductor/ai/models/ToolSpec.java
class ToolSpec (line 19) | @Data
FILE: ai/src/main/java/org/conductoross/conductor/ai/models/VectorDBInput.java
class VectorDBInput (line 21) | @Data
FILE: ai/src/main/java/org/conductoross/conductor/ai/models/VideoGenRequest.java
class VideoGenRequest (line 27) | @EqualsAndHashCode(callSuper = true)
FILE: ai/src/main/java/org/conductoross/conductor/ai/pdf/MarkdownToPdfConverter.java
class MarkdownToPdfConverter (line 43) | @Component
method MarkdownToPdfConverter (line 50) | public MarkdownToPdfConverter(PdfImageResolver imageResolver) {
method convert (line 60) | public byte[] convert(MarkdownToPdfRequest request) {
method parseMarkdown (line 109) | private Document parseMarkdown(String markdown) {
method resolvePageSize (line 125) | private PDRectangle resolvePageSize(String pageSize) {
method setMetadata (line 136) | private void setMetadata(PDDocument document, Map<String, String> pdfM...
FILE: ai/src/main/java/org/conductoross/conductor/ai/pdf/PdfDocumentRenderer.java
class PdfDocumentRenderer (line 40) | @Slf4j
method PdfDocumentRenderer (line 47) | public PdfDocumentRenderer(
method render (line 55) | public void render(Document document) throws IOException {
method renderChildren (line 60) | private void renderChildren(Node parent) throws IOException {
method renderNode (line 68) | private void renderNode(Node node) throws IOException {
method renderHeading (line 99) | private void renderHeading(Heading heading) throws IOException {
method renderParagraph (line 138) | private void renderParagraph(Paragraph paragraph) throws IOException {
method renderBulletList (line 158) | private void renderBulletList(BulletList list) throws IOException {
method renderOrderedList (line 178) | private void renderOrderedList(OrderedList list) throws IOException {
method renderListItem (line 197) | private void renderListItem(Node item, String marker) throws IOExcepti...
method renderFencedCodeBlock (line 246) | private void renderFencedCodeBlock(FencedCodeBlock codeBlock) throws I...
method renderIndentedCodeBlock (line 250) | private void renderIndentedCodeBlock(IndentedCodeBlock codeBlock) thro...
method renderCodeContent (line 254) | private void renderCodeContent(String code) throws IOException {
method renderBlockQuote (line 299) | private void renderBlockQuote(BlockQuote blockQuote) throws IOException {
method renderThematicBreak (line 327) | private void renderThematicBreak() throws IOException {
method renderImage (line 343) | private void renderImage(Image image) throws IOException {
method renderTable (line 392) | private void renderTable(TableBlock tableBlock) throws IOException {
method collectTableRows (line 492) | private void collectTableRows(Node section, List<List<String>> rows) {
method renderHtmlBlock (line 510) | private void renderHtmlBlock(HtmlBlock htmlBlock) throws IOException {
class TextRun (line 523) | static class TextRun {
method TextRun (line 531) | TextRun(
method collectTextRuns (line 548) | private List<TextRun> collectTextRuns(Node block) {
method collectInlineRuns (line 554) | private void collectInlineRuns(
method renderTextRuns (line 606) | private void renderTextRuns(List<TextRun> runs, float fontSize) throws...
method renderTextRunsWithOffset (line 614) | private void renderTextRunsWithOffset(List<TextRun> runs, float fontSi...
method resolveFont (line 714) | private PDType1Font resolveFont(TextRun run) {
method renderPlainText (line 722) | private void renderPlainText(String text, float fontSize) throws IOExc...
method truncateToFit (line 738) | private String truncateToFit(String text, PDType1Font font, float font...
method sanitizeText (line 760) | private String sanitizeText(String text, PDType1Font font) {
method addLinkAnnotation (line 775) | private void addLinkAnnotation(float x, float y, float width, float he...
FILE: ai/src/main/java/org/conductoross/conductor/ai/pdf/PdfImageResolver.java
class PdfImageResolver (line 30) | @Component
method PdfImageResolver (line 37) | public PdfImageResolver(List<DocumentLoader> documentLoaders) {
method resolve (line 48) | public byte[] resolve(String src, String imageBaseUrl) {
method decodeDataUri (line 75) | private byte[] decodeDataUri(String dataUri) {
method isAbsoluteUri (line 86) | private boolean isAbsoluteUri(String src) {
method downloadImage (line 90) | private byte[] downloadImage(String location) {
FILE: ai/src/main/java/org/conductoross/conductor/ai/pdf/PdfRenderContext.java
class PdfRenderContext (line 31) | @Getter
method PdfRenderContext (line 60) | public PdfRenderContext(
method getContentWidth (line 93) | public float getContentWidth() {
method getLeftX (line 98) | public float getLeftX() {
method getRightX (line 103) | public float getRightX() {
method getIndentOffset (line 108) | private float getIndentOffset() {
method getLineHeight (line 117) | public float getLineHeight(float fontSize) {
method ensureSpace (line 127) | public void ensureSpace(float height) throws IOException {
method newPage (line 134) | public void newPage() throws IOException {
method advanceCursor (line 145) | public void advanceCursor(float amount) {
method getTextWidth (line 157) | public float getTextWidth(String text, PDType1Font font, float fontSiz...
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/anthropic/Anthropic.java
class Anthropic (line 33) | public class Anthropic implements AIModel {
method Anthropic (line 38) | public Anthropic(AnthropicConfiguration config) {
method getModelProvider (line 42) | @Override
method generateEmbeddings (line 47) | @Override
method getChatModel (line 52) | @Override
method getChatOptions (line 76) | @Override
method getImageModel (line 105) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/anthropic/AnthropicConfiguration.java
class AnthropicConfiguration (line 24) | @Data
method AnthropicConfiguration (line 42) | public AnthropicConfiguration(
method getBaseURL (line 55) | public String getBaseURL() {
method get (line 59) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/azureopenai/AzureOpenAI.java
class AzureOpenAI (line 38) | public class AzureOpenAI implements AIModel {
method AzureOpenAI (line 43) | public AzureOpenAI(AzureOpenAIConfiguration config) {
method getModelProvider (line 47) | public String getModelProvider() {
method generateEmbeddings (line 51) | @Override
method getChatOptions (line 69) | @Override
method getChatModel (line 99) | @Override
method getOpenAIClientBuilder (line 104) | private OpenAIClientBuilder getOpenAIClientBuilder() {
method isReasoningModel (line 116) | private boolean isReasoningModel(String modelName) {
method getImageModel (line 124) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/azureopenai/AzureOpenAIConfiguration.java
class AzureOpenAIConfiguration (line 24) | @Data
method AzureOpenAIConfiguration (line 36) | public AzureOpenAIConfiguration(
method get (line 44) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/bedrock/Bedrock.java
class Bedrock (line 43) | @Slf4j
method Bedrock (line 50) | public Bedrock(BedrockConfiguration config) {
method getModelProvider (line 54) | @Override
method generateEmbeddings (line 59) | @SneakyThrows
method getChatModel (line 86) | @Override
class BearerTokenInterceptor (line 112) | private static class BearerTokenInterceptor implements ExecutionInterc...
method BearerTokenInterceptor (line 115) | BearerTokenInterceptor(String bearerToken) {
method modifyHttpRequest (line 119) | @Override
method getChatOptions (line 128) | @Override
method getImageModel (line 146) | @Override
method getEmbeddingRequest (line 151) | private Map<String, Object> getEmbeddingRequest(String modelId, String...
method extractEmbeddings (line 158) | @SneakyThrows
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/bedrock/BedrockConfiguration.java
class BedrockConfiguration (line 29) | @Data
method BedrockConfiguration (line 42) | public BedrockConfiguration(
method get (line 55) | @Override
method getAwsCredentialsProvider (line 60) | public AwsCredentialsProvider getAwsCredentialsProvider() {
method isBearerTokenConfigured (line 74) | public boolean isBearerTokenConfigured() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/cohere/CohereAI.java
class CohereAI (line 33) | @Slf4j
method CohereAI (line 43) | public CohereAI(CohereAIConfiguration config) {
method getModelProvider (line 49) | @Override
method generateEmbeddings (line 54) | @Override
method getChatOptions (line 80) | @Override
method getChatModel (line 93) | @Override
method getImageModel (line 98) | @Override
method createCohereApi (line 105) | private CohereApi createCohereApi() {
method createChatModel (line 121) | private CohereChatModel createChatModel() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/cohere/CohereAIConfiguration.java
class CohereAIConfiguration (line 25) | @Data
method CohereAIConfiguration (line 36) | public CohereAIConfiguration(String apiKey, String baseURL) {
method get (line 41) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/cohere/CohereChatModel.java
class CohereChatModel (line 39) | public class CohereChatModel implements ChatModel {
method CohereChatModel (line 44) | public CohereChatModel(CohereApi cohereApi) {
method CohereChatModel (line 48) | public CohereChatModel(CohereApi cohereApi, CohereChatOptions defaultO...
method builder (line 55) | public static Builder builder() {
method call (line 59) | @Override
method getDefaultOptions (line 66) | @Override
method createRequest (line 71) | private ChatCompletionRequest createRequest(Prompt prompt) {
method mergeOptions (line 95) | private CohereChatOptions mergeOptions(ChatOptions promptOptions) {
method toCohereMessage (line 145) | private ChatMessage toCohereMessage(Message message) {
method toChatResponse (line 156) | private ChatResponse toChatResponse(ChatCompletionResponse response) {
class CohereUsage (line 194) | private static class CohereUsage implements Usage {
method CohereUsage (line 197) | CohereUsage(ChatCompletionResponse.Usage usage) {
method getPromptTokens (line 201) | @Override
method getCompletionTokens (line 206) | @Override
method getTotalTokens (line 211) | @Override
method getNativeUsage (line 216) | @Override
class Builder (line 222) | public static class Builder {
method cohereApi (line 226) | public Builder cohereApi(CohereApi cohereApi) {
method defaultOptions (line 231) | public Builder defaultOptions(CohereChatOptions defaultOptions) {
method build (line 236) | public CohereChatModel build() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/cohere/CohereChatOptions.java
class CohereChatOptions (line 20) | public class CohereChatOptions implements ChatOptions {
method CohereChatOptions (line 31) | private CohereChatOptions(Builder builder) {
method builder (line 42) | public static Builder builder() {
method getModel (line 46) | @Override
method getTemperature (line 51) | @Override
method getMaxTokens (line 56) | @Override
method getTopP (line 61) | @Override
method getTopK (line 66) | @Override
method getFrequencyPenalty (line 71) | @Override
method getPresencePenalty (line 76) | @Override
method getStopSequences (line 81) | public List<String> getStopSequences() {
method copy (line 85) | @Override
class Builder (line 99) | public static class Builder {
method model (line 109) | public Builder model(String model) {
method temperature (line 114) | public Builder temperature(Double temperature) {
method maxTokens (line 119) | public Builder maxTokens(Integer maxTokens) {
method topP (line 124) | public Builder topP(Double topP) {
method topK (line 129) | public Builder topK(Integer topK) {
method frequencyPenalty (line 134) | public Builder frequencyPenalty(Double frequencyPenalty) {
method presencePenalty (line 139) | public Builder presencePenalty(Double presencePenalty) {
method stopSequences (line 144) | public Builder stopSequences(List<String> stopSequences) {
method build (line 149) | public CohereChatOptions build() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/cohere/CohereEmbeddingModel.java
class CohereEmbeddingModel (line 31) | public class CohereEmbeddingModel implements EmbeddingModel {
method CohereEmbeddingModel (line 37) | public CohereEmbeddingModel(CohereApi cohereApi) {
method CohereEmbeddingModel (line 41) | public CohereEmbeddingModel(
method builder (line 49) | public static Builder builder() {
method call (line 53) | @Override
method embed (line 84) | @Override
method toEmbeddingResponse (line 93) | private EmbeddingResponse toEmbeddingResponse(CohereApi.EmbeddingRespo...
class Builder (line 116) | public static class Builder {
method cohereApi (line 121) | public Builder cohereApi(CohereApi cohereApi) {
method defaultModel (line 126) | public Builder defaultModel(String defaultModel) {
method defaultDimensions (line 131) | public Builder defaultDimensions(Integer defaultDimensions) {
method build (line 136) | public CohereEmbeddingModel build() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/cohere/api/CohereApi.java
class CohereApi (line 32) | public class CohereApi {
method CohereApi (line 42) | private CohereApi(
method builder (line 60) | public static Builder builder() {
method chat (line 65) | public ResponseEntity<ChatCompletionResponse> chat(ChatCompletionReque...
method embed (line 75) | public ResponseEntity<EmbeddingResponse> embed(EmbeddingRequest reques...
method user (line 93) | public static ChatMessage user(String content) {
method assistant (line 97) | public static ChatMessage assistant(String content) {
method system (line 101) | public static ChatMessage system(String content) {
method builder (line 120) | public static Builder builder() {
class Builder (line 124) | public static class Builder {
method model (line 136) | public Builder model(String model) {
method messages (line 141) | public Builder messages(List<ChatMessage> messages) {
method temperature (line 146) | public Builder temperature(Double temperature) {
method maxTokens (line 151) | public Builder maxTokens(Integer maxTokens) {
method topP (line 156) | public Builder topP(Double topP) {
method topK (line 161) | public Builder topK(Integer topK) {
method frequencyPenalty (line 166) | public Builder frequencyPenalty(Double frequencyPenalty) {
method presencePenalty (line 171) | public Builder presencePenalty(Double presencePenalty) {
method stopSequences (line 176) | public Builder stopSequences(List<String> stopSequences) {
method stream (line 181) | public Builder stream(Boolean stream) {
method build (line 186) | public ChatCompletionRequest build() {
method model (line 242) | public Builder model(String model) {
method texts (line 247) | public Builder texts(List<String> texts) {
method inputType (line 252) | public Builder inputType(String inputType) {
method outputDimensions (line 257) | public Builder outputDimensions(Integer outputDimensions) {
method truncate (line 262) | public Builder truncate(String truncate) {
method build (line 267) | public EmbeddingRequest build() {
method baseUrl (line 295) | public Builder baseUrl(String baseUrl) {
method apiKey (line 300) | public Builder apiKey(String apiKey) {
method chatPath (line 305) | public Builder chatPath(String chatPath) {
method embedPath (line 310) | public Builder embedPath(String embedPath) {
method restClientBuilder (line 315) | public Builder restClientBuilder(RestClient.Builder restClientBuilde...
method build (line 320) | public CohereApi build() {
method builder (line 231) | public static Builder builder() {
class Builder (line 235) | public static class Builder {
method model (line 136) | public Builder model(String model) {
method messages (line 141) | public Builder messages(List<ChatMessage> messages) {
method temperature (line 146) | public Builder temperature(Double temperature) {
method maxTokens (line 151) | public Builder maxTokens(Integer maxTokens) {
method topP (line 156) | public Builder topP(Double topP) {
method topK (line 161) | public Builder topK(Integer topK) {
method frequencyPenalty (line 166) | public Builder frequencyPenalty(Double frequencyPenalty) {
method presencePenalty (line 171) | public Builder presencePenalty(Double presencePenalty) {
method stopSequences (line 176) | public Builder stopSequences(List<String> stopSequences) {
method stream (line 181) | public Builder stream(Boolean stream) {
method build (line 186) | public ChatCompletionRequest build() {
method model (line 242) | public Builder model(String model) {
method texts (line 247) | public Builder texts(List<String> texts) {
method inputType (line 252) | public Builder inputType(String inputType) {
method outputDimensions (line 257) | public Builder outputDimensions(Integer outputDimensions) {
method truncate (line 262) | public Builder truncate(String truncate) {
method build (line 267) | public EmbeddingRequest build() {
method baseUrl (line 295) | public Builder baseUrl(String baseUrl) {
method apiKey (line 300) | public Builder apiKey(String apiKey) {
method chatPath (line 305) | public Builder chatPath(String chatPath) {
method embedPath (line 310) | public Builder embedPath(String embedPath) {
method restClientBuilder (line 315) | public Builder restClientBuilder(RestClient.Builder restClientBuilde...
method build (line 320) | public CohereApi build() {
class Builder (line 288) | public static class Builder {
method model (line 136) | public Builder model(String model) {
method messages (line 141) | public Builder messages(List<ChatMessage> messages) {
method temperature (line 146) | public Builder temperature(Double temperature) {
method maxTokens (line 151) | public Builder maxTokens(Integer maxTokens) {
method topP (line 156) | public Builder topP(Double topP) {
method topK (line 161) | public Builder topK(Integer topK) {
method frequencyPenalty (line 166) | public Builder frequencyPenalty(Double frequencyPenalty) {
method presencePenalty (line 171) | public Builder presencePenalty(Double presencePenalty) {
method stopSequences (line 176) | public Builder stopSequences(List<String> stopSequences) {
method stream (line 181) | public Builder stream(Boolean stream) {
method build (line 186) | public ChatCompletionRequest build() {
method model (line 242) | public Builder model(String model) {
method texts (line 247) | public Builder texts(List<String> texts) {
method inputType (line 252) | public Builder inputType(String inputType) {
method outputDimensions (line 257) | public Builder outputDimensions(Integer outputDimensions) {
method truncate (line 262) | public Builder truncate(String truncate) {
method build (line 267) | public EmbeddingRequest build() {
method baseUrl (line 295) | public Builder baseUrl(String baseUrl) {
method apiKey (line 300) | public Builder apiKey(String apiKey) {
method chatPath (line 305) | public Builder chatPath(String chatPath) {
method embedPath (line 310) | public Builder embedPath(String embedPath) {
method restClientBuilder (line 315) | public Builder restClientBuilder(RestClient.Builder restClientBuilde...
method build (line 320) | public CohereApi build() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/gemini/GeminiGenAI.java
class GeminiGenAI (line 29) | public class GeminiGenAI implements ImageModel {
method GeminiGenAI (line 33) | public GeminiGenAI(Client client) {
method call (line 37) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/gemini/GeminiVertex.java
class GeminiVertex (line 59) | public class GeminiVertex implements AIModel {
method GeminiVertex (line 67) | public GeminiVertex(GeminiVertexConfiguration config) {
method getModelProvider (line 71) | @Override
method getProviderAliases (line 76) | @Override
method generateEmbeddings (line 81) | @Override
method getChatModel (line 101) | @Override
method getVertexAI (line 107) | @SneakyThrows
method getVertexAiEmbeddingConnectionDetails (line 123) | @SneakyThrows
method getChatOptions (line 148) | @Override
method getImageModel (line 172) | @Override
method getVideoModel (line 177) | @Override
method generateVideo (line 182) | @Override
method checkVideoStatus (line 195) | @Override
method createGenAIClient (line 233) | private Client createGenAIClient() {
method downloadFromUrl (line 245) | private byte[] downloadFromUrl(String url) {
method generateAudio (line 260) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/gemini/GeminiVertexConfiguration.java
class GeminiVertexConfiguration (line 25) | @Data
method getBaseURL (line 40) | public String getBaseURL() {
method get (line 46) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/gemini/GeminiVideoModel.java
class GeminiVideoModel (line 44) | @Slf4j
method GeminiVideoModel (line 49) | public GeminiVideoModel(Client client) {
method call (line 53) | @Override
method checkStatus (line 120) | @Override
method resolveGeminiImage (line 203) | private Image resolveGeminiImage(String inputImage) {
method downloadFromUrl (line 220) | private byte[] downloadFromUrl(String url) {
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/grok/Grok.java
class Grok (line 32) | public class Grok implements AIModel {
method Grok (line 37) | public Grok(GrokAIConfiguration config) {
method getModelProvider (line 41) | @Override
method generateEmbeddings (line 46) | @Override
method getChatOptions (line 51) | @Override
method getChatModel (line 75) | @Override
method getImageModel (line 90) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/grok/GrokAIConfiguration.java
class GrokAIConfiguration (line 25) | @Data
method GrokAIConfiguration (line 34) | public GrokAIConfiguration(String apiKey, String baseURL) {
method getBaseURL (line 39) | public String getBaseURL() {
method get (line 43) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/huggingface/HuggingFace.java
class HuggingFace (line 26) | public class HuggingFace implements AIModel {
method HuggingFace (line 31) | public HuggingFace(HuggingFaceConfiguration config) {
method getModelProvider (line 35) | @Override
method generateEmbeddings (line 40) | @Override
method getChatOptions (line 45) | @Override
method getChatModel (line 57) | @Override
method getImageModel (line 62) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/huggingface/HuggingFaceConfiguration.java
class HuggingFaceConfiguration (line 23) | @Data
method getBaseURL (line 34) | public String getBaseURL() {
method get (line 38) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/mistral/MistralAI.java
class MistralAI (line 39) | @Slf4j
method MistralAI (line 50) | public MistralAI(MistralAIConfiguration config) {
method getModelProvider (line 58) | @Override
method generateEmbeddings (line 63) | @Override
method getChatOptions (line 75) | @Override
method getChatModel (line 102) | @Override
method getImageModel (line 107) | @Override
method createMistralAiApi (line 114) | private MistralAiApi createMistralAiApi() {
method createChatModel (line 133) | private MistralAiChatModel createChatModel() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/mistral/MistralAIConfiguration.java
class MistralAIConfiguration (line 24) | @Data
method MistralAIConfiguration (line 36) | public MistralAIConfiguration(String apiKey, String baseURL) {
method getBaseURL (line 41) | public String getBaseURL() {
method get (line 45) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/ollama/Ollama.java
class Ollama (line 38) | @Slf4j
method Ollama (line 44) | public Ollama(OllamaConfiguration config) {
method getModelProvider (line 48) | @Override
method generateEmbeddings (line 53) | @Override
method getChatOptions (line 68) | @Override
method getChatModel (line 97) | @Override
method getImageModel (line 115) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/ollama/OllamaConfiguration.java
class OllamaConfiguration (line 24) | @Data
method OllamaConfiguration (line 38) | public OllamaConfiguration(String baseURL, String authHeaderName, Stri...
method getBaseURL (line 44) | public String getBaseURL() {
method get (line 48) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/openai/OpenAI.java
class OpenAI (line 59) | @Slf4j
method OpenAI (line 74) | public OpenAI(OpenAIConfiguration config) {
method getModelProvider (line 85) | @Override
method generateEmbeddings (line 90) | @Override
method getChatOptions (line 103) | @Override
method getChatModel (line 168) | @Override
method getImageModel (line 173) | @Override
method generateAudio (line 178) | @Override
method getSpeechOptions (line 192) | public OpenAiAudioSpeechOptions getSpeechOptions(AudioGenRequest reque...
method getVideoModel (line 211) | @Override
method generateVideo (line 216) | @Override
method checkVideoStatus (line 228) | @Override
method createOpenAiApi (line 262) | private OpenAiApi createOpenAiApi() {
method createChatModel (line 273) | private OpenAiSdkChatModel createChatModel() {
method createImageModel (line 288) | private OpenAiSdkImageModel createImageModel() {
method createAudioApi (line 297) | private OpenAiAudioApi createAudioApi() {
method createVideoModel (line 317) | private OpenAIVideoModel createVideoModel() {
method isReasoningModel (line 328) | private boolean isReasoningModel(String modelName) {
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/openai/OpenAIConfiguration.java
class OpenAIConfiguration (line 24) | @Data
method OpenAIConfiguration (line 38) | public OpenAIConfiguration(String apiKey, String baseURL, String organ...
method getBaseURL (line 44) | public String getBaseURL() {
method get (line 48) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/openai/OpenAIVideoModel.java
class OpenAIVideoModel (line 38) | @Slf4j
method OpenAIVideoModel (line 43) | public OpenAIVideoModel(OpenAIVideoApi api) {
method call (line 47) | @Override
method checkStatus (line 93) | @Override
method mapStatus (line 155) | private String mapStatus(String openaiStatus) {
method resolveImageBytes (line 174) | private byte[] resolveImageBytes(String inputImage) {
method detectMimeType (line 187) | private String detectMimeType(String inputImage) {
method downloadFromUrl (line 199) | private byte[] downloadFromUrl(String url) {
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/openai/api/OpenAIVideoApi.java
class OpenAIVideoApi (line 48) | @Slf4j
method OpenAIVideoApi (line 56) | public OpenAIVideoApi(String apiKey, String baseUrl) {
method submitVideoJob (line 75) | public VideoStatusResponse submitVideoJob(VideoCreateParams params) th...
method getVideoStatus (line 125) | public VideoStatusResponse getVideoStatus(String videoId) throws IOExc...
method downloadVideoStream (line 154) | public InputStream downloadVideoStream(String videoId) throws IOExcept...
method downloadVideo (line 186) | public byte[] downloadVideo(String videoId) throws IOException {
method downloadThumbnail (line 213) | public byte[] downloadThumbnail(String videoId) throws IOException {
method readResponseBody (line 238) | private String readResponseBody(Response response) throws IOException {
method extensionForMimeType (line 244) | private String extensionForMimeType(String mimeType) {
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/perplexity/PerplexityAI.java
class PerplexityAI (line 29) | public class PerplexityAI implements AIModel {
method PerplexityAI (line 35) | public PerplexityAI(PerplexityAIConfiguration config) {
method getModelProvider (line 39) | @Override
method generateEmbeddings (line 44) | @Override
method getChatOptions (line 49) | @Override
method getChatModel (line 65) | @Override
method getImageModel (line 81) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/perplexity/PerplexityAIConfiguration.java
class PerplexityAIConfiguration (line 25) | @Data
method PerplexityAIConfiguration (line 34) | public PerplexityAIConfiguration(String apiKey, String baseURL) {
method getBaseURL (line 39) | public String getBaseURL() {
method get (line 43) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/stabilityai/StabilityAI.java
class StabilityAI (line 55) | @Slf4j
method StabilityAI (line 72) | public StabilityAI(StabilityAIConfiguration config) {
method getModelProvider (line 126) | @Override
method getImageModel (line 131) | @Override
method getImageOptions (line 136) | @Override
method getChatModel (line 150) | @Override
method generateEmbeddings (line 156) | @Override
method deriveAspectRatio (line 169) | private static String deriveAspectRatio(ImageOptions options) {
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/stabilityai/StabilityAIConfiguration.java
class StabilityAIConfiguration (line 30) | @Data
method get (line 39) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/providers/stabilityai/StabilityAiApi.java
class StabilityAiApi (line 47) | @Slf4j
method StabilityAiApi (line 56) | public StabilityAiApi(String apiKey) {
method StabilityAiApi (line 60) | public StabilityAiApi(String apiKey, String baseUrl) {
method generateImage (line 87) | public ImageResult generateImage(ImageCreateParams params) throws IOEx...
method resolveEndpoint (line 180) | private String resolveEndpoint(String model) {
method readResponseBody (line 196) | private String readResponseBody(Response response) throws IOException {
FILE: ai/src/main/java/org/conductoross/conductor/ai/sql/JDBCConnectionConfig.java
class JDBCConnectionConfig (line 22) | @Data
method createDataSource (line 54) | public DataSource createDataSource(String name) {
FILE: ai/src/main/java/org/conductoross/conductor/ai/sql/JDBCInput.java
class JDBCInput (line 17) | public class JDBCInput {
type Type (line 19) | public enum Type {
method JDBCInput (line 37) | public JDBCInput() {}
method getConnectionId (line 39) | public String getConnectionId() {
method setConnectionId (line 43) | public void setConnectionId(String connectionId) {
method getStatement (line 47) | public String getStatement() {
method setStatement (line 51) | public void setStatement(String statement) {
method getParameters (line 55) | public List<String> getParameters() {
method setParameters (line 59) | public void setParameters(List<String> parameters) {
method getType (line 63) | public Type getType() {
method setType (line 67) | public void setType(Type type) {
method getExpectedUpdateCount (line 71) | public int getExpectedUpdateCount() {
method setExpectedUpdateCount (line 75) | public void setExpectedUpdateCount(int expectedUpdateCount) {
method getIntegrationName (line 79) | public String getIntegrationName() {
method setIntegrationName (line 83) | public void setIntegrationName(String integrationName) {
method getSchemaName (line 87) | public String getSchemaName() {
method setSchemaName (line 91) | public void setSchemaName(String schemaName) {
FILE: ai/src/main/java/org/conductoross/conductor/ai/sql/JDBCInstanceConfig.java
class JDBCInstanceConfig (line 59) | @Component
method JDBCInstanceConfig (line 68) | public JDBCInstanceConfig(Environment env) {
method getInstances (line 72) | public List<JDBCInstance> getInstances() {
method setInstances (line 76) | public void setInstances(List<JDBCInstance> instances) {
method getJDBCInstances (line 84) | public Map<String, DataSource> getJDBCInstances() {
method getLegacyInstances (line 122) | private Map<String, DataSource> getLegacyInstances() {
class JDBCInstance (line 172) | public static class JDBCInstance {
method getName (line 176) | public String getName() {
method setName (line 180) | public void setName(String name) {
method getConnection (line 184) | public JDBCConnectionConfig getConnection() {
method setConnection (line 188) | public void setConnection(JDBCConnectionConfig connection) {
FILE: ai/src/main/java/org/conductoross/conductor/ai/sql/JDBCProvider.java
class JDBCProvider (line 33) | @Component
method JDBCProvider (line 44) | public JDBCProvider(JDBCInstanceConfig instanceConfig) {
method get (line 61) | public DataSource get(String name) {
method shutdown (line 76) | @PreDestroy
FILE: ai/src/main/java/org/conductoross/conductor/ai/sql/JDBCWorker.java
class JDBCWorker (line 37) | @Component
method JDBCWorker (line 44) | public JDBCWorker(JDBCProvider jdbcProvider) {
method execute (line 49) | @WorkerTask(NAME)
method executeSelect (line 83) | private TaskResult executeSelect(DataSource ds, JDBCInput input, Task ...
method executeUpdate (line 149) | private TaskResult executeUpdate(DataSource ds, JDBCInput input, Task ...
FILE: ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/AIModelTaskMapper.java
class AIModelTaskMapper (line 35) | @Component
method getTaskType (line 52) | @Override
method getMappedTasks (line 57) | @Override
method getMappedTask (line 64) | protected TaskModel getMappedTask(TaskMapperContext taskMapperContext)
FILE: ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/AudioGenerationTaskMapper.java
class AudioGenerationTaskMapper (line 22) | @Component
method AudioGenerationTaskMapper (line 29) | public AudioGenerationTaskMapper() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/CallMCPToolTaskMapper.java
class CallMCPToolTaskMapper (line 21) | @Component
method CallMCPToolTaskMapper (line 27) | public CallMCPToolTaskMapper() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/ChatCompleteTaskMapper.java
class ChatCompleteTaskMapper (line 45) | @Component
method ChatCompleteTaskMapper (line 53) | public ChatCompleteTaskMapper() {
method getMappedTask (line 57) | @Override
method updateTaskModel (line 87) | protected void updateTaskModel(ChatCompletion chatCompletion, TaskMode...
method getHistory (line 107) | private void getHistory(
FILE: ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/GenEmbeddingsTaskMapper.java
class GenEmbeddingsTaskMapper (line 22) | @Component
method GenEmbeddingsTaskMapper (line 29) | public GenEmbeddingsTaskMapper() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/GetEmbeddingsTaskMapper.java
class GetEmbeddingsTaskMapper (line 22) | @Component
method GetEmbeddingsTaskMapper (line 29) | public GetEmbeddingsTaskMapper() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/ImageGenerationTaskMapper.java
class ImageGenerationTaskMapper (line 22) | @Component
method ImageGenerationTaskMapper (line 29) | public ImageGenerationTaskMapper() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/IndexTextTaskMapper.java
class IndexTextTaskMapper (line 22) | @Component
method IndexTextTaskMapper (line 29) | public IndexTextTaskMapper() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/ListMCPToolsTaskMapper.java
class ListMCPToolsTaskMapper (line 21) | @Component
method ListMCPToolsTaskMapper (line 27) | public ListMCPToolsTaskMapper() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/PdfGenerationTaskMapper.java
class PdfGenerationTaskMapper (line 22) | @Component
method PdfGenerationTaskMapper (line 29) | public PdfGenerationTaskMapper() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/SearchIndexTaskMapper.java
class SearchIndexTaskMapper (line 22) | @Component
method SearchIndexTaskMapper (line 29) | public SearchIndexTaskMapper() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/StoreEmbeddingsTaskMapper.java
class StoreEmbeddingsTaskMapper (line 22) | @Component
method StoreEmbeddingsTaskMapper (line 29) | public StoreEmbeddingsTaskMapper() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/TextCompleteTaskMapper.java
class TextCompleteTaskMapper (line 22) | @Component
method TextCompleteTaskMapper (line 29) | public TextCompleteTaskMapper() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/VideoGenerationTaskMapper.java
class VideoGenerationTaskMapper (line 27) | @Component
method VideoGenerationTaskMapper (line 34) | protected VideoGenerationTaskMapper() {
FILE: ai/src/main/java/org/conductoross/conductor/ai/tasks/worker/DocumentGenWorkers.java
class DocumentGenWorkers (line 40) | @Slf4j
method DocumentGenWorkers (line 49) | public DocumentGenWorkers(
method generatePdf (line 62) | @WorkerTask("GENERATE_PDF")
method storeDocument (line 101) | private String storeDocument(String location, byte[] data) {
FILE: ai/src/main/java/org/conductoross/conductor/ai/tasks/worker/LLMWorkers.java
class LLMWorkers (line 47) | @Slf4j
method LLMWorkers (line 55) | public LLMWorkers(LLMs llm) {
method generateImage (line 60) | @WorkerTask(value = "GENERATE_IMAGE")
method generateAudio (line 65) | @WorkerTask(value = "GENERATE_AUDIO")
method generateVideo (line 70) | @WorkerTask(value = "GENERATE_VIDEO")
method textCompletion (line 99) | @WorkerTask(value = "LLM_TEXT_COMPLETE")
method chatCompletion (line 125) | @SneakyThrows
method generateEmbeddings (line 131) | @WorkerTask("LLM_GENERATE_EMBEDDINGS")
method generateEmbeddings (line 145) | private List<Float> generateEmbeddings(
FILE: ai/src/main/java/org/conductoross/conductor/ai/tasks/worker/MCPWorkers.java
class MCPWorkers (line 38) | @Slf4j
method MCPWorkers (line 45) | public MCPWorkers(MCPService mcpService) {
method listTools (line 58) | @WorkerTask("LIST_MCP_TOOLS")
method callTool (line 80) | @WorkerTask("CALL_MCP_TOOL")
class ToolInfo (line 101) | public static class ToolInfo {
method from (line 106) | public static ToolInfo from(McpSchema.Tool tool) {
class ToolCallResult (line 116) | public static class ToolCallResult {
method from (line 120) | public static ToolCallResult from(McpSchema.CallToolResult result) {
method from (line 128) | @SuppressWarnings("unchecked")
class ContentItem (line 141) | public static class ContentItem {
method from (line 148) | public static ContentItem from(Object content) {
method fromMap (line 175) | @SuppressWarnings("unchecked")
FILE: ai/src/main/java/org/conductoross/conductor/ai/tasks/worker/VectorDBWorkers.java
class VectorDBWorkers (line 43) | @Slf4j
method VectorDBWorkers (line 54) | public VectorDBWorkers(VectorDBs vectorDBs, LLMs llm) {
method indexText (line 60) | @WorkerTask("LLM_INDEX_TEXT")
method storeEmbeddings (line 93) | @WorkerTask("LLM_STORE_EMBEDDINGS")
method searchUsingEmbeddings (line 113) | @WorkerTask("LLM_SEARCH_EMBEDDINGS")
method searchUsingEmbeddingsDeprecated (line 131) | @Deprecated
method searchIndex (line 138) | @WorkerTask(value = "LLM_SEARCH_INDEX")
method generateEmbeddings (line 162) | private List<Float> generateEmbeddings(
FILE: ai/src/main/java/org/conductoross/conductor/ai/vectordb/VectorDB.java
class VectorDB (line 20) | public abstract class VectorDB {
method VectorDB (line 25) | public VectorDB(String name, String type) {
method getName (line 30) | public String getName() {
method getType (line 34) | public String getType() {
method updateEmbeddings (line 38) | public abstract int updateEmbeddings(
method search (line 47) | public abstract List<IndexedDoc> search(
FILE: ai/src/main/java/org/conductoross/conductor/ai/vectordb/VectorDBConfig.java
type VectorDBConfig (line 19) | public interface VectorDBConfig<T extends VectorDB> {
method get (line 20) | T get();
FILE: ai/src/main/java/org/conductoross/conductor/ai/vectordb/VectorDBInstanceConfig.java
class VectorDBInstanceConfig (line 47) | @Component
method getInstances (line 54) | public List<VectorDBInstance> getInstances() {
method setInstances (line 58) | public void setInstances(List<VectorDBInstance> instances) {
method get (line 62) | @Override
method getVectorDBInstances (line 73) | public Map<String, VectorDB> getVectorDBInstances() {
method createVectorDB (line 103) | private VectorDB createVectorDB(VectorDBInstance instance) {
method createPostgresVectorDB (line 126) | private VectorDB createPostgresVectorDB(VectorDBInstance instance) {
method createMongoVectorDB (line 135) | private VectorDB createMongoVectorDB(VectorDBInstance instance) {
method createPineconeVectorDB (line 144) | private VectorDB createPineconeVectorDB(VectorDBInstance instance) {
class VectorDBInstance (line 154) | public static class VectorDBInstance {
method getName (line 161) | public String getName() {
method setName (line 165) | public void setName(String name) {
method getType (line 169) | public String getType() {
method setType (line 173) | public void setType(String type) {
method getPostgres (line 177) | public PostgresConfig getPostgres() {
method setPostgres (line 181) | public void setPostgres(PostgresConfig postgres) {
method getMongodb (line 185) | public MongoDBConfig getMongodb() {
method setMongodb (line 189) | public void setMongodb(MongoDBConfig mongodb) {
method getPinecone (line 193) | public PineconeConfig getPinecone() {
method setPinecone (line 197) | public void setPinecone(PineconeConfig pinecone) {
FILE: ai/src/main/java/org/conductoross/conductor/ai/vectordb/VectorDBProvider.java
class VectorDBProvider (line 31) | @Component
method VectorDBProvider (line 42) | public VectorDBProvider(VectorDBInstanceConfig instanceConfig) {
method get (line 67) | public VectorDB get(String name, TaskContext taskContext) {
FILE: ai/src/main/java/org/conductoross/conductor/ai/vectordb/VectorDBs.java
class VectorDBs (line 26) | @Component
method VectorDBs (line 32) | public VectorDBs(VectorDBProvider vectorDBProvider) {
method storeEmbeddings (line 37) | public int storeEmbeddings(
method searchEmbeddings (line 55) | public List<IndexedDoc> searchEmbeddings(
FILE: ai/src/main/java/org/conductoross/conductor/ai/vectordb/mongodb/MongoDBConfig.java
class MongoDBConfig (line 21) | @Data
method get (line 34) | @Override
method get (line 39) | public MongoVectorDB get(String name) {
FILE: ai/src/main/java/org/conductoross/conductor/ai/vectordb/mongodb/MongoVectorDB.java
class MongoVectorDB (line 44) | @Slf4j
method MongoVectorDB (line 55) | public MongoVectorDB(String name, MongoDBConfig config) {
method updateEmbeddings (line 72) | @Override
method upsertEmbeddings (line 101) | private int upsertEmbeddings(
method getClient (line 128) | @SneakyThrows
method getDatabase (line 134) | @SneakyThrows
method getMongoClient (line 140) | private MongoClient getMongoClient(String connectionString) {
method search (line 154) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/vectordb/pinecone/PineconeConfig.java
class PineconeConfig (line 21) | @Data
method get (line 28) | @Override
method get (line 33) | public PineconeDB get(String name) {
FILE: ai/src/main/java/org/conductoross/conductor/ai/vectordb/pinecone/PineconeDB.java
class PineconeDB (line 44) | @Slf4j
method PineconeDB (line 52) | public PineconeDB(String name, PineconeConfig config) {
method updateEmbeddingsWithNameSpace (line 63) | @SneakyThrows
method updateEmbeddings (line 100) | @Override
method searchWithNameSpace (line 122) | public List<IndexedDoc> searchWithNameSpace(
method toJavaMap (line 173) | private Map<String, Object> toJavaMap(Struct metadata) {
method search (line 187) | public List<IndexedDoc> search(
method getConnection (line 200) | @SneakyThrows
method getIndex (line 205) | private Index getIndex(String indexName) {
FILE: ai/src/main/java/org/conductoross/conductor/ai/vectordb/postgres/PostgresConfig.java
class PostgresConfig (line 21) | @Data
method get (line 44) | @Override
method get (line 49) | public PostgresVectorDB get(String name) {
FILE: ai/src/main/java/org/conductoross/conductor/ai/vectordb/postgres/PostgresVectorDB.java
class PostgresVectorDB (line 42) | @Slf4j
method PostgresVectorDB (line 53) | public PostgresVectorDB(String name, PostgresConfig config) {
method getClient (line 76) | @SneakyThrows
method getPgVectorClient (line 82) | private DataSource getPgVectorClient() {
method waitForConnectionPoolReady (line 107) | private void waitForConnectionPoolReady(DataSource dataSource) {
method updateEmbeddings (line 131) | @Override
method upsertEmbeddings (line 181) | private int upsertEmbeddings(
method createVectorIndexIfNotExists (line 245) | private void createVectorIndexIfNotExists(String tableName, String ind...
method createVectorTableIfNotExists (line 291) | private void createVectorTableIfNotExists(String tableName, Connection...
method search (line 319) | @Override
method searchWithNamespace (line 325) | private List<IndexedDoc> searchWithNamespace(
method getVectorOps (line 385) | private String getVectorOps(String distanceMetric) {
method getQueryOperator (line 400) | private String getQueryOperator(String distanceMetric) {
FILE: ai/src/main/java/org/conductoross/conductor/ai/video/AsyncVideoModel.java
type AsyncVideoModel (line 26) | public interface AsyncVideoModel extends VideoModel {
method checkStatus (line 36) | VideoResponse checkStatus(String jobId);
FILE: ai/src/main/java/org/conductoross/conductor/ai/video/Video.java
class Video (line 27) | public class Video {
method Video (line 34) | public Video(String url, String b64Json) {
method Video (line 38) | public Video(String url, String b64Json, String mimeType) {
method Video (line 42) | public Video(String url, String b64Json, byte[] data, String mimeType) {
method fromBytes (line 50) | public static Video fromBytes(byte[] data, String mimeType) {
method getUrl (line 55) | public String getUrl() {
method setUrl (line 59) | public void setUrl(String url) {
method getB64Json (line 64) | public String getB64Json() {
method setB64Json (line 68) | public void setB64Json(String b64Json) {
method getData (line 73) | public byte[] getData() {
method setData (line 77) | public void setData(byte[] data) {
method getMimeType (line 82) | public String getMimeType() {
method setMimeType (line 86) | public void setMimeType(String mimeType) {
method equals (line 90) | @Override
method hashCode (line 100) | @Override
method toString (line 107) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/video/VideoGeneration.java
class VideoGeneration (line 23) | public class VideoGeneration implements ModelResult<Video> {
method VideoGeneration (line 28) | public VideoGeneration(Video video) {
method VideoGeneration (line 32) | public VideoGeneration(Video video, VideoGenerationMetadata videoGener...
method getOutput (line 37) | @Override
method getMetadata (line 42) | @Override
method toString (line 47) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/video/VideoGenerationMetadata.java
type VideoGenerationMetadata (line 23) | public interface VideoGenerationMetadata extends ResultMetadata {}
FILE: ai/src/main/java/org/conductoross/conductor/ai/video/VideoMessage.java
class VideoMessage (line 23) | public class VideoMessage {
method VideoMessage (line 28) | public VideoMessage(String text) {
method VideoMessage (line 32) | public VideoMessage(String text, Float weight) {
method getText (line 37) | public String getText() {
method getWeight (line 41) | public Float getWeight() {
method equals (line 45) | @Override
method hashCode (line 52) | @Override
method toString (line 57) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/video/VideoModel.java
type VideoModel (line 30) | @FunctionalInterface
method call (line 39) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/video/VideoOptions.java
type VideoOptions (line 26) | public interface VideoOptions extends ModelOptions {
method getModel (line 31) | String getModel();
method getN (line 34) | Integer getN();
method getWidth (line 37) | Integer getWidth();
method getHeight (line 40) | Integer getHeight();
method getOutputFormat (line 43) | String getOutputFormat();
method getStyle (line 46) | String getStyle();
method getDuration (line 51) | Integer getDuration();
method getFps (line 54) | Integer getFps();
method getAspectRatio (line 57) | String getAspectRatio();
method getInputImage (line 60) | String getInputImage();
method getSize (line 63) | String getSize();
method getMotion (line 68) | String getMotion();
method getSeed (line 71) | Integer getSeed();
method getGuidanceScale (line 74) | Float getGuidanceScale();
method getNegativePrompt (line 77) | String getNegativePrompt();
method getPersonGeneration (line 80) | String getPersonGeneration();
method getResolution (line 83) | String getResolution();
method getGenerateAudio (line 86) | Boolean getGenerateAudio();
method getGenerateThumbnail (line 91) | Boolean getGenerateThumbnail();
method getThumbnailTimestamp (line 94) | Integer getThumbnailTimestamp();
FILE: ai/src/main/java/org/conductoross/conductor/ai/video/VideoOptionsBuilder.java
class VideoOptionsBuilder (line 26) | @Data
FILE: ai/src/main/java/org/conductoross/conductor/ai/video/VideoPrompt.java
class VideoPrompt (line 29) | public class VideoPrompt implements ModelRequest<List<VideoMessage>> {
method VideoPrompt (line 34) | public VideoPrompt(List<VideoMessage> messages) {
method VideoPrompt (line 38) | public VideoPrompt(List<VideoMessage> messages, VideoOptions options) {
method VideoPrompt (line 43) | public VideoPrompt(VideoMessage message, VideoOptions options) {
method VideoPrompt (line 47) | public VideoPrompt(String instructions, VideoOptions options) {
method VideoPrompt (line 51) | public VideoPrompt(String instructions) {
method getInstructions (line 55) | @Override
method getOptions (line 60) | @Override
method equals (line 65) | @Override
method hashCode (line 73) | @Override
method toString (line 78) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/video/VideoResponse.java
class VideoResponse (line 27) | public class VideoResponse implements ModelResponse<VideoGeneration> {
method VideoResponse (line 32) | public VideoResponse(List<VideoGeneration> generations) {
method VideoResponse (line 36) | public VideoResponse(List<VideoGeneration> generations, VideoResponseM...
method getResult (line 41) | @Override
method getResults (line 46) | @Override
method getMetadata (line 51) | @Override
method equals (line 56) | @Override
method hashCode (line 64) | @Override
method toString (line 69) | @Override
FILE: ai/src/main/java/org/conductoross/conductor/ai/video/VideoResponseMetadata.java
class VideoResponseMetadata (line 27) | public class VideoResponseMetadata extends MutableResponseMetadata {
method VideoResponseMetadata (line 40) | public VideoResponseMetadata() {
method VideoResponseMetadata (line 44) | public VideoResponseMetadata(Long created) {
method getCreated (line 49) | public Long getCreated() {
method getJobId (line 54) | public String getJobId() {
method setJobId (line 58) | public void setJobId(String jobId) {
method getStatus (line 63) | public String getStatus() {
method setStatus (line 67) | public void setStatus(String status) {
method getErrorMessage (line 72) | public String getErrorMessage() {
method setErrorMessage (line 76) | public void setErrorMessage(String errorMessage) {
FILE: ai/src/main/java/org/conductoross/conductor/config/AIIntegrationEnabledCondition.java
class AIIntegrationEnabledCondition (line 18) | public class AIIntegrationEnabledCondition extends AllNestedConditions {
method AIIntegrationEnabledCondition (line 19) | public AIIntegrationEnabledCondition() {
class AIIntegrationsEnabled (line 23) | @ConditionalOnProperty(
FILE: ai/src/test/java/org/conductoross/conductor/ai/AIModelProviderTest.java
class AIModelProviderTest (line 25) | class AIModelProviderTest {
method setUp (line 29) | @BeforeEach
method testEmptyProviderList (line 36) | @Test
method testGetModel_nullProviderThrowsException (line 46) | @Test
method testGetModel_unknownProviderThrowsException (line 56) | @Test
method testGetModel_registeredProviderReturnsModel (line 66) | @Test
method testMultipleProviders (line 86) | @Test
method testProviderInitializationFailure_logsAndContinues (line 113) | @Test
method testGetTokenUsageLogger_returnsConsumer (line 138) | @Test
method testPayloadStoreLocation_defaultValue (line 145) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/LLMHelperTest.java
class LLMHelperTest (line 24) | public class LLMHelperTest {
method setUp (line 28) | @BeforeEach
method testParseNestedJsonStringsWithSimpleNestedJson (line 34) | @Test
method testParseNestedJsonStringsWithDeeplyNestedJson (line 58) | @Test
method testParseNestedJsonStringsWithArrayJson (line 98) | @Test
method testParseNestedJsonStringsWithMixedDataTypes (line 127) | @Test
method testParseNestedJsonStringsWithInvalidJson (line 170) | @Test
method testIsJsonString (line 194) | @Test
method testExtractMethodFromInputParametersWithDynamicKey (line 210) | @Test
method testExtractMethodFromInputParametersWithNullInput (line 224) | @Test
method testExtractMethodFromInputParametersWithEmptyMap (line 230) | @Test
method testExtractMethodFromInputParametersWithoutMethodKey (line 237) | @Test
method testExtractMethodFromInputParametersWithNonMapValues (line 249) | @Test
method testExtractMethodFromInputParametersWithMultipleEntries (line 260) | @Test
method testExtractMethodFromInputParametersWithMethodAsString (line 277) | @Test
method testExtractMethodFromInputParametersWithMethodAsInteger (line 288) | @Test
method testExtractMethodFromInputParametersWithMethodAsNull (line 300) | @Test
method testExtractMethodFromInputParametersWithMixedStructure (line 311) | @Test
method testExtractMethodFromInputParametersWithDeepNesting (line 327) | @Test
method testExtractMethodFromInputParametersWithMultipleMapsFirstHasMethod (line 342) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/LLMsTest.java
class LLMsTest (line 26) | class LLMsTest {
method setUp (line 32) | @BeforeEach
method testConstructor_setsPayloadStoreLocation (line 42) | @Test
method testGenerateEmbeddings_delegatesToModel (line 47) | @Test
method testGenerateEmbeddings_usesCorrectProvider (line 65) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/document/DocumentAccessPolicyTest.java
class DocumentAccessPolicyTest (line 25) | class DocumentAccessPolicyTest {
method setUp (line 30) | @BeforeEach
method shouldBlockEtcPasswd (line 44) | @Test
method shouldBlockEtcShadow (line 50) | @Test
method shouldBlockEtcSshDirectory (line 56) | @Test
method shouldBlockProcSelfEnviron (line 63) | @Test
method shouldBlockFileUriScheme (line 70) | @Test
method shouldBlockKubernetesSecrets (line 77) | @Test
method shouldBlockDockerSecrets (line 84) | @Test
method shouldBlockDotEnvFile (line 95) | @Test
method shouldBlockPrivateKey (line 102) | @Test
method shouldBlockCredentialsJson (line 109) | @Test
method shouldBlockKeystoreJks (line 116) | @Test
method shouldBlockAwsMetadata (line 127) | @Test
method shouldBlockAwsEcsMetadata (line 136) | @Test
method shouldBlockGcpMetadata (line 143) | @Test
method shouldBlockAlibabaMetadata (line 150) | @Test
method shouldBlockAwsDnsAlias (line 157) | @Test
method shouldBlockKubernetesApiServer (line 164) | @Test
method shouldBlockLinkLocalViaResolvedAddress (line 175) | @Test
method shouldBlockLoopbackAddress (line 182) | @Test
method shouldBlockLocalhostViaResolution (line 189) | @Test
method shouldBlockDockerSocket (line 200) | @Test
method shouldBlockKubernetesNodeConfig (line 207) | @Test
method shouldBlockWindowsRegistryHive (line 214) | @Test
method shouldBlockWindowsUnattendXml (line 221) | @Test
method shouldBlockTerraformState (line 228) | @Test
method shouldBlockVaultToken (line 235) | @Test
method shouldBlockGcpApplicationDefaultCredentials (line 242) | @Test
method shouldBlockMavenSettings (line 249) | @Test
method shouldBlockEnvStaging (line 256) | @Test
method shouldBlockWebConfig (line 263) | @Test
method shouldBlockMacOsKeychain (line 270) | @Test
method shouldBlockPowerShellHistory (line 277) | @Test
method shouldBlockPathTraversal (line 290) | @Test
method shouldAllowPathUnderDefaultPayloadDir (line 301) | @Test
method shouldAllowNormalHttpUrl (line 307) | @Test
method shouldAllowFileUriUnderPayloadDir (line 312) | @Test
method shouldAllowEverythingWhenDisabled (line 322) | @Test
method shouldBlockCustomPathPrefix (line 333) | @Test
method shouldBlockCustomFileName (line 341) | @Test
method shouldBlockCustomHost (line 349) | @Test
class AllowedDirectoriesTests (line 361) | @Nested
method shouldAutoIncludeParentDirFromConfig (line 364) | @Test
method shouldFallbackToDefaultPayloadDirWhenParentDirNotSet (line 377) | @Test
method shouldAllowAdditionalDirectoriesBeyondParentDir (line 387) | @Test
method shouldDenyPathOutsideAllowedDirectories (line 406) | @Test
method shouldDenyFileUriOutsideAllowedDirectories (line 418) | @Test
method shouldNotApplyAllowedDirectoriesToHttpUrls (line 430) | @Test
method shouldStillBlockSensitiveFilesEvenInsideAllowedDir (line 440) | @Test
method shouldHandleParentDirWithoutTrailingSlash (line 451) | @Test
method shouldIncludeEffectiveDirectoriesInDenialMessage (line 460) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/integration/AIModelIntegrationTest.java
class AIModelIntegrationTest (line 69) | public class AIModelIntegrationTest {
method isOpenAIConfigured (line 80) | static boolean isOpenAIConfigured() {
method isAnthropicConfigured (line 85) | static boolean isAnthropicConfigured() {
method isGeminiConfigured (line 90) | static boolean isGeminiConfigured() {
method isMistralConfigured (line 99) | static boolean isMistralConfigured() {
method isOllamaConfigured (line 104) | static boolean isOllamaConfigured() {
method isGrokConfigured (line 109) | static boolean isGrokConfigured() {
method isCohereConfigured (line 114) | static boolean isCohereConfigured() {
method isAzureOpenAIConfigured (line 119) | static boolean isAzureOpenAIConfigured() {
method isBedrockConfigured (line 127) | static boolean isBedrockConfigured() {
method isPerplexityConfigured (line 135) | static boolean isPerplexityConfigured() {
class OpenAITests (line 144) | @Nested
method setup (line 153) | @BeforeAll
method testChatCompletion (line 161) | @Test
method testImageGeneration (line 184) | @Test
method testAudioGeneration (line 213) | @Test
method testEmbeddings (line 236) | @Test
method testModelProviderName (line 250) | @Test
class AnthropicTests (line 261) | @Nested
method setup (line 270) | @BeforeAll
method testChatCompletionHaiku (line 278) | @Test
method testDeterministicTemperature (line 301) | @Test
method testThinkingMode (line 325) | @Test
method testModelProviderName (line 348) | @Test
class GeminiTests (line 359) | @Nested
method setup (line 368) | @BeforeAll
method testChatCompletionFlash (line 388) | @Test
method testEmbeddings (line 411) | @Test
method testModelProviderName (line 425) | @Test
class MistralTests (line 436) | @Nested
method setup (line 445) | @BeforeAll
method testChatCompletion (line 453) | @Test
method testJsonOutputFormat (line 476) | @Test
method testTopPParameter (line 506) | @Test
method testEmbeddings (line 527) | @Test
method testModelProviderName (line 541) | @Test
class OllamaTests (line 552) | @Nested
method setup (line 561) | @BeforeAll
method testChatCompletion (line 570) | @Test
method testJsonOutputFormat (line 592) | @Test
method testNumPredictLimit (line 615) | @Test
method testEmbeddings (line 640) | @Test
method testModelProviderName (line 653) | @Test
class GrokTests (line 664) | @Nested
method setup (line 672) | @BeforeAll
method testChatCompletion (line 680) | @Test
method testModelProviderName (line 703) | @Test
class CohereTests (line 714) | @Nested
method setup (line 726) | @BeforeAll
method testChatCompletion (line 734) | @Test
method testEmbeddings (line 757) | @Test
method testModelProviderName (line 770) | @Test
class AzureOpenAITests (line 781) | @Nested
method setup (line 790) | @BeforeAll
method testChatCompletion (line 798) | @Test
method testEmbeddings (line 823) | @Test
method testModelProviderName (line 844) | @Test
class BedrockTests (line 855) | @Nested
method setup (line 864) | @BeforeAll
method testChatCompletion (line 885) | @Test
method testModelProviderName (line 909) | @Test
class PerplexityTests (line 920) | @Nested
method setup (line 929) | @BeforeAll
method testChatCompletion (line 937) | @Test
method testModelProviderName (line 960) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/mapper/GenEmbeddingsTaskMapperTest.java
class GenEmbeddingsTaskMapperTest (line 35) | public class GenEmbeddingsTaskMapperTest {
method testTaskMapperValidations (line 37) | @Test
method getTaskMapperContext (line 99) | protected TaskMapperContext getTaskMapperContext(
FILE: ai/src/test/java/org/conductoross/conductor/ai/mapper/GetEmbeddingsTaskMapperTest.java
class GetEmbeddingsTaskMapperTest (line 36) | public class GetEmbeddingsTaskMapperTest {
method testTaskMapperValidations (line 38) | @Test
method getTaskMapperContext (line 111) | protected TaskMapperContext getTaskMapperContext(
FILE: ai/src/test/java/org/conductoross/conductor/ai/mapper/IndexTextTaskMapperTest.java
class IndexTextTaskMapperTest (line 35) | public class IndexTextTaskMapperTest {
method testTaskMapperValidations (line 37) | @Test
method getTaskMapperContext (line 136) | protected TaskMapperContext getTaskMapperContext(
FILE: ai/src/test/java/org/conductoross/conductor/ai/mapper/PdfGenerationTaskMapperTest.java
class PdfGenerationTaskMapperTest (line 32) | public class PdfGenerationTaskMapperTest {
method testTaskMapperReturnsCorrectTaskType (line 34) | @Test
method testTaskMapperCreatesScheduledTask (line 40) | @Test
method testTaskMapperPreservesInputParameters (line 67) | @Test
method testTaskMapperWithEmptyInputs (line 98) | @Test
method getTaskMapperContext (line 120) | protected TaskMapperContext getTaskMapperContext(
FILE: ai/src/test/java/org/conductoross/conductor/ai/mapper/SearchIndexTaskMapperTest.java
class SearchIndexTaskMapperTest (line 35) | public class SearchIndexTaskMapperTest {
method testTaskMapperValidations (line 37) | @Test
method getTaskMapperContext (line 136) | protected TaskMapperContext getTaskMapperContext(
FILE: ai/src/test/java/org/conductoross/conductor/ai/mapper/StoreEmbeddingsTaskMapperTest.java
class StoreEmbeddingsTaskMapperTest (line 36) | public class StoreEmbeddingsTaskMapperTest {
method testTaskMapperValidations (line 38) | @Test
method getTaskMapperContext (line 113) | protected TaskMapperContext getTaskMapperContext(
FILE: ai/src/test/java/org/conductoross/conductor/ai/mapper/TextCompleteTaskMapperTest.java
class TextCompleteTaskMapperTest (line 36) | public class TextCompleteTaskMapperTest {
method testTaskMapperValidations (line 38) | @Test
method getTaskMapperContext (line 129) | protected TaskMapperContext getTaskMapperContext(
FILE: ai/src/test/java/org/conductoross/conductor/ai/mcp/JsonTextParserTest.java
class JsonTextParserTest (line 26) | class JsonTextParserTest {
method setUp (line 31) | @BeforeEach
method testParseValidJsonObject (line 39) | @Test
method testParseValidJsonObjectWithWhitespace (line 50) | @Test
method testParseEmptyJsonObject (line 60) | @Test
method testParseNestedJsonObject (line 70) | @Test
method testParseValidJsonArray (line 83) | @Test
method testParseEmptyJsonArray (line 95) | @Test
method testParseNestedJsonArray (line 105) | @Test
method testParseJsonString (line 121) | @Test
method testParseJsonNumber (line 131) | @Test
method testParseJsonBoolean (line 141) | @Test
method testParseJsonNull (line 155) | @Test
method testParsePlainText (line 166) | @Test
method testParseInvalidJson (line 175) | @Test
method testParseIncompleteJson (line 184) | @Test
method testParseJsonWithTrailingComma (line 193) | @Test
method testParseNullInput (line 205) | @Test
method testParseEmptyString (line 213) | @Test
method testParseWhitespaceOnly (line 222) | @Test
method testParseJsonWithEscapedCharacters (line 233) | @Test
method testParseJsonWithUnicodeCharacters (line 246) | @Test
method testParseJsonWithQuotesInString (line 257) | @Test
method testParseTextOrJsonReturnsJsonNode (line 269) | @Test
method testParseTextOrJsonReturnsTextNode (line 278) | @Test
method testParseTextOrJsonWithNullReturnsEmptyText (line 287) | @Test
method testParseMcpToolResponse (line 296) | @Test
method testParseJsonLikeTextThatIsNotJson (line 309) | @Test
method testParseLargeJsonObject (line 319) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/pdf/DocumentGenWorkersTest.java
class DocumentGenWorkersTest (line 35) | class DocumentGenWorkersTest {
method setUp (line 41) | @BeforeEach
method withMockedTaskContext (line 61) | private void withMockedTaskContext(Runnable action) {
method testGeneratePdfWithValidInput (line 75) | @Test
method testGeneratePdfWithBlankMarkdownThrowsException (line 102) | @Test
method testGeneratePdfWithNullMarkdownThrowsException (line 116) | @Test
method testGeneratePdfWithCustomOutputLocation (line 130) | @Test
method testGeneratePdfWithDefaultOutputLocation (line 158) | @Test
method testGeneratePdfWithUnsupportedOutputLocation (line 180) | @Test
method testConverterIsCalledWithRequest (line 200) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/pdf/MarkdownToPdfConverterTest.java
class MarkdownToPdfConverterTest (line 36) | class MarkdownToPdfConverterTest {
method setUp (line 41) | @BeforeEach
method convertAndLoad (line 51) | private PDDocument convertAndLoad(String markdown) throws IOException {
method convertAndLoad (line 55) | private PDDocument convertAndLoad(String markdown, String pageSize) th...
method extractText (line 67) | private String extractText(PDDocument doc) throws IOException {
class HeadingsAndParagraphs (line 76) | @Nested
method testProducesValidPdf (line 107) | @Test
method testContainsAllHeadingText (line 115) | @Test
method testContainsParagraphText (line 128) | @Test
class EmphasisAndFormatting (line 143) | @Nested
method testProducesValidPdf (line 162) | @Test
method testContainsFormattedText (line 169) | @Test
class BulletLists (line 185) | @Nested
method testProducesValidPdf (line 215) | @Test
method testContainsListItems (line 222) | @Test
class OrderedAndTaskLists (line 240) | @Nested
method testProducesValidPdf (line 267) | @Test
method testContainsOrderedItems (line 274) | @Test
method testContainsTaskListItems (line 285) | @Test
class CodeBlocks (line 299) | @Nested
method testProducesValidPdf (line 339) | @Test
method testContainsCodeContent (line 346) | @Test
class Tables (line 361) | @Nested
method testProducesValidPdf (line 392) | @Test
method testContainsTableData (line 399) | @Test
class Blockquotes (line 416) | @Nested
method testProducesValidPdf (line 443) | @Test
method testContainsBlockquoteText (line 450) | @Test
class LinksAndRules (line 466) | @Nested
method testProducesValidPdf (line 493) | @Test
method testContainsLinkText (line 500) | @Test
class Images (line 516) | @Nested
method testProducesValidPdfWithMissingImages (line 537) | @Test
method testImageWithDataUri (line 549) | @Test
class ComplexMixed (line 641) | @Nested
method testProducesValidPdf (line 717) | @Test
method testContainsAllSections (line 724) | @Test
method testContainsTableData (line 738) | @Test
method testContainsCodeBlock (line 748) | @Test
class LongDocument (line 762) | @Nested
method testLongDocumentCreatesMultiplePages (line 766) | @Test
method testLongDocumentPreservesAllContent (line 785) | @Test
class EdgeCases (line 805) | @Nested
method testMinimalMarkdown (line 809) | @Test
method testOnlyHeading (line 818) | @Test
method testEmptyParagraphs (line 827) | @Test
method testSpecialCharacters (line 838) | @Test
method testVeryLongSingleLine (line 846) | @Test
method testOnlyCodeBlock (line 855) | @Test
method testOnlyTable (line 865) | @Test
method testOnlyList (line 873) | @Test
method testWhitespaceOnlyMarkdown (line 885) | @Test
class LayoutOptions (line 897) | @Nested
method testA4PageSize (line 901) | @Test
method testLetterPageSize (line 918) | @Test
method testLegalPageSize (line 935) | @Test
method testUnknownPageSizeDefaultsToA4 (line 952) | @Test
method testCaseInsensitivePageSize (line 966) | @Test
method testCustomMargins (line 980) | @Test
method testLargeMargins (line 995) | @Test
method testCompactTheme (line 1012) | @Test
method testCustomFontSize (line 1035) | @Test
method testSmallFontSize (line 1048) | @Test
class PdfMetadata (line 1066) | @Nested
method testMetadataIsSet (line 1070) | @Test
method testPartialMetadata (line 1091) | @Test
method testNoMetadata (line 1105) | @Test
class DeeplyNested (line 1122) | @Nested
method testProducesValidPdf (line 1160) | @Test
method testContainsNestedContent (line 1167) | @Test
class ErrorHandling (line 1183) | @Nested
method testNullMarkdownThrowsException (line 1187) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/pdf/PdfImageResolverTest.java
class PdfImageResolverTest (line 25) | class PdfImageResolverTest {
method setUp (line 31) | @BeforeEach
method testResolveBase64DataUri (line 53) | @Test
method testResolveDataUriWithDifferentMimeType (line 65) | @Test
method testResolveInvalidDataUriReturnsNull (line 77) | @Test
method testResolveHttpUrl (line 86) | @Test
method testResolveHttpsUrl (line 98) | @Test
method testResolveHttpUrlFailureReturnsNull (line 109) | @Test
method testResolveFileUrl (line 121) | @Test
method testResolveRelativePathWithBaseUrl (line 134) | @Test
method testResolveRelativePathWithBaseUrlNoTrailingSlash (line 146) | @Test
method testResolveRelativePathWithoutBaseUrlFails (line 157) | @Test
method testResolveAbsoluteUrlIgnoresBaseUrl (line 165) | @Test
method testResolveNullSrcReturnsNull (line 179) | @Test
method testResolveEmptySrcReturnsNull (line 184) | @Test
method testResolveBlankSrcReturnsNull (line 189) | @Test
method testResolveWithNoSupportingLoaderReturnsNull (line 194) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/pdf/PdfRenderContextTest.java
class PdfRenderContextTest (line 25) | class PdfRenderContextTest {
method setUp (line 30) | @BeforeEach
method tearDown (line 45) | @AfterEach
method testDefaultConstructionSetsProperties (line 55) | @Test
method testCompactModeReducesLineSpacing (line 68) | @Test
method testFontsAreInitialized (line 76) | @Test
method testContentWidthWithDefaultMargins (line 88) | @Test
method testContentWidthWithListIndent (line 95) | @Test
method testContentWidthWithNestedListIndent (line 102) | @Test
method testContentWidthWithBlockquote (line 109) | @Test
method testContentWidthWithBlockquoteAndListIndent (line 116) | @Test
method testLeftXWithDefaultMargins (line 124) | @Test
method testLeftXWithListIndent (line 129) | @Test
method testRightX (line 135) | @Test
method testLineHeightDefaultSpacing (line 143) | @Test
method testLineHeightCompactSpacing (line 149) | @Test
method testLineHeightWithDifferentFontSizes (line 156) | @Test
method testNewPageCreatesPageAndContentStream (line 164) | @Test
method testMultipleNewPagesIncreasePageCount (line 174) | @Test
method testAdvanceCursorMovesDown (line 183) | @Test
method testEnsureSpaceCreatesNewPageWhenNeeded (line 191) | @Test
method testEnsureSpaceDoesNotCreatePageWhenEnoughRoom (line 206) | @Test
method testTextWidthReturnsPositiveValue (line 221) | @Test
method testTextWidthScalesWithFontSize (line 227) | @Test
method testEmptyTextHasZeroWidth (line 234) | @Test
method testMonoFontHasConsistentCharWidth (line 240) | @Test
method testLetterPageSize (line 250) | @Test
method testCustomMargins (line 258) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/providers/anthropic/AnthropicConfigurationTest.java
class AnthropicConfigurationTest (line 19) | class AnthropicConfigurationTest {
method testDefaultBaseURL (line 21) | @Test
method testCustomBaseURL (line 27) | @Test
method testGetCreatesAnthropicInstance (line 34) | @Test
method testAllArgsConstructor (line 45) | @Test
method testNoArgsConstructor (line 58) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/providers/anthropic/AnthropicTest.java
class AnthropicTest (line 28) | class AnthropicTest {
class UnitTests (line 32) | @Nested
method setUp (line 37) | @BeforeEach
method testGetModelProvider (line 44) | @Test
method testGenerateEmbeddings_throwsUnsupportedException (line 49) | @Test
method testGetImageModel_throwsUnsupportedException (line 55) | @Test
method testGetChatOptions_basicOptions (line 60) | @Test
method testGetChatOptions_withThinkingMode (line 73) | @Test
method testGetChatOptions_withTools (line 86) | @Test
method testGetChatModel_createsModel (line 104) | @Test
class IntegrationTests (line 111) | @Nested
method setUp (line 117) | @BeforeEach
method testChatCompletion (line 124) | @Test
method testChatCompletion_withThinking (line 143) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/providers/azureopenai/AzureOpenAIConfigurationTest.java
class AzureOpenAIConfigurationTest (line 19) | class AzureOpenAIConfigurationTest {
method testGetCreatesAzureOpenAIInstance (line 21) | @Test
method testAllArgsConstructor (line 34) | @Test
method testNoArgsConstructor (line 45) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/providers/azureopenai/AzureOpenAITest.java
class AzureOpenAITest (line 29) | class AzureOpenAITest {
class UnitTests (line 34) | @Nested
method setUp (line 39) | @BeforeEach
method testGetModelProvider (line 48) | @Test
method testGetChatOptions_basicOptions (line 53) | @Test
method testGetImageOptions (line 65) | @Test
class IntegrationTests (line 79) | @Nested
method setUp (line 86) | @BeforeEach
method testChatCompletion (line 98) | @Test
method testEmbeddings (line 117) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/providers/bedrock/BedrockConfigurationTest.java
class BedrockConfigurationTest (line 23) | class BedrockConfigurationTest {
method testDefaultRegion (line 25) | @Test
method testGetCreatesBedrockInstance (line 31) | @Test
method testAwsCredentialsProvider_withAccessKeyAndSecret (line 43) | @Test
method testAwsCredentialsProvider_withBearerToken (line 55) | @Test
method testIsBearerTokenConfigured_true (line 66) | @Test
method testIsBearerTokenConfigured_false (line 73) | @Test
method testAwsCredentialsProvider_customProviderPreferred (line 82) | @Test
method testNoArgsConstructor (line 94) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/providers/bedrock/BedrockTest.java
class BedrockTest (line 28) | class BedrockTest {
class UnitTests (line 33) | @Nested
method setUp (line 38) | @BeforeEach
method testGetModelProvider (line 47) | @Test
method testGetChatOptions_basicOptions (line 52) | @Test
method testGetChatModel_createsModel (line 64) | @Test
method testGetImageModel_throwsUnsupportedException (line 70) | @Test
class IntegrationTests (line 76) | @Nested
method setUp (line 83) | @BeforeEach
method testChatCompletion (line 95) | @Test
method testEmbeddings (line 114) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/providers/cohere/CohereAIConfigurationTest.java
class CohereAIConfigurationTest (line 19) | class CohereAIConfigurationTest {
method testDefaultBaseURL (line 21) | @Test
method testGetCreatesCohereAIInstance (line 27) | @Test
method testAllArgsConstructor (line 38) | @Test
method testNoArgsConstructor (line 47) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/providers/cohere/CohereAITest.java
class CohereAITest (line 28) | class CohereAITest {
class UnitTests (line 32) | @Nested
method setUp (line 37) | @BeforeEach
method testGetModelProvider (line 44) | @Test
method testGetImageModel_throwsUnsupportedException (line 49) | @Test
method testGetChatOptions_basicOptions (line 54) | @Test
method testGetChatModel_createsModel (line 66) | @Test
class IntegrationTests (line 73) | @Nested
method setUp (line 79) | @BeforeEach
method testChatCompletion (line 86) | @Test
method testEmbeddings (line 105) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/providers/gemini/GeminiVertexConfigurationTest.java
class GeminiVertexConfigurationTest (line 19) | class GeminiVertexConfigurationTest {
method testDefaultBaseURL_withLocation (line 21) | @Test
method testCustomBaseURL (line 28) | @Test
method testGetCreatesGeminiVertexInstance (line 35) | @Test
method testNoArgsConstructor (line 47) | @Test
method testDefaultBaseURL_nullLocationReturnsNullPrefix (line 57) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/providers/gemini/GeminiVertexTest.java
class GeminiVertexTest (line 28) | class GeminiVertexTest {
class UnitTests (line 33) | @Nested
method setUp (line 38) | @BeforeEach
method testGetModelProvider (line 46) | @Test
method testGetChatOptions_basicOptions (line 51) | @Test
method testGetChatOptions_withGoogleSearchRetrieval (line 65) | @Test
method testGetChatModel_createsModel (line 77) | @Test
class IntegrationTests (line 84) | @Nested
method setUp (line 90) | @BeforeEach
method testChatCompletion (line 101) | @Test
method testEmbeddings (line 120) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/providers/grok/GrokAIConfigurationTest.java
class GrokAIConfigurationTest (line 19) | class GrokAIConfigurationTest {
method testDefaultBaseURL (line 21) | @Test
method testCustomBaseURL (line 27) | @Test
method testGetCreatesGrokInstance (line 34) | @Test
method testAllArgsConstructor (line 45) | @Test
method testNoArgsConstructor (line 53) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/providers/grok/GrokTest.java
class GrokTest (line 27) | class GrokTest {
class UnitTests (line 31) | @Nested
method setUp (line 36) | @BeforeEach
method testGetModelProvider (line 43) | @Test
method testGenerateEmbeddings_throwsUnsupportedException (line 48) | @Test
method testGetImageModel_throwsUnsupportedException (line 53) | @Test
method testGetChatOptions_basicOptions (line 58) | @Test
method testGetChatModel_createsModel (line 70) | @Test
class IntegrationTests (line 77) | @Nested
method setUp (line 83) | @BeforeEach
method testChatCompletion (line 90) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/providers/huggingface/HuggingFaceConfigurationTest.java
class HuggingFaceConfigurationTest (line 19) | class HuggingFaceConfigurationTest {
method testDefaultBaseURL (line 21) | @Test
method testCustomBaseURL (line 27) | @Test
method testGetCreatesHuggingFaceInstance (line 34) | @Test
method testAllArgsConstructor (line 45) | @Test
method testNoArgsConstructor (line 54) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/providers/huggingface/HuggingFaceTest.java
class HuggingFaceTest (line 27) | class HuggingFaceTest {
class UnitTests (line 31) | @Nested
method setUp (line 36) | @BeforeEach
method testGetModelProvider (line 43) | @Test
method testGenerateEmbeddings_throwsUnsupportedException (line 48) | @Test
method testGetImageModel_throwsUnsupportedException (line 55) | @Test
method testGetChatOptions_basicOptions (line 60) | @Test
method testGetChatModel_createsModel (line 72) | @Test
class IntegrationTests (line 79) | @Nested
method setUp (line 85) | @BeforeEach
method testChatCompletion (line 92) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/providers/mistral/MistralAIConfigurationTest.java
class MistralAIConfigurationTest (line 19) | class MistralAIConfigurationTest {
method testDefaultBaseURL (line 21) | @Test
method testCustomBaseURL (line 27) | @Test
method testGetCreatesMistralAIInstance (line 34) | @Test
method testAllArgsConstructor (line 45) | @Test
method testNoArgsConstructor (line 53) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/providers/mistral/MistralAITest.java
class MistralAITest (line 28) | class MistralAITest {
class UnitTests (line 32) | @Nested
method setUp (line 37) | @BeforeEach
method testGetModelProvider (line 44) | @Test
method testGetImageModel_throwsUnsupportedException (line 49) | @Test
method testGetChatOptions_basicOptions (line 54) | @Test
method testGetChatModel_createsModel (line 67) | @Test
class IntegrationTests (line 74) | @Nested
method setUp (line 80) | @BeforeEach
method testChatCompletion (line 87) | @Test
method testEmbeddings (line 106) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/providers/ollama/OllamaConfigurationTest.java
class OllamaConfigurationTest (line 19) | class OllamaConfigurationTest {
method testDefaultBaseURL (line 21) | @Test
method testCustomBaseURL (line 27) | @Test
method testGetCreatesOllamaInstance (line 34) | @Test
method testAllArgsConstructor (line 44) | @Test
method testNoArgsConstructor (line 54) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/providers/ollama/OllamaTest.java
class OllamaTest (line 30) | @Disabled
class UnitTests (line 35) | @Nested
method setUp (line 40) | @BeforeEach
method testGetModelProvider (line 47) | @Test
method testGetImageModel_throwsUnsupportedException (line 52) | @Test
method testGetChatOptions_basicOptions (line 57) | @Test
method testGetChatModel_createsModel (line 69) | @Test
class IntegrationTests (line 76) | @Nested
method setUp (line 82) | @BeforeEach
method testChatCompletion (line 89) | @Test
method testEmbeddings (line 108) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/providers/openai/OpenAIConfigurationTest.java
class OpenAIConfigurationTest (line 19) | class OpenAIConfigurationTest {
method testDefaultBaseURL (line 21) | @Test
method testBlankBaseURLReturnsDefault (line 27) | @Test
method testCustomBaseURL (line 34) | @Test
method testGetCreatesOpenAIInstance (line 41) | @Test
method testAllArgsConstructor (line 52) | @Test
method testNoArgsConstructor (line 62) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/providers/openai/OpenAITest.java
class OpenAITest (line 29) | class OpenAITest {
class UnitTests (line 33) | @Nested
method setUp (line 38) | @BeforeEach
method testGetModelProvider (line 45) | @Test
method testGetChatOptions_basicOptions (line 50) | @Test
method testGetChatOptions_withStopWords (line 63) | @Test
method testGetImageOptions (line 75) | @Test
method testGetChatModel_createsModel (line 89) | @Test
method testGetImageModel_createsModel (line 95) | @Test
class IntegrationTests (line 102) | @Nested
method setUp (line 108) | @BeforeEach
method testChatCompletion (line 115) | @Test
method testEmbeddings (line 134) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/providers/perplexity/PerplexityAIConfigurationTest.java
class PerplexityAIConfigurationTest (line 19) | class PerplexityAIConfigurationTest {
method testDefaultBaseURL (line 21) | @Test
method testCustomBaseURL (line 27) | @Test
method testGetCreatesPerplexityAIInstance (line 34) | @Test
method testAllArgsConstructor (line 45) | @Test
method testNoArgsConstructor (line 54) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/providers/perplexity/PerplexityAITest.java
class PerplexityAITest (line 27) | class PerplexityAITest {
class UnitTests (line 31) | @Nested
method setUp (line 36) | @BeforeEach
method testGetModelProvider (line 43) | @Test
method testGenerateEmbeddings_throwsUnsupportedException (line 48) | @Test
method testGetImageModel_throwsUnsupportedException (line 55) | @Test
method testGetChatOptions_basicOptions (line 60) | @Test
method testGetChatModel_createsModel (line 72) | @Test
class IntegrationTests (line 79) | @Nested
method setUp (line 85) | @BeforeEach
method testChatCompletion (line 92) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/sql/JDBCConnectionConfigTest.java
class JDBCConnectionConfigTest (line 23) | class JDBCConnectionConfigTest {
method testCreateDataSourceWithAllProperties (line 25) | @Test
method testCreateDataSourceWithDefaults (line 60) | @Test
method testCreateDataSourceWithNullDriver (line 81) | @Test
method testCreateDataSourceWithBlankDriver (line 97) | @Test
method testCreateDataSourceWithNullCredentials (line 112) | @Test
method testDefaultValues (line 129) | @Test
method testAllArgsConstructor (line 141) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/sql/JDBCEndToEndTest.java
class JDBCEndToEndTest (line 41) | @TestInstance(TestInstance.Lifecycle.PER_CLASS)
method setup (line 48) | @BeforeAll
method teardown (line 73) | @AfterAll
method testProviderReturnsDataSource (line 83) | @Test
method testCreateTableAndInsertData (line 91) | @Test
method testSelectData (line 126) | @Test
method testSelectWithParameters (line 154) | @Test
method testUpdateData (line 173) | @Test
method testTransactionRollback (line 201) | @Test
method testConnectionPooling (line 227) | @Test
method testUnknownInstanceReturnsNull (line 250) | @Test
method testLegacyFormatEndToEnd (line 257) | @Test
method testMultipleInstancesSameDatabase (line 307) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/sql/JDBCInstanceConfigTest.java
class JDBCInstanceConfigTest (line 28) | class JDBCInstanceConfigTest {
method testNewFormatSingleInstance (line 30) | @Test
method testNewFormatMultipleInstances (line 55) | @Test
method testNewFormatSkipsInstanceWithNullConfig (line 84) | @Test
method testEmptyInstances (line 100) | @Test
method testNullInstances (line 111) | @Test
method testLegacyFormatFallback (line 122) | @Test
method testLegacyFormatSkipsMissingURL (line 185) | @Test
method testLegacyFormatNotUsedWhenNewFormatConfigured (line 207) | @Test
method testLegacyFormatNoConnectionIds (line 237) | @Test
method testLegacyFormatBlankConnectionIds (line 250) | @Test
method testJDBCInstanceGettersAndSetters (line 263) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/sql/JDBCProviderTest.java
class JDBCProviderTest (line 26) | class JDBCProviderTest {
method testEmptyConfigList (line 28) | @Test
method testGetRegisteredInstance (line 40) | @Test
method testGetUnregisteredInstance (line 58) | @Test
method testMultipleInstances (line 75) | @Test
method testGetWithNullName (line 93) | @Test
method testConfigExceptionDoesNotPropagate (line 104) | @Test
method testShutdownClosesHikariPools (line 115) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/vectordb/MongoVectorDBTest.java
class MongoVectorDBTest (line 54) | @SpringBootTest(
method setup (line 66) | @BeforeAll
method testConnectionStringNotEmpty (line 112) | @Test
method testUpdateEmbeddings (line 118) | @Test
method testSearchEmbeddings (line 135) | @Test
method getMockStoreEmbeddingsInput (line 145) | private StoreEmbeddingsInput getMockStoreEmbeddingsInput(List<Float> e...
FILE: ai/src/test/java/org/conductoross/conductor/ai/vectordb/PostgresVectorDBTest.java
class PostgresVectorDBTest (line 47) | public class PostgresVectorDBTest {
method setup (line 52) | @BeforeEach
method testUpdateEmbeddingsHappyPath (line 62) | @Test
method testSearchHappyPath (line 113) | @Test
method testInvalidNamespace (line 150) | @Test
method testWaitForConnectionPoolTimeout (line 161) | @Test
method testWaitAndSuccessfulConnection (line 192) | @Test
method testSqlExceptionOnUpdateSafelyClosesConnection (line 219) | @Test
method testIndexingMethods (line 255) | @Test
method testDistanceMetrics (line 292) | @Test
method testRemovalListener (line 330) | @Test
method testDimensionMismatch (line 346) | @Test
method testGetClientMissingUrl (line 375) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/vectordb/VectorDBProviderTest.java
class VectorDBProviderTest (line 26) | class VectorDBProviderTest {
method testEmptyConfigList (line 28) | @Test
method testGetRegisteredVectorDB (line 41) | @Test
method testGetUnregisteredVectorDB (line 63) | @Test
method testMultipleVectorDBs (line 83) | @Test
method testGetWithNullContext (line 108) | @Test
method testMultipleInstancesOfSameType (line 127) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/vectordb/VectorDBsTest.java
class VectorDBsTest (line 25) | class VectorDBsTest {
method setUp (line 32) | @BeforeEach
method testStoreEmbeddings_success (line 40) | @Test
method testStoreEmbeddings_vectorDBNotFound (line 77) | @Test
method testSearchEmbeddings_success (line 99) | @Test
method testSearchEmbeddings_vectorDBNotFound (line 121) | @Test
method testStoreEmbeddings_nullMetadata (line 140) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/video/VideoMemoryTest.java
class VideoMemoryTest (line 26) | public class VideoMemoryTest {
method createTestVideoBytes (line 30) | private byte[] createTestVideoBytes() {
method testFromBytes_StoresDirectReference (line 36) | @Test
method testGetData_ReturnsDirectReference (line 51) | @Test
method testBase64Constructor_DoesNotPopulateData (line 66) | @Test
method testFromBytes_AvoidsBase64EncodingOverhead (line 77) | @Test
method testBase64Decoding_CreatesNewArray (line 100) | @Test
method testBackwardCompatibility_Base64StillSupported (line 112) | @Test
method testVideoEquality (line 124) | @Test
method testSettersAndGetters (line 135) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/video/VideoModelTest.java
class VideoModelTest (line 20) | public class VideoModelTest {
method testVideoOptionsBuilder (line 22) | @Test
method testVideoOptionsBuilderDefaults (line 56) | @Test
method testVideoPromptCreation (line 69) | @Test
method testVideoPromptWithOptions (line 78) | @Test
method testVideoCreationWithUrl (line 89) | @Test
method testVideoCreationWithBase64 (line 98) | @Test
method testVideoCreationBackwardCompatible (line 108) | @Test
method testVideoEquality (line 118) | @Test
method testVideoToString (line 129) | @Test
FILE: ai/src/test/java/org/conductoross/conductor/ai/video/VideoProviderMemoryTest.java
class VideoProviderMemoryTest (line 29) | public class VideoProviderMemoryTest {
method createTestVideoBytes (line 33) | private byte[] createTestVideoBytes() {
method testOptimizedFlow_NoCopiesCreated (line 39) | @Test
method testOldFlow_CreatesMultipleCopies (line 58) | @Test
method testOpenAIProviderFlow_UsesDirectBytes (line 72) | @Test
method testGeminiProviderFlow_PrioritizesBytesOverUrl (line 100) | @Test
method testGeminiProviderFlow_FallbackToBase64 (line 135) | @Test
method testProviderFlow_WithThumbnail (line 169) | @Test
method testVideoGeneration_PreservesVideoReference (line 196) | @Test
method testVideoResponse_PreservesReferences (line 207) | @Test
FILE: amqp/src/main/java/com/netflix/conductor/contribs/queue/amqp/AMQPConnection.java
class AMQPConnection (line 40) | public class AMQPConnection {
method AMQPConnection (line 56) | private AMQPConnection() {}
method AMQPConnection (line 58) | private AMQPConnection(final ConnectionFactory factory, final Address[...
method getInstance (line 63) | public static synchronized AMQPConnection getInstance(
method setAMQPConnection (line 75) | public static void setAMQPConnection(AMQPConnection amqpConnection) {
method getAddresses (line 79) | public Address[] getAddresses() {
method createConnection (line 83) | private Connection createConnection(String connectionPrefix) {
method getOrCreateChannel (line 172) | public Channel getOrCreateChannel(ConnectionType connectionType, Strin...
method getOrCreateChannel (line 209) | private Channel getOrCreateChannel(ConnectionType connType, Connection...
method close (line 282) | public void close() {
method closeChannelsInMap (line 296) | private void closeChannelsInMap(ConnectionType conType) {
method closeConnection (line 308) | private void closeConnection(Connection connection) {
method closeChannel (line 320) | private void closeChannel(Channel channel) {
method borrowChannel (line 341) | private synchronized Channel borrowChannel(
method returnChannel (line 378) | public synchronized void returnChannel(ConnectionType connectionType, ...
FILE: amqp/src/main/java/com/netflix/conductor/contribs/queue/amqp/AMQPObservableQueue.java
class AMQPObservableQueue (line 56) | public class AMQPObservableQueue implements ObservableQueue {
method AMQPObservableQueue (line 71) | public AMQPObservableQueue(
method observe (line 102) | @Override
method getType (line 163) | @Override
method getName (line 168) | @Override
method getURI (line 173) | @Override
method getBatchSize (line 178) | public int getBatchSize() {
method getSettings (line 182) | public AMQPSettings getSettings() {
method getAddresses (line 186) | public Address[] getAddresses() {
method ack (line 190) | public List<String> ack(List<Message> messages) {
method ackMsg (line 203) | public void ackMsg(Message message) throws Exception {
method nack (line 235) | @Override
method buildBasicProperties (line 272) | private static AMQP.BasicProperties buildBasicProperties(
method publishMessage (line 289) | private void publishMessage(Message message, String exchange, String r...
method publish (line 341) | @Override
method setUnackTimeout (line 378) | @Override
method size (line 383) | @Override
method close (line 409) | @Override
method start (line 414) | @Override
method stop (line 423) | @Override
method isRunning (line 432) | @Override
class Builder (line 437) | public static class Builder {
method Builder (line 445) | public Builder(AMQPEventQueueProperties properties) {
method buildAddressesFromHosts (line 454) | private Address[] buildAddressesFromHosts() {
method buildConnectionFactory (line 463) | private ConnectionFactory buildConnectionFactory() {
method build (line 516) | public AMQPObservableQueue build(
method getOrCreateExchange (line 533) | private AMQP.Exchange.DeclareOk getOrCreateExchange(ConnectionType con...
method getOrCreateExchange (line 544) | private AMQP.Exchange.DeclareOk getOrCreateExchange(
method getOrCreateQueue (line 579) | private AMQP.Queue.DeclareOk getOrCreateQueue(ConnectionType connectio...
method getOrCreateQueue (line 589) | private AMQP.Queue.DeclareOk getOrCreateQueue(
method asMessage (line 622) | private static Message asMessage(AMQPSettings settings, GetResponse re...
method receiveMessagesFromQueue (line 633) | private void receiveMessagesFromQueue(String queueName) throws Excepti...
method receiveMessagesFromQueue (line 693) | private void receiveMessagesFromQueue(String queueName, Subscriber<? s...
method receiveMessages (line 762) | protected void receiveMessages() {
method receiveMessages (line 812) | protected void receiveMessages(Subscriber<? super Message> subscriber) {
method getPollTimeInMS (line 862) | public int getPollTimeInMS() {
method setPollTimeInMS (line 866) | public void setPollTimeInMS(int pollTimeInMS) {
FILE: amqp/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPEventQueueConfiguration.java
class AMQPEventQueueConfiguration (line 30) | @Configuration(proxyBeanMethods = false)
type QUEUE_TYPE (line 35) | private enum QUEUE_TYPE {
method QUEUE_TYPE (line 41) | QUEUE_TYPE(String type) {
method getType (line 45) | public String getType() {
method amqpEventQueueProvider (line 50) | @Bean
method amqpExchangeEventQueueProvider (line 55) | @Bean
method getQueues (line 60) | @ConditionalOnProperty(name = "conductor.default-event-queue.type", ha...
FILE: amqp/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPEventQueueProperties.java
class AMQPEventQueueProperties (line 24) | @ConfigurationProperties("conductor.event-queues.amqp")
method getLimit (line 50) | public int getLimit() {
method setLimit (line 54) | public void setLimit(int limit) {
method getDuration (line 58) | public int getDuration() {
method setDuration (line 62) | public void setDuration(int duration) {
method getType (line 66) | public RetryType getType() {
method setType (line 70) | public void setType(RetryType type) {
method getConnectionTimeoutInMilliSecs (line 74) | public int getConnectionTimeoutInMilliSecs() {
method setConnectionTimeoutInMilliSecs (line 78) | public void setConnectionTimeoutInMilliSecs(int connectionTimeoutInMil...
method getHandshakeTimeoutInMilliSecs (line 82) | public int getHandshakeTimeoutInMilliSecs() {
method setHandshakeTimeoutInMilliSecs (line 86) | public void setHandshakeTimeoutInMilliSecs(int handshakeTimeoutInMilli...
method getMaxChannelCount (line 90) | public int getMaxChannelCount() {
method setMaxChannelCount (line 94) | public void setMaxChannelCount(int maxChannelCount) {
method getBatchSize (line 124) | public int getBatchSize() {
method setBatchSize (line 128) | public void setBatchSize(int batchSize) {
method getPollTimeDuration (line 132) | public Duration getPollTimeDuration() {
method setPollTimeDuration (line 136) | public void setPollTimeDuration(Duration pollTimeDuration) {
method getHosts (line 140) | public String getHosts() {
method setHosts (line 144) | public void setHosts(String hosts) {
method getUsername (line 148) | public String getUsername() {
method setUsername (line 152) | public void setUsername(String username) {
method getPassword (line 156) | public String getPassword() {
method setPassword (line 160) | public void setPassword(String password) {
method getVirtualHost (line 164) | public String getVirtualHost() {
method setVirtualHost (line 168) | public void setVirtualHost(String virtualHost) {
method getPort (line 172) | public int getPort() {
method setPort (line 176) | public void setPort(int port) {
method isUseNio (line 180) | public boolean isUseNio() {
method setUseNio (line 184) | public void setUseNio(boolean useNio) {
method isDurable (line 188) | public boolean isDurable() {
method setDurable (line 192) | public void setDurable(boolean durable) {
method isExclusive (line 196) | public boolean isExclusive() {
method setExclusive (line 200) | public void setExclusive(boolean exclusive) {
method isAutoDelete (line 204) | public boolean isAutoDelete() {
method setAutoDelete (line 208) | public void setAutoDelete(boolean autoDelete) {
method getContentType (line 212) | public String getContentType() {
method setContentType (line 216) | public void setContentType(String contentType) {
method getContentEncoding (line 220) | public String getContentEncoding() {
method setContentEncoding (line 224) | public void setContentEncoding(String contentEncoding) {
method getExchangeType (line 228) | public String getExchangeType() {
method setExchangeType (line 232) | public void setExchangeType(String exchangeType) {
method getDeliveryMode (line 236) | public int getDeliveryMode() {
method setDeliveryMode (line 240) | public void setDeliveryMode(int deliveryMode) {
method isUseExchange (line 244) | public boolean isUseExchange() {
method setUseExchange (line 248) | public void setUseExchange(boolean useExchange) {
method getListenerQueuePrefix (line 252) | public String getListenerQueuePrefix() {
method setListenerQueuePrefix (line 256) | public void setListenerQueuePrefix(String listenerQueuePrefix) {
method getQueueType (line 260) | public String getQueueType() {
method isUseSslProtocol (line 264) | public boolean isUseSslProtocol() {
method setUseSslProtocol (line 268) | public void setUseSslProtocol(boolean useSslProtocol) {
method setQueueType (line 277) | public void setQueueType(String queueType) {
method isSequentialMsgProcessing (line 284) | public boolean isSequentialMsgProcessing() {
method setSequentialMsgProcessing (line 294) | public void setSequentialMsgProcessing(boolean sequentialMsgProcessing) {
method getNetworkRecoveryIntervalInMilliSecs (line 298) | public int getNetworkRecoveryIntervalInMilliSecs() {
method setNetworkRecoveryIntervalInMilliSecs (line 302) | public void setNetworkRecoveryIntervalInMilliSecs(int networkRecoveryI...
method getRequestHeartbeatTimeoutInSecs (line 306) | public int getRequestHeartbeatTimeoutInSecs() {
method setRequestHeartbeatTimeoutInSecs (line 310) | public void setRequestHeartbeatTimeoutInSecs(int requestHeartbeatTimeo...
FILE: amqp/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPEventQueueProvider.java
class AMQPEventQueueProvider (line 30) | public class AMQPEventQueueProvider implements EventQueueProvider {
method AMQPEventQueueProvider (line 38) | public AMQPEventQueueProvider(
method getQueueType (line 45) | @Override
method getQueue (line 50) | @Override
FILE: amqp/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPRetryPattern.java
class AMQPRetryPattern (line 17) | public class AMQPRetryPattern {
method AMQPRetryPattern (line 23) | public AMQPRetryPattern() {}
method AMQPRetryPattern (line 25) | public AMQPRetryPattern(int limit, int duration, RetryType type) {
method continueOrPropogate (line 37) | public void continueOrPropogate(Exception ex, int retryIndex) throws E...
FILE: amqp/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/AMQPConfigurations.java
type AMQPConfigurations (line 18) | public enum AMQPConfigurations {
method AMQPConfigurations (line 32) | AMQPConfigurations(String propertyName) {
method toString (line 36) | @Override
FILE: amqp/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/AMQPConstants.java
class AMQPConstants (line 18) | public class AMQPConstants {
FILE: amqp/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/AMQPSettings.java
class AMQPSettings (line 35) | public class AMQPSettings {
method AMQPSettings (line 60) | public AMQPSettings(final AMQPEventQueueProperties properties) {
method AMQPSettings (line 76) | public AMQPSettings(final AMQPEventQueueProperties properties, final S...
method isDurable (line 81) | public final boolean isDurable() {
method isExclusive (line 85) | public final boolean isExclusive() {
method autoDelete (line 89) | public final boolean autoDelete() {
method getArguments (line 93) | public final Map<String, Object> getArguments() {
method getContentEncoding (line 97) | public final String getContentEncoding() {
method setQueue (line 106) | public void setQueue(String queueName) {
method getQueueOrExchangeName (line 113) | public String getQueueOrExchangeName() {
method getExchangeBoundQueueName (line 117) | public String getExchangeBoundQueueName() {
method getExchangeType (line 124) | public String getExchangeType() {
method getRoutingKey (line 128) | public String getRoutingKey() {
method getDeliveryMode (line 132) | public int getDeliveryMode() {
method setDeliveryMode (line 136) | public AMQPSettings setDeliveryMode(int deliveryMode) {
method getContentType (line 144) | public String getContentType() {
method fromURI (line 166) | public final AMQPSettings fromURI(final String queueURI) {
method equals (line 237) | @Override
method hashCode (line 258) | @Override
method toString (line 277) | @Override
method getEventName (line 310) | public String getEventName() {
method getQueueType (line 317) | public String getQueueType() {
method isSequentialProcessing (line 324) | public boolean isSequentialProcessing() {
method getType (line 333) | public Type getType() {
type Type (line 337) | public enum Type {
method Type (line 343) | Type(String value) {
method fromString (line 347) | public static Type fromString(String value) {
FILE: amqp/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/ConnectionType.java
type ConnectionType (line 15) | public enum ConnectionType {
FILE: amqp/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/RetryType.java
type RetryType (line 16) | public enum RetryType {
FILE: amqp/src/test/java/com/netflix/conductor/contribs/queue/amqp/AMQPEventQueueProviderTest.java
class AMQPEventQueueProviderTest (line 33) | public class AMQPEventQueueProviderTest {
method setUp (line 37) | @Before
method testAMQPEventQueueProvider_defaultconfig_exchange (line 59) | @Test
method testAMQPEventQueueProvider_defaultconfig_queue (line 71) | @Test
FILE: amqp/src/test/java/com/netflix/conductor/contribs/queue/amqp/AMQPObservableQueueTest.java
class AMQPObservableQueueTest (line 76) | @SuppressWarnings({"rawtypes", "unchecked"})
method setUp (line 85) | @Before
method buildQueue (line 109) | List<GetResponse> buildQueue(final Random random, final int bound) {
method mockBaseChannel (line 126) | Channel mockBaseChannel() throws IOException, TimeoutException {
method mockChannelForQueue (line 136) | Channel mockChannelForQueue(
method mockChannelForExchange (line 193) | Channel mockChannelForExchange(
method mockGoodConnection (line 270) | Connection mockGoodConnection(Channel channel) throws IOException {
method mockBadConnection (line 280) | Connection mockBadConnection() throws IOException {
method mockConnectionFactory (line 288) | ConnectionFactory mockConnectionFactory(Connection connection)
method runObserve (line 296) | void runObserve(
method testGetMessagesFromExistingExchangeWithDurableExclusiveAutoDeleteQueueConfiguration (line 326) | @Test
method testGetMessagesFromExistingExchangeWithDefaultConfiguration (line 337) | @Test
method testPublishMessagesToNotExistingExchangeAndDefaultConfiguration (line 346) | @Test
method testAck (line 355) | @Test
method testGetMessagesFromExchangeAndDefaultConfiguration (line 395) | private void testGetMessagesFromExchangeAndDefaultConfiguration(
method testGetMessagesFromExchangeAndCustomConfigurationFromURI (line 484) | private void testGetMessagesFromExchangeAndCustomConfigurationFromURI(
method testPublishMessagesToExchangeAndDefaultConfiguration (line 597) | private void testPublishMessagesToExchangeAndDefaultConfiguration(
method testGetMessagesFromExistingQueueAndDefaultConfiguration (line 681) | @Test
method testGetMessagesFromNotExistingQueueAndDefaultConfiguration (line 690) | @Test
method testGetMessagesFromQueueWithBadChannel (line 699) | @Test
method testPublishMessagesToQueueWithBadChannel (line 707) | @Test(expected = RuntimeException.class)
method testAMQPObservalbleQueue_empty (line 715) | @Test(expected = IllegalArgumentException.class)
method testAMQPObservalbleQueue_addressEmpty (line 724) | @Test(expected = IllegalArgumentException.class)
method testAMQPObservalbleQueue_settingsEmpty (line 739) | @Test(expected = IllegalArgumentException.class)
method testAMQPObservalbleQueue_batchsizezero (line 753) | @Test(expected = IllegalArgumentException.class)
method testAMQPObservalbleQueue_polltimezero (line 768) | @Test(expected = IllegalArgumentException.class)
method testclosetExistingQueueAndDefaultConfiguration (line 783) | @Test
method testGetMessagesFromQueueAndDefaultConfiguration (line 792) | private void testGetMessagesFromQueueAndDefaultConfiguration(
method testGetMessagesFromQueueAndDefaultConfiguration_close (line 824) | private void testGetMessagesFromQueueAndDefaultConfiguration_close(
method testPublishMessagesToQueueAndDefaultConfiguration (line 854) | private void testPublishMessagesToQueueAndDefaultConfiguration(
FILE: amqp/src/test/java/com/netflix/conductor/contribs/queue/amqp/AMQPSettingsTest.java
class AMQPSettingsTest (line 32) | public class AMQPSettingsTest {
method setUp (line 36) | @Before
method testAMQPSettings_queue_fromuri_without_exchange_prefix (line 58) | @Test
method testAMQPSettings_queue_fromuri_without_exchange_prefix_and_bind_queue (line 71) | @Test
method testAMQPSettings_exchange (line 83) | @Test
method testAMQPSettings_queue (line 95) | @Test
method testAMQPSettings_queue_fromUri (line 106) | @Test
method testAMQPSettings_exchange_fromUri (line 117) | @Test
method testAMQPSettings_exchange_fromuri_defaultconfig (line 128) | @Test
method testAMQPSettings_queue_fromuri_defaultconfig (line 139) | @Test
method testAMQPSettings_exchange_fromuri_wrongdeliverymode (line 152) | @Test(expected = IllegalArgumentException.class)
FILE: annotations-processor/src/example/java/com/example/Example.java
class Example (line 18) | @ProtoMessage
FILE: annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/AbstractMessage.java
class AbstractMessage (line 27) | public abstract class AbstractMessage {
method AbstractMessage (line 33) | public AbstractMessage(Class<?> cls, MessageType parentType) {
method addNestedEnum (line 46) | private void addNestedEnum(Class<?> cls) {
method addNestedClass (line 53) | private void addNestedClass(Class<?> cls) {
method getProtoClass (line 60) | public abstract String getProtoClass();
method javaMapToProto (line 62) | protected abstract void javaMapToProto(TypeSpec.Builder builder);
method javaMapFromProto (line 64) | protected abstract void javaMapFromProto(TypeSpec.Builder builder);
method generateJavaMapper (line 66) | public void generateJavaMapper(TypeSpec.Builder builder) {
method generateAbstractMethods (line 75) | public void generateAbstractMethods(Set<MethodSpec> specs) {
method findDependencies (line 85) | public void findDependencies(Set<String> dependencies) {
method getNested (line 95) | public List<AbstractMessage> getNested() {
method getFields (line 99) | public List<Field> getFields() {
method getName (line 103) | public String getName() {
class Field (line 107) | public abstract static class Field {
method Field (line 111) | protected Field(int index, java.lang.reflect.Field field) {
method getProtoTypeDeclaration (line 116) | public abstract String getProtoTypeDeclaration();
method getProtoIndex (line 118) | public int getProtoIndex() {
method getName (line 122) | public String getName() {
method getProtoName (line 126) | public String getProtoName() {
method getDependencies (line 130) | public void getDependencies(Set<String> deps) {}
method generateAbstractMethods (line 132) | public void generateAbstractMethods(Set<MethodSpec> specs) {}
FILE: annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/Enum.java
class Enum (line 23) | public class Enum extends AbstractMessage {
type MapType (line 24) | public enum MapType {
method MapType (line 30) | MapType(String m) {
method getMethodName (line 34) | public String getMethodName() {
method Enum (line 39) | public Enum(Class cls, MessageType parent) {
method getProtoClass (line 48) | @Override
method javaMap (line 53) | private MethodSpec javaMap(MapType mt, TypeName from, TypeName to) {
method javaMapFromProto (line 76) | @Override
method javaMapToProto (line 85) | @Override
class EnumField (line 91) | public class EnumField extends Field {
method EnumField (line 92) | protected EnumField(int index, java.lang.reflect.Field field) {
method getProtoTypeDeclaration (line 96) | @Override
FILE: annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/Message.java
class Message (line 31) | public class Message extends AbstractMessage {
method Message (line 32) | public Message(Class<?> cls, MessageType parent) {
method getAnnotation (line 43) | protected ProtoMessage getAnnotation() {
method getProtoClass (line 47) | @Override
method javaMapToProto (line 52) | @Override
method javaMapFromProto (line 76) | @Override
class MessageField (line 98) | public static class MessageField extends Field {
method MessageField (line 101) | protected MessageField(int index, java.lang.reflect.Field field) {
method getAbstractType (line 105) | public AbstractType getAbstractType() {
method toUnderscoreCase (line 114) | private static String toUnderscoreCase(String input) {
method getProtoTypeDeclaration (line 124) | @Override
method getDependencies (line 131) | @Override
method generateAbstractMethods (line 136) | @Override
FILE: annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/ProtoFile.java
class ProtoFile (line 22) | public class ProtoFile {
method ProtoFile (line 33) | public ProtoFile(
method getJavaClassName (line 48) | public String getJavaClassName() {
method getFilePath (line 52) | public String getFilePath() {
method getProtoPackageName (line 56) | public String getProtoPackageName() {
method getJavaPackageName (line 60) | public String getJavaPackageName() {
method getGoPackageName (line 64) | public String getGoPackageName() {
method getMessage (line 68) | public AbstractMessage getMessage() {
method getIncludes (line 72) | public Set<String> getIncludes() {
FILE: annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/ProtoGen.java
class ProtoGen (line 39) | public class ProtoGen {
method ProtoGen (line 48) | public ProtoGen(String protoPackageName, String javaPackageName, Strin...
method writeMapper (line 54) | public void writeMapper(File root, String mapperPackageName) throws IO...
method writeProtos (line 91) | public void writeProtos(File root) throws IOException {
method processPackage (line 110) | public void processPackage(File jarFile, String packageName) throws IO...
method processClass (line 127) | public void processClass(Class<?> obj) {
FILE: annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/ProtoGenTask.java
class ProtoGenTask (line 18) | public class ProtoGenTask {
method getProtoPackage (line 30) | public String getProtoPackage() {
method setProtoPackage (line 34) | public void setProtoPackage(String protoPackage) {
method getJavaPackage (line 38) | public String getJavaPackage() {
method setJavaPackage (line 42) | public void setJavaPackage(String javaPackage) {
method getGoPackage (line 46) | public String getGoPackage() {
method setGoPackage (line 50) | public void setGoPackage(String goPackage) {
method getProtosDir (line 54) | public File getProtosDir() {
method setProtosDir (line 58) | public void setProtosDir(File protosDir) {
method getMapperDir (line 62) | public File getMapperDir() {
method setMapperDir (line 66) | public void setMapperDir(File mapperDir) {
method getMapperPackage (line 70) | public String getMapperPackage() {
method setMapperPackage (line 74) | public void setMapperPackage(String mapperPackage) {
method getSourceJar (line 78) | public File getSourceJar() {
method setSourceJar (line 82) | public void setSourceJar(File sourceJar) {
method getSourcePackage (line 86) | public String getSourcePackage() {
method setSourcePackage (line 90) | public void setSourcePackage(String sourcePackage) {
method generate (line 94) | public void generate() {
method main (line 105) | public static void main(String[] args) {
method toString (line 125) | @Override
FILE: annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/types/AbstractType.java
class AbstractType (line 21) | public abstract class AbstractType {
method AbstractType (line 25) | AbstractType(Type javaType, TypeName javaProtoType) {
method getJavaType (line 30) | public Type getJavaType() {
method getJavaProtoType (line 34) | public TypeName getJavaProtoType() {
method getProtoType (line 38) | public abstract String getProtoType();
method getRawJavaType (line 40) | public abstract TypeName getRawJavaType();
method mapToProto (line 42) | public abstract void mapToProto(String field, MethodSpec.Builder method);
method mapFromProto (line 44) | public abstract void mapFromProto(String field, MethodSpec.Builder met...
method getDependencies (line 46) | public abstract void getDependencies(Set<String> deps);
method generateAbstractMethods (line 48) | public abstract void generateAbstractMethods(Set<MethodSpec> specs);
method javaMethodName (line 50) | protected String javaMethodName(String m, String field) {
class ProtoCase (line 55) | private static class ProtoCase {
method convert (line 56) | static String convert(String s) {
method isWordBoundary (line 71) | private static boolean isWordBoundary(char c) {
method findWordBoundary (line 75) | private static int findWordBoundary(CharSequence sequence, int start) {
method normalizeWord (line 92) | private static String normalizeWord(String word) {
method protoMethodName (line 98) | protected String protoMethodName(String m, String field) {
FILE: annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/types/ExternMessageType.java
class ExternMessageType (line 23) | public class ExternMessageType extends MessageType {
method ExternMessageType (line 26) | public ExternMessageType(
method getProtoType (line 32) | @Override
method generateAbstractMethods (line 37) | @Override
FILE: annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/types/GenericType.java
class GenericType (line 23) | abstract class GenericType extends AbstractType {
method GenericType (line 24) | public GenericType(Type type) {
method getRawType (line 28) | protected Class getRawType() {
method resolveGenericParam (line 33) | protected AbstractType resolveGenericParam(int idx) {
method getWrapperSuffix (line 44) | public abstract String getWrapperSuffix();
method getValueType (line 46) | public abstract AbstractType getValueType();
method resolveJavaProtoType (line 48) | public abstract TypeName resolveJavaProtoType();
method getRawJavaType (line 50) | @Override
method getDependencies (line 55) | @Override
method generateAbstractMethods (line 60) | @Override
method getJavaProtoType (line 65) | @Override
FILE: annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/types/ListType.java
class ListType (line 23) | public class ListType extends GenericType {
method ListType (line 26) | public ListType(Type type) {
method getWrapperSuffix (line 30) | @Override
method getValueType (line 35) | @Override
method mapToProto (line 43) | @Override
method mapFromProto (line 61) | @Override
method resolveJavaProtoType (line 91) | @Override
method getProtoType (line 97) | @Override
FILE: annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/types/MapType.java
class MapType (line 24) | public class MapType extends GenericType {
method MapType (line 28) | public MapType(Type type) {
method getWrapperSuffix (line 32) | @Override
method getValueType (line 37) | @Override
method getKeyType (line 45) | public AbstractType getKeyType() {
method mapToProto (line 52) | @Override
method mapFromProto (line 75) | @Override
method resolveJavaProtoType (line 108) | @Override
method getProtoType (line 116) | @Override
FILE: annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/types/MessageType.java
class MessageType (line 23) | public class MessageType extends AbstractType {
method MessageType (line 26) | public MessageType(Type javaType, ClassName javaProtoType, String prot...
method getProtoType (line 31) | @Override
method getProtoFilePath (line 37) | public String getProtoFilePath() {
method getRawJavaType (line 41) | @Override
method mapToProto (line 46) | @Override
method isEnum (line 54) | private boolean isEnum() {
method mapFromProto (line 59) | @Override
method getDependencies (line 71) | @Override
method generateAbstractMethods (line 76) | @Override
FILE: annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/types/ScalarType.java
class ScalarType (line 21) | public class ScalarType extends AbstractType {
method ScalarType (line 24) | public ScalarType(Type javaType, TypeName javaProtoType, String protoT...
method getProtoType (line 29) | @Override
method getRawJavaType (line 34) | @Override
method mapFromProto (line 39) | @Override
method isNullableType (line 45) | private boolean isNullableType() {
method mapToProto (line 58) | @Override
method getDependencies (line 73) | @Override
method generateAbstractMethods (line 76) | @Override
FILE: annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/types/TypeMapper.java
class TypeMapper (line 23) | public class TypeMapper {
method addScalarType (line 36) | public void addScalarType(Type t, String protoType) {
method addMessageType (line 40) | public void addMessageType(Class<?> t, MessageType message) {
method TypeMapper (line 44) | public TypeMapper() {
method get (line 70) | public AbstractType get(Type t) {
method get (line 87) | public MessageType get(String className) {
method declare (line 98) | public MessageType declare(Class type, MessageType parent) {
method declare (line 102) | public MessageType declare(Class type, ClassName parentType, String pr...
method baseClass (line 112) | public MessageType baseClass(ClassName className, String protoFilePath) {
FILE: annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/types/WrappedType.java
class WrappedType (line 23) | public class WrappedType extends AbstractType {
method wrap (line 27) | public static WrappedType wrap(GenericType realType) {
method WrappedType (line 39) | public WrappedType(AbstractType realType, MessageType wrappedType) {
method getProtoType (line 45) | @Override
method getRawJavaType (line 50) | @Override
method mapToProto (line 55) | @Override
method mapFromProto (line 60) | @Override
method getDependencies (line 65) | @Override
method generateAbstractMethods (line 71) | @Override
FILE: annotations-processor/src/test/java/com/netflix/conductor/annotationsprocessor/protogen/ProtoGenTest.java
class ProtoGenTest (line 30) | public class ProtoGenTest {
method happyPath (line 35) | @Test
FILE: awss3-storage/src/main/java/com/netflix/conductor/s3/config/S3Configuration.java
class S3Configuration (line 28) | @Configuration
method s3ExternalPayloadStorage (line 33) | @Bean
method s3Client (line 42) | @ConditionalOnProperty(
method s3Presigner (line 51) | @Bean
FILE: awss3-storage/src/main/java/com/netflix/conductor/s3/config/S3Properties.java
class S3Properties (line 21) | @ConfigurationProperties("conductor.external-payload-storage.s3")
method getBucketName (line 34) | public String getBucketName() {
method setBucketName (line 38) | public void setBucketName(String bucketName) {
method getSignedUrlExpirationDuration (line 42) | public Duration getSignedUrlExpirationDuration() {
method setSignedUrlExpirationDuration (line 46) | public void setSignedUrlExpirationDuration(Duration signedUrlExpiratio...
method getRegion (line 50) | public String getRegion() {
method setRegion (line 54) | public void setRegion(String region) {
FILE: awss3-storage/src/main/java/com/netflix/conductor/s3/storage/S3PayloadStorage.java
class S3PayloadStorage (line 48) | public class S3PayloadStorage implements ExternalPayloadStorage {
method S3PayloadStorage (line 59) | public S3PayloadStorage(
method getLocation (line 77) | @Override
method upload (line 150) | @Override
method download (line 178) | @Override
method getObjectKey (line 192) | private String getObjectKey(PayloadType payloadType) {
FILE: awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/config/SQSEventQueueConfiguration.java
class SQSEventQueueConfiguration (line 42) | @Configuration
method createAWSCredentialsProvider (line 50) | @Bean
method getSQSClient (line 55) | @ConditionalOnMissingBean
method sqsEventQueueProvider (line 77) | @Bean
method getQueues (line 83) | @ConditionalOnProperty(
FILE: awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/config/SQSEventQueueProperties.java
class SQSEventQueueProperties (line 21) | @ConfigurationProperties("conductor.event-queues.sqs")
method getBatchSize (line 43) | public int getBatchSize() {
method setBatchSize (line 47) | public void setBatchSize(int batchSize) {
method getPollTimeDuration (line 51) | public Duration getPollTimeDuration() {
method setPollTimeDuration (line 55) | public void setPollTimeDuration(Duration pollTimeDuration) {
method getVisibilityTimeout (line 59) | public Duration getVisibilityTimeout() {
method setVisibilityTimeout (line 63) | public void setVisibilityTimeout(Duration visibilityTimeout) {
method getListenerQueuePrefix (line 67) | public String getListenerQueuePrefix() {
method setListenerQueuePrefix (line 71) | public void setListenerQueuePrefix(String listenerQueuePrefix) {
method getAuthorizedAccounts (line 75) | public String getAuthorizedAccounts() {
method setAuthorizedAccounts (line 79) | public void setAuthorizedAccounts(String authorizedAccounts) {
method getEndpoint (line 83) | public String getEndpoint() {
method setEndpoint (line 87) | public void setEndpoint(String endpoint) {
FILE: awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/config/SQSEventQueueProvider.java
class SQSEventQueueProvider (line 27) | public class SQSEventQueueProvider implements EventQueueProvider {
method SQSEventQueueProvider (line 36) | public SQSEventQueueProvider(
method getQueueType (line 45) | @Override
method getQueue (line 50) | @Override
FILE: awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/eventqueue/SQSObservableQueue.java
class SQSObservableQueue (line 58) | public class SQSObservableQueue implements ObservableQueue {
method SQSObservableQueue (line 72) | private SQSObservableQueue(
method observe (line 90) | @Override
method ack (line 96) | @Override
method publish (line 101) | @Override
method size (line 106) | @Override
method setUnackTimeout (line 125) | @Override
method getType (line 137) | @Override
method getName (line 142) | @Override
method getURI (line 147) | @Override
method getPollTimeInMS (line 152) | public long getPollTimeInMS() {
method getBatchSize (line 156) | public int getBatchSize() {
method getVisibilityTimeoutInSeconds (line 160) | public int getVisibilityTimeoutInSeconds() {
method start (line 164) | @Override
method stop (line 170) | @Override
method isRunning (line 176) | @Override
class Builder (line 181) | public static class Builder {
method withQueueName (line 191) | public Builder withQueueName(String queueName) {
method withVisibilityTimeout (line 200) | public Builder withVisibilityTimeout(int visibilityTimeout) {
method withBatchSize (line 205) | public Builder withBatchSize(int batchSize) {
method withClient (line 210) | public Builder withClient(SqsClient client) {
method withPollTimeInMS (line 215) | public Builder withPollTimeInMS(long pollTimeInMS) {
method withAccountsToAuthorize (line 220) | public Builder withAccountsToAuthorize(List<String> accountsToAuthor...
method addAccountToAuthorize (line 225) | public Builder addAccountToAuthorize(String accountToAuthorize) {
method withScheduler (line 230) | public Builder withScheduler(Scheduler scheduler) {
method build (line 235) | public SQSObservableQueue build() {
method getOrCreateQueue (line 248) | String getOrCreateQueue() {
method getQueueARN (line 260) | private String getQueueARN() {
method addPolicy (line 270) | private void addPolicy(List<String> accountsToAuthorize) {
method getPolicy (line 289) | private String getPolicy(List<String> accountIds) {
method listQueues (line 317) | private List<String> listQueues(String queueName) {
method publishMessages (line 326) | private void publishMessages(List<Message> messages) {
method receiveMessages (line 347) | List<Message> receiveMessages() {
method getOnSubscribe (line 376) | OnSubscribe<Message> getOnSubscribe() {
method delete (line 393) | private List<String> delete(List<Message> messages) {
class SqsPolicy (line 420) | private static class SqsPolicy {
method getVersion (line 427) | public String getVersion() {
method setVersion (line 431) | public void setVersion(String version) {
method getStatement (line 435) | public List<SqsStatement> getStatement() {
method setStatement (line 439) | public void setStatement(List<SqsStatement> statement) {
class SqsStatement (line 444) | private static class SqsStatement {
method getEffect (line 457) | public String getEffect() {
method setEffect (line 461) | public void setEffect(String effect) {
method getPrincipal (line 465) | public SqsPrincipal getPrincipal() {
method setPrincipal (line 469) | public void setPrincipal(SqsPrincipal principal) {
method getAction (line 473) | public String getAction() {
method setAction (line 477) | public void setAction(String action) {
method getResource (line 481) | public String getResource() {
method setResource (line 485) | public void setResource(String resource) {
class SqsPrincipal (line 490) | private static class SqsPrincipal {
method getAws (line 494) | public List<String> getAws() {
method setAws (line 498) | public void setAws(List<String> aws) {
FILE: awssqs-event-queue/src/test/java/com/netflix/conductor/sqs/eventqueue/DefaultEventQueueProcessorTest.java
class DefaultEventQueueProcessorTest (line 44) | @ContextConfiguration(classes = {TestObjectMapperConfiguration.class})
method setupMocks (line 57) | @BeforeClass
method initProcessor (line 105) | @Before
method shouldUpdateTaskByReferenceName (line 115) | @Test
method shouldThrowExceptionForUnknownWorkflow (line 123) | @Test(expected = IllegalArgumentException.class)
method shouldUpdateTaskByTaskId (line 130) | @Test
method createTask (line 137) | private static TaskModel createTask(String taskId, String type, Status...
method createWorkflow (line 146) | private static WorkflowModel createWorkflow(String workflowId, TaskMod...
FILE: awssqs-event-queue/src/test/java/com/netflix/conductor/sqs/eventqueue/SQSObservableQueueTest.java
class SQSObservableQueueTest (line 46) | public class SQSObservableQueueTest {
method test (line 48) | @Test
method testException (line 75) | @Test
method testPolicyJsonFormat (line 109) | @Test
FILE: azureblob-storage/src/main/java/com/netflix/conductor/azureblob/config/AzureBlobConfiguration.java
class AzureBlobConfiguration (line 24) | @Configuration(proxyBeanMethods = false)
method azureBlobExternalPayloadStorage (line 29) | @Bean
FILE: azureblob-storage/src/main/java/com/netflix/conductor/azureblob/config/AzureBlobProperties.java
class AzureBlobProperties (line 21) | @ConfigurationProperties("conductor.external-payload-storage.azureblob")
method getConnectionString (line 52) | public String getConnectionString() {
method setConnectionString (line 56) | public void setConnectionString(String connectionString) {
method getContainerName (line 60) | public String getContainerName() {
method setContainerName (line 64) | public void setContainerName(String containerName) {
method getEndpoint (line 68) | public String getEndpoint() {
method setEndpoint (line 72) | public void setEndpoint(String endpoint) {
method getSasToken (line 76) | public String getSasToken() {
method setSasToken (line 80) | public void setSasToken(String sasToken) {
method getSignedUrlExpirationDuration (line 84) | public Duration getSignedUrlExpirationDuration() {
method setSignedUrlExpirationDuration (line 88) | public void setSignedUrlExpirationDuration(Duration signedUrlExpiratio...
method getWorkflowInputPath (line 92) | public String getWorkflowInputPath() {
method setWorkflowInputPath (line 96) | public void setWorkflowInputPath(String workflowInputPath) {
method getWorkflowOutputPath (line 100) | public String getWorkflowOutputPath() {
method setWorkflowOutputPath (line 104) | public void setWorkflowOutputPath(String workflowOutputPath) {
method getTaskInputPath (line 108) | public String getTaskInputPath() {
method setTaskInputPath (line 112) | public void setTaskInputPath(String taskInputPath) {
method getTaskOutputPath (line 116) | public String getTaskOutputPath() {
method setTaskOutputPath (line 120) | public void setTaskOutputPath(String taskOutputPath) {
FILE: azureblob-storage/src/main/java/com/netflix/conductor/azureblob/storage/AzureBlobPayloadStorage.java
class AzureBlobPayloadStorage (line 50) | public class AzureBlobPayloadStorage implements ExternalPayloadStorage {
method AzureBlobPayloadStorage (line 65) | public AzureBlobPayloadStorage(IDGenerator idGenerator, AzureBlobPrope...
method getLocation (line 103) | @Override
method upload (line 157) | @Override
method download (line 187) | @Override
method getObjectKey (line 211) | private String getObjectKey(PayloadType payloadType) {
FILE: azureblob-storage/src/test/java/com/netflix/conductor/azureblob/storage/AzureBlobPayloadStorageTest.java
class AzureBlobPayloadStorageTest (line 34) | public class AzureBlobPayloadStorageTest {
method setUp (line 40) | @Before
method testNoStorageAccount (line 61) | @Test
method testUseConnectionString (line 67) | @Test
method testUseEndpoint (line 73) | @Test
method testGetLocationFixedPath (line 80) | @Test
method testGetLocation (line 96) | private void testGetLocation(
method testGetAllLocations (line 110) | @Test
FILE: cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/config/CassandraConfiguration.java
class CassandraConfiguration (line 39) | @Configuration(proxyBeanMethods = false)
method cluster (line 46) | @Bean
method session (line 68) | @Bean
method cassandraMetadataDAO (line 74) | @Bean
method cassandraExecutionDAO (line 86) | @Bean
method cassandraEventHandlerDAO (line 95) | @Bean
method cassandraPollDataDAO (line 107) | @Bean
method statements (line 112) | @Bean
FILE: cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/config/CassandraProperties.java
class CassandraProperties (line 23) | @ConfigurationProperties("conductor.cassandra")
method getHostAddress (line 71) | public String getHostAddress() {
method setHostAddress (line 75) | public void setHostAddress(String hostAddress) {
method getPort (line 79) | public int getPort() {
method setPort (line 83) | public void setPort(int port) {
method getCluster (line 87) | public String getCluster() {
method setCluster (line 91) | public void setCluster(String cluster) {
method getKeyspace (line 95) | public String getKeyspace() {
method setKeyspace (line 99) | public void setKeyspace(String keyspace) {
method getShardSize (line 103) | public int getShardSize() {
method setShardSize (line 107) | public void setShardSize(int shardSize) {
method getReplicationStrategy (line 111) | public String getReplicationStrategy() {
method setReplicationStrategy (line 115) | public void setReplicationStrategy(String replicationStrategy) {
method getReplicationFactorKey (line 119) | public String getReplicationFactorKey() {
method setReplicationFactorKey (line 123) | public void setReplicationFactorKey(String replicationFactorKey) {
method getReplicationFactorValue (line 127) | public int getReplicationFactorValue() {
method setReplicationFactorValue (line 131) | public void setReplicationFactorValue(int replicationFactorValue) {
method getReadConsistencyLevel (line 135) | public ConsistencyLevel getReadConsistencyLevel() {
method setReadConsistencyLevel (line 139) | public void setReadConsistencyLevel(ConsistencyLevel readConsistencyLe...
method getWriteConsistencyLevel (line 143) | public ConsistencyLevel getWriteConsistencyLevel() {
method setWriteConsistencyLevel (line 147) | public void setWriteConsistencyLevel(ConsistencyLevel writeConsistency...
method getTaskDefCacheRefreshInterval (line 151) | public Duration getTaskDefCacheRefreshInterval() {
method setTaskDefCacheRefreshInterval (line 155) | public void setTaskDefCacheRefreshInterval(Duration taskDefCacheRefres...
method getEventHandlerCacheRefreshInterval (line 159) | public Duration getEventHandlerCacheRefreshInterval() {
method setEventHandlerCacheRefreshInterval (line 163) | public void setEventHandlerCacheRefreshInterval(Duration eventHandlerC...
method getEventExecutionPersistenceTtl (line 167) | public Duration getEventExecutionPersistenceTtl() {
method setEventExecutionPersistenceTtl (line 171) | public void setEventExecutionPersistenceTtl(Duration eventExecutionPer...
FILE: cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/config/cache/CacheableEventHandlerDAO.java
class CacheableEventHandlerDAO (line 41) | @Trace
method CacheableEventHandlerDAO (line 53) | public CacheableEventHandlerDAO(
method scheduleEventHandlerRefresh (line 62) | @PostConstruct
method addEventHandler (line 70) | @Override
method updateEventHandler (line 76) | @Override
method removeEventHandler (line 82) | @Override
method getAllEventHandlers (line 88) | @Override
method getEventHandlersForEvent (line 105) | @Override
method refreshEventHandlersCache (line 119) | private List<EventHandler> refreshEventHandlersCache() {
FILE: cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/config/cache/CacheableMetadataDAO.java
class CacheableMetadataDAO (line 43) | @Trace
method CacheableMetadataDAO (line 55) | public CacheableMetadataDAO(
method scheduleCacheRefresh (line 64) | @PostConstruct
method createTaskDef (line 74) | @Override
method updateTaskDef (line 81) | @Override
method getTaskDef (line 87) | @Override
method getAllTaskDefs (line 93) | @Override
method removeTaskDef (line 110) | @Override
method createWorkflowDef (line 116) | @Override
method updateWorkflowDef (line 121) | @Override
method getLatestWorkflowDef (line 126) | @Override
method getWorkflowDef (line 131) | @Override
method removeWorkflowDef (line 136) | @Override
method getAllWorkflowDefs (line 141) | @Override
method getAllWorkflowDefsLatestVersions (line 146) | @Override
method refreshTaskDefsCache (line 151) | private List<TaskDef> refreshTaskDefsCache() {
FILE: cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/config/cache/CachingConfig.java
class CachingConfig (line 21) | @Configuration
method cacheManager (line 27) | @Bean
FILE: cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraBaseDAO.java
class CassandraBaseDAO (line 96) | public abstract class CassandraBaseDAO {
method CassandraBaseDAO (line 106) | public CassandraBaseDAO(
method toUUID (line 115) | protected static UUID toUUID(String uuidString, String message) {
method init (line 123) | private void init() {
method getCreateKeyspaceStatement (line 145) | private String getCreateKeyspaceStatement() {
method getCreateWorkflowsTableStatement (line 159) | private String getCreateWorkflowsTableStatement() {
method getCreateTaskLookupTableStatement (line 172) | private String getCreateTaskLookupTableStatement() {
method getCreateTaskDefLimitTableStatement (line 180) | private String getCreateTaskDefLimitTableStatement() {
method getCreateWorkflowDefsTableStatement (line 189) | private String getCreateWorkflowDefsTableStatement() {
method getCreateWorkflowDefsIndexTableStatement (line 198) | private String getCreateWorkflowDefsIndexTableStatement() {
method getCreateTaskDefsTableStatement (line 207) | private String getCreateTaskDefsTableStatement() {
method getCreateEventHandlersTableStatement (line 216) | private String getCreateEventHandlersTableStatement() {
method getCreateEventExecutionsTableStatement (line 225) | private String getCreateEventExecutionsTableStatement() {
method toJson (line 235) | String toJson(Object value) {
method readValue (line 243) | <T> T readValue(String json, Class<T> clazz) {
method recordCassandraDaoRequests (line 251) | void recordCassandraDaoRequests(String action) {
method recordCassandraDaoRequests (line 255) | void recordCassandraDaoRequests(String action, String taskType, String...
method recordCassandraDaoEventRequests (line 259) | void recordCassandraDaoEventRequests(String action, String event) {
method recordCassandraDaoPayloadSize (line 263) | void recordCassandraDaoPayloadSize(
class WorkflowMetadata (line 268) | static class WorkflowMetadata {
method getTotalTasks (line 273) | public int getTotalTasks() {
method setTotalTasks (line 277) | public void setTotalTasks(int totalTasks) {
method getTotalPartitions (line 281) | public int getTotalPartitions() {
method setTotalPartitions (line 285) | public void setTotalPartitions(int totalPartitions) {
FILE: cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraEventHandlerDAO.java
class CassandraEventHandlerDAO (line 40) | @Trace
method CassandraEventHandlerDAO (line 50) | public CassandraEventHandlerDAO(
method addEventHandler (line 68) | @Override
method updateEventHandler (line 73) | @Override
method removeEventHandler (line 78) | @Override
method getAllEventHandlers (line 91) | @Override
method getEventHandlersForEvent (line 96) | @Override
method getAllEventHandlersFromDB (line 110) | @SuppressWarnings("unchecked")
method insertOrUpdateEventHandler (line 132) | private void insertOrUpdateEventHandler(EventHandler eventHandler) {
FILE: cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraExecutionDAO.java
class CassandraExecutionDAO (line 43) | @Trace
method CassandraExecutionDAO (line 77) | public CassandraExecutionDAO(
method getPendingTasksByWorkflow (line 156) | @Override
method getTasks (line 169) | @Override
method createTasks (line 182) | @Override
method updateTask (line 242) | @Override
method exceedsLimit (line 279) | @Override
method removeTask (line 324) | @Override
method getTask (line 334) | @Override
method getTasks (line 370) | @Override
method getPendingTasksForTaskType (line 387) | @Override
method getTasksForWorkflow (line 393) | @Override
method createWorkflow (line 398) | @Override
method updateWorkflow (line 423) | @Override
method removeWorkflow (line 446) | @Override
method removeWorkflowWithExpiry (line 474) | @Override
method removeFromPendingWorkflow (line 484) | @Override
method getWorkflow (line 490) | @Override
method getWorkflow (line 495) | @Override
method getRunningWorkflowIds (line 562) | @Override
method getPendingWorkflowsByType (line 572) | @Override
method getPendingWorkflowCount (line 582) | @Override
method getInProgressTaskCount (line 592) | @Override
method getWorkflowsByType (line 602) | @Override
method getWorkflowsByCorrelationId (line 613) | @Override
method canSearchAcrossWorkflows (line 620) | @Override
method addEventExecution (line 625) | @Override
method updateEventExecution (line 650) | @Override
method removeEventExecution (line 675) | @Override
method getEventExecutions (line 695) | @VisibleForTesting
method addTaskToLimit (line 716) | @Override
method removeTaskFromLimit (line 737) | @Override
method removeTask (line 756) | protected boolean removeTask(TaskModel task) {
method removeTaskLookup (line 793) | protected void removeTaskLookup(TaskModel task) {
method validateTasks (line 810) | @VisibleForTesting
method getWorkflowMetadata (line 835) | @VisibleForTesting
method lookupWorkflowIdFromTaskId (line 855) | @VisibleForTesting
FILE: cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraMetadataDAO.java
class CassandraMetadataDAO (line 54) | @Trace
method CassandraMetadataDAO (line 79) | public CassandraMetadataDAO(
method createTaskDef (line 130) | @Override
method updateTaskDef (line 135) | @Override
method getTaskDef (line 140) | @Override
method getAllTaskDefs (line 145) | @Override
method removeTaskDef (line 150) | @Override
method createWorkflowDef (line 163) | @Override
method updateWorkflowDef (line 196) | @Override
method getLatestWorkflowDef (line 222) | @Override
method getWorkflowDef (line 232) | @Override
method removeWorkflowDef (line 254) | @Override
method getAllWorkflowDefs (line 270) | @SuppressWarnings("unchecked")
method getAllWorkflowDefsLatestVersions (line 300) | @Override
method getTaskDefFromDB (line 342) | private TaskDef getTaskDefFromDB(String name) {
method getAllTaskDefsFromDB (line 355) | @SuppressWarnings("unchecked")
method getAllWorkflowDefVersions (line 373) | private List<WorkflowDef> getAllWorkflowDefVersions(String name) {
method insertOrUpdateTaskDef (line 398) | private TaskDef insertOrUpdateTaskDef(TaskDef taskDef) {
method getWorkflowDefIndexValue (line 415) | @VisibleForTesting
method getWorkflowNameAndVersion (line 420) | @VisibleForTesting
method setDefaults (line 443) | private TaskDef setDefaults(Row row) {
FILE: cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraPollDataDAO.java
class CassandraPollDataDAO (line 24) | public class CassandraPollDataDAO implements PollDataDAO {
method updateLastPollData (line 26) | @Override
method getPollData (line 32) | @Override
method getPollData (line 38) | @Override
FILE: cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/util/Constants.java
type Constants (line 15) | public interface Constants {
FILE: cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/util/Statements.java
class Statements (line 128) | public class Statements {
method Statements (line 132) | public Statements(String keyspace) {
method getInsertWorkflowDefStatement (line 143) | public String getInsertWorkflowDefStatement() {
method getInsertWorkflowDefVersionIndexStatement (line 156) | public String getInsertWorkflowDefVersionIndexStatement() {
method getInsertTaskDefStatement (line 167) | public String getInsertTaskDefStatement() {
method getSelectWorkflowDefStatement (line 181) | public String getSelectWorkflowDefStatement() {
method getSelectAllWorkflowDefVersionsByNameStatement (line 193) | public String getSelectAllWorkflowDefVersionsByNameStatement() {
method getSelectAllWorkflowDefsStatement (line 205) | public String getSelectAllWorkflowDefsStatement() {
method getSelectAllWorkflowDefsLatestVersionsStatement (line 213) | public String getSelectAllWorkflowDefsLatestVersionsStatement() {
method getSelectTaskDefStatement (line 225) | public String getSelectTaskDefStatement() {
method getSelectAllTaskDefsStatement (line 237) | public String getSelectAllTaskDefsStatement() {
method getUpdateWorkflowDefStatement (line 251) | public String getUpdateWorkflowDefStatement() {
method getDeleteWorkflowDefStatement (line 265) | public String getDeleteWorkflowDefStatement() {
method getDeleteWorkflowDefIndexStatement (line 277) | public String getDeleteWorkflowDefIndexStatement() {
method getDeleteTaskDefStatement (line 289) | public String getDeleteTaskDefStatement() {
method getInsertWorkflowStatement (line 303) | public String getInsertWorkflowStatement() {
method getInsertTaskStatement (line 318) | public String getInsertTaskStatement() {
method getInsertEventExecutionStatement (line 331) | public String getInsertEventExecutionStatement() {
method getSelectTotalStatement (line 347) | public String getSelectTotalStatement() {
method getSelectTaskStatement (line 358) | public String getSelectTaskStatement() {
method getSelectWorkflowStatement (line 372) | public String getSelectWorkflowStatement() {
method getSelectWorkflowWithTasksStatement (line 384) | public String getSelectWorkflowWithTasksStatement() {
method getSelectTaskFromLookupTableStatement (line 397) | public String getSelectTaskFromLookupTableStatement() {
method getSelectTasksFromTaskDefLimitStatement (line 408) | public String getSelectTasksFromTaskDefLimitStatement() {
method getSelectAllEventExecutionsForMessageFromEventExecutionsStatement (line 420) | public String getSelectAllEventExecutionsForMessageFromEventExecutions...
method getUpdateWorkflowStatement (line 434) | public String getUpdateWorkflowStatement() {
method getUpdateTotalTasksStatement (line 448) | public String getUpdateTotalTasksStatement() {
method getUpdateTotalPartitionsStatement (line 460) | public String getUpdateTotalPartitionsStatement() {
method getUpdateTaskLookupStatement (line 473) | public String getUpdateTaskLookupStatement() {
method getUpdateTaskDefLimitStatement (line 483) | public String getUpdateTaskDefLimitStatement() {
method getUpdateEventExecutionStatement (line 494) | public String getUpdateEventExecutionStatement() {
method getDeleteWorkflowStatement (line 509) | public String getDeleteWorkflowStatement() {
method getDeleteTaskLookupStatement (line 521) | public String getDeleteTaskLookupStatement() {
method getDeleteTaskStatement (line 531) | public String getDeleteTaskStatement() {
method getDeleteTaskDefLimitStatement (line 544) | public String getDeleteTaskDefLimitStatement() {
method getDeleteEventExecutionsStatement (line 555) | public String getDeleteEventExecutionsStatement() {
method getInsertEventHandlerStatement (line 570) | public String getInsertEventHandlerStatement() {
method getSelectAllEventHandlersStatement (line 583) | public String getSelectAllEventHandlersStatement() {
method getDeleteEventHandlerStatement (line 597) | public String getDeleteEventHandlerStatement() {
FILE: common-persistence/src/test/java/com/netflix/conductor/dao/ExecutionDAOTest.java
class ExecutionDAOTest (line 39) | public abstract class ExecutionDAOTest {
method getExecutionDAO (line 41) | protected abstract ExecutionDAO getExecutionDAO();
method getConcurrentExecutionLimitDAO (line 43) | protected ConcurrentExecutionLimitDAO getConcurrentExecutionLimitDAO() {
method testTaskExceedsLimit (line 49) | @Test
method testCreateTaskException (line 84) | @Test
method testCreateTaskException2 (line 102) | @Test
method testTaskCreateDups (line 116) | @Test
method testTaskOps (line 183) | @Test
method testPending (line 254) | @Test
method complexExecutionTest (line 274) | @Test
method createTestWorkflow (line 359) | protected WorkflowModel createTestWorkflow() {
method generateWorkflows (line 428) | protected List<String> generateWorkflows(WorkflowModel base, int count) {
FILE: common-persistence/src/test/java/com/netflix/conductor/dao/TestBase.java
class TestBase (line 15) | public class TestBase {}
FILE: common/src/main/java/com/netflix/conductor/common/config/ObjectMapperBuilderConfiguration.java
class ObjectMapperBuilderConfiguration (line 23) | @Configuration
method conductorJackson2ObjectMapperBuilderCustomizer (line 27) | @Bean
FILE: common/src/main/java/com/netflix/conductor/common/config/ObjectMapperConfiguration.java
class ObjectMapperConfiguration (line 22) | @Configuration
method ObjectMapperConfiguration (line 27) | public ObjectMapperConfiguration(ObjectMapper objectMapper) {
method customizeDefaultObjectMapper (line 32) | @PostConstruct
FILE: common/src/main/java/com/netflix/conductor/common/config/ObjectMapperProvider.java
class ObjectMapperProvider (line 31) | public class ObjectMapperProvider {
method getObjectMapper (line 47) | public ObjectMapper getObjectMapper() {
method _getObjectMapper (line 51) | private static ObjectMapper _getObjectMapper() {
FILE: common/src/main/java/com/netflix/conductor/common/constraints/NoSemiColonConstraint.java
class NoSemiColonValidator (line 43) | class NoSemiColonValidator implements ConstraintValidator<NoSemiColonCon...
method initialize (line 45) | @Override
method isValid (line 48) | @Override
FILE: common/src/main/java/com/netflix/conductor/common/constraints/OwnerEmailMandatoryConstraint.java
class WorkflowTaskValidValidator (line 46) | class WorkflowTaskValidValidator
method initialize (line 49) | @Override
method isValid (line 52) | @Override
method setOwnerEmailMandatory (line 59) | public static void setOwnerEmailMandatory(boolean ownerEmailMandatory) {
FILE: common/src/main/java/com/netflix/conductor/common/constraints/TaskReferenceNameUniqueConstraint.java
class TaskReferenceNameUniqueValidator (line 56) | class TaskReferenceNameUniqueValidator
method initialize (line 59) | @Override
method isValid (line 62) | @Override
method verifyTaskInputParameters (line 86) | private boolean verifyTaskInputParameters(
FILE: common/src/main/java/com/netflix/conductor/common/constraints/TaskTimeoutConstraint.java
class TaskTimeoutValidator (line 45) | class TaskTimeoutValidator implements ConstraintValidator<TaskTimeoutCon...
method initialize (line 47) | @Override
method isValid (line 50) | @Override
FILE: common/src/main/java/com/netflix/conductor/common/constraints/ValidNameConstraint.java
class NameValidator (line 48) | class NameValidator implements ConstraintValidator<ValidNameConstraint, ...
method initialize (line 57) | @Override
method isValid (line 60) | @Override
FILE: common/src/main/java/com/netflix/conductor/common/jackson/JsonProtoModule.java
class JsonProtoModule (line 45) | @Component(JsonProtoModule.NAME)
class AnySerializer (line 96) | @SuppressWarnings("InnerClassMayBeStatic")
method serialize (line 99) | @Override
class AnyDeserializer (line 115) | @SuppressWarnings("InnerClassMayBeStatic")
method deserialize (line 118) | @Override
method JsonProtoModule (line 143) | public JsonProtoModule() {
FILE: common/src/main/java/com/netflix/conductor/common/metadata/Auditable.java
class Auditable (line 15) | public abstract class Auditable {
method getOwnerApp (line 30) | public String getOwnerApp() {
method setOwnerApp (line 37) | public void setOwnerApp(String ownerApp) {
method getCreateTime (line 44) | public Long getCreateTime() {
method setCreateTime (line 51) | public void setCreateTime(Long createTime) {
method getUpdateTime (line 58) | public Long getUpdateTime() {
method setUpdateTime (line 65) | public void setUpdateTime(Long updateTime) {
method getCreatedBy (line 72) | public String getCreatedBy() {
method setCreatedBy (line 79) | public void setCreatedBy(String createdBy) {
method getUpdatedBy (line 86) | public String getUpdatedBy() {
method setUpdatedBy (line 93) | public void setUpdatedBy(String updatedBy) {
FILE: common/src/main/java/com/netflix/conductor/common/metadata/BaseDef.java
class BaseDef (line 25) | @Deprecated
method addPermission (line 30) | public void addPermission(Permission permission, String allowedAuthori...
method addPermissionIfAbsent (line 34) | public void addPermissionIfAbsent(Permission permission, String allowe...
method removePermission (line 38) | public void removePermission(Permission permission) {
method getAllowedAuthority (line 42) | public String getAllowedAuthority(Permission permission) {
method clearAccessPolicy (line 46) | public void clearAccessPolicy() {
method getAccessPolicy (line 50) | public Map<Permission, String> getAccessPolicy() {
method setAccessPolicy (line 54) | public void setAccessPolicy(Map<Permission, String> accessPolicy) {
FILE: common/src/main/java/com/netflix/conductor/common/metadata/SchemaDef.java
class SchemaDef (line 28) | @EqualsAndHashCode(callSuper = true)
type Type (line 36) | @ProtoEnum
FILE: common/src/main/java/com/netflix/conductor/common/metadata/acl/Permission.java
type Permission (line 17) | @ProtoEnum
FILE: common/src/main/java/com/netflix/conductor/common/metadata/events/EventExecution.java
class EventExecution (line 24) | @ProtoMessage
type Status (line 27) | @ProtoEnum
method EventExecution (line 59) | public EventExecution() {}
method EventExecution (line 61) | public EventExecution(String id, String messageId) {
method getId (line 69) | public String getId() {
method setId (line 76) | public void setId(String id) {
method getMessageId (line 83) | public String getMessageId() {
method setMessageId (line 90) | public void setMessageId(String messageId) {
method getName (line 97) | public String getName() {
method setName (line 104) | public void setName(String name) {
method getEvent (line 111) | public String getEvent() {
method setEvent (line 118) | public void setEvent(String event) {
method getCreated (line 125) | public long getCreated() {
method setCreated (line 132) | public void setCreated(long created) {
method getStatus (line 139) | public Status getStatus() {
method setStatus (line 146) | public void setStatus(Status status) {
method getAction (line 153) | public Action.Type getAction() {
method setAction (line 160) | public void setAction(Action.Type action) {
method getOutput (line 167) | public Map<String, Object> getOutput() {
method setOutput (line 174) | public void setOutput(Map<String, Object> output) {
method equals (line 178) | @Override
method hashCode (line 197) | @Override
FILE: common/src/main/java/com/netflix/conductor/common/metadata/events/EventHandler.java
class EventHandler (line 31) | @ProtoMessage
method EventHandler (line 56) | public EventHandler() {}
method getName (line 61) | public String getName() {
method setName (line 68) | public void setName(String name) {
method getEvent (line 75) | public String getEvent() {
method setEvent (line 82) | public void setEvent(String event) {
method getCondition (line 89) | public String getCondition() {
method setCondition (line 96) | public void setCondition(String condition) {
method getActions (line 103) | public List<Action> getActions() {
method setActions (line 110) | public void setActions(List<Action> actions) {
method isActive (line 117) | public boolean isActive() {
method setActive (line 124) | public void setActive(boolean active) {
method getEvaluatorType (line 131) | public String getEvaluatorType() {
method setEvaluatorType (line 138) | public void setEvaluatorType(String evaluatorType) {
class Action (line 142) | @ProtoMessage
type Type (line 145) | @ProtoEnum
method getAction (line 178) | public Type getAction() {
method setAction (line 185) | public void setAction(Type action) {
method getStart_workflow (line 192) | public StartWorkflow getStart_workflow() {
method setStart_workflow (line 199) | public void setStart_workflow(StartWorkflow start_workflow) {
method getComplete_task (line 206) | public TaskDetails getComplete_task() {
method setComplete_task (line 213) | public void setComplete_task(TaskDetails complete_task) {
method getFail_task (line 220) | public TaskDetails getFail_task() {
method setFail_task (line 227) | public void setFail_task(TaskDetails fail_task) {
method setExpandInlineJSON (line 235) | public void setExpandInlineJSON(boolean expandInlineJSON) {
method isExpandInlineJSON (line 242) | public boolean isExpandInlineJSON() {
method getTerminate_workflow (line 249) | public TerminateWorkflow getTerminate_workflow() {
method setTerminate_workflow (line 256) | public void setTerminate_workflow(TerminateWorkflow terminate_workfl...
method getUpdate_workflow_variables (line 263) | public UpdateWorkflowVariables getUpdate_workflow_variables() {
method setUpdate_workflow_variables (line 270) | public void setUpdate_workflow_variables(
class TaskDetails (line 276) | @ProtoMessage
method getWorkflowId (line 301) | public String getWorkflowId() {
method setWorkflowId (line 308) | public void setWorkflowId(String workflowId) {
method getTaskRefName (line 315) | public String getTaskRefName() {
method setTaskRefName (line 322) | public void setTaskRefName(String taskRefName) {
method getOutput (line 329) | public Map<String, Object> getOutput() {
method setOutput (line 336) | public void setOutput(Map<String, Object> output) {
method getOutputMessage (line 340) | public Any getOutputMessage() {
method setOutputMessage (line 344) | public void setOutputMessage(Any outputMessage) {
method getTaskId (line 351) | public String getTaskId() {
method setTaskId (line 358) | public void setTaskId(String taskId) {
method getReasonForIncompletion (line 365) | public String getReasonForIncompletion() {
method setReasonForIncompletion (line 372) | public void setReasonForIncompletion(String reasonForIncompletion) {
class StartWorkflow (line 377) | @ProtoMessage
method getName (line 402) | public String getName() {
method setName (line 409) | public void setName(String name) {
method getVersion (line 416) | public Integer getVersion() {
method setVersion (line 423) | public void setVersion(Integer version) {
method getCorrelationId (line 430) | public String getCorrelationId() {
method setCorrelationId (line 437) | public void setCorrelationId(String correlationId) {
method getInput (line 444) | public Map<String, Object> getInput() {
method setInput (line 451) | public void setInput(Map<String, Object> input) {
method getInputMessage (line 455) | public Any getInputMessage() {
method setInputMessage (line 459) | public void setInputMessage(Any inputMessage) {
method getTaskToDomain (line 463) | public Map<String, String> getTaskToDomain() {
method setTaskToDomain (line 467) | public void setTaskToDomain(Map<String, String> taskToDomain) {
class TerminateWorkflow (line 472) | @ProtoMessage
method getWorkflowId (line 484) | public String getWorkflowId() {
method setWorkflowId (line 491) | public void setWorkflowId(String workflowId) {
method getTerminationReason (line 498) | public String getTerminationReason() {
method setTerminationReason (line 505) | public void setTerminationReason(String terminationReason) {
class UpdateWorkflowVariables (line 510) | @ProtoMessage
method getWorkflowId (line 525) | public String getWorkflowId() {
method setWorkflowId (line 532) | public void setWorkflowId(String workflowId) {
method getVariables (line 539) | public Map<String, Object> getVariables() {
method setVariables (line 546) | public void setVariables(Map<String, Object> variables) {
method isAppendArray (line 553) | public Boolean isAppendArray() {
method setAppendArray (line 560) | public void setAppendArray(Boolean appendArray) {
FILE: common/src/main/java/com/netflix/conductor/common/metadata/tasks/ExecutionMetadata.java
class ExecutionMetadata (line 25) | @ProtoMessage
method ExecutionMetadata (line 54) | public ExecutionMetadata() {}
method setServerSendTime (line 59) | public void setServerSendTime(long timestamp) {
method setClientReceiveTime (line 64) | public void setClientReceiveTime(long timestamp) {
method setExecutionStartTime (line 69) | public void setExecutionStartTime(long timestamp) {
method setExecutionEndTime (line 74) | public void setExecutionEndTime(long timestamp) {
method setClientSendTime (line 79) | public void setClientSendTime(long timestamp) {
method setPollNetworkLatency (line 84) | public void setPollNetworkLatency(long latencyMs) {
method setUpdateNetworkLatency (line 89) | public void setUpdateNetworkLatency(long latencyMs) {
method getServerSendTime (line 94) | public Long getServerSendTime() {
method getClientReceiveTime (line 99) | public Long getClientReceiveTime() {
method getExecutionStartTime (line 104) | public Long getExecutionStartTime() {
method getExecutionEndTime (line 109) | public Long getExecutionEndTime() {
method getClientSendTime (line 114) | public Long getClientSendTime() {
method getPollNetworkLatency (line 119) | public Long getPollNetworkLatency() {
method getUpdateNetworkLatency (line 124) | public Long getUpdateNetworkLatency() {
method getExecutionDuration (line 129) | public Long getExecutionDuration() {
method setAdditionalContext (line 139) | public void setAdditionalContext(String key, Object value) {
method getAdditionalContext (line 144) | public Object getAdditionalContext(String key) {
method getAdditionalContext (line 149) | public Map<String, Object> getAdditionalContext() {
method setServerSendTime (line 155) | public void setServerSendTime(Long serverSendTime) {
method setClientReceiveTime (line 159) | public void setClientReceiveTime(Long clientReceiveTime) {
method setExecutionStartTime (line 163) | public void setExecutionStartTime(Long executionStartTime) {
method setExecutionEndTime (line 167) | public void setExecutionEndTime(Long executionEndTime) {
method setClientSendTime (line 171) | public void setClientSendTime(Long clientSendTime) {
method setPollNetworkLatency (line 175) | public void setPollNetworkLatency(Long pollNetworkLatency) {
method setUpdateNetworkLatency (line 179) | public void setUpdateNetworkLatency(Long updateNetworkLatency) {
method getAdditionalContextMap (line 183) | public Map<String, Object> getAdditionalContextMap() {
method setAdditionalContextMap (line 187) | public void setAdditionalContextMap(Map<String, Object> additionalCont...
method setAdditionalContext (line 192) | public void setAdditionalContext(Map<String, Object> additionalContext) {
method hasData (line 197) | public boolean hasData() {
method isEmpty (line 209) | public boolean isEmpty() {
method toString (line 213) | @Override
FILE: common/src/main/java/com/netflix/conductor/common/metadata/tasks/PollData.java
class PollData (line 20) | @ProtoMessage
method PollData (line 35) | public PollData() {
method PollData (line 39) | public PollData(String queueName, String domain, String workerId, long...
method getQueueName (line 47) | public String getQueueName() {
method setQueueName (line 51) | public void setQueueName(String queueName) {
method getDomain (line 55) | public String getDomain() {
method setDomain (line 59) | public void setDomain(String domain) {
method getWorkerId (line 63) | public String getWorkerId() {
method setWorkerId (line 67) | public void setWorkerId(String workerId) {
method getLastPollTime (line 71) | public long getLastPollTime() {
method setLastPollTime (line 75) | public void setLastPollTime(long lastPollTime) {
method equals (line 79) | @Override
method hashCode (line 94) | @Override
method toString (line 99) | @Override
FILE: common/src/main/java/com/netflix/conductor/common/metadata/tasks/Task.java
class Task (line 30) | @ProtoMessage
type Status (line 33) | @ProtoEnum
method Status (line 54) | Status(boolean terminal, boolean successful, boolean retriable) {
method isTerminal (line 60) | public boolean isTerminal() {
method isSuccessful (line 64) | public boolean isSuccessful() {
method isRetriable (line 68) | public boolean isRetriable() {
method Task (line 215) | public Task() {}
method getTaskType (line 221) | public String getTaskType() {
method setTaskType (line 225) | public void setTaskType(String taskType) {
method getStatus (line 232) | public Status getStatus() {
method setStatus (line 239) | public void setStatus(Status status) {
method getInputData (line 243) | public Map<String, Object> getInputData() {
method setInputData (line 247) | public void setInputData(Map<String, Object> inputData) {
method getReferenceTaskName (line 257) | public String getReferenceTaskName() {
method setReferenceTaskName (line 264) | public void setReferenceTaskName(String referenceTaskName) {
method getCorrelationId (line 271) | public String getCorrelationId() {
method setCorrelationId (line 278) | public void setCorrelationId(String correlationId) {
method getRetryCount (line 285) | public int getRetryCount() {
method setRetryCount (line 292) | public void setRetryCount(int retryCount) {
method getScheduledTime (line 299) | public long getScheduledTime() {
method setScheduledTime (line 306) | public void setScheduledTime(long scheduledTime) {
method getStartTime (line 313) | public long getStartTime() {
method setStartTime (line 320) | public void setStartTime(long startTime) {
method getEndTime (line 327) | public long getEndTime() {
method setEndTime (line 334) | public void setEndTime(long endTime) {
method getStartDelayInSeconds (line 341) | public int getStartDelayInSeconds() {
method setStartDelayInSeconds (line 348) | public void setStartDelayInSeconds(int startDelayInSeconds) {
method getRetriedTaskId (line 355) | public String getRetriedTaskId() {
method setRetriedTaskId (line 362) | public void setRetriedTaskId(String retriedTaskId) {
method getSeq (line 369) | public int getSeq() {
method setSeq (line 376) | public void setSeq(int seq) {
method getUpdateTime (line 383) | public long getUpdateTime() {
method setUpdateTime (line 390) | public void setUpdateTime(long updateTime) {
method getQueueWaitTime (line 397) | public long getQueueWaitTime() {
method isRetried (line 414) | public boolean isRetried() {
method setRetried (line 421) | public void setRetried(boolean retried) {
method isExecuted (line 429) | public boolean isExecuted() {
method setExecuted (line 436) | public void setExecuted(boolean executed) {
method getPollCount (line 443) | public int getPollCount() {
method setPollCount (line 447) | public void setPollCount(int pollCount) {
method incrementPollCount (line 451) | public void incrementPollCount() {
method isCallbackFromWorker (line 455) | public boolean isCallbackFromWorker() {
method setCallbackFromWorker (line 459) | public void setCallbackFromWorker(boolean callbackFromWorker) {
method getTaskDefName (line 466) | public String getTaskDefName() {
method setTaskDefName (line 476) | public void setTaskDefName(String taskDefName) {
method getResponseTimeoutSeconds (line 483) | public long getResponseTimeoutSeconds() {
method setResponseTimeoutSeconds (line 491) | public void setResponseTimeoutSeconds(long responseTimeoutSeconds) {
method getWorkflowInstanceId (line 498) | public String getWorkflowInstanceId() {
method setWorkflowInstanceId (line 505) | public void setWorkflowInstanceId(String workflowInstanceId) {
method getWorkflowType (line 509) | public String getWorkflowType() {
method setWorkflowType (line 517) | public com.netflix.conductor.common.metadata.tasks.Task setWorkflowTyp...
method getTaskId (line 525) | public String getTaskId() {
method setTaskId (line 532) | public void setTaskId(String taskId) {
method getReasonForIncompletion (line 539) | public String getReasonForIncompletion() {
method setReasonForIncompletion (line 546) | public void setReasonForIncompletion(String reasonForIncompletion) {
method getCallbackAfterSeconds (line 553) | public long getCallbackAfterSeconds() {
method setCallbackAfterSeconds (line 560) | public void setCallbackAfterSeconds(long callbackAfterSeconds) {
method getWorkerId (line 567) | public String getWorkerId() {
method setWorkerId (line 574) | public void setWorkerId(String workerId) {
method getOutputData (line 581) | public Map<String, Object> getOutputData() {
method setOutputData (line 588) | public void setOutputData(Map<String, Object> outputData) {
method getWorkflowTask (line 598) | public WorkflowTask getWorkflowTask() {
method setWorkflowTask (line 605) | public void setWorkflowTask(WorkflowTask workflowTask) {
method getDomain (line 612) | public String getDomain() {
method setDomain (line 619) | public void setDomain(String domain) {
method getInputMessage (line 623) | public Any getInputMessage() {
method setInputMessage (line 627) | public void setInputMessage(Any inputMessage) {
method getOutputMessage (line 631) | public Any getOutputMessage() {
method setOutputMessage (line 635) | public void setOutputMessage(Any outputMessage) {
method getTaskDefinition (line 642) | public Optional<TaskDef> getTaskDefinition() {
method getRateLimitPerFrequency (line 646) | public int getRateLimitPerFrequency() {
method setRateLimitPerFrequency (line 650) | public void setRateLimitPerFrequency(int rateLimitPerFrequency) {
method getRateLimitFrequencyInSeconds (line 654) | public int getRateLimitFrequencyInSeconds() {
method setRateLimitFrequencyInSeconds (line 658) | public void setRateLimitFrequencyInSeconds(int rateLimitFrequencyInSec...
method getExternalInputPayloadStoragePath (line 665) | public String getExternalInputPayloadStoragePath() {
method setExternalInputPayloadStoragePath (line 673) | public void setExternalInputPayloadStoragePath(String externalInputPay...
method getExternalOutputPayloadStoragePath (line 680) | public String getExternalOutputPayloadStoragePath() {
method setExternalOutputPayloadStoragePath (line 688) | public void setExternalOutputPayloadStoragePath(String externalOutputP...
method setIsolationGroupId (line 692) | public void setIsolationGroupId(String isolationGroupId) {
method getIsolationGroupId (line 696) | public String getIsolationGroupId() {
method getExecutionNameSpace (line 700) | public String getExecutionNameSpace() {
method setExecutionNameSpace (line 704) | public void setExecutionNameSpace(String executionNameSpace) {
method getIteration (line 711) | public int getIteration() {
method setIteration (line 718) | public void setIteration(int iteration) {
method isLoopOverTask (line 722) | public boolean isLoopOverTask() {
method getWorkflowPriority (line 729) | public int getWorkflowPriority() {
method setWorkflowPriority (line 736) | public void setWorkflowPriority(int workflowPriority) {
method isSubworkflowChanged (line 740) | public boolean isSubworkflowChanged() {
method setSubworkflowChanged (line 744) | public void setSubworkflowChanged(boolean subworkflowChanged) {
method getSubWorkflowId (line 748) | public String getSubWorkflowId() {
method setSubWorkflowId (line 761) | public void setSubWorkflowId(String subWorkflowId) {
method getParentTaskId (line 769) | public String getParentTaskId() {
method setParentTaskId (line 773) | public void setParentTaskId(String parentTaskId) {
method getFirstStartTime (line 777) | public long getFirstStartTime() {
method setFirstStartTime (line 781) | public void setFirstStartTime(long firstStartTime) {
method getExecutionMetadata (line 789) | public ExecutionMetadata getExecutionMetadata() {
method getOrCreateExecutionMetadata (line 803) | public ExecutionMetadata getOrCreateExecutionMetadata() {
method getExecutionMetadataIfHasData (line 814) | public ExecutionMetadata getExecutionMetadataIfHasData() {
method hasExecutionMetadata (line 824) | public boolean hasExecutionMetadata() {
method setExecutionMetadata (line 831) | public void setExecutionMetadata(ExecutionMetadata executionMetadata) {
method copy (line 835) | public Task copy() {
method deepCopy (line 882) | public Task deepCopy() {
method toString (line 895) | @Override
method equals (line 998) | @Override
method hashCode (line 1053) | @Override
FILE: common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskDef.java
class TaskDef (line 34) | @ProtoMessage
type TimeoutPolicy (line 39) | @ProtoEnum
type RetryLogic (line 46) | @ProtoEnum
method TaskDef (line 138) | public TaskDef() {}
method TaskDef (line 140) | public TaskDef(String name) {
method TaskDef (line 144) | public TaskDef(String name, String description) {
method TaskDef (line 149) | public TaskDef(String name, String description, int retryCount, long t...
method TaskDef (line 156) | public TaskDef(
method getName (line 174) | public String getName() {
method setName (line 181) | public void setName(String name) {
method getDescription (line 188) | public String getDescription() {
method setDescription (line 195) | public void setDescription(String description) {
method getRetryCount (line 202) | public int getRetryCount() {
method setRetryCount (line 209) | public void setRetryCount(int retryCount) {
method getTimeoutSeconds (line 216) | public long getTimeoutSeconds() {
method setTimeoutSeconds (line 223) | public void setTimeoutSeconds(long timeoutSeconds) {
method getInputKeys (line 230) | public List<String> getInputKeys() {
method setInputKeys (line 237) | public void setInputKeys(List<String> inputKeys) {
method getOutputKeys (line 244) | public List<String> getOutputKeys() {
method setOutputKeys (line 251) | public void setOutputKeys(List<String> outputKeys) {
method getTimeoutPolicy (line 258) | public TimeoutPolicy getTimeoutPolicy() {
method setTimeoutPolicy (line 265) | public void setTimeoutPolicy(TimeoutPolicy timeoutPolicy) {
method getRetryLogic (line 272) | public RetryLogic getRetryLogic() {
method setRetryLogic (line 279) | public void setRetryLogic(RetryLogic retryLogic) {
method getRetryDelaySeconds (line 286) | public int getRetryDelaySeconds() {
method getResponseTimeoutSeconds (line 293) | public long getResponseTimeoutSeconds() {
method setResponseTimeoutSeconds (line 301) | public void setResponseTimeoutSeconds(long responseTimeoutSeconds) {
method setRetryDelaySeconds (line 308) | public void setRetryDelaySeconds(int retryDelaySeconds) {
method getInputTemplate (line 315) | public Map<String, Object> getInputTemplate() {
method getRateLimitPerFrequency (line 323) | public Integer getRateLimitPerFrequency() {
method setRateLimitPerFrequency (line 331) | public void setRateLimitPerFrequency(Integer rateLimitPerFrequency) {
method getRateLimitFrequencyInSeconds (line 339) | public Integer getRateLimitFrequencyInSeconds() {
method setRateLimitFrequencyInSeconds (line 348) | public void setRateLimitFrequencyInSeconds(Integer rateLimitFrequencyI...
method setConcurrentExecLimit (line 356) | public void setConcurrentExecLimit(Integer concurrentExecLimit) {
method getConcurrentExecLimit (line 363) | public Integer getConcurrentExecLimit() {
method concurrencyLimit (line 370) | public int concurrencyLimit() {
method setInputTemplate (line 377) | public void setInputTemplate(Map<String, Object> inputTemplate) {
method getIsolationGroupId (line 381) | public String getIsolationGroupId() {
method setIsolationGroupId (line 385) | public void setIsolationGroupId(String isolationGroupId) {
method getExecutionNameSpace (line 389) | public String getExecutionNameSpace() {
method setExecutionNameSpace (line 393) |
Copy disabled (too large)
Download .json
Condensed preview — 2905 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (16,707K chars).
[
{
"path": ".claude/agents/docs-writer.md",
"chars": 2444,
"preview": "---\nname: docs-writer\ndescription: Technical documentation specialist for Conductor workflow orchestration features. Cre"
},
{
"path": ".dockerignore",
"chars": 496,
"preview": "# Git/VCS\n.git\n.gitignore\n.gitattributes\n.github\n\n# IDE/editor\n.idea\n.vscode\n.classpath\n.project\n.settings\n*.iml\n\n# OS/f"
},
{
"path": ".gitattributes",
"chars": 187,
"preview": "gradlew eol=lf\n*.gradle eol=lf\n*.java eol=lf\n*.groovy eol=lf\nspring.factories eol=lf\n*.sh eol=lf\n\ndocs/* linguist-docume"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 790,
"preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: \"\"\nlabels: 'type: bug'\nassignees: ''\n\n---\n\n**Descr"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yml",
"chars": 1852,
"preview": "name: Bug Report\ndescription: Create a report to help us reproduce and fix the bug\n\nbody:\n- type: markdown\n attributes:"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 254,
"preview": "blank_issues_enabled: true\ncontact_links:\n - name: Questions\n url: https://orkes-conductor.slack.com/join/shared_invit"
},
{
"path": ".github/ISSUE_TEMPLATE/documentation.md",
"chars": 197,
"preview": "---\nname: Documentation\nabout: Something in the documentation that needs improvement\ntitle: \"[DOC]: \"\nlabels: 'type: doc"
},
{
"path": ".github/ISSUE_TEMPLATE/documentation.yaml",
"chars": 752,
"preview": "name: Documentation\ndescription: Report an issue related to https://docs.conductor-oss.org/index.html\n\nbody:\n- type: mar"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 692,
"preview": "---\nname: Feature request\nabout: Propose a new feature\ntitle: \"[FEATURE]: \"\nlabels: 'type: feature'\nassignees: ''\n\n---\n\n"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.yaml",
"chars": 1079,
"preview": "name: Feature request\ndescription: Submit a proposal/request for a new Conductor feature\n\nbody:\n- type: markdown\n attri"
},
{
"path": ".github/dependabot.yml",
"chars": 271,
"preview": "version: 2\nupdates:\n - package-ecosystem: \"gradle\"\n directory: \"/\"\n schedule:\n interval: \"weekly\"\n review"
},
{
"path": ".github/pull_request_template.md",
"chars": 461,
"preview": "Pull Request type\n----\n- [ ] Bugfix\n- [ ] Feature\n- [ ] Refactoring (no functional changes, no api changes)\n- [ ] Build "
},
{
"path": ".github/release-drafter.yml",
"chars": 729,
"preview": "template: |\n ## What’s Changed\n\n $CHANGES\n\nname-template: 'v$RESOLVED_VERSION'\ntag-template: 'v$RESOLVED_VERSION'\n\ncat"
},
{
"path": ".github/workflows/ci.yml",
"chars": 3238,
"preview": "name: CI\n\non:\n push:\n paths-ignore:\n - \"conductor-clients/**\"\n pull_request:\n paths-ignore:\n - \"conduc"
},
{
"path": ".github/workflows/debug-docker-credentials.yml",
"chars": 1211,
"preview": "name: Debug Docker Credentials\n\non:\n workflow_dispatch:\n\njobs:\n check-docker-user:\n runs-on: ubuntu-latest\n step"
},
{
"path": ".github/workflows/generate_gh_pages.yml",
"chars": 490,
"preview": "name: Publish docs via GitHub Pages\n\npermissions:\n contents: write\n\non:\n push:\n branches:\n - main\n workflow_d"
},
{
"path": ".github/workflows/publish.yml",
"chars": 4112,
"preview": "name: Publish Conductor OSS toMaven Central\non:\n release:\n types:\n - released\n - prereleased\n workflow_di"
},
{
"path": ".github/workflows/publish_build.yaml",
"chars": 4693,
"preview": "name: Publish Conductor OSS Server Lite\non:\n release:\n types:\n - released\n - prereleased\n workflow_dispat"
},
{
"path": ".github/workflows/publish_s3.yaml",
"chars": 2618,
"preview": "name: Publish Conductor Server to S3\non:\n push:\n branches:\n - docker_build # TEMPORARY - remove before merging"
},
{
"path": ".github/workflows/release_draft.yml",
"chars": 515,
"preview": "name: Release Drafter\n\non:\n push:\n branches:\n - main\n paths-ignore:\n - 'conductor-clients/**'\n\npermissi"
},
{
"path": ".github/workflows/ui-next-ci.yml",
"chars": 1236,
"preview": "name: UI v2 CI\n\non:\n pull_request:\n branches:\n - main\n paths:\n - \"ui-next/**\"\n\npermissions:\n contents:"
},
{
"path": ".gitignore",
"chars": 669,
"preview": "# Java Build\n.gradle\n.classpath\ndump.rdb\nout\nbin\ntarget\nbuildscan.log\n/docs/site\n\n# Python\n/polyglot-clients/python/cond"
},
{
"path": ".opencode/plans/video-generation-implementation.md",
"chars": 34075,
"preview": "# Video Generation Implementation Plan - Phases 2-5\n\n## Decisions Made\n1. **Full Spring AI mirror** for the video framew"
},
{
"path": "AGENTS.md",
"chars": 3508,
"preview": "# AGENTS.md\n\nInstructions for AI coding agents working on the Conductor codebase.\n\n## Project Overview\n\nConductor is an "
},
{
"path": "CHANGELOG.md",
"chars": 2572,
"preview": "# Conductor OSS Changelog\n\n## [Unreleased]\n\n### Breaking Changes\n- **JavaScript Evaluator Migration from Nashorn to Graa"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 4028,
"preview": "# Code of Conduct\n\nHello valued community members! 👋\n\nOur Conductor community has grown tremendously, and as part of ens"
},
{
"path": "CONTRIBUTING.md",
"chars": 4355,
"preview": "# Contributing\nThanks for your interest in Conductor!\nThis guide helps to find the most efficient way to contribute, ask"
},
{
"path": "LICENSE",
"chars": 11309,
"preview": "Apache License\n Version 2.0, January 2004\n http://www.apache.org/licens"
},
{
"path": "OPENSEARCH_TESTING_PLAN.md",
"chars": 19012,
"preview": "# OpenSearch Persistence Modules Testing Plan\n\n## Overview\n\nThis document provides a comprehensive testing plan for the "
},
{
"path": "OSSMETADATA",
"chars": 20,
"preview": "osslifecycle=active\n"
},
{
"path": "README.md",
"chars": 8967,
"preview": "\n<picture>\n <!-- Dark mode logo -->\n <source srcset=\"https://github.com/user-attachments/assets/104b3a67-6013-4622-807"
},
{
"path": "RELATED.md",
"chars": 46,
"preview": "[Related Projects](docs/resources/related.md)\n"
},
{
"path": "ROADMAP.md",
"chars": 2560,
"preview": "# Conductor OSS Roadmap\n\n\n## New Features\n### Type safety for workflow inputs and task input/output through JSON Schema\n"
},
{
"path": "SECURITY.md",
"chars": 467,
"preview": "# Security Policy\n- [Reporting a vulnerability](#reporting-a-vulnerability)\n- [Supported Conductor versions](#supported-"
},
{
"path": "USERS.md",
"chars": 1464,
"preview": "\n## Who uses Conductor?\n\nWe would like to keep track of whose using Conductor. Please send a pull request with your comp"
},
{
"path": "ai/CONTRIBUTING.md",
"chars": 17019,
"preview": "# Contributing to Conductor AI Module\n\nThank you for your interest in contributing to the Conductor AI module! This guid"
},
{
"path": "ai/JDBC_CONFIGURATION.md",
"chars": 8055,
"preview": "# JDBC Configuration\n\nThis document describes the configuration format for JDBC database connections in Conductor.\n\n## O"
},
{
"path": "ai/README.md",
"chars": 49187,
"preview": "# Conductor AI Module\n\nThe Conductor AI module provides built-in integration with 12 popular LLM providers and vector da"
},
{
"path": "ai/VECTORDB_CONFIGURATION.md",
"chars": 7537,
"preview": "# Vector Database Configuration\n\nThis document describes the configuration format for vector databases in Conductor.\n\n##"
},
{
"path": "ai/build.gradle",
"chars": 2767,
"preview": "plugins {\n id 'java'\n}\n\nrepositories {\n maven { url 'https://repo.spring.io/snapshot' }\n maven { url 'https://r"
},
{
"path": "ai/examples/01-chat-completion.json",
"chars": 598,
"preview": "{\n \"name\": \"chat_workflow\",\n \"version\": 1,\n \"schemaVersion\": 2,\n \"tasks\": [\n {\n \"name\": \"chat_task\",\n \""
},
{
"path": "ai/examples/02-generate-embeddings.json",
"chars": 390,
"preview": "{\n \"name\": \"embedding_workflow\",\n \"version\": 1,\n \"schemaVersion\": 2,\n \"tasks\": [\n {\n \"name\": \"generate_embed"
},
{
"path": "ai/examples/03-image-generation.json",
"chars": 442,
"preview": "{\n \"name\": \"image_gen_workflow\",\n \"version\": 1,\n \"schemaVersion\": 2,\n \"tasks\": [\n {\n \"name\": \"generate_image"
},
{
"path": "ai/examples/04-audio-generation.json",
"chars": 376,
"preview": "{\n \"name\": \"tts_workflow\",\n \"version\": 1,\n \"schemaVersion\": 2,\n \"tasks\": [\n {\n \"name\": \"generate_audio\",\n "
},
{
"path": "ai/examples/05-semantic-search.json",
"chars": 963,
"preview": "{\n \"name\": \"semantic_search_workflow\",\n \"version\": 1,\n \"schemaVersion\": 2,\n \"tasks\": [\n {\n \"name\": \"index_do"
},
{
"path": "ai/examples/06-rag-basic.json",
"chars": 1048,
"preview": "{\n \"name\": \"rag_workflow\",\n \"version\": 1,\n \"schemaVersion\": 2,\n \"tasks\": [\n {\n \"name\": \"search_knowledge_bas"
},
{
"path": "ai/examples/07-rag-complete.json",
"chars": 3433,
"preview": "{\n \"name\": \"complete_rag_demo\",\n \"description\": \"Index documents, search, and generate RAG answer\",\n \"version\": 1,\n "
},
{
"path": "ai/examples/08-mcp-list-tools.json",
"chars": 297,
"preview": "{\n \"name\": \"mcp_list_tools_workflow\",\n \"version\": 1,\n \"schemaVersion\": 2,\n \"tasks\": [\n {\n \"name\": \"list_mcp_"
},
{
"path": "ai/examples/09-mcp-call-tool.json",
"chars": 383,
"preview": "{\n \"name\": \"mcp_weather_workflow\",\n \"version\": 1,\n \"schemaVersion\": 2,\n \"tasks\": [\n {\n \"name\": \"get_weather\""
},
{
"path": "ai/examples/10-mcp-ai-agent.json",
"chars": 1721,
"preview": "{\n \"name\": \"mcp_ai_agent_workflow\",\n \"version\": 1,\n \"schemaVersion\": 2,\n \"tasks\": [\n {\n \"name\": \"list_availa"
},
{
"path": "ai/examples/11-video-openai-sora.json",
"chars": 647,
"preview": "{\n \"name\": \"video_gen_openai_sora\",\n \"description\": \"Generates a video using OpenAI Sora. The task is async -- it subm"
},
{
"path": "ai/examples/12-video-gemini-veo.json",
"chars": 787,
"preview": "{\n \"name\": \"video_gen_gemini_veo\",\n \"description\": \"Generates a video using Google Gemini Veo. Supports negative promp"
},
{
"path": "ai/examples/13-image-to-video-pipeline.json",
"chars": 1130,
"preview": "{\n \"name\": \"image_to_video_pipeline\",\n \"description\": \"A two-step creative pipeline: generates a still image with DALL"
},
{
"path": "ai/examples/14-stabilityai-image.json",
"chars": 636,
"preview": "{\n \"name\": \"image_gen_stabilityai\",\n \"description\": \"Generates an image using Stability AI's SD3.5 Large model via the"
},
{
"path": "ai/examples/15-pdf-generation.json",
"chars": 1381,
"preview": "{\n \"name\": \"pdf_generation_workflow\",\n \"description\": \"Generate a PDF document from markdown content with custom layou"
},
{
"path": "ai/examples/16-llm-to-pdf-pipeline.json",
"chars": 1902,
"preview": "{\n \"name\": \"llm_to_pdf_pipeline\",\n \"description\": \"End-to-end pipeline: LLM generates a markdown report from user inpu"
},
{
"path": "ai/examples/README.md",
"chars": 10954,
"preview": "# Conductor AI Workflow Examples\n\nThis folder contains ready-to-use workflow examples demonstrating the AI capabilities "
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/AIModel.java",
"chars": 7628,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/AIModelProvider.java",
"chars": 2887,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/LLMHelper.java",
"chars": 37767,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/LLMs.java",
"chars": 5411,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/MimeExtensionResolver.java",
"chars": 6889,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/ModelConfiguration.java",
"chars": 761,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/document/DocumentAccessDeniedException.java",
"chars": 973,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/document/DocumentAccessPolicy.java",
"chars": 19216,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/document/DocumentLoader.java",
"chars": 1705,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/document/FileSystemDocumentLoader.java",
"chars": 3795,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/document/HttpDocumentLoader.java",
"chars": 11295,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/mcp/JsonTextParser.java",
"chars": 3165,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/mcp/MCPService.java",
"chars": 15863,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/models/AudioGenRequest.java",
"chars": 1139,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/models/ChatCompletion.java",
"chars": 3275,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/models/ChatMessage.java",
"chars": 1501,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/models/EmbeddingGenRequest.java",
"chars": 1026,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/models/GetConversationHistoryRequest.java",
"chars": 2020,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/models/ImageGenRequest.java",
"chars": 1269,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/models/IndexDocInput.java",
"chars": 1687,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/models/IndexedDoc.java",
"chars": 1163,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/models/LLMResponse.java",
"chars": 1315,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/models/LLMWorkerInput.java",
"chars": 1591,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/models/MCPListToolsRequest.java",
"chars": 1345,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/models/MCPToolCallRequest.java",
"chars": 1639,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/models/MarkdownToPdfRequest.java",
"chars": 2344,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/models/Media.java",
"chars": 919,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/models/StoreEmbeddingsInput.java",
"chars": 1117,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/models/TextCompletion.java",
"chars": 897,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/models/ToolCall.java",
"chars": 1179,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/models/ToolSpec.java",
"chars": 993,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/models/VectorDBInput.java",
"chars": 1266,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/models/VideoGenRequest.java",
"chars": 3005,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/pdf/MarkdownToPdfConverter.java",
"chars": 6032,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/pdf/PdfDocumentRenderer.java",
"chars": 29999,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/pdf/PdfImageResolver.java",
"chars": 3860,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/pdf/PdfRenderContext.java",
"chars": 5704,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/anthropic/Anthropic.java",
"chars": 4426,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/anthropic/AnthropicConfiguration.java",
"chars": 1891,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/azureopenai/AzureOpenAI.java",
"chars": 5439,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/azureopenai/AzureOpenAIConfiguration.java",
"chars": 1658,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/bedrock/Bedrock.java",
"chars": 7011,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/bedrock/BedrockConfiguration.java",
"chars": 2960,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/cohere/CohereAI.java",
"chars": 4521,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/cohere/CohereAIConfiguration.java",
"chars": 1493,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/cohere/CohereChatModel.java",
"chars": 9293,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/cohere/CohereChatOptions.java",
"chars": 4255,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/cohere/CohereEmbeddingModel.java",
"chars": 5398,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/cohere/api/CohereApi.java",
"chars": 11357,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/gemini/GeminiGenAI.java",
"chars": 2814,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/gemini/GeminiVertex.java",
"chars": 14117,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/gemini/GeminiVertexConfiguration.java",
"chars": 1747,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/gemini/GeminiVideoModel.java",
"chars": 10236,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/grok/Grok.java",
"chars": 3686,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/grok/GrokAIConfiguration.java",
"chars": 1542,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/huggingface/HuggingFace.java",
"chars": 2415,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/huggingface/HuggingFaceConfiguration.java",
"chars": 1411,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/mistral/MistralAI.java",
"chars": 5473,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/mistral/MistralAIConfiguration.java",
"chars": 1544,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/ollama/Ollama.java",
"chars": 4732,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/ollama/OllamaConfiguration.java",
"chars": 1648,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/openai/OpenAI.java",
"chars": 13937,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/openai/OpenAIConfiguration.java",
"chars": 1656,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/openai/OpenAIVideoModel.java",
"chars": 8528,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/openai/api/OpenAIVideoApi.java",
"chars": 10595,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/perplexity/PerplexityAI.java",
"chars": 3321,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/perplexity/PerplexityAIConfiguration.java",
"chars": 1600,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/stabilityai/StabilityAI.java",
"chars": 8573,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/stabilityai/StabilityAIConfiguration.java",
"chars": 1546,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/providers/stabilityai/StabilityAiApi.java",
"chars": 9402,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/sql/JDBCConnectionConfig.java",
"chars": 2484,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/sql/JDBCInput.java",
"chars": 2254,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/sql/JDBCInstanceConfig.java",
"chars": 6982,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/sql/JDBCProvider.java",
"chars": 3058,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/sql/JDBCWorker.java",
"chars": 7929,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/AIModelTaskMapper.java",
"chars": 3940,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/AudioGenerationTaskMapper.java",
"chars": 1211,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/CallMCPToolTaskMapper.java",
"chars": 1224,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/ChatCompleteTaskMapper.java",
"chars": 12260,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/GenEmbeddingsTaskMapper.java",
"chars": 1224,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/GetEmbeddingsTaskMapper.java",
"chars": 1207,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/ImageGenerationTaskMapper.java",
"chars": 1211,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/IndexTextTaskMapper.java",
"chars": 1195,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/ListMCPToolsTaskMapper.java",
"chars": 1230,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/PdfGenerationTaskMapper.java",
"chars": 1215,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/SearchIndexTaskMapper.java",
"chars": 1201,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/StoreEmbeddingsTaskMapper.java",
"chars": 1227,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/TextCompleteTaskMapper.java",
"chars": 1206,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/tasks/mapper/VideoGenerationTaskMapper.java",
"chars": 1326,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/tasks/worker/DocumentGenWorkers.java",
"chars": 4584,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/tasks/worker/LLMWorkers.java",
"chars": 6843,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/tasks/worker/MCPWorkers.java",
"chars": 7293,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/tasks/worker/VectorDBWorkers.java",
"chars": 6863,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/vectordb/VectorDB.java",
"chars": 1462,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/vectordb/VectorDBConfig.java",
"chars": 859,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/vectordb/VectorDBInstanceConfig.java",
"chars": 6606,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/vectordb/VectorDBProvider.java",
"chars": 2885,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/vectordb/VectorDBs.java",
"chars": 2396,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/vectordb/mongodb/MongoDBConfig.java",
"chars": 1294,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/vectordb/mongodb/MongoVectorDB.java",
"chars": 7707,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/vectordb/pinecone/PineconeConfig.java",
"chars": 1176,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/vectordb/pinecone/PineconeDB.java",
"chars": 8651,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/vectordb/postgres/PostgresConfig.java",
"chars": 1514,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/vectordb/postgres/PostgresVectorDB.java",
"chars": 17738,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/video/AsyncVideoModel.java",
"chars": 1594,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/video/Video.java",
"chars": 3585,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/video/VideoGeneration.java",
"chars": 1700,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/video/VideoGenerationMetadata.java",
"chars": 1039,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/video/VideoMessage.java",
"chars": 1723,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/video/VideoModel.java",
"chars": 1564,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/video/VideoOptions.java",
"chars": 3073,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/video/VideoOptionsBuilder.java",
"chars": 1971,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/video/VideoPrompt.java",
"chars": 2653,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/video/VideoResponse.java",
"chars": 2551,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/ai/video/VideoResponseMetadata.java",
"chars": 2685,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/main/java/org/conductoross/conductor/config/AIIntegrationEnabledCondition.java",
"chars": 1180,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/AIModelProviderTest.java",
"chars": 6313,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/LLMHelperTest.java",
"chars": 14027,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/LLMsTest.java",
"chars": 2893,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/document/DocumentAccessPolicyTest.java",
"chars": 17175,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/integration/AIModelIntegrationTest.java",
"chars": 37539,
"preview": "/*\n * Copyright 2025 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/mapper/GenEmbeddingsTaskMapperTest.java",
"chars": 4847,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/mapper/GetEmbeddingsTaskMapperTest.java",
"chars": 5422,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/mapper/IndexTextTaskMapperTest.java",
"chars": 6451,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/mapper/PdfGenerationTaskMapperTest.java",
"chars": 5408,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/mapper/SearchIndexTaskMapperTest.java",
"chars": 6453,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/mapper/StoreEmbeddingsTaskMapperTest.java",
"chars": 5496,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/mapper/TextCompleteTaskMapperTest.java",
"chars": 6249,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/mcp/JsonTextParserTest.java",
"chars": 10590,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/pdf/DocumentGenWorkersTest.java",
"chars": 9024,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/pdf/MarkdownToPdfConverterTest.java",
"chars": 41663,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/pdf/PdfImageResolverTest.java",
"chars": 6683,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/pdf/PdfRenderContextTest.java",
"chars": 9022,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/providers/anthropic/AnthropicConfigurationTest.java",
"chars": 2346,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/providers/anthropic/AnthropicTest.java",
"chars": 5501,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/providers/azureopenai/AzureOpenAIConfigurationTest.java",
"chars": 1929,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/providers/azureopenai/AzureOpenAITest.java",
"chars": 4526,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/providers/bedrock/BedrockConfigurationTest.java",
"chars": 3538,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/providers/bedrock/BedrockTest.java",
"chars": 4401,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/providers/cohere/CohereAIConfigurationTest.java",
"chars": 1724,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/providers/cohere/CohereAITest.java",
"chars": 3851,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/providers/gemini/GeminiVertexConfigurationTest.java",
"chars": 2351,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
},
{
"path": "ai/src/test/java/org/conductoross/conductor/ai/providers/gemini/GeminiVertexTest.java",
"chars": 4519,
"preview": "/*\n * Copyright 2026 Conductor Authors.\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you ma"
}
]
// ... and 2705 more files (download for full content)
About this extraction
This page contains the full source code of the conductor-oss/conductor GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2905 files (15.5 MB), approximately 4.1M tokens, and a symbol index with 12854 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.