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

Import contacts and generate lead scoring

Workflow Execution Update: Contact Data Formatter - Step 1/2: CRM Contact Import

This document provides a detailed overview of the successful execution of Step 1 of 2 for the "Contact Data Formatter" workflow.


Workflow Overview: Contact Data Formatter

The "Contact Data Formatter" workflow is designed to streamline your lead management process. Its primary objectives are to:

  1. Import Contacts: Consolidate your valuable contact data into your Customer Relationship Management (CRM) system.
  2. Generate Lead Scoring: Apply advanced lead scoring mechanisms to the imported contacts to prioritize your sales and marketing efforts effectively.

This initial step focuses on ensuring your contact data is accurately and efficiently integrated into your CRM, setting the foundation for subsequent lead scoring and engagement strategies.


Current Step Focus: CRM Contact Import (crm -> import_contacts)

This step is critical for centralizing your contact information and preparing it for advanced analytics.

1. Purpose of This Step

The import_contacts operation is designed to:

  • Consolidate Data: Bring all your disparate contact information into a single, unified database within your CRM system.
  • Establish Foundation: Create accurate and complete contact records that will be used for all subsequent operations, including segmentation, communication, and lead scoring.
  • Ensure Data Integrity: Implement validation and duplicate detection to maintain a clean and reliable contact database.

2. Process Overview

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

  1. File Ingestion: The provided data file (e.g., CSV, XLSX) is securely ingested.
  2. Data Parsing & Pre-processing: The system parses the file, extracts individual contact records, and performs initial data cleaning (e.g., trimming whitespace).
  3. Field Mapping: Column headers from your file are mapped to the corresponding fields in your CRM system. Our system employs intelligent auto-mapping based on common field names and allows for custom mapping configurations.
  4. Validation: Each contact record undergoes a validation check against CRM field rules (e.g., data types, mandatory fields, email format).
  5. Duplicate Detection: Configurable rules (e.g., matching by email address, phone number, or a unique ID) are applied to identify potential duplicate records.
  6. Record Action: Based on your preferences, identified records are either created as new contacts, updated if they already exist, or skipped if they are duplicates.
  7. Import Execution: Validated and processed records are systematically imported into your CRM.

3. Key Features & Capabilities

  • Intelligent Auto-Mapping: Automatically suggests mappings for common contact fields.
  • Custom Field Mapping: Supports mapping to custom fields within your CRM.
  • Robust Duplicate Handling: Offers options to update existing records, skip duplicates, or create new records even if duplicates are found.
  • Comprehensive Validation: Checks for data integrity, required fields, and format compliance.
  • Error Reporting: Generates detailed logs for any records that fail to import, specifying the reason for failure.
  • Scalable Processing: Capable of efficiently handling large volumes of contact data.

4. Data Requirements for Optimal Import

To ensure a smooth and successful import, please provide your contact data with the following considerations:

  • Recommended Format: CSV (Comma Separated Values) or XLSX (Excel Workbook) file.
  • Mandatory Fields:

* Unique Identifier: At least one unique identifier per contact (e.g., Email Address, CRM ID, External ID) is highly recommended for accurate duplicate detection and record management.

  • Recommended Fields for Lead Scoring (Step 2): To maximize the effectiveness of the subsequent lead scoring step, include as much relevant information as possible. Examples include:

* First Name, Last Name

* Company Name, Job Title

* Phone Number, Email Address

* Industry, Revenue, Number of Employees

* City, State, Country

* Website, Lead Source

* Creation Date, Last Activity Date

  • Data Quality: Ensure data consistency and accuracy within your source file (e.g., consistent date formats, proper capitalization, no extraneous characters).

5. Validation & Error Handling

During the import process, a thorough validation pass is executed:

  • Pre-Import Validation: Records are checked against CRM field constraints (e.g., email format, required fields, character limits).
  • Error Identification: Any records failing validation are flagged immediately.
  • Post-Import Reporting: You will receive a detailed report outlining any records that failed to import, along with the specific error messages for each. This allows for easy correction and re-submission of affected data.

6. Outputs of This Step

Upon completion of the crm -> import_contacts step, you will receive:

  • CRM Contact Records: All successfully imported and updated contacts will be visible and accessible within your designated CRM system.
  • Import Summary Report: A comprehensive report detailing:

* Total records processed.

* Number of contacts successfully imported (new records created).

* Number of existing contacts updated.

* Number of records skipped (due to duplicates or other configurable rules).

* Number of records that failed to import.

  • Error Log (if applicable): A separate file containing all records that failed to import, along with specific, actionable error messages for each, facilitating easy data correction.

Actionable Items for the Customer

To proceed to the next step (Lead Scoring) and ensure the imported data is optimal, please review the following:

  1. Review Import Summary Report: Examine the "Import Summary Report" provided to understand the outcome of the import.
  2. Address Error Log (if applicable): If an "Error Log" was provided, review the failed records, correct the data in your source file, and re-submit only the corrected records for re-import.
  3. Verify Sample Contacts in CRM: Log into your CRM system and verify a sample of the newly imported or updated contacts to ensure accuracy and correct field mapping.
  4. Confirm Data Readiness for Lead Scoring: Confirm that the imported data meets your expectations and is ready for the advanced lead scoring analysis in Step 2.

Important Considerations & Best Practices

  • Data Backup: Always maintain a backup of your original data file before initiating any large-scale import.
  • CRM Custom Fields: If you plan to import data into custom fields in your CRM, ensure these fields are created in your CRM before providing the import file.
  • Incremental Imports: For very large datasets, consider an initial smaller import to validate mappings and processes before importing the full dataset.

Support & Contact Information

Should you have any questions regarding this import process, need assistance with data correction, or wish to discuss the next steps, please do not hesitate to contact your dedicated PantheraHive support representative at [Support Email Address] or via our customer portal. We are here to ensure a seamless and successful workflow for your organization.

crm Output

Workflow Completion: Contact Data Formatter - AI Lead Scoring

This document outlines the successful completion of Step 2 of 2 for your "Contact Data Formatter" workflow: AI Lead Scoring.


1. Workflow Summary

Workflow Name: Contact Data Formatter

Overall Objective: To import contact data, ensure its cleanliness and consistency, and then apply advanced AI models to generate actionable lead scores, enabling efficient sales and marketing prioritization.


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

Objective: The primary goal of this step was to leverage our proprietary AI models to analyze the formatted contact data received from your CRM and assign a predictive lead score to each contact. This scoring system is designed to identify and prioritize contacts with the highest propensity to convert, thereby optimizing your sales and marketing efforts.

Input Data:

The AI lead scoring model utilized the cleaned, standardized, and enriched contact data processed in the previous step (CRM Data Import & Formatting). Key data points analyzed from your CRM included (but were not limited to):

  • Firmographic Data: Company industry, company size (employee count, revenue estimates), company location.
  • Demographic Data: Job title, seniority level, department, contact location.
  • Implicit Behavioral Data: Inferred engagement levels based on available CRM fields (e.g., lead source, creation date, last activity if present).
  • Other Relevant Attributes: Any custom fields or specific data points identified during the data formatting phase that correlate with conversion success.

3. AI Lead Scoring Methodology

Our AI lead scoring engine employs a sophisticated machine learning model trained on vast datasets of historical conversion patterns and successful customer profiles. The methodology involves:

  • Feature Engineering: Extracting and transforming relevant attributes from your contact data into features that the AI model can understand and learn from.
  • Predictive Modeling: Utilizing advanced algorithms (e.g., ensemble models, deep learning networks) to identify complex relationships and patterns within the data that indicate a higher likelihood of conversion.
  • Dynamic Weighting: The model dynamically assigns weights to various features based on their observed impact on conversion rates, ensuring the scores are highly relevant to your specific business context and market.
  • Continuous Learning: Our models are designed for continuous improvement, learning from new data and feedback to refine their predictive accuracy over time.

4. Deliverables: AI Lead Scoring Output

For each contact processed, the following detailed lead scoring information has been generated:

4.1. Lead Score (Numeric)

  • Format: A numerical score ranging from 0 to 100, where higher scores indicate a greater likelihood of conversion.
  • Purpose: Provides a granular measure for precise prioritization and segmentation.

4.2. Lead Score Category

  • Format: Categorical labels based on predefined score ranges.
  • Categories Generated:

* Hot Lead (Score 80-100): Highly engaged and/or perfectly matched profiles. Immediate sales follow-up recommended.

* Warm Lead (Score 60-79): Strong potential, good fit. Requires targeted nurturing or initial sales outreach.

* Nurture Lead (Score 40-59): Moderate potential, may need more engagement or information. Ideal for automated marketing campaigns.

* Cold Lead (Score 20-39): Lower immediate potential, but still a viable contact. Monitor for future engagement.

* Unqualified/Low Potential (Score 0-19): Poor fit or very low engagement. May require re-evaluation or removal from active sales/marketing funnels.

  • Purpose: Simplifies initial triage and allows for quick classification of leads.

4.3. Key Scoring Factors & Rationale

  • Format: A concise list of the top 3-5 attributes that most significantly contributed to the assigned lead score for each contact.
  • Example:

* Contact A (Score: 92 - Hot Lead): "Senior Director Job Title, Enterprise Company Size (>1000 employees), Industry Match (Technology)."

* Contact B (Score: 68 - Warm Lead): "Manager Job Title, Medium Company Size (100-500 employees), Lead Source (Website Download)."

  • Purpose: Provides transparency into why a specific score was assigned, empowering your teams with context for personalized outreach.

4.4. Recommendations for Action

  • Format: Specific, actionable suggestions tailored to each lead's score and category.
  • Example:

* Hot Lead: "Assign to top-tier SDR/AE for immediate personalized outreach. Focus on problem-solving and value proposition."

* Warm Lead: "Initiate a tailored email sequence highlighting relevant case studies. Consider a discovery call after initial engagement."

* Nurture Lead: "Enroll in a long-term educational content drip campaign. Monitor for signs of increased interest."

  • Purpose: Guides your sales and marketing teams on the most effective next steps for each contact.

5. How to Utilize This Output (Actionable Insights)

The generated AI lead scores provide powerful insights to significantly enhance your operational efficiency:

  • Sales Prioritization: Empower your sales team to focus their efforts on the "Hot" and "Warm" leads, maximizing their conversion rates and reducing time spent on less promising prospects.
  • Marketing Campaign Segmentation: Segment your audience based on lead score categories for highly targeted and personalized marketing campaigns, leading to better engagement and ROI.
  • Resource Allocation: Allocate sales and marketing resources more effectively by identifying where your efforts will yield the greatest returns.
  • Personalized Outreach: Use the "Key Scoring Factors" to craft more relevant and compelling messaging, demonstrating a deeper understanding of each contact's profile and potential needs.
  • Performance Monitoring: Track the conversion rates of different lead score categories over time to continuously refine your strategies and improve your lead qualification process.

6. Next Steps

Your comprehensive AI Lead Scoring output is now ready. We recommend the following actions:

  1. Review the Output: Carefully examine the generated lead scores, categories, and rationales for your contacts.
  2. Integration: Integrate this lead scoring data back into your CRM (e.g., Salesforce, HubSpot, Zoho CRM) or marketing automation platform. This can be done via CSV import or direct API integration if pre-configured.
  3. Team Briefing: Share these insights with your sales and marketing teams to align on new prioritization strategies and outreach approaches.
  4. Feedback: Provide us with any feedback on the scoring accuracy or suggestions for further refinement. We are committed to optimizing this process for your continued success.

7. Conclusion

The "Contact Data Formatter" workflow has successfully completed its mission. You now possess a powerful, AI-driven lead scoring system that transforms raw contact data into actionable intelligence, enabling your teams to work smarter, not just harder. This strategic advantage will undoubtedly lead to improved conversion rates, increased sales efficiency, and a stronger return on your marketing investments.

Please let us know if you require any assistance with integrating this data or have further questions.

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