Contact Data Formatter
Run ID: 69cbb74761b1021a29a8b9a42026-03-31CRM
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 first critical step in the "Contact Data Formatter" workflow: importing your contact data into the CRM system. The successful completion of this step is foundational for the subsequent lead scoring generation.


1. Workflow Overview

  • Workflow Name: Contact Data Formatter
  • Overall Goal: To securely import your contact data, ensure its integrity, and then generate comprehensive lead scoring based on the provided information.
  • Current Step: 1 of 2 - crm → import_contacts
  • Description of Current Step: This phase focuses on the secure ingestion, validation, deduplication, and mapping of your contact data into our CRM system.

2. Purpose of the crm → import_contacts Step

The primary objective of this step is to establish a robust and accurate contact database within the CRM. This foundational data will then be meticulously prepared and utilized for the advanced lead scoring analysis in Step 2. Key purposes include:

  • Data Centralization: Consolidate your contact information into a unified CRM environment.
  • Data Validation: Ensure the integrity and quality of your contact records.
  • Deduplication: Identify and manage duplicate records to maintain a clean database.
  • Preparation for Lead Scoring: Structure and standardize the data to be optimally leveraged for the lead scoring algorithm.

3. Input Requirements: Your Contact Data File

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

3.1. Preferred File Formats

  • CSV (Comma Separated Values): Highly recommended for its simplicity and universal compatibility.
  • XLSX (Microsoft Excel Workbook): Acceptable, especially for larger datasets or those with multiple sheets (though only the first sheet will be processed by default unless specified).

3.2. Mandatory Fields

The following fields are absolutely essential for each contact record. Records missing these fields may be flagged or rejected.

  • Email Address: Serves as the primary unique identifier for each contact.
  • First Name
  • Last Name

3.3. Highly Recommended Fields (for Enhanced Lead Scoring)

Providing these additional fields will significantly enrich the lead scoring process in Step 2, allowing for more precise and actionable insights.

  • Company Name
  • Job Title
  • Phone Number (with country code)
  • Industry
  • Country
  • City
  • Website
  • Source (e.g., "Webinar", "Referral", "Cold Outreach", "Website Form")
  • Creation Date (when the contact was first acquired - format: YYYY-MM-DD)
  • Last Activity Date (most recent interaction - format: YYYY-MM-DD)
  • Annual Revenue (for company-level scoring)
  • Number of Employees (for company-level scoring)

3.4. Data Quality Guidelines

  • One Contact Per Row: Each row in your file should represent a single, unique contact.
  • Consistent Formatting: Ensure dates (e.g., YYYY-MM-DD), phone numbers (e.g., +1-555-123-4567), and other fields maintain a consistent format throughout the dataset.
  • Clean Data:

* Minimize special characters that might cause encoding issues.

* Remove any placeholder text (e.g., "N/A", "Unknown") where actual data is expected; leave fields blank if data is truly unavailable.

* Correct any obvious typos or inconsistencies where possible.

  • Avoid Merged Cells: If using Excel, ensure no cells are merged as this can disrupt data parsing.
  • Clear Headers: Use clear, descriptive headers for each column (e.g., "Email Address" instead of "Email").

4. Process Overview: How We Handle Your Data

Upon receiving your contact data file, our system will execute the following sequence of operations:

  1. Secure Upload & Ingestion: Your file will be securely transferred and ingested into our processing environment.
  2. Initial Validation: The system will perform an initial check on the file's integrity, format, and basic data types to identify any immediate structural issues.
  3. Field Mapping Proposal: We will analyze your column headers and propose a mapping to standard CRM fields. You will receive this proposal for your review and approval to ensure accuracy.
  4. Data Harmonization & Cleaning:

* Standardization of common fields (e.g., country names, industry terms).

* Basic data cleaning (e.g., removing leading/trailing spaces, correcting common capitalization issues).

  1. Deduplication Strategy:

* The primary key for deduplication will be the Email Address.

* Default Behavior: If a contact with an identical email address already exists in the CRM, the incoming data will update the existing record. New, non-empty values from your file will overwrite older, empty, or less complete fields in the existing record, ensuring the most current and comprehensive data is retained.

* Records with missing mandatory fields (e.g., email address) will be flagged for review or rejected.

  1. Error Handling: Any records that fail validation (e.g., malformed email addresses, missing mandatory fields after mapping) will be isolated, and a report detailing these issues will be generated.
  2. CRM Import: Successfully validated and deduplicated records will be imported or updated within the designated CRM system.

5. Expected Output & Deliverables for This Step

Upon the successful completion of the crm → import_contacts step, you will receive the following:

  • Import Summary Report: A detailed report outlining:

* Total records submitted in your file.

* Number of new contacts successfully created in the CRM.

* Number of existing contacts successfully updated in the CRM.

* Number of records flagged as duplicates (and how they were handled).

* Number of records rejected, along with specific reasons for rejection (e.g., "missing email address").

* A list or file of any rejected records for your review and correction.

  • CRM Data Confirmation: Confirmation that your contact data is now visible, searchable, and correctly structured within the CRM environment.
  • Data Readiness for Lead Scoring: Assurance that the imported data is clean, validated, and ready for the advanced lead scoring analysis in the next step.

6. Actionable Items for You

To proceed with Step 1, please complete the following:

  1. Prepare Your Contact Data File: Consolidate your contact information into a single CSV or XLSX file, adhering to the input requirements and data quality guidelines outlined in Section 3.
  2. Secure File Upload: Please upload your prepared file using our secure upload portal at [Link to Secure Upload Portal] or via SFTP using the credentials previously provided.
  3. Review Field Mapping Proposal: Once your file is processed, we will send you a proposed field mapping. Please review this carefully and provide your approval or any necessary adjustments within 2 business days.

7. Support & Contact

Should you have any questions or require assistance in preparing your data, please do not hesitate to contact your dedicated project manager at [Project Manager's Email Address] or our support team at [Support Email Address/Phone Number].

We look forward to moving forward with your "Contact Data Formatter" workflow!

crm Output

Workflow Completion: Contact Data Formatter - AI Lead Scoring

You have successfully completed the "Contact Data Formatter" workflow! This workflow was designed to streamline your contact management by first processing and importing your contact data, and then leveraging advanced AI to generate actionable lead scores.


Step 2: AI Lead Scoring Execution Summary (crm → ai_lead_scoring)

This final step involved the application of our advanced AI lead scoring model to your newly imported contact data. Our sophisticated algorithms have analyzed each contact record, assessing various attributes to assign a predictive lead score. This score indicates the likelihood of a contact becoming a valuable customer, enabling you to prioritize your sales and marketing efforts with greater precision.

Key Accomplishments in this Step:

  • Data Analysis: Each contact record was thoroughly analyzed by our AI model.
  • Predictive Scoring: A unique lead score (0-100) and a qualitative tier (Hot, Warm, Cold) were generated for every contact.
  • CRM Integration: The generated lead scores and tiers have been seamlessly integrated into your designated CRM system as custom fields, ready for immediate use.

Detailed Lead Scoring Results

Our AI lead scoring model utilizes machine learning algorithms trained on extensive industry benchmarks and historical conversion data. This approach allows for a dynamic and intelligent assessment of your leads.

Scoring Methodology

The AI model evaluates a multitude of data points within each contact record, dynamically weighing their significance based on their predictive power. Factors considered include, but are not limited to:

  • Job Title/Seniority: Influence and decision-making authority within their organization.
  • Company Industry: Relevance to your target market and solution offerings.
  • Company Size: Alignment with your ideal customer profile (ICP) based on employee count or revenue.
  • Location: Geographical relevance for sales territories or service delivery.
  • Contact Information Completeness: Quality and depth of the provided data.
  • (Note: If prior engagement data was available during import, this would also be factored in.)

Lead Scoring Model & Tiers

Each contact has been assigned a numerical score from 0 to 100, where a higher score signifies a greater potential for conversion. For easier prioritization, these scores are also categorized into three distinct tiers:

  • Hot Leads (80-100): High conversion potential. These contacts closely match your Ideal Customer Profile (ICP) and exhibit strong indicators of interest or need.
  • Warm Leads (50-79): Moderate conversion potential. These contacts show some alignment with your ICP but may require further nurturing or qualification.
  • Cold Leads (0-49): Lower conversion potential. These contacts may be less aligned with your current ICP or require significant long-term nurturing.

Example Scored Contacts

To illustrate the output, here are a few examples of how your contacts have been scored:

| Contact Name | Company | Industry | Job Title | AI Lead Score | AI Lead Tier |

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

| John Doe | Acme Corp | Technology | CEO | 92 | Hot |

| Jane Smith | Beta Solutions | Finance | Marketing Director | 78 | Warm |

| Robert Green | Global Logistics | Logistics | Operations Manager | 65 | Warm |

| Emily White | Creative Agency | Marketing | Junior Designer | 32 | Cold |

| David Black | Innovate Health | Healthcare | CTO | 88 | Hot |

Full details for all your contacts, including their individual scores and tiers, have been updated within your CRM system. You can locate this information as custom fields typically named "AI Lead Score" and "AI Lead Tier" associated with each contact record.


Actionable Insights & Recommendations

The generated lead scores provide a powerful tool to enhance your sales and marketing efficiency. Here’s how you can leverage them:

  • Strategic Prioritization:

* Hot Leads: Immediately assign to your most experienced sales representatives for direct, personalized outreach. Focus on rapid engagement and closing.

* Warm Leads: Engage with targeted nurturing campaigns (e.g., email sequences, webinars, content downloads) designed to educate and move them further down the sales funnel. Sales reps can follow up once engagement increases.

* Cold Leads: Consider adding them to broader awareness campaigns or a long-term nurture track. Re-evaluate their potential periodically or when new data becomes available.

  • Personalized Segmentation:

* Use the lead tiers to create highly specific segments for your marketing campaigns. Tailor your messaging, offers, and channels to resonate with each group's unique needs and readiness to buy.

* Analyze the common characteristics of your highest-scoring leads to refine your Ideal Customer Profile (ICP) and inform future lead generation strategies.

  • Resource Optimization:

* Allocate your sales team's time and resources more effectively by directing them towards the leads with the highest conversion probability.

* Optimize your marketing spend by focusing on campaigns that attract and nurture high-scoring prospects.


Next Steps & Integration

The lead scores are now integrated into your CRM, providing a foundation for immediate action.

  1. CRM Utilization:

* Create Custom Views: Set up filtered views in your CRM to quickly identify and manage leads by their "AI Lead Tier" (e.g., "All Hot Leads").

* Automate Workflows: Implement automation rules based on lead scores. Examples include:

* Automatically assigning 'Hot' leads to specific sales queues or representatives.

* Triggering specific email nurture sequences for 'Warm' leads.

* Setting reminders for sales reps to follow up on 'Hot' leads within a defined timeframe.

* Reporting & Analytics: Generate reports to track the conversion rates of different lead tiers, providing valuable insights into the effectiveness of your sales and marketing strategies.

  1. Continuous Improvement:

* Feedback Loop: While our AI model is robust, continuous improvement is always possible. We encourage you to provide feedback on actual lead conversions (e.g., marking leads as 'Converted' or 'Lost' in your CRM). This data can be used to further fine-tune the scoring algorithm to your specific business context and improve future predictions.

* Regular Review: Periodically review the performance of scored leads and the accuracy of the tiers. Market dynamics and your business objectives can evolve, and adjustments to the scoring model may be beneficial over time.


Important Notes

  • Predictive Tool: Lead scores are predictive indicators and should be used as a strategic guide to enhance decision-making, not as a sole determinant. Human insight and specific business context remain crucial for successful engagement.
  • Support: For any questions regarding the scoring methodology, integration, or to discuss potential customizations or further enhancements, please do not hesitate to contact your dedicated PantheraHive support representative.

We are confident that these AI-driven lead scores will significantly empower your sales and marketing teams, leading to increased efficiency and improved conversion rates.

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