API Integration Builder
Run ID: 69cd2cde3e7fb09ff16a89662026-04-01Development
PantheraHive BOS
BOS Dashboard

As part of the PantheraHive "API Integration Builder" workflow, this deliverable outlines the comprehensive specification and design for integrating with an external API to perform the create_project operation. This output provides the blueprint for developing or configuring an integration component that can programmatically create new projects within a designated Project Management System (PMS) or similar platform.


API Integration Specification: Project Creation

1. Introduction & Core Objective

This document details the technical specifications and best practices for building an API integration specifically designed to create new projects within an external system. The primary objective is to enable automated project creation, reducing manual effort and ensuring consistency across project initiation processes. This integration will leverage the target system's API to submit project details and receive confirmation of successful creation.

2. Target API Endpoint & Method

The integration will target a dedicated API endpoint for project creation. This typically involves a POST request to a resource collection representing projects.

3. Request Payload Specification (Example)

The request body for creating a project will be a JSON object containing all necessary project attributes. The specific fields will vary based on the target Project Management System's API schema, but common attributes are outlined below.

Content-Type: application/json

Example Request Body:

text • 1,504 chars
**Key Request Body Fields & Descriptions:**

*   `name` (string, **required**): The unique or primary identifier for the project.
*   `description` (string, optional): A detailed description of the project's purpose and scope.
*   `status` (string, optional): The initial status of the project (e.g., "Planned", "Pending Approval", "Draft").
*   `startDate` (string, ISO 8601 datetime, optional): The planned start date and time of the project.
*   `endDate` (string, ISO 8601 datetime, optional): The planned end date and time of the project.
*   `priority` (string, optional): The priority level (e.g., "High", "Medium", "Low").
*   `ownerId` (string, optional): The ID of the user designated as the project owner/manager.
*   `teamIds` (array of strings, optional): An array of IDs for teams assigned to the project.
*   `budget` (object, optional): Financial details related to the project.
    *   `currency` (string): The currency code (e.g., "USD", "EUR").
    *   `amount` (number): The budget amount.
*   `customFields` (object, optional): A flexible object to accommodate any custom fields defined in the target PMS.

### 4. Successful Response Specification (Example)

Upon successful project creation, the API will typically return an `HTTP 201 Created` status code along with a JSON response body containing the newly created project's details, including its unique identifier.

**HTTP Status Code:** `201 Created`

**Content-Type:** `application/json`

**Example Success Response Body:**

Sandboxed live preview

Workflow Step: collab → generate_code - API Integration Code Generation

This document provides a comprehensive, detailed, and professional output for the "API Integration Builder" workflow, specifically focusing on generating production-ready code. This output serves as a foundational deliverable to help you seamlessly integrate with external APIs.


1. Introduction to API Integration Builder

The "API Integration Builder" is designed to streamline the process of connecting your applications with external services via their APIs. This initial step focuses on generating robust, well-structured, and easily customizable code that handles common API interaction patterns, including:

  • Secure Configuration: Managing API keys and sensitive data.
  • HTTP Methods: Performing GET, POST, PUT, and DELETE requests.
  • Authentication: Supporting common authentication mechanisms (e.g., API Keys, OAuth 2.0).
  • Error Handling: Gracefully managing API errors and network issues.
  • Retries: Implementing intelligent retry mechanisms for transient failures.
  • Logging: Providing clear visibility into API interactions.

The generated code is provided in Python, a widely used language for backend development and API integrations, leveraging the popular requests library for HTTP communication.


2. Core Concepts of API Integration

Before diving into the code, understanding these core concepts will help you effectively utilize and customize the generated solution:

  • Base URL: The root URL for all API endpoints (e.g., https://api.example.com/v1).
  • Endpoints: Specific paths appended to the base URL to access different resources (e.g., /products, /users).
  • HTTP Methods:

* GET: Retrieve data.

* POST: Create new data.

* PUT: Update existing data (replaces the entire resource).

* PATCH: Partially update existing data.

* DELETE: Remove data.

  • Headers: Key-value pairs sent with requests, often used for authentication, content type, or other metadata.
  • Query Parameters: Key-value pairs appended to the URL after a ? (e.g., ?limit=10&offset=0) to filter or paginate data.
  • Request Body: Data sent with POST, PUT, or PATCH requests, typically in JSON format.
  • Authentication: Methods to verify your application's identity and authorization to access the API. Common types include:

* API Keys: A secret token sent in headers or as a query parameter.

* OAuth 2.0: A more complex protocol involving token exchange (access tokens, refresh tokens) for delegated authorization.

  • Response Status Codes: Standardized codes indicating the outcome of an API request (e.g., 200 OK, 400 Bad Request, 401 Unauthorized, 404 Not Found, 500 Internal Server Error).
  • Error Handling: Mechanisms to detect and respond to non-2xx status codes, network issues, or malformed responses.
  • Rate Limiting: Restrictions imposed by APIs on the number of requests you can make within a certain timeframe to prevent abuse.

3. Generated Code Examples (Python)

Below is a Python ApiClient class designed for reusability, robustness, and ease of use. It includes common patterns for API interaction, authentication, error handling, and retries.

3.1. File Structure

We'll provide two files:

  1. api_client.py: Contains the core ApiClient class.
  2. main.py: Demonstrates how to use the ApiClient class.

3.2. api_client.py - Core API Client

This file defines a flexible ApiClient class that can be configured for various external APIs.


# api_client.py

import requests
import os
import logging
import time
from typing import Dict, Any, Optional, Union, Tuple

# --- Configuration for Logging ---
# Configure basic logging for better visibility into API calls and errors
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

# --- Custom Exception Class for API Errors ---
class APIError(Exception):
    """Custom exception for API-related errors."""
    def __init__(self, message: str, status_code: Optional[int] = None, details: Optional[Any] = None):
        super().__init__(message)
        self.status_code = status_code
        self.details = details

    def __str__(self):
        detail_str = f" Details: {self.details}" if self.details else ""
        return f"API Error: {self.args[0]} (Status: {self.status_code}){detail_str}"


class ApiClient:
    """
    A robust and reusable client for interacting with external REST APIs.

    Features:
    - Configurable base URL, authentication (API Key, OAuth Token).
    - Supports GET, POST, PUT, DELETE HTTP methods.
    - Automatic JSON handling for request bodies and responses.
    - Configurable timeouts for requests.
    - Exponential backoff retry mechanism for transient errors (5xx, 429).
    - Centralized error handling with custom exceptions.
    - Basic logging for API interactions.
    """

    def __init__(
        self,
        base_url: str,
        api_key: Optional[str] = None,
        auth_token: Optional[str] = None,  # For OAuth2 Bearer tokens
        timeout: int = 30,
        max_retries: int = 3,
        backoff_factor: float = 0.5,
        default_headers: Optional[Dict[str, str]] = None
    ):
        """
        Initializes the ApiClient.

        Args:
            base_url (str): The base URL of the API (e.g., "https://api.example.com/v1").
            api_key (str, optional): An API key for authentication. If provided, sent as 'X-API-Key' header.
            auth_token (str, optional): An OAuth2 Bearer token. If provided, sent as 'Authorization: Bearer <token>'.
                                        Takes precedence over api_key if both are provided.
            timeout (int): Default timeout for requests in seconds.
            max_retries (int): Maximum number of retries for transient errors.
            backoff_factor (float): Factor for exponential backoff between retries (delay = backoff_factor * (2 ** (retry_attempt - 1))).
            default_headers (Dict[str, str], optional): Additional default headers to include in all requests.
        """
        if not base_url:
            raise ValueError("Base URL cannot be empty.")

        self.base_url = base_url.rstrip('/') # Ensure no trailing slash to prevent double slashes
        self.api_key = api_key
        self.auth_token = auth_token
        self.timeout = timeout
        self.max_retries = max_retries
        self.backoff_factor = backoff_factor
        self.default_headers = default_headers if default_headers is not None else {}

        logger.info(f"ApiClient initialized for base_url: {self.base_url}")

    def _get_headers(self, custom_headers: Optional[Dict[str, str]] = None) -> Dict[str, str]:
        """
        Constructs the request headers, including authentication and default headers.
        """
        headers = {
            "Content-Type": "application/json",
            "Accept": "application/json",
            **self.default_headers
        }

        if self.auth_token:
            headers["Authorization"] = f"Bearer {self.auth_token}"
        elif self.api_key:
            headers["X-API-Key"] = self.api_key # Common header for API Keys

        if custom_headers:
            headers.update(custom_headers)

        return headers

    @staticmethod
    def _handle_response(response: requests.Response) -> Any:
        """
        Handles the API response, checking for errors and parsing JSON.
        Raises APIError for non-2xx status codes.
        """
        try:
            response_json = response.json()
        except requests.exceptions.JSONDecodeError:
            response_json = {"message": response.text} # Fallback if response is not JSON

        if 200 <= response.status_code < 300:
            return response_json
        else:
            error_message = f"API request failed with status {response.status_code}"
            logger.error(f"{error_message}: {response_json}")
            raise APIError(
                message=error_message,
                status_code=response.status_code,
                details=response_json
            )

    def _make_request(
        self,
        method: str,
        endpoint: str,
        params: Optional[Dict[str, Any]] = None,
        data: Optional[Dict[str, Any]] = None,
        json: Optional[Dict[str, Any]] = None,
        headers: Optional[Dict[str, str]] = None,
        stream: bool = False,
        retries: int = 0
    ) -> Any:
        """
        Internal method to make an HTTP request with retry logic.
        """
        url = f"{self.base_url}/{endpoint.lstrip('/')}"
        request_headers = self._get_headers(headers)

        # 'json' parameter is preferred for sending JSON bodies with requests library
        # 'data' parameter is for form-encoded data or raw bytes
        if data and json:
            logger.warning("Both 'data' and 'json' parameters provided. 'json' will be used.")
            data = None # Clear data if json is provided

        try:
            logger.debug(f"Making {method} request to {url} with params: {params}, json: {json}, headers: {request_headers}")
            response = requests.request(
                method,
                url,
                params=params,
                json=json, # Use json parameter for JSON body
                data=data, # Use data parameter for other body types (e.g., form-encoded)
                headers=request_headers,
                timeout=self.timeout,
                stream=stream
            )
            response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx)

            logger.info(f"Successfully received response from {url} (Status: {response.status_code})")
            return self._handle_response(response)

        except requests.exceptions.HTTPError as e:
            # Handle specific status codes for retries (e.g., 5xx, 429 Too Many Requests)
            if e.response is not None and e.response.status_code in [429, 500, 502, 503, 504]:
                if retries < self.max_retries:
                    wait_time = self.backoff_factor * (2 ** retries)
                    logger.warning(
                        f"Request to {url} failed with status {e.response.status_code}. "
                        f"Retrying in {wait_time:.2f} seconds... (Attempt {retries + 1}/{self.max_retries})"
                    )
                    time.sleep(wait_time)
                    return self._make_request(method, endpoint, params, data, json, headers, stream, retries + 1)
                else:
                    logger.error(f"Max retries reached for {url}.")
            
            # If not a retryable error or max retries reached, raise APIError
            logger.error(f"HTTP Error for {url}: {e}")
            raise self._handle_response(e.response) # Use _handle_response to parse error body

        except requests.exceptions.Timeout as e:
            logger.error(f"Request to {url} timed out after {self.timeout} seconds: {e}")
            raise APIError(f"Request timed out for {url}", details=str(e))
        except requests.exceptions.ConnectionError as e:
            logger.error(f"Connection error to {url}: {e}")
            raise APIError(f"Network connection error to {url}", details=str(e))
        except requests.exceptions.RequestException as e:
            logger.error(f"An unexpected request error occurred for {url}: {e}")
            raise APIError(f"An unexpected error occurred during request to {url}", details=str(e))


    def get(
        self,
        endpoint: str,
        params: Optional[Dict[str, Any]] = None,
        headers: Optional[Dict[str, str]] = None,
        stream: bool = False
    ) -> Any:
        """Performs a GET request."""
        return self._make_request("GET", endpoint, params=params, headers=headers, stream=stream)

    def post(
        self,
        endpoint: str,
        data: Optional[Dict[str, Any]] = None,
        json: Optional[Dict[str, Any]] = None,
        headers: Optional[Dict[str, str]] = None
    ) -> Any:
        """Performs a POST request."""
        return self._make_request("POST", endpoint, data=data, json=json, headers=headers)

    def put(
        self

Key Response Body Fields & Descriptions:

  • id (string): The unique identifier assigned to the new project by the external system. This is crucial for future operations (e.g., updating, retrieving).
  • All fields from the request body, typically echoed back.
  • createdAt (string, ISO 8601 datetime): Timestamp indicating when the project was created.
  • updatedAt (string, ISO 8601 datetime): Timestamp indicating the last update time (initially same as createdAt).

5. Error Handling Strategy

Robust error handling is critical for any integration. The integration should be designed to gracefully manage various error scenarios reported by the target API.

  • HTTP Status Codes:

* 400 Bad Request: Indicates invalid input data (e.g., missing required fields, incorrect data types, validation failures). The response body should provide specific error messages.

* Example: {"code": "INVALID_INPUT", "message": "Project name is required."}

* 401 Unauthorized: Authentication credentials are missing or invalid.

* Example: {"code": "UNAUTHORIZED", "message": "Invalid API key or token."}

* 403 Forbidden: The authenticated user/application does not have permission to create projects.

* Example: {"code": "FORBIDDEN", "message": "User lacks 'project:create' permission."}

* 409 Conflict: A resource with the same unique identifier (e.g., project name if it must be unique) already exists. This is important for idempotency.

* Example: {"code": "DUPLICATE_RESOURCE", "message": "Project 'PantheraHive Q3 Product Launch' already exists."}

* 429 Too Many Requests: Rate limiting has been exceeded. The integration should implement retry mechanisms with exponential backoff.

* 500 Internal Server Error: An unexpected error occurred on the target API's side. The integration should log this and potentially retry.

  • Error Response Body: Standardized JSON error objects are expected, typically including an error code, a human-readable message, and sometimes specific field-level errors.
  • Logging: Comprehensive logging of all API requests, responses, and errors is essential for debugging and monitoring.
  • Alerting: Implement alerting for critical errors (e.g., repeated 4xx/5xx errors, rate limit breaches) to ensure prompt investigation.

6. Security & Authentication

The integration must adhere to best practices for secure API communication.

  • Authentication:

* OAuth 2.0 (Recommended): If the target API supports OAuth 2.0 (e.g., Client Credentials Grant for server-to-server integrations), this is the preferred method. The integration will need to manage token acquisition and refresh.

* API Key: If OAuth 2.0 is not available, a secure API key (sent via Authorization header or query parameter) can be used. API keys must be securely stored (e.g., in environment variables, secret management services) and never hardcoded.

  • Authorization: Ensure the authenticated identity (API key or OAuth token) has the specific scope or permissions required to create projects.
  • Data Encryption: All communication must occur over HTTPS/TLS to encrypt data in transit.
  • Input Validation: Implement both client-side and server-side validation to prevent injection attacks and ensure data integrity.

7. Integration Workflow Overview

The high-level workflow for creating a project via this integration is as follows:

  1. Trigger Event: An event occurs that necessitates the creation of a new project (e.g., form submission, internal system event, scheduled task).
  2. Data Preparation: Gather all required and optional project details from the source system or user input.
  3. Authentication: Obtain or refresh the necessary authentication token/API key.
  4. Request Construction: Construct the JSON request body with the prepared project data.
  5. API Call: Send the POST request to the /api/v1/projects endpoint.
  6. Response Handling:

* Success (201 Created): Parse the response to extract the new project's ID and other details. Update the source system with this information (e.g., link the internal record to the external project ID).

* Error (4xx/5xx): Log the error, handle specific error codes (e.g., retry on 429, report validation errors), and notify relevant stakeholders.

  1. Post-Creation Actions: Perform any follow-up actions in the source system (e.g., update project status, assign tasks).

8. Idempotency Considerations

To prevent duplicate project creation if a request is retried, consider the target API's idempotency support.

  • If the API supports an Idempotency-Key header, the integration should generate a unique key for each project creation attempt and include it in the request. This ensures that even if the request is sent multiple times, the project is created only once.
  • If not, the integration might need to implement logic to check for existing projects (e.g., by name) before attempting creation, especially in retry scenarios.

9. Actionable Next Steps

To proceed with the implementation of this API integration, the following steps are recommended:

  1. Review Target API Documentation: Thoroughly review the specific API documentation for your chosen Project Management System to confirm endpoint paths, required fields, data types, authentication mechanisms, and error codes.
  2. API Key/Credential Procurement: Obtain the necessary API keys, OAuth client IDs, and secrets from your target system's administration panel.
  3. Development Environment Setup: Set up your development environment with appropriate tools and libraries for making HTTP requests and handling JSON.
  4. Code Development: Begin writing the integration code based on the specifications provided, focusing on robust error handling, secure credential management, and logging.
  5. Testing Plan: Develop a comprehensive testing plan, including unit tests, integration tests, and end-to-end tests, to validate project creation, error scenarios, and edge cases.
  6. Deployment Strategy: Plan for secure deployment of the integration, considering environment variables for secrets and monitoring solutions.
  7. Monitoring & Alerting: Implement monitoring for API call success/failure rates, response times, and error thresholds. Configure alerts for critical issues.
api_integration_builder.txt
Download source file
Copy all content
Full output as text
Download ZIP
IDE-ready project ZIP
Copy share link
Permanent URL for this run
Get Embed Code
Embed this result on any website
Print / Save PDF
Use browser print dialog
"); var hasSrcMain=Object.keys(extracted).some(function(k){return k.indexOf("src/main")>=0;}); if(!hasSrcMain) zip.file(folder+"src/main."+ext,"import React from 'react' import ReactDOM from 'react-dom/client' import App from './App' import './index.css' ReactDOM.createRoot(document.getElementById('root')!).render( ) "); var hasSrcApp=Object.keys(extracted).some(function(k){return k==="src/App."+ext||k==="App."+ext;}); if(!hasSrcApp) zip.file(folder+"src/App."+ext,"import React from 'react' import './App.css' function App(){ return(

"+slugTitle(pn)+"

Built with PantheraHive BOS

) } export default App "); zip.file(folder+"src/index.css","*{margin:0;padding:0;box-sizing:border-box} body{font-family:system-ui,-apple-system,sans-serif;background:#f0f2f5;color:#1a1a2e} .app{min-height:100vh;display:flex;flex-direction:column} .app-header{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:40px} h1{font-size:2.5rem;font-weight:700} "); zip.file(folder+"src/App.css",""); zip.file(folder+"src/components/.gitkeep",""); zip.file(folder+"src/pages/.gitkeep",""); zip.file(folder+"src/hooks/.gitkeep",""); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+" Generated by PantheraHive BOS. ## Setup ```bash npm install npm run dev ``` ## Build ```bash npm run build ``` ## Open in IDE Open the project folder in VS Code or WebStorm. "); zip.file(folder+".gitignore","node_modules/ dist/ .env .DS_Store *.local "); } /* --- Vue (Vite + Composition API + TypeScript) --- */ function buildVue(zip,folder,app,code,panelTxt){ var pn=pkgName(app); var C=cc(pn); var extracted=extractCode(panelTxt); zip.file(folder+"package.json",'{ "name": "'+pn+'", "version": "0.0.0", "type": "module", "scripts": { "dev": "vite", "build": "vue-tsc -b && vite build", "preview": "vite preview" }, "dependencies": { "vue": "^3.5.13", "vue-router": "^4.4.5", "pinia": "^2.3.0", "axios": "^1.7.9" }, "devDependencies": { "@vitejs/plugin-vue": "^5.2.1", "typescript": "~5.7.3", "vite": "^6.0.5", "vue-tsc": "^2.2.0" } } '); zip.file(folder+"vite.config.ts","import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import { resolve } from 'path' export default defineConfig({ plugins: [vue()], resolve: { alias: { '@': resolve(__dirname,'src') } } }) "); zip.file(folder+"tsconfig.json",'{"files":[],"references":[{"path":"./tsconfig.app.json"},{"path":"./tsconfig.node.json"}]} '); zip.file(folder+"tsconfig.app.json",'{ "compilerOptions":{ "target":"ES2020","useDefineForClassFields":true,"module":"ESNext","lib":["ES2020","DOM","DOM.Iterable"], "skipLibCheck":true,"moduleResolution":"bundler","allowImportingTsExtensions":true, "isolatedModules":true,"moduleDetection":"force","noEmit":true,"jsxImportSource":"vue", "strict":true,"paths":{"@/*":["./src/*"]} }, "include":["src/**/*.ts","src/**/*.d.ts","src/**/*.tsx","src/**/*.vue"] } '); zip.file(folder+"env.d.ts","/// "); zip.file(folder+"index.html"," "+slugTitle(pn)+"
"); var hasMain=Object.keys(extracted).some(function(k){return k==="src/main.ts"||k==="main.ts";}); if(!hasMain) zip.file(folder+"src/main.ts","import { createApp } from 'vue' import { createPinia } from 'pinia' import App from './App.vue' import './assets/main.css' const app = createApp(App) app.use(createPinia()) app.mount('#app') "); var hasApp=Object.keys(extracted).some(function(k){return k.indexOf("App.vue")>=0;}); if(!hasApp) zip.file(folder+"src/App.vue"," "); zip.file(folder+"src/assets/main.css","*{margin:0;padding:0;box-sizing:border-box}body{font-family:system-ui,sans-serif;background:#fff;color:#213547} "); zip.file(folder+"src/components/.gitkeep",""); zip.file(folder+"src/views/.gitkeep",""); zip.file(folder+"src/stores/.gitkeep",""); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+" Generated by PantheraHive BOS. ## Setup ```bash npm install npm run dev ``` ## Build ```bash npm run build ``` Open in VS Code or WebStorm. "); zip.file(folder+".gitignore","node_modules/ dist/ .env .DS_Store *.local "); } /* --- Angular (v19 standalone) --- */ function buildAngular(zip,folder,app,code,panelTxt){ var pn=pkgName(app); var C=cc(pn); var sel=pn.replace(/_/g,"-"); var extracted=extractCode(panelTxt); zip.file(folder+"package.json",'{ "name": "'+pn+'", "version": "0.0.0", "scripts": { "ng": "ng", "start": "ng serve", "build": "ng build", "test": "ng test" }, "dependencies": { "@angular/animations": "^19.0.0", "@angular/common": "^19.0.0", "@angular/compiler": "^19.0.0", "@angular/core": "^19.0.0", "@angular/forms": "^19.0.0", "@angular/platform-browser": "^19.0.0", "@angular/platform-browser-dynamic": "^19.0.0", "@angular/router": "^19.0.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.15.0" }, "devDependencies": { "@angular-devkit/build-angular": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", "typescript": "~5.6.0" } } '); zip.file(folder+"angular.json",'{ "$schema": "./node_modules/@angular/cli/lib/config/schema.json", "version": 1, "newProjectRoot": "projects", "projects": { "'+pn+'": { "projectType": "application", "root": "", "sourceRoot": "src", "prefix": "app", "architect": { "build": { "builder": "@angular-devkit/build-angular:application", "options": { "outputPath": "dist/'+pn+'", "index": "src/index.html", "browser": "src/main.ts", "tsConfig": "tsconfig.app.json", "styles": ["src/styles.css"], "scripts": [] } }, "serve": {"builder":"@angular-devkit/build-angular:dev-server","configurations":{"production":{"buildTarget":"'+pn+':build:production"},"development":{"buildTarget":"'+pn+':build:development"}},"defaultConfiguration":"development"} } } } } '); zip.file(folder+"tsconfig.json",'{ "compileOnSave": false, "compilerOptions": {"baseUrl":"./","outDir":"./dist/out-tsc","forceConsistentCasingInFileNames":true,"strict":true,"noImplicitOverride":true,"noPropertyAccessFromIndexSignature":true,"noImplicitReturns":true,"noFallthroughCasesInSwitch":true,"paths":{"@/*":["src/*"]},"skipLibCheck":true,"esModuleInterop":true,"sourceMap":true,"declaration":false,"experimentalDecorators":true,"moduleResolution":"bundler","importHelpers":true,"target":"ES2022","module":"ES2022","useDefineForClassFields":false,"lib":["ES2022","dom"]}, "references":[{"path":"./tsconfig.app.json"}] } '); zip.file(folder+"tsconfig.app.json",'{ "extends":"./tsconfig.json", "compilerOptions":{"outDir":"./dist/out-tsc","types":[]}, "files":["src/main.ts"], "include":["src/**/*.d.ts"] } '); zip.file(folder+"src/index.html"," "+slugTitle(pn)+" "); zip.file(folder+"src/main.ts","import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; import { AppComponent } from './app/app.component'; bootstrapApplication(AppComponent, appConfig) .catch(err => console.error(err)); "); zip.file(folder+"src/styles.css","* { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: system-ui, -apple-system, sans-serif; background: #f9fafb; color: #111827; } "); var hasComp=Object.keys(extracted).some(function(k){return k.indexOf("app.component")>=0;}); if(!hasComp){ zip.file(folder+"src/app/app.component.ts","import { Component } from '@angular/core'; import { RouterOutlet } from '@angular/router'; @Component({ selector: 'app-root', standalone: true, imports: [RouterOutlet], templateUrl: './app.component.html', styleUrl: './app.component.css' }) export class AppComponent { title = '"+pn+"'; } "); zip.file(folder+"src/app/app.component.html","

"+slugTitle(pn)+"

Built with PantheraHive BOS

"); zip.file(folder+"src/app/app.component.css",".app-header{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:60vh;gap:16px}h1{font-size:2.5rem;font-weight:700;color:#6366f1} "); } zip.file(folder+"src/app/app.config.ts","import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; import { provideRouter } from '@angular/router'; import { routes } from './app.routes'; export const appConfig: ApplicationConfig = { providers: [ provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes) ] }; "); zip.file(folder+"src/app/app.routes.ts","import { Routes } from '@angular/router'; export const routes: Routes = []; "); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+" Generated by PantheraHive BOS. ## Setup ```bash npm install ng serve # or: npm start ``` ## Build ```bash ng build ``` Open in VS Code with Angular Language Service extension. "); zip.file(folder+".gitignore","node_modules/ dist/ .env .DS_Store *.local .angular/ "); } /* --- Python --- */ function buildPython(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^```[w]* ?/m,"").replace(/ ?```$/m,"").trim(); var reqMap={"numpy":"numpy","pandas":"pandas","sklearn":"scikit-learn","tensorflow":"tensorflow","torch":"torch","flask":"flask","fastapi":"fastapi","uvicorn":"uvicorn","requests":"requests","sqlalchemy":"sqlalchemy","pydantic":"pydantic","dotenv":"python-dotenv","PIL":"Pillow","cv2":"opencv-python","matplotlib":"matplotlib","seaborn":"seaborn","scipy":"scipy"}; var reqs=[]; Object.keys(reqMap).forEach(function(k){if(src.indexOf("import "+k)>=0||src.indexOf("from "+k)>=0)reqs.push(reqMap[k]);}); var reqsTxt=reqs.length?reqs.join(" "):"# add dependencies here "; zip.file(folder+"main.py",src||"# "+title+" # Generated by PantheraHive BOS print(title+" loaded") "); zip.file(folder+"requirements.txt",reqsTxt); zip.file(folder+".env.example","# Environment variables "); zip.file(folder+"README.md","# "+title+" Generated by PantheraHive BOS. ## Setup ```bash python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt ``` ## Run ```bash python main.py ``` "); zip.file(folder+".gitignore",".venv/ __pycache__/ *.pyc .env .DS_Store "); } /* --- Node.js --- */ function buildNode(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^```[w]* ?/m,"").replace(/ ?```$/m,"").trim(); var depMap={"mongoose":"^8.0.0","dotenv":"^16.4.5","axios":"^1.7.9","cors":"^2.8.5","bcryptjs":"^2.4.3","jsonwebtoken":"^9.0.2","socket.io":"^4.7.4","uuid":"^9.0.1","zod":"^3.22.4","express":"^4.18.2"}; var deps={}; Object.keys(depMap).forEach(function(k){if(src.indexOf(k)>=0)deps[k]=depMap[k];}); if(!deps["express"])deps["express"]="^4.18.2"; var pkgJson=JSON.stringify({"name":pn,"version":"1.0.0","main":"src/index.js","scripts":{"start":"node src/index.js","dev":"nodemon src/index.js"},"dependencies":deps,"devDependencies":{"nodemon":"^3.0.3"}},null,2)+" "; zip.file(folder+"package.json",pkgJson); var fallback="const express=require("express"); const app=express(); app.use(express.json()); app.get("/",(req,res)=>{ res.json({message:""+title+" API"}); }); const PORT=process.env.PORT||3000; app.listen(PORT,()=>console.log("Server on port "+PORT)); "; zip.file(folder+"src/index.js",src||fallback); zip.file(folder+".env.example","PORT=3000 "); zip.file(folder+".gitignore","node_modules/ .env .DS_Store "); zip.file(folder+"README.md","# "+title+" Generated by PantheraHive BOS. ## Setup ```bash npm install ``` ## Run ```bash npm run dev ``` "); } /* --- Vanilla HTML --- */ function buildVanillaHtml(zip,folder,app,code){ var title=slugTitle(app); var isFullDoc=code.trim().toLowerCase().indexOf("=0||code.trim().toLowerCase().indexOf("=0; var indexHtml=isFullDoc?code:" "+title+" "+code+" "; zip.file(folder+"index.html",indexHtml); zip.file(folder+"style.css","/* "+title+" — styles */ *{margin:0;padding:0;box-sizing:border-box} body{font-family:system-ui,-apple-system,sans-serif;background:#fff;color:#1a1a2e} "); zip.file(folder+"script.js","/* "+title+" — scripts */ "); zip.file(folder+"assets/.gitkeep",""); zip.file(folder+"README.md","# "+title+" Generated by PantheraHive BOS. ## Open Double-click `index.html` in your browser. Or serve locally: ```bash npx serve . # or python3 -m http.server 3000 ``` "); zip.file(folder+".gitignore",".DS_Store node_modules/ .env "); } /* ===== MAIN ===== */ var sc=document.createElement("script"); sc.src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"; sc.onerror=function(){ if(lbl)lbl.textContent="Download ZIP"; alert("JSZip load failed — check connection."); }; sc.onload=function(){ var zip=new JSZip(); var base=(_phFname||"output").replace(/.[^.]+$/,""); var app=base.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"")||"my_app"; var folder=app+"/"; var vc=document.getElementById("panel-content"); var panelTxt=vc?(vc.innerText||vc.textContent||""):""; var lang=detectLang(_phCode,panelTxt); if(_phIsHtml){ buildVanillaHtml(zip,folder,app,_phCode); } else if(lang==="flutter"){ buildFlutter(zip,folder,app,_phCode,panelTxt); } else if(lang==="react-native"){ buildReactNative(zip,folder,app,_phCode,panelTxt); } else if(lang==="swift"){ buildSwift(zip,folder,app,_phCode,panelTxt); } else if(lang==="kotlin"){ buildKotlin(zip,folder,app,_phCode,panelTxt); } else if(lang==="react"){ buildReact(zip,folder,app,_phCode,panelTxt); } else if(lang==="vue"){ buildVue(zip,folder,app,_phCode,panelTxt); } else if(lang==="angular"){ buildAngular(zip,folder,app,_phCode,panelTxt); } else if(lang==="python"){ buildPython(zip,folder,app,_phCode); } else if(lang==="node"){ buildNode(zip,folder,app,_phCode); } else { /* Document/content workflow */ var title=app.replace(/_/g," "); var md=_phAll||_phCode||panelTxt||"No content"; zip.file(folder+app+".md",md); var h=""+title+""; h+="

"+title+"

"; var hc=md.replace(/&/g,"&").replace(//g,">"); hc=hc.replace(/^### (.+)$/gm,"

$1

"); hc=hc.replace(/^## (.+)$/gm,"

$1

"); hc=hc.replace(/^# (.+)$/gm,"

$1

"); hc=hc.replace(/**(.+?)**/g,"$1"); hc=hc.replace(/ {2,}/g,"

"); h+="

"+hc+"

Generated by PantheraHive BOS
"; zip.file(folder+app+".html",h); zip.file(folder+"README.md","# "+title+" Generated by PantheraHive BOS. Files: - "+app+".md (Markdown) - "+app+".html (styled HTML) "); } zip.generateAsync({type:"blob"}).then(function(blob){ var a=document.createElement("a"); a.href=URL.createObjectURL(blob); a.download=app+".zip"; a.click(); URL.revokeObjectURL(a.href); if(lbl)lbl.textContent="Download ZIP"; }); }; document.head.appendChild(sc); }function phShare(){navigator.clipboard.writeText(window.location.href).then(function(){var el=document.getElementById("ph-share-lbl");if(el){el.textContent="Link copied!";setTimeout(function(){el.textContent="Copy share link";},2500);}});}function phEmbed(){var runId=window.location.pathname.split("/").pop().replace(".html","");var embedUrl="https://pantherahive.com/embed/"+runId;var code='';navigator.clipboard.writeText(code).then(function(){var el=document.getElementById("ph-embed-lbl");if(el){el.textContent="Embed code copied!";setTimeout(function(){el.textContent="Get Embed Code";},2500);}});}