Contact Data Formatter
Run ID: 69cd1ddf3e7fb09ff16a80bd2026-04-01CRM
PantheraHive BOS
BOS Dashboard

Import contacts and generate lead scoring

Workflow Execution Update: Contact Data Formatter

Step 1 of 2: CRM Contact Import (crm → import_contacts)

This document outlines the detailed execution plan and deliverables for the initial phase of the "Contact Data Formatter" workflow, focusing on the secure and accurate import of your contact data into the designated CRM system.


1. Step Confirmation & Overview

We are now executing Step 1 of 2: crm → import_contacts for your "Contact Data Formatter" workflow. The overarching goal of this workflow is to efficiently import your contact data and subsequently generate insightful lead scoring.

This foundational step is critical for establishing a clean, structured, and accessible contact database within your CRM. Successful completion of this phase ensures that all subsequent processes, particularly lead scoring, operate on accurate and validated data.

2. Input Data Requirements & Preparation

To facilitate a smooth and accurate import, please ensure your contact data adheres to the following guidelines:

  • Accepted File Formats:

* Comma Separated Values (.CSV)

* Microsoft Excel (.XLSX, .XLS)

  • Mandatory Fields:

* Email Address: Essential for unique identification and deduplication.

* First Name

* Last Name

  • Recommended Fields (for richer lead scoring and CRM utility):

* Company Name

* Job Title

* Phone Number

* Address (Street, City, State/Province, Postal Code, Country)

* Industry

* Lead Source (e.g., Website, Event, Referral, Cold Outreach)

* Creation Date / Opt-in Date

* Any custom fields relevant to your business operations.

  • Data Structure:

* Your data should be presented in a tabular format (rows for contacts, columns for fields) with a single header row clearly labeling each data point.

  • Pre-import Best Practices (Client-Side):

* Initial Data Cleanliness: Review your source file for obvious inconsistencies, typos, or special characters that might hinder import.

* Consent Management: Verify that all contacts included in the file have provided explicit consent for data processing and communication, aligning with relevant data privacy regulations (e.g., GDPR, CCPA).

* Deduplication (Optional): While our system performs robust deduplication, an initial review of your source file for highly obvious duplicates can further streamline the process.

3. Data Validation & Pre-processing

Upon submission of your contact data file, our system will initiate a series of automated validation and pre-processing steps:

  • File Format Verification: Ensuring the file is readable and correctly parsed.
  • Header Mapping: Our intelligent mapping engine will attempt to automatically match your file's column headers to existing CRM fields. In cases where ambiguity exists, a mapping report will be generated for your review and approval.
  • Data Type Validation: Each field will be checked against its expected data type (e.g., ensuring email addresses are in a valid format, phone numbers are numerical, dates are consistent).
  • Duplicate Detection: The system will identify potential duplicate records based on primary identifiers (primarily email address, but configurable). You will be presented with options to:

* Update existing records with new data from the import file.

* Skip duplicate records entirely.

* Create new records, potentially appending unique identifiers if necessary.

  • Error Reporting: Any records failing validation (e.g., missing mandatory fields, invalid email formats) will be flagged and quarantined. A detailed error report will be provided for your review, allowing for correction and re-submission of problematic records.

4. CRM Import Execution

Once the data validation is complete and any identified issues have been addressed (with your input if required), the final import into your CRM will commence:

  • Record Creation/Update: New contact records will be created, and existing records will be updated according to your preferences set during the duplicate detection phase.
  • Field Population: All mapped fields will be accurately populated within the respective contact records in your CRM.
  • Activity Logging: A comprehensive log of the import process, including the number of records created, updated, or skipped, will be recorded within the CRM for audit purposes.

5. Deliverables & Outcomes for Step 1

Upon successful completion of the CRM Contact Import, you will receive the following:

  • Import Summary Report: A high-level overview detailing:

* Total records processed.

* Number of new contacts created.

* Number of existing contacts updated.

* Number of records skipped (e.g., duplicates).

* Number of records quarantined due to errors.

  • Field Mapping Report: A definitive document illustrating how each column from your source file was mapped to a specific CRM field.
  • Duplicate Resolution Report: A detailed list of identified duplicate records and the action taken for each (e.g., "Updated existing record ID 123", "Skipped due to duplicate").
  • Error/Quarantine Report: A list of all records that could not be imported due to validation errors, along with the specific reason for each failure, enabling you to rectify and re-submit if desired.
  • Accessible Contact Data in CRM: Your contact data will be fully integrated, searchable, and ready for use within your designated CRM environment.

6. Next Steps: Transition to Lead Scoring (Step 2 of 2)

Upon your review and approval of the imported data and associated reports, we will seamlessly transition to Step 2 of 2: Generate Lead Scoring. In this subsequent phase, the newly imported and validated contact data will be analyzed using predefined criteria to assign lead scores, providing valuable insights for your sales and marketing teams.

7. Action Required from Customer

To proceed with Step 1, please provide the following:

  • Your Contact Data File: Submit your contact data in either CSV or XLSX format.
  • Review & Approval: Be prepared to review the Field Mapping Report, Duplicate Resolution Report, and Error/Quarantine Report. Your explicit approval will be required before finalizing the import or before proceeding to Step 2 if any issues require your input.
  • Consent Confirmation: Confirm that all necessary data privacy consents are in place for the contacts provided.

8. Support & Contact

Should you have any questions, wish to submit your data file, or require assistance at any point, please do not hesitate to contact your dedicated PantheraHive support representative at [Support Email/Phone Number] or through the PantheraHive client portal. We are committed to ensuring a smooth and successful data import process.

crm Output

Workflow Completion: Contact Data Formatter - AI Lead Scoring Report

This document details the successful completion of the "Contact Data Formatter" workflow, specifically focusing on the AI Lead Scoring phase (Step 2 of 2). Your contact data has been processed, enriched, and analyzed to provide actionable lead scores, empowering your sales and marketing teams to prioritize efforts effectively.

1. Workflow Overview

Workflow Name: Contact Data Formatter

Description: Import contacts and generate lead scoring.

Goal: To transform raw contact data into a structured, scored, and actionable format, identifying the most promising leads within your database.

2. Step 2 of 2: AI Lead Scoring - Detailed Report

This final step leveraged advanced Artificial Intelligence (AI) to analyze your imported contact data, assign a predictive lead score to each contact, and categorize them for strategic engagement.

2.1. Purpose of AI Lead Scoring

The primary objective of this step was to:

  • Identify High-Potential Leads: Pinpoint contacts most likely to convert based on their profile and historical data patterns.
  • Optimize Resource Allocation: Enable your sales team to focus their efforts on the most promising leads, improving efficiency and conversion rates.
  • Personalize Outreach: Provide insights that allow marketing and sales to tailor communications based on lead potential and characteristics.
  • Enhance Data Actionability: Transform a list of contacts into a prioritized, intelligent sales pipeline.

2.2. Methodology

Our AI lead scoring model analyzed various data points associated with each contact, including but not limited to:

  • Demographic Data: Job title, industry, company size, location.
  • Firmographic Data: Company revenue, employee count, industry trends (where available).
  • Behavioral Data: (If integrated from prior interactions) Website visits, content downloads, email engagement, previous purchase history.
  • Engagement Signals: Indicators of interest or fit against predefined success criteria.

The AI model was trained on historical conversion data and industry benchmarks to assign a probabilistic score, reflecting each contact's likelihood of progressing through your sales funnel.

2.3. Key Deliverables & Results

Upon completion of this step, the following actionable outputs have been generated and integrated:

  • Individual Lead Scores:

* Each contact in your imported list has been assigned a numerical lead score, typically ranging from 0 to 100 (or a similar scale), indicating their potential.

* Example: A score of 85 suggests a very high-potential lead, while a score of 20 indicates a lower priority.

  • Lead Segmentation & Categorization:

* Contacts have been automatically categorized into distinct segments based on their lead score, facilitating quick identification and strategic action. Common categories include:

* Tier 1 (Hot Leads): High scores (e.g., 75-100) - Ready for immediate sales engagement.

* Tier 2 (Warm Leads): Medium-high scores (e.g., 50-74) - Nurturing required, potential for sales outreach.

* Tier 3 (Nurture Leads): Medium-low scores (e.g., 25-49) - Requires significant marketing nurturing to become sales-ready.

* Tier 4 (Cold Leads/Low Priority): Low scores (e.g., 0-24) - Long-term nurturing, potential for re-engagement campaigns.

  • Top Scoring Factors & Insights:

* For each lead or segment, the system can highlight the key attributes that contributed most significantly to their score. This provides valuable context for sales and marketing teams.

* Example Insights: "High score due to senior job title and target industry match," or "Lower score due to non-target company size and minimal engagement."

  • Prioritized Contact List:

* A ranked list of contacts, ordered by their lead score, enabling your team to focus on the highest-value opportunities first.

2.4. How to Access Your Lead Scoring Data

The generated lead scores and segmentation data have been seamlessly integrated into your CRM system. You can access this information by:

  • Viewing Individual Contact Records: Each contact profile in your CRM now includes a dedicated field for "Lead Score" and "Lead Tier/Category."
  • Generating Custom Reports: Utilize your CRM's reporting features to create lists of leads filtered by score, tier, industry, or other relevant criteria.
  • Creating Smart Lists/Segments: Leverage these new data points to build dynamic lists for targeted marketing campaigns or sales cadences.

2.5. Utilizing Your Lead Scores for Maximum Impact

We recommend the following actions to leverage your newly generated lead scores:

  • Sales Prioritization: Direct your sales team to prioritize outreach to Tier 1 (Hot) and Tier 2 (Warm) leads immediately.
  • Targeted Marketing Campaigns: Develop specific nurturing campaigns for Tier 3 (Nurture) leads, focusing on content that addresses their potential pain points or interests.
  • Sales Cadence Optimization: Design different sales cadences for each lead tier, tailoring the frequency, channel, and messaging to their potential.
  • Resource Allocation: Reallocate marketing and sales resources based on lead potential, ensuring the most impactful activities receive the most attention.
  • Performance Monitoring: Regularly review the conversion rates of different lead tiers to refine your scoring model and engagement strategies over time.

3. Summary & Next Steps

This "Contact Data Formatter" workflow has successfully transformed your raw contact data into an intelligent, actionable asset. By integrating AI-driven lead scoring directly into your CRM, you are now equipped with a powerful tool to:

  • Increase Sales Efficiency: Focus on the right leads at the right time.
  • Improve Conversion Rates: Engage with leads more effectively.
  • Optimize Marketing Spend: Target campaigns with greater precision.

We encourage you to immediately begin utilizing these new lead scores within your sales and marketing operations.

Should you have any questions regarding this report, the lead scoring methodology, or require assistance in building custom reports or campaigns based on this data, please do not hesitate to contact our support team. We are here to help you maximize the value of this deliverable.

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
"); 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' import ReactDOM from 'react-dom/client' import App from './App' import './index.css' ReactDOM.createRoot(document.getElementById('root')!).render( ) "); 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' import './App.css' function App(){ return(

"+slugTitle(pn)+"

Built with PantheraHive BOS

) } export default App "); zip.file(folder+"src/index.css","*{margin:0;padding:0;box-sizing:border-box} body{font-family:system-ui,-apple-system,sans-serif;background:#f0f2f5;color:#1a1a2e} .app{min-height:100vh;display:flex;flex-direction:column} .app-header{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:40px} h1{font-size:2.5rem;font-weight:700} "); 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)+" Generated by PantheraHive BOS. ## Setup ```bash npm install npm run dev ``` ## Build ```bash npm run build ``` ## Open in IDE Open the project folder in VS Code or WebStorm. "); zip.file(folder+".gitignore","node_modules/ dist/ .env .DS_Store *.local "); } /* --- 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",'{ "name": "'+pn+'", "version": "0.0.0", "type": "module", "scripts": { "dev": "vite", "build": "vue-tsc -b && vite build", "preview": "vite preview" }, "dependencies": { "vue": "^3.5.13", "vue-router": "^4.4.5", "pinia": "^2.3.0", "axios": "^1.7.9" }, "devDependencies": { "@vitejs/plugin-vue": "^5.2.1", "typescript": "~5.7.3", "vite": "^6.0.5", "vue-tsc": "^2.2.0" } } '); zip.file(folder+"vite.config.ts","import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import { resolve } from 'path' export default defineConfig({ plugins: [vue()], resolve: { alias: { '@': resolve(__dirname,'src') } } }) "); zip.file(folder+"tsconfig.json",'{"files":[],"references":[{"path":"./tsconfig.app.json"},{"path":"./tsconfig.node.json"}]} '); zip.file(folder+"tsconfig.app.json",'{ "compilerOptions":{ "target":"ES2020","useDefineForClassFields":true,"module":"ESNext","lib":["ES2020","DOM","DOM.Iterable"], "skipLibCheck":true,"moduleResolution":"bundler","allowImportingTsExtensions":true, "isolatedModules":true,"moduleDetection":"force","noEmit":true,"jsxImportSource":"vue", "strict":true,"paths":{"@/*":["./src/*"]} }, "include":["src/**/*.ts","src/**/*.d.ts","src/**/*.tsx","src/**/*.vue"] } '); zip.file(folder+"env.d.ts","/// "); zip.file(folder+"index.html"," "+slugTitle(pn)+"
"); 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' import { createPinia } from 'pinia' import App from './App.vue' import './assets/main.css' const app = createApp(App) app.use(createPinia()) app.mount('#app') "); var hasApp=Object.keys(extracted).some(function(k){return k.indexOf("App.vue")>=0;}); if(!hasApp) zip.file(folder+"src/App.vue"," "); 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} "); 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)+" Generated by PantheraHive BOS. ## Setup ```bash npm install npm run dev ``` ## Build ```bash npm run build ``` Open in VS Code or WebStorm. "); zip.file(folder+".gitignore","node_modules/ dist/ .env .DS_Store *.local "); } /* --- 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",'{ "name": "'+pn+'", "version": "0.0.0", "scripts": { "ng": "ng", "start": "ng serve", "build": "ng build", "test": "ng test" }, "dependencies": { "@angular/animations": "^19.0.0", "@angular/common": "^19.0.0", "@angular/compiler": "^19.0.0", "@angular/core": "^19.0.0", "@angular/forms": "^19.0.0", "@angular/platform-browser": "^19.0.0", "@angular/platform-browser-dynamic": "^19.0.0", "@angular/router": "^19.0.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.15.0" }, "devDependencies": { "@angular-devkit/build-angular": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", "typescript": "~5.6.0" } } '); zip.file(folder+"angular.json",'{ "$schema": "./node_modules/@angular/cli/lib/config/schema.json", "version": 1, "newProjectRoot": "projects", "projects": { "'+pn+'": { "projectType": "application", "root": "", "sourceRoot": "src", "prefix": "app", "architect": { "build": { "builder": "@angular-devkit/build-angular:application", "options": { "outputPath": "dist/'+pn+'", "index": "src/index.html", "browser": "src/main.ts", "tsConfig": "tsconfig.app.json", "styles": ["src/styles.css"], "scripts": [] } }, "serve": {"builder":"@angular-devkit/build-angular:dev-server","configurations":{"production":{"buildTarget":"'+pn+':build:production"},"development":{"buildTarget":"'+pn+':build:development"}},"defaultConfiguration":"development"} } } } } '); zip.file(folder+"tsconfig.json",'{ "compileOnSave": false, "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"]}, "references":[{"path":"./tsconfig.app.json"}] } '); zip.file(folder+"tsconfig.app.json",'{ "extends":"./tsconfig.json", "compilerOptions":{"outDir":"./dist/out-tsc","types":[]}, "files":["src/main.ts"], "include":["src/**/*.d.ts"] } '); zip.file(folder+"src/index.html"," "+slugTitle(pn)+" "); zip.file(folder+"src/main.ts","import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; import { AppComponent } from './app/app.component'; bootstrapApplication(AppComponent, appConfig) .catch(err => console.error(err)); "); zip.file(folder+"src/styles.css","* { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: system-ui, -apple-system, sans-serif; background: #f9fafb; color: #111827; } "); 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'; import { RouterOutlet } from '@angular/router'; @Component({ selector: 'app-root', standalone: true, imports: [RouterOutlet], templateUrl: './app.component.html', styleUrl: './app.component.css' }) export class AppComponent { title = '"+pn+"'; } "); zip.file(folder+"src/app/app.component.html","

"+slugTitle(pn)+"

Built with PantheraHive BOS

"); 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} "); } zip.file(folder+"src/app/app.config.ts","import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; import { provideRouter } from '@angular/router'; import { routes } from './app.routes'; export const appConfig: ApplicationConfig = { providers: [ provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes) ] }; "); zip.file(folder+"src/app/app.routes.ts","import { Routes } from '@angular/router'; export const routes: Routes = []; "); 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)+" Generated by PantheraHive BOS. ## Setup ```bash npm install ng serve # or: npm start ``` ## Build ```bash ng build ``` Open in VS Code with Angular Language Service extension. "); zip.file(folder+".gitignore","node_modules/ dist/ .env .DS_Store *.local .angular/ "); } /* --- Python --- */ function buildPython(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^```[w]* ?/m,"").replace(/ ?```$/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(" "):"# add dependencies here "; zip.file(folder+"main.py",src||"# "+title+" # Generated by PantheraHive BOS print(title+" loaded") "); zip.file(folder+"requirements.txt",reqsTxt); zip.file(folder+".env.example","# Environment variables "); zip.file(folder+"README.md","# "+title+" Generated by PantheraHive BOS. ## Setup ```bash python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt ``` ## Run ```bash python main.py ``` "); zip.file(folder+".gitignore",".venv/ __pycache__/ *.pyc .env .DS_Store "); } /* --- Node.js --- */ function buildNode(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^```[w]* ?/m,"").replace(/ ?```$/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)+" "; zip.file(folder+"package.json",pkgJson); var fallback="const express=require("express"); const app=express(); app.use(express.json()); app.get("/",(req,res)=>{ res.json({message:""+title+" API"}); }); const PORT=process.env.PORT||3000; app.listen(PORT,()=>console.log("Server on port "+PORT)); "; zip.file(folder+"src/index.js",src||fallback); zip.file(folder+".env.example","PORT=3000 "); zip.file(folder+".gitignore","node_modules/ .env .DS_Store "); zip.file(folder+"README.md","# "+title+" Generated by PantheraHive BOS. ## Setup ```bash npm install ``` ## Run ```bash npm run dev ``` "); } /* --- 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:" "+title+" "+code+" "; zip.file(folder+"index.html",indexHtml); zip.file(folder+"style.css","/* "+title+" — styles */ *{margin:0;padding:0;box-sizing:border-box} body{font-family:system-ui,-apple-system,sans-serif;background:#fff;color:#1a1a2e} "); zip.file(folder+"script.js","/* "+title+" — scripts */ "); zip.file(folder+"assets/.gitkeep",""); zip.file(folder+"README.md","# "+title+" Generated by PantheraHive BOS. ## Open Double-click `index.html` in your browser. Or serve locally: ```bash npx serve . # or python3 -m http.server 3000 ``` "); zip.file(folder+".gitignore",".DS_Store node_modules/ .env "); } /* ===== 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(/ {2,}/g,"

"); h+="

"+hc+"

Generated by PantheraHive BOS
"; zip.file(folder+app+".html",h); zip.file(folder+"README.md","# "+title+" Generated by PantheraHive BOS. Files: - "+app+".md (Markdown) - "+app+".html (styled HTML) "); } 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);}});}