Contact Data Formatter
Run ID: 69cb0071cc13ab0c3c373aef2026-03-30CRM
PantheraHive BOS
BOS Dashboard

Import contacts and generate lead scoring

Workflow Execution: Contact Data Formatter - Step 1 of 2

Workflow Name: Contact Data Formatter

Workflow Description: Import contacts and generate lead scoring

Current Step: Step 1 of 2: crm → import_contacts


1. Step Objective

The primary objective of this step is to efficiently and accurately import your contact data into our CRM system. This foundational step ensures that all necessary contact information is available and properly structured, preparing it for the subsequent lead scoring analysis. Our goal is to streamline your data ingestion process, minimize manual intervention, and ensure data integrity from the outset.

2. Input Requirements for Contact Import

To successfully import your contacts, please prepare your data according to the following specifications:

  • File Format:

* Preferred: CSV (Comma Separated Values)

* Supported: XLS, XLSX (Microsoft Excel Workbook)

Recommendation: CSV files generally offer the most robust and consistent import experience.*

  • Mandatory Fields:

* Email Address: Essential for unique contact identification and deduplication.

* First Name

* Last Name

* Company Name (if applicable)

  • Highly Recommended Fields (for optimal lead scoring):

* Phone Number

* Job Title

* Industry

* Website

* Address (Street, City, State, Zip/Postal Code, Country)

* Source (e.g., "Website Form", "Event", "Referral", "Cold Outreach") - Crucial for lead scoring models.

* Creation Date (Date the contact was first acquired)

* Last Activity Date (Date of last interaction)

* Any other custom fields relevant to your sales process or customer segmentation.

  • Data Quality Best Practices:

* Clean Data: Ensure there are no leading/trailing spaces, special characters, or inconsistent formatting within fields.

* Valid Emails: All email addresses should be in a valid format (e.g., name@domain.com).

* Deduplication: While our system performs deduplication, providing a clean dataset upfront minimizes processing time and potential conflicts. The system will primarily use Email Address for deduplication.

* Consistent Headers: Use clear and consistent headers in your file (e.g., "Email," "First Name," "Last Name") to facilitate accurate field mapping.

3. Process Description: How import_contacts Works

Upon uploading your file, the import_contacts function will execute a series of automated steps:

  1. File Parsing: The system will read and interpret your uploaded CSV/Excel file.
  2. Header Mapping: You will be prompted to review and confirm the mapping between the column headers in your file and the corresponding fields in our CRM. Our system will attempt to auto-map common fields, but manual confirmation is required.
  3. Data Validation: Each record will undergo validation checks to ensure:

* Presence of all mandatory fields.

* Correct data types (e.g., valid email format, numeric values where expected).

  1. Deduplication Logic: The system will check for existing contacts using the Email Address as the primary unique identifier.

* If a contact with the same email already exists, the system will update the existing record with the new information provided in your file, prioritizing the most recent data or specified merge rules.

* If no matching contact is found, a new contact record will be created.

  1. Data Normalization: Basic cleaning, such as trimming whitespace, will be applied to ensure data consistency.
  2. CRM Integration: Validated and processed records will be systematically added or updated within your CRM.
  3. Import Report Generation: A detailed report summarizing the import process will be generated.

4. Expected Output and Outcome

Upon successful completion of this step, you will receive:

  • Import Confirmation: A clear notification that your contact data has been successfully imported.
  • Updated CRM: Your CRM will reflect the newly added and/or updated contact records, accessible for viewing and management.
  • Detailed Import Report: This report will include:

* Total number of records processed from your file.

* Number of new contact records created.

* Number of existing contact records updated.

* Number of records skipped or failed to import, along with specific reasons for each error (e.g., "Invalid Email Format," "Missing Mandatory Field").

* A link or direct access to the imported contacts within the CRM.

  • Data Readiness for Lead Scoring: All imported contacts will be correctly structured and prepared for the next step: "Generate Lead Scoring."

5. Actionable Items for the Customer

To proceed with Step 1: crm → import_contacts, please take the following actions:

  1. Prepare Your Data File: Consolidate your contact information into a single CSV or Excel file, ensuring it adheres to the Input Requirements detailed above (mandatory fields, recommended fields, data quality).
  2. Review Field Headers: Ensure your file's column headers are clear and descriptive to facilitate easy mapping.
  3. Upload Your File: Please use the designated upload interface provided below/next to submit your prepared contact data file.
  4. Confirm Field Mapping: Once uploaded, you will be prompted to review and confirm the automatic field mapping. Please carefully verify that each column from your file is correctly assigned to the corresponding CRM field.

6. Troubleshooting & Support

  • Common Issues:

* File Upload Failure: Check file size (typically limits apply for very large files, please contact support if your file is >50MB) and format.

* "Missing Mandatory Field" Error: Ensure Email Address, First Name, Last Name, and Company Name (if applicable) are present for all records.

* "Invalid Email Format" Error: Review the email addresses in your file for correct syntax.

* Incorrect Field Mapping: Carefully review the mapping step; incorrect mapping can lead to data being stored in the wrong fields.

  • Resolution: The import report will provide specific error messages. Correct the identified issues in your source file and re-upload.
  • Need Assistance? If you encounter any difficulties or have questions regarding data preparation or the import process, please do not hesitate to contact our support team at support@pantherahive.com or through your dedicated account manager.

Next Step: Once your contacts are successfully imported, the system will automatically proceed to Step 2: Generate Lead Scoring, leveraging the newly available data.

crm Output

Workflow: Contact Data Formatter - Step 2 of 2: CRM Integration & AI Lead Scoring

This document details the final deliverable for the "Contact Data Formatter" workflow, focusing on the application of Artificial Intelligence for lead scoring and its seamless integration into your Customer Relationship Management (CRM) system.


1. Workflow Overview

  • Workflow Name: Contact Data Formatter
  • Overall Purpose: To efficiently import raw contact data, standardize it for consistency and accuracy, and then apply advanced AI-driven lead scoring to empower your sales and marketing teams with prioritized, actionable insights.
  • Current Step: This is the concluding step of the workflow, where the cleaned and formatted contact data is leveraged to generate predictive lead scores and integrate these insights directly into your CRM environment.

2. Step Description: CRM Integration & AI Lead Scoring

The objective of this step is to transform your processed contact data into intelligent lead scores using a sophisticated AI engine and subsequently update your CRM records. This ensures that your sales and marketing teams can immediately identify and prioritize the most promising leads.

  • Process Flow:

Formatted & Standardized Contact Data (from Step 1) → AI Lead Scoring Engine → Enriched CRM Records

3. Input Data for AI Lead Scoring

The AI Lead Scoring engine received the following processed and standardized contact data from the preceding "Contact Data Formatting" step:

  • Core Contact Information: Name, Email Address, Phone Number, Company Name, Job Title, Industry.
  • Geographic Data: Country, State/Province, City.
  • Lead Source Data: Specific channel or campaign from which the lead was acquired (e.g., website form, referral, event, social media).
  • Enriched Firmographic Data (if configured): Company Size, Annual Revenue, Public/Private Status, Website URL.
  • Behavioral Data (if available and configured): Past interactions such as website visits, content downloads, email opens/clicks, webinar attendance.

4. AI Lead Scoring Methodology

Our proprietary AI Lead Scoring engine employs a robust, multi-faceted approach to generate accurate and actionable lead scores:

  • Data Normalization & Feature Engineering: The input data undergoes further refinement to create relevant features for the AI model. This includes deriving insights like job seniority indicators, industry classifications, and the potential influence of the lead's company.
  • Predictive Modeling: We utilize a combination of advanced machine learning models (e.g., Gradient Boosting Machines, Neural Networks) that have been trained on historical conversion data (where available and configured) to predict the likelihood of each lead converting into a customer.
  • Key Scoring Factors: The model considers and dynamically weights a comprehensive array of attributes based on their statistical correlation with successful customer conversions. These typically include:

* Demographic Fit: Alignment of job title, seniority, and role with your ideal customer profile.

* Firmographic Fit: Company size, industry, revenue, and strategic alignment with your target market.

* Behavioral Engagement: Level and quality of interaction with your marketing content and digital assets.

* Source Quality: Historical performance and conversion rates associated with the lead's acquisition channel.

  • Dynamic Adaptation: The AI model is designed to be adaptive, continuously learning from new data and feedback to refine its predictions and improve accuracy over time.
  • Transparency (XAI): While the model is complex, the system can provide insights into the primary drivers behind each lead's score, offering a degree of explainability for better understanding and trust.

5. Deliverable: Enriched CRM Records with Lead Scoring Insights

The primary output of this step is the direct update of your CRM system, integrating the newly generated lead scores and associated classifications into each contact record.

For each contact, the following fields have been updated or added in your CRM:

  • Lead Score (Numerical): A precise numerical value (e.g., 0-100) indicating the predicted probability of conversion. A higher score signifies a greater likelihood of becoming a customer.
  • Lead Tier/Grade (Categorical): A qualitative classification based on the numerical score, designed to simplify prioritization for your teams. Common tiers include:

* Tier A (Hot Lead): Highest priority. Requires immediate sales outreach.

* Tier B (Warm Lead): High potential. Requires timely and personalized follow-up.

* Tier C (Nurture Lead): Medium potential. Suitable for targeted marketing nurture campaigns.

* Tier D (Cold Lead): Lower immediate priority. May require re-qualification or longer-term nurturing.

  • Lead Status (Updated): The lead status in your CRM may be automatically updated based on the assigned Lead Tier (e.g., "New - Tier A", "New - Nurture").
  • Lead Score Drivers (Configurable): Key factors that most significantly contributed to the lead's score (e.g., "High seniority", "Large company size", "Relevant industry match", "High engagement").
  • Next Best Action Recommendation (Configurable): Automated suggestions for the sales or marketing team based on the lead's tier and characteristics (e.g., "Schedule discovery call", "Assign to Senior SDR", "Add to product demo campaign").

6. Key Benefits of AI Lead Scoring

  • Enhanced Sales Efficiency: Sales teams can focus their valuable time and resources on the most promising leads, significantly improving conversion rates and reducing wasted effort.
  • Optimized Marketing ROI: Marketing campaigns can be precisely segmented and tailored to specific lead tiers, ensuring relevant messaging and a higher return on investment.
  • Accelerated Sales Cycle: By prioritizing high-value leads from the outset, your organization can significantly shorten the overall sales cycle.
  • Improved Customer Experience: Engaging leads with appropriate, timely, and personalized communications based on their potential and interests.
  • Data-Driven Decision Making: Provides objective, quantitative insights to inform strategic planning, resource allocation, and continuous process improvement across sales and marketing.

7. Actionable Insights & Next Steps

With the AI-driven lead scoring data now seamlessly integrated into your CRM, your teams can immediately take the following actions:

  1. Prioritize Sales Outreach: Instruct your Sales Development Representatives (SDRs) and Account Executives (AEs) to prioritize leads categorized as Tier A and B for immediate, personalized follow-up.
  2. Tailor Marketing Strategies: Develop specific messaging, content, and nurture sequences for each lead tier. For instance, Tier A leads might receive a direct call and personalized email, while Tier C leads are enrolled in a longer-term educational email nurture campaign.
  3. Monitor & Analyze Performance: Regularly review the conversion rates and sales velocity for different lead tiers. Use these insights to continuously optimize your sales processes, marketing campaigns, and even refine your ideal customer profile.
  4. Provide Feedback for AI Refinement: Encourage your sales team to provide feedback on the accuracy of lead scores and conversion outcomes. This valuable input helps to further train and refine the AI model over time, ensuring its continued precision and effectiveness.

8. Summary

This final step of the "Contact Data Formatter" workflow has successfully transformed your raw contact data into highly actionable intelligence. By integrating AI-driven lead scores and categorizations directly into your CRM, your organization is now equipped to make more informed, data-backed decisions, significantly enhancing both sales productivity and marketing effectiveness. You now have a clear, prioritized view of your lead pipeline, enabling your teams to focus on what matters most: converting opportunities into customers.

contact_data_formatter.md
Download as Markdown
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
\n\n\n"); 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'\nimport ReactDOM from 'react-dom/client'\nimport App from './App'\nimport './index.css'\n\nReactDOM.createRoot(document.getElementById('root')!).render(\n \n \n \n)\n"); 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'\nimport './App.css'\n\nfunction App(){\n return(\n
\n
\n

"+slugTitle(pn)+"

\n

Built with PantheraHive BOS

\n
\n
\n )\n}\nexport default App\n"); zip.file(folder+"src/index.css","*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:system-ui,-apple-system,sans-serif;background:#f0f2f5;color:#1a1a2e}\n.app{min-height:100vh;display:flex;flex-direction:column}\n.app-header{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:40px}\nh1{font-size:2.5rem;font-weight:700}\n"); 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)+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\nnpm run dev\n\`\`\`\n\n## Build\n\`\`\`bash\nnpm run build\n\`\`\`\n\n## Open in IDE\nOpen the project folder in VS Code or WebStorm.\n"); zip.file(folder+".gitignore","node_modules/\ndist/\n.env\n.DS_Store\n*.local\n"); } /* --- 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",'{\n "name": "'+pn+'",\n "version": "0.0.0",\n "type": "module",\n "scripts": {\n "dev": "vite",\n "build": "vue-tsc -b && vite build",\n "preview": "vite preview"\n },\n "dependencies": {\n "vue": "^3.5.13",\n "vue-router": "^4.4.5",\n "pinia": "^2.3.0",\n "axios": "^1.7.9"\n },\n "devDependencies": {\n "@vitejs/plugin-vue": "^5.2.1",\n "typescript": "~5.7.3",\n "vite": "^6.0.5",\n "vue-tsc": "^2.2.0"\n }\n}\n'); zip.file(folder+"vite.config.ts","import { defineConfig } from 'vite'\nimport vue from '@vitejs/plugin-vue'\nimport { resolve } from 'path'\n\nexport default defineConfig({\n plugins: [vue()],\n resolve: { alias: { '@': resolve(__dirname,'src') } }\n})\n"); zip.file(folder+"tsconfig.json",'{"files":[],"references":[{"path":"./tsconfig.app.json"},{"path":"./tsconfig.node.json"}]}\n'); zip.file(folder+"tsconfig.app.json",'{\n "compilerOptions":{\n "target":"ES2020","useDefineForClassFields":true,"module":"ESNext","lib":["ES2020","DOM","DOM.Iterable"],\n "skipLibCheck":true,"moduleResolution":"bundler","allowImportingTsExtensions":true,\n "isolatedModules":true,"moduleDetection":"force","noEmit":true,"jsxImportSource":"vue",\n "strict":true,"paths":{"@/*":["./src/*"]}\n },\n "include":["src/**/*.ts","src/**/*.d.ts","src/**/*.tsx","src/**/*.vue"]\n}\n'); zip.file(folder+"env.d.ts","/// \n"); zip.file(folder+"index.html","\n\n\n \n \n "+slugTitle(pn)+"\n\n\n
\n \n\n\n"); 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'\nimport { createPinia } from 'pinia'\nimport App from './App.vue'\nimport './assets/main.css'\n\nconst app = createApp(App)\napp.use(createPinia())\napp.mount('#app')\n"); var hasApp=Object.keys(extracted).some(function(k){return k.indexOf("App.vue")>=0;}); if(!hasApp) zip.file(folder+"src/App.vue","\n\n\n\n\n"); 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}\n"); 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)+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\nnpm run dev\n\`\`\`\n\n## Build\n\`\`\`bash\nnpm run build\n\`\`\`\n\nOpen in VS Code or WebStorm.\n"); zip.file(folder+".gitignore","node_modules/\ndist/\n.env\n.DS_Store\n*.local\n"); } /* --- 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",'{\n "name": "'+pn+'",\n "version": "0.0.0",\n "scripts": {\n "ng": "ng",\n "start": "ng serve",\n "build": "ng build",\n "test": "ng test"\n },\n "dependencies": {\n "@angular/animations": "^19.0.0",\n "@angular/common": "^19.0.0",\n "@angular/compiler": "^19.0.0",\n "@angular/core": "^19.0.0",\n "@angular/forms": "^19.0.0",\n "@angular/platform-browser": "^19.0.0",\n "@angular/platform-browser-dynamic": "^19.0.0",\n "@angular/router": "^19.0.0",\n "rxjs": "~7.8.0",\n "tslib": "^2.3.0",\n "zone.js": "~0.15.0"\n },\n "devDependencies": {\n "@angular-devkit/build-angular": "^19.0.0",\n "@angular/cli": "^19.0.0",\n "@angular/compiler-cli": "^19.0.0",\n "typescript": "~5.6.0"\n }\n}\n'); zip.file(folder+"angular.json",'{\n "$schema": "./node_modules/@angular/cli/lib/config/schema.json",\n "version": 1,\n "newProjectRoot": "projects",\n "projects": {\n "'+pn+'": {\n "projectType": "application",\n "root": "",\n "sourceRoot": "src",\n "prefix": "app",\n "architect": {\n "build": {\n "builder": "@angular-devkit/build-angular:application",\n "options": {\n "outputPath": "dist/'+pn+'",\n "index": "src/index.html",\n "browser": "src/main.ts",\n "tsConfig": "tsconfig.app.json",\n "styles": ["src/styles.css"],\n "scripts": []\n }\n },\n "serve": {"builder":"@angular-devkit/build-angular:dev-server","configurations":{"production":{"buildTarget":"'+pn+':build:production"},"development":{"buildTarget":"'+pn+':build:development"}},"defaultConfiguration":"development"}\n }\n }\n }\n}\n'); zip.file(folder+"tsconfig.json",'{\n "compileOnSave": false,\n "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"]},\n "references":[{"path":"./tsconfig.app.json"}]\n}\n'); zip.file(folder+"tsconfig.app.json",'{\n "extends":"./tsconfig.json",\n "compilerOptions":{"outDir":"./dist/out-tsc","types":[]},\n "files":["src/main.ts"],\n "include":["src/**/*.d.ts"]\n}\n'); zip.file(folder+"src/index.html","\n\n\n \n "+slugTitle(pn)+"\n \n \n \n\n\n \n\n\n"); zip.file(folder+"src/main.ts","import { bootstrapApplication } from '@angular/platform-browser';\nimport { appConfig } from './app/app.config';\nimport { AppComponent } from './app/app.component';\n\nbootstrapApplication(AppComponent, appConfig)\n .catch(err => console.error(err));\n"); zip.file(folder+"src/styles.css","* { margin: 0; padding: 0; box-sizing: border-box; }\nbody { font-family: system-ui, -apple-system, sans-serif; background: #f9fafb; color: #111827; }\n"); 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';\nimport { RouterOutlet } from '@angular/router';\n\n@Component({\n selector: 'app-root',\n standalone: true,\n imports: [RouterOutlet],\n templateUrl: './app.component.html',\n styleUrl: './app.component.css'\n})\nexport class AppComponent {\n title = '"+pn+"';\n}\n"); zip.file(folder+"src/app/app.component.html","
\n
\n

"+slugTitle(pn)+"

\n

Built with PantheraHive BOS

\n
\n \n
\n"); 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}\n"); } zip.file(folder+"src/app/app.config.ts","import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { provideRouter } from '@angular/router';\nimport { routes } from './app.routes';\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n provideRouter(routes)\n ]\n};\n"); zip.file(folder+"src/app/app.routes.ts","import { Routes } from '@angular/router';\n\nexport const routes: Routes = [];\n"); 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)+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\nng serve\n# or: npm start\n\`\`\`\n\n## Build\n\`\`\`bash\nng build\n\`\`\`\n\nOpen in VS Code with Angular Language Service extension.\n"); zip.file(folder+".gitignore","node_modules/\ndist/\n.env\n.DS_Store\n*.local\n.angular/\n"); } /* --- Python --- */ function buildPython(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^\`\`\`[\w]*\n?/m,"").replace(/\n?\`\`\`$/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("\n"):"# add dependencies here\n"; zip.file(folder+"main.py",src||"# "+title+"\n# Generated by PantheraHive BOS\n\nprint(title+\" loaded\")\n"); zip.file(folder+"requirements.txt",reqsTxt); zip.file(folder+".env.example","# Environment variables\n"); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -r requirements.txt\n\`\`\`\n\n## Run\n\`\`\`bash\npython main.py\n\`\`\`\n"); zip.file(folder+".gitignore",".venv/\n__pycache__/\n*.pyc\n.env\n.DS_Store\n"); } /* --- Node.js --- */ function buildNode(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^\`\`\`[\w]*\n?/m,"").replace(/\n?\`\`\`$/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)+"\n"; zip.file(folder+"package.json",pkgJson); var fallback="const express=require(\"express\");\nconst app=express();\napp.use(express.json());\n\napp.get(\"/\",(req,res)=>{\n res.json({message:\""+title+" API\"});\n});\n\nconst PORT=process.env.PORT||3000;\napp.listen(PORT,()=>console.log(\"Server on port \"+PORT));\n"; zip.file(folder+"src/index.js",src||fallback); zip.file(folder+".env.example","PORT=3000\n"); zip.file(folder+".gitignore","node_modules/\n.env\n.DS_Store\n"); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\n\`\`\`\n\n## Run\n\`\`\`bash\nnpm run dev\n\`\`\`\n"); } /* --- 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:"\n\n\n\n\n"+title+"\n\n\n\n"+code+"\n\n\n\n"; zip.file(folder+"index.html",indexHtml); zip.file(folder+"style.css","/* "+title+" — styles */\n*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:system-ui,-apple-system,sans-serif;background:#fff;color:#1a1a2e}\n"); zip.file(folder+"script.js","/* "+title+" — scripts */\n"); zip.file(folder+"assets/.gitkeep",""); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\n## Open\nDouble-click \`index.html\` in your browser.\n\nOr serve locally:\n\`\`\`bash\nnpx serve .\n# or\npython3 -m http.server 3000\n\`\`\`\n"); zip.file(folder+".gitignore",".DS_Store\nnode_modules/\n.env\n"); } /* ===== 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(/\n{2,}/g,"

"); h+="

"+hc+"

Generated by PantheraHive BOS
"; zip.file(folder+app+".html",h); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\nFiles:\n- "+app+".md (Markdown)\n- "+app+".html (styled HTML)\n"); } 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);}});}