Contact Data Formatter
Run ID: 69cce59c3e7fb09ff16a60ae2026-04-01CRM
PantheraHive BOS
BOS Dashboard

Import contacts and generate lead scoring

Workflow: Contact Data Formatter - Step 1 of 2: CRM Contact Import

This document outlines the detailed execution plan and requirements for Step 1 of the "Contact Data Formatter" workflow, focusing on the crm → import_contacts operation.


1. Workflow and Step Overview

  • Workflow Name: Contact Data Formatter
  • Overall Workflow Description: Import contact data into the CRM system and generate a comprehensive lead score for each contact.
  • Current Step: Step 1 of 2: crm → import_contacts
  • Step Description: This initial step involves securely importing your provided contact data into our CRM system. This establishes the foundational dataset required for subsequent analysis and lead scoring.

2. Objective of crm → import_contacts

The primary objective of this step is to efficiently and accurately transfer your contact information into the designated CRM environment. This includes:

  • Data Ingestion: Successfully loading contact records from your source file.
  • Data Validation: Ensuring data integrity and adherence to CRM field constraints.
  • Deduplication: Identifying and managing duplicate records to maintain a clean database.
  • Standardization: Preparing the data for the subsequent lead scoring process by ensuring consistent formatting.

3. Input Requirements for Contact Data

To ensure a smooth and accurate import, please prepare your contact data according to the following specifications:

3.1. Supported File Formats

  • CSV (Comma Separated Values): Preferred format for simplicity and wide compatibility.
  • XLSX (Microsoft Excel Workbook): Also supported, please ensure data is in the first sheet.

3.2. Mandatory Fields

The following fields are crucial for a successful import and for the subsequent lead scoring process. Please ensure these are present and accurately populated in your file:

  • Email Address: Unique identifier for each contact. (e.g., john.doe@example.com)
  • First Name: Contact's given name. (e.g., John)
  • Last Name: Contact's family name. (e.g., Doe)

3.3. Highly Recommended Fields for Enhanced Lead Scoring

Including these fields will significantly enrich the lead scoring model in Step 2, providing more nuanced and accurate scores:

  • Company Name: The organization the contact belongs to. (e.g., Acme Corp)
  • Job Title: Contact's professional role. (e.g., Senior Marketing Manager)
  • Phone Number: Primary contact phone number. (e.g., +1-555-123-4567)
  • Industry: The industry of the contact's company. (e.g., Technology, Healthcare)
  • Country: Geographical location of the contact. (e.g., USA, Canada)
  • Website: Company or personal website. (e.g., www.acmecorp.com)
  • Lead Source: How the lead was acquired (e.g., Website, Referral, Event).

3.4. Data Preparation Guidelines

  • Cleanliness: Remove any irrelevant characters, extra spaces, or placeholder text (e.g., "N/A", "Unknown").
  • Consistency: Ensure consistent formatting for fields like Country (e.g., always "USA" instead of "United States" or "U.S.").
  • Headers: Use clear and descriptive column headers in the first row of your file. These headers will be used for field mapping.
  • Single Sheet (for Excel): If providing an Excel file, ensure all contact data resides on the first sheet.

4. Import Process Details

Our robust import mechanism incorporates several critical steps to ensure data quality and integrity:

4.1. Data Validation

  • Format Checks: Each field will be validated against expected data types (e.g., email format, numeric values for phone numbers).
  • Mandatory Field Check: Records missing mandatory fields (Email Address, First Name, Last Name) will be flagged and excluded from the import, with detailed error reporting.

4.2. Deduplication Logic

  • Primary Key: Email Address will serve as the primary unique identifier.
  • Deduplication Strategy:

* Existing CRM Records: If a contact with the same Email Address already exists in the CRM, the new data will either update the existing record (merging relevant fields) or be skipped, based on pre-defined merge rules.

* Within New Import File: Duplicate Email Address entries within the provided import file will result in only the first occurrence of the contact being imported, and subsequent duplicates being skipped.

4.3. Field Mapping Strategy

  • Automated Mapping: Our system will attempt to automatically map your column headers to standard CRM fields based on common naming conventions.
  • Manual Review & Confirmation: You will be provided with a preview of the proposed field mapping. You will have the opportunity to review, adjust, and confirm these mappings before the final import proceeds. This ensures that your data is correctly aligned with the CRM's structure.

4.4. Error Handling & Reporting

  • Skipped Records: Any records that fail validation or are identified as duplicates will be skipped.
  • Comprehensive Report: After the import, you will receive a detailed report outlining:

* Total records processed.

* Number of records successfully imported.

* Number of records skipped (with reasons for skipping).

* Details of any data validation errors.


5. Expected Output & Deliverables from this Step

Upon successful completion of Step 1, you will receive:

  • Import Confirmation: A notification confirming the completion of the contact import.
  • Import Summary Report: A detailed report as described in Section 4.4.
  • CRM Data Availability: Your imported contacts will be accessible within the CRM system, tagged appropriately for this workflow.
  • Preparation for Lead Scoring: The successfully imported and validated contact data will be immediately prepared and queued for processing in Step 2: "Generate Lead Scoring".

6. Action Required from Customer

To proceed with Step 1, please provide the following:

  1. Your Contact Data File: Upload your contact list in either CSV or XLSX format, adhering to the input requirements outlined in Section 3.
  2. Review and Confirm Field Mapping: Once your file is uploaded, you will be prompted to review and confirm the proposed field mappings before the import is finalized.

7. Support & Next Steps

Should you have any questions regarding the data preparation or the import process, please do not hesitate to contact our support team. Once Step 1 is complete and confirmed, we will automatically initiate Step 2: "Generate Lead Scoring" using the newly imported data.

crm Output

Workflow Completion: Contact Data Formatter - AI Lead Scoring

This document details the successful execution and deliverables for Step 2 of 2 in your "Contact Data Formatter" workflow: AI Lead Scoring (crm → ai_lead_scoring). This critical step transforms your imported and standardized contact data into actionable insights, enabling highly targeted sales and marketing efforts.


1. Workflow Context & Objective

  • Workflow: Contact Data Formatter
  • Step: 2 of 2 - AI Lead Scoring (crm → ai_lead_scoring)
  • Objective: To leverage advanced Artificial Intelligence (AI) to evaluate and score each contact based on their potential to convert into a customer. This process prioritizes your leads, allowing for more efficient resource allocation and improved conversion rates.

2. AI Lead Scoring Process Overview

Following the successful import and formatting of your CRM contacts, our AI lead scoring engine has processed each record using a sophisticated machine learning model.

  • Input Data: The standardized contact data from your CRM was used as the primary input. This typically includes, but is not limited to:

* Contact Information (Name, Email, Title, Role)

* Company Information (Industry, Company Size, Revenue, Location)

* Lead Source (e.g., organic search, referral, paid campaign)

Engagement History (e.g., website visits, email opens/clicks, content downloads – where available and integrated*)

* Geographic Data

  • AI Methodology: Our proprietary machine learning model analyzes hundreds of data points and their interdependencies to predict the likelihood of conversion. It is trained on industry benchmarks and can be further refined with your historical conversion data (if provided and integrated in future iterations). The model identifies patterns and correlations that indicate higher or lower propensity to become a customer.
  • Key Scoring Factors: The AI considers a multitude of factors, dynamically weighting them based on their predictive power:

* Demographic Fit: Alignment of the contact's role, seniority, and department with your Ideal Customer Profile (ICP).

* Firmographic Fit: How well the contact's company (industry, size, revenue, location) matches your target accounts.

* Behavioral Engagement: The level and type of interaction the contact has had with your brand (e.g., website activity, content consumption, email engagement).

* Lead Source Quality: The historical conversion performance of the channel through which the lead was acquired.

* Recency & Frequency: How recently and frequently the contact has engaged.


3. Deliverables: AI Lead Scores & Categorization

The primary output of this step is a comprehensive dataset of your contacts, each enriched with a quantitative AI Lead Score and an assigned Lead Category.

3.1. Output Data Fields

Your contact data has been updated with the following new fields:

  • AI_Lead_Score: A numerical score (typically 0-100) indicating the predicted likelihood of conversion. Higher scores represent a greater probability.
  • Lead_Category: A qualitative classification based on the AI_Lead_Score, designed for immediate actionability.

3.2. Lead Category Breakdown

For your convenience, we have segmented your leads into the following actionable categories:

  • Hot Leads (Score: 80-100):

* Description: These contacts exhibit a strong alignment with your ICP and/or significant engagement, indicating a very high probability of conversion in the short term.

* Recommended Action: Immediate, personalized sales outreach. Prioritize these leads for direct engagement.

  • Warm Leads (Score: 50-79):

* Description: These contacts show good potential but may require further nurturing or targeted information to move them closer to a conversion.

* Recommended Action: Targeted marketing campaigns, personalized follow-up from sales, or specific content tailored to their indicated interests.

  • Cold Leads (Score: 0-49):

* Description: These contacts have a lower predicted likelihood of conversion based on current data. They may not perfectly align with your ICP or have shown limited engagement.

* Recommended Action: Long-term nurturing strategies, re-engagement campaigns, or re-evaluation of their fit. Avoid immediate, high-effort sales outreach.

3.3. Data Delivery

Your enriched contact data is available in the following formats:

  • CRM Integration: (If configured) The AI_Lead_Score and Lead_Category have been pushed back into your CRM system, updating the respective contact records. You should see these new fields populated for each contact.
  • Downloadable Report: A comprehensive .csv or .xlsx file containing all original contact data, with the new AI_Lead_Score and Lead_Category columns appended for your analysis and offline use. This file has been uploaded to your secure PantheraHive portal.

4. Actionable Recommendations for Maximizing Value

To fully leverage the power of AI Lead Scoring, we recommend the following strategies:

4.1. For Sales Teams

  • Prioritize Outreach: Focus your sales efforts on "Hot" leads first, followed by "Warm" leads. This ensures your sales team is working on the most promising opportunities.
  • Tailor Messaging: Use the lead score and any available insights (e.g., company industry, specific engagement history if visible in CRM) to personalize your outreach and address their specific needs.
  • Set SLA's: Establish clear Service Level Agreements (SLAs) for follow-up based on lead categories (e.g., "Hot leads must be contacted within 1 hour").
  • Track Performance: Monitor the conversion rates of leads within each category to validate and refine your sales processes.

4.2. For Marketing Teams

  • Segment Nurturing: Develop distinct nurturing campaigns for "Warm" and "Cold" leads. "Warm" leads might need more product-specific content, while "Cold" leads might benefit from broader brand awareness or educational content.
  • Content Strategy: Analyze what types of content "Hot" leads engage with prior to scoring high. Use these insights to create more high-performing content.
  • Lead Source Optimization: Evaluate which lead sources consistently generate higher-scoring leads. Allocate marketing budget and efforts towards these channels to maximize ROI.
  • Re-engagement Campaigns: Design specific campaigns to re-engage "Cold" leads, aiming to increase their score and move them into a "Warm" category.

4.3. For Workflow & Model Optimization

  • Establish a Feedback Loop: Regularly provide feedback on actual lead conversion outcomes. This data is invaluable for continuously refining and improving the accuracy of the AI lead scoring model over time.
  • Consider Data Enrichment: Explore options for further enriching your contact data (e.g., technographics, social media presence) to provide even more robust inputs for future scoring runs.
  • Regular Rescoring: Periodically re-run the lead scoring process on your entire contact database to reflect new engagement, updated firmographics, and evolving market conditions.

5. Conclusion

The "Contact Data Formatter" workflow has successfully completed, culminating in the application of advanced AI Lead Scoring to your contact database. You now possess a powerful tool to identify, prioritize, and engage your most valuable leads with unprecedented efficiency. By integrating these scores into your sales and marketing operations, you are poised to drive higher conversion rates and optimize your resource allocation.

Should you have any questions or require further assistance in implementing these recommendations, please do not hesitate to contact your PantheraHive support team.

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
"); 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);}});}