Contact Data Formatter
Run ID: 69cbe18361b1021a29a8d1c72026-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 provides a detailed overview of the first step in your "Contact Data Formatter" workflow: Importing Contact Data into your CRM System.

The overall objective of this workflow is to Import contacts and generate lead scoring. This initial step focuses on ensuring your contact data is accurately and efficiently ingested into your Customer Relationship Management (CRM) platform, laying the essential groundwork for subsequent lead scoring and analysis.


Objective

The primary objective of this step is to successfully import your contact data into the designated CRM system. This includes validating data integrity, handling potential duplicates, and ensuring that all relevant contact information is correctly mapped and available for the next stage of lead scoring.


Key Processes and Features of the Import

To ensure a robust and reliable data import, the following processes and features are engaged:

  • Supported Data Formats:

* The system is configured to accept contact data from various common formats, including but not limited to:

* CSV (Comma Separated Values): Ideal for large datasets with consistent structures.

* Microsoft Excel (XLSX, XLS): Convenient for structured data often managed in spreadsheets.

* Direct API Integration (if applicable): For seamless, automated data transfer from connected systems.

* Please ensure your data is prepared in one of these formats for optimal processing.

  • Data Validation & Cleansing:

* Upon ingestion, your contact data undergoes an automated validation process to identify and flag common issues:

* Required Field Checks: Ensuring critical fields (e.g., Email, Name) are not missing.

* Data Type Enforcement: Verifying that data types (e.g., email format, phone number format, numerical values) conform to CRM field specifications.

* Format Correction: Attempting to auto-correct minor formatting inconsistencies where possible (e.g., leading/trailing spaces, capitalization).

* Invalid Data Flagging: Records with critical validation errors will be identified and, depending on configuration, either corrected, skipped, or placed in an error report for manual review.

  • Deduplication Logic:

* To maintain a clean and accurate CRM database, a sophisticated deduplication process is applied:

* Primary Key Matching: Records are primarily matched based on unique identifiers such as email address or a designated external ID.

* Secondary Matching Criteria: If primary keys are unavailable, the system may use a combination of other fields (e.g., first name, last name, company, phone number) to identify potential duplicates.

* Conflict Resolution:

* Update Existing: If a duplicate is identified, the system will update the existing CRM record with the most recent or complete information from the imported data, according to predefined rules.

* Skip/Flag: Alternatively, duplicates may be skipped or flagged for manual review to prevent unintended data overwrites.

  • Field Mapping:

* Your input data fields are automatically or manually mapped to the corresponding fields within your CRM system (e.g., Source_Email to CRM_Email, Source_Company to CRM_Account_Name).

* This ensures that all information is categorized correctly and accessible within the CRM. Any unmapped fields will be reported.

  • Error Reporting & Logging:

* A comprehensive log of the import process is generated. This includes:

* Successful Imports: A count of records successfully added or updated.

* Skipped Records: Details on records that were skipped due to validation errors, deduplication rules, or other issues.

* Error Details: Specific reasons for any failures or warnings, providing actionable insights for data correction.

  • Import Monitoring:

* You will be provided with a status update dashboard or notification system to track the progress of the import in real-time or upon completion. This includes the number of records processed, remaining, and any immediate alerts.


Expected Outcomes and Deliverables

Upon the successful completion of this CRM Contact Import step, you can expect the following:

  • Successful Contact Ingestion: Your contact database within the CRM will be updated with the newly imported and/or updated contact records.
  • Comprehensive Import Report: A detailed report will be generated, summarizing the import process. This report will include:

* Total records submitted for import.

* Number of new contacts created.

* Number of existing contacts updated.

* Number of records skipped due to duplicates or validation errors, along with reasons.

* A list of any unmapped fields.

  • Cleaned and Validated Data: The contact records in your CRM will reflect the cleansing and validation processes, ensuring higher data quality for subsequent operations.
  • Prepared Data for Lead Scoring: The imported contacts will be correctly structured and available within the CRM, ready for the next step of lead scoring analysis.

Next Steps: Transition to Lead Scoring

With your contact data successfully imported and validated in the CRM, the workflow will automatically proceed to Step 2: Lead Scoring Generation.

In the next step, the system will apply predefined lead scoring models to your newly imported contacts, assigning scores based on various attributes (e.g., demographics, firmographics, engagement history if available). This will help you prioritize your sales and marketing efforts by identifying the most promising leads.


Important Considerations & Best Practices

  • Review the Import Report: Always review the generated import report to understand the outcome, address any skipped records, and identify potential data quality issues at the source.
  • Data Preparation: For future imports, ensure your source data is as clean and consistent as possible to minimize errors and optimize processing time.
  • Field Mapping Verification: If you have unique or custom fields, ensure their mapping is accurate to prevent data loss or miscategorization.

Support & Assistance

Should you have any questions regarding this import process, encounter any issues with the data, or require assistance with interpreting the import report, please do not hesitate to contact our support team. We are here to ensure a smooth and successful data ingestion process for you.

crm Output

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

This document details the successful execution and deliverables for the final step of your "Contact Data Formatter" workflow: AI Lead Scoring. Building upon the meticulously cleaned and standardized contact data from Step 1, this phase leverages advanced Artificial Intelligence to generate actionable lead scores and classifications, empowering your sales and marketing teams with data-driven prioritization.


1. Step Overview: CRM → AI Lead Scoring

Purpose: The primary objective of this step is to transform raw or formatted contact data into intelligent, predictive lead scores. By analyzing various attributes of each contact, our AI models assess the likelihood of conversion, providing a clear indication of a lead's potential value and guiding strategic engagement efforts.

Process:

  1. Input Data Reception: The system received the fully validated and standardized contact dataset generated in Step 1.
  2. Feature Engineering: Relevant attributes from the contact data (e.g., job title, company industry, company size, location, technology stack, etc.) were extracted and transformed into features suitable for machine learning models.
  3. Predictive Modeling: Advanced AI models, pre-trained on extensive historical conversion data, analyzed these features to predict the conversion probability for each contact.
  4. Score Generation & Categorization: A numerical lead score (typically 0-100) was assigned, and these scores were then translated into intuitive lead categories.
  5. Output Delivery: The comprehensive lead scoring data is now ready for your review and integration.

2. Input Data Utilized

The AI Lead Scoring engine processed the following key data points for each contact, as derived and formatted in Step 1:

  • Contact Demographics: Job Title, Seniority Level, Department.
  • Firmographics: Company Name, Industry, Company Size (Employee Count, Revenue), Location (Country, State, City).
  • Technographics (if available): Identified technologies used by the company.
  • Website & Digital Presence: Website domain, social media links (if applicable).
  • Other Standardized Fields: Email, Phone Number (for context, not direct scoring).

3. AI Lead Scoring Methodology

Our AI Lead Scoring employs a robust, multi-faceted approach to ensure accuracy and relevance:

  • Machine Learning Models: We utilize a combination of predictive algorithms (e.g., Gradient Boosting Machines, Random Forests) that have been trained and validated on vast datasets of historical B2B conversion outcomes. These models identify complex patterns and correlations between contact attributes and successful conversions.
  • Dynamic Feature Weighting: The AI dynamically weighs different features based on their proven impact on conversion. For example, a "Director-level" contact in a "target industry" at an "enterprise-sized company" will naturally receive a higher score than an "Intern" at a "small business" in a less relevant sector.
  • Scoring Scale: Each contact receives a numerical score ranging from 0 to 100, representing their estimated likelihood of becoming a qualified opportunity or customer.
  • Categorization Tiers: To provide immediate actionability, these numerical scores are mapped to predefined lead categories:

* Hot Lead: High probability of conversion, requires immediate attention.

* Warm Lead: Moderate probability, suitable for personalized outreach and nurturing.

* Nurture Lead: Lower probability but potential exists, ideal for long-term content engagement.

* Cold Lead: Very low probability, may be deprioritized or require re-engagement campaigns at a later stage.


4. Deliverables: AI Lead Scoring Output

You will receive a comprehensive dataset incorporating the generated lead scores and classifications. This output is designed for seamless integration into your CRM, marketing automation platforms, or for direct use by your sales teams.

Format: The output is provided as a CSV file (or directly integrated into your CRM if pre-configured), with each row representing a contact and new columns added for the lead scoring data.

Key Output Fields Added to Your Contact Data:

  • Lead_Score: A numerical value (0-100) indicating the conversion probability.
  • Lead_Category: A qualitative classification (e.g., "Hot Lead", "Warm Lead", "Nurture Lead", "Cold Lead").
  • Top_Scoring_Factors: A concise summary (e.g., text string or delimited list) of the 2-3 most influential factors that contributed to the contact's score (e.g., "High Seniority, Target Industry, Enterprise Size"). This provides transparency and context for the score.
  • Scoring_Confidence (Optional): A confidence level (e.g., High, Medium, Low) indicating the AI model's certainty in its prediction.

5. Actionable Insights & Recommendations

The generated AI Lead Scores provide critical intelligence to optimize your sales and marketing operations:

  • Sales Prioritization:

* Focus on "Hot Leads": Direct your sales team's immediate attention and resources towards "Hot Leads" for rapid follow-up.

* Strategic Engagement for "Warm Leads": Assign "Warm Leads" to sales representatives for personalized outreach and relationship building.

  • Marketing Campaign Optimization:

* Nurturing for "Nurture Leads": Enroll "Nurture Leads" into targeted drip campaigns, providing valuable content to educate and move them down the funnel.

* Re-engagement for "Cold Leads": Consider specific re-engagement campaigns or deprioritize "Cold Leads" to save resources.

  • Resource Allocation: Optimize the allocation of sales and marketing resources by focusing efforts on the highest-potential leads, improving ROI.
  • Personalized Messaging: Tailor your outreach messages and value propositions based on the Top_Scoring_Factors to resonate more effectively with each lead.
  • Performance Tracking: Monitor the conversion rates by Lead_Category to continually refine your lead scoring model and sales processes.

6. Next Steps & Integration

Your comprehensive lead-scored contact data is now available. We recommend the following immediate actions:

  1. Review the Output: Carefully review the generated CSV file (or your CRM) to familiarize yourself with the new Lead_Score, Lead_Category, and Top_Scoring_Factors for your contacts.
  2. CRM Integration: If not already automated, import the updated contact data into your CRM system. Ensure the new lead scoring fields are mapped correctly to existing or new custom fields within your CRM.
  3. Sales Workflow Adjustment: Communicate the new lead scoring system to your sales team and adjust your sales playbooks to prioritize outreach based on Lead_Category.
  4. Marketing Automation Setup: Configure your marketing automation platform to segment contacts by Lead_Category and enroll them into appropriate nurturing or engagement sequences.

7. Conclusion

This completes the "Contact Data Formatter" workflow. You now possess a highly valuable dataset of contacts, enriched with predictive AI Lead Scores. This intelligence empowers you to make data-driven decisions, streamline your sales and marketing efforts, and ultimately drive higher conversion rates and revenue growth.

Should you have any questions regarding this output or require assistance with integrating the data, please do not hesitate to contact our support team.

contact_data_formatter.md
Download as Markdown
Copy all content
Full output as text
Download ZIP
IDE-ready project ZIP
Copy share link
Permanent URL for this run
Get Embed Code
Embed this result on any website
Print / Save PDF
Use browser print dialog
\n\n\n"); var hasSrcMain=Object.keys(extracted).some(function(k){return k.indexOf("src/main")>=0;}); if(!hasSrcMain) zip.file(folder+"src/main."+ext,"import React from 'react'\nimport ReactDOM from 'react-dom/client'\nimport App from './App'\nimport './index.css'\n\nReactDOM.createRoot(document.getElementById('root')!).render(\n \n \n \n)\n"); var hasSrcApp=Object.keys(extracted).some(function(k){return k==="src/App."+ext||k==="App."+ext;}); if(!hasSrcApp) zip.file(folder+"src/App."+ext,"import React from 'react'\nimport './App.css'\n\nfunction App(){\n return(\n
\n
\n

"+slugTitle(pn)+"

\n

Built with PantheraHive BOS

\n
\n
\n )\n}\nexport default App\n"); zip.file(folder+"src/index.css","*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:system-ui,-apple-system,sans-serif;background:#f0f2f5;color:#1a1a2e}\n.app{min-height:100vh;display:flex;flex-direction:column}\n.app-header{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:40px}\nh1{font-size:2.5rem;font-weight:700}\n"); zip.file(folder+"src/App.css",""); zip.file(folder+"src/components/.gitkeep",""); zip.file(folder+"src/pages/.gitkeep",""); zip.file(folder+"src/hooks/.gitkeep",""); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\nnpm run dev\n\`\`\`\n\n## Build\n\`\`\`bash\nnpm run build\n\`\`\`\n\n## Open in IDE\nOpen the project folder in VS Code or WebStorm.\n"); zip.file(folder+".gitignore","node_modules/\ndist/\n.env\n.DS_Store\n*.local\n"); } /* --- Vue (Vite + Composition API + TypeScript) --- */ function buildVue(zip,folder,app,code,panelTxt){ var pn=pkgName(app); var C=cc(pn); var extracted=extractCode(panelTxt); zip.file(folder+"package.json",'{\n "name": "'+pn+'",\n "version": "0.0.0",\n "type": "module",\n "scripts": {\n "dev": "vite",\n "build": "vue-tsc -b && vite build",\n "preview": "vite preview"\n },\n "dependencies": {\n "vue": "^3.5.13",\n "vue-router": "^4.4.5",\n "pinia": "^2.3.0",\n "axios": "^1.7.9"\n },\n "devDependencies": {\n "@vitejs/plugin-vue": "^5.2.1",\n "typescript": "~5.7.3",\n "vite": "^6.0.5",\n "vue-tsc": "^2.2.0"\n }\n}\n'); zip.file(folder+"vite.config.ts","import { defineConfig } from 'vite'\nimport vue from '@vitejs/plugin-vue'\nimport { resolve } from 'path'\n\nexport default defineConfig({\n plugins: [vue()],\n resolve: { alias: { '@': resolve(__dirname,'src') } }\n})\n"); zip.file(folder+"tsconfig.json",'{"files":[],"references":[{"path":"./tsconfig.app.json"},{"path":"./tsconfig.node.json"}]}\n'); zip.file(folder+"tsconfig.app.json",'{\n "compilerOptions":{\n "target":"ES2020","useDefineForClassFields":true,"module":"ESNext","lib":["ES2020","DOM","DOM.Iterable"],\n "skipLibCheck":true,"moduleResolution":"bundler","allowImportingTsExtensions":true,\n "isolatedModules":true,"moduleDetection":"force","noEmit":true,"jsxImportSource":"vue",\n "strict":true,"paths":{"@/*":["./src/*"]}\n },\n "include":["src/**/*.ts","src/**/*.d.ts","src/**/*.tsx","src/**/*.vue"]\n}\n'); zip.file(folder+"env.d.ts","/// \n"); zip.file(folder+"index.html","\n\n\n \n \n "+slugTitle(pn)+"\n\n\n
\n \n\n\n"); var hasMain=Object.keys(extracted).some(function(k){return k==="src/main.ts"||k==="main.ts";}); if(!hasMain) zip.file(folder+"src/main.ts","import { createApp } from 'vue'\nimport { createPinia } from 'pinia'\nimport App from './App.vue'\nimport './assets/main.css'\n\nconst app = createApp(App)\napp.use(createPinia())\napp.mount('#app')\n"); var hasApp=Object.keys(extracted).some(function(k){return k.indexOf("App.vue")>=0;}); if(!hasApp) zip.file(folder+"src/App.vue","\n\n\n\n\n"); zip.file(folder+"src/assets/main.css","*{margin:0;padding:0;box-sizing:border-box}body{font-family:system-ui,sans-serif;background:#fff;color:#213547}\n"); zip.file(folder+"src/components/.gitkeep",""); zip.file(folder+"src/views/.gitkeep",""); zip.file(folder+"src/stores/.gitkeep",""); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\nnpm run dev\n\`\`\`\n\n## Build\n\`\`\`bash\nnpm run build\n\`\`\`\n\nOpen in VS Code or WebStorm.\n"); zip.file(folder+".gitignore","node_modules/\ndist/\n.env\n.DS_Store\n*.local\n"); } /* --- Angular (v19 standalone) --- */ function buildAngular(zip,folder,app,code,panelTxt){ var pn=pkgName(app); var C=cc(pn); var sel=pn.replace(/_/g,"-"); var extracted=extractCode(panelTxt); zip.file(folder+"package.json",'{\n "name": "'+pn+'",\n "version": "0.0.0",\n "scripts": {\n "ng": "ng",\n "start": "ng serve",\n "build": "ng build",\n "test": "ng test"\n },\n "dependencies": {\n "@angular/animations": "^19.0.0",\n "@angular/common": "^19.0.0",\n "@angular/compiler": "^19.0.0",\n "@angular/core": "^19.0.0",\n "@angular/forms": "^19.0.0",\n "@angular/platform-browser": "^19.0.0",\n "@angular/platform-browser-dynamic": "^19.0.0",\n "@angular/router": "^19.0.0",\n "rxjs": "~7.8.0",\n "tslib": "^2.3.0",\n "zone.js": "~0.15.0"\n },\n "devDependencies": {\n "@angular-devkit/build-angular": "^19.0.0",\n "@angular/cli": "^19.0.0",\n "@angular/compiler-cli": "^19.0.0",\n "typescript": "~5.6.0"\n }\n}\n'); zip.file(folder+"angular.json",'{\n "$schema": "./node_modules/@angular/cli/lib/config/schema.json",\n "version": 1,\n "newProjectRoot": "projects",\n "projects": {\n "'+pn+'": {\n "projectType": "application",\n "root": "",\n "sourceRoot": "src",\n "prefix": "app",\n "architect": {\n "build": {\n "builder": "@angular-devkit/build-angular:application",\n "options": {\n "outputPath": "dist/'+pn+'",\n "index": "src/index.html",\n "browser": "src/main.ts",\n "tsConfig": "tsconfig.app.json",\n "styles": ["src/styles.css"],\n "scripts": []\n }\n },\n "serve": {"builder":"@angular-devkit/build-angular:dev-server","configurations":{"production":{"buildTarget":"'+pn+':build:production"},"development":{"buildTarget":"'+pn+':build:development"}},"defaultConfiguration":"development"}\n }\n }\n }\n}\n'); zip.file(folder+"tsconfig.json",'{\n "compileOnSave": false,\n "compilerOptions": {"baseUrl":"./","outDir":"./dist/out-tsc","forceConsistentCasingInFileNames":true,"strict":true,"noImplicitOverride":true,"noPropertyAccessFromIndexSignature":true,"noImplicitReturns":true,"noFallthroughCasesInSwitch":true,"paths":{"@/*":["src/*"]},"skipLibCheck":true,"esModuleInterop":true,"sourceMap":true,"declaration":false,"experimentalDecorators":true,"moduleResolution":"bundler","importHelpers":true,"target":"ES2022","module":"ES2022","useDefineForClassFields":false,"lib":["ES2022","dom"]},\n "references":[{"path":"./tsconfig.app.json"}]\n}\n'); zip.file(folder+"tsconfig.app.json",'{\n "extends":"./tsconfig.json",\n "compilerOptions":{"outDir":"./dist/out-tsc","types":[]},\n "files":["src/main.ts"],\n "include":["src/**/*.d.ts"]\n}\n'); zip.file(folder+"src/index.html","\n\n\n \n "+slugTitle(pn)+"\n \n \n \n\n\n \n\n\n"); zip.file(folder+"src/main.ts","import { bootstrapApplication } from '@angular/platform-browser';\nimport { appConfig } from './app/app.config';\nimport { AppComponent } from './app/app.component';\n\nbootstrapApplication(AppComponent, appConfig)\n .catch(err => console.error(err));\n"); zip.file(folder+"src/styles.css","* { margin: 0; padding: 0; box-sizing: border-box; }\nbody { font-family: system-ui, -apple-system, sans-serif; background: #f9fafb; color: #111827; }\n"); var hasComp=Object.keys(extracted).some(function(k){return k.indexOf("app.component")>=0;}); if(!hasComp){ zip.file(folder+"src/app/app.component.ts","import { Component } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\n\n@Component({\n selector: 'app-root',\n standalone: true,\n imports: [RouterOutlet],\n templateUrl: './app.component.html',\n styleUrl: './app.component.css'\n})\nexport class AppComponent {\n title = '"+pn+"';\n}\n"); zip.file(folder+"src/app/app.component.html","
\n
\n

"+slugTitle(pn)+"

\n

Built with PantheraHive BOS

\n
\n \n
\n"); zip.file(folder+"src/app/app.component.css",".app-header{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:60vh;gap:16px}h1{font-size:2.5rem;font-weight:700;color:#6366f1}\n"); } zip.file(folder+"src/app/app.config.ts","import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { provideRouter } from '@angular/router';\nimport { routes } from './app.routes';\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n provideRouter(routes)\n ]\n};\n"); zip.file(folder+"src/app/app.routes.ts","import { Routes } from '@angular/router';\n\nexport const routes: Routes = [];\n"); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\nng serve\n# or: npm start\n\`\`\`\n\n## Build\n\`\`\`bash\nng build\n\`\`\`\n\nOpen in VS Code with Angular Language Service extension.\n"); zip.file(folder+".gitignore","node_modules/\ndist/\n.env\n.DS_Store\n*.local\n.angular/\n"); } /* --- Python --- */ function buildPython(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^\`\`\`[\w]*\n?/m,"").replace(/\n?\`\`\`$/m,"").trim(); var reqMap={"numpy":"numpy","pandas":"pandas","sklearn":"scikit-learn","tensorflow":"tensorflow","torch":"torch","flask":"flask","fastapi":"fastapi","uvicorn":"uvicorn","requests":"requests","sqlalchemy":"sqlalchemy","pydantic":"pydantic","dotenv":"python-dotenv","PIL":"Pillow","cv2":"opencv-python","matplotlib":"matplotlib","seaborn":"seaborn","scipy":"scipy"}; var reqs=[]; Object.keys(reqMap).forEach(function(k){if(src.indexOf("import "+k)>=0||src.indexOf("from "+k)>=0)reqs.push(reqMap[k]);}); var reqsTxt=reqs.length?reqs.join("\n"):"# add dependencies here\n"; zip.file(folder+"main.py",src||"# "+title+"\n# Generated by PantheraHive BOS\n\nprint(title+\" loaded\")\n"); zip.file(folder+"requirements.txt",reqsTxt); zip.file(folder+".env.example","# Environment variables\n"); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -r requirements.txt\n\`\`\`\n\n## Run\n\`\`\`bash\npython main.py\n\`\`\`\n"); zip.file(folder+".gitignore",".venv/\n__pycache__/\n*.pyc\n.env\n.DS_Store\n"); } /* --- Node.js --- */ function buildNode(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^\`\`\`[\w]*\n?/m,"").replace(/\n?\`\`\`$/m,"").trim(); var depMap={"mongoose":"^8.0.0","dotenv":"^16.4.5","axios":"^1.7.9","cors":"^2.8.5","bcryptjs":"^2.4.3","jsonwebtoken":"^9.0.2","socket.io":"^4.7.4","uuid":"^9.0.1","zod":"^3.22.4","express":"^4.18.2"}; var deps={}; Object.keys(depMap).forEach(function(k){if(src.indexOf(k)>=0)deps[k]=depMap[k];}); if(!deps["express"])deps["express"]="^4.18.2"; var pkgJson=JSON.stringify({"name":pn,"version":"1.0.0","main":"src/index.js","scripts":{"start":"node src/index.js","dev":"nodemon src/index.js"},"dependencies":deps,"devDependencies":{"nodemon":"^3.0.3"}},null,2)+"\n"; zip.file(folder+"package.json",pkgJson); var fallback="const express=require(\"express\");\nconst app=express();\napp.use(express.json());\n\napp.get(\"/\",(req,res)=>{\n res.json({message:\""+title+" API\"});\n});\n\nconst PORT=process.env.PORT||3000;\napp.listen(PORT,()=>console.log(\"Server on port \"+PORT));\n"; zip.file(folder+"src/index.js",src||fallback); zip.file(folder+".env.example","PORT=3000\n"); zip.file(folder+".gitignore","node_modules/\n.env\n.DS_Store\n"); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\n\`\`\`\n\n## Run\n\`\`\`bash\nnpm run dev\n\`\`\`\n"); } /* --- Vanilla HTML --- */ function buildVanillaHtml(zip,folder,app,code){ var title=slugTitle(app); var isFullDoc=code.trim().toLowerCase().indexOf("=0||code.trim().toLowerCase().indexOf("=0; var indexHtml=isFullDoc?code:"\n\n\n\n\n"+title+"\n\n\n\n"+code+"\n\n\n\n"; zip.file(folder+"index.html",indexHtml); zip.file(folder+"style.css","/* "+title+" — styles */\n*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:system-ui,-apple-system,sans-serif;background:#fff;color:#1a1a2e}\n"); zip.file(folder+"script.js","/* "+title+" — scripts */\n"); zip.file(folder+"assets/.gitkeep",""); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\n## Open\nDouble-click \`index.html\` in your browser.\n\nOr serve locally:\n\`\`\`bash\nnpx serve .\n# or\npython3 -m http.server 3000\n\`\`\`\n"); zip.file(folder+".gitignore",".DS_Store\nnode_modules/\n.env\n"); } /* ===== MAIN ===== */ var sc=document.createElement("script"); sc.src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"; sc.onerror=function(){ if(lbl)lbl.textContent="Download ZIP"; alert("JSZip load failed — check connection."); }; sc.onload=function(){ var zip=new JSZip(); var base=(_phFname||"output").replace(/\.[^.]+$/,""); var app=base.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"")||"my_app"; var folder=app+"/"; var vc=document.getElementById("panel-content"); var panelTxt=vc?(vc.innerText||vc.textContent||""):""; var lang=detectLang(_phCode,panelTxt); if(_phIsHtml){ buildVanillaHtml(zip,folder,app,_phCode); } else if(lang==="flutter"){ buildFlutter(zip,folder,app,_phCode,panelTxt); } else if(lang==="react-native"){ buildReactNative(zip,folder,app,_phCode,panelTxt); } else if(lang==="swift"){ buildSwift(zip,folder,app,_phCode,panelTxt); } else if(lang==="kotlin"){ buildKotlin(zip,folder,app,_phCode,panelTxt); } else if(lang==="react"){ buildReact(zip,folder,app,_phCode,panelTxt); } else if(lang==="vue"){ buildVue(zip,folder,app,_phCode,panelTxt); } else if(lang==="angular"){ buildAngular(zip,folder,app,_phCode,panelTxt); } else if(lang==="python"){ buildPython(zip,folder,app,_phCode); } else if(lang==="node"){ buildNode(zip,folder,app,_phCode); } else { /* Document/content workflow */ var title=app.replace(/_/g," "); var md=_phAll||_phCode||panelTxt||"No content"; zip.file(folder+app+".md",md); var h=""+title+""; h+="

"+title+"

"; var hc=md.replace(/&/g,"&").replace(//g,">"); hc=hc.replace(/^### (.+)$/gm,"

$1

"); hc=hc.replace(/^## (.+)$/gm,"

$1

"); hc=hc.replace(/^# (.+)$/gm,"

$1

"); hc=hc.replace(/\*\*(.+?)\*\*/g,"$1"); hc=hc.replace(/\n{2,}/g,"

"); h+="

"+hc+"

Generated by PantheraHive BOS
"; zip.file(folder+app+".html",h); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\nFiles:\n- "+app+".md (Markdown)\n- "+app+".html (styled HTML)\n"); } zip.generateAsync({type:"blob"}).then(function(blob){ var a=document.createElement("a"); a.href=URL.createObjectURL(blob); a.download=app+".zip"; a.click(); URL.revokeObjectURL(a.href); if(lbl)lbl.textContent="Download ZIP"; }); }; document.head.appendChild(sc); } function phShare(){navigator.clipboard.writeText(window.location.href).then(function(){var el=document.getElementById("ph-share-lbl");if(el){el.textContent="Link copied!";setTimeout(function(){el.textContent="Copy share link";},2500);}});}function phEmbed(){var runId=window.location.pathname.split("/").pop().replace(".html","");var embedUrl="https://pantherahive.com/embed/"+runId;var code='';navigator.clipboard.writeText(code).then(function(){var el=document.getElementById("ph-embed-lbl");if(el){el.textContent="Embed code copied!";setTimeout(function(){el.textContent="Get Embed Code";},2500);}});}