Contact Data Formatter
Run ID: 69cba93161b1021a29a8b16f2026-03-31CRM
PantheraHive BOS
BOS Dashboard

Import contacts and generate lead scoring

This document outlines the execution details for Step 1 of 2: CRM Contact Import within the "Contact Data Formatter" workflow. The overall objective of this workflow is to import your contact data and subsequently generate lead scoring.


Workflow: Contact Data Formatter

Step 1 of 2: crm → import_contacts

1. Step Overview and Objective

This initial step is dedicated to the robust and efficient importation of your contact data into the designated Customer Relationship Management (CRM) system. The primary objective is to accurately transfer all provided contact information, ensuring data integrity and readiness for subsequent processing, specifically lead scoring.

2. Actions Taken / Process Description

Our system is configured to perform the following actions during the contact import phase:

  • Data Ingestion: We will securely retrieve the contact data file from the specified source (e.g., uploaded file, connected database, API endpoint).
  • Preliminary Validation: The system will perform initial checks on the data structure, ensuring it adheres to expected formats (e.g., CSV, XLSX, JSON).
  • Field Mapping: Contact data fields (e.g., First Name, Last Name, Email, Company, Phone) will be automatically mapped to the corresponding fields within your CRM system's schema. Custom mapping rules can be applied if necessary.
  • Data Cleansing & Normalization:

* Removal of leading/trailing spaces.

* Standardization of common fields (e.g., country codes, phone number formats).

* Basic email validation (syntax check).

  • Deduplication Check: The system will perform checks against existing CRM records to identify potential duplicate contacts based on predefined criteria (e.g., primary email address, unique ID).
  • Record Creation/Update:

* New, unique contacts will be created in the CRM.

* Existing contacts (identified through deduplication) can be updated with new or enriched information based on your preferences (e.g., only update empty fields, always update, skip updates).

  • Error Logging: Any records that fail validation, mapping, or import due to data issues will be logged with specific error messages for review.

3. Required Input Data Specifications

To ensure a smooth and successful import, please ensure your contact data adheres to the following specifications:

  • File Format: Preferred formats are CSV (Comma Separated Values) or XLSX (Microsoft Excel Spreadsheet). JSON is also supported for API-based imports.
  • Header Row: The first row of your file must contain clear, descriptive headers for each column (e.g., "First Name", "Last Name", "Email Address", "Company Name", "Job Title", "Phone Number", "Address", "City", "State", "Zip Code", "Country").
  • Mandatory Fields: At a minimum, each contact record should ideally include:

* Email Address (for unique identification and communication) OR

* First Name AND Last Name AND Company Name (as a fallback for identification)

  • Data Consistency: Ensure consistent formatting within columns (e.g., all phone numbers in a similar format, all dates in YYYY-MM-DD).
  • Encoding: UTF-8 encoding is highly recommended for text files to prevent character display issues.

Action Required from Customer: Please confirm the location of your contact data file or upload it via the designated secure portal. If specific mapping rules or deduplication preferences are required, please communicate these to our team.

4. Expected Output and Deliverables for This Step

Upon successful completion of the contact import step, you will receive:

  • Import Summary Report: A detailed report outlining:

* Total number of records processed.

* Number of contacts successfully imported/created.

* Number of existing contacts updated.

* Number of duplicate records identified and handled (e.g., skipped, updated).

* Number of records that failed to import, along with the specific reasons for failure.

  • Error Log File (if applicable): A separate file (e.g., CSV) containing only the records that failed to import, along with their respective error messages, allowing for easy correction and re-import.
  • CRM Confirmation: Verification that the imported contacts are visible and accessible within your CRM system, correctly populating the designated fields.

5. Potential Issues and Troubleshooting

While our system is designed for robust data handling, certain issues can arise:

  • Malformed Data: Incorrect data types in columns (e.g., text in a number field).
  • Missing Mandatory Fields: Records lacking essential information required by the CRM.
  • Encoding Problems: Special characters not displaying correctly due to incorrect file encoding.
  • Excessive Duplicates: A high volume of duplicates requiring specific handling instructions.
  • API Rate Limits: For direct CRM integrations, exceeding API call limits (handled by our system with retry mechanisms).

Our team will proactively monitor the import process and address any issues that arise, providing immediate communication and proposed solutions.

6. Next Steps

Once the contact data has been successfully imported and validated within the CRM system, the workflow will automatically proceed to Step 2 of 2: Lead Scoring Generation. This next step will utilize the newly imported contact information to calculate and assign lead scores based on predefined criteria and your business rules.


crm Output

Workflow Completion: Contact Data Formatter - AI Lead Scoring

This document details the successful completion of Step 2: crm → ai_lead_scoring for your "Contact Data Formatter" workflow. We have processed your imported contact data, integrated it with your CRM, and applied our advanced AI lead scoring model to provide actionable insights for your sales and marketing teams.


1. Introduction to AI Lead Scoring

In this final step, our AI lead scoring engine analyzed your contact data, leveraging various attributes to assign a predictive score to each lead. This score indicates the likelihood of a lead converting into a customer, allowing for more efficient resource allocation and targeted engagement strategies. The primary goal is to empower your teams to focus on the most promising opportunities, thereby optimizing conversion rates and sales cycles.

2. Lead Scoring Process Overview

The AI lead scoring process involved the following key stages:

  • Data Ingestion: Contact data, previously formatted and imported into your CRM (as per Step 1), served as the primary input.
  • Feature Engineering: Relevant attributes from each contact record (e.g., company size, industry, job title, engagement history, geographic location, source of lead) were extracted and transformed into features suitable for the AI model.
  • Predictive Modeling: Our proprietary AI model, trained on historical conversion data and industry benchmarks, evaluated these features to generate a lead score for each contact.
  • CRM Integration: The generated lead scores and associated lead tiers (e.g., Hot, Warm, Cold) have been updated directly within your CRM system, ensuring immediate accessibility for your sales and marketing teams.

3. Key Deliverable: Lead Scoring Results

Your CRM system has been updated with the AI-generated lead scores.

  • Lead Score Field: A new custom field (or an updated existing one, if specified) named AI_Lead_Score (or similar, e.g., PantheraHive_Lead_Score) has been populated for each contact. This score is typically a numerical value (e.g., 0-100 or 0-1000), where a higher score indicates a greater likelihood of conversion.
  • Lead Tier Field: An additional custom field, Lead_Tier (or similar), has been added/updated, categorizing leads into actionable segments based on their score:

* Hot Leads: High probability of conversion.

* Warm Leads: Moderate probability of conversion, likely requiring nurturing.

* Cold Leads: Lower probability of conversion, potentially needing significant long-term nurturing or re-evaluation.

Summary of Lead Distribution:

Below is a high-level summary of the lead distribution based on the AI scoring:

| Lead Tier | Number of Leads | Percentage of Total | Recommended Action |

| :-------- | :-------------- | :------------------ | :----------------- |

| Hot | [Insert Actual Count] | [Insert Actual Percentage]% | Immediate sales outreach, personalized follow-up. |

| Warm | [Insert Actual Count] | [Insert Actual Percentage]% | Targeted nurturing campaigns, strategic engagement. |

| Cold | [Insert Actual Count] | [Insert Actual Percentage]% | Long-term nurturing, re-engagement campaigns, potential re-qualification. |

| Total | [Insert Total Contacts] | 100% | |

Please log in to your CRM to view the exact scores and tiers for each individual contact.

4. Actionable Insights & Recommendations

Leveraging these AI-generated lead scores can significantly enhance your sales and marketing efforts:

  • Sales Prioritization:

* Focus on Hot Leads: Direct your sales team's immediate attention and most valuable resources towards "Hot Leads" to capitalize on high-intent prospects.

* Strategic Warm Lead Engagement: Develop specific playbooks for "Warm Leads," combining sales outreach with targeted marketing content to move them down the funnel.

  • Marketing Campaign Optimization:

* Tailored Nurturing: Create segmented marketing campaigns based on lead tiers. "Cold Leads" might benefit from broad educational content, while "Warm Leads" could receive product-specific information or case studies.

* A/B Testing: Use lead scores as a metric to A/B test different messaging and offers, identifying what resonates best with various lead segments.

  • Resource Allocation:

* Efficient Spending: Allocate your marketing budget more effectively by focusing ad spend and content creation on channels and topics that attract higher-scoring leads.

* Sales Team Efficiency: Reduce wasted time on low-probability leads, allowing your sales team to concentrate on high-ROI activities.

  • Performance Monitoring:

* Track Conversion Rates: Monitor conversion rates by lead tier to validate the effectiveness of the scoring model and your engagement strategies.

* Identify Trends: Analyze the characteristics of your highest-scoring leads to refine your ideal customer profile and improve future lead generation efforts.

5. Data Integrity and Transparency

  • Data Sources: The lead scoring was performed exclusively on the contact data provided and imported into your CRM during Step 1. No external data sources were used without explicit prior agreement.
  • Model Transparency: While the scoring is AI-driven, the model is designed to be interpretable, considering factors such as demographic data, firmographic details, and any available behavioral signals. We can provide further details on the key features influencing scores upon request.
  • Continuous Improvement: Lead scoring models benefit from continuous feedback. As your sales team engages with these leads, the actual conversion outcomes can be used to further refine and improve the accuracy of the AI model over time.

6. Next Steps & Support

  • Review in CRM: We encourage you to immediately review the updated contact records in your CRM to familiarize yourself with the new lead scores and tiers.
  • Integrate into Workflows: Begin integrating these scores into your sales and marketing workflows, setting up automated alerts, task assignments, and segmented campaigns based on lead tiers.
  • Feedback & Refinement: We are here to support you. Please provide any feedback on the scoring results or discuss potential refinements to the model or integration.
  • Further Analysis: Should you require deeper analytics, such as a detailed breakdown of factors contributing to individual lead scores or a comprehensive report outside of the CRM, please let us know.

We are confident that these AI-generated lead scores will significantly enhance your ability to identify, prioritize, and convert your most valuable leads. Please do not hesitate to contact our support team if you have any questions or require further assistance.

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