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

Import contacts and generate lead scoring

Workflow Step 1 of 2: CRM Contact Import (crm → import_contacts)

This document details the initial phase of the "Contact Data Formatter" workflow, focusing on the secure and efficient import of your contact data into the designated CRM system. This step is critical for centralizing your contact information, laying the groundwork for subsequent lead scoring and enhanced customer relationship management.


1. Step Overview & Objective

Step Name: CRM Contact Import

Workflow: Contact Data Formatter

Description: Import contacts and generate lead scoring (Step 1 of 2)

The primary objective of this first step is to ingest your raw contact data into the CRM platform. This process involves meticulous data validation, cleansing, and mapping to ensure accuracy, consistency, and completeness within the CRM environment. A successful import is fundamental for all downstream processes, including the advanced lead scoring that will be performed in Step 2.


2. Input Data Requirements

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

  • Accepted File Formats:

* Comma Separated Values (.CSV)

* Microsoft Excel Workbook (.XLSX, .XLS)

  • Mandatory Fields:

* Email Address (Must be unique and valid)

* First Name

* Last Name

(If First Name and Last Name are not separate, a Full Name field is acceptable, which will be parsed.)*

  • Highly Recommended Fields (for optimal lead scoring):

* Company Name

* Job Title

* Phone Number

* Industry

* Lead Source (e.g., Website, Referral, Event, Cold Call)

* Creation Date / Last Activity Date

* Country, State, City

* Any other custom fields relevant to your business (e.g., Product Interest, Subscription Status)

  • Data Quality Standards:

* Ensure data is as clean and consistent as possible prior to submission.

* Remove any obviously incorrect or test data.

* Standardize common fields where possible (e.g., 'USA' vs 'United States').


3. Data Preparation & Validation Process

Upon receiving your data file, our system will perform a series of automated and manual checks to ensure data integrity before import:

  • File Format Validation: Confirmation that the file is in an accepted format and is not corrupted.
  • Header Row Verification: Identification and mapping of all column headers to corresponding CRM fields.
  • Mandatory Field Check: Verification that all mandatory fields (Email, First Name, Last Name) are present and populated for each record. Records missing mandatory fields will be flagged.
  • Email Validation: Syntax check for email addresses (e.g., user@domain.com). Invalid email formats will be flagged.
  • Data Type Validation: Ensuring data types align with CRM field types (e.g., numbers in phone fields, dates in date fields).
  • De-duplication Strategy:

* Primary Key: Email address will be used as the primary unique identifier.

* Duplicate Handling:

Option A (Default): Existing contacts with matching email addresses in the CRM will be updated* with new information from the submitted file.

* Option B (Upon Request): New contacts will be created, and duplicates will be flagged for manual review.

Please specify if you have a preferred de-duplication strategy other than the default.*


4. Import Execution & Error Handling

Once the data has passed validation, the import will proceed:

  • Field Mapping: Your data columns will be meticulously mapped to the appropriate fields within the CRM system. A mapping preview will be provided for your approval if custom fields or complex transformations are required.
  • Batch Processing: For large datasets, the import will be processed in optimized batches to maintain system performance and integrity.
  • Error Logging: Any records that fail the import process (e.g., due to critical data validation failures, unresolvable duplicates) will be logged. A detailed error report will be generated indicating the record and the reason for failure.

5. Expected Outcomes & Deliverables (Step 1)

Upon completion of the CRM Contact Import step, you will receive:

  • Import Summary Report: A comprehensive report detailing:

* Total number of records submitted.

* Number of records successfully imported.

* Number of records updated (if duplicates were handled by updating).

* Number of records skipped or failed, with specific reasons for each.

  • Confirmation of CRM Integration: Verification that your contacts are now accessible and visible within your CRM platform.
  • Readiness for Lead Scoring: Confirmation that the data is prepared and structured appropriately for the next phase of lead scoring.

6. Action Required from Customer

To initiate and facilitate this step, please provide the following:

  1. Your Contact Data File: Upload your .CSV or .XLSX file containing your contact information using the secure upload link provided separately.
  2. Field Mapping Confirmation (Optional but Recommended): If your data contains unique custom fields or requires specific mapping instructions, please provide a simple mapping document (e.g., "My File Column 'Product Interest' maps to CRM Field 'Product_Preference'"). Otherwise, we will propose a standard mapping for your review.
  3. De-duplication Preference: Confirm if the default de-duplication strategy (update existing contacts) is acceptable, or if you prefer a different approach.

7. Next Steps

Once Step 1: CRM Contact Import is successfully completed and you have reviewed the import summary, we will proceed immediately to Step 2 of 2: Lead Scoring Generation. In this subsequent step, the newly imported and validated contact data will be leveraged to apply sophisticated lead scoring models, providing actionable insights into your contact engagement and potential.


8. Support & Contact

Should you have any questions regarding the data requirements, the import process, or need assistance preparing your data, please do not hesitate to contact your dedicated PantheraHive support representative at [Support Email/Phone Number] or through your client portal. We are here to ensure a seamless and successful data import.

crm Output

Workflow Completion: Contact Data Formatter - Step 2 of 2: AI Lead Scoring

This document outlines the comprehensive output and deliverables for Step 2 of 2 in your "Contact Data Formatter" workflow: AI Lead Scoring. This step leverages advanced artificial intelligence to analyze your imported and formatted contact data, assigning a lead score and categorization to each contact to prioritize your sales and marketing efforts.


1. Step Overview

Workflow: Contact Data Formatter

Step: 2 of 2: AI Lead Scoring (crm → ai_lead_scoring)

Description: Imported and standardized contact data from your CRM has been processed through our AI Lead Scoring engine. This step enriches each contact record with a predictive lead score, a defined lead category, and key factors influencing that score, directly integrating these insights back into your CRM.


2. Purpose of AI Lead Scoring

The primary objective of AI Lead Scoring is to transform raw contact data into actionable intelligence, enabling your teams to:

  • Prioritize Outreach: Focus sales efforts on the most promising leads with higher conversion potential.
  • Optimize Resource Allocation: Efficiently allocate sales and marketing resources by targeting high-value opportunities.
  • Enhance Personalization: Tailor messaging and engagement strategies based on specific lead characteristics and scores.
  • Improve Conversion Rates: Shorten sales cycles and increase close rates by engaging with better-qualified leads sooner.
  • Standardize Lead Qualification: Implement a data-driven, consistent method for evaluating lead quality across your organization.

3. Input Data & Pre-processing (from Step 1)

The AI Lead Scoring engine processed the following data, which was meticulously cleaned, standardized, and enriched in the preceding "Contact Data Formatter" step:

  • Contact Information: Name, Email, Phone, Job Title, Seniority Level.
  • Company Information: Company Name, Industry, Company Size (Employees, Revenue), Location.
  • Engagement History (if available): Website visits, content downloads, email opens, event attendance.
  • CRM Specific Data: Any custom fields deemed relevant for lead qualification.

Our pre-processing ensured data quality, consistency, and the extraction of key features necessary for accurate scoring.


4. AI Lead Scoring Process

Our proprietary AI Lead Scoring model employs a multi-faceted approach to evaluate each contact:

  1. Feature Engineering: Relevant attributes (e.g., job title seniority, company industry fit, company size, geographic alignment, observed intent signals) are extracted and weighted.
  2. Predictive Modeling: Advanced machine learning algorithms (e.g., Gradient Boosting, Neural Networks) analyze these features against historical conversion data (where available) or industry best practices to predict the likelihood of a lead converting into a customer.
  3. Score Calculation: Each contact is assigned a numerical lead score, typically ranging from 0 to 100, indicating their potential value and readiness to engage.
  4. Categorization: Based on the numerical score, contacts are assigned to predefined lead categories for easy segmentation and action.
  5. Rationale Generation: The model identifies and highlights the primary factors that contributed to a contact's specific lead score, providing transparency and actionable context.

5. Deliverables: Updated CRM Records & Insights

The following data points have been directly integrated and updated within your CRM for each processed contact:

  • Lead Score (Numerical): A precise score (e.g., 85/100) indicating the lead's qualification level.
  • Lead Category (Tiered): A clear classification for immediate action:

* Hot Lead: High likelihood of conversion; immediate sales follow-up recommended.

* Warm Lead (MQL): Strong potential; requires nurturing or targeted outreach from sales/marketing.

* Cold Lead: Lower potential; may require long-term nurturing or re-evaluation.

* Disqualified: Unlikely to convert; remove from active campaigns or re-target with different content.

  • Top Scoring Factors: A concise summary of 2-3 key attributes that significantly influenced the lead's score (e.g., "High score due to Senior Executive Title, Target Industry 'Healthcare', and Company Size >1000 employees").
  • Recommended Next Action: A suggested action based on the lead category (e.g., "Assign to SDR for qualification call," "Add to 'Enterprise Nurture' campaign," "Directly assign to AE").

6. Actionable Insights & Next Steps

To maximize the value of your newly scored leads, we recommend the following actions:

  • Sales Prioritization:

* Direct your sales team to prioritize outreach to "Hot Leads" first.

* Develop specific playbooks for engaging "Warm Leads" to move them down the funnel.

* Utilize the "Top Scoring Factors" to personalize initial outreach messages and demonstrate understanding of the lead's context.

  • Marketing Automation & Nurturing:

* Create automated email sequences or content journeys tailored to each Lead Category. For example, "Warm Leads" might receive case studies, while "Cold Leads" receive educational content.

* Exclude "Disqualified" leads from irrelevant campaigns to maintain list hygiene and improve engagement rates.

  • Performance Monitoring:

* Track the conversion rates of leads from each category over time. This data can help refine your sales processes and potentially the AI model itself.

* Regularly review the "Top Scoring Factors" to understand evolving lead quality and market fit.

  • Feedback Loop:

* Encourage your sales team to provide feedback on the accuracy of the lead scores and categories. This qualitative input is invaluable for ongoing model optimization and ensures alignment with your sales reality.

* If a high-scoring lead consistently fails to convert, investigate the reasons to identify potential gaps in your sales process or model assumptions.


This AI Lead Scoring output provides a robust foundation for a more intelligent, efficient, and data-driven approach to your sales and marketing efforts. We are confident this will significantly enhance your ability to identify and convert high-potential contacts.

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