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

Import contacts and generate lead scoring

Workflow Execution: Contact Data Formatter - Step 1 of 2

Workflow Description: This workflow, "Contact Data Formatter," is designed to streamline your contact management by importing contact data into your CRM and subsequently generating comprehensive lead scores. This two-step process ensures your contact database is up-to-date and primed for effective sales and marketing strategies.


Current Step: crm → import_contacts

Objective: The primary goal of this initial step is to successfully import your provided contact data into your designated Customer Relationship Management (CRM) system. This involves validating the data, mapping it to appropriate CRM fields, and ensuring data integrity to prepare for the subsequent lead scoring phase.


1. Prerequisites and Data Requirements

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

  • Data Format:

* Preferred: CSV (Comma Separated Values) or XLSX (Microsoft Excel Workbook).

* Encoding: UTF-8 is highly recommended for all text files to prevent character display issues.

  • Mandatory Fields:

* First Name

* Last Name

* Email Address (Must be unique and valid)

* Company Name

  • Recommended Fields (for enhanced lead scoring and CRM utility):

* Job Title

* Phone Number

* Industry

* Website

* Address (Street, City, State/Province, Zip/Postal Code, Country)

* LinkedIn Profile URL

* Source (e.g., "Website Form," "Trade Show," "Referral")

* Creation Date (if available, for tracking contact age)

  • Data Quality:

* Ensure email addresses are correctly formatted (e.g., name@domain.com).

* Minimize duplicate entries within your source file; our system will perform de-duplication, but pre-cleaning helps.

* Avoid special characters in field headers unless absolutely necessary.

* Consistent formatting for dates (e.g., YYYY-MM-DD) and phone numbers is beneficial.


2. Import Process and Validation

Upon receiving your contact data, the following automated process will be initiated:

  • Data Upload & Parsing: Your file will be securely uploaded and parsed to identify individual contact records and their respective fields.
  • Initial Data Validation:

* Format Check: Verification of file type and encoding.

* Mandatory Field Check: Each record will be checked for the presence of First Name, Last Name, Email Address, and Company Name. Records missing these fields will be flagged.

* Email Validity: Basic syntax validation for email addresses.

  • Field Mapping: Our system will attempt to automatically map your data's column headers to standard CRM fields. You will have the opportunity to review and adjust these mappings before the final import.
  • De-duplication Logic:

* Primary Key: Email Address will serve as the primary unique identifier. If a contact with the same email already exists in your CRM, the existing record will be updated (or skipped, based on your preference).

* Secondary Logic (Optional): De-duplication can also be configured based on a combination of First Name, Last Name, and Company Name for records without an email or as an additional layer of protection.

  • Import Execution: Validated and mapped data will be systematically imported into your CRM system.

3. Expected Outcomes and Deliverables

Upon successful completion of this step, you will receive:

  • Import Confirmation Report: A detailed report summarizing the import process, including:

* Total records submitted for import.

* Number of contacts successfully imported.

* Number of contacts updated (if de-duplication rules led to updates).

* Number of contacts skipped (e.g., due to missing mandatory fields, invalid data, or strict de-duplication rules).

* A list of skipped records with specific reasons for exclusion.

* Any identified data discrepancies or warnings.

  • CRM Data Visibility: The newly imported and updated contacts will be visible within your designated CRM module, ready for review and interaction.
  • Data Standardization: Your contact data will be standardized and prepared for the next phase of lead scoring, ensuring consistency across your database.

4. Actionable Items for You (Customer)

To proceed with Step 1 and ensure a successful import:

  1. Prepare Your Data File: Consolidate your contact data into a single CSV or XLSX file, adhering to the recommended format and mandatory fields outlined in Section 1.
  2. Upload Data: Please upload your prepared file securely via the designated portal or method provided by PantheraHive.
  3. Review Field Mappings: Once your file is uploaded, you will be prompted to review and confirm the proposed field mappings between your file's columns and your CRM's fields. Please ensure accuracy here.
  4. Confirm De-duplication Strategy: Indicate your preference for handling duplicate records (e.g., update existing, skip new, create new with warning).
  5. Approve Import: Grant final approval for the import process to commence after reviewing mappings and de-duplication settings.

5. Next Steps: Lead Scoring Generation

Once the contact import is complete and verified (Step 1 of 2), the system will automatically proceed to Step 2 of 2: Lead Scoring Generation. In this subsequent phase, your newly imported contacts will be analyzed against predefined criteria to assign a lead score, helping you prioritize your sales and marketing efforts.


Support

Should you have any questions or require assistance at any point during this process, please do not hesitate to contact PantheraHive Support at [Support Email/Phone Number] or through your dedicated account manager. We are here to ensure a seamless experience.

crm Output

Workflow Completion: Contact Data Formatter - AI Lead Scoring

This document details the successful execution and deliverables for Step 2 of 2 in your "Contact Data Formatter" workflow: AI Lead Scoring (crm → ai_lead_scoring).


1. Workflow Overview: Contact Data Formatter

The "Contact Data Formatter" workflow is designed to streamline your contact management by first importing and standardizing your contact data (Step 1: Data Import & Standardization) and then enriching it with advanced AI-driven insights. This second and final step focuses on generating sophisticated lead scores to help you prioritize and optimize your sales and marketing efforts.

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

This crucial step leverages advanced Artificial Intelligence models to analyze your newly imported and standardized contact data, assigning a predictive lead score to each contact directly within your CRM.

2.1. Objective

The primary objective of this step is to transform raw or standardized contact data into actionable intelligence by:

  • Predicting Lead Quality: Identifying which contacts are most likely to convert into valuable customers.
  • Prioritizing Sales Efforts: Guiding your sales team to focus on the hottest leads first.
  • Optimizing Marketing Campaigns: Enabling targeted nurturing strategies based on lead potential.

2.2. AI Lead Scoring Process

Our proprietary AI lead scoring engine performs a multi-faceted analysis, integrating various data points to generate a comprehensive score:

  1. Data Ingestion & Integration: The standardized contact data from your CRM (derived from Step 1) is securely ingested into our AI scoring engine. This includes all available fields such as demographics, firmographics (company size, industry), job titles, geographic location, and any historical engagement data if provided.
  2. Feature Engineering: The AI system automatically extracts and engineers relevant features from the raw data. This involves identifying patterns, relationships, and indicators that correlate with successful conversions based on our extensive training datasets and industry benchmarks.
  3. Predictive Modeling: Advanced machine learning algorithms (e.g., Gradient Boosting, Neural Networks) are applied to predict the likelihood of conversion. The model considers hundreds of data points and their interactions, going beyond simple rule-based scoring.
  4. Score Generation & CRM Update: Each contact is assigned a Lead Score (typically a numerical value) and a Lead Status/Recommendation. These scores and statuses are then seamlessly pushed back and updated within the corresponding contact records in your CRM system.

2.3. Deliverable: Enhanced Contact Records

Upon completion of this step, your CRM contact records have been enriched with the following key data points:

  • Lead Score: A numerical value (e.g., 0-100) indicating the predicted likelihood of conversion. Higher scores represent higher potential.
  • Lead Score Category/Status: A categorical classification (e.g., "Hot," "Warm," "Nurture," "Cold") based on predefined score ranges, providing an immediate understanding of a lead's priority.
  • (Optional, if configured) Key Scoring Factors: An indication of the primary drivers behind a lead's score, offering transparency into the AI's decision-making (e.g., "High Industry Fit," "Strong Job Title Match," "Large Company Size").

3. Key Benefits of AI-Powered Lead Scoring

Implementing AI lead scoring provides significant advantages for your sales and marketing operations:

  • Prioritized Outreach: Sales teams can immediately identify and engage with the most promising leads, reducing wasted effort on unqualified prospects.
  • Optimized Sales & Marketing Efforts: Allocate resources more effectively by focusing on high-potential leads for sales and tailoring nurturing campaigns for mid-potential leads.
  • Increased Conversion Rates: By focusing on quality leads, you naturally improve your sales funnel's efficiency and conversion rates.
  • Data-Driven Decision Making: Move beyond intuition with objective, data-backed insights into lead quality.
  • Personalized Engagement: Use lead scores to segment your audience and deliver more relevant, personalized marketing messages and sales pitches.
  • Improved Sales Forecasting: Better understand the potential of your pipeline with more accurate lead quality assessments.

4. Actionable Insights & Recommendations

Now that your contacts are scored, here's how to leverage this powerful new data:

4.1. Accessing Your Lead Scores

  • CRM Integration: The Lead Score and Lead Score Category fields have been added/updated directly within your designated CRM contact records. You can typically find these as custom fields or within a dedicated scoring section.
  • Reporting & Dashboards: Utilize your CRM's reporting features to create custom dashboards that display lead scores, allowing for quick overviews and performance tracking.

4.2. Interpreting Lead Scores & Recommended Actions

We recommend establishing clear internal protocols based on the assigned lead scores:

  • High Score (e.g., 80-100 - "Hot Lead" / Marketing Qualified Lead - MQL / Sales Qualified Lead - SQL):

* Action: Immediate sales outreach within 24 hours. Assign to a dedicated sales representative for personalized follow-up. Prioritize discovery calls and solution presentations.

* Goal: Convert into an opportunity.

  • Medium Score (e.g., 40-79 - "Warm Lead" / Nurture Lead):

* Action: Enroll in targeted nurturing campaigns (e.g., email sequences, webinars, content downloads relevant to their industry/pain points). Sales should monitor engagement and reach out once specific triggers are met (e.g., multiple content downloads, website visits).

* Goal: Educate, build interest, and move towards MQL/SQL status.

  • Low Score (e.g., 0-39 - "Cold Lead" / Long-Term Nurture):

* Action: Enroll in broader brand awareness campaigns or re-engagement sequences. Do not prioritize for immediate sales outreach. Periodically re-evaluate scores as new data becomes available.

* Goal: Maintain brand presence and re-engage over the long term.

4.3. Leveraging Scores for Segmentation

  • Marketing Campaigns: Segment your audience based on lead scores for highly targeted email marketing, content distribution, and ad retargeting.
  • Sales Territories: Distribute leads more efficiently among your sales team based on score and territory.
  • Product/Service Tiers: Match high-scoring leads with higher-value offerings or dedicated account managers.

4.4. Feedback & Refinement

  • Continuous Improvement: Our AI models are designed to learn and improve over time. Providing feedback on actual conversion outcomes (e.g., which high-score leads converted, which low-score leads unexpectedly converted) will help us fine-tune the model for even greater accuracy.
  • Performance Monitoring: Regularly review the performance of your sales and marketing efforts in relation to lead scores. Identify any discrepancies or areas for further optimization.

5. Conclusion

The "Contact Data Formatter" workflow has successfully completed its mission. Your contact data is now not only standardized but also intelligently scored, providing your teams with a powerful tool to enhance efficiency, drive engagement, and ultimately, boost your conversion rates. We are confident that these AI-driven insights will significantly impact your sales and marketing effectiveness.

Should you have any questions or require further assistance in integrating these insights into your workflows, please do not hesitate to contact our support team.

contact_data_formatter.md
Download as Markdown
Copy all content
Full output as text
Download ZIP
IDE-ready project ZIP
Copy share link
Permanent URL for this run
Get Embed Code
Embed this result on any website
Print / Save PDF
Use browser print dialog
\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);}});}