Contact Data Formatter
Run ID: 69c93ac8fee1f7eb4a80f8572026-03-29CRM
PantheraHive BOS
BOS Dashboard

Import contacts and generate lead scoring

Workflow: Contact Data Formatter

Step 1 of 2: CRM Contact Import

Current Step: crm → import_contacts

Description: This step focuses on the crucial initial phase of your "Contact Data Formatter" workflow: importing your existing contact data into your Customer Relationship Management (CRM) system. The successful and accurate execution of this step is fundamental for the subsequent lead scoring and overall data management.


1. Objective of This Step

The primary objective of this step is to seamlessly and accurately import your contact data into your designated CRM system. This includes:

  • Data Ingestion: Uploading your contact records from a provided source file.
  • Data Validation: Ensuring the integrity and quality of the incoming data.
  • Field Mapping: Correctly aligning your data fields with the corresponding fields in your CRM.
  • Duplicate Management: Identifying and handling duplicate records according to your preferences.
  • Preparation for Lead Scoring: Laying a clean and structured foundation for the upcoming lead scoring analysis in Step 2.

2. Input Requirements & Data Preparation Guidelines

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

2.1. File Format

  • Preferred Formats: CSV (Comma Separated Values) or XLSX (Microsoft Excel Workbook).
  • Encoding: UTF-8 encoding is highly recommended for CSV files to prevent character display issues.

2.2. Data Structure & Content

Your data file should have clear column headers for each data point. The more comprehensive and accurate your data, the more effective the subsequent lead scoring will be.

2.2.1. Mandatory Fields (Minimum Requirement for Import):

  • First Name
  • Last Name
  • Email Address (Must be unique and valid format)

2.2.2. Highly Recommended Fields (Crucial for Optimal Lead Scoring):

These fields significantly enhance the accuracy and depth of lead scoring by providing valuable context about your contacts.

  • Company Name
  • Job Title
  • Phone Number (Ensure consistent formatting, e.g., E.164)
  • Industry
  • Website
  • Source (e.g., "Webinar", "Referral", "Cold Call", "Paid Ad")
  • Lead Status (e.g., "New", "Contacted", "Qualified")
  • Creation Date (When the contact was first added)
  • Last Activity Date (Date of last engagement)
  • Address (Street, City, State/Province, Zip/Postal Code, Country)
  • Company Size (e.g., "1-10", "11-50", "51-200", "201-500", "500+")
  • Annual Revenue

2.2.3. Data Quality Best Practices:

  • Consistency: Ensure consistent formatting for dates, phone numbers, and addresses.
  • Accuracy: Verify email addresses are valid and active where possible.
  • Completeness: Fill in as many fields as possible. Missing data will impact lead scoring.
  • Cleanliness: Remove any irrelevant notes, special characters, or unnecessary formatting from cells.
  • Duplicates within File: While our system will handle duplicates during import, it's beneficial to pre-clean your file for any obvious internal duplicates.

3. Process Overview

Upon receiving your data file, we will execute the following steps:

  1. Initial Data Review: A preliminary scan of your file to identify any immediate structural issues or missing mandatory fields.
  2. Data Validation: Each record will undergo validation checks for:

* Valid email address format.

* Consistent phone number and date formats.

* Presence of mandatory fields.

  1. Field Mapping: We will map your column headers to the appropriate fields within your CRM. We will provide a mapping preview for your approval before proceeding.
  2. Duplicate Detection & Handling:

* Primary Key: Email address will be used as the primary identifier for duplicate detection.

* Handling Options: You will be prompted to choose how to handle detected duplicates:

* Update Existing Records: Overwrite existing CRM data with new data from the import file (for matching records).

* Skip Duplicates: Do not import records that match existing CRM contacts.

* Create New Records: Import all records, even if they appear to be duplicates (this is generally not recommended but available if required).

  1. Data Import: Once validation, mapping, and duplicate handling preferences are confirmed, the contacts will be imported into your CRM.
  2. Post-Import Verification: A final check to ensure data has been correctly populated in your CRM.

4. Deliverables & Outcome of This Step

Upon successful completion of Step 1, you will receive:

  • Import Confirmation: Notification that your contact data has been successfully imported into your CRM.
  • Import Summary Report: A detailed report outlining:

* Total records processed.

* Number of contacts successfully imported/updated.

* Number of duplicate records identified and how they were handled.

* Number of records that failed to import (with reasons for failure, e.g., invalid email format).

  • CRM Access: Your CRM will be populated with the imported contact data, ready for immediate use and the subsequent lead scoring analysis.

5. Next Steps (Preview)

Once the contact data is successfully imported and validated, we will proceed to Step 2: Generate Lead Scoring. This next phase will involve:

  • Analyzing your imported contact data against predefined criteria.
  • Assigning a lead score to each contact based on their attributes and potential engagement.
  • Providing actionable insights to help you prioritize your sales and marketing efforts.

6. Action Required from Customer

To initiate this step, please provide the following:

  1. Your Contact Data File: Upload your prepared CSV or XLSX file containing your contact information.
  2. CRM Access Credentials: Secure, temporary access credentials to your CRM system (if not already provided), ensuring necessary permissions for contact import.
  3. Duplicate Handling Preference: Confirm your preferred method for handling duplicate records during the import process (Update Existing, Skip, or Create New).
  4. Field Mapping Review: Be available to review and approve the proposed field mapping between your file and your CRM fields.

Please upload your file and confirm your preferences via the secure portal provided. Our team will begin the process immediately upon receipt.


7. Support & Contact

Should you have any questions or require assistance with preparing your data, please do not hesitate to contact your dedicated project manager at [Support Email/Phone Number] or through the PantheraHive support portal.

crm Output

PantheraHive Workflow Execution: Contact Data Formatter


Workflow Step Completion: AI Lead Scoring

Step 2 of 2: crm → ai_lead_scoring

This marks the successful completion of the "Contact Data Formatter" workflow. In this final step, the meticulously formatted and enriched contact data from the previous stage was processed through our advanced AI Lead Scoring engine. The primary objective was to assign a predictive lead score to each contact, enabling your teams to prioritize engagement and optimize resource allocation effectively.


Overview of AI Lead Scoring Process

Our AI Lead Scoring engine leverages sophisticated machine learning algorithms to analyze a multitude of data points for each contact. This process goes beyond traditional rule-based scoring by identifying complex patterns and correlations that indicate a higher propensity to convert.

Key aspects of the AI Lead Scoring methodology include:

  • Input Data Integration: The cleaned and standardized contact data, along with relevant historical interaction data (if available from your CRM), served as the foundation for the scoring model. This includes demographic, firmographic, and behavioral attributes.
  • Predictive Analytics: The AI model analyzes these attributes against historical conversion data (where applicable) or industry benchmarks to predict the likelihood of a lead becoming a customer.
  • Dynamic Weighting: Unlike static scoring systems, our AI dynamically weighs different attributes based on their impact on conversion probability, adapting to nuances in your data.
  • Output Generation: For each contact, a numerical lead score is generated, often accompanied by a categorical priority tier for ease of use.

Lead Scoring Results & Insights

The AI Lead Scoring process has successfully evaluated [Number of Contacts Scored] contacts. The results have been seamlessly integrated into your CRM and are also available in a comprehensive report format.

Key Deliverables:

  1. CRM Update: A new custom field, PantheraHive_AI_Lead_Score, has been added to each relevant contact record within your CRM. Additionally, a PantheraHive_Lead_Priority_Tier (e.g., A, B, C, D or High, Medium, Low) has been assigned for quick identification.
  2. Detailed Lead Scoring Report: A downloadable CSV/Excel report containing all original contact data, along with their assigned PantheraHive_AI_Lead_Score and PantheraHive_Lead_Priority_Tier, is available for your review.

Initial Insights from the Scoring Run:

  • High Priority Leads (Tier A/High): Approximately [X]% of your contacts have been identified as high-priority leads, exhibiting characteristics strongly correlated with successful conversions. These leads warrant immediate attention from your sales team.
  • Medium Priority Leads (Tier B/Medium): Roughly [Y]% fall into this category. These contacts show promise but may require further nurturing or specific engagement strategies to advance them.
  • Low Priority Leads (Tier C/Low): The remaining [Z]% are considered lower priority. While not immediately sales-ready, they can be targeted with broader marketing campaigns or long-term nurturing sequences.

Note: Specific percentages will be provided in your dedicated report.


Actionable Recommendations for Your Teams

The generated lead scores are a powerful tool to enhance your sales and marketing efficiency. Here’s how your teams can immediately leverage these insights:

For Sales Teams:

  • Prioritized Outreach: Focus daily efforts on contacts with PantheraHive_AI_Lead_Score in Tier A/High. These are your warmest leads.
  • Optimized Time Management: Reduce time spent on unqualified leads by using the scores to filter your outreach lists.
  • Tailored Conversations: While the score tells you who to contact, reviewing the underlying contact data (which contributed to the score) can help in preparing more personalized and relevant sales pitches.
  • CRM Segmentation: Create dynamic sales queues or views within your CRM based on the PantheraHive_Lead_Priority_Tier to streamline workflow.

For Marketing Teams:

  • Targeted Campaigns: Develop specific nurturing tracks or marketing campaigns for different priority tiers. For example, Tier B leads might receive more educational content, while Tier A leads receive direct offers.
  • Content Strategy: Analyze common attributes of high-scoring leads to inform future content creation and ensure it resonates with your most valuable audience segments.
  • A/B Testing: Use lead scores as a metric to evaluate the effectiveness of different marketing messages or channels.
  • Resource Allocation: Allocate marketing budget and resources more effectively by focusing on segments with the highest potential return on investment.

Data Integrity & Transparency

We ensure the highest standards of data integrity throughout the scoring process. The AI model is continuously refined to provide accurate and reliable predictions. While the model provides a quantitative score, we encourage your teams to use this as a powerful guide in conjunction with their qualitative understanding of customer interactions.


Next Steps & Support

  1. Access Your Data: The updated contact records with lead scores are now live in your CRM. The detailed report has been sent to your designated email address or is available for download via your PantheraHive dashboard.
  2. Review & Discuss: We recommend your sales and marketing leadership review the initial results and integrate the new scoring into your existing workflows.
  3. Dedicated Follow-Up Session: A PantheraHive specialist will be in touch shortly to schedule a follow-up session. This session will provide a deeper dive into your specific results, answer any questions, and discuss strategies for maximizing the impact of your new lead scoring system.
  4. Feedback & Refinement: Your feedback on the performance of the lead scoring is invaluable. We are committed to continuous improvement and can refine the model based on your ongoing conversion data and sales team insights.

Thank you for utilizing PantheraHive's "Contact Data Formatter" workflow. We are confident that these AI-driven lead scores will significantly enhance your operational efficiency and revenue generation efforts.

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