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

Import contacts and generate lead scoring

Workflow Execution: Contact Data Formatter - Step 1 of 2

Workflow Description: Import contacts and generate lead scoring

Current Step: crm → import_contacts


1. Step Objective

The primary objective of this step is to securely and accurately import your contact data into your designated CRM system. This foundational step ensures that all necessary contact information is available and properly structured for the subsequent lead scoring process. We aim to achieve data integrity, standardization, and readiness for advanced analytics.


2. Input Requirements & Data Preparation

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

2.1. Preferred File Format

  • CSV (Comma Separated Values): Highly recommended for its simplicity and universal compatibility.
  • Excel (XLSX/XLS): Acceptable, please ensure data is on the first sheet and headers are in the first row.

2.2. Mandatory Fields

The following fields are crucial for accurate import and subsequent lead scoring. Please ensure these are present and populated for all records:

  • Email Address: Essential for unique identification and deduplication.
  • First Name: For personalization and record identification.
  • Last Name: For personalization and record identification.

2.3. Highly Recommended Fields (for Enhanced Lead Scoring)

Including these fields will significantly improve the accuracy and richness of your lead scoring model:

  • Company Name: Critical for B2B lead scoring.
  • Phone Number: For direct communication.
  • Job Title: Provides insight into role and seniority.
  • Industry: Helps segment leads and tailor scoring.
  • Lead Source: (e.g., "Website Form", "Trade Show [Event Name]", "Referral", "Cold Call"). This is extremely important for understanding lead origin and weighting.
  • City, State, Country: For geographic segmentation.
  • Website: Company website for additional research.
  • Creation Date: The date the contact was originally created/acquired (if available from your source system).

2.4. Data Quality & Formatting Guidelines

  • Consistency: Ensure consistent formatting across all fields (e.g., date formats like YYYY-MM-DD, phone numbers with country codes).
  • Cleanliness: Remove any extraneous characters, leading/trailing spaces, or placeholder values (e.g., "N/A", "Unknown") where actual data is missing.
  • Uniqueness: While our process handles deduplication, starting with a clean dataset minimizes potential issues.
  • Header Row: The first row of your file must contain clear, descriptive column headers.

3. Import Process Overview (What We Do)

Upon receiving your data, our team will execute the following steps:

  1. Initial Data Review: We will perform a preliminary check of your file for format compliance, header clarity, and general data structure.
  2. Automated Data Validation:

* Syntax Check: Validation of email addresses and phone number formats.

* Mandatory Field Check: Ensuring all mandatory fields are populated.

* Data Type Validation: Verifying that data types align with CRM field requirements (e.g., numbers for phone, text for names).

  1. Deduplication Strategy: We will utilize Email Address as the primary key for deduplication. In cases where an email already exists in your CRM, we will apply your specified preference (see "Actionable Items" below).
  2. Data Mapping: Your column headers will be mapped to the corresponding fields within your CRM system. We will confirm any non-standard mappings with you.
  3. Data Transformation (if necessary): Minor adjustments such as trimming whitespace, standardizing case for specific fields (e.g., 'Country' to 'US' instead of 'usa'), or simple data type conversions will be applied as agreed upon.
  4. Secure CRM Import: The validated and prepared data will be securely imported into your CRM.

4. Output of This Step

Upon completion of the import process, you will receive:

  • Import Confirmation: A notification that your contact data has been successfully loaded into the CRM.
  • Detailed Import Summary Report: This report will include:

* Total records processed.

* Number of records successfully imported.

* Number of duplicate records identified and how they were handled (e.g., updated, skipped).

* Number of records that failed to import, along with specific reasons for failure (e.g., invalid email, missing mandatory field) to facilitate review and correction.

  • CRM Visibility: Your imported contacts will be immediately accessible and searchable within your CRM system.

5. Next Steps & Dependencies

Successful completion of this crm → import_contacts step is critical and serves as the foundation for the next stage of the workflow. The quality and comprehensiveness of the data imported directly impact the accuracy, relevance, and effectiveness of the lead scoring model to be generated in Step 2.


6. Actionable Items for You

To proceed with Step 1, please provide the following:

  1. Contact Data File: Submit your contact data file (preferably CSV or Excel) via our secure file transfer portal [Link to Secure Portal, or agreed method].
  2. Deduplication Preference: Please specify how you would like us to handle records where the Email Address already exists in your CRM:

* Option A: Update existing contact records with new data from the import file.

* Option B: Skip new records that match an existing email, retaining the original CRM record.

* Option C: Flag duplicates for your manual review after import.

  1. Custom Field Mapping (if applicable): If your file contains custom fields not typically found in standard CRM setups, please provide clear instructions on how these should be mapped to existing or new custom fields within your CRM.

7. Estimated Timeline

Upon receipt of your complete data file and all required clarifications (deduplication preference, custom field mapping), this import step is typically completed within 24-48 business hours, depending on the volume and complexity of the data.


8. Support & Contact

Should you have any questions regarding these requirements or need assistance with data preparation, please do not hesitate to contact your dedicated project manager at [Project Manager Email/Contact Info] or our support team at [Support Email/Phone Number].

crm Output

Workflow Completion: Contact Data Formatter - AI Lead Scoring

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

Our advanced AI model has processed your imported contact data, generating sophisticated lead scores to help you prioritize and engage with your prospects more effectively.


1. Step Overview: CRM to AI Lead Scoring

Workflow: Contact Data Formatter

Step: crm → ai_lead_scoring

Description: Imported contact data from your CRM has been analyzed by our proprietary AI lead scoring engine. This process assigns a predictive score to each contact, indicating their likelihood of converting into a customer based on various attributes and historical patterns.


2. Purpose of AI Lead Scoring

The primary goal of this step is to transform raw contact data into actionable intelligence. By leveraging AI, we move beyond simple demographic filters to identify genuinely promising leads. This enables your sales and marketing teams to:

  • Prioritize Efforts: Focus resources on leads with the highest conversion potential.
  • Personalize Engagement: Tailor messaging and outreach strategies based on lead quality.
  • Optimize Resource Allocation: Reduce wasted time on low-potential leads.
  • Improve Conversion Rates: Shorten sales cycles and increase overall revenue.

3. Lead Scoring Methodology

Our AI lead scoring model utilizes a multi-faceted approach, analyzing a comprehensive set of data points to generate an accurate score for each contact. Key factors considered include (but are not limited to):

  • Demographic Data: Job title, industry, company size, location.
  • Firmographic Data: Company revenue, employee count, industry sector, technological stack (if available).
  • Engagement History (if provided): Website visits, content downloads, email opens/clicks, past interactions.
  • Behavioral Patterns: How similar contacts have interacted and converted in the past.
  • Source of Lead: How the lead was acquired (e.g., organic search, paid ad, referral).

The model continuously learns and refines its scoring logic based on the outcomes of previous leads, ensuring increasing accuracy over time.


4. Deliverables & Results

Your contact data has been enriched with the following lead scoring attributes:

4.1. Lead Score

  • Range: Each contact has been assigned a numerical score ranging from 0 to 100.
  • Interpretation:

* 80-100 (High Potential): These leads exhibit strong indicators of conversion likelihood. They align closely with your ideal customer profile and/or have shown significant engagement.

* 50-79 (Medium Potential): These leads show promise but may require further nurturing or qualification. They fit some criteria but might lack certain key indicators.

* 0-49 (Low Potential): These leads are less likely to convert in the immediate future. They may be early-stage or not a strong fit for your offerings.

4.2. Lead Score Tier

For immediate actionability, we have categorized each lead into one of three tiers:

  • Tier 1: Hot Leads (Score 80-100)

* Description: Top-priority leads, highly qualified, and conversion-ready.

* Action: Immediate sales outreach, personalized high-value offers, direct follow-up.

  • Tier 2: Warm Leads (Score 50-79)

* Description: Qualified leads that require nurturing and further engagement.

* Action: Targeted marketing campaigns, educational content, event invitations, follow-up after initial nurturing.

  • Tier 3: Cold Leads (Score 0-49)

* Description: Leads that are not a good fit or require long-term nurturing.

* Action: Long-term drip campaigns, brand awareness content, re-evaluation at a later stage.

4.3. Key Scoring Factors (Illustrative Example)

While the AI considers numerous factors, for each lead, the system identifies the most influential attributes contributing to their score. This helps in understanding why a lead received a particular score.

Example:

  • Contact Name: Jane Doe
  • Lead Score: 92 (Hot Lead)
  • Top Contributing Factors:

* High company revenue (Firmographic)

* Job title: "Head of Marketing" (Demographic, matches ideal persona)

* Downloaded "Advanced Solutions Guide" (Engagement)

* Website visit duration: 5+ minutes (Behavioral)

This information is available for review within the integrated CRM system or accompanying report.


5. Integration and Accessibility

The generated Lead Scores and Lead Score Tiers have been successfully integrated directly back into your CRM system. You can now view these new attributes on each contact's profile.

  • CRM Field Names:

* AI_Lead_Score (Numerical: 0-100)

* AI_Lead_Tier (Text: Hot Lead, Warm Lead, Cold Lead)


6. Actionable Recommendations

To maximize the value of this lead scoring output, we recommend the following strategies:

  • Sales Team Focus:

* Hot Leads: Prioritize these leads for immediate, personalized outreach. Equip your sales team with the "Key Scoring Factors" to tailor their pitch effectively.

* Warm Leads: Assign these to sales representatives for follow-up after they have engaged with a few nurturing touches from marketing.

* Cold Leads: Re-evaluate periodically. Sales should generally not spend direct time on these unless they show renewed engagement.

  • Marketing Team Strategy:

* Hot Leads: Develop specific campaigns for accelerating conversion (e.g., demo offers, free trials, direct consultations).

* Warm Leads: Design nurturing campaigns with relevant content (e.g., case studies, webinars, product feature deep-dives) to move them towards 'Hot' status.

* Cold Leads: Implement long-term drip campaigns focused on brand awareness and broad industry insights to keep them engaged without heavy resource investment.

  • Automate Workflows: Configure your CRM to automatically trigger actions based on AI_Lead_Tier (e.g., assign hot leads to a specific sales queue, add warm leads to a nurturing email sequence).
  • Performance Monitoring: Track the conversion rates of each lead tier to validate the scoring model's effectiveness and identify areas for further optimization.

7. Next Steps & Future Considerations

  • Review and Feedback: We encourage your sales and marketing teams to review the assigned scores and tiers. Your feedback is crucial for continuous model improvement.
  • Model Refinement: As your business evolves and more conversion data is gathered, our AI model can be further trained and refined to increase its accuracy and adapt to new market dynamics.
  • Advanced Segmentation: Consider combining lead scores with other contact attributes (e.g., industry, company size) for even more granular segmentation and hyper-personalized campaigns.
  • Automated Triggers: Explore setting up automated notifications or task assignments within your CRM when a lead's score changes significantly (e.g., a "Warm Lead" becomes "Hot").

We are confident that this AI-driven lead scoring will significantly enhance your sales and marketing efficiency, driving better engagement and higher conversion rates. Please reach out to your PantheraHive account manager if you have any questions or require further assistance.

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