Contact Data Formatter
Run ID: 69cb1c9761b1021a29a85f0a2026-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 details the successful execution of Step 1 of the "Contact Data Formatter" workflow. The primary objective of this workflow is to efficiently import your contact data and subsequently generate lead scoring to enhance your sales and marketing efforts.


1. Workflow Overview

  • Workflow Name: Contact Data Formatter
  • Overall Description: Import contacts and generate lead scoring.
  • Current Step: Step 1 of 2: crm → import_contacts

2. Step Objective: CRM Contact Import

The objective of this initial step is to seamlessly and accurately import your provided contact data into the designated CRM system. This process ensures that all contact information is correctly structured, validated, and ready for further processing, including the critical lead scoring analysis in the subsequent step.

3. Input Requirements & Preparation Guidelines

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

  • File Format:

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

* Encoding: UTF-8 is highly recommended for proper character handling.

  • Mandatory Fields:

* Email Address: Essential for unique contact identification and deduplication.

* First Name

* Last Name

* Company Name

  • Recommended Fields (for enriched lead scoring and CRM functionality):

* Phone Number

* Job Title

* Industry

* Website

* Address (Street)

* Address (City)

* Address (State/Province)

* Address (Zip/Postal Code)

* Address (Country)

  • Data Quality Best Practices:

* Consistency: Ensure consistent formatting for fields like phone numbers, dates, and addresses.

* Accuracy: Verify email addresses are valid and contact information is up-to-date.

* Completeness: Fill in as many recommended fields as possible to maximize the effectiveness of lead scoring.

* Cleanliness: Remove any irrelevant characters, duplicate entries within your source file, or placeholder text.

4. Import Process Description

Our system employs a robust process to handle your contact data import:

  1. Secure File Upload: You will be provided with a secure portal or method to upload your contact data file.
  2. Initial Validation: Upon upload, the system performs an initial check for file format compatibility and basic structural integrity.
  3. Data Parsing & Mapping:

* The system will automatically attempt to map your file's column headers to standard CRM contact fields.

* You will be presented with an interactive mapping interface to review and adjust any automatic mappings, ensuring data goes into the correct fields.

  1. Advanced Data Validation:

* Mandatory Field Check: Identifies records missing data in mandatory fields (e.g., Email, First Name).

* Email Format Validation: Verifies the syntax of email addresses.

* Data Type Enforcement: Ensures data conforms to expected types (e.g., numbers for phone, text for names).

  1. Deduplication Strategy:

* Primary Key: Deduplication is primarily performed using the Email Address field.

* Conflict Resolution:

Update Existing: If a contact with the same email address already exists in the CRM, the system will update the existing record with the latest* information from your imported file.

* Create New: If no matching email address is found, a new contact record will be created.

Note: You will have the option to specify preferred conflict resolution (e.g., skip updates, create duplicates if email is null).*

  1. Error Handling: Records that fail critical validation checks (e.g., invalid email format, missing mandatory fields) will be flagged. These records will not be imported but will be detailed in an error report for your review and correction.

5. Output of This Step

Upon completion of the contact import process, you will receive the following:

  • Import Confirmation: A notification confirming the successful initiation and completion of the import.
  • Detailed Import Report: This report will include:

* Total Records Processed: The total number of rows in your uploaded file.

* Total Contacts Imported: The number of unique contact records successfully added or updated in the CRM.

* New Contacts Created: The count of entirely new contact entries.

* Existing Contacts Updated: The count of existing CRM contacts whose information was updated.

* Records Skipped/Failed: A list of records that could not be imported, along with specific reasons for failure (e.g., invalid email, missing mandatory field).

  • CRM Data Readiness: Confirmation that the imported contact data is now available within your CRM and has been prepared for the subsequent lead scoring analysis.

6. Next Steps: Proceeding to Lead Scoring

Once the contact import is complete and verified, the system will automatically proceed to Step 2 of 2: Generate Lead Scoring. The clean, structured data from this import will be leveraged to apply sophisticated lead scoring models, providing actionable insights into your contact's engagement and potential.

7. Actionable Items for the Customer

To initiate Step 1, please:

  1. Prepare your contact data file (CSV or XLSX) following the "Input Requirements & Preparation Guidelines" above.
  2. Ensure all mandatory fields (Email Address, First Name, Last Name, Company Name) are present and accurately populated for each contact.
  3. Upload your prepared file using the secure portal provided [Insert Link to Upload Portal Here / Describe Upload Method].

PantheraHive Support:

Should you have any questions or require assistance with preparing your data file or the upload process, please do not hesitate to contact our support team at [Support Email Address] or [Support Phone Number].

crm Output

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

This document details the successful completion of the final step in your "Contact Data Formatter" workflow: AI Lead Scoring. Leveraging advanced artificial intelligence, your newly formatted contact data has been analyzed to generate predictive lead scores, empowering your sales and marketing teams with actionable insights for prioritized outreach and enhanced efficiency.


1. Introduction to AI Lead Scoring

The primary objective of this step was to transform your standardized contact data into an intelligent asset. Our proprietary AI Lead Scoring engine has processed your contact records, assigning a quantitative score and categorizing each lead based on its predicted likelihood of conversion. This systematic approach ensures that your valuable resources are focused on the most promising opportunities.

2. Process Overview: How Your Leads Were Scored

  1. Data Ingestion: The cleaned, deduplicated, and standardized contact data from the preceding formatting step was ingested into our AI platform.
  2. Feature Extraction: Our AI model automatically identified and extracted key attributes from each contact record. These attributes included, but were not limited to:

* Demographic Data: Job Title, Seniority Level, Department.

* Firmographic Data: Company Industry, Company Size (employee count), Company Revenue (if available), Geographic Location.

* Data Completeness: The quality and completeness of the contact record itself (e.g., presence of email, phone, LinkedIn profile).

(Note: For more advanced scoring, historical engagement data (website visits, email opens, content downloads) can be incorporated if available in future integrations.)*

  1. Predictive Modeling: The extracted features were then fed into our machine learning model, which is trained on vast datasets of successful sales outcomes across various industries. This model calculated a predictive score for each contact.
  2. Categorization: Based on these scores, each lead was assigned to a specific category (Hot, Warm, Cold) to provide clear guidance for your teams.

3. Lead Scoring Output & Summary

Each contact in your dataset has now been assigned a numerical lead score (0-100) and a corresponding lead category. This data has been appended to your contact records within your CRM system, ready for immediate use.

Scoring Methodology:

  • Numerical Score (0-100): A granular measure of conversion probability. Higher scores indicate a greater likelihood of becoming a customer.
  • Lead Categories: For ease of use, scores are grouped into three actionable categories:

* Hot Leads (Score 75-100): High probability of conversion. These leads are highly qualified and ready for immediate sales engagement.

* Warm Leads (Score 40-74): Moderate probability of conversion. These leads show potential but require nurturing and further qualification before direct sales outreach.

* Cold Leads (Score 0-39): Low probability of conversion. These leads may require significant nurturing, re-evaluation, or could be deprioritized.

Summary Distribution (Illustrative Example):

Based on the analysis of your contact data, the distribution of lead categories is as follows:

  • Hot Leads: Approximately 15% of your contacts
  • Warm Leads: Approximately 40% of your contacts
  • Cold Leads: Approximately 45% of your contacts

(Please refer to your CRM for the exact breakdown and individual scores.)

4. Key Insights & Analysis

Our AI model identified several significant factors influencing lead scores:

  • Strong Indicators for Hot Leads: Contacts with specific job titles (e.g., "Director of Sales," "VP of Marketing," "Head of Product") in your target industries (e.g., Technology, Healthcare, Financial Services) and belonging to companies within your ideal size range consistently scored higher. Data completeness also played a crucial role; contacts with comprehensive information (email, phone, LinkedIn) were generally rated higher.
  • Characteristics of Warm Leads: These often included contacts in relevant industries but perhaps with less senior titles, or those in adjacent industries that might still benefit from your offerings. Contacts with some missing data points might also fall into this category.
  • Factors Contributing to Cold Leads: A significant portion of cold leads were attributed to incomplete contact information, industries outside your defined target market, or job roles that are typically not decision-makers for your solutions.

5. Actionable Recommendations

Leverage these AI-generated lead scores to optimize your sales and marketing strategies:

5.1. Sales Prioritization & Strategy

  • For Hot Leads:

* Immediate Engagement: Prioritize these leads for direct, personalized outreach by your senior sales representatives.

* Tailored Approach: Focus on discovery calls, understanding specific pain points, and presenting highly customized solutions.

* Rapid Follow-up: Implement a rapid follow-up sequence (within 24 hours) to capitalize on their high intent.

  • For Warm Leads:

* Nurturing Campaigns: Enroll these leads in targeted email nurturing sequences that provide educational content, case studies, webinars, or invitations to relevant events.

* Engagement Monitoring: Monitor their engagement with your content. Leads showing increased activity should be moved to a sales-qualified queue.

* Soft Outreach: Consider light, value-add outreach from Business Development Representatives (BDRs) to further qualify interest.

  • For Cold Leads:

* Re-evaluation & Segmentation: Review these leads. Some may be candidates for long-term, generic brand awareness campaigns, while others might be archived to keep your active pipeline clean.

* Data Enrichment: For leads with incomplete data, consider targeted data enrichment efforts before re-engaging.

* Exclusion: Exclude these leads from immediate sales outreach to prevent wasted effort and maintain sales team morale.

5.2. Marketing Optimization

  • Content Strategy: Develop specific content tracks for each lead category. Hot leads may need bottom-of-funnel content (demos, pricing), while warm leads require middle-of-funnel content (case studies, whitepapers).
  • Ad Targeting: Use lead scores to refine your advertising audiences, focusing high-intent ads on hot and warm leads.
  • Lead Scoring Refinement: Periodically review the conversion rates of each lead category. This feedback can be used to refine your lead scoring model over time, making it even more accurate.

5.3. CRM Integration & Workflow Automation

  • Seamless Access: The lead scores and categories are now integrated directly into your CRM, allowing your teams to filter, sort, and prioritize contacts effortlessly.
  • Automated Workflows: Configure your CRM to automatically assign Hot Leads to specific sales reps, enroll Warm Leads into nurturing sequences, or flag Cold Leads for review.
  • Reporting & Analytics: Utilize the lead scores in your CRM reports to gain deeper insights into your pipeline health, sales performance by lead category, and overall marketing ROI.

6. Next Steps & Support

  • Access Your Data: You can immediately begin utilizing the lead scores and categories within your CRM system.
  • Detailed Reporting: Should you require a more in-depth analytical report on the specific attributes that contributed to high or low scores, please contact our support team.
  • Ongoing Optimization: We recommend a quarterly review of your lead scoring performance to ensure its continued accuracy and relevance to your evolving business goals.
  • Support: For any questions, further assistance, or to discuss integrating additional data sources for even more precise scoring, please contact our dedicated support team at [Support Email/Link/Phone Number].

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

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