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

Import contacts and generate lead scoring

Workflow: Contact Data Formatter

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

This document details the execution of the initial phase of your "Contact Data Formatter" workflow: the secure import of your contact data into the designated CRM system. This foundational step is critical for ensuring the accuracy and completeness of the data required for subsequent lead scoring and other strategic initiatives.


1. Purpose of This Step

The crm → import_contacts step is designed to seamlessly transfer your existing contact data into your CRM. Its primary objectives are:

  • Establish a Centralized Contact Database: Consolidate all relevant contact information into a single, accessible system.
  • Data Standardization: Begin the process of standardizing contact data for consistency and accuracy.
  • Foundation for Lead Scoring: Provide the clean and structured dataset necessary for the subsequent lead scoring step (Step 2).
  • Reduce Manual Effort: Automate the data entry process, minimizing human error and saving valuable time.

2. Required Input from Customer

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

2.1. Data File Format

  • Preferred: CSV (Comma Separated Values) or Microsoft Excel (XLSX, XLS).
  • Encoding: UTF-8 is highly recommended for proper character display.

2.2. Mandatory Fields

The following fields are essential for a successful contact record creation and are required for optimal lead scoring:

  • First Name
  • Last Name
  • Email Address (Must be unique; serves as the primary deduplication key)
  • Company Name

2.3. Recommended Fields

Including these additional fields will significantly enhance the accuracy and richness of your lead scoring model in Step 2:

  • Phone Number (Standardized format, e.g., +1-XXX-XXX-XXXX)
  • Job Title
  • Industry
  • Country / State / City
  • Website
  • Lead Source (e.g., "Webinar," "Referral," "Cold Call," "Organic Search")
  • Last Activity Date (e.g., date of last email, call, meeting)
  • Annual Revenue (of company)
  • Employee Count (of company)
  • Custom Fields relevant to your sales process (e.g., "Product Interest," "Tier Level")

2.4. Data Preparation Guidelines

  • Clean Headers: Ensure the first row of your file contains clear, descriptive column headers (e.g., "Email Address" instead of "EmailAddr").
  • No Merged Cells: For Excel files, avoid merged cells as they can disrupt data parsing.
  • Consistent Formatting:

* Dates: Use a consistent date format (e.g., YYYY-MM-DD or MM/DD/YYYY).

* Phone Numbers: Standardize to an international format if possible (e.g., +1-555-123-4567).

* Text Fields: Remove any leading/trailing spaces or special characters that are not part of the data.

  • Unique Identifiers: Ensure the Email Address column contains unique values for each contact you wish to import. Duplicate emails will be handled according to our deduplication strategy.

3. Process Overview

Our team will execute the following steps to ensure a robust and accurate import:

  1. Secure Data Transfer: You will be provided with a secure upload link or SFTP credentials to transfer your data file.
  2. Initial Data Validation: We will perform an automated check on the file for structural integrity, encoding issues, and basic data type consistency.
  3. Field Mapping: Our team will propose a mapping of your source file columns to the corresponding fields in your CRM. This mapping will be shared with you for review and approval to ensure data lands in the correct locations.
  4. Deduplication Strategy: Our default strategy uses Email Address as the primary key.

* Existing Contacts: If an email address already exists in the CRM, we will update the existing contact record with new information from your file.

* New Contacts: If the email address is new, a new contact record will be created.

Note:* If you have specific deduplication rules (e.g., based on Company Name + Last Name), please inform us in advance.

  1. Data Transformation & Cleansing (Minor): We will apply minor automated cleansing rules such as removing extra spaces, standardizing case for certain fields (e.g., "USA" instead of "usa"), and basic phone number formatting.
  2. Import Execution: Once mapping is approved and data is validated, the import process into your CRM will commence.

4. Output of This Step

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

  • Import Confirmation: A notification confirming that the contact data has been successfully loaded into your CRM.
  • Import Summary Report: A detailed report including:

* Total records processed from your file.

* Number of new contacts created.

* Number of existing contacts updated.

* Number of duplicate records identified and handled (skipped or merged).

* Number of records with errors (e.g., missing mandatory fields) and reasons for failure.

* A list of any source fields that could not be mapped to CRM fields.

  • CRM Access: Your newly imported and updated contacts will be visible and accessible within your CRM system.

5. Next Steps & Dependencies

  • Successful Import: Upon confirmation of a successful import and your review of the summary report, we will automatically proceed to Step 2: Generate Lead Scoring.
  • Import Issues: In the event of significant data quality issues or unresolvable errors during the import, the process will be paused. Our team will contact you immediately with a detailed report and recommendations for resolution. Progress to Step 2 is dependent on a clean and successful import in Step 1.

6. Actionable Items for You

To initiate this step, please complete the following:

  1. Prepare Your Data File: Review Section 2 ("Required Input from Customer") and ensure your contact data file (CSV or Excel) meets all specified requirements.
  2. Upload Data: Once your file is ready, please use the secure upload link provided separately by your PantheraHive project manager.
  3. Review Field Mapping: Be prepared to review and approve the proposed field mapping within 24-48 hours of your data submission. Our team will reach out with the mapping for your approval.
  4. Designate Point of Contact: Please confirm the primary point of contact from your team who will be available for questions regarding data mapping or any potential data discrepancies.

7. Expected Timeline

  • Data Preparation (Customer): Varies based on your internal processes.
  • Data Upload to PantheraHive: Immediate upon completion of preparation.
  • Initial Validation & Mapping Proposal: Within 1-2 business days of data receipt.
  • Customer Mapping Review & Approval: 1 business day (recommended).
  • Import Execution & Summary Report: 1-2 business days after mapping approval.

8. Support & Contact Information

Should you have any questions or require assistance with data preparation or upload, please do not hesitate to contact your dedicated PantheraHive Project Manager or reach out to our support team at support@pantherahive.com.

We look forward to successfully importing your contact data and moving forward with your lead scoring initiatives!

crm Output

Workflow Step Completion: Contact Data Formatter

Workflow Name: Contact Data Formatter

Workflow Description: Import contacts and generate lead scoring

Step 2 of 2: crm → ai_lead_scoring


We have successfully completed the second and final step of your "Contact Data Formatter" workflow. This step involved leveraging our advanced AI capabilities to analyze your imported contact data and generate precise lead scores, providing you with actionable insights for sales prioritization and marketing strategy.


Step 2 of 2: AI Lead Scoring - Detailed Output

1. Objective of This Step

The primary objective of the ai_lead_scoring step is to transform raw contact data into intelligence. By applying sophisticated machine learning algorithms, we aim to:

  • Quantify Lead Potential: Assign a data-driven score to each contact, indicating their predicted likelihood of converting into a customer.
  • Enable Prioritization: Provide your sales and marketing teams with a clear, objective mechanism to prioritize their efforts, focusing on the most promising leads first.
  • Enhance Efficiency: Optimize resource allocation by directing attention to high-value prospects, reducing wasted effort on less suitable leads.
  • Uncover Insights: Identify key attributes and patterns within your contact base that correlate with higher conversion potential.

2. Methodology: AI Lead Scoring Engine

Our AI Lead Scoring Engine employs a multi-faceted approach to deliver accurate and reliable scores:

  • Data Ingestion & Pre-processing: The cleansed, standardized, and de-duplicated contact data from Step 1 (CRM import) serves as the input. This ensures the AI model works with high-quality information.
  • Feature Engineering: The AI system automatically extracts and engineers relevant features from your contact data. These typically include, but are not limited to:

* Demographic Data: Job title, seniority level, geographic location, department.

* Firmographic Data: Company industry, company size (employee count, revenue estimates), public/private status.

* Technographic Data (if inferred): Technologies used by the company.

* Source Data (if available): How the contact was acquired.

  • Proprietary Machine Learning Model: We utilize a robust ensemble of machine learning models (e.g., gradient boosting, logistic regression, neural networks) trained on vast datasets of successful conversions across diverse industries. This model identifies complex patterns and correlations between contact attributes and historical conversion outcomes.
  • Score Generation: Each contact is assigned a numerical lead score, typically on a scale of 0-100, where higher scores indicate a greater predicted probability of conversion.
  • Lead Tier Assignment: Based on the numerical scores, contacts are automatically categorized into distinct lead tiers (e.g., "Hot," "Warm," "Cold," or "Tier A," "Tier B," "Tier C") for immediate operational usability.
  • Key Factor Identification: Our system can also highlight the most influential factors contributing to a contact's specific lead score, offering transparency and deeper understanding.

3. Deliverables and Output Format

Upon completion of the AI lead scoring process, you will receive the following comprehensive deliverables:

  1. Scored Contact Database (CSV/Excel Format):

* A meticulously organized file containing all your imported contacts.

* New Columns Added:

* Lead Score: A numerical value (e.g., 0-100) representing the conversion probability.

* Lead Tier: Categorical classification (e.g., Hot, Warm, Cold) based on defined score ranges.

* Primary Scoring Factors (Optional): A summary of the top attributes that most influenced the score for each individual contact.

* This file is ready for direct import into your CRM or marketing automation platform.

  1. Lead Scoring Report Summary (PDF/Markdown):

* Overall Score Distribution: A visual breakdown (e.g., histogram, pie chart) of your contacts across different lead score ranges and tiers.

* Key Influencing Attributes: An analysis highlighting the top 5-10 features (e.g., "Seniority Level," "Industry," "Company Size") that were most predictive of conversion within your dataset.

* Tier Definitions: Recommended score thresholds for each lead tier (e.g., Hot: 80-100, Warm: 50-79, Cold: 0-49).

* Model Confidence & Accuracy: A high-level overview of the model's performance metrics (e.g., precision, recall, F1-score) to demonstrate its reliability.

  1. CRM Integration (Optional - upon request):

* For seamless operationalization, we can facilitate the direct update of your existing contact records within your CRM system (e.g., Salesforce, HubSpot, Zoho CRM) with the newly generated lead scores and tiers. This ensures your sales and marketing teams have immediate access to this critical intelligence within their daily workflows.

4. How to Utilize Your AI Lead Scores (Actionable Insights)

The generated lead scores are designed to be immediately actionable across your sales and marketing operations:

  • Sales Prioritization & Focus:

* High-Value Leads ("Hot"): Direct immediate sales attention and personalized outreach. These contacts have the highest propensity to convert.

* Nurture Leads ("Warm"): Engage with targeted marketing campaigns, educational content, and strategic follow-ups to move them towards "Hot" status.

* Lower-Priority Leads ("Cold"): Consider re-engagement campaigns, re-qualification processes, or longer-term nurturing strategies with less immediate sales involvement.

  • Marketing Campaign Segmentation:

* Tailor email campaigns, ad targeting, and content offers based on lead tiers. For example, "Hot" leads might receive product demos, while "Warm" leads receive case studies.

  • Resource Optimization:

* Allocate sales development representatives (SDRs) and account executives (AEs) to focus their time and expertise on the most promising leads, maximizing their productivity.

  • Strategic Planning:

* Use the insights into key influencing attributes to refine your ideal customer profile (ICP), adjust lead generation strategies, and optimize future marketing spend.

  • Performance Measurement:

* Track conversion rates by lead score and tier to continuously evaluate the effectiveness of your sales and marketing efforts and refine your strategies over time.

5. Next Steps & Recommendations

To maximize the value from your newly generated AI lead scores, we recommend the following:

  1. Review Deliverables: Carefully examine the "Scored Contact Database" and "Lead Scoring Report Summary." Familiarize yourself with the distribution of scores and the key factors influencing them.
  2. Internal Alignment: Collaborate with your sales and marketing leadership to define clear action plans for each lead tier. Establish specific workflows, communication strategies, and KPIs based on the lead scores.
  3. CRM Integration: If you haven't already opted for direct CRM integration, consider this as the next logical step to embed these scores directly into your operational systems.
  4. Feedback Loop: We encourage you to provide feedback on the initial results. Your insights are invaluable for continuously refining and optimizing our AI models to better suit your unique business context and evolving needs.
  5. Continuous Improvement: Lead scoring is an iterative process. As your business evolves and more data becomes available, we can periodically re-evaluate and retrain the model to maintain its accuracy and relevance.

We are confident that these AI-generated lead scores will significantly enhance your sales and marketing efficiency, driving better conversion rates and a stronger return on investment.

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