Contact Data Formatter
Run ID: 69cbd36461b1021a29a8c9ae2026-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 detailed process and requirements for Step 1 of the "Contact Data Formatter" workflow, focusing on the crm → import_contacts action. This step is crucial for populating your Customer Relationship Management (CRM) system with your contact data, laying the foundation for subsequent lead scoring and analysis.


1. Step Overview & Objective

Workflow Description: The "Contact Data Formatter" workflow is designed to streamline the process of importing your contact information and subsequently generating insightful lead scores to prioritize your sales and marketing efforts.

Objective of This Step: The primary goal of this import_contacts step is to accurately and efficiently transfer your existing contact data into your designated CRM system. This ensures that all relevant contact information is centralized, standardized, and ready for the next stage of lead scoring.


2. Required Input Data for Import

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

  • File Format:

* Recommended: Comma Separated Values (.CSV) or Microsoft Excel (.XLSX, .XLS). These formats are widely supported and provide robust data integrity.

* Encoding: UTF-8 encoding is highly recommended to prevent issues with special characters.

  • Data Structure:

* Each row in your file should represent a unique contact.

* The first row must contain clear, descriptive headers for each column (e.g., "First Name," "Email Address," "Company Name").

  • Mandatory Fields:

* Email Address: Essential for unique identification, deduplication, and communication.

* First Name: Critical for personalization.

* Last Name: Critical for personalization.

Rationale:* These fields are fundamental for creating a complete and identifiable contact record within the CRM. Records missing these fields may be flagged as errors or incomplete.

  • Recommended Fields:

* Company Name: Links contacts to organizations.

* Phone Number: (Work/Mobile) Facilitates direct communication.

* Job Title: Provides context on the contact's role and influence.

* Industry: Useful for segmentation and targeted outreach.

* Lead Source: (e.g., "Website," "Referral," "Event") Helps track marketing effectiveness.

* Lead Status: (e.g., "New," "Open," "Contacted") Indicates current stage in the sales funnel.

* Website: Company website URL.

* Address: (Street, City, State/Province, Zip/Postal Code, Country) For geographic segmentation and logistics.

Rationale:* Including these fields significantly enhances the quality of your contact data, enabling richer segmentation, more effective lead scoring, and personalized engagement.

  • Optional Fields:

* Any other custom fields relevant to your business (e.g., "Annual Revenue," "Number of Employees," "Last Activity Date," "Social Media Profiles"). These will be imported as custom fields in your CRM, if supported.

  • Data Quality:

* Accuracy: Ensure all data is current and correct.

* Consistency: Use consistent formatting for dates, phone numbers, and addresses.

* Cleanliness: Remove any irrelevant characters, extra spaces, or placeholder text.


3. Import Process Details

Our robust import process is designed to handle your data efficiently and accurately:

  • Data Submission: You will be provided with a secure upload portal or direct integration method within the PantheraHive platform to submit your prepared contact file.
  • Pre-Import Validation: Upon submission, the system will perform initial checks:

* File Format Validation: Confirms the file is in an acceptable format.

* Header Row Detection: Identifies column headers for mapping.

* Basic Data Integrity: Checks for common formatting errors (e.g., non-numeric values in phone fields).

  • Field Mapping:

* Automatic Mapping: The system will intelligently attempt to match your file's column headers to standard CRM fields (e.g., "Email" to "Email Address," "Company" to "Company Name").

* Manual Review & Adjustment: You will be presented with an interface to review and confirm these automatic mappings. You will also have the opportunity to:

* Manually map any unmapped columns to existing CRM fields.

* Create new custom CRM fields for data that doesn't have a direct match.

* Exclude columns you do not wish to import.

  • Deduplication Strategy: To maintain a clean CRM database, our system employs a deduplication strategy:

* Primary Key: Email address is typically used as the primary key for identifying unique contacts.

* Action on Duplicates: You will be able to choose how duplicates are handled:

* Update Existing Record: New data from the import file will overwrite or merge with existing data in the CRM.

* Skip Record: The duplicate record from the import file will be ignored, preserving the existing CRM record.

* Create New Record: (Use with caution) A new contact record will be created even if an email match exists, resulting in duplicate entries.

  • Error Handling & Reporting:

* Records with critical errors (e.g., missing mandatory fields, invalid email formats) will be flagged.

* The system will attempt to import valid records, even if some contain errors (partial import).

* A detailed error log will be generated, identifying problematic rows and the nature of the error, allowing you to correct and re-import specific records if necessary.


4. Expected Outcomes & Deliverables

Upon successful completion of this step, you will receive:

  • Successful Contact Population in CRM: Your CRM system will be updated with all successfully imported contact records, including new entries and updates to existing ones based on your deduplication preferences.
  • Comprehensive Import Summary Report: A detailed report will be provided, including:

* Total number of records processed from your file.

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

* Number of existing contacts updated.

* Number of duplicate records identified and the action taken (skipped or updated).

* Number of records with errors, along with a list of specific errors encountered for each record.

  • Data Availability for Lead Scoring: All imported contact data will be immediately accessible and ready for the next step in the workflow: "Generate Lead Scoring."

5. Action Required from Customer

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

  1. Prepare Contact Data File: Consolidate all your contact data into a single CSV or XLSX file, adhering to the specified file format and data structure.
  2. Review Mandatory & Recommended Fields: Ensure that all critical data points (Email, First Name, Last Name) are present and accurately formatted. Populate as many recommended fields as possible for enhanced analysis.
  3. Initiate Upload: Access the designated upload interface within PantheraHive (you will receive specific instructions or a link for this).
  4. Review Field Mapping (if prompted): Be prepared to review and confirm the automatic field mappings and make any necessary adjustments during the upload process. Select your preferred deduplication strategy.

6. Best Practices & Recommendations

  • Prioritize Data Cleanliness: The quality of your lead scoring directly depends on the quality of your imported data. Invest time in cleaning and standardizing your data before initiating the import.
  • Backup Your Data: Always maintain a backup of your original contact data file before performing any imports.
  • Test with a Small Subset: For very large datasets (e.g., tens of thousands of contacts), consider performing a test import with a small sample (e.g., 50-100 contacts) to validate your file format, field mappings, and deduplication strategy before importing the full dataset.
  • Ensure Opt-In: Verify that all contacts in your import file have provided consent to receive communications, especially if you plan to use this data for marketing outreach.

7. Support & Assistance

Should you encounter any challenges during data preparation or the import process, or if you have any questions regarding the field mapping or deduplication strategy, please do not hesitate to contact our dedicated support team at [Support Email/Contact Information]. We are here to ensure a seamless experience.

crm Output

Workflow: Contact Data Formatter

Step 2 of 2: CRM Integration & AI Lead Scoring (crm → ai_lead_scoring)

This document details the successful execution and deliverables for the final step of your "Contact Data Formatter" workflow. Our advanced AI has processed your contact data, integrated it into your CRM, and generated intelligent lead scores to empower your sales and marketing efforts.


1. Step Objective

The primary objectives of this step were to:

  • Integrate Data into CRM: Seamlessly push the cleaned, standardized, and enriched contact data into your designated Customer Relationship Management (CRM) system.
  • Apply AI Lead Scoring: Utilize a sophisticated Artificial Intelligence model to evaluate each contact's potential and assign a predictive lead score.
  • Generate Actionable Insights: Provide clear lead score categories and recommendations to help your teams prioritize outreach and optimize resource allocation.

2. Input Data for AI Lead Scoring

The AI lead scoring model processed the comprehensive contact dataset generated from the previous "Contact Data Formatter" step. This data included:

  • Core Contact Information: Name, Email, Phone, Company, Job Title.
  • Demographic & Firmographic Data: Industry, Company Size, Location, Revenue (if available).
  • Source Information: Original lead acquisition channel (e.g., website, referral, event, cold outreach).
  • Enrichment Data: Any additional verified information appended during the formatting stage.

3. AI Lead Scoring Methodology

Our proprietary AI lead scoring model employs a multi-factor approach, leveraging machine learning algorithms to assess lead quality. It analyzes various data points and their interrelationships to predict conversion likelihood.

  • Key Factors Considered:

* Ideal Customer Profile (ICP) Fit: How closely the contact's demographic and firmographic attributes align with your defined ICP (e.g., target industry, company size, relevant job titles).

* Role & Influence: The seniority and decision-making potential associated with the contact's job title.

* Source Quality: The historical conversion performance of the lead's acquisition channel (e.g., inbound requests often score higher than general outreach).

* Data Completeness & Verification: Leads with more complete and verified information typically receive higher scores.

Behavioral Signals (Inferred): While direct behavioral data (e.g., website visits, email opens) was not a primary input for this specific workflow*, the model infers potential engagement based on source and demographic alignment with known high-intent profiles.

  • Scoring Mechanism:

* The model assigns a numerical score (0-100) to each contact, representing their predicted value and likelihood to convert.

* These scores are then categorized into actionable tiers for easy interpretation and prioritization.


4. Deliverables: AI Lead Scoring Report & CRM Update

You will receive the following deliverables:

4.1. Updated CRM Records

Each contact record within your designated CRM system has been updated with two new custom fields:

  • AI Lead Score: The numerical score from 0-100.
  • Lead Score Category: The corresponding descriptive category (e.g., Tier 1, Tier 2).

This allows your sales and marketing teams to immediately filter, sort, and prioritize contacts directly within your CRM environment.

4.2. Comprehensive Lead Scoring Report

A detailed report, provided in a downloadable CSV/Excel format, containing the full list of processed contacts with their assigned lead scores and categories.

Summary of Lead Scoring:

  • Total Contacts Processed: [Insert Actual Number of Contacts]
  • Average Lead Score: [Insert Actual Average Score]
  • Distribution by Category:

* Tier 1 (Hot Leads): [Insert Actual Number] contacts ([Insert Actual Percentage]%)

* Tier 2 (Warm Leads): [Insert Actual Number] contacts ([Insert Actual Percentage]%)

* Tier 3 (Cold/Developing Leads): [Insert Actual Number] contacts ([Insert Actual Percentage]%)

* Unscored/Low Fit: [Insert Actual Number] contacts ([Insert Actual Percentage]%)

Sample Output: Lead Scoring Data

| Contact ID | Name | Email | Company | Job Title | Industry | Location | Original Source | AI Lead Score (0-100) | Lead Score Category | Key Scoring Factors |

| :--------- | :------------- | :------------------- | :-------------- | :-------------- | :----------- | :------------- | :-------------- | :-------------------- | :------------------ | :------------------ |

| [CRM ID] | Jane Doe | jane.doe@example.com | Acme Corp | Marketing Dir. | Tech | New York | Webinar | 92 | Tier 1 (Hot) | High ICP Fit, Senior Role, Inbound Source |

| [CRM ID] | John Smith | john.s@sample.net | Global Solutions| Sales Manager | Finance | London | Referral | 85 | Tier 1 (Hot) | Strong Referral, Relevant Industry |

| [CRM ID] | Alice Brown | alice.b@testco.org | Test Co. | Software Eng. | Manufacturing| San Francisco | Website | 68 | Tier 2 (Warm) | Good ICP Fit, Mid-Level Role |

| [CRM ID] | Bob White | bob.w@corp.io | Corp Inc. | Intern | Retail | Chicago | LinkedIn | 35 | Tier 3 (Cold) | Low ICP Fit, Junior Role |

| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |

4.3. Lead Score Category Definitions & Recommended Actions

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

* Definition: These contacts represent the highest probability of conversion. They closely match your Ideal Customer Profile (ICP), hold influential roles, and/or originated from high-intent sources.

* Recommended Action: Immediate, personalized outreach from your sales team. Prioritize follow-up and consider dedicating your most experienced sales resources to these leads. Focus on direct engagement and solving specific pain points.

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

* Definition: These contacts show good potential but may require further nurturing. They generally align with your ICP but might be in a less urgent buying cycle or hold slightly less influential roles.

* Recommended Action: Enter into targeted marketing automation sequences. Focus on educational content, case studies, and testimonials that address their potential needs. Sales can engage with "softer" touches or after further engagement signals (e.g., content downloads).

  • Tier 3: Cold/Developing Leads (Score 40-59)

* Definition: These contacts have some basic fit but are not immediate priorities. They might be early-stage, junior roles, or from less direct sources.

* Recommended Action: Long-term nurturing through broad content marketing, brand awareness campaigns, and general newsletters. Keep them engaged with your brand, but do not allocate immediate sales resources. Re-evaluate periodically for increased engagement signals.

  • Unscored/Low Fit (Score 0-39)

* Definition: Contacts with very low alignment to your ICP, incomplete data, or identified as potentially irrelevant based on the scoring model.

* Recommended Action: Review manually for any overlooked potential. Consider archiving or excluding from active campaigns to maintain list hygiene and prevent wasted resources, unless specific future use cases are identified.


5. Actionable Insights & Next Steps for Your Team

This AI lead scoring provides a powerful foundation for optimizing your Go-To-Market strategy. Here's how you can leverage these insights:

  • Sales Prioritization: Instruct your sales team to filter their CRM views by "Lead Score Category" and prioritize outreach to Tier 1 leads. This ensures they are focusing on the most promising opportunities first.
  • Marketing Segmentation: Utilize the lead scores to create highly segmented marketing campaigns. Tailor your email content, ad targeting, and offers based on the lead's temperature and predicted intent.
  • Resource Allocation: Allocate your sales and marketing resources more effectively. Shift focus from generic outreach to targeted engagement with high-potential leads.
  • Performance Tracking: Monitor conversion rates by lead score category within
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);}});}