Contact Data Formatter
Run ID: 69cb9b1e61b1021a29a8a9282026-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 outlines the details for Step 1 of 2: CRM Contact Import within your "Contact Data Formatter" workflow. The ultimate goal of this workflow is to import your contact data into your CRM and generate valuable lead scoring insights.


Workflow Overview

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

1. Purpose of This Step: CRM Contact Import

The primary objective of this initial step is to securely and efficiently import your contact data into the designated CRM system. This foundational import is crucial for several reasons:

  • Centralization of Data: Consolidates all your contact information into a single, unified CRM platform, ensuring a comprehensive view of your audience.
  • Foundation for Lead Scoring: Provides the necessary data points (e.g., company, industry, job title, source, activity history) that will be analyzed in the subsequent lead scoring step. Without accurate and complete contact data, lead scoring effectiveness is significantly limited.
  • Data Standardization & Cleansing: During the import process, we will perform initial data validation and standardization to improve overall data quality within your CRM.

2. Required Input from Customer

To proceed with the CRM contact import, please provide your contact data in one of the following formats:

  • Preferred Format: CSV (Comma Separated Values) file.

* Please ensure the delimiter is a comma (,).

* Text qualifiers (e.g., quotes "") are recommended for fields that may contain commas.

  • Alternative Format: Microsoft Excel (XLSX or XLS) file.

2.1. Mandatory Fields

The following fields are essential for a successful import and for the subsequent lead scoring to function correctly. Please ensure these are present in your data file:

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

2.2. Recommended Fields for Enhanced Lead Scoring

Including the following fields will significantly improve the accuracy and depth of your lead scoring analysis. The more data points available, the more nuanced and effective the scoring model can be.

  • Company Name
  • Job Title
  • Phone Number
  • Website
  • Industry
  • Lead Source (e.g., "Website Form," "Event," "Referral," "Cold Outreach")
  • Lead Status (e.g., "New," "Open," "Working," "Qualified")
  • Last Activity Date (e.g., last email opened, last call, last meeting)
  • Creation Date (when the contact was first added)
  • City
  • State/Province
  • Country
  • Any other relevant custom fields that provide context about the contact's engagement or fit.

2.3. Data Quality Guidelines

To ensure a smooth import and high-quality data:

  • Consistency: Maintain consistent formatting for dates (e.g., YYYY-MM-DD or MM/DD/YYYY), phone numbers, and addresses.
  • Accuracy: Verify email addresses are valid and unique.
  • Completeness: Fill in as many fields as possible, especially the recommended ones.
  • Cleanliness: Remove any unnecessary special characters or extraneous text that doesn't belong in a specific field.

3. Import Process Details

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

  1. File Receipt & Initial Review: The provided file will be securely uploaded and undergo an initial automated format check.
  2. Data Validation:

* Mandatory Field Check: Verify that all mandatory fields (Email Address, First Name, Last Name) are present for each record. Records missing these fields will be flagged.

* Email Format Validation: Check for syntactically correct email addresses. Invalid emails will be flagged.

* Duplicate Detection (within provided file): Identify and flag duplicate email addresses within the submitted file itself.

  1. Deduplication (against existing CRM data):

* The primary key for deduplication will be the Email Address.

* For any contact with an Email Address that already exists in your CRM, the system will update the existing record with new information from your file (e.g., update Job Title, Company, Last Activity Date).

* New contacts (email addresses not found in CRM) will be created as new records.

  1. Field Mapping: We will map the columns from your provided file to the corresponding fields within your CRM system. If any column headers are ambiguous or do not directly match standard CRM fields, we will reach out for clarification.
  2. Import Execution: Once validation and mapping are complete, the data will be imported into your CRM.
  3. Error Reporting: A detailed report will be generated, outlining:

* Number of successfully imported new contacts.

* Number of updated existing contacts.

* Number of skipped records, with specific reasons (e.g., "Missing Email," "Invalid Email Format").

* Any discrepancies or warnings encountered during the process.


4. Expected Outcome of This Step

Upon successful completion of Step 1, you can expect:

  • Your CRM will contain an updated and expanded database of contacts, reflecting the data provided.
  • A comprehensive Import Summary Report will be delivered, detailing the outcome of the import, including any records that were skipped or updated.
  • The contact data within your CRM will be standardized and validated, providing a clean foundation for subsequent analysis.
  • The system will be ready to proceed to Step 2: "Generate Lead Scoring."

5. Actionable Items for You

To ensure a smooth and efficient import process, please take the following actions:

  1. Prepare Your Data File: Consolidate your contact data into a single CSV or Excel file, ensuring it adheres to the format and field guidelines mentioned in Section 2.
  2. Review Mandatory & Recommended Fields: Double-check that all mandatory fields are present and populate as many recommended fields as possible for optimal lead scoring.
  3. Secure Data Submission: Please upload your prepared data file to the secure portal provided by your account manager, or follow the specific instructions for data transfer you've received.
  4. Confirm Submission: Notify your account manager or our support team once your data file has been uploaded.

6. Next Steps in the Workflow

Once the contact data has been successfully imported and verified, we will automatically proceed to:

  • Step 2 of 2: Generate Lead Scoring: This step will leverage the newly imported and existing CRM data to apply a sophisticated lead scoring model to all your contacts, providing actionable insights into their potential and engagement.

7. Support & Contact

Should you have any questions regarding the data preparation, file submission, or any aspect of this step, please do not hesitate to contact your dedicated account manager or our support team at [Support Email/Phone Number]. We are here to assist you every step of the way.

crm Output

Workflow Completion: Contact Data Formatter - AI Lead Scoring

This document details the successful execution and deliverables for the final step of your "Contact Data Formatter" workflow: AI Lead Scoring.


Workflow Overview

You initiated the "Contact Data Formatter" workflow to import and enrich your contact data. This two-step process involved:

  1. Data Import & Formatting (crm): Successfully imported and standardized your contact data.
  2. AI Lead Scoring (ai_lead_scoring): Applied advanced AI models to generate predictive lead scores for your newly imported contacts.

This output specifically covers the results of the second step, providing a comprehensive analysis of the lead scoring applied to your dataset.


Step 2: AI Lead Scoring - Process & Methodology

The ai_lead_scoring step leveraged sophisticated machine learning algorithms to evaluate each contact imported in Step 1. The primary goal is to predict the likelihood of a contact converting into a customer, allowing for more strategic prioritization and resource allocation.

Process Executed:

  1. Data Ingestion & Feature Engineering: The cleaned and formatted contact data from Step 1 (including fields such as company, industry, job title, location, email domain, etc.) was ingested into our AI engine. Relevant features were extracted and engineered to maximize predictive power.
  2. Predictive Model Application: Our proprietary AI lead scoring model, trained on historical conversion data and industry benchmarks, was applied to each contact. This model considers various signals that indicate buying intent and fit.
  3. Score Generation: Each contact received a numerical lead score and was categorized into a specific lead tier.
  4. CRM Integration: The generated lead scores and tiers have been seamlessly integrated back into your CRM system, updating the respective contact records.

Key Data Points Considered (where available):

  • Firmographics: Company size, industry, revenue, location.
  • Demographics: Job title, seniority, department.
  • Behavioral Indicators (if historical data linked): Website visits, content downloads, email engagement (for existing contacts).
  • Data Quality & Completeness: The richness of the provided contact data also influences the confidence level of the score.

Deliverables: AI Lead Scoring Results

Your imported contacts have now been enriched with predictive lead scores, providing immediate actionable insights.

1. Lead Score (Numerical Value):

  • Each contact has been assigned a numerical score, typically ranging from 1 to 100 (or similar scale), representing their overall conversion potential.
  • Higher scores indicate a higher predicted likelihood of conversion.

2. Lead Tier/Category:

  • To simplify prioritization, contacts have also been categorized into distinct tiers based on their numerical score. Common tiers include:

* Tier 1: Hot Leads (e.g., Score 80-100): Contacts with very high conversion potential. These should be prioritized for immediate and personalized outreach.

* Tier 2: Warm Leads (e.g., Score 50-79): Contacts with good conversion potential. These require targeted nurturing and engagement.

* Tier 3: Cold Leads (e.g., Score 20-49): Contacts with lower, but still existing, conversion potential. These may benefit from long-term nurturing or specific re-engagement campaigns.

* Tier 4: Unqualified/Poor Fit (e.g., Score 0-19): Contacts with very low conversion potential or poor fit indicators. These may be deprioritized or removed from immediate sales focus.

3. CRM Updates:

  • These lead scores and tiers are now visible within your CRM system, typically as new custom fields associated with each contact record (e.g., "Lead Score", "Lead Tier").
  • You can now filter, sort, and create views based on these new lead scoring attributes directly within your CRM.

Actionable Insights & Recommendations

The AI lead scoring provides a powerful tool to optimize your sales and marketing efforts. Here's how you can leverage these results:

  • Prioritize Sales Outreach: Focus your sales team's efforts on "Hot" and "Warm" leads first. This ensures they are engaging with the contacts most likely to convert, increasing efficiency and closing rates.
  • Tailor Messaging: Develop specific messaging and value propositions for each lead tier. Hot leads might receive direct sales calls, while warm leads could benefit from educational content or personalized emails.
  • Optimize Resource Allocation: Allocate marketing budget and sales time more effectively by concentrating on high-potential leads.
  • Improve Conversion Rates: By systematically engaging with the most promising leads, you can expect to see an uplift in your overall conversion rates.
  • Refine Marketing Campaigns: Use the lead scoring data to identify what types of contacts are most valuable, allowing you to refine future lead generation and marketing campaigns.
  • Automate Workflows: Set up automated workflows within your CRM or marketing automation platform. For example, automatically assign "Hot Leads" to a sales representative, or enroll "Warm Leads" into a specific nurturing email sequence.

Next Steps for You

  1. Review in CRM: Log into your CRM system and navigate to your contact records. You should now see the "Lead Score" and "Lead Tier" fields populated for all contacts processed by this workflow.
  2. Segment & Filter: Experiment with filtering and segmenting your contacts based on their new lead scores and tiers.
  3. Develop Outreach Strategies: Work with your sales and marketing teams to define specific outreach strategies for each lead tier.
  4. Provide Feedback (Optional but Recommended): As your sales team engages with these scored leads, gather feedback on the accuracy of the scores. This feedback can be invaluable for future model refinement and continuous improvement of your lead scoring accuracy.

We are confident that this AI lead scoring enhancement will significantly boost your team's efficiency and effectiveness in converting contacts into valuable customers. If you have any questions or require further assistance in interpreting these results or integrating them into your existing processes, please do not hesitate to reach out to 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);}});}