diff --git a/apps/api/src/api/tool_instances.py b/apps/api/src/api/tool_instances.py index 109dfa3..bf661f9 100644 --- a/apps/api/src/api/tool_instances.py +++ b/apps/api/src/api/tool_instances.py @@ -747,8 +747,46 @@ services: """ write_compose_file(instance_dir, compose_content) + elif tool_type.definition_type == "manifest": + # Manifest-based: generate compose from manifest definition + from src.models.tool_definition_manifest import ToolDefinitionManifest + + manifest_def = await session.get( + ToolDefinitionManifest, tool_type.manifest_id + ) + if not manifest_def: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Manifest definition not found for this tool type", + ) + + manifest = dict(manifest_def.manifest) + if manifest_def.base_definition_id: + base_def = await session.get( + ToolDefinitionManifest, manifest_def.base_definition_id + ) + if base_def: + manifest = resolve_base( + deep_merge(dict(base_def.manifest), manifest) + ) + + image_tag = compute_image_tag(tool_type.name, manifest) + + variables = { + "IMAGE_TAG": image_tag, + "INSTANCE_NAME": instance_name.lower(), + "INSTANCE_DIR": instance_dir, + "REPO_PATH": repo_path, + "SSH_PATH": "", + "TOOL_PORT": tool_port, + "EXTRA_ENV": {}, + "EXTRA_VOLUMES": [], + } + compose_content = compile_compose(manifest, variables) + write_compose_file(instance_dir, compose_content) + else: - # Render compose template + # Render compose template (legacy) variables = { "REPO_PATH": repo_path, "INSTANCE_NAME": instance_name,