diff --git a/Add Content Brain Modules b/Add Content Brain Modules new file mode 100644 index 00000000..2a332f14 --- /dev/null +++ b/Add Content Brain Modules @@ -0,0 +1,2 @@ +git add ai-system/content-brain/ +git commit -m "feat: add trend detector, script generator, caption builder engines" diff --git a/Add Documentation b/Add Documentation new file mode 100644 index 00000000..9f0025fa --- /dev/null +++ b/Add Documentation @@ -0,0 +1,2 @@ +git add docs/ +git commit -m "docs: add AI Automated Posting System documentation" diff --git a/Add Learning Engine b/Add Learning Engine new file mode 100644 index 00000000..10bbecad --- /dev/null +++ b/Add Learning Engine @@ -0,0 +1,2 @@ +git add ai-system/learning-engine/ +git commit -m "feat: add engagement analyzer + virality predictor + auto optimizer" diff --git a/Add Platform API Integration b/Add Platform API Integration new file mode 100644 index 00000000..19487778 --- /dev/null +++ b/Add Platform API Integration @@ -0,0 +1,2 @@ +git add ai-system/platforms/ +git commit -m "feat: integrate TikTok, IG, FB, YouTube, Telegram API modules" diff --git a/Add Scheduler System b/Add Scheduler System new file mode 100644 index 00000000..6708e1f1 --- /dev/null +++ b/Add Scheduler System @@ -0,0 +1,2 @@ +git add ai-system/scheduler/ +git commit -m "feat: add cron manager, posting queue, automatic retry handler" diff --git a/Deploy Hooks b/Deploy Hooks new file mode 100644 index 00000000..568ad3a6 --- /dev/null +++ b/Deploy Hooks @@ -0,0 +1 @@ +https://api.render.com/deploy/srv-XXXXXX?key=YYYYYYYY diff --git a/Express.js b/Express.js new file mode 100644 index 00000000..c20f9a2b --- /dev/null +++ b/Express.js @@ -0,0 +1 @@ + cors.js rateLimit.js helmet.js sanitize.js validateSignature.js errorHandler.js diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /Production Ready) b/FILE & FOLDER STRUCTURE (Final / Clean /Production Ready) new file mode 100644 index 00000000..17e16a2b --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /Production Ready) @@ -0,0 +1,26 @@ +/services + ├── StockService.js + ├── StockMonitor.js + ├── AutoReorderService.js + └── PredictionEngine.js + +/controllers + └── stockController.js + +/models + ├── Stock.js + ├── Supplier.js + └── ReorderLog.js + +/events + └── eventBus.js + +/utils + ├── notifications.js + └── security.js + +/api + └── stockRoutes.js + +/config + └── db.js diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /models/ReorderLog.js b/FILE & FOLDER STRUCTURE (Final / Clean /models/ReorderLog.js new file mode 100644 index 00000000..054229b5 --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /models/ReorderLog.js @@ -0,0 +1,15 @@ +import mongoose from "mongoose"; + +const ReorderLogSchema = new mongoose.Schema( + { + stockId: { type: mongoose.Schema.Types.ObjectId, ref: "Stock" }, + quantityOrdered: Number, + status: { type: String, default: "PENDING" }, + auto: { type: Boolean, default: true } + }, + { timestamps: true } +); + +ReorderLogSchema.index({ createdAt: 1 }, { expireAfterSeconds: 86400 * 30 }); + +export default mongoose.model("ReorderLog", ReorderLogSchema); diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /models/Stock.js b/FILE & FOLDER STRUCTURE (Final / Clean /models/Stock.js new file mode 100644 index 00000000..e2b11350 --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /models/Stock.js @@ -0,0 +1,16 @@ +import mongoose from "mongoose"; + +const StockSchema = new mongoose.Schema( + { + productId: { type: String, required: true, index: true }, + productName: { type: String, required: true }, + quantity: { type: Number, required: true }, + reorderLevel: { type: Number, default: 10 }, + supplierId: { type: mongoose.Schema.Types.ObjectId, ref: "Supplier" } + }, + { timestamps: true } +); + +StockSchema.index({ productId: 1, supplierId: 1 }); + +export default mongoose.model("Stock", StockSchema); diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /models/models/Supplier.js b/FILE & FOLDER STRUCTURE (Final / Clean /models/models/Supplier.js new file mode 100644 index 00000000..54aaebf8 --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /models/models/Supplier.js @@ -0,0 +1,12 @@ +import mongoose from "mongoose"; + +const SupplierSchema = new mongoose.Schema( + { + name: { type: String, required: true }, + contact: { type: String }, + piWallet: { type: String, required: true } + }, + { timestamps: true } +); + +export default mongoose.model("Supplier", SupplierSchema); diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /models/services/PredictionEngine.js b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/PredictionEngine.js new file mode 100644 index 00000000..0907def7 --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/PredictionEngine.js @@ -0,0 +1,16 @@ +export class PredictionEngine { + static forecast(dailySalesHistory = []) { + if (dailySalesHistory.length < 3) return 5; + + const smoothingFactor = 0.6; + + let prediction = dailySalesHistory[0]; + for (let i = 1; i < dailySalesHistory.length; i++) { + prediction = + smoothingFactor * dailySalesHistory[i] + + (1 - smoothingFactor) * prediction; + } + + return Math.round(prediction); + } +} diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/StockMonitor.js b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/StockMonitor.js new file mode 100644 index 00000000..eaef71f4 --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/StockMonitor.js @@ -0,0 +1,9 @@ +import eventBus from "../events/eventBus.js"; + +export class StockMonitor { + static check(stock) { + if (stock.quantity <= stock.reorderLevel) { + eventBus.emit("stock.low", stock); + } + } +} diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/AutoReorderService.js b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/AutoReorderService.js new file mode 100644 index 00000000..11bc96ba --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/AutoReorderService.js @@ -0,0 +1,21 @@ +import ReorderLog from "../models/ReorderLog.js"; +import Supplier from "../models/Supplier.js"; +import { sendNotification } from "../utils/notifications.js"; +import { initiatePiPayment } from "../utils/security.js"; + +export class AutoReorderService { + static async createReorder(stock) { + const supplier = await Supplier.findById(stock.supplierId); + + const order = await ReorderLog.create({ + stockId: stock._id, + quantityOrdered: stock.reorderLevel * 2 + }); + + sendNotification(supplier.contact, `Auto-reorder placed for ${stock.productName}`); + + await initiatePiPayment(supplier.piWallet, 1.5); + + return order; + } +} diff --git "a/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/controllers /SECURITY \342\200\223 Pi Payments Integration" "b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/controllers /SECURITY \342\200\223 Pi Payments Integration" new file mode 100644 index 00000000..f6e71266 --- /dev/null +++ "b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/controllers /SECURITY \342\200\223 Pi Payments Integration" @@ -0,0 +1,8 @@ +export async function initiatePiPayment(wallet, amount) { + return { + wallet, + amount, + status: "INITIATED", + timestamp: Date.now() + }; +} diff --git "a/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/controllers /SECURITY \342\200\223 Pi Payments Integration.js" "b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/controllers /SECURITY \342\200\223 Pi Payments Integration.js" new file mode 100644 index 00000000..aa6d70a5 --- /dev/null +++ "b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/controllers /SECURITY \342\200\223 Pi Payments Integration.js" @@ -0,0 +1,8 @@ +export async function initiatePiPayment(wallet, amount) { + return { + wallet, + amount, + status: "INITIATED", + timestamp: Date.now() + }; + } diff --git "a/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/controllers /SECURITY \342\200\223 Pi Payments Integration.md" "b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/controllers /SECURITY \342\200\223 Pi Payments Integration.md" new file mode 100644 index 00000000..f6e71266 --- /dev/null +++ "b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/controllers /SECURITY \342\200\223 Pi Payments Integration.md" @@ -0,0 +1,8 @@ +export async function initiatePiPayment(wallet, amount) { + return { + wallet, + amount, + status: "INITIATED", + timestamp: Date.now() + }; +} diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/controllers/EVENT BUS b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/controllers/EVENT BUS new file mode 100644 index 00000000..fa6fd65c --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/controllers/EVENT BUS @@ -0,0 +1,10 @@ +import EventEmitter from "events"; +import { AutoReorderService } from "../services/AutoReorderService.js"; + +const eventBus = new EventEmitter(); + +eventBus.on("stock.low", async (stock) => { + await AutoReorderService.createReorder(stock); +}); + +export default eventBus; diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/controllers/Event bus.js b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/controllers/Event bus.js new file mode 100644 index 00000000..fa6fd65c --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/controllers/Event bus.js @@ -0,0 +1,10 @@ +import EventEmitter from "events"; +import { AutoReorderService } from "../services/AutoReorderService.js"; + +const eventBus = new EventEmitter(); + +eventBus.on("stock.low", async (stock) => { + await AutoReorderService.createReorder(stock); +}); + +export default eventBus; diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/controllers/stockController.js b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/controllers/stockController.js new file mode 100644 index 00000000..08757915 --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/controllers/stockController.js @@ -0,0 +1,18 @@ +import Stock from "../models/Stock.js"; +import { PredictionEngine } from "../services/PredictionEngine.js"; +import { StockMonitor } from "../services/StockMonitor.js"; +import { AutoReorderService } from "../services/AutoReorderService.js"; + +export const StockController = { + async checkAndReorder(req, res) { + const stock = await Stock.findById(req.params.id); + StockMonitor.check(stock); + res.json({ status: "checked", stock }); + }, + + async predict(req, res) { + const { history } = req.body; + const forecast = PredictionEngine.forecast(history); + res.json({ forecast }); + } +}; diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/RouteEngine.js b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/RouteEngine.js new file mode 100644 index 00000000..a7b8cd00 --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/RouteEngine.js @@ -0,0 +1,5 @@ +export class RouteEngine { + static optimize(deliveries = []) { + return deliveries.sort((a, b) => a.distance - b.distance); + } +} diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/SupplierRanking.js b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/SupplierRanking.js new file mode 100644 index 00000000..6d0808ae --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/SupplierRanking.js @@ -0,0 +1,14 @@ +export class SupplierRanking { + static rank(suppliers) { + return suppliers.sort((a, b) => b.score - a.score); + } + + static calculateScore(stats) { + return ( + stats.onTimeDelivery * 0.4 + + stats.priceStability * 0.2 + + stats.quality * 0.3 + + stats.communication * 0.1 + ); + } +} diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/WarehouseHeatmap.js b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/WarehouseHeatmap.js new file mode 100644 index 00000000..c1696ae6 --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/WarehouseHeatmap.js @@ -0,0 +1,8 @@ +export class WarehouseHeatmap { + static generate(stockList) { + return stockList.map(item => ({ + product: item.productName, + temperature: item.quantity < item.reorderLevel ? "HOT" : "COLD" + })); + } +} diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/driverController.js b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/driverController.js new file mode 100644 index 00000000..3c46e116 --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/driverController.js @@ -0,0 +1,13 @@ +import eventBus from "../utils/eventBus.js"; + +export const DriverController = { + updateLocation(req, res) { + eventBus.emit("driver.location.update", req.body); + res.json({ status: "location updated" }); + }, + + confirmDelivery(req, res) { + eventBus.emit("delivery.completed", req.body); + res.json({ status: "delivery confirmed" }); + } +}; diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/CameraRecognition.js b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/CameraRecognition.js new file mode 100644 index 00000000..f1f59b93 --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/CameraRecognition.js @@ -0,0 +1,10 @@ +export class CameraRecognition { + static detect(frameData) { + return { + detectedItems: [ + { productId: "RM-CH-01", count: 12 }, + { productId: "RM-ML-02", count: 4 } + ] + }; + } +} diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/logistics-events.log b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/logistics-events.log new file mode 100644 index 00000000..d224214b --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/logistics-events.log @@ -0,0 +1,2 @@ +# Logistics AI Events Log +# System-generated events related to stock, delivery, and supplier AI. diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/AISafety.js b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/AISafety.js new file mode 100644 index 00000000..54457348 --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/AISafety.js @@ -0,0 +1,18 @@ +export class AISafety { + constructor() { + this.failCount = 0; + this.threshold = 3; + } + + recordFailure() { + this.failCount++; + if (this.failCount >= this.threshold) { + return { locked: true, message: "AI fail-lock triggered" }; + } + return { locked: false }; + } + + reset() { + this.failCount = 0; + } +} diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/utils/eventBus.js b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/utils/eventBus.js new file mode 100644 index 00000000..2d9b9dda --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/utils/eventBus.js @@ -0,0 +1,3 @@ +import { EventEmitter } from "events"; +const eventBus = new EventEmitter(); +export default eventBus; diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/utils/routes/driverRoutes.js b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/utils/routes/driverRoutes.js new file mode 100644 index 00000000..b671c1b4 --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/utils/routes/driverRoutes.js @@ -0,0 +1,9 @@ +import express from "express"; +import { DriverController } from "../controllers/driverController.js"; + +const router = express.Router(); + +router.post("/location", DriverController.updateLocation); +router.post("/confirm", DriverController.confirmDelivery); + +export default router; diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/utils/routes/routes/driverRoutes.js b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/utils/routes/routes/driverRoutes.js new file mode 100644 index 00000000..b671c1b4 --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/utils/routes/routes/driverRoutes.js @@ -0,0 +1,9 @@ +import express from "express"; +import { DriverController } from "../controllers/driverController.js"; + +const router = express.Router(); + +router.post("/location", DriverController.updateLocation); +router.post("/confirm", DriverController.confirmDelivery); + +export default router; diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/utils/routes/routes/services/RouteEngine.js b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/utils/routes/routes/services/RouteEngine.js new file mode 100644 index 00000000..a7b8cd00 --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/utils/routes/routes/services/RouteEngine.js @@ -0,0 +1,5 @@ +export class RouteEngine { + static optimize(deliveries = []) { + return deliveries.sort((a, b) => a.distance - b.distance); + } +} diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/utils/routes/routes/services/services/SupplierRanking.js b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/utils/routes/routes/services/services/SupplierRanking.js new file mode 100644 index 00000000..6d0808ae --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/utils/routes/routes/services/services/SupplierRanking.js @@ -0,0 +1,14 @@ +export class SupplierRanking { + static rank(suppliers) { + return suppliers.sort((a, b) => b.score - a.score); + } + + static calculateScore(stats) { + return ( + stats.onTimeDelivery * 0.4 + + stats.priceStability * 0.2 + + stats.quality * 0.3 + + stats.communication * 0.1 + ); + } +} diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/utils/routes/routes/services/services/services/PaymentsEngine.js b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/utils/routes/routes/services/services/services/PaymentsEngine.js new file mode 100644 index 00000000..24e40b8b --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/utils/routes/routes/services/services/services/PaymentsEngine.js @@ -0,0 +1,12 @@ +export class PaymentsEngine { + static validateTransaction(tx) { + if (!tx.amount || tx.amount <= 0) return false; + if (!tx.currency) return false; + if (!tx.userId) return false; + return true; + } + + static convertCurrency(amount, rate) { + return amount * rate; + } +} diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/utils/routes/routes/services/services/services/services/PiPayments.js b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/utils/routes/routes/services/services/services/services/PiPayments.js new file mode 100644 index 00000000..2773e416 --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/utils/routes/routes/services/services/services/services/PiPayments.js @@ -0,0 +1,16 @@ +import { Pi } from "@pi-network/pi-sdk"; + +export class PiPayments { + static async createPayment(amount, user) { + const payment = await Pi.createPayment({ + amount, + memo: "RoyalMix Payment", + metadata: { userId: user } + }); + return payment; + } + + static async verifyPayment(paymentId) { + return await Pi.verifyPayment(paymentId); + } +} diff --git a/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/utils/routes/routes/services/services/services/services/services/MobileMoney.js b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/utils/routes/routes/services/services/services/services/services/MobileMoney.js new file mode 100644 index 00000000..f424528b --- /dev/null +++ b/FILE & FOLDER STRUCTURE (Final / Clean /models/services/services/services/services/services/services/controllers/services/logs/services/utils/routes/routes/services/services/services/services/services/MobileMoney.js @@ -0,0 +1,9 @@ +export class MobileMoney { + static async sendMoney(phone, amount) { + return { status: "success", phone, amount }; + } + + static async receiveMoney(phone, amount) { + return { status: "received", phone, amount }; + } +} diff --git "a/FOLDER STRUCTURE \342\200\224 Royal Mix Global Super-App" "b/FOLDER STRUCTURE \342\200\224 Royal Mix Global Super-App" new file mode 100644 index 00000000..9965093e --- /dev/null +++ "b/FOLDER STRUCTURE \342\200\224 Royal Mix Global Super-App" @@ -0,0 +1,53 @@ +/royalmix-global +│ +├── /api +│ ├── /auth +│ ├── /payments +│ ├── /wallet +│ ├── /marketplace +│ ├── /liquor +│ ├── /pharmacy +│ └── index.js +│ +├── /config +│ ├── db.js +│ ├── pi-sdk.js +│ └── env.js +│ +├── /controllers +│ ├── authController.js +│ ├── paymentController.js +│ ├── walletController.js +│ ├── marketController.js +│ └── aiEngine.js +│ +├── /services +│ ├── PiPaymentService.js +│ ├── WalletService.js +│ ├── LiquorService.js +│ ├── PharmacyService.js +│ └── AI_Recommendation.js +│ +├── /models +│ ├── User.js +│ ├── Wallet.js +│ ├── Order.js +│ ├── Product.js +│ └── Transaction.js +│ +├── /utils +│ ├── logger.js +│ ├── validator.js +│ └── encryption.js +│ +├── /public +│ ├── icons +│ ├── banners +│ └── uploads +│ +├── /docs +│ ├── API_PAYMENTS.md +│ ├── INTEGRATION_GUIDE.md +│ └── SECURITY_POLICY.md +│ +└── server.js diff --git a/Governance_Principles.md b/Governance_Principles.md new file mode 100644 index 00000000..a657360d --- /dev/null +++ b/Governance_Principles.md @@ -0,0 +1,47 @@ +# Royal Mix Global — Governance Principles + +Royal Mix Global is governed by intelligence, ethics, and cooperation — +not force, politics, or coercion. + +--- + +## Core Governance Values +- Human dignity +- Freedom of creation +- Responsibility with power +- Transparency by default + +--- + +## Governance Model (V0.2) +- Platform governance, not political governance +- Clear rules, no hidden control +- Human oversight at all times +- AI as advisor, not authority + +--- + +## Moderation Philosophy +- No blanket censorship +- Context-aware moderation +- Community-first resolution +- Safety without silencing + +--- + +## Relationship with States & Institutions +- Infrastructure provider, not competitor +- Neutral technology stance +- Opt-in collaboration only + +--- + +## Trust Model +- Actions build reputation +- Reputation unlocks opportunity +- Abuse reduces access +- No permanent exclusion without cause + +--- + +Royal Mix Global exists to enable cooperation at scale. diff --git a/Monetization_Model_Pi.md b/Monetization_Model_Pi.md new file mode 100644 index 00000000..a0e76319 --- /dev/null +++ b/Monetization_Model_Pi.md @@ -0,0 +1,51 @@ +# Royal Mix Global — π-First Monetization Model (Testnet) + +## Core Rule +Royal Mix Global uses Pi Network utilities only. +No external currencies. No off-platform payments. + +--- + +## Monetization Philosophy +- Value creation before value extraction +- Trust over capital +- Participation over speculation + +--- + +## Revenue Flows (Testnet) + +### 1. Creator Rewards +- Content creation +- Community moderation +- Design, writing, media + +### 2. Micro-Tasks & Jobs +- AI-assisted task matching +- Reputation-based access +- Transparent reward logic + +### 3. Community Services +- Local services discovery +- Digital skills exchange +- Cooperative models + +--- + +## What is Explicitly Disabled +- Fiat payments +- Crypto bridges +- Speculation mechanics +- Gambling or financial promises + +--- + +## Compliance +- Pi SDK authentication only +- Pi transactions only +- Full auditability +- User consent required + +--- + +Monetization exists to reward contribution — not extract value. diff --git a/PI_AI_STUDIO_BACKEND_TASKS.md b/PI_AI_STUDIO_BACKEND_TASKS.md new file mode 100644 index 00000000..6df17733 --- /dev/null +++ b/PI_AI_STUDIO_BACKEND_TASKS.md @@ -0,0 +1,15 @@ +# Pi AI Studio Backend Responsibilities + +## Must Be Implemented as Real Logic + +1. Wallet balance must update only after confirmed transaction +2. Pi payments must use Pi SDK (Testnet first) +3. Orders change to PAID only after payment confirmation +4. Tax must be calculated per real transaction +5. Ledger entries must be written for every financial event +6. Government service requests must follow approval workflow +7. Agent commissions must be auto-calculated +8. Fraud detection scoring must run on transactions +9. Analytics data must be generated from real DB activity + +Fake balances or simulated payments are NOT allowed. diff --git a/Path: config/pi_domain_verification.txt Content: _pi-domain-verification cefc3ac44cdbbea470881534ced3b575e61706a7310cd2a60fc242553d9a198c8588944b7df8352ac4806bb89f8584b86c439bd1fcbb1c789e154ce3cb3dc73f TTL: 300 b/Path: config/pi_domain_verification.txt Content: _pi-domain-verification cefc3ac44cdbbea470881534ced3b575e61706a7310cd2a60fc242553d9a198c8588944b7df8352ac4806bb89f8584b86c439bd1fcbb1c789e154ce3cb3dc73f TTL: 300 new file mode 100644 index 00000000..3801ec05 --- /dev/null +++ b/Path: config/pi_domain_verification.txt Content: _pi-domain-verification cefc3ac44cdbbea470881534ced3b575e61706a7310cd2a60fc242553d9a198c8588944b7df8352ac4806bb89f8584b86c439bd1fcbb1c789e154ce3cb3dc73f TTL: 300 @@ -0,0 +1 @@ +cefc3ac44cdbbea470881534ced3b575e61706a7310cd2a60fc242553d9a198c8588944b7df8352ac4806bb89f8584b86c439bd1fcbb1c789e154ce3cb3dc73f diff --git "a/RoyalMix/demo/ \342\224\234\342\224\200 README.md \342\224\234\342\224\200 docs/ \342\224\202 \342\224\234\342\224\200 V0.2_Roadmap.md \342\224\202 \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\202 \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\202 \342\224\224\342\224\200 Governance_Principles.md \342\224\234\342\224\200 frontend/public/ \342\224\202 \342\224\224\342\224\200 validation-key.txt \342\224\234\342\224\200 review_form/docs/docs/docs/npm run dev" "b/RoyalMix/demo/ \342\224\234\342\224\200 README.md \342\224\234\342\224\200 docs/ \342\224\202 \342\224\234\342\224\200 V0.2_Roadmap.md \342\224\202 \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\202 \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\202 \342\224\224\342\224\200 Governance_Principles.md \342\224\234\342\224\200 frontend/public/ \342\224\202 \342\224\224\342\224\200 validation-key.txt \342\224\234\342\224\200 review_form/docs/docs/docs/npm run dev" new file mode 100644 index 00000000..11f233a1 --- /dev/null +++ "b/RoyalMix/demo/ \342\224\234\342\224\200 README.md \342\224\234\342\224\200 docs/ \342\224\202 \342\224\234\342\224\200 V0.2_Roadmap.md \342\224\202 \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\202 \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\202 \342\224\224\342\224\200 Governance_Principles.md \342\224\234\342\224\200 frontend/public/ \342\224\202 \342\224\224\342\224\200 validation-key.txt \342\224\234\342\224\200 review_form/docs/docs/docs/npm run dev" @@ -0,0 +1,15 @@ +--- + +## 3️⃣ Documentation paths + +**Folder:** `docs/` +**Files & commit messages:** + +| File | Commit message | +|------|----------------| +| `V0.2_Roadmap.md` | `docs: add V0.2 roadmap with Royal AI + monetization` | +| `Royal_AI_Concept.md` | `docs: add Royal AI concept documentation` | +| `Monetization_Model_Pi.md` | `docs: add Pi monetization model` | +| `Governance_Principles.md` | `docs: add governance principles` | + +**Example folder structure on GitHub:** diff --git "a/RoyalMix/demo/ \342\224\234\342\224\200 README.md \342\224\234\342\224\200 docs/ \342\224\202 \342\224\234\342\224\200 V0.2_Roadmap.md \342\224\202 \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\202 \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\202 \342\224\224\342\224\200 Governance_Principles.md \342\224\234\342\224\200 frontend/public/ \342\224\202 \342\224\224\342\224\200 validation-key.txt \342\224\234\342\224\200 review_form/docs/docs/docs/\342\224\234\342\224\200 V0.2_Roadmap.md \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\224\342\224\200 Governance_Principles.md" "b/RoyalMix/demo/ \342\224\234\342\224\200 README.md \342\224\234\342\224\200 docs/ \342\224\202 \342\224\234\342\224\200 V0.2_Roadmap.md \342\224\202 \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\202 \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\202 \342\224\224\342\224\200 Governance_Principles.md \342\224\234\342\224\200 frontend/public/ \342\224\202 \342\224\224\342\224\200 validation-key.txt \342\224\234\342\224\200 review_form/docs/docs/docs/\342\224\234\342\224\200 V0.2_Roadmap.md \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\224\342\224\200 Governance_Principles.md" new file mode 100644 index 00000000..f0d85792 --- /dev/null +++ "b/RoyalMix/demo/ \342\224\234\342\224\200 README.md \342\224\234\342\224\200 docs/ \342\224\202 \342\224\234\342\224\200 V0.2_Roadmap.md \342\224\202 \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\202 \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\202 \342\224\224\342\224\200 Governance_Principles.md \342\224\234\342\224\200 frontend/public/ \342\224\202 \342\224\224\342\224\200 validation-key.txt \342\224\234\342\224\200 review_form/docs/docs/docs/\342\224\234\342\224\200 V0.2_Roadmap.md \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\224\342\224\200 Governance_Principles.md" @@ -0,0 +1,20 @@ +**Content (copy-paste):** +```markdown +# Testnet Submission Form - Royal Mix Global + +**App Name:** Royal Mix Global +**Network:** Testnet +**URL:** https://royal-mix-global.onrender.com +**Development URL:** https://royal-mix-global.onrender.com + +**Features:** +- Pi SDK login only +- Pi-exclusive transactions +- Royal AI moderation +- Monetization in Pi +- Governance principles in place + +**Validation Key Path:** frontend/public/validation-key.txt + +**Additional Notes:** +This submission is ready for Testnet review. All docs, previews, and validation key are included. diff --git "a/RoyalMix/demo/ \342\224\234\342\224\200 README.md \342\224\234\342\224\200 docs/ \342\224\202 \342\224\234\342\224\200 V0.2_Roadmap.md \342\224\202 \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\202 \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\202 \342\224\224\342\224\200 Governance_Principles.md \342\224\234\342\224\200 frontend/public/ \342\224\202 \342\224\224\342\224\200 validation-key.txt \342\224\234\342\224\200 review_form/docs/docs/\342\224\234\342\224\200 V0.2_Roadmap.md \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\224\342\224\200 Governance_Principles.md" "b/RoyalMix/demo/ \342\224\234\342\224\200 README.md \342\224\234\342\224\200 docs/ \342\224\202 \342\224\234\342\224\200 V0.2_Roadmap.md \342\224\202 \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\202 \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\202 \342\224\224\342\224\200 Governance_Principles.md \342\224\234\342\224\200 frontend/public/ \342\224\202 \342\224\224\342\224\200 validation-key.txt \342\224\234\342\224\200 review_form/docs/docs/\342\224\234\342\224\200 V0.2_Roadmap.md \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\224\342\224\200 Governance_Principles.md" new file mode 100644 index 00000000..f0d85792 --- /dev/null +++ "b/RoyalMix/demo/ \342\224\234\342\224\200 README.md \342\224\234\342\224\200 docs/ \342\224\202 \342\224\234\342\224\200 V0.2_Roadmap.md \342\224\202 \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\202 \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\202 \342\224\224\342\224\200 Governance_Principles.md \342\224\234\342\224\200 frontend/public/ \342\224\202 \342\224\224\342\224\200 validation-key.txt \342\224\234\342\224\200 review_form/docs/docs/\342\224\234\342\224\200 V0.2_Roadmap.md \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\224\342\224\200 Governance_Principles.md" @@ -0,0 +1,20 @@ +**Content (copy-paste):** +```markdown +# Testnet Submission Form - Royal Mix Global + +**App Name:** Royal Mix Global +**Network:** Testnet +**URL:** https://royal-mix-global.onrender.com +**Development URL:** https://royal-mix-global.onrender.com + +**Features:** +- Pi SDK login only +- Pi-exclusive transactions +- Royal AI moderation +- Monetization in Pi +- Governance principles in place + +**Validation Key Path:** frontend/public/validation-key.txt + +**Additional Notes:** +This submission is ready for Testnet review. All docs, previews, and validation key are included. diff --git "a/RoyalMix/demo/ \342\224\234\342\224\200 README.md \342\224\234\342\224\200 docs/ \342\224\202 \342\224\234\342\224\200 V0.2_Roadmap.md \342\224\202 \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\202 \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\202 \342\224\224\342\224\200 Governance_Principles.md \342\224\234\342\224\200 frontend/public/ \342\224\202 \342\224\224\342\224\200 validation-key.txt \342\224\234\342\224\200 review_form/docs/\342\224\234\342\224\200 V0.2_Roadmap.md \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\224\342\224\200 Governance_Principles.md" "b/RoyalMix/demo/ \342\224\234\342\224\200 README.md \342\224\234\342\224\200 docs/ \342\224\202 \342\224\234\342\224\200 V0.2_Roadmap.md \342\224\202 \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\202 \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\202 \342\224\224\342\224\200 Governance_Principles.md \342\224\234\342\224\200 frontend/public/ \342\224\202 \342\224\224\342\224\200 validation-key.txt \342\224\234\342\224\200 review_form/docs/\342\224\234\342\224\200 V0.2_Roadmap.md \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\224\342\224\200 Governance_Principles.md" new file mode 100644 index 00000000..83371aff --- /dev/null +++ "b/RoyalMix/demo/ \342\224\234\342\224\200 README.md \342\224\234\342\224\200 docs/ \342\224\202 \342\224\234\342\224\200 V0.2_Roadmap.md \342\224\202 \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\202 \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\202 \342\224\224\342\224\200 Governance_Principles.md \342\224\234\342\224\200 frontend/public/ \342\224\202 \342\224\224\342\224\200 validation-key.txt \342\224\234\342\224\200 review_form/docs/\342\224\234\342\224\200 V0.2_Roadmap.md \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\224\342\224\200 Governance_Principles.md" @@ -0,0 +1,6 @@ +--- + +## 4️⃣ Review form for Testnet + +**Path:** `review_form/Testnet_Submission_Form.md` +**Commit message:** diff --git "a/RoyalMix/demo/ \342\224\234\342\224\200 README.md \342\224\234\342\224\200 docs/ \342\224\202 \342\224\234\342\224\200 V0.2_Roadmap.md \342\224\202 \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\202 \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\202 \342\224\224\342\224\200 Governance_Principles.md \342\224\234\342\224\200 frontend/public/ \342\224\202 \342\224\224\342\224\200 validation-key.txt \342\224\234\342\224\200 review_form/npm run dev" "b/RoyalMix/demo/ \342\224\234\342\224\200 README.md \342\224\234\342\224\200 docs/ \342\224\202 \342\224\234\342\224\200 V0.2_Roadmap.md \342\224\202 \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\202 \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\202 \342\224\224\342\224\200 Governance_Principles.md \342\224\234\342\224\200 frontend/public/ \342\224\202 \342\224\224\342\224\200 validation-key.txt \342\224\234\342\224\200 review_form/npm run dev" new file mode 100644 index 00000000..5fdd18ff --- /dev/null +++ "b/RoyalMix/demo/ \342\224\234\342\224\200 README.md \342\224\234\342\224\200 docs/ \342\224\202 \342\224\234\342\224\200 V0.2_Roadmap.md \342\224\202 \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\202 \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\202 \342\224\224\342\224\200 Governance_Principles.md \342\224\234\342\224\200 frontend/public/ \342\224\202 \342\224\224\342\224\200 validation-key.txt \342\224\234\342\224\200 review_form/npm run dev" @@ -0,0 +1 @@ +npm install diff --git "a/RoyalMix/demo/ \342\224\234\342\224\200 README.md \342\224\234\342\224\200 docs/ \342\224\202 \342\224\234\342\224\200 V0.2_Roadmap.md \342\224\202 \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\202 \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\202 \342\224\224\342\224\200 Governance_Principles.md \342\224\234\342\224\200 frontend/public/ \342\224\202 \342\224\224\342\224\200 validation-key.txt \342\224\234\342\224\200 review_form/\342\224\202 \342\224\224\342\224\200 Testnet_Submission_Form.md" "b/RoyalMix/demo/ \342\224\234\342\224\200 README.md \342\224\234\342\224\200 docs/ \342\224\202 \342\224\234\342\224\200 V0.2_Roadmap.md \342\224\202 \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\202 \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\202 \342\224\224\342\224\200 Governance_Principles.md \342\224\234\342\224\200 frontend/public/ \342\224\202 \342\224\224\342\224\200 validation-key.txt \342\224\234\342\224\200 review_form/\342\224\202 \342\224\224\342\224\200 Testnet_Submission_Form.md" new file mode 100644 index 00000000..2435affe --- /dev/null +++ "b/RoyalMix/demo/ \342\224\234\342\224\200 README.md \342\224\234\342\224\200 docs/ \342\224\202 \342\224\234\342\224\200 V0.2_Roadmap.md \342\224\202 \342\224\234\342\224\200 Royal_AI_Concept.md \342\224\202 \342\224\234\342\224\200 Monetization_Model_Pi.md \342\224\202 \342\224\224\342\224\200 Governance_Principles.md \342\224\234\342\224\200 frontend/public/ \342\224\202 \342\224\224\342\224\200 validation-key.txt \342\224\234\342\224\200 review_form/\342\224\202 \342\224\224\342\224\200 Testnet_Submission_Form.md" @@ -0,0 +1,22 @@ +# Royal Mix Global + +Royal Mix Global is a utility platform powering creators, businesses, and communities with secure services, jobs, media, and Pi transactions. Built on the Pi Network Testnet, this app leverages: + +- **Royal AI**: AI-powered moderation and creative utilities +- **Pi-first monetization**: User rewards and Pi-based payments +- **Decentralized governance**: Community-driven principles and decision-making + +## Documentation +See detailed docs in `/docs`: +- V0.2_Roadmap.md +- Royal_AI_Concept.md +- Monetization_Model_Pi.md +- Governance_Principles.md + +## Getting Started + +### Sandbox Development +1. Clone the repo: + ```bash + git clone https://github.com/RoyalMix/demo.git + cd demo diff --git a/RoyalMix/demo/frontend/public b/RoyalMix/demo/frontend/public new file mode 100644 index 00000000..3801ec05 --- /dev/null +++ b/RoyalMix/demo/frontend/public @@ -0,0 +1 @@ +cefc3ac44cdbbea470881534ced3b575e61706a7310cd2a60fc242553d9a198c8588944b7df8352ac4806bb89f8584b86c439bd1fcbb1c789e154ce3cb3dc73f diff --git a/Royal_AI_Concept.md b/Royal_AI_Concept.md new file mode 100644 index 00000000..5bcf5a9f --- /dev/null +++ b/Royal_AI_Concept.md @@ -0,0 +1,48 @@ +# Royal AI — Sovereign Creative Intelligence Engine + +Royal AI is the intelligence layer of Royal Mix Global. +It is not a chatbot. It is not an assistant. +It is an orchestration engine. + +--- + +## Purpose +- Empower humans, not replace them +- Coordinate creators, builders, and communities +- Transform trust into opportunity +- Enable Africa to export intelligence, not raw data + +--- + +## Core Principles +- Human–AI co-creation +- Transparency by design +- Safety over speed +- Context over generic output + +--- + +## Capabilities (V0.2) +- Creative assistance (text, ideas, structure) +- Task coordination & guidance +- Opportunity discovery +- Risk & clarity prompts +- Adaptive intelligence levels + +--- + +## What Royal AI Does NOT Do +- No political control +- No censorship engine +- No surveillance +- No autonomous decision-making + +--- + +## Positioning +Royal AI acts as: +- Brain → not ruler +- Guide → not authority +- Infrastructure → not platform lock-in + +“When the network thinks, it thinks through people.” diff --git a/SUPER_DATABASE_ARCHITECTURE.md b/SUPER_DATABASE_ARCHITECTURE.md new file mode 100644 index 00000000..63a86b3d --- /dev/null +++ b/SUPER_DATABASE_ARCHITECTURE.md @@ -0,0 +1,54 @@ +# Royal Mix Global — Super Database Architecture + +## Core Databases + +### 1. Main Relational Database (PostgreSQL) +Stores operational data. + +Tables: +- users (citizens, businesses, agents) +- wallets +- wallet_transactions +- products +- orders +- order_items +- merchant_profiles +- properties +- leases +- rent_payments + +### 2. Financial Ledger Database (Immutable) +Stores double-entry financial records. + +Tables: +- ledger_entries +(transaction_id, debit_account, credit_account, amount, currency, hash, timestamp) + +Purpose: +- Financial audit trail +- Tax verification +- Future blockchain anchoring + +### 3. Analytics & AI Database +Used for dashboards and AI engines. + +Tables: +- user_activity_logs +- transaction_metrics +- marketplace_stats +- agent_performance +- economic_indicators + +### 4. Cache Layer (Redis) +Used for: +- Wallet balances (fast reads) +- Sessions +- OTP codes +- Rate limiting + +### 5. Document Storage +Used for: +- IDs +- Business licenses +- Contracts +- Property documents diff --git a/V0.2_Roadmap.md b/V0.2_Roadmap.md new file mode 100644 index 00000000..eec1d575 --- /dev/null +++ b/V0.2_Roadmap.md @@ -0,0 +1,57 @@ +# Royal Mix Global — V0.2 Roadmap +## From Demo App to Digital Nation Infrastructure + +### Objective +Transition Royal Mix Global from a Pi Demo-based app into an Africa-first, +globally scalable intelligent platform powered by Royal AI. + +--- + +## Phase V0.2 — Intelligence & Utility (Testnet Safe) + +### Core Goals +- Introduce Royal AI as a creative & coordination engine +- Enable π-first monetization (testnet only) +- Prove trust, usefulness, and adoption readiness +- Stay 100% compliant with Pi Network policies + +--- + +## Key Components + +### 1. Royal AI (Light Core) +- AI-assisted creation & decision support +- Context-aware (Africa-first logic) +- Skill-adaptive responses +- Human-in-the-loop by default + +### 2. Monetization (π Testnet) +- Creator micro-rewards +- Verified micro-tasks +- Reputation → opportunity mapping +- No external currency + +### 3. Community Utility +- Jobs & services discovery +- Trust & reputation indicators +- Creator and builder dashboards + +--- + +## What V0.2 is NOT +- Not a government system +- Not a financial institution +- Not autonomous governance +- Not mainnet monetization + +--- + +## Success Metrics +- Stable Pi SDK authentication +- Successful testnet transactions +- Positive user retention +- Clear upgrade path to V0.3+ + +--- + +Royal Mix Global evolves carefully — power through intelligence, not force. diff --git a/action_executor.js b/action_executor.js new file mode 100644 index 00000000..54028a33 --- /dev/null +++ b/action_executor.js @@ -0,0 +1,6 @@ +export class ActionExecutor { + perform(intent, data) { + if (intent === "ORDER_STATUS") return "Your order is 15 minutes away."; + return "How may I assist you?"; + } +} diff --git a/adaptive_layout.js b/adaptive_layout.js new file mode 100644 index 00000000..75bb0fae --- /dev/null +++ b/adaptive_layout.js @@ -0,0 +1,9 @@ +export class AdaptiveLayout { + optimize(userContext) { + return { + fontScale: userContext.age > 45 ? 1.3 : 1.0, + buttonSize: userContext.device === "small" ? "large" : "normal", + layout: userContext.networkSpeed < 2 ? "lite" : "full" + }; + } +} diff --git a/ads-engine /ui AdsDashboard.js CreateAdForm.js AdAnalytics.js AdBilling.js b/ads-engine /ui AdsDashboard.js CreateAdForm.js AdAnalytics.js AdBilling.js new file mode 100644 index 00000000..c0ce820b --- /dev/null +++ b/ads-engine /ui AdsDashboard.js CreateAdForm.js AdAnalytics.js AdBilling.js @@ -0,0 +1,4 @@ +Create ad campaigns +Promote marketplace items +Boost seller visibility +Real-time ad spending reports diff --git a/ads-engine/ai/AdBiddingEngine.js b/ads-engine/ai/AdBiddingEngine.js new file mode 100644 index 00000000..159419ed --- /dev/null +++ b/ads-engine/ai/AdBiddingEngine.js @@ -0,0 +1,4 @@ +AI Logic +Auction system like Facebook/Google +Score = Bid + Relevance + CTR +Highest score wins impression diff --git a/ads-engine/ai/core /gateway /auth /users /payments /pi-sdk /wallet /modules /market /pharmacy /liquor /delivery /fleet /inventory /ads /search /fraud /services /logistics-ai /prediction /auto-reorder /supplier-ranking /heatmaps /routing-ai /ui /dashboard /seller-center /driver-center /wallet /ads-manager b/ads-engine/ai/core /gateway /auth /users /payments /pi-sdk /wallet /modules /market /pharmacy /liquor /delivery /fleet /inventory /ads /search /fraud /services /logistics-ai /prediction /auto-reorder /supplier-ranking /heatmaps /routing-ai /ui /dashboard /seller-center /driver-center /wallet /ads-manager new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/ads-engine/ai/core /gateway /auth /users /payments /pi-sdk /wallet /modules /market /pharmacy /liquor /delivery /fleet /inventory /ads /search /fraud /services /logistics-ai /prediction /auto-reorder /supplier-ranking /heatmaps /routing-ai /ui /dashboard /seller-center /driver-center /wallet /ads-manager @@ -0,0 +1 @@ + diff --git a/ads-engine/ai/core /gateway /auth /users /payments /pi-sdk /wallet /modules /market /pharmacy /liquor /delivery /fleet /inventory /ads /search /fraud /services /logistics-ai /prediction /auto-reorder /supplier-ranking /heatmaps /routing-ai /ui /dashboard /seller-center /driver-center /wallet /services/ai-support ChatFlowEngine.js IntentClassifier.js KnowledgeBase.js EscalationHandler.js /ui/modules/modules/core/rmix-os AdminConsole.js StaffRoles.js PermissionsMatrix.js b/ads-engine/ai/core /gateway /auth /users /payments /pi-sdk /wallet /modules /market /pharmacy /liquor /delivery /fleet /inventory /ads /search /fraud /services /logistics-ai /prediction /auto-reorder /supplier-ranking /heatmaps /routing-ai /ui /dashboard /seller-center /driver-center /wallet /services/ai-support ChatFlowEngine.js IntentClassifier.js KnowledgeBase.js EscalationHandler.js /ui/modules/modules/core/rmix-os AdminConsole.js StaffRoles.js PermissionsMatrix.js new file mode 100644 index 00000000..0cefd812 --- /dev/null +++ b/ads-engine/ai/core /gateway /auth /users /payments /pi-sdk /wallet /modules /market /pharmacy /liquor /delivery /fleet /inventory /ads /search /fraud /services /logistics-ai /prediction /auto-reorder /supplier-ranking /heatmaps /routing-ai /ui /dashboard /seller-center /driver-center /wallet /services/ai-support ChatFlowEngine.js IntentClassifier.js KnowledgeBase.js EscalationHandler.js /ui/modules/modules/core/rmix-os AdminConsole.js StaffRoles.js PermissionsMatrix.js @@ -0,0 +1,4 @@ +⚙️ Features +Permission-based access control +Department workflow automation +Internal communication channels diff --git a/ads-engine/ai/core /gateway /auth /users /payments /pi-sdk /wallet /modules /market /pharmacy /liquor /delivery /fleet /inventory /ads /search /fraud /services /logistics-ai /prediction /auto-reorder /supplier-ranking /heatmaps /routing-ai /ui /dashboard /seller-center /driver-center /wallet /services/ai-support ChatFlowEngine.js IntentClassifier.js KnowledgeBase.js EscalationHandler.js /ui/modules/modules/settlements SettlementEngine.js Ledger.js PayoutScheduler.js WalletSync.js b/ads-engine/ai/core /gateway /auth /users /payments /pi-sdk /wallet /modules /market /pharmacy /liquor /delivery /fleet /inventory /ads /search /fraud /services /logistics-ai /prediction /auto-reorder /supplier-ranking /heatmaps /routing-ai /ui /dashboard /seller-center /driver-center /wallet /services/ai-support ChatFlowEngine.js IntentClassifier.js KnowledgeBase.js EscalationHandler.js /ui/modules/modules/settlements SettlementEngine.js Ledger.js PayoutScheduler.js WalletSync.js new file mode 100644 index 00000000..c78b87da --- /dev/null +++ b/ads-engine/ai/core /gateway /auth /users /payments /pi-sdk /wallet /modules /market /pharmacy /liquor /delivery /fleet /inventory /ads /search /fraud /services /logistics-ai /prediction /auto-reorder /supplier-ranking /heatmaps /routing-ai /ui /dashboard /seller-center /driver-center /wallet /services/ai-support ChatFlowEngine.js IntentClassifier.js KnowledgeBase.js EscalationHandler.js /ui/modules/modules/settlements SettlementEngine.js Ledger.js PayoutScheduler.js WalletSync.js @@ -0,0 +1,5 @@ +Key Features +Pi payments automatic payout +Mobile money settlements +Ledger reconciliations +Failed payout retries diff --git a/ads-engine/ai/core /gateway /auth /users /payments /pi-sdk /wallet /modules /market /pharmacy /liquor /delivery /fleet /inventory /ads /search /fraud /services /logistics-ai /prediction /auto-reorder /supplier-ranking /heatmaps /routing-ai /ui /dashboard /seller-center /driver-center /wallet /services/ai-support ChatFlowEngine.js IntentClassifier.js KnowledgeBase.js EscalationHandler.js /ui/modules/settlements SettlementEngine.js Ledger.js PayoutScheduler.js WalletSync.js b/ads-engine/ai/core /gateway /auth /users /payments /pi-sdk /wallet /modules /market /pharmacy /liquor /delivery /fleet /inventory /ads /search /fraud /services /logistics-ai /prediction /auto-reorder /supplier-ranking /heatmaps /routing-ai /ui /dashboard /seller-center /driver-center /wallet /services/ai-support ChatFlowEngine.js IntentClassifier.js KnowledgeBase.js EscalationHandler.js /ui/modules/settlements SettlementEngine.js Ledger.js PayoutScheduler.js WalletSync.js new file mode 100644 index 00000000..c78b87da --- /dev/null +++ b/ads-engine/ai/core /gateway /auth /users /payments /pi-sdk /wallet /modules /market /pharmacy /liquor /delivery /fleet /inventory /ads /search /fraud /services /logistics-ai /prediction /auto-reorder /supplier-ranking /heatmaps /routing-ai /ui /dashboard /seller-center /driver-center /wallet /services/ai-support ChatFlowEngine.js IntentClassifier.js KnowledgeBase.js EscalationHandler.js /ui/modules/settlements SettlementEngine.js Ledger.js PayoutScheduler.js WalletSync.js @@ -0,0 +1,5 @@ +Key Features +Pi payments automatic payout +Mobile money settlements +Ledger reconciliations +Failed payout retries diff --git a/ads-engine/ai/core /gateway /auth /users /payments /pi-sdk /wallet /modules /market /pharmacy /liquor /delivery /fleet /inventory /ads /search /fraud /services /logistics-ai /prediction /auto-reorder /supplier-ranking /heatmaps /routing-ai /ui /dashboard /seller-center /driver-center /wallet /services/ai-support ChatFlowEngine.js IntentClassifier.js KnowledgeBase.js EscalationHandler.js /ui/support supportChatScreen.jsx faqScreen.jsx b/ads-engine/ai/core /gateway /auth /users /payments /pi-sdk /wallet /modules /market /pharmacy /liquor /delivery /fleet /inventory /ads /search /fraud /services /logistics-ai /prediction /auto-reorder /supplier-ranking /heatmaps /routing-ai /ui /dashboard /seller-center /driver-center /wallet /services/ai-support ChatFlowEngine.js IntentClassifier.js KnowledgeBase.js EscalationHandler.js /ui/support supportChatScreen.jsx faqScreen.jsx new file mode 100644 index 00000000..d3771c7c --- /dev/null +++ b/ads-engine/ai/core /gateway /auth /users /payments /pi-sdk /wallet /modules /market /pharmacy /liquor /delivery /fleet /inventory /ads /search /fraud /services /logistics-ai /prediction /auto-reorder /supplier-ranking /heatmaps /routing-ai /ui /dashboard /seller-center /driver-center /wallet /services/ai-support ChatFlowEngine.js IntentClassifier.js KnowledgeBase.js EscalationHandler.js /ui/support supportChatScreen.jsx faqScreen.jsx @@ -0,0 +1,6 @@ +AI Logic Summary +Intent classification +Auto-response +Escalation to human agent +Ticket tracking +Voice-to-text diff --git a/ads-engine/ai/notifications EventDispatcher.js PushService.js InAppNotifications.js b/ads-engine/ai/notifications EventDispatcher.js PushService.js InAppNotifications.js new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/ads-engine/ai/notifications EventDispatcher.js PushService.js InAppNotifications.js @@ -0,0 +1 @@ + diff --git a/ads-engine/ai/search-engine SearchAPI.js RankingLogic.js AutoSuggest.js b/ads-engine/ai/search-engine SearchAPI.js RankingLogic.js AutoSuggest.js new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/ads-engine/ai/search-engine SearchAPI.js RankingLogic.js AutoSuggest.js @@ -0,0 +1 @@ + diff --git a/ads-engine/ai/seller-center Dashboard.js SalesAnalytics.js InventoryView.js AdManager.js b/ads-engine/ai/seller-center Dashboard.js SalesAnalytics.js InventoryView.js AdManager.js new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/ads-engine/ai/seller-center Dashboard.js SalesAnalytics.js InventoryView.js AdManager.js @@ -0,0 +1 @@ + diff --git "a/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 config/ \342\224\202 \342\224\234\342\224\200\342\224\200 scheduler.json \342\224\202 \342\224\234\342\224\200\342\224\200 channels.json \342\224\202 \342\224\224\342\224\200\342\224\200 optimization_rules.json \342\224\202 \342\224\234\342\224\200\342\224\200 core/ \342\224\202 \342\224\234\342\224\200\342\224\200 optimizer.py \342\224\202 \342\224\234\342\224\200\342\224\200 scheduler.py \342\224\202 \342\224\234\342\224\200\342\224\200 content_ranker.py \342\224\202 \342\224\224\342\224\200\342\224\200 analytics_engine.py \342\224\202 \342\224\234\342\224\200\342\224\200 models/ \342\224\202 \342\224\234\342\224\200\342\224\200 ml_model.pkl \342\224\202 \342\224\234\342\224\200\342\224\200 ranking_model.pkl \342\224\202 \342\224\224\342\224\200\342\224\200 predictor.pkl \342\224\202 \342\224\234\342\224\200\342\224\200 api/ \342\224\202 \342\224\234\342\224\200\342\224\200 index.js \342\224\202 \342\224\234\342\224\200\342\224\200 auth.js \342\224\202 \342\224\234\342\224\200\342\224\200 optimizer_routes.js \342\224\202 \342\224\224\342\224\200\342\224\200 analytics_routes.js \342\224\202 \342\224\234\342\224\200\342\224\200 scripts/ \342\224\202 \342\224\234\342\224\200\342\224\200 run_daily.sh \342\224\202 \342\224\234\342\224\200\342\224\200 run_weekly.sh \342\224\202 \342\224\224\342\224\200\342\224\200 clean_cache.sh \342\224\202 \342\224\234\342\224\200\342\224\200 cron/ \342\224\202 \342\224\234\342\224\200\342\224\200 cron_daily.txt \342\224\202 \342\224\224\342\224\200\342\224\200 cron_hourly.txt \342\224\202 \342\224\234\342\224\200\342\224\200 logs/ \342\224\202 \342\224\234\342\224\200\342\224\200 system.log \342\224\202 \342\224\234\342\224\200\342\224\200 optimization.log \342\224\202 \342\224\224\342\224\200\342\224\200 errors.log \342\224\202 \342\224\224\342\224\200\342\224\200 docs/\342\224\234\342\224\200\342\224\200 ai_system_overview.md \342\224\234\342\224\200\342\224\200 optimization_engine_v2.md \342\224\224\342\224\200\342\224\200 api_documentation.md" "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 config/ \342\224\202 \342\224\234\342\224\200\342\224\200 scheduler.json \342\224\202 \342\224\234\342\224\200\342\224\200 channels.json \342\224\202 \342\224\224\342\224\200\342\224\200 optimization_rules.json \342\224\202 \342\224\234\342\224\200\342\224\200 core/ \342\224\202 \342\224\234\342\224\200\342\224\200 optimizer.py \342\224\202 \342\224\234\342\224\200\342\224\200 scheduler.py \342\224\202 \342\224\234\342\224\200\342\224\200 content_ranker.py \342\224\202 \342\224\224\342\224\200\342\224\200 analytics_engine.py \342\224\202 \342\224\234\342\224\200\342\224\200 models/ \342\224\202 \342\224\234\342\224\200\342\224\200 ml_model.pkl \342\224\202 \342\224\234\342\224\200\342\224\200 ranking_model.pkl \342\224\202 \342\224\224\342\224\200\342\224\200 predictor.pkl \342\224\202 \342\224\234\342\224\200\342\224\200 api/ \342\224\202 \342\224\234\342\224\200\342\224\200 index.js \342\224\202 \342\224\234\342\224\200\342\224\200 auth.js \342\224\202 \342\224\234\342\224\200\342\224\200 optimizer_routes.js \342\224\202 \342\224\224\342\224\200\342\224\200 analytics_routes.js \342\224\202 \342\224\234\342\224\200\342\224\200 scripts/ \342\224\202 \342\224\234\342\224\200\342\224\200 run_daily.sh \342\224\202 \342\224\234\342\224\200\342\224\200 run_weekly.sh \342\224\202 \342\224\224\342\224\200\342\224\200 clean_cache.sh \342\224\202 \342\224\234\342\224\200\342\224\200 cron/ \342\224\202 \342\224\234\342\224\200\342\224\200 cron_daily.txt \342\224\202 \342\224\224\342\224\200\342\224\200 cron_hourly.txt \342\224\202 \342\224\234\342\224\200\342\224\200 logs/ \342\224\202 \342\224\234\342\224\200\342\224\200 system.log \342\224\202 \342\224\234\342\224\200\342\224\200 optimization.log \342\224\202 \342\224\224\342\224\200\342\224\200 errors.log \342\224\202 \342\224\224\342\224\200\342\224\200 docs/\342\224\234\342\224\200\342\224\200 ai_system_overview.md \342\224\234\342\224\200\342\224\200 optimization_engine_v2.md \342\224\224\342\224\200\342\224\200 api_documentation.md" new file mode 100644 index 00000000..f2e73d0c --- /dev/null +++ "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 config/ \342\224\202 \342\224\234\342\224\200\342\224\200 scheduler.json \342\224\202 \342\224\234\342\224\200\342\224\200 channels.json \342\224\202 \342\224\224\342\224\200\342\224\200 optimization_rules.json \342\224\202 \342\224\234\342\224\200\342\224\200 core/ \342\224\202 \342\224\234\342\224\200\342\224\200 optimizer.py \342\224\202 \342\224\234\342\224\200\342\224\200 scheduler.py \342\224\202 \342\224\234\342\224\200\342\224\200 content_ranker.py \342\224\202 \342\224\224\342\224\200\342\224\200 analytics_engine.py \342\224\202 \342\224\234\342\224\200\342\224\200 models/ \342\224\202 \342\224\234\342\224\200\342\224\200 ml_model.pkl \342\224\202 \342\224\234\342\224\200\342\224\200 ranking_model.pkl \342\224\202 \342\224\224\342\224\200\342\224\200 predictor.pkl \342\224\202 \342\224\234\342\224\200\342\224\200 api/ \342\224\202 \342\224\234\342\224\200\342\224\200 index.js \342\224\202 \342\224\234\342\224\200\342\224\200 auth.js \342\224\202 \342\224\234\342\224\200\342\224\200 optimizer_routes.js \342\224\202 \342\224\224\342\224\200\342\224\200 analytics_routes.js \342\224\202 \342\224\234\342\224\200\342\224\200 scripts/ \342\224\202 \342\224\234\342\224\200\342\224\200 run_daily.sh \342\224\202 \342\224\234\342\224\200\342\224\200 run_weekly.sh \342\224\202 \342\224\224\342\224\200\342\224\200 clean_cache.sh \342\224\202 \342\224\234\342\224\200\342\224\200 cron/ \342\224\202 \342\224\234\342\224\200\342\224\200 cron_daily.txt \342\224\202 \342\224\224\342\224\200\342\224\200 cron_hourly.txt \342\224\202 \342\224\234\342\224\200\342\224\200 logs/ \342\224\202 \342\224\234\342\224\200\342\224\200 system.log \342\224\202 \342\224\234\342\224\200\342\224\200 optimization.log \342\224\202 \342\224\224\342\224\200\342\224\200 errors.log \342\224\202 \342\224\224\342\224\200\342\224\200 docs/\342\224\234\342\224\200\342\224\200 ai_system_overview.md \342\224\234\342\224\200\342\224\200 optimization_engine_v2.md \342\224\224\342\224\200\342\224\200 api_documentation.md" @@ -0,0 +1,14 @@ +const express = require("express"); +const app = express(); +const optimizerRoutes = require("./optimizer_routes"); +const analyticsRoutes = require("./analytics_routes"); +const auth = require("./auth"); + +app.use(express.json()); +app.use("/auth", auth); +app.use("/optimizer", optimizerRoutes); +app.use("/analytics", analyticsRoutes); + +app.listen(3000, () => { + console.log("API running on port 3000"); +}); diff --git "a/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 events/ \342\224\202 \342\224\234\342\224\200\342\224\200 dispatcher.js \342\224\202 \342\224\234\342\224\200\342\224\200 listeners/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_new_content.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_schedule_tick.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_trending_detected.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 on_low_performance.js \342\224\202 \342\224\234\342\224\200\342\224\200 queue/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 event_queue.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 workers.js \342\224\202 \342\224\224\342\224\200\342\224\200 rules/ \342\224\202 \342\224\234\342\224\200\342\224\200 trigger_rules.json \342\224\202 \342\224\224\342\224\200\342\224\200 priorities.json \342\224\202 \342\224\224\342\224\200\342\224\200 docs/event_queue.js" "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 events/ \342\224\202 \342\224\234\342\224\200\342\224\200 dispatcher.js \342\224\202 \342\224\234\342\224\200\342\224\200 listeners/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_new_content.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_schedule_tick.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_trending_detected.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 on_low_performance.js \342\224\202 \342\224\234\342\224\200\342\224\200 queue/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 event_queue.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 workers.js \342\224\202 \342\224\224\342\224\200\342\224\200 rules/ \342\224\202 \342\224\234\342\224\200\342\224\200 trigger_rules.json \342\224\202 \342\224\224\342\224\200\342\224\200 priorities.json \342\224\202 \342\224\224\342\224\200\342\224\200 docs/event_queue.js" new file mode 100644 index 00000000..3e3a6fb7 --- /dev/null +++ "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 events/ \342\224\202 \342\224\234\342\224\200\342\224\200 dispatcher.js \342\224\202 \342\224\234\342\224\200\342\224\200 listeners/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_new_content.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_schedule_tick.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_trending_detected.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 on_low_performance.js \342\224\202 \342\224\234\342\224\200\342\224\200 queue/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 event_queue.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 workers.js \342\224\202 \342\224\224\342\224\200\342\224\200 rules/ \342\224\202 \342\224\234\342\224\200\342\224\200 trigger_rules.json \342\224\202 \342\224\224\342\224\200\342\224\200 priorities.json \342\224\202 \342\224\224\342\224\200\342\224\200 docs/event_queue.js" @@ -0,0 +1,10 @@ +const queue = []; + +function addEvent(event) { + queue.push(event); +} +function getNextEvent() { + return queue.shift(); +} + +module.exports = { addEvent, getNextEvent }; diff --git "a/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 events/ \342\224\202 \342\224\234\342\224\200\342\224\200 dispatcher.js \342\224\202 \342\224\234\342\224\200\342\224\200 listeners/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_new_content.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_schedule_tick.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_trending_detected.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 on_low_performance.js \342\224\202 \342\224\234\342\224\200\342\224\200 queue/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 event_queue.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 workers.js \342\224\202 \342\224\224\342\224\200\342\224\200 rules/ \342\224\202 \342\224\234\342\224\200\342\224\200 trigger_rules.json \342\224\202 \342\224\224\342\224\200\342\224\200 priorities.json \342\224\202 \342\224\224\342\224\200\342\224\200 docs/on_low_performance.js" "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 events/ \342\224\202 \342\224\234\342\224\200\342\224\200 dispatcher.js \342\224\202 \342\224\234\342\224\200\342\224\200 listeners/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_new_content.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_schedule_tick.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_trending_detected.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 on_low_performance.js \342\224\202 \342\224\234\342\224\200\342\224\200 queue/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 event_queue.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 workers.js \342\224\202 \342\224\224\342\224\200\342\224\200 rules/ \342\224\202 \342\224\234\342\224\200\342\224\200 trigger_rules.json \342\224\202 \342\224\224\342\224\200\342\224\200 priorities.json \342\224\202 \342\224\224\342\224\200\342\224\200 docs/on_low_performance.js" new file mode 100644 index 00000000..5685954d --- /dev/null +++ "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 events/ \342\224\202 \342\224\234\342\224\200\342\224\200 dispatcher.js \342\224\202 \342\224\234\342\224\200\342\224\200 listeners/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_new_content.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_schedule_tick.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_trending_detected.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 on_low_performance.js \342\224\202 \342\224\234\342\224\200\342\224\200 queue/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 event_queue.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 workers.js \342\224\202 \342\224\224\342\224\200\342\224\200 rules/ \342\224\202 \342\224\234\342\224\200\342\224\200 trigger_rules.json \342\224\202 \342\224\224\342\224\200\342\224\200 priorities.json \342\224\202 \342\224\224\342\224\200\342\224\200 docs/on_low_performance.js" @@ -0,0 +1,4 @@ +module.exports = function(payload) { + console.log("⚠ Low performance detected", payload); + // AI re-optimizes content +}; diff --git "a/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 events/ \342\224\202 \342\224\234\342\224\200\342\224\200 dispatcher.js \342\224\202 \342\224\234\342\224\200\342\224\200 listeners/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_new_content.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_schedule_tick.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_trending_detected.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 on_low_performance.js \342\224\202 \342\224\234\342\224\200\342\224\200 queue/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 event_queue.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 workers.js \342\224\202 \342\224\224\342\224\200\342\224\200 rules/ \342\224\202 \342\224\234\342\224\200\342\224\200 trigger_rules.json \342\224\202 \342\224\224\342\224\200\342\224\200 priorities.json \342\224\202 \342\224\224\342\224\200\342\224\200 docs/on_new_content.js" "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 events/ \342\224\202 \342\224\234\342\224\200\342\224\200 dispatcher.js \342\224\202 \342\224\234\342\224\200\342\224\200 listeners/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_new_content.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_schedule_tick.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_trending_detected.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 on_low_performance.js \342\224\202 \342\224\234\342\224\200\342\224\200 queue/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 event_queue.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 workers.js \342\224\202 \342\224\224\342\224\200\342\224\200 rules/ \342\224\202 \342\224\234\342\224\200\342\224\200 trigger_rules.json \342\224\202 \342\224\224\342\224\200\342\224\200 priorities.json \342\224\202 \342\224\224\342\224\200\342\224\200 docs/on_new_content.js" new file mode 100644 index 00000000..bf87bf82 --- /dev/null +++ "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 events/ \342\224\202 \342\224\234\342\224\200\342\224\200 dispatcher.js \342\224\202 \342\224\234\342\224\200\342\224\200 listeners/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_new_content.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_schedule_tick.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_trending_detected.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 on_low_performance.js \342\224\202 \342\224\234\342\224\200\342\224\200 queue/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 event_queue.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 workers.js \342\224\202 \342\224\224\342\224\200\342\224\200 rules/ \342\224\202 \342\224\234\342\224\200\342\224\200 trigger_rules.json \342\224\202 \342\224\224\342\224\200\342\224\200 priorities.json \342\224\202 \342\224\224\342\224\200\342\224\200 docs/on_new_content.js" @@ -0,0 +1,4 @@ +module.exports = function(payload) { + console.log("🆕 New content detected!", payload); + // send to optimization engine +}; diff --git "a/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 events/ \342\224\202 \342\224\234\342\224\200\342\224\200 dispatcher.js \342\224\202 \342\224\234\342\224\200\342\224\200 listeners/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_new_content.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_schedule_tick.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_trending_detected.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 on_low_performance.js \342\224\202 \342\224\234\342\224\200\342\224\200 queue/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 event_queue.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 workers.js \342\224\202 \342\224\224\342\224\200\342\224\200 rules/ \342\224\202 \342\224\234\342\224\200\342\224\200 trigger_rules.json \342\224\202 \342\224\224\342\224\200\342\224\200 priorities.json \342\224\202 \342\224\224\342\224\200\342\224\200 docs/on_schedule_tick.js" "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 events/ \342\224\202 \342\224\234\342\224\200\342\224\200 dispatcher.js \342\224\202 \342\224\234\342\224\200\342\224\200 listeners/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_new_content.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_schedule_tick.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_trending_detected.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 on_low_performance.js \342\224\202 \342\224\234\342\224\200\342\224\200 queue/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 event_queue.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 workers.js \342\224\202 \342\224\224\342\224\200\342\224\200 rules/ \342\224\202 \342\224\234\342\224\200\342\224\200 trigger_rules.json \342\224\202 \342\224\224\342\224\200\342\224\200 priorities.json \342\224\202 \342\224\224\342\224\200\342\224\200 docs/on_schedule_tick.js" new file mode 100644 index 00000000..493df689 --- /dev/null +++ "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 events/ \342\224\202 \342\224\234\342\224\200\342\224\200 dispatcher.js \342\224\202 \342\224\234\342\224\200\342\224\200 listeners/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_new_content.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_schedule_tick.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_trending_detected.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 on_low_performance.js \342\224\202 \342\224\234\342\224\200\342\224\200 queue/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 event_queue.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 workers.js \342\224\202 \342\224\224\342\224\200\342\224\200 rules/ \342\224\202 \342\224\234\342\224\200\342\224\200 trigger_rules.json \342\224\202 \342\224\224\342\224\200\342\224\200 priorities.json \342\224\202 \342\224\224\342\224\200\342\224\200 docs/on_schedule_tick.js" @@ -0,0 +1,4 @@ +module.exports = function(payload) { + console.log("⏰ Scheduled event triggered"); + // trigger auto-posting +}; diff --git "a/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 events/ \342\224\202 \342\224\234\342\224\200\342\224\200 dispatcher.js \342\224\202 \342\224\234\342\224\200\342\224\200 listeners/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_new_content.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_schedule_tick.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_trending_detected.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 on_low_performance.js \342\224\202 \342\224\234\342\224\200\342\224\200 queue/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 event_queue.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 workers.js \342\224\202 \342\224\224\342\224\200\342\224\200 rules/ \342\224\202 \342\224\234\342\224\200\342\224\200 trigger_rules.json \342\224\202 \342\224\224\342\224\200\342\224\200 priorities.json \342\224\202 \342\224\224\342\224\200\342\224\200 docs/on_trending_detected.js" "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 events/ \342\224\202 \342\224\234\342\224\200\342\224\200 dispatcher.js \342\224\202 \342\224\234\342\224\200\342\224\200 listeners/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_new_content.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_schedule_tick.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_trending_detected.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 on_low_performance.js \342\224\202 \342\224\234\342\224\200\342\224\200 queue/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 event_queue.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 workers.js \342\224\202 \342\224\224\342\224\200\342\224\200 rules/ \342\224\202 \342\224\234\342\224\200\342\224\200 trigger_rules.json \342\224\202 \342\224\224\342\224\200\342\224\200 priorities.json \342\224\202 \342\224\224\342\224\200\342\224\200 docs/on_trending_detected.js" new file mode 100644 index 00000000..c787f11b --- /dev/null +++ "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 events/ \342\224\202 \342\224\234\342\224\200\342\224\200 dispatcher.js \342\224\202 \342\224\234\342\224\200\342\224\200 listeners/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_new_content.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_schedule_tick.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_trending_detected.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 on_low_performance.js \342\224\202 \342\224\234\342\224\200\342\224\200 queue/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 event_queue.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 workers.js \342\224\202 \342\224\224\342\224\200\342\224\200 rules/ \342\224\202 \342\224\234\342\224\200\342\224\200 trigger_rules.json \342\224\202 \342\224\224\342\224\200\342\224\200 priorities.json \342\224\202 \342\224\224\342\224\200\342\224\200 docs/on_trending_detected.js" @@ -0,0 +1,4 @@ +module.exports = function(payload) { + console.log("🔥 Trending opportunity!", payload); + // AI calculates best follow-up post +}; diff --git "a/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 events/ \342\224\202 \342\224\234\342\224\200\342\224\200 dispatcher.js \342\224\202 \342\224\234\342\224\200\342\224\200 listeners/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_new_content.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_schedule_tick.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_trending_detected.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 on_low_performance.js \342\224\202 \342\224\234\342\224\200\342\224\200 queue/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 event_queue.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 workers.js \342\224\202 \342\224\224\342\224\200\342\224\200 rules/ \342\224\202 \342\224\234\342\224\200\342\224\200 trigger_rules.json \342\224\202 \342\224\224\342\224\200\342\224\200 priorities.json \342\224\202 \342\224\224\342\224\200\342\224\200 docs/trigger_rules.json" "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 events/ \342\224\202 \342\224\234\342\224\200\342\224\200 dispatcher.js \342\224\202 \342\224\234\342\224\200\342\224\200 listeners/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_new_content.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_schedule_tick.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_trending_detected.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 on_low_performance.js \342\224\202 \342\224\234\342\224\200\342\224\200 queue/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 event_queue.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 workers.js \342\224\202 \342\224\224\342\224\200\342\224\200 rules/ \342\224\202 \342\224\234\342\224\200\342\224\200 trigger_rules.json \342\224\202 \342\224\224\342\224\200\342\224\200 priorities.json \342\224\202 \342\224\224\342\224\200\342\224\200 docs/trigger_rules.json" new file mode 100644 index 00000000..d3eb017e --- /dev/null +++ "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 events/ \342\224\202 \342\224\234\342\224\200\342\224\200 dispatcher.js \342\224\202 \342\224\234\342\224\200\342\224\200 listeners/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_new_content.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_schedule_tick.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_trending_detected.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 on_low_performance.js \342\224\202 \342\224\234\342\224\200\342\224\200 queue/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 event_queue.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 workers.js \342\224\202 \342\224\224\342\224\200\342\224\200 rules/ \342\224\202 \342\224\234\342\224\200\342\224\200 trigger_rules.json \342\224\202 \342\224\224\342\224\200\342\224\200 priorities.json \342\224\202 \342\224\224\342\224\200\342\224\200 docs/trigger_rules.json" @@ -0,0 +1,6 @@ +{ + "newContent": { "priority": 1 }, + "scheduleTick": { "priority": 2 }, + "trendingDetected": { "priority": 1 }, + "lowPerformance": { "priority": 3 } +} diff --git "a/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 events/ \342\224\202 \342\224\234\342\224\200\342\224\200 dispatcher.js \342\224\202 \342\224\234\342\224\200\342\224\200 listeners/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_new_content.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_schedule_tick.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_trending_detected.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 on_low_performance.js \342\224\202 \342\224\234\342\224\200\342\224\200 queue/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 event_queue.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 workers.js \342\224\202 \342\224\224\342\224\200\342\224\200 rules/ \342\224\202 \342\224\234\342\224\200\342\224\200 trigger_rules.json \342\224\202 \342\224\224\342\224\200\342\224\200 priorities.json \342\224\202 \342\224\224\342\224\200\342\224\200 docs/\342\224\224\342\224\200\342\224\200 event_trigger_engine.md" "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 events/ \342\224\202 \342\224\234\342\224\200\342\224\200 dispatcher.js \342\224\202 \342\224\234\342\224\200\342\224\200 listeners/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_new_content.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_schedule_tick.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_trending_detected.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 on_low_performance.js \342\224\202 \342\224\234\342\224\200\342\224\200 queue/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 event_queue.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 workers.js \342\224\202 \342\224\224\342\224\200\342\224\200 rules/ \342\224\202 \342\224\234\342\224\200\342\224\200 trigger_rules.json \342\224\202 \342\224\224\342\224\200\342\224\200 priorities.json \342\224\202 \342\224\224\342\224\200\342\224\200 docs/\342\224\224\342\224\200\342\224\200 event_trigger_engine.md" new file mode 100644 index 00000000..a8be586f --- /dev/null +++ "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 events/ \342\224\202 \342\224\234\342\224\200\342\224\200 dispatcher.js \342\224\202 \342\224\234\342\224\200\342\224\200 listeners/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_new_content.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_schedule_tick.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 on_trending_detected.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 on_low_performance.js \342\224\202 \342\224\234\342\224\200\342\224\200 queue/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 event_queue.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 workers.js \342\224\202 \342\224\224\342\224\200\342\224\200 rules/ \342\224\202 \342\224\234\342\224\200\342\224\200 trigger_rules.json \342\224\202 \342\224\224\342\224\200\342\224\200 priorities.json \342\224\202 \342\224\224\342\224\200\342\224\200 docs/\342\224\224\342\224\200\342\224\200 event_trigger_engine.md" @@ -0,0 +1,16 @@ +const listeners = { + newContent: require("./listeners/on_new_content"), + schedule: require("./listeners/on_schedule_tick"), + trending: require("./listeners/on_trending_detected"), + lowPerformance: require("./listeners/on_low_performance"), +}; + +function dispatch(eventType, payload) { + if (!listeners[eventType]) { + console.log("Unknown event type:", eventType); + return; + } + listeners[eventType](payload); +} + +module.exports = dispatch; diff --git "a/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 prediction/ \342\224\202 \342\224\234\342\224\200\342\224\200 predictor.py \342\224\202 \342\224\234\342\224\200\342\224\200 engagement_model.pkl \342\224\202 \342\224\234\342\224\200\342\224\200 time_forecast_model.pkl \342\224\202 \342\224\224\342\224\200\342\224\200 trend_detector.py \342\224\202 \342\224\224\342\224\200\342\224\200 docs/Memory Buffer \342\200\224 memory_buffer.py" "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 prediction/ \342\224\202 \342\224\234\342\224\200\342\224\200 predictor.py \342\224\202 \342\224\234\342\224\200\342\224\200 engagement_model.pkl \342\224\202 \342\224\234\342\224\200\342\224\200 time_forecast_model.pkl \342\224\202 \342\224\224\342\224\200\342\224\200 trend_detector.py \342\224\202 \342\224\224\342\224\200\342\224\200 docs/Memory Buffer \342\200\224 memory_buffer.py" new file mode 100644 index 00000000..cadb1b87 --- /dev/null +++ "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 prediction/ \342\224\202 \342\224\234\342\224\200\342\224\200 predictor.py \342\224\202 \342\224\234\342\224\200\342\224\200 engagement_model.pkl \342\224\202 \342\224\234\342\224\200\342\224\200 time_forecast_model.pkl \342\224\202 \342\224\224\342\224\200\342\224\200 trend_detector.py \342\224\202 \342\224\224\342\224\200\342\224\200 docs/Memory Buffer \342\200\224 memory_buffer.py" @@ -0,0 +1,6 @@ +class Memory: + def __init__(self): + self.buffer = [] + + def add(self, state, action, reward): + self.buffer.append((state, action, reward)) diff --git "a/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 prediction/ \342\224\202 \342\224\234\342\224\200\342\224\200 predictor.py \342\224\202 \342\224\234\342\224\200\342\224\200 engagement_model.pkl \342\224\202 \342\224\234\342\224\200\342\224\200 time_forecast_model.pkl \342\224\202 \342\224\224\342\224\200\342\224\200 trend_detector.py \342\224\202 \342\224\224\342\224\200\342\224\200 docs/trend_detector.py" "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 prediction/ \342\224\202 \342\224\234\342\224\200\342\224\200 predictor.py \342\224\202 \342\224\234\342\224\200\342\224\200 engagement_model.pkl \342\224\202 \342\224\234\342\224\200\342\224\200 time_forecast_model.pkl \342\224\202 \342\224\224\342\224\200\342\224\200 trend_detector.py \342\224\202 \342\224\224\342\224\200\342\224\200 docs/trend_detector.py" new file mode 100644 index 00000000..dac6265c --- /dev/null +++ "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 prediction/ \342\224\202 \342\224\234\342\224\200\342\224\200 predictor.py \342\224\202 \342\224\234\342\224\200\342\224\200 engagement_model.pkl \342\224\202 \342\224\234\342\224\200\342\224\200 time_forecast_model.pkl \342\224\202 \342\224\224\342\224\200\342\224\200 trend_detector.py \342\224\202 \342\224\224\342\224\200\342\224\200 docs/trend_detector.py" @@ -0,0 +1,4 @@ +def detect_trend(content_metrics): + if content_metrics["velocity"] > 1.7: + return True + return False diff --git "a/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 prediction/ \342\224\202 \342\224\234\342\224\200\342\224\200 predictor.py \342\224\202 \342\224\234\342\224\200\342\224\200 engagement_model.pkl \342\224\202 \342\224\234\342\224\200\342\224\200 time_forecast_model.pkl \342\224\202 \342\224\224\342\224\200\342\224\200 trend_detector.py \342\224\202 \342\224\224\342\224\200\342\224\200 docs/\342\224\224\342\224\200\342\224\200 prediction_engine_v1.md" "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 prediction/ \342\224\202 \342\224\234\342\224\200\342\224\200 predictor.py \342\224\202 \342\224\234\342\224\200\342\224\200 engagement_model.pkl \342\224\202 \342\224\234\342\224\200\342\224\200 time_forecast_model.pkl \342\224\202 \342\224\224\342\224\200\342\224\200 trend_detector.py \342\224\202 \342\224\224\342\224\200\342\224\200 docs/\342\224\224\342\224\200\342\224\200 prediction_engine_v1.md" new file mode 100644 index 00000000..57ae50df --- /dev/null +++ "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 prediction/ \342\224\202 \342\224\234\342\224\200\342\224\200 predictor.py \342\224\202 \342\224\234\342\224\200\342\224\200 engagement_model.pkl \342\224\202 \342\224\234\342\224\200\342\224\200 time_forecast_model.pkl \342\224\202 \342\224\224\342\224\200\342\224\200 trend_detector.py \342\224\202 \342\224\224\342\224\200\342\224\200 docs/\342\224\224\342\224\200\342\224\200 prediction_engine_v1.md" @@ -0,0 +1,15 @@ +import pickle +import numpy as np + +class Predictor: + def __init__(self): + self.engagement = pickle.load(open("engagement_model.pkl", "rb")) + self.time_model = pickle.load(open("time_forecast_model.pkl", "rb")) + + def predict_engagement(self, features): + return self.engagement.predict(np.array([features]))[0] + + def predict_best_time(self, features): + return self.time_model.predict(np.array([features]))[0] + +predictor = Predictor() diff --git "a/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 reinforcement_v2/ \342\224\202 \342\224\234\342\224\200\342\224\200 agent.py \342\224\202 \342\224\234\342\224\200\342\224\200 environment.py \342\224\202 \342\224\234\342\224\200\342\224\200 reward_system.py \342\224\202 \342\224\234\342\224\200\342\224\200 memory_buffer.py \342\224\202 \342\224\234\342\224\200\342\224\200 model/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 policy_network.pkl \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 value_network.pkl \342\224\202 \342\224\224\342\224\200\342\224\200 docs/Agent (AI Brain) \342\200\224 agent.py" "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 reinforcement_v2/ \342\224\202 \342\224\234\342\224\200\342\224\200 agent.py \342\224\202 \342\224\234\342\224\200\342\224\200 environment.py \342\224\202 \342\224\234\342\224\200\342\224\200 reward_system.py \342\224\202 \342\224\234\342\224\200\342\224\200 memory_buffer.py \342\224\202 \342\224\234\342\224\200\342\224\200 model/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 policy_network.pkl \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 value_network.pkl \342\224\202 \342\224\224\342\224\200\342\224\200 docs/Agent (AI Brain) \342\200\224 agent.py" new file mode 100644 index 00000000..fc8d38c7 --- /dev/null +++ "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 reinforcement_v2/ \342\224\202 \342\224\234\342\224\200\342\224\200 agent.py \342\224\202 \342\224\234\342\224\200\342\224\200 environment.py \342\224\202 \342\224\234\342\224\200\342\224\200 reward_system.py \342\224\202 \342\224\234\342\224\200\342\224\200 memory_buffer.py \342\224\202 \342\224\234\342\224\200\342\224\200 model/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 policy_network.pkl \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 value_network.pkl \342\224\202 \342\224\224\342\224\200\342\224\200 docs/Agent (AI Brain) \342\200\224 agent.py" @@ -0,0 +1,11 @@ +class Agent: + def __init__(self, policy_network, value_network): + self.policy = policy_network + self.value = value_network + + def decide_action(self, state): + return self.policy.predict([state])[0] + + def update_policy(self, reward, state): + # Reinforcement learning update cycle + pass diff --git "a/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 reinforcement_v2/ \342\224\202 \342\224\234\342\224\200\342\224\200 agent.py \342\224\202 \342\224\234\342\224\200\342\224\200 environment.py \342\224\202 \342\224\234\342\224\200\342\224\200 reward_system.py \342\224\202 \342\224\234\342\224\200\342\224\200 memory_buffer.py \342\224\202 \342\224\234\342\224\200\342\224\200 model/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 policy_network.pkl \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 value_network.pkl \342\224\202 \342\224\224\342\224\200\342\224\200 docs/Reward System \342\200\224 reward_system.py" "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 reinforcement_v2/ \342\224\202 \342\224\234\342\224\200\342\224\200 agent.py \342\224\202 \342\224\234\342\224\200\342\224\200 environment.py \342\224\202 \342\224\234\342\224\200\342\224\200 reward_system.py \342\224\202 \342\224\234\342\224\200\342\224\200 memory_buffer.py \342\224\202 \342\224\234\342\224\200\342\224\200 model/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 policy_network.pkl \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 value_network.pkl \342\224\202 \342\224\224\342\224\200\342\224\200 docs/Reward System \342\200\224 reward_system.py" new file mode 100644 index 00000000..0a577079 --- /dev/null +++ "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 reinforcement_v2/ \342\224\202 \342\224\234\342\224\200\342\224\200 agent.py \342\224\202 \342\224\234\342\224\200\342\224\200 environment.py \342\224\202 \342\224\234\342\224\200\342\224\200 reward_system.py \342\224\202 \342\224\234\342\224\200\342\224\200 memory_buffer.py \342\224\202 \342\224\234\342\224\200\342\224\200 model/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 policy_network.pkl \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 value_network.pkl \342\224\202 \342\224\224\342\224\200\342\224\200 docs/Reward System \342\200\224 reward_system.py" @@ -0,0 +1,6 @@ +def calculate_reward(metrics): + reward = 0 + reward += metrics["engagement"] * 2 + reward += metrics["shares"] * 5 + reward -= metrics["drop_rate"] * 3 + return reward diff --git "a/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 reinforcement_v2/ \342\224\202 \342\224\234\342\224\200\342\224\200 agent.py \342\224\202 \342\224\234\342\224\200\342\224\200 environment.py \342\224\202 \342\224\234\342\224\200\342\224\200 reward_system.py \342\224\202 \342\224\234\342\224\200\342\224\200 memory_buffer.py \342\224\202 \342\224\234\342\224\200\342\224\200 model/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 policy_network.pkl \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 value_network.pkl \342\224\202 \342\224\224\342\224\200\342\224\200 docs/\342\224\202 \342\224\224\342\224\200\342\224\200 reinforcement_engine_v2.md" "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 reinforcement_v2/ \342\224\202 \342\224\234\342\224\200\342\224\200 agent.py \342\224\202 \342\224\234\342\224\200\342\224\200 environment.py \342\224\202 \342\224\234\342\224\200\342\224\200 reward_system.py \342\224\202 \342\224\234\342\224\200\342\224\200 memory_buffer.py \342\224\202 \342\224\234\342\224\200\342\224\200 model/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 policy_network.pkl \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 value_network.pkl \342\224\202 \342\224\224\342\224\200\342\224\200 docs/\342\224\202 \342\224\224\342\224\200\342\224\200 reinforcement_engine_v2.md" new file mode 100644 index 00000000..bcac836a --- /dev/null +++ "b/ai_automated_posting_system/ \342\224\202 \342\224\234\342\224\200\342\224\200 reinforcement_v2/ \342\224\202 \342\224\234\342\224\200\342\224\200 agent.py \342\224\202 \342\224\234\342\224\200\342\224\200 environment.py \342\224\202 \342\224\234\342\224\200\342\224\200 reward_system.py \342\224\202 \342\224\234\342\224\200\342\224\200 memory_buffer.py \342\224\202 \342\224\234\342\224\200\342\224\200 model/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 policy_network.pkl \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 value_network.pkl \342\224\202 \342\224\224\342\224\200\342\224\200 docs/\342\224\202 \342\224\224\342\224\200\342\224\200 reinforcement_engine_v2.md" @@ -0,0 +1,13 @@ +class Environment: + def __init__(self): + self.state = None + + def observe_state(self, metrics): + self.state = [ + metrics["engagement"], + metrics["velocity"], + metrics["audience_growth"], + metrics["posting_time_score"], + metrics["trend_index"] + ] + return self.state diff --git a/analytics ETLProcessor.js DataWarehouse.js MetricsEngine.js /ui/analytics analyticsDashboard.jsx b/analytics ETLProcessor.js DataWarehouse.js MetricsEngine.js /ui/analytics analyticsDashboard.jsx new file mode 100644 index 00000000..edb56d42 --- /dev/null +++ b/analytics ETLProcessor.js DataWarehouse.js MetricsEngine.js /ui/analytics analyticsDashboard.jsx @@ -0,0 +1,4 @@ +Sales analytics +User heatmaps +Delivery performance +Inventory turnover diff --git a/analytics ETLProcessor.js DataWarehouse.js MetricsEngine.js /ui/services/services/marketing-ai CampaignGenerator.js UserSegmentation.js PersonalizationEngine.js b/analytics ETLProcessor.js DataWarehouse.js MetricsEngine.js /ui/services/services/marketing-ai CampaignGenerator.js UserSegmentation.js PersonalizationEngine.js new file mode 100644 index 00000000..2b561481 --- /dev/null +++ b/analytics ETLProcessor.js DataWarehouse.js MetricsEngine.js /ui/services/services/marketing-ai CampaignGenerator.js UserSegmentation.js PersonalizationEngine.js @@ -0,0 +1,3 @@ +Auto-segmentation +Product recommendations +Conversion optimization diff --git a/analytics ETLProcessor.js DataWarehouse.js MetricsEngine.js /ui/services/services/services/modules/services/blockchain-audit AuditTrail.js HashGenerator.js PiChainSync.js b/analytics ETLProcessor.js DataWarehouse.js MetricsEngine.js /ui/services/services/services/modules/services/blockchain-audit AuditTrail.js HashGenerator.js PiChainSync.js new file mode 100644 index 00000000..2b2d9c09 --- /dev/null +++ b/analytics ETLProcessor.js DataWarehouse.js MetricsEngine.js /ui/services/services/services/modules/services/blockchain-audit AuditTrail.js HashGenerator.js PiChainSync.js @@ -0,0 +1,3 @@ +Each transaction hashed +Traceable logs +Pi blockchain sync diff --git a/analytics ETLProcessor.js DataWarehouse.js MetricsEngine.js /ui/services/services/services/modules/services/security DeviceFingerprint.js RiskEngine.js BehaviorAnalysis.js GeoMismatchAI.js SIMSwapDetector.js IPReputationCheck.js b/analytics ETLProcessor.js DataWarehouse.js MetricsEngine.js /ui/services/services/services/modules/services/security DeviceFingerprint.js RiskEngine.js BehaviorAnalysis.js GeoMismatchAI.js SIMSwapDetector.js IPReputationCheck.js new file mode 100644 index 00000000..288ae35c --- /dev/null +++ b/analytics ETLProcessor.js DataWarehouse.js MetricsEngine.js /ui/services/services/services/modules/services/security DeviceFingerprint.js RiskEngine.js BehaviorAnalysis.js GeoMismatchAI.js SIMSwapDetector.js IPReputationCheck.js @@ -0,0 +1,4 @@ +Geo mismatch +VPN detection +SIM swap detection +Behavioral biometrics diff --git a/analytics ETLProcessor.js DataWarehouse.js MetricsEngine.js /ui/services/services/services/modules/social-commerce LiveShopping.js GroupShops.js InfluencerTools.js b/analytics ETLProcessor.js DataWarehouse.js MetricsEngine.js /ui/services/services/services/modules/social-commerce LiveShopping.js GroupShops.js InfluencerTools.js new file mode 100644 index 00000000..7184dee8 --- /dev/null +++ b/analytics ETLProcessor.js DataWarehouse.js MetricsEngine.js /ui/services/services/services/modules/social-commerce LiveShopping.js GroupShops.js InfluencerTools.js @@ -0,0 +1,3 @@ +Community groups +Affiliate system +Live product demos diff --git a/analytics ETLProcessor.js DataWarehouse.js MetricsEngine.js /ui/services/services/services/translator TranslateService.js LanguageDetector.js b/analytics ETLProcessor.js DataWarehouse.js MetricsEngine.js /ui/services/services/services/translator TranslateService.js LanguageDetector.js new file mode 100644 index 00000000..5161b52f --- /dev/null +++ b/analytics ETLProcessor.js DataWarehouse.js MetricsEngine.js /ui/services/services/services/translator TranslateService.js LanguageDetector.js @@ -0,0 +1,8 @@ +English +French +Swahili +Kinyarwanda +Kirundi +Bemba +Nyanja +Chinese diff --git a/analytics ETLProcessor.js DataWarehouse.js MetricsEngine.js /ui/services/voice-commerce SpeechToOrder.js VoiceIntentParser.js ProductMatcher.js b/analytics ETLProcessor.js DataWarehouse.js MetricsEngine.js /ui/services/voice-commerce SpeechToOrder.js VoiceIntentParser.js ProductMatcher.js new file mode 100644 index 00000000..ac2a892a --- /dev/null +++ b/analytics ETLProcessor.js DataWarehouse.js MetricsEngine.js /ui/services/voice-commerce SpeechToOrder.js VoiceIntentParser.js ProductMatcher.js @@ -0,0 +1,3 @@ +Voice ordering +Voice payments +Voice search diff --git a/api/auto/cron_jobs.json b/api/auto/cron_jobs.json new file mode 100644 index 00000000..d8eecfb7 --- /dev/null +++ b/api/auto/cron_jobs.json @@ -0,0 +1,5 @@ +{ + "posting_interval_minutes": 30, + "trend_scan_interval_hours": 2, + "optimization_cycle_hours": 6 +} diff --git a/api/auto/post b/api/auto/post new file mode 100644 index 00000000..3b692cd3 --- /dev/null +++ b/api/auto/post @@ -0,0 +1,12 @@ +router.post("/auto/post", async (req, res) => { + const { platform, topic } = req.body; + const caption = buildCaption(topic); + const script = generateScript(topic); + + addToQueue({ + platformAPI: platformSelector(platform), + content: { script, caption } + }); + + res.json({ status: "queued", platform, topic }); +}); diff --git a/backend /frontend /docs /ai-engine /security /backend b/backend /frontend /docs /ai-engine /security /backend new file mode 100644 index 00000000..9cbe7648 --- /dev/null +++ b/backend /frontend /docs /ai-engine /security /backend @@ -0,0 +1,11 @@ +/backend + /src + /config + /routes + /controllers + /middleware + /models + /services + /utils + index.js + package.json diff --git a/backend /frontend /docs /ai-engine /security /docs b/backend /frontend /docs /ai-engine /security /docs new file mode 100644 index 00000000..33a3e7e4 --- /dev/null +++ b/backend /frontend /docs /ai-engine /security /docs @@ -0,0 +1,5 @@ +/docs + API_Documentation.md + Database_Schema.md + Security_Architecture.md + Payment_Flows.md diff --git a/backend /frontend /docs /ai-engine /security /frontend b/backend /frontend /docs /ai-engine /security /frontend new file mode 100644 index 00000000..544ba802 --- /dev/null +++ b/backend /frontend /docs /ai-engine /security /frontend @@ -0,0 +1,7 @@ +/frontend + /src + /screens + /components + /hooks + /context + App.js diff --git a/backend /frontend /docs /ai-engine /security /payments b/backend /frontend /docs /ai-engine /security /payments new file mode 100644 index 00000000..9cbe7648 --- /dev/null +++ b/backend /frontend /docs /ai-engine /security /payments @@ -0,0 +1,11 @@ +/backend + /src + /config + /routes + /controllers + /middleware + /models + /services + /utils + index.js + package.json diff --git a/backend/.env.templete b/backend/.env.templete new file mode 100644 index 00000000..f02771e3 --- /dev/null +++ b/backend/.env.templete @@ -0,0 +1,3 @@ +JWT_SECRET=supersecretkey +DB_URL=mongodb://localhost:27017/royalmix +PI_API_KEY=your_pi_key_here diff --git a/backend/app.js b/backend/app.js new file mode 100644 index 00000000..3f7952cd --- /dev/null +++ b/backend/app.js @@ -0,0 +1,10 @@ +const verificationRoutes = require("./routes/verification"); +app.use("/api/verify", verificationRoutes); +const verificationRoutes = require("./routes/verification"); +app.use("/api/verify", verificationRoutes); +const govDashboard = require("./routes/govDashboard"); +app.use("/api/gov", govDashboard); +const govDashboard = require("./routes/govDashboard"); +const healthRoute = require("./routes/health"); +app.use("/api/gov", govDashboard); +app.use("/api/health", healthRoute); diff --git a/backend/auth.js b/backend/auth.js new file mode 100644 index 00000000..21a426a7 --- /dev/null +++ b/backend/auth.js @@ -0,0 +1,12 @@ +const bcrypt = require("bcrypt"); +const saltRounds = 12; + +// Hash a password +function hashPassword(password) { + return bcrypt.hash(password, saltRounds); +} + +// Verify password +function verifyPassword(password, hash) { + return bcrypt.compare(password, hash); +} diff --git a/backend/backend/config/backend/middleware/auditLog.js b/backend/backend/config/backend/middleware/auditLog.js new file mode 100644 index 00000000..3ecd0bb0 --- /dev/null +++ b/backend/backend/config/backend/middleware/auditLog.js @@ -0,0 +1,8 @@ +const fs = require('fs'); + +function logAction(userId, action, details) { + const log = `${new Date().toISOString()} | ${userId} | ${action} | ${details}\n`; + fs.appendFileSync('logs/audit.log', log); +} + +module.exports = logAction; diff --git a/backend/backend/config/backend/middleware/backend/middleware/backend/payment/verify.js b/backend/backend/config/backend/middleware/backend/middleware/backend/payment/verify.js new file mode 100644 index 00000000..18f8322a --- /dev/null +++ b/backend/backend/config/backend/middleware/backend/middleware/backend/payment/verify.js @@ -0,0 +1,4 @@ +const verifySignature = (payload, signature, publicKey) => { + // implement crypto verification of user payments + return crypto.verify("sha256", Buffer.from(payload), publicKey, signature); +}; diff --git a/backend/backend/config/backend/middleware/backend/middleware/securityHeaders.js b/backend/backend/config/backend/middleware/backend/middleware/securityHeaders.js new file mode 100644 index 00000000..fd61a3bc --- /dev/null +++ b/backend/backend/config/backend/middleware/backend/middleware/securityHeaders.js @@ -0,0 +1,7 @@ +app.use((req, res, next) => { + res.setHeader("X-Frame-Options", "DENY"); + res.setHeader("X-Content-Type-Options", "nosniff"); + res.setHeader("X-XSS-Protection", "1; mode=block"); + res.setHeader("Referrer-Policy", "no-referrer"); + next(); +}); diff --git a/backend/backend/config/backend/middleware/frontend/src/deviceCheck.js b/backend/backend/config/backend/middleware/frontend/src/deviceCheck.js new file mode 100644 index 00000000..6bd3f2e2 --- /dev/null +++ b/backend/backend/config/backend/middleware/frontend/src/deviceCheck.js @@ -0,0 +1,5 @@ +function getDeviceFingerprint() { + return navigator.userAgent + navigator.platform + screen.width + screen.height; +} + +export default getDeviceFingerprint; diff --git a/backend/backend/config/backend/middleware/rateLimit.js b/backend/backend/config/backend/middleware/rateLimit.js new file mode 100644 index 00000000..ba95ed73 --- /dev/null +++ b/backend/backend/config/backend/middleware/rateLimit.js @@ -0,0 +1,9 @@ +const rateLimit = require('express-rate-limit'); + +const apiLimiter = rateLimit({ + windowMs: 15 * 60 * 1000, // 15 minutes + max: 100, // limit each IP to 100 requests per window + message: 'Too many requests, try again later.', +}); + +module.exports = apiLimiter; diff --git a/backend/backend/config/encryption.js b/backend/backend/config/encryption.js new file mode 100644 index 00000000..42c13f31 --- /dev/null +++ b/backend/backend/config/encryption.js @@ -0,0 +1,19 @@ +const crypto = require("crypto"); +const algorithm = 'aes-256-gcm'; +const key = process.env.ENCRYPTION_KEY; + +function encrypt(text) { + const iv = crypto.randomBytes(16); + const cipher = crypto.createCipheriv(algorithm, key, iv); + let encrypted = cipher.update(text, 'utf8', 'hex'); + encrypted += cipher.final('hex'); + return { iv: iv.toString('hex'), data: encrypted }; +} + +function decrypt(ivHex, data) { + const iv = Buffer.from(ivHex, 'hex'); + const decipher = crypto.createDecipheriv(algorithm, key, iv); + let decrypted = decipher.update(data, 'hex', 'utf8'); + decrypted += decipher.final('utf8'); + return decrypted; +} diff --git a/backend/backend/server/ai-risk/riskController.js b/backend/backend/server/ai-risk/riskController.js new file mode 100644 index 00000000..d60f5b2c --- /dev/null +++ b/backend/backend/server/ai-risk/riskController.js @@ -0,0 +1,17 @@ +exports.analyzeRisk = async (req, res) => { + try { + const sampleData = { + suspiciousTransactions: 12, + taxEvasionRisk: "Medium", + illegalTradeSignals: 3, + anomalyScore: 67 + }; + + res.json({ + status: "Risk analysis complete", + data: sampleData + }); + } catch (error) { + res.status(500).json({ error: "Risk engine failure" }); + } +}; diff --git a/backend/backend/server/ai-risk/riskRoutes.js b/backend/backend/server/ai-risk/riskRoutes.js new file mode 100644 index 00000000..e07b5fac --- /dev/null +++ b/backend/backend/server/ai-risk/riskRoutes.js @@ -0,0 +1,7 @@ +const express = require("express"); +const router = express.Router(); +const { analyzeRisk } = require("./riskController"); + +router.get("/scan", analyzeRisk); + +module.exports = router; diff --git a/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/README.md b/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/README.md new file mode 100644 index 00000000..45f37dcb --- /dev/null +++ b/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/README.md @@ -0,0 +1,12 @@ +# Royal Mix Global +Africa’s first AI-powered multi-currency wallet with Pi, Crypto, Mobile Money, Bank integrations. + +Features: +- Multi-currency wallet +- Pi payments (internal + mainnet-ready) +- Crypto transfer +- Mobile money integration +- Offline QR payments +- Bank account linking +- POS merchant system +- AI fraud detection diff --git a/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/bank.routes.js b/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/bank.routes.js new file mode 100644 index 00000000..bd1be334 --- /dev/null +++ b/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/bank.routes.js @@ -0,0 +1,3 @@ +router.post("/withdraw", (req, res) => { + res.json({ status: "pending bank approval" }); +}); diff --git "a/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 README.md \342\224\234\342\224\200\342\224\200 LICENSE \342\224\234\342\224\200\342\224\200 .gitignore \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200\342\224\200 src/ \342\224\202 \342\224\234\342\224\200\342\224\200 components/ \342\224\202 \342\224\234\342\224\200\342\224\200 assets/ \342\224\202 \342\224\224\342\224\200\342\224\200 styles/ \342\224\202 \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 api/ \342\224\202 \342\224\234\342\224\200\342\224\200 controllers/ \342\224\202 \342\224\234\342\224\200\342\224\200 middleware/ \342\224\202 \342\224\234\342\224\200\342\224\200 models/ \342\224\202 \342\224\224\342\224\200\342\224\200 services/ \342\224\202 \342\224\234\342\224\200\342\224\200 database/ \342\224\202 \342\224\234\342\224\200\342\224\200 schema.sql \342\224\202 \342\224\224\342\224\200\342\224\200 migrations/ \342\224\202 \342\224\224\342\224\200\342\224\200 docs/AI Modules" "b/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 README.md \342\224\234\342\224\200\342\224\200 LICENSE \342\224\234\342\224\200\342\224\200 .gitignore \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200\342\224\200 src/ \342\224\202 \342\224\234\342\224\200\342\224\200 components/ \342\224\202 \342\224\234\342\224\200\342\224\200 assets/ \342\224\202 \342\224\224\342\224\200\342\224\200 styles/ \342\224\202 \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 api/ \342\224\202 \342\224\234\342\224\200\342\224\200 controllers/ \342\224\202 \342\224\234\342\224\200\342\224\200 middleware/ \342\224\202 \342\224\234\342\224\200\342\224\200 models/ \342\224\202 \342\224\224\342\224\200\342\224\200 services/ \342\224\202 \342\224\234\342\224\200\342\224\200 database/ \342\224\202 \342\224\234\342\224\200\342\224\200 schema.sql \342\224\202 \342\224\224\342\224\200\342\224\200 migrations/ \342\224\202 \342\224\224\342\224\200\342\224\200 docs/AI Modules" new file mode 100644 index 00000000..7b37cfcb --- /dev/null +++ "b/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 README.md \342\224\234\342\224\200\342\224\200 LICENSE \342\224\234\342\224\200\342\224\200 .gitignore \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200\342\224\200 src/ \342\224\202 \342\224\234\342\224\200\342\224\200 components/ \342\224\202 \342\224\234\342\224\200\342\224\200 assets/ \342\224\202 \342\224\224\342\224\200\342\224\200 styles/ \342\224\202 \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 api/ \342\224\202 \342\224\234\342\224\200\342\224\200 controllers/ \342\224\202 \342\224\234\342\224\200\342\224\200 middleware/ \342\224\202 \342\224\234\342\224\200\342\224\200 models/ \342\224\202 \342\224\224\342\224\200\342\224\200 services/ \342\224\202 \342\224\234\342\224\200\342\224\200 database/ \342\224\202 \342\224\234\342\224\200\342\224\200 schema.sql \342\224\202 \342\224\224\342\224\200\342\224\200 migrations/ \342\224\202 \342\224\224\342\224\200\342\224\200 docs/AI Modules" @@ -0,0 +1 @@ +feat(ai): integrate sales prediction and auto-response engine diff --git "a/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 README.md \342\224\234\342\224\200\342\224\200 LICENSE \342\224\234\342\224\200\342\224\200 .gitignore \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200\342\224\200 src/ \342\224\202 \342\224\234\342\224\200\342\224\200 components/ \342\224\202 \342\224\234\342\224\200\342\224\200 assets/ \342\224\202 \342\224\224\342\224\200\342\224\200 styles/ \342\224\202 \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 api/ \342\224\202 \342\224\234\342\224\200\342\224\200 controllers/ \342\224\202 \342\224\234\342\224\200\342\224\200 middleware/ \342\224\202 \342\224\234\342\224\200\342\224\200 models/ \342\224\202 \342\224\224\342\224\200\342\224\200 services/ \342\224\202 \342\224\234\342\224\200\342\224\200 database/ \342\224\202 \342\224\234\342\224\200\342\224\200 schema.sql \342\224\202 \342\224\224\342\224\200\342\224\200 migrations/ \342\224\202 \342\224\224\342\224\200\342\224\200 docs/Backend Init" "b/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 README.md \342\224\234\342\224\200\342\224\200 LICENSE \342\224\234\342\224\200\342\224\200 .gitignore \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200\342\224\200 src/ \342\224\202 \342\224\234\342\224\200\342\224\200 components/ \342\224\202 \342\224\234\342\224\200\342\224\200 assets/ \342\224\202 \342\224\224\342\224\200\342\224\200 styles/ \342\224\202 \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 api/ \342\224\202 \342\224\234\342\224\200\342\224\200 controllers/ \342\224\202 \342\224\234\342\224\200\342\224\200 middleware/ \342\224\202 \342\224\234\342\224\200\342\224\200 models/ \342\224\202 \342\224\224\342\224\200\342\224\200 services/ \342\224\202 \342\224\234\342\224\200\342\224\200 database/ \342\224\202 \342\224\234\342\224\200\342\224\200 schema.sql \342\224\202 \342\224\224\342\224\200\342\224\200 migrations/ \342\224\202 \342\224\224\342\224\200\342\224\200 docs/Backend Init" new file mode 100644 index 00000000..ad325bac --- /dev/null +++ "b/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 README.md \342\224\234\342\224\200\342\224\200 LICENSE \342\224\234\342\224\200\342\224\200 .gitignore \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200\342\224\200 src/ \342\224\202 \342\224\234\342\224\200\342\224\200 components/ \342\224\202 \342\224\234\342\224\200\342\224\200 assets/ \342\224\202 \342\224\224\342\224\200\342\224\200 styles/ \342\224\202 \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 api/ \342\224\202 \342\224\234\342\224\200\342\224\200 controllers/ \342\224\202 \342\224\234\342\224\200\342\224\200 middleware/ \342\224\202 \342\224\234\342\224\200\342\224\200 models/ \342\224\202 \342\224\224\342\224\200\342\224\200 services/ \342\224\202 \342\224\234\342\224\200\342\224\200 database/ \342\224\202 \342\224\234\342\224\200\342\224\200 schema.sql \342\224\202 \342\224\224\342\224\200\342\224\200 migrations/ \342\224\202 \342\224\224\342\224\200\342\224\200 docs/Backend Init" @@ -0,0 +1 @@ +feat(backend): start API structure with routing system diff --git "a/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 README.md \342\224\234\342\224\200\342\224\200 LICENSE \342\224\234\342\224\200\342\224\200 .gitignore \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200\342\224\200 src/ \342\224\202 \342\224\234\342\224\200\342\224\200 components/ \342\224\202 \342\224\234\342\224\200\342\224\200 assets/ \342\224\202 \342\224\224\342\224\200\342\224\200 styles/ \342\224\202 \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 api/ \342\224\202 \342\224\234\342\224\200\342\224\200 controllers/ \342\224\202 \342\224\234\342\224\200\342\224\200 middleware/ \342\224\202 \342\224\234\342\224\200\342\224\200 models/ \342\224\202 \342\224\224\342\224\200\342\224\200 services/ \342\224\202 \342\224\234\342\224\200\342\224\200 database/ \342\224\202 \342\224\234\342\224\200\342\224\200 schema.sql \342\224\202 \342\224\224\342\224\200\342\224\200 migrations/ \342\224\202 \342\224\224\342\224\200\342\224\200 docs/Database Schema" "b/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 README.md \342\224\234\342\224\200\342\224\200 LICENSE \342\224\234\342\224\200\342\224\200 .gitignore \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200\342\224\200 src/ \342\224\202 \342\224\234\342\224\200\342\224\200 components/ \342\224\202 \342\224\234\342\224\200\342\224\200 assets/ \342\224\202 \342\224\224\342\224\200\342\224\200 styles/ \342\224\202 \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 api/ \342\224\202 \342\224\234\342\224\200\342\224\200 controllers/ \342\224\202 \342\224\234\342\224\200\342\224\200 middleware/ \342\224\202 \342\224\234\342\224\200\342\224\200 models/ \342\224\202 \342\224\224\342\224\200\342\224\200 services/ \342\224\202 \342\224\234\342\224\200\342\224\200 database/ \342\224\202 \342\224\234\342\224\200\342\224\200 schema.sql \342\224\202 \342\224\224\342\224\200\342\224\200 migrations/ \342\224\202 \342\224\224\342\224\200\342\224\200 docs/Database Schema" new file mode 100644 index 00000000..abd74a5c --- /dev/null +++ "b/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 README.md \342\224\234\342\224\200\342\224\200 LICENSE \342\224\234\342\224\200\342\224\200 .gitignore \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200\342\224\200 src/ \342\224\202 \342\224\234\342\224\200\342\224\200 components/ \342\224\202 \342\224\234\342\224\200\342\224\200 assets/ \342\224\202 \342\224\224\342\224\200\342\224\200 styles/ \342\224\202 \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 api/ \342\224\202 \342\224\234\342\224\200\342\224\200 controllers/ \342\224\202 \342\224\234\342\224\200\342\224\200 middleware/ \342\224\202 \342\224\234\342\224\200\342\224\200 models/ \342\224\202 \342\224\224\342\224\200\342\224\200 services/ \342\224\202 \342\224\234\342\224\200\342\224\200 database/ \342\224\202 \342\224\234\342\224\200\342\224\200 schema.sql \342\224\202 \342\224\224\342\224\200\342\224\200 migrations/ \342\224\202 \342\224\224\342\224\200\342\224\200 docs/Database Schema" @@ -0,0 +1 @@ +feat(db): add initial database schema for users, agents, products diff --git "a/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 README.md \342\224\234\342\224\200\342\224\200 LICENSE \342\224\234\342\224\200\342\224\200 .gitignore \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200\342\224\200 src/ \342\224\202 \342\224\234\342\224\200\342\224\200 components/ \342\224\202 \342\224\234\342\224\200\342\224\200 assets/ \342\224\202 \342\224\224\342\224\200\342\224\200 styles/ \342\224\202 \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 api/ \342\224\202 \342\224\234\342\224\200\342\224\200 controllers/ \342\224\202 \342\224\234\342\224\200\342\224\200 middleware/ \342\224\202 \342\224\234\342\224\200\342\224\200 models/ \342\224\202 \342\224\224\342\224\200\342\224\200 services/ \342\224\202 \342\224\234\342\224\200\342\224\200 database/ \342\224\202 \342\224\234\342\224\200\342\224\200 schema.sql \342\224\202 \342\224\224\342\224\200\342\224\200 migrations/ \342\224\202 \342\224\224\342\224\200\342\224\200 docs/Frontend Init" "b/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 README.md \342\224\234\342\224\200\342\224\200 LICENSE \342\224\234\342\224\200\342\224\200 .gitignore \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200\342\224\200 src/ \342\224\202 \342\224\234\342\224\200\342\224\200 components/ \342\224\202 \342\224\234\342\224\200\342\224\200 assets/ \342\224\202 \342\224\224\342\224\200\342\224\200 styles/ \342\224\202 \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 api/ \342\224\202 \342\224\234\342\224\200\342\224\200 controllers/ \342\224\202 \342\224\234\342\224\200\342\224\200 middleware/ \342\224\202 \342\224\234\342\224\200\342\224\200 models/ \342\224\202 \342\224\224\342\224\200\342\224\200 services/ \342\224\202 \342\224\234\342\224\200\342\224\200 database/ \342\224\202 \342\224\234\342\224\200\342\224\200 schema.sql \342\224\202 \342\224\224\342\224\200\342\224\200 migrations/ \342\224\202 \342\224\224\342\224\200\342\224\200 docs/Frontend Init" new file mode 100644 index 00000000..be8b34e7 --- /dev/null +++ "b/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 README.md \342\224\234\342\224\200\342\224\200 LICENSE \342\224\234\342\224\200\342\224\200 .gitignore \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200\342\224\200 src/ \342\224\202 \342\224\234\342\224\200\342\224\200 components/ \342\224\202 \342\224\234\342\224\200\342\224\200 assets/ \342\224\202 \342\224\224\342\224\200\342\224\200 styles/ \342\224\202 \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 api/ \342\224\202 \342\224\234\342\224\200\342\224\200 controllers/ \342\224\202 \342\224\234\342\224\200\342\224\200 middleware/ \342\224\202 \342\224\234\342\224\200\342\224\200 models/ \342\224\202 \342\224\224\342\224\200\342\224\200 services/ \342\224\202 \342\224\234\342\224\200\342\224\200 database/ \342\224\202 \342\224\234\342\224\200\342\224\200 schema.sql \342\224\202 \342\224\224\342\224\200\342\224\200 migrations/ \342\224\202 \342\224\224\342\224\200\342\224\200 docs/Frontend Init" @@ -0,0 +1 @@ +feat(frontend): initialize UI components and base layout diff --git "a/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 README.md \342\224\234\342\224\200\342\224\200 LICENSE \342\224\234\342\224\200\342\224\200 .gitignore \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200\342\224\200 src/ \342\224\202 \342\224\234\342\224\200\342\224\200 components/ \342\224\202 \342\224\234\342\224\200\342\224\200 assets/ \342\224\202 \342\224\224\342\224\200\342\224\200 styles/ \342\224\202 \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 api/ \342\224\202 \342\224\234\342\224\200\342\224\200 controllers/ \342\224\202 \342\224\234\342\224\200\342\224\200 middleware/ \342\224\202 \342\224\234\342\224\200\342\224\200 models/ \342\224\202 \342\224\224\342\224\200\342\224\200 services/ \342\224\202 \342\224\234\342\224\200\342\224\200 database/ \342\224\202 \342\224\234\342\224\200\342\224\200 schema.sql \342\224\202 \342\224\224\342\224\200\342\224\200 migrations/ \342\224\202 \342\224\224\342\224\200\342\224\200 docs/Optimization Pass" "b/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 README.md \342\224\234\342\224\200\342\224\200 LICENSE \342\224\234\342\224\200\342\224\200 .gitignore \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200\342\224\200 src/ \342\224\202 \342\224\234\342\224\200\342\224\200 components/ \342\224\202 \342\224\234\342\224\200\342\224\200 assets/ \342\224\202 \342\224\224\342\224\200\342\224\200 styles/ \342\224\202 \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 api/ \342\224\202 \342\224\234\342\224\200\342\224\200 controllers/ \342\224\202 \342\224\234\342\224\200\342\224\200 middleware/ \342\224\202 \342\224\234\342\224\200\342\224\200 models/ \342\224\202 \342\224\224\342\224\200\342\224\200 services/ \342\224\202 \342\224\234\342\224\200\342\224\200 database/ \342\224\202 \342\224\234\342\224\200\342\224\200 schema.sql \342\224\202 \342\224\224\342\224\200\342\224\200 migrations/ \342\224\202 \342\224\224\342\224\200\342\224\200 docs/Optimization Pass" new file mode 100644 index 00000000..ab0bf890 --- /dev/null +++ "b/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 README.md \342\224\234\342\224\200\342\224\200 LICENSE \342\224\234\342\224\200\342\224\200 .gitignore \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200\342\224\200 src/ \342\224\202 \342\224\234\342\224\200\342\224\200 components/ \342\224\202 \342\224\234\342\224\200\342\224\200 assets/ \342\224\202 \342\224\224\342\224\200\342\224\200 styles/ \342\224\202 \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 api/ \342\224\202 \342\224\234\342\224\200\342\224\200 controllers/ \342\224\202 \342\224\234\342\224\200\342\224\200 middleware/ \342\224\202 \342\224\234\342\224\200\342\224\200 models/ \342\224\202 \342\224\224\342\224\200\342\224\200 services/ \342\224\202 \342\224\234\342\224\200\342\224\200 database/ \342\224\202 \342\224\234\342\224\200\342\224\200 schema.sql \342\224\202 \342\224\224\342\224\200\342\224\200 migrations/ \342\224\202 \342\224\224\342\224\200\342\224\200 docs/Optimization Pass" @@ -0,0 +1 @@ +perf: improve load speed and reduce app bundle size diff --git "a/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 README.md \342\224\234\342\224\200\342\224\200 LICENSE \342\224\234\342\224\200\342\224\200 .gitignore \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200\342\224\200 src/ \342\224\202 \342\224\234\342\224\200\342\224\200 components/ \342\224\202 \342\224\234\342\224\200\342\224\200 assets/ \342\224\202 \342\224\224\342\224\200\342\224\200 styles/ \342\224\202 \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 api/ \342\224\202 \342\224\234\342\224\200\342\224\200 controllers/ \342\224\202 \342\224\234\342\224\200\342\224\200 middleware/ \342\224\202 \342\224\234\342\224\200\342\224\200 models/ \342\224\202 \342\224\224\342\224\200\342\224\200 services/ \342\224\202 \342\224\234\342\224\200\342\224\200 database/ \342\224\202 \342\224\234\342\224\200\342\224\200 schema.sql \342\224\202 \342\224\224\342\224\200\342\224\200 migrations/ \342\224\202 \342\224\224\342\224\200\342\224\200 docs/Security Layer" "b/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 README.md \342\224\234\342\224\200\342\224\200 LICENSE \342\224\234\342\224\200\342\224\200 .gitignore \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200\342\224\200 src/ \342\224\202 \342\224\234\342\224\200\342\224\200 components/ \342\224\202 \342\224\234\342\224\200\342\224\200 assets/ \342\224\202 \342\224\224\342\224\200\342\224\200 styles/ \342\224\202 \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 api/ \342\224\202 \342\224\234\342\224\200\342\224\200 controllers/ \342\224\202 \342\224\234\342\224\200\342\224\200 middleware/ \342\224\202 \342\224\234\342\224\200\342\224\200 models/ \342\224\202 \342\224\224\342\224\200\342\224\200 services/ \342\224\202 \342\224\234\342\224\200\342\224\200 database/ \342\224\202 \342\224\234\342\224\200\342\224\200 schema.sql \342\224\202 \342\224\224\342\224\200\342\224\200 migrations/ \342\224\202 \342\224\224\342\224\200\342\224\200 docs/Security Layer" new file mode 100644 index 00000000..2c22da19 --- /dev/null +++ "b/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 README.md \342\224\234\342\224\200\342\224\200 LICENSE \342\224\234\342\224\200\342\224\200 .gitignore \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200\342\224\200 src/ \342\224\202 \342\224\234\342\224\200\342\224\200 components/ \342\224\202 \342\224\234\342\224\200\342\224\200 assets/ \342\224\202 \342\224\224\342\224\200\342\224\200 styles/ \342\224\202 \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 api/ \342\224\202 \342\224\234\342\224\200\342\224\200 controllers/ \342\224\202 \342\224\234\342\224\200\342\224\200 middleware/ \342\224\202 \342\224\234\342\224\200\342\224\200 models/ \342\224\202 \342\224\224\342\224\200\342\224\200 services/ \342\224\202 \342\224\234\342\224\200\342\224\200 database/ \342\224\202 \342\224\234\342\224\200\342\224\200 schema.sql \342\224\202 \342\224\224\342\224\200\342\224\200 migrations/ \342\224\202 \342\224\224\342\224\200\342\224\200 docs/Security Layer" @@ -0,0 +1 @@ +chore(security): implement auth middleware and token validation diff --git "a/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 README.md \342\224\234\342\224\200\342\224\200 LICENSE \342\224\234\342\224\200\342\224\200 .gitignore \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200\342\224\200 src/ \342\224\202 \342\224\234\342\224\200\342\224\200 components/ \342\224\202 \342\224\234\342\224\200\342\224\200 assets/ \342\224\202 \342\224\224\342\224\200\342\224\200 styles/ \342\224\202 \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 api/ \342\224\202 \342\224\234\342\224\200\342\224\200 controllers/ \342\224\202 \342\224\234\342\224\200\342\224\200 middleware/ \342\224\202 \342\224\234\342\224\200\342\224\200 models/ \342\224\202 \342\224\224\342\224\200\342\224\200 services/ \342\224\202 \342\224\234\342\224\200\342\224\200 database/ \342\224\202 \342\224\234\342\224\200\342\224\200 schema.sql \342\224\202 \342\224\224\342\224\200\342\224\200 migrations/ \342\224\202 \342\224\224\342\224\200\342\224\200 docs/\342\224\234\342\224\200\342\224\200 architecture.md \342\224\234\342\224\200\342\224\200 api-spec.md \342\224\224\342\224\200\342\224\200 security.md" "b/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 README.md \342\224\234\342\224\200\342\224\200 LICENSE \342\224\234\342\224\200\342\224\200 .gitignore \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200\342\224\200 src/ \342\224\202 \342\224\234\342\224\200\342\224\200 components/ \342\224\202 \342\224\234\342\224\200\342\224\200 assets/ \342\224\202 \342\224\224\342\224\200\342\224\200 styles/ \342\224\202 \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 api/ \342\224\202 \342\224\234\342\224\200\342\224\200 controllers/ \342\224\202 \342\224\234\342\224\200\342\224\200 middleware/ \342\224\202 \342\224\234\342\224\200\342\224\200 models/ \342\224\202 \342\224\224\342\224\200\342\224\200 services/ \342\224\202 \342\224\234\342\224\200\342\224\200 database/ \342\224\202 \342\224\234\342\224\200\342\224\200 schema.sql \342\224\202 \342\224\224\342\224\200\342\224\200 migrations/ \342\224\202 \342\224\224\342\224\200\342\224\200 docs/\342\224\234\342\224\200\342\224\200 architecture.md \342\224\234\342\224\200\342\224\200 api-spec.md \342\224\224\342\224\200\342\224\200 security.md" new file mode 100644 index 00000000..8b137891 --- /dev/null +++ "b/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/backend/src/routes/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 README.md \342\224\234\342\224\200\342\224\200 LICENSE \342\224\234\342\224\200\342\224\200 .gitignore \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200\342\224\200 src/ \342\224\202 \342\224\234\342\224\200\342\224\200 components/ \342\224\202 \342\224\234\342\224\200\342\224\200 assets/ \342\224\202 \342\224\224\342\224\200\342\224\200 styles/ \342\224\202 \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 api/ \342\224\202 \342\224\234\342\224\200\342\224\200 controllers/ \342\224\202 \342\224\234\342\224\200\342\224\200 middleware/ \342\224\202 \342\224\234\342\224\200\342\224\200 models/ \342\224\202 \342\224\224\342\224\200\342\224\200 services/ \342\224\202 \342\224\234\342\224\200\342\224\200 database/ \342\224\202 \342\224\234\342\224\200\342\224\200 schema.sql \342\224\202 \342\224\224\342\224\200\342\224\200 migrations/ \342\224\202 \342\224\224\342\224\200\342\224\200 docs/\342\224\234\342\224\200\342\224\200 architecture.md \342\224\234\342\224\200\342\224\200 api-spec.md \342\224\224\342\224\200\342\224\200 security.md" @@ -0,0 +1 @@ + diff --git a/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/mobile-money.routes.js b/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/mobile-money.routes.js new file mode 100644 index 00000000..3553a8d0 --- /dev/null +++ b/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/backend/src/routes/mobile-money.routes.js @@ -0,0 +1,3 @@ +router.post("/debit", (req, res) => { + res.json({ status: "processing", gateway: "MTN/Airtel/M-Pesa" }); +}); diff --git a/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/crypto.routes.js b/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/crypto.routes.js new file mode 100644 index 00000000..af2fb760 --- /dev/null +++ b/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/backend/src/routes/crypto.routes.js @@ -0,0 +1,8 @@ +router.post("/create-address", (req, res) => { + return res.json({ address: "0xGeneratedWalletAddress" }); +}); + +router.post("/send", (req, res) => { + const { amount, to } = req.body; + return res.json({ status: "sent", amount, to }); +}); diff --git a/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/pi.routes.js b/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/pi.routes.js new file mode 100644 index 00000000..199db7e3 --- /dev/null +++ b/backend/backend/src/models/backend/src/models/backend/src/middleware/backend/src/routes/pi.routes.js @@ -0,0 +1,15 @@ +import express from "express"; +const router = express.Router(); + +router.post("/link", (req, res) => { + const { pi_username } = req.body; + if (!pi_username) return res.status(400).json({ error: "Missing Pi username" }); + return res.json({ status: "linked", pi_username }); +}); + +router.post("/transfer", (req, res) => { + const { amount, receiver } = req.body; + return res.json({ status: "success", amount, receiver }); +}); + +export default router; diff --git a/backend/backend/src/models/backend/src/models/backend/src/middleware/security.middleware.js b/backend/backend/src/models/backend/src/models/backend/src/middleware/security.middleware.js new file mode 100644 index 00000000..bdc2af89 --- /dev/null +++ b/backend/backend/src/models/backend/src/models/backend/src/middleware/security.middleware.js @@ -0,0 +1,12 @@ +export function deviceSecurity(req, res, next) { + const device = req.headers["user-agent"]; + const ip = req.ip; + + if (!device) return res.status(403).json({ error: "Device not recognized." }); + + // Simple logging for now + console.log("Device:", device); + console.log("IP:", ip); + + next(); +} diff --git a/backend/backend/src/models/backend/src/models/transaction.model.js b/backend/backend/src/models/backend/src/models/transaction.model.js new file mode 100644 index 00000000..dd78b080 --- /dev/null +++ b/backend/backend/src/models/backend/src/models/transaction.model.js @@ -0,0 +1,11 @@ +export default { + id: "UUID", + user_id: "UUID", + type: "send|receive|swap|topup", + amount: 0, + currency: "", + method: "pi|crypto|mobile_money|bank", + status: "pending", + ref: "", + timestamp: Date.now() +}; diff --git a/backend/backend/src/models/wallet.model.js b/backend/backend/src/models/wallet.model.js new file mode 100644 index 00000000..fac8ec2e --- /dev/null +++ b/backend/backend/src/models/wallet.model.js @@ -0,0 +1,8 @@ +export default { + id: "UUID", + user_id: "UUID", + currency: "ZMW|USD|RWF|FBU|PI|USDT|USDC", + balance: 0, + is_primary: false, + created_at: Date.now() +}; diff --git a/backend/config/govConfig.js b/backend/config/govConfig.js new file mode 100644 index 00000000..eb70c435 --- /dev/null +++ b/backend/config/govConfig.js @@ -0,0 +1,8 @@ +module.exports = { + taxRates: { + VAT: 0.16, + serviceTax: 0.05 + }, + ministries: ["Finance", "Transport", "Trade"], + supportedCountries: ["Zambia", "Kenya", "Nigeria"] +}; diff --git a/backend/env.template b/backend/env.template new file mode 100644 index 00000000..a89ca0c6 --- /dev/null +++ b/backend/env.template @@ -0,0 +1,7 @@ +# Royal Mix Environment Template +JWT_SECRET=change_this_secret +DB_URL=mongodb://localhost:27017/royalmix +PI_API_KEY=your_pi_key_here +ENCRYPTION_KEY=royalmix_ultra_secure_key +GOVTECH_API_KEY=secure_govtech_key +INTEGRATION_LAYER_URL=https://api.royalmixglobal.com/integration-layer diff --git a/backend/index.js b/backend/index.js new file mode 100644 index 00000000..b5e4b0ef --- /dev/null +++ b/backend/index.js @@ -0,0 +1,21 @@ +import express from "express"; +import helmet from "helmet"; +import cors from "cors"; +import rateLimit from "express-rate-limit"; + +const app = express(); + +app.use(express.json()); +app.use(helmet()); +app.use(cors()); +app.use(rateLimit({ + windowMs: 15 * 60 * 1000, + max: 100 +})); + +app.get("/", (req, res) => { + res.send("Royal Mix Global Backend Running Securely"); +}); + +const PORT = process.env.PORT || 5000; +app.listen(PORT, () => console.log(`Server running on ${PORT}`)); diff --git a/backend/integration-layer b/backend/integration-layer new file mode 100644 index 00000000..d3f53ad7 --- /dev/null +++ b/backend/integration-layer @@ -0,0 +1,2 @@ +app.use("/integration-layer/govtech", require("./integration-layer/routes/govtech.routes")); +app.use("/integration-layer/payments", require("./integration-layer/routes/payments.routes")); diff --git a/backend/middleware/authMiddleware.js b/backend/middleware/authMiddleware.js new file mode 100644 index 00000000..7c003518 --- /dev/null +++ b/backend/middleware/authMiddleware.js @@ -0,0 +1,14 @@ +const jwt = require("jsonwebtoken"); + +module.exports = function (req, res, next) { + const token = req.headers["authorization"]; + if (!token) return res.status(403).json({ error: "No token provided" }); + + try { + const decoded = jwt.verify(token, process.env.JWT_SECRET); + req.user = decoded; + next(); + } catch { + res.status(401).json({ error: "Invalid token" }); + } +}; diff --git a/backend/middleware/encryption.js b/backend/middleware/encryption.js new file mode 100644 index 00000000..8090b45e --- /dev/null +++ b/backend/middleware/encryption.js @@ -0,0 +1,14 @@ +const crypto = require("crypto"); +const algorithm = "aes-256-cbc"; +const key = crypto.scryptSync(process.env.ENCRYPTION_KEY, "salt", 32); +const iv = Buffer.alloc(16, 0); + +exports.encrypt = (text) => { + const cipher = crypto.createCipheriv(algorithm, key, iv); + return cipher.update(text, "utf8", "hex") + cipher.final("hex"); +}; + +exports.decrypt = (hash) => { + const decipher = crypto.createDecipheriv(algorithm, key, iv); + return decipher.update(hash, "hex", "utf8") + decipher.final("utf8"); +}; diff --git a/backend/middleware/roleMiddleware.js b/backend/middleware/roleMiddleware.js new file mode 100644 index 00000000..05958424 --- /dev/null +++ b/backend/middleware/roleMiddleware.js @@ -0,0 +1,8 @@ +module.exports = (roles) => { + return (req, res, next) => { + if (!roles.includes(req.user.role)) { + return res.status(403).json({ error: "Access denied" }); + } + next(); + }; +}; diff --git a/backend/modules/analytics b/backend/modules/analytics new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/backend/modules/analytics @@ -0,0 +1 @@ + diff --git a/backend/modules/marketplace b/backend/modules/marketplace new file mode 100644 index 00000000..07e54dfe --- /dev/null +++ b/backend/modules/marketplace @@ -0,0 +1,6 @@ +marketplace/ + ├── product.model.js + ├── order.model.js + ├── order.service.js + ├── payment.integration.js + └── tax.integration.js diff --git a/backend/modules/property b/backend/modules/property new file mode 100644 index 00000000..dcdce740 --- /dev/null +++ b/backend/modules/property @@ -0,0 +1,5 @@ +property/ + ├── property.model.js + ├── lease.model.js + ├── rent.service.js + └── rent.tax.integration.js diff --git a/backend/modules/wallet b/backend/modules/wallet new file mode 100644 index 00000000..8ce08071 --- /dev/null +++ b/backend/modules/wallet @@ -0,0 +1,6 @@ +wallet/ + ├── wallet.model.js + ├── transaction.model.js + ├── wallet.service.js + ├── wallet.controller.js + └── ledger.integration.js diff --git a/backend/public/pi-domain-verification.txt b/backend/public/pi-domain-verification.txt new file mode 100644 index 00000000..c0972890 --- /dev/null +++ b/backend/public/pi-domain-verification.txt @@ -0,0 +1 @@ +pi-domain-verification=cefc3ac44cdbbea470881534ced3b575e61706a7310cd2a60fc242553d9a198c8588944b7df8352ac4806bb89f8584b86c439bd1fcbb1c789e154ce3cb3dc73f diff --git a/backend/routes/govDashboard.js b/backend/routes/govDashboard.js new file mode 100644 index 00000000..d8ad4131 --- /dev/null +++ b/backend/routes/govDashboard.js @@ -0,0 +1,13 @@ +const express = require("express"); +const router = express.Router(); + +router.get("/stats", (req, res) => { + res.json({ + totalRevenue: 125000, + activeBusinesses: 8421, + topSector: "Retail", + alerts: [] + }); +}); + +module.exports = router; diff --git a/backend/routes/health.js b/backend/routes/health.js new file mode 100644 index 00000000..73ec3f81 --- /dev/null +++ b/backend/routes/health.js @@ -0,0 +1,8 @@ +const express = require("express"); +const router = express.Router(); + +router.get("/", (req, res) => { + res.json({ status: "Royal Mix Global API Running" }); +}); + +module.exports = router; diff --git a/backend/routes/verification.js b/backend/routes/verification.js new file mode 100644 index 00000000..b8c278eb --- /dev/null +++ b/backend/routes/verification.js @@ -0,0 +1,12 @@ +const express = require("express"); +const router = express.Router(); + +router.post("/verify-id", (req, res) => { + res.json({ status: "verified", level: "KYC Level 2" }); +}); + +router.post("/verify-business", (req, res) => { + res.json({ status: "business verified" }); +}); + +module.exports = router; diff --git "a/backend/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 integration-layer/ \342\234\205 (NEW) \342\224\202 \342\224\234\342\224\200\342\224\200 routes/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 govtech.routes.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 payments.routes.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 agents.routes.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 business.routes.js \342\224\202 \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 controllers/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 govtech.controller.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 payments.controller.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 analytics.controller.js \342\224\202 \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 services/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 tax.service.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 ai-analytics.service.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 notification.service.js \342\224\202 \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 config/\342\224\202 \342\224\234\342\224\200\342\224\200 ministries.config.json \342\224\202 \342\224\234\342\224\200\342\224\200 tax-rates.config.json \342\224\202 \342\224\224\342\224\200\342\224\200 agent-zones.config.json" "b/backend/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 integration-layer/ \342\234\205 (NEW) \342\224\202 \342\224\234\342\224\200\342\224\200 routes/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 govtech.routes.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 payments.routes.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 agents.routes.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 business.routes.js \342\224\202 \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 controllers/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 govtech.controller.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 payments.controller.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 analytics.controller.js \342\224\202 \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 services/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 tax.service.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 ai-analytics.service.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 notification.service.js \342\224\202 \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 config/\342\224\202 \342\224\234\342\224\200\342\224\200 ministries.config.json \342\224\202 \342\224\234\342\224\200\342\224\200 tax-rates.config.json \342\224\202 \342\224\224\342\224\200\342\224\200 agent-zones.config.json" new file mode 100644 index 00000000..8b137891 --- /dev/null +++ "b/backend/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 integration-layer/ \342\234\205 (NEW) \342\224\202 \342\224\234\342\224\200\342\224\200 routes/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 govtech.routes.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 payments.routes.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 agents.routes.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 business.routes.js \342\224\202 \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 controllers/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 govtech.controller.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 payments.controller.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 analytics.controller.js \342\224\202 \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 services/ \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 tax.service.js \342\224\202 \342\224\202 \342\224\234\342\224\200\342\224\200 ai-analytics.service.js \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 notification.service.js \342\224\202 \342\224\202 \342\224\202 \342\224\224\342\224\200\342\224\200 config/\342\224\202 \342\224\234\342\224\200\342\224\200 ministries.config.json \342\224\202 \342\224\234\342\224\200\342\224\200 tax-rates.config.json \342\224\202 \342\224\224\342\224\200\342\224\200 agent-zones.config.json" @@ -0,0 +1 @@ + diff --git a/backend/services/agentNetwork.js b/backend/services/agentNetwork.js new file mode 100644 index 00000000..6ac98641 --- /dev/null +++ b/backend/services/agentNetwork.js @@ -0,0 +1,7 @@ +exports.getAgentLocations = () => { + return [ + { city: "Lusaka", agents: 120 }, + { city: "Ndola", agents: 75 }, + { city: "Kitwe", agents: 63 } + ]; +}; diff --git a/backend/services/economicAI.js b/backend/services/economicAI.js new file mode 100644 index 00000000..ba369250 --- /dev/null +++ b/backend/services/economicAI.js @@ -0,0 +1,7 @@ +exports.analyzeEconomy = (transactions) => { + return { + growthTrend: "Positive", + riskAlerts: [], + topSectors: ["Retail", "Agriculture", "Transport"] + }; +}; diff --git a/backend/services/riskEngine.js b/backend/services/riskEngine.js new file mode 100644 index 00000000..5508ff4b --- /dev/null +++ b/backend/services/riskEngine.js @@ -0,0 +1,6 @@ +exports.detectRisk = (transaction) => { + if (transaction.amount > 10000) { + return { risk: "HIGH", reason: "Large transaction" }; + } + return { risk: "LOW" }; +}; diff --git a/backend/services/taxEngine.js b/backend/services/taxEngine.js new file mode 100644 index 00000000..6d72056d --- /dev/null +++ b/backend/services/taxEngine.js @@ -0,0 +1,8 @@ +exports.processTaxPayment = async (user, amount, type) => { + return { + status: "success", + message: `Payment processed for ${type}`, + amount, + timestamp: new Date() + }; +}; diff --git a/caption_builder.js b/caption_builder.js new file mode 100644 index 00000000..a34e0ba9 --- /dev/null +++ b/caption_builder.js @@ -0,0 +1,3 @@ +module.exports = function buildCaption(topic) { + return `🔥 ${topic}\nRoyal Mix Global — AI & Pi Network Revolution for Africa 🌍\n#RoyalMixGlobal #PiNetwork`; +}; diff --git a/cron_manager.js b/cron_manager.js new file mode 100644 index 00000000..f6f4b5c0 --- /dev/null +++ b/cron_manager.js @@ -0,0 +1,7 @@ +const cron = require("node-cron"); +const { processQueue } = require("./posting_queue"); + +cron.schedule("*/30 * * * *", () => { + console.log("[CRON] Processing posting queue..."); + processQueue(); +}); diff --git a/doc/deployment.md b/doc/deployment.md index 95fcf53c..bc0870cf 100644 --- a/doc/deployment.md +++ b/doc/deployment.md @@ -1,3 +1,8 @@ +nano README.md +# add one line: "Auto deploy test OK" +git add README.md +git commit -m "test: trigger automatic deploy" +git push origin main # Pi Platform Demo app: Deployment Guide **Warning: The purpose of this project is to be simple to run, with very few configuration steps. There is no** diff --git a/doc/marketing/AI_Campaign_Structure.md b/doc/marketing/AI_Campaign_Structure.md new file mode 100644 index 00000000..5f2c8ed1 --- /dev/null +++ b/doc/marketing/AI_Campaign_Structure.md @@ -0,0 +1,19 @@ +# Royal Mix Global — AI Marketing Campaign Structure (Africa Focus) + +## Goals +- Dominate Africa digital attention +- Acquire first 5M active users +- Convert 20% into monetized users +- Maximize Pi transactions processed in-app + +## Channels +- TikTok (short-form virality) +- YouTube + Shorts +- Facebook + Instagram (Ads + Reels) +- Telegram (community engagement) +- LinkedIn (B2B partnerships) + +## Technology +- AI content generation +- Pi SDK for transactions +- AI analytics for optimization diff --git a/doc/marketing/doc/marketing/templates/doc/marketing/templates/doc/marketing/Platform_Strategy.md b/doc/marketing/doc/marketing/templates/doc/marketing/templates/doc/marketing/Platform_Strategy.md new file mode 100644 index 00000000..5358efa3 --- /dev/null +++ b/doc/marketing/doc/marketing/templates/doc/marketing/templates/doc/marketing/Platform_Strategy.md @@ -0,0 +1,24 @@ +TIKTOK STRATEGY: +- 3–5 videos per day +- Music trending sounds +- Challenges + Duets + +YOUTUBE STRATEGY: +- 3 tutorials/week +- 1 success-story/week +- Shorts 5/day + +FACEBOOK/IG STRATEGY: +- Run 3 ad groups simultaneously +- Target 18–36 age, urban cities +- Use Reels daily + +TELEGRAM STRATEGY: +- Daily updates + incentives +- “Agent earnings of the day” posts +- Private VIP group for top earners + +LINKEDIN STRATEGY: +- Weekly business insights +- Case studies +- Partner announcements diff --git a/doc/marketing/doc/marketing/templates/doc/marketing/templates/doc/marketing/frontend/src/utils/analytics.js b/doc/marketing/doc/marketing/templates/doc/marketing/templates/doc/marketing/frontend/src/utils/analytics.js new file mode 100644 index 00000000..5e94f1d9 --- /dev/null +++ b/doc/marketing/doc/marketing/templates/doc/marketing/templates/doc/marketing/frontend/src/utils/analytics.js @@ -0,0 +1,11 @@ +export const trackEvent = (eventName, data = {}) => { + console.log("AI Analytics Event:", eventName, data); + + // Placeholder: integrate with real analytics later + return { + status: "logged", + event: eventName, + payload: data, + timestamp: Date.now() + }; +}; diff --git a/doc/marketing/doc/marketing/templates/doc/marketing/templates/doc/marketing/frontend/src/utils/backend/automation/content_scheduler.js b/doc/marketing/doc/marketing/templates/doc/marketing/templates/doc/marketing/frontend/src/utils/backend/automation/content_scheduler.js new file mode 100644 index 00000000..9494c3a3 --- /dev/null +++ b/doc/marketing/doc/marketing/templates/doc/marketing/templates/doc/marketing/frontend/src/utils/backend/automation/content_scheduler.js @@ -0,0 +1,10 @@ +function schedulePost(platform, content, datetime) { + return { + platform, + content, + scheduled_for: datetime, + status: "queued" + }; +} + +module.exports = { schedulePost }; diff --git a/doc/marketing/doc/marketing/templates/doc/marketing/templates/doc/marketing/frontend/src/utils/backend/automation/docs/marketing/AI_Posting_Calendar.md b/doc/marketing/doc/marketing/templates/doc/marketing/templates/doc/marketing/frontend/src/utils/backend/automation/docs/marketing/AI_Posting_Calendar.md new file mode 100644 index 00000000..0eac0955 --- /dev/null +++ b/doc/marketing/doc/marketing/templates/doc/marketing/templates/doc/marketing/frontend/src/utils/backend/automation/docs/marketing/AI_Posting_Calendar.md @@ -0,0 +1,78 @@ +Week 1 — Awareness Boost (Build Massive Visibility) +TikTok & Reels +3 videos / day +Topics: +"Royal Mix Global ni iki?" +"Uko Agents barunguka buri munsi" +"Pi Payments mu minutes 2" +YouTube +2 tutorials: +How to register +How to earn as an agent +Facebook + Instagram +5 posts/week: +Benefits +Testimonials +Live demos +Telegram +Daily updates +Announce earnings leaderboard +LinkedIn +2 business posts/week: +Africa Digital Economy +Pi Network adoption +📅 Week 2 — Trust & Authority Building +TikTok & Reels +3 videos/day: +Success stories +"Aba agents barungutse $X" +“Pi Payments explained simply” +YouTube +2 live streams: +Q&A +Agent training +Facebook/IG +Run ads: +“Become an Agent” +“Pi Marketplace for Africa” +Telegram +Daily community challenges +Prize: Pi or Royal Mix Global credits +LinkedIn +Publish “Royal Mix Global Mission & Vision” +📅 Week 3 — High-Converting Monetization Push +TikTok & Reels +4 videos/day +Challenges: +#RoyalMixGlobalChallenge +“Earn Pi in 60 seconds” +YouTube +Upload: +Case study 1 +Agent earnings breakdown +Facebook/IG +Conversion Ads: +App installs +Agent onboarding +Telegram +Launch affiliate program +LinkedIn +Partnerships announcement +📅 Week 4 — Retention + Viral Growth +TikTok & Reels +4 videos/day +User-generated content +Duets with big creators +Reaction videos +YouTube +Success Story Compilation +Epic Promo Video Drop +Facebook/IG +Giveaway campaign: +“Invite 5 friends = Win Pi” +Telegram +VIP group for agents +Daily insights +Exclusive tools +LinkedIn +Monthly report: Growth & statistics diff --git a/doc/marketing/doc/marketing/templates/doc/marketing/templates/voice_over_script_v1.txt b/doc/marketing/doc/marketing/templates/doc/marketing/templates/voice_over_script_v1.txt new file mode 100644 index 00000000..c589e154 --- /dev/null +++ b/doc/marketing/doc/marketing/templates/doc/marketing/templates/voice_over_script_v1.txt @@ -0,0 +1,6 @@ +Welcome to Royal Mix Global! +Powered by Pi Network technology. +Secure. Fast. Borderless. +For creators, agents, and entrepreneurs. +Earn more. Grow more. Dominate your market. +Royal Mix Global — Africa’s digital future starts now. diff --git a/doc/marketing/doc/marketing/templates/short_video_script.txt b/doc/marketing/doc/marketing/templates/short_video_script.txt new file mode 100644 index 00000000..d6c1b776 --- /dev/null +++ b/doc/marketing/doc/marketing/templates/short_video_script.txt @@ -0,0 +1,6 @@ +VIDEO TEMPLATE — 15 Seconds + +1. Hook (2s): "Know Royal Mix Global? Africa’s #1 Pi-powered marketplace is here!" +2. Benefit (5s): “Earn, buy, sell, withdraw faster than any app in Africa.” +3. Social proof (3s): “Thousands of agents already earning daily.” +4. CTA (4s): “Download now & start earning instantly!” diff --git a/docAI_Automated_Posting_System b/docAI_Automated_Posting_System new file mode 100644 index 00000000..fd7f74e5 --- /dev/null +++ b/docAI_Automated_Posting_System @@ -0,0 +1,14 @@ +# Royal Mix Global — AI Automated Posting System (V1) + +This system allows fully automated multi-platform posting driven by AI. + +Components: +- Trend detection +- Script generation +- Caption builder +- Multi-platform posting queue +- Scheduler with CRON +- Feedback learning engine + +Outcome: +Royal Mix Global becomes self-marketing and self-optimizing. diff --git a/driver_score.py b/driver_score.py new file mode 100644 index 00000000..c145794c --- /dev/null +++ b/driver_score.py @@ -0,0 +1,6 @@ +class DriverScore: + def evaluate(self, data): + score = 100 + score -= data["late_deliveries"] * 5 + score -= data["speeding"] * 2 + return max(score, 0) diff --git a/escrow_module.js b/escrow_module.js new file mode 100644 index 00000000..bc16713c --- /dev/null +++ b/escrow_module.js @@ -0,0 +1,8 @@ +export class EscrowModule { + hold(paymentId) { + return { status: "held", paymentId }; + } + release(paymentId) { + return { status: "released", paymentId }; + } +} diff --git a/eta_predictor.py b/eta_predictor.py new file mode 100644 index 00000000..c4298761 --- /dev/null +++ b/eta_predictor.py @@ -0,0 +1,5 @@ +import statistics + +class ETAPredictor: + def predict(self, history): + return statistics.mean(history) diff --git "a/execution_engine/ \342\224\202 \342\224\234\342\224\200\342\224\200 scheduler.js \342\224\234\342\224\200\342\224\200 executor.js \342\224\234\342\224\200\342\224\200 failover.js \342\224\234\342\224\200\342\224\200 logs/ \342\224\202 \342\224\224\342\224\200\342\224\200 execution_logs.json \342\224\224\342\224\200\342\224\200 docs/execution_engine.md _scheduler.js" "b/execution_engine/ \342\224\202 \342\224\234\342\224\200\342\224\200 scheduler.js \342\224\234\342\224\200\342\224\200 executor.js \342\224\234\342\224\200\342\224\200 failover.js \342\224\234\342\224\200\342\224\200 logs/ \342\224\202 \342\224\224\342\224\200\342\224\200 execution_logs.json \342\224\224\342\224\200\342\224\200 docs/execution_engine.md _scheduler.js" new file mode 100644 index 00000000..fc90f739 --- /dev/null +++ "b/execution_engine/ \342\224\202 \342\224\234\342\224\200\342\224\200 scheduler.js \342\224\234\342\224\200\342\224\200 executor.js \342\224\234\342\224\200\342\224\200 failover.js \342\224\234\342\224\200\342\224\200 logs/ \342\224\202 \342\224\224\342\224\200\342\224\200 execution_logs.json \342\224\224\342\224\200\342\224\200 docs/execution_engine.md _scheduler.js" @@ -0,0 +1,3 @@ +module.exports.schedulePost = function(timestamp, content) { + console.log("🕒 Scheduling post for:", timestamp); +}; diff --git "a/execution_engine/ \342\224\202 \342\224\234\342\224\200\342\224\200 scheduler.js \342\224\234\342\224\200\342\224\200 executor.js \342\224\234\342\224\200\342\224\200 failover.js \342\224\234\342\224\200\342\224\200 logs/ \342\224\202 \342\224\224\342\224\200\342\224\200 execution_logs.json \342\224\224\342\224\200\342\224\200 docs/executor.js" "b/execution_engine/ \342\224\202 \342\224\234\342\224\200\342\224\200 scheduler.js \342\224\234\342\224\200\342\224\200 executor.js \342\224\234\342\224\200\342\224\200 failover.js \342\224\234\342\224\200\342\224\200 logs/ \342\224\202 \342\224\224\342\224\200\342\224\200 execution_logs.json \342\224\224\342\224\200\342\224\200 docs/executor.js" new file mode 100644 index 00000000..3f7342c8 --- /dev/null +++ "b/execution_engine/ \342\224\202 \342\224\234\342\224\200\342\224\200 scheduler.js \342\224\234\342\224\200\342\224\200 executor.js \342\224\234\342\224\200\342\224\200 failover.js \342\224\234\342\224\200\342\224\200 logs/ \342\224\202 \342\224\224\342\224\200\342\224\200 execution_logs.json \342\224\224\342\224\200\342\224\200 docs/executor.js" @@ -0,0 +1,3 @@ +module.exports.execute = function(content) { + console.log("🚀 Executing auto-post:", content); +}; diff --git "a/execution_engine/ \342\224\202 \342\224\234\342\224\200\342\224\200 scheduler.js \342\224\234\342\224\200\342\224\200 executor.js \342\224\234\342\224\200\342\224\200 failover.js \342\224\234\342\224\200\342\224\200 logs/ \342\224\202 \342\224\224\342\224\200\342\224\200 execution_logs.json \342\224\224\342\224\200\342\224\200 docs/failover.js" "b/execution_engine/ \342\224\202 \342\224\234\342\224\200\342\224\200 scheduler.js \342\224\234\342\224\200\342\224\200 executor.js \342\224\234\342\224\200\342\224\200 failover.js \342\224\234\342\224\200\342\224\200 logs/ \342\224\202 \342\224\224\342\224\200\342\224\200 execution_logs.json \342\224\224\342\224\200\342\224\200 docs/failover.js" new file mode 100644 index 00000000..0b05834d --- /dev/null +++ "b/execution_engine/ \342\224\202 \342\224\234\342\224\200\342\224\200 scheduler.js \342\224\234\342\224\200\342\224\200 executor.js \342\224\234\342\224\200\342\224\200 failover.js \342\224\234\342\224\200\342\224\200 logs/ \342\224\202 \342\224\224\342\224\200\342\224\200 execution_logs.json \342\224\224\342\224\200\342\224\200 docs/failover.js" @@ -0,0 +1,3 @@ +module.exports.handleFailure = function(error) { + console.log("⚠ Failover activated:", error); +}; diff --git "a/execution_engine/ \342\224\202 \342\224\234\342\224\200\342\224\200 scheduler.js \342\224\234\342\224\200\342\224\200 executor.js \342\224\234\342\224\200\342\224\200 failover.js \342\224\234\342\224\200\342\224\200 logs/ \342\224\202 \342\224\224\342\224\200\342\224\200 execution_logs.json \342\224\224\342\224\200\342\224\200 docs/scheduler.js" "b/execution_engine/ \342\224\202 \342\224\234\342\224\200\342\224\200 scheduler.js \342\224\234\342\224\200\342\224\200 executor.js \342\224\234\342\224\200\342\224\200 failover.js \342\224\234\342\224\200\342\224\200 logs/ \342\224\202 \342\224\224\342\224\200\342\224\200 execution_logs.json \342\224\224\342\224\200\342\224\200 docs/scheduler.js" new file mode 100644 index 00000000..fc90f739 --- /dev/null +++ "b/execution_engine/ \342\224\202 \342\224\234\342\224\200\342\224\200 scheduler.js \342\224\234\342\224\200\342\224\200 executor.js \342\224\234\342\224\200\342\224\200 failover.js \342\224\234\342\224\200\342\224\200 logs/ \342\224\202 \342\224\224\342\224\200\342\224\200 execution_logs.json \342\224\224\342\224\200\342\224\200 docs/scheduler.js" @@ -0,0 +1,3 @@ +module.exports.schedulePost = function(timestamp, content) { + console.log("🕒 Scheduling post for:", timestamp); +}; diff --git a/fraud_guard.js b/fraud_guard.js new file mode 100644 index 00000000..44305474 --- /dev/null +++ b/fraud_guard.js @@ -0,0 +1,7 @@ +export class FraudGuard { + evaluate(tx) { + return tx.ip_reputation === "clean" && + tx.sim_swap === false && + tx.geo_match === true; + } +} diff --git "a/frontend/ \342\224\224\342\224\200\342\224\200 public/validation-key.txt" "b/frontend/ \342\224\224\342\224\200\342\224\200 public/validation-key.txt" new file mode 100644 index 00000000..3801ec05 --- /dev/null +++ "b/frontend/ \342\224\224\342\224\200\342\224\200 public/validation-key.txt" @@ -0,0 +1 @@ +cefc3ac44cdbbea470881534ced3b575e61706a7310cd2a60fc242553d9a198c8588944b7df8352ac4806bb89f8584b86c439bd1fcbb1c789e154ce3cb3dc73f diff --git "a/frontend/ \342\224\224\342\224\200\342\224\200 public/\342\224\224\342\224\200\342\224\200 validation-key.txt" "b/frontend/ \342\224\224\342\224\200\342\224\200 public/\342\224\224\342\224\200\342\224\200 validation-key.txt" new file mode 100644 index 00000000..3801ec05 --- /dev/null +++ "b/frontend/ \342\224\224\342\224\200\342\224\200 public/\342\224\224\342\224\200\342\224\200 validation-key.txt" @@ -0,0 +1 @@ +cefc3ac44cdbbea470881534ced3b575e61706a7310cd2a60fc242553d9a198c8588944b7df8352ac4806bb89f8584b86c439bd1fcbb1c789e154ce3cb3dc73f diff --git a/frontend/public/validation-key.txt b/frontend/public/validation-key.txt new file mode 100644 index 00000000..3801ec05 --- /dev/null +++ b/frontend/public/validation-key.txt @@ -0,0 +1 @@ +cefc3ac44cdbbea470881534ced3b575e61706a7310cd2a60fc242553d9a198c8588944b7df8352ac4806bb89f8584b86c439bd1fcbb1c789e154ce3cb3dc73f diff --git a/frontend/src/core/RoleRouter.js b/frontend/src/core/RoleRouter.js new file mode 100644 index 00000000..bafa076d --- /dev/null +++ b/frontend/src/core/RoleRouter.js @@ -0,0 +1,8 @@ +export function getDashboardByRole(role) { + switch (role) { + case "government": return "/govtech"; + case "agent": return "/agents"; + case "citizen": return "/citizen"; + default: return "/"; + } +} diff --git a/frontend/src/modules/choco/ChocoMarket.js b/frontend/src/modules/choco/ChocoMarket.js new file mode 100644 index 00000000..43a4720d --- /dev/null +++ b/frontend/src/modules/choco/ChocoMarket.js @@ -0,0 +1,10 @@ +import React from "react"; + +export default function ChocoMarket() { + return ( +
+

Royal Mix Choco Marketplace

+

Order snacks, beverages & retail goods

+
+ ); +} diff --git a/frontend/src/modules/citizen/CitizenApp.js b/frontend/src/modules/citizen/CitizenApp.js new file mode 100644 index 00000000..adbb7cd3 --- /dev/null +++ b/frontend/src/modules/citizen/CitizenApp.js @@ -0,0 +1,13 @@ +import React from "react"; + +export default function CitizenApp() { + return ( +
+

Citizen Super App

+ + + + +
+ ); +} diff --git a/frontend/src/modules/govtech/GovTechDashboard.js b/frontend/src/modules/govtech/GovTechDashboard.js new file mode 100644 index 00000000..47bfd492 --- /dev/null +++ b/frontend/src/modules/govtech/GovTechDashboard.js @@ -0,0 +1,17 @@ +import React from "react"; + +export default function GovTechDashboard() { + return ( +
+

Royal Mix GovTech Dashboard

+

Government Revenue, Taxes, Licenses & Permits

+ +
+ + + + +
+
+ ); + } diff --git a/frontend/src/modules/wallet/WalletSync.js b/frontend/src/modules/wallet/WalletSync.js new file mode 100644 index 00000000..48c11763 --- /dev/null +++ b/frontend/src/modules/wallet/WalletSync.js @@ -0,0 +1,10 @@ +import React from "react"; + +export default function WalletSync() { + return ( +
+

Wallet Center

+

Pi • Mobile Money • Bank

+
+ ); +} diff --git a/gesture_ai.js b/gesture_ai.js new file mode 100644 index 00000000..ab56abac --- /dev/null +++ b/gesture_ai.js @@ -0,0 +1,7 @@ +export class GestureAI { + analyze(gestureData) { + if (gestureData.speed < 0.2) return "increase-sensitivity"; + if (gestureData.swipeErrors > 4) return "enable-guided-mode"; + return "normal"; + } +} diff --git a/github/workflows/Approve wallet b/github/workflows/Approve wallet new file mode 100644 index 00000000..b903fa62 --- /dev/null +++ b/github/workflows/Approve wallet @@ -0,0 +1 @@ +Wallet → return signature. diff --git a/github/workflows/Authenticate user b/github/workflows/Authenticate user new file mode 100644 index 00000000..d2f314da --- /dev/null +++ b/github/workflows/Authenticate user @@ -0,0 +1 @@ +const user = await Pi.authenticate(['username'], onIncompletePaymentFound); diff --git a/github/workflows/Backend verify signature b/github/workflows/Backend verify signature new file mode 100644 index 00000000..128d567a --- /dev/null +++ b/github/workflows/Backend verify signature @@ -0,0 +1,2 @@ +const verified = await verifyPayment(payment); +if (!verified) return res.status(403).send("Verification failed"); diff --git a/github/workflows/Create payment b/github/workflows/Create payment new file mode 100644 index 00000000..caed1c41 --- /dev/null +++ b/github/workflows/Create payment @@ -0,0 +1,4 @@ +const payment = await Pi.createPayment({ + amount: 1, + memo: "Royal Mix Global Test", +}); diff --git a/github/workflows/Disable unused routes b/github/workflows/Disable unused routes new file mode 100644 index 00000000..2a45ef0c --- /dev/null +++ b/github/workflows/Disable unused routes @@ -0,0 +1,3 @@ +app.all('*', (req, res) => { + return res.status(404).json({ error: "Not found" }); +}); diff --git a/github/workflows/Error handling middleware b/github/workflows/Error handling middleware new file mode 100644 index 00000000..56865ca5 --- /dev/null +++ b/github/workflows/Error handling middleware @@ -0,0 +1,4 @@ +app.use((err, req, res, next) => { + console.error("SERVER ERROR:", err); + res.status(500).json({ error: "Server failure" }); +}); diff --git a/github/workflows/Prevent CORS attacks b/github/workflows/Prevent CORS attacks new file mode 100644 index 00000000..351dde2a --- /dev/null +++ b/github/workflows/Prevent CORS attacks @@ -0,0 +1,5 @@ +import cors from "cors"; +app.use(cors({ + origin: ["https://royal-mix-global.onrender.com"], + methods: ["GET", "POST"], +})); diff --git a/github/workflows/Rate Limit b/github/workflows/Rate Limit new file mode 100644 index 00000000..54370edc --- /dev/null +++ b/github/workflows/Rate Limit @@ -0,0 +1,8 @@ +import rateLimit from "express-rate-limit"; + +const limiter = rateLimit({ + windowMs: 1 * 60 * 1000, + max: 100, +}); + +app.use(limiter); diff --git a/github/workflows/deploy.yml b/github/workflows/deploy.yml new file mode 100644 index 00000000..6a2b29d3 --- /dev/null +++ b/github/workflows/deploy.yml @@ -0,0 +1,16 @@ +name: Auto Deploy to Render + +on: + push: + branches: [ Royal-Mix-Global ] + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v3 + + - name: Trigger Deploy + run: | + curl -X POST "${{ secrets.RENDER_DEPLOY_HOOK }}" diff --git a/github/workflows/frontend, initialize Pi SDK b/github/workflows/frontend, initialize Pi SDK new file mode 100644 index 00000000..e83aea2b --- /dev/null +++ b/github/workflows/frontend, initialize Pi SDK @@ -0,0 +1 @@ +Pi.init({ version: "2.0" }); diff --git a/github/workflows/index.js canke server.js b/github/workflows/index.js canke server.js new file mode 100644 index 00000000..656be9b6 --- /dev/null +++ b/github/workflows/index.js canke server.js @@ -0,0 +1,2 @@ +const helmet = require("helmet"); +app.use(helmet()); diff --git a/gitignore b/gitignore new file mode 100644 index 00000000..6ed48a98 --- /dev/null +++ b/gitignore @@ -0,0 +1,2 @@ +.env +node_modules diff --git a/heatmap_engine.py b/heatmap_engine.py new file mode 100644 index 00000000..6ab0ad89 --- /dev/null +++ b/heatmap_engine.py @@ -0,0 +1,6 @@ +class HeatmapEngine: + def generate(self, order_history): + zones = {} + for o in order_history: + zones[o["zone"]] = zones.get(o["zone"], 0) + 1 + return zones diff --git "a/integrations/ \342\224\202 \342\224\234\342\224\200\342\224\200 tiktok/ \342\224\202 \342\224\224\342\224\200\342\224\200 tiktok_api.js \342\224\234\342\224\200\342\224\200 youtube/ \342\224\202 \342\224\224\342\224\200\342\224\200 yt_api.js \342\224\234\342\224\200\342\224\200 facebook/ \342\224\202 \342\224\224\342\224\200\342\224\200 fb_api.js \342\224\224\342\224\200\342\224\200 instagram/\342\224\224\342\224\200\342\224\200 ig_api.js" "b/integrations/ \342\224\202 \342\224\234\342\224\200\342\224\200 tiktok/ \342\224\202 \342\224\224\342\224\200\342\224\200 tiktok_api.js \342\224\234\342\224\200\342\224\200 youtube/ \342\224\202 \342\224\224\342\224\200\342\224\200 yt_api.js \342\224\234\342\224\200\342\224\200 facebook/ \342\224\202 \342\224\224\342\224\200\342\224\200 fb_api.js \342\224\224\342\224\200\342\224\200 instagram/\342\224\224\342\224\200\342\224\200 ig_api.js" new file mode 100644 index 00000000..af244694 --- /dev/null +++ "b/integrations/ \342\224\202 \342\224\234\342\224\200\342\224\200 tiktok/ \342\224\202 \342\224\224\342\224\200\342\224\200 tiktok_api.js \342\224\234\342\224\200\342\224\200 youtube/ \342\224\202 \342\224\224\342\224\200\342\224\200 yt_api.js \342\224\234\342\224\200\342\224\200 facebook/ \342\224\202 \342\224\224\342\224\200\342\224\200 fb_api.js \342\224\224\342\224\200\342\224\200 instagram/\342\224\224\342\224\200\342\224\200 ig_api.js" @@ -0,0 +1,3 @@ +module.exports.uploadVideo = function(file, description) { + console.log("Posting to TikTok:", file); +}; diff --git a/intent_classifier.js b/intent_classifier.js new file mode 100644 index 00000000..1417cfc9 --- /dev/null +++ b/intent_classifier.js @@ -0,0 +1,7 @@ +export class IntentClassifier { + classify(input) { + if (input.includes("order")) return "ORDER_STATUS"; + if (input.includes("pay")) return "PAYMENT_HELP"; + return "UNKNOWN"; + } +} diff --git a/models/Driver.js b/models/Driver.js new file mode 100644 index 00000000..0d35eb3d --- /dev/null +++ b/models/Driver.js @@ -0,0 +1,8 @@ +export const Driver = { + id: "", + name: "", + phone: "", + location: { lat: 0, lng: 0 }, + status: "available", + assignedOrders: [] +}; diff --git a/models/Wallet.js b/models/Wallet.js new file mode 100644 index 00000000..a873facd --- /dev/null +++ b/models/Wallet.js @@ -0,0 +1,13 @@ +export const Wallet = { + userId: "", + balances: { + ZMW: 0, + USD: 0, + KES: 0, + UGX: 0, + NGN: 0, + RWF: 0, + FBU: 0, + PI: 0 + } +}; diff --git a/models/services/CryptoPayments.js b/models/services/CryptoPayments.js new file mode 100644 index 00000000..8a780892 --- /dev/null +++ b/models/services/CryptoPayments.js @@ -0,0 +1,9 @@ +export class CryptoPayments { + static generateAddress(wallet) { + return `ADDR-${wallet}-${Date.now()}`; + } + + static confirmTransaction(hash) { + return { confirmed: true, hash }; + } +} diff --git a/models/services/FleetManager.js b/models/services/FleetManager.js new file mode 100644 index 00000000..ea730c8a --- /dev/null +++ b/models/services/FleetManager.js @@ -0,0 +1,11 @@ +export class FleetManager { + static assignDriver(drivers, location) { + return drivers.sort( + (a, b) => a.distanceTo(location) - b.distanceTo(location) + )[0]; + } + + static updateLocation(driver, newLoc) { + driver.location = newLoc; + } +} diff --git a/models/services/routes/fleetRoutes.js b/models/services/routes/fleetRoutes.js new file mode 100644 index 00000000..67acb2d9 --- /dev/null +++ b/models/services/routes/fleetRoutes.js @@ -0,0 +1,16 @@ +import express from "express"; +import { FleetManager } from "../services/FleetManager.js"; + +const router = express.Router(); + +router.post("/update-location", (req, res) => { + FleetManager.updateLocation(req.body.driver, req.body.location); + res.json({ status: "updated" }); +}); + +router.post("/nearest-driver", (req, res) => { + const driver = FleetManager.assignDriver(req.body.drivers, req.body.location); + res.json(driver); +}); + +export default router; diff --git a/models/services/services/MobileMoney.js b/models/services/services/MobileMoney.js new file mode 100644 index 00000000..f424528b --- /dev/null +++ b/models/services/services/MobileMoney.js @@ -0,0 +1,9 @@ +export class MobileMoney { + static async sendMoney(phone, amount) { + return { status: "success", phone, amount }; + } + + static async receiveMoney(phone, amount) { + return { status: "received", phone, amount }; + } +} diff --git a/models/services/services/services/PiPayments.js b/models/services/services/services/PiPayments.js new file mode 100644 index 00000000..2773e416 --- /dev/null +++ b/models/services/services/services/PiPayments.js @@ -0,0 +1,16 @@ +import { Pi } from "@pi-network/pi-sdk"; + +export class PiPayments { + static async createPayment(amount, user) { + const payment = await Pi.createPayment({ + amount, + memo: "RoyalMix Payment", + metadata: { userId: user } + }); + return payment; + } + + static async verifyPayment(paymentId) { + return await Pi.verifyPayment(paymentId); + } +} diff --git a/models/services/services/services/services/PaymentsEngine.js b/models/services/services/services/services/PaymentsEngine.js new file mode 100644 index 00000000..24e40b8b --- /dev/null +++ b/models/services/services/services/services/PaymentsEngine.js @@ -0,0 +1,12 @@ +export class PaymentsEngine { + static validateTransaction(tx) { + if (!tx.amount || tx.amount <= 0) return false; + if (!tx.currency) return false; + if (!tx.userId) return false; + return true; + } + + static convertCurrency(amount, rate) { + return amount * rate; + } +} diff --git a/models/services/services/services/services/routes/paymentsRoutes.js b/models/services/services/services/services/routes/paymentsRoutes.js new file mode 100644 index 00000000..42e0a0e4 --- /dev/null +++ b/models/services/services/services/services/routes/paymentsRoutes.js @@ -0,0 +1,17 @@ +import express from "express"; +import { PaymentsEngine } from "../services/PaymentsEngine.js"; +import { PiPayments } from "../services/PiPayments.js"; + +const router = express.Router(); + +router.post("/pi/create", async (req, res) => { + const result = await PiPayments.createPayment(req.body.amount, req.body.user); + res.json(result); +}); + +router.post("/validate", (req, res) => { + const valid = PaymentsEngine.validateTransaction(req.body); + res.json({ valid }); +}); + +export default router; diff --git a/nlp_engine.js b/nlp_engine.js new file mode 100644 index 00000000..8a9c172b --- /dev/null +++ b/nlp_engine.js @@ -0,0 +1,5 @@ +export class NLPEngine { + analyze(text) { + return { intent: "order_status", entities: { orderId: "RMX-2026-001" } }; + } +} diff --git "a/optimization_engine/ \342\224\202 \342\224\234\342\224\200\342\224\200 optimizer.py \342\224\234\342\224\200\342\224\200 scoring.py \342\224\234\342\224\200\342\224\200 content_selector.py \342\224\234\342\224\200\342\224\200 auto_adjuster.py \342\224\224\342\224\200\342\224\200 docs/auto_adjuster.py" "b/optimization_engine/ \342\224\202 \342\224\234\342\224\200\342\224\200 optimizer.py \342\224\234\342\224\200\342\224\200 scoring.py \342\224\234\342\224\200\342\224\200 content_selector.py \342\224\234\342\224\200\342\224\200 auto_adjuster.py \342\224\224\342\224\200\342\224\200 docs/auto_adjuster.py" new file mode 100644 index 00000000..6be95ebe --- /dev/null +++ "b/optimization_engine/ \342\224\202 \342\224\234\342\224\200\342\224\200 optimizer.py \342\224\234\342\224\200\342\224\200 scoring.py \342\224\234\342\224\200\342\224\200 content_selector.py \342\224\234\342\224\200\342\224\200 auto_adjuster.py \342\224\224\342\224\200\342\224\200 docs/auto_adjuster.py" @@ -0,0 +1,4 @@ +feat(opt): add scoring system & optimization engine core +feat(opt): implement content selector + performance analyzer +feat(opt): add auto-adjust strategy module +docs(opt): add optimization_engine.md diff --git "a/optimization_engine/ \342\224\202 \342\224\234\342\224\200\342\224\200 optimizer.py \342\224\234\342\224\200\342\224\200 scoring.py \342\224\234\342\224\200\342\224\200 content_selector.py \342\224\234\342\224\200\342\224\200 auto_adjuster.py \342\224\224\342\224\200\342\224\200 docs/content_selector.py" "b/optimization_engine/ \342\224\202 \342\224\234\342\224\200\342\224\200 optimizer.py \342\224\234\342\224\200\342\224\200 scoring.py \342\224\234\342\224\200\342\224\200 content_selector.py \342\224\234\342\224\200\342\224\200 auto_adjuster.py \342\224\224\342\224\200\342\224\200 docs/content_selector.py" new file mode 100644 index 00000000..f917015c --- /dev/null +++ "b/optimization_engine/ \342\224\202 \342\224\234\342\224\200\342\224\200 optimizer.py \342\224\234\342\224\200\342\224\200 scoring.py \342\224\234\342\224\200\342\224\200 content_selector.py \342\224\234\342\224\200\342\224\200 auto_adjuster.py \342\224\224\342\224\200\342\224\200 docs/content_selector.py" @@ -0,0 +1,2 @@ +def select_best_content(queue): + return sorted(queue, key=lambda x: x["score"], reverse=True)[0] diff --git "a/optimization_engine/ \342\224\202 \342\224\234\342\224\200\342\224\200 optimizer.py \342\224\234\342\224\200\342\224\200 scoring.py \342\224\234\342\224\200\342\224\200 content_selector.py \342\224\234\342\224\200\342\224\200 auto_adjuster.py \342\224\224\342\224\200\342\224\200 docs/optimization_engine.md" "b/optimization_engine/ \342\224\202 \342\224\234\342\224\200\342\224\200 optimizer.py \342\224\234\342\224\200\342\224\200 scoring.py \342\224\234\342\224\200\342\224\200 content_selector.py \342\224\234\342\224\200\342\224\200 auto_adjuster.py \342\224\224\342\224\200\342\224\200 docs/optimization_engine.md" new file mode 100644 index 00000000..a9bcdfbd --- /dev/null +++ "b/optimization_engine/ \342\224\202 \342\224\234\342\224\200\342\224\200 optimizer.py \342\224\234\342\224\200\342\224\200 scoring.py \342\224\234\342\224\200\342\224\200 content_selector.py \342\224\234\342\224\200\342\224\200 auto_adjuster.py \342\224\224\342\224\200\342\224\200 docs/optimization_engine.md" @@ -0,0 +1,6 @@ +def score_content(metrics): + score = 0 + score += metrics["watch_time"] * 4 + score += metrics["likes"] * 2 + score += metrics["comments"] * 3 + return score diff --git "a/optimization_engine/ \342\224\202 \342\224\234\342\224\200\342\224\200 optimizer.py \342\224\234\342\224\200\342\224\200 scoring.py \342\224\234\342\224\200\342\224\200 content_selector.py \342\224\234\342\224\200\342\224\200 auto_adjuster.py \342\224\224\342\224\200\342\224\200 docs/scoring.py" "b/optimization_engine/ \342\224\202 \342\224\234\342\224\200\342\224\200 optimizer.py \342\224\234\342\224\200\342\224\200 scoring.py \342\224\234\342\224\200\342\224\200 content_selector.py \342\224\234\342\224\200\342\224\200 auto_adjuster.py \342\224\224\342\224\200\342\224\200 docs/scoring.py" new file mode 100644 index 00000000..a9bcdfbd --- /dev/null +++ "b/optimization_engine/ \342\224\202 \342\224\234\342\224\200\342\224\200 optimizer.py \342\224\234\342\224\200\342\224\200 scoring.py \342\224\234\342\224\200\342\224\200 content_selector.py \342\224\234\342\224\200\342\224\200 auto_adjuster.py \342\224\224\342\224\200\342\224\200 docs/scoring.py" @@ -0,0 +1,6 @@ +def score_content(metrics): + score = 0 + score += metrics["watch_time"] * 4 + score += metrics["likes"] * 2 + score += metrics["comments"] * 3 + return score diff --git a/pi_gateway.js b/pi_gateway.js new file mode 100644 index 00000000..7516848e --- /dev/null +++ b/pi_gateway.js @@ -0,0 +1,11 @@ +import { Pi } from "@pi/sdk"; + +export class PiGateway { + async initiatePayment(amount, userId) { + return await Pi.createPayment({ + amount: amount, + memo: "RoyalMix Purchase", + metadata: { user_id: userId } + }); + } +} diff --git a/posting_queue.js b/posting_queue.js new file mode 100644 index 00000000..450fe1f3 --- /dev/null +++ b/posting_queue.js @@ -0,0 +1,16 @@ +let queue = []; + +module.exports.addToQueue = function (post) { + queue.push(post); +}; + +module.exports.processQueue = async function () { + for (const job of queue) { + try { + await job.platformAPI.publish(job.content); + } catch (err) { + console.error("Error posting:", err); + } + } + queue = []; +}; diff --git a/predictor.py b/predictor.py new file mode 100644 index 00000000..57ae50df --- /dev/null +++ b/predictor.py @@ -0,0 +1,15 @@ +import pickle +import numpy as np + +class Predictor: + def __init__(self): + self.engagement = pickle.load(open("engagement_model.pkl", "rb")) + self.time_model = pickle.load(open("time_forecast_model.pkl", "rb")) + + def predict_engagement(self, features): + return self.engagement.predict(np.array([features]))[0] + + def predict_best_time(self, features): + return self.time_model.predict(np.array([features]))[0] + +predictor = Predictor() diff --git a/reverse-proxy/.github/workflows/.github/workflows/deploy.yml b/reverse-proxy/.github/workflows/.github/workflows/deploy.yml new file mode 100644 index 00000000..bdfcce10 --- /dev/null +++ b/reverse-proxy/.github/workflows/.github/workflows/deploy.yml @@ -0,0 +1,3 @@ +Settings → Secrets → Actions → New Secret +Name: RENDER_DEPLOY_HOOK +Value: (copy from render dashboard) diff --git a/reverse-proxy/.github/workflows/.github/workflows/reverse-proxy/backend/frontend/src/index.js b/reverse-proxy/.github/workflows/.github/workflows/reverse-proxy/backend/frontend/src/index.js new file mode 100644 index 00000000..8789472a --- /dev/null +++ b/reverse-proxy/.github/workflows/.github/workflows/reverse-proxy/backend/frontend/src/index.js @@ -0,0 +1,3 @@ +if (window.location.protocol !== "https:") { + window.location.href = "https://" + window.location.host + window.location.pathname; +} diff --git a/reverse-proxy/.github/workflows/.github/workflows/reverse-proxy/backend/index.js b/reverse-proxy/.github/workflows/.github/workflows/reverse-proxy/backend/index.js new file mode 100644 index 00000000..dea31130 --- /dev/null +++ b/reverse-proxy/.github/workflows/.github/workflows/reverse-proxy/backend/index.js @@ -0,0 +1,6 @@ +app.use((req, res, next) => { + if (req.headers["x-forwarded-proto"] !== "https") { + return res.redirect(`https://${req.headers.host}${req.url}`); + } + next(); +}); diff --git a/reverse-proxy/.github/workflows/.github/workflows/reverse-proxy/nginx.conf b/reverse-proxy/.github/workflows/.github/workflows/reverse-proxy/nginx.conf new file mode 100644 index 00000000..bdfcce10 --- /dev/null +++ b/reverse-proxy/.github/workflows/.github/workflows/reverse-proxy/nginx.conf @@ -0,0 +1,3 @@ +Settings → Secrets → Actions → New Secret +Name: RENDER_DEPLOY_HOOK +Value: (copy from render dashboard) diff --git a/reverse-proxy/.github/workflows/deploy.yml b/reverse-proxy/.github/workflows/deploy.yml new file mode 100644 index 00000000..8b4f32e2 --- /dev/null +++ b/reverse-proxy/.github/workflows/deploy.yml @@ -0,0 +1,18 @@ +name: Deploy to Render + +on: + push: + branches: + - Royal-Mix-Global + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Trigger Render Deployment + run: | + curl -X POST "$RENDER_DEPLOY_HOOK" diff --git a/reverse-proxy/nginx.conf b/reverse-proxy/nginx.conf new file mode 100644 index 00000000..139eb53f --- /dev/null +++ b/reverse-proxy/nginx.conf @@ -0,0 +1,45 @@ +server { + listen 80; + server_name royal-mix-global.onrender.com; + + # Redirect ALL HTTP to HTTPS + return 301 https://$host$request_uri; +} + +server { + listen 443 ssl; + server_name royal-mix-global.onrender.com; + + # SSL Certificates (Render handles them automatically) + ssl_protocols TLSv1.2 TLSv1.3; + ssl_prefer_server_ciphers on; + + # HSTS: Strict security (1 year) + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; + + # Protect against clickjacking + add_header X-Frame-Options "DENY"; + + # Prevent XSS attacks + add_header X-XSS-Protection "1; mode=block"; + + # Prevent MIME sniffing + add_header X-Content-Type-Options "nosniff"; + + # Remove server signature + server_tokens off; + + # Frontend routes + location / { + proxy_pass http://frontend:3000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } + + # Backend routes (API) + location /api/ { + proxy_pass http://backend:8080; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } +} diff --git a/riskController.js b/riskController.js new file mode 100644 index 00000000..d8565fc6 --- /dev/null +++ b/riskController.js @@ -0,0 +1,16 @@ +const { analyzeTransaction } = require("./riskEngine"); + +exports.checkTransactionRisk = (req, res) => { + const txData = req.body; + const result = analyzeTransaction(txData); + + if (result.riskLevel === "HIGH") { + console.log("🚨 HIGH RISK ALERT:", result); + // Later tuzohuza na Government Dashboard Alert System + } + + res.json({ + message: "Risk analysis complete", + analysis: result + }); +}; diff --git a/riskRoutes.js b/riskRoutes.js new file mode 100644 index 00000000..4aab8031 --- /dev/null +++ b/riskRoutes.js @@ -0,0 +1,8 @@ +const express = require("express"); +const router = express.Router(); +const riskController = require("./riskController"); +const verifyGovToken = require("../middleware/verifyGovToken"); + +router.post("/analyze", verifyGovToken, riskController.checkTransactionRisk); + +module.exports = router; diff --git a/route_optimizer.py b/route_optimizer.py new file mode 100644 index 00000000..0ce6f3b0 --- /dev/null +++ b/route_optimizer.py @@ -0,0 +1,3 @@ +class RouteOptimizer: + def find_best_route(self, orders): + return sorted(orders, key=lambda x: x['distance_km']) diff --git "a/royal-mix-demo/ \342\224\234\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200 public/ \342\224\202 \342\224\202 \342\224\234\342\224\200 validation-key.txt \342\234\205 (AHO PI IYISOMA) \342\224\202 \342\224\202 \342\224\224\342\224\200 index.html \342\224\202 \342\224\224\342\224\200 src/ \342\224\202 \342\224\224\342\224\200 ... \342\224\234\342\224\200 backend/ \342\224\202 \342\224\224\342\224\200 ... \342\224\234\342\224\200 docs/ \342\224\202 \342\224\224\342\224\200 DOMAIN_VERIFICATION.md \342\224\234\342\224\200 README.md \342\224\224\342\224\200 docker-compose.yml/frontend/public/docs/DOMAIN_VERIFICATION.md" "b/royal-mix-demo/ \342\224\234\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200 public/ \342\224\202 \342\224\202 \342\224\234\342\224\200 validation-key.txt \342\234\205 (AHO PI IYISOMA) \342\224\202 \342\224\202 \342\224\224\342\224\200 index.html \342\224\202 \342\224\224\342\224\200 src/ \342\224\202 \342\224\224\342\224\200 ... \342\224\234\342\224\200 backend/ \342\224\202 \342\224\224\342\224\200 ... \342\224\234\342\224\200 docs/ \342\224\202 \342\224\224\342\224\200 DOMAIN_VERIFICATION.md \342\224\234\342\224\200 README.md \342\224\224\342\224\200 docker-compose.yml/frontend/public/docs/DOMAIN_VERIFICATION.md" new file mode 100644 index 00000000..e213c7e2 --- /dev/null +++ "b/royal-mix-demo/ \342\224\234\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200 public/ \342\224\202 \342\224\202 \342\224\234\342\224\200 validation-key.txt \342\234\205 (AHO PI IYISOMA) \342\224\202 \342\224\202 \342\224\224\342\224\200 index.html \342\224\202 \342\224\224\342\224\200 src/ \342\224\202 \342\224\224\342\224\200 ... \342\224\234\342\224\200 backend/ \342\224\202 \342\224\224\342\224\200 ... \342\224\234\342\224\200 docs/ \342\224\202 \342\224\224\342\224\200 DOMAIN_VERIFICATION.md \342\224\234\342\224\200 README.md \342\224\224\342\224\200 docker-compose.yml/frontend/public/docs/DOMAIN_VERIFICATION.md" @@ -0,0 +1,16 @@ +# Pi Domain Verification — Royal Mix Global + +Domain: https://royalmixglobal3863.pinet.com + +Validation method: +- Static file verification +- File: /validation-key.txt +- Location: frontend/public/ + +Rules: +- Single-use Pi validation key +- HTTPS enforced +- No redirects +- Global DNS propagation confirmed + +Status: Pending Pi Developers Approval diff --git "a/royal-mix-demo/ \342\224\234\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200 public/ \342\224\202 \342\224\202 \342\224\234\342\224\200 validation-key.txt \342\234\205 (AHO PI IYISOMA) \342\224\202 \342\224\202 \342\224\224\342\224\200 index.html \342\224\202 \342\224\224\342\224\200 src/ \342\224\202 \342\224\224\342\224\200 ... \342\224\234\342\224\200 backend/ \342\224\202 \342\224\224\342\224\200 ... \342\224\234\342\224\200 docs/ \342\224\202 \342\224\224\342\224\200 DOMAIN_VERIFICATION.md \342\224\234\342\224\200 README.md \342\224\224\342\224\200 docker-compose.yml/frontend/public/validation-key.txt" "b/royal-mix-demo/ \342\224\234\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200 public/ \342\224\202 \342\224\202 \342\224\234\342\224\200 validation-key.txt \342\234\205 (AHO PI IYISOMA) \342\224\202 \342\224\202 \342\224\224\342\224\200 index.html \342\224\202 \342\224\224\342\224\200 src/ \342\224\202 \342\224\224\342\224\200 ... \342\224\234\342\224\200 backend/ \342\224\202 \342\224\224\342\224\200 ... \342\224\234\342\224\200 docs/ \342\224\202 \342\224\224\342\224\200 DOMAIN_VERIFICATION.md \342\224\234\342\224\200 README.md \342\224\224\342\224\200 docker-compose.yml/frontend/public/validation-key.txt" new file mode 100644 index 00000000..3801ec05 --- /dev/null +++ "b/royal-mix-demo/ \342\224\234\342\224\200 frontend/ \342\224\202 \342\224\234\342\224\200 public/ \342\224\202 \342\224\202 \342\224\234\342\224\200 validation-key.txt \342\234\205 (AHO PI IYISOMA) \342\224\202 \342\224\202 \342\224\224\342\224\200 index.html \342\224\202 \342\224\224\342\224\200 src/ \342\224\202 \342\224\224\342\224\200 ... \342\224\234\342\224\200 backend/ \342\224\202 \342\224\224\342\224\200 ... \342\224\234\342\224\200 docs/ \342\224\202 \342\224\224\342\224\200 DOMAIN_VERIFICATION.md \342\224\234\342\224\200 README.md \342\224\224\342\224\200 docker-compose.yml/frontend/public/validation-key.txt" @@ -0,0 +1 @@ +cefc3ac44cdbbea470881534ced3b575e61706a7310cd2a60fc242553d9a198c8588944b7df8352ac4806bb89f8584b86c439bd1fcbb1c789e154ce3cb3dc73f diff --git "a/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\202 \342\224\224\342\224\200\342\224\200 src/ \342\224\202 \342\224\224\342\224\200\342\224\200 modules/ \342\224\202 \342\224\234\342\224\200\342\224\200 core/ \342\224\202 \342\224\234\342\224\200\342\224\200 govtech/ \342\224\202 \342\224\234\342\224\200\342\224\200 choco/ \342\224\202 \342\224\234\342\224\200\342\224\200 wallet/ \342\224\202 \342\224\234\342\224\200\342\224\200 academy/ \342\224\202 \342\224\234\342\224\200\342\224\200 ambassadors/ \342\224\202 \342\224\234\342\224\200\342\224\200 agents/ \342\224\202 \342\224\224\342\224\200\342\224\200 citizen/ \342\224\202 \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 routes/ \342\224\202 \342\224\234\342\224\200\342\224\200 services/ \342\224\202 \342\224\234\342\224\200\342\224\200 middleware/ \342\224\202 \342\224\224\342\224\200\342\224\200 config/ \342\224\202 \342\224\234\342\224\200\342\224\200 docs/\342\224\224\342\224\200\342\224\200 deploy" "b/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\202 \342\224\224\342\224\200\342\224\200 src/ \342\224\202 \342\224\224\342\224\200\342\224\200 modules/ \342\224\202 \342\224\234\342\224\200\342\224\200 core/ \342\224\202 \342\224\234\342\224\200\342\224\200 govtech/ \342\224\202 \342\224\234\342\224\200\342\224\200 choco/ \342\224\202 \342\224\234\342\224\200\342\224\200 wallet/ \342\224\202 \342\224\234\342\224\200\342\224\200 academy/ \342\224\202 \342\224\234\342\224\200\342\224\200 ambassadors/ \342\224\202 \342\224\234\342\224\200\342\224\200 agents/ \342\224\202 \342\224\224\342\224\200\342\224\200 citizen/ \342\224\202 \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 routes/ \342\224\202 \342\224\234\342\224\200\342\224\200 services/ \342\224\202 \342\224\234\342\224\200\342\224\200 middleware/ \342\224\202 \342\224\224\342\224\200\342\224\200 config/ \342\224\202 \342\224\234\342\224\200\342\224\200 docs/\342\224\224\342\224\200\342\224\200 deploy" new file mode 100644 index 00000000..8b137891 --- /dev/null +++ "b/royal-mix-global/ \342\224\202 \342\224\234\342\224\200\342\224\200 frontend/ \342\224\202 \342\224\224\342\224\200\342\224\200 src/ \342\224\202 \342\224\224\342\224\200\342\224\200 modules/ \342\224\202 \342\224\234\342\224\200\342\224\200 core/ \342\224\202 \342\224\234\342\224\200\342\224\200 govtech/ \342\224\202 \342\224\234\342\224\200\342\224\200 choco/ \342\224\202 \342\224\234\342\224\200\342\224\200 wallet/ \342\224\202 \342\224\234\342\224\200\342\224\200 academy/ \342\224\202 \342\224\234\342\224\200\342\224\200 ambassadors/ \342\224\202 \342\224\234\342\224\200\342\224\200 agents/ \342\224\202 \342\224\224\342\224\200\342\224\200 citizen/ \342\224\202 \342\224\234\342\224\200\342\224\200 backend/ \342\224\202 \342\224\234\342\224\200\342\224\200 routes/ \342\224\202 \342\224\234\342\224\200\342\224\200 services/ \342\224\202 \342\224\234\342\224\200\342\224\200 middleware/ \342\224\202 \342\224\224\342\224\200\342\224\200 config/ \342\224\202 \342\224\234\342\224\200\342\224\200 docs/\342\224\224\342\224\200\342\224\200 deploy" @@ -0,0 +1 @@ + diff --git "a/royalmix-global \342\224\202 \342\224\234\342\224\200\342\224\200 /api \342\224\202 \342\224\234\342\224\200\342\224\200 /auth \342\224\202 \342\224\234\342\224\200\342\224\200 /payments \342\224\202 \342\224\234\342\224\200\342\224\200 /wallet \342\224\202 \342\224\234\342\224\200\342\224\200 /marketplace \342\224\202 \342\224\234\342\224\200\342\224\200 /liquor \342\224\202 \342\224\234\342\224\200\342\224\200 /pharmacy \342\224\202 \342\224\224\342\224\200\342\224\200 index.js \342\224\202 \342\224\234\342\224\200\342\224\200 /config \342\224\202 \342\224\234\342\224\200\342\224\200 db.js \342\224\202 \342\224\234\342\224\200\342\224\200 pi-sdk.js \342\224\202 \342\224\224\342\224\200\342\224\200 env.js \342\224\202 \342\224\234\342\224\200\342\224\200 /controllers \342\224\202 \342\224\234\342\224\200\342\224\200 authController.js \342\224\202 \342\224\234\342\224\200\342\224\200 paymentController.js \342\224\202 \342\224\234\342\224\200\342\224\200 walletController.js \342\224\202 \342\224\234\342\224\200\342\224\200 marketController.js \342\224\202 \342\224\224\342\224\200\342\224\200 aiEngine.js \342\224\202 \342\224\234\342\224\200\342\224\200 /services \342\224\202 \342\224\234\342\224\200\342\224\200 PiPaymentService.js \342\224\202 \342\224\234\342\224\200\342\224\200 WalletService.js \342\224\202 \342\224\234\342\224\200\342\224\200 LiquorService.js \342\224\202 \342\224\234\342\224\200\342\224\200 PharmacyService.js \342\224\202 \342\224\224\342\224\200\342\224\200 AI_Recommendation.js \342\224\202 \342\224\234\342\224\200\342\224\200 /models \342\224\202 \342\224\234\342\224\200\342\224\200 User.js \342\224\202 \342\224\234\342\224\200\342\224\200 Wallet.js \342\224\202 \342\224\234\342\224\200\342\224\200 Order.js \342\224\202 \342\224\234\342\224\200\342\224\200 Product.js \342\224\202 \342\224\224\342\224\200\342\224\200 Transaction.js \342\224\202 \342\224\234\342\224\200\342\224\200 /utils \342\224\202 \342\224\234\342\224\200\342\224\200 logger.js \342\224\202 \342\224\234\342\224\200\342\224\200 validator.js \342\224\202 \342\224\224\342\224\200\342\224\200 encryption.js \342\224\202 \342\224\234\342\224\200\342\224\200 /public \342\224\202 \342\224\234\342\224\200\342\224\200 icons \342\224\202 \342\224\234\342\224\200\342\224\200 banners \342\224\202 \342\224\224\342\224\200\342\224\200 uploads \342\224\202 \342\224\234\342\224\200\342\224\200 /Recommendation Engine.md" "b/royalmix-global \342\224\202 \342\224\234\342\224\200\342\224\200 /api \342\224\202 \342\224\234\342\224\200\342\224\200 /auth \342\224\202 \342\224\234\342\224\200\342\224\200 /payments \342\224\202 \342\224\234\342\224\200\342\224\200 /wallet \342\224\202 \342\224\234\342\224\200\342\224\200 /marketplace \342\224\202 \342\224\234\342\224\200\342\224\200 /liquor \342\224\202 \342\224\234\342\224\200\342\224\200 /pharmacy \342\224\202 \342\224\224\342\224\200\342\224\200 index.js \342\224\202 \342\224\234\342\224\200\342\224\200 /config \342\224\202 \342\224\234\342\224\200\342\224\200 db.js \342\224\202 \342\224\234\342\224\200\342\224\200 pi-sdk.js \342\224\202 \342\224\224\342\224\200\342\224\200 env.js \342\224\202 \342\224\234\342\224\200\342\224\200 /controllers \342\224\202 \342\224\234\342\224\200\342\224\200 authController.js \342\224\202 \342\224\234\342\224\200\342\224\200 paymentController.js \342\224\202 \342\224\234\342\224\200\342\224\200 walletController.js \342\224\202 \342\224\234\342\224\200\342\224\200 marketController.js \342\224\202 \342\224\224\342\224\200\342\224\200 aiEngine.js \342\224\202 \342\224\234\342\224\200\342\224\200 /services \342\224\202 \342\224\234\342\224\200\342\224\200 PiPaymentService.js \342\224\202 \342\224\234\342\224\200\342\224\200 WalletService.js \342\224\202 \342\224\234\342\224\200\342\224\200 LiquorService.js \342\224\202 \342\224\234\342\224\200\342\224\200 PharmacyService.js \342\224\202 \342\224\224\342\224\200\342\224\200 AI_Recommendation.js \342\224\202 \342\224\234\342\224\200\342\224\200 /models \342\224\202 \342\224\234\342\224\200\342\224\200 User.js \342\224\202 \342\224\234\342\224\200\342\224\200 Wallet.js \342\224\202 \342\224\234\342\224\200\342\224\200 Order.js \342\224\202 \342\224\234\342\224\200\342\224\200 Product.js \342\224\202 \342\224\224\342\224\200\342\224\200 Transaction.js \342\224\202 \342\224\234\342\224\200\342\224\200 /utils \342\224\202 \342\224\234\342\224\200\342\224\200 logger.js \342\224\202 \342\224\234\342\224\200\342\224\200 validator.js \342\224\202 \342\224\224\342\224\200\342\224\200 encryption.js \342\224\202 \342\224\234\342\224\200\342\224\200 /public \342\224\202 \342\224\234\342\224\200\342\224\200 icons \342\224\202 \342\224\234\342\224\200\342\224\200 banners \342\224\202 \342\224\224\342\224\200\342\224\200 uploads \342\224\202 \342\224\234\342\224\200\342\224\200 /Recommendation Engine.md" new file mode 100644 index 00000000..6b716f4f --- /dev/null +++ "b/royalmix-global \342\224\202 \342\224\234\342\224\200\342\224\200 /api \342\224\202 \342\224\234\342\224\200\342\224\200 /auth \342\224\202 \342\224\234\342\224\200\342\224\200 /payments \342\224\202 \342\224\234\342\224\200\342\224\200 /wallet \342\224\202 \342\224\234\342\224\200\342\224\200 /marketplace \342\224\202 \342\224\234\342\224\200\342\224\200 /liquor \342\224\202 \342\224\234\342\224\200\342\224\200 /pharmacy \342\224\202 \342\224\224\342\224\200\342\224\200 index.js \342\224\202 \342\224\234\342\224\200\342\224\200 /config \342\224\202 \342\224\234\342\224\200\342\224\200 db.js \342\224\202 \342\224\234\342\224\200\342\224\200 pi-sdk.js \342\224\202 \342\224\224\342\224\200\342\224\200 env.js \342\224\202 \342\224\234\342\224\200\342\224\200 /controllers \342\224\202 \342\224\234\342\224\200\342\224\200 authController.js \342\224\202 \342\224\234\342\224\200\342\224\200 paymentController.js \342\224\202 \342\224\234\342\224\200\342\224\200 walletController.js \342\224\202 \342\224\234\342\224\200\342\224\200 marketController.js \342\224\202 \342\224\224\342\224\200\342\224\200 aiEngine.js \342\224\202 \342\224\234\342\224\200\342\224\200 /services \342\224\202 \342\224\234\342\224\200\342\224\200 PiPaymentService.js \342\224\202 \342\224\234\342\224\200\342\224\200 WalletService.js \342\224\202 \342\224\234\342\224\200\342\224\200 LiquorService.js \342\224\202 \342\224\234\342\224\200\342\224\200 PharmacyService.js \342\224\202 \342\224\224\342\224\200\342\224\200 AI_Recommendation.js \342\224\202 \342\224\234\342\224\200\342\224\200 /models \342\224\202 \342\224\234\342\224\200\342\224\200 User.js \342\224\202 \342\224\234\342\224\200\342\224\200 Wallet.js \342\224\202 \342\224\234\342\224\200\342\224\200 Order.js \342\224\202 \342\224\234\342\224\200\342\224\200 Product.js \342\224\202 \342\224\224\342\224\200\342\224\200 Transaction.js \342\224\202 \342\224\234\342\224\200\342\224\200 /utils \342\224\202 \342\224\234\342\224\200\342\224\200 logger.js \342\224\202 \342\224\234\342\224\200\342\224\200 validator.js \342\224\202 \342\224\224\342\224\200\342\224\200 encryption.js \342\224\202 \342\224\234\342\224\200\342\224\200 /public \342\224\202 \342\224\234\342\224\200\342\224\200 icons \342\224\202 \342\224\234\342\224\200\342\224\200 banners \342\224\202 \342\224\224\342\224\200\342\224\200 uploads \342\224\202 \342\224\234\342\224\200\342\224\200 /Recommendation Engine.md" @@ -0,0 +1,19 @@ +export function recommendProducts(userHistory) { + const { purchases, visits, interests } = userHistory; + + const recommended = []; + + if (purchases.includes("liquor")) { + recommended.push("Castle Lite", "Black Label", "Mosi"); + } + + if (interests.includes("health")) { + recommended.push("Vitamin C", "Painkillers", "First Aid Kit"); + } + + if (visits > 10) { + recommended.push("Loyalty discount"); + } + + return recommended; +} diff --git "a/royalmix-global \342\224\202 \342\224\234\342\224\200\342\224\200 /api \342\224\202 \342\224\234\342\224\200\342\224\200 /auth \342\224\202 \342\224\234\342\224\200\342\224\200 /payments \342\224\202 \342\224\234\342\224\200\342\224\200 /wallet \342\224\202 \342\224\234\342\224\200\342\224\200 /marketplace \342\224\202 \342\224\234\342\224\200\342\224\200 /liquor \342\224\202 \342\224\234\342\224\200\342\224\200 /pharmacy \342\224\202 \342\224\224\342\224\200\342\224\200 index.js \342\224\202 \342\224\234\342\224\200\342\224\200 /config \342\224\202 \342\224\234\342\224\200\342\224\200 db.js \342\224\202 \342\224\234\342\224\200\342\224\200 pi-sdk.js \342\224\202 \342\224\224\342\224\200\342\224\200 env.js \342\224\202 \342\224\234\342\224\200\342\224\200 /controllers \342\224\202 \342\224\234\342\224\200\342\224\200 authController.js \342\224\202 \342\224\234\342\224\200\342\224\200 paymentController.js \342\224\202 \342\224\234\342\224\200\342\224\200 walletController.js \342\224\202 \342\224\234\342\224\200\342\224\200 marketController.js \342\224\202 \342\224\224\342\224\200\342\224\200 aiEngine.js \342\224\202 \342\224\234\342\224\200\342\224\200 /services \342\224\202 \342\224\234\342\224\200\342\224\200 PiPaymentService.js \342\224\202 \342\224\234\342\224\200\342\224\200 WalletService.js \342\224\202 \342\224\234\342\224\200\342\224\200 LiquorService.js \342\224\202 \342\224\234\342\224\200\342\224\200 PharmacyService.js \342\224\202 \342\224\224\342\224\200\342\224\200 AI_Recommendation.js \342\224\202 \342\224\234\342\224\200\342\224\200 /models \342\224\202 \342\224\234\342\224\200\342\224\200 User.js \342\224\202 \342\224\234\342\224\200\342\224\200 Wallet.js \342\224\202 \342\224\234\342\224\200\342\224\200 Order.js \342\224\202 \342\224\234\342\224\200\342\224\200 Product.js \342\224\202 \342\224\224\342\224\200\342\224\200 Transaction.js \342\224\202 \342\224\234\342\224\200\342\224\200 /utils \342\224\202 \342\224\234\342\224\200\342\224\200 logger.js \342\224\202 \342\224\234\342\224\200\342\224\200 validator.js \342\224\202 \342\224\224\342\224\200\342\224\200 encryption.js \342\224\202 \342\224\234\342\224\200\342\224\200 /public \342\224\202 \342\224\234\342\224\200\342\224\200 icons \342\224\202 \342\224\234\342\224\200\342\224\200 banners \342\224\202 \342\224\224\342\224\200\342\224\200 uploads \342\224\202 \342\224\234\342\224\200\342\224\200 /docs \342\224\202 \342\224\234\342\224\200\342\224\200 API_PAYMENTS.md \342\224\202 \342\224\234\342\224\200\342\224\200 INTEGRATION_GUIDE.md \342\224\202 \342\224\224\342\224\200\342\224\200 SECURITY_POLICY.md \342\224\202 \342\224\224\342\224\200\342\224\200 server.js" "b/royalmix-global \342\224\202 \342\224\234\342\224\200\342\224\200 /api \342\224\202 \342\224\234\342\224\200\342\224\200 /auth \342\224\202 \342\224\234\342\224\200\342\224\200 /payments \342\224\202 \342\224\234\342\224\200\342\224\200 /wallet \342\224\202 \342\224\234\342\224\200\342\224\200 /marketplace \342\224\202 \342\224\234\342\224\200\342\224\200 /liquor \342\224\202 \342\224\234\342\224\200\342\224\200 /pharmacy \342\224\202 \342\224\224\342\224\200\342\224\200 index.js \342\224\202 \342\224\234\342\224\200\342\224\200 /config \342\224\202 \342\224\234\342\224\200\342\224\200 db.js \342\224\202 \342\224\234\342\224\200\342\224\200 pi-sdk.js \342\224\202 \342\224\224\342\224\200\342\224\200 env.js \342\224\202 \342\224\234\342\224\200\342\224\200 /controllers \342\224\202 \342\224\234\342\224\200\342\224\200 authController.js \342\224\202 \342\224\234\342\224\200\342\224\200 paymentController.js \342\224\202 \342\224\234\342\224\200\342\224\200 walletController.js \342\224\202 \342\224\234\342\224\200\342\224\200 marketController.js \342\224\202 \342\224\224\342\224\200\342\224\200 aiEngine.js \342\224\202 \342\224\234\342\224\200\342\224\200 /services \342\224\202 \342\224\234\342\224\200\342\224\200 PiPaymentService.js \342\224\202 \342\224\234\342\224\200\342\224\200 WalletService.js \342\224\202 \342\224\234\342\224\200\342\224\200 LiquorService.js \342\224\202 \342\224\234\342\224\200\342\224\200 PharmacyService.js \342\224\202 \342\224\224\342\224\200\342\224\200 AI_Recommendation.js \342\224\202 \342\224\234\342\224\200\342\224\200 /models \342\224\202 \342\224\234\342\224\200\342\224\200 User.js \342\224\202 \342\224\234\342\224\200\342\224\200 Wallet.js \342\224\202 \342\224\234\342\224\200\342\224\200 Order.js \342\224\202 \342\224\234\342\224\200\342\224\200 Product.js \342\224\202 \342\224\224\342\224\200\342\224\200 Transaction.js \342\224\202 \342\224\234\342\224\200\342\224\200 /utils \342\224\202 \342\224\234\342\224\200\342\224\200 logger.js \342\224\202 \342\224\234\342\224\200\342\224\200 validator.js \342\224\202 \342\224\224\342\224\200\342\224\200 encryption.js \342\224\202 \342\224\234\342\224\200\342\224\200 /public \342\224\202 \342\224\234\342\224\200\342\224\200 icons \342\224\202 \342\224\234\342\224\200\342\224\200 banners \342\224\202 \342\224\224\342\224\200\342\224\200 uploads \342\224\202 \342\224\234\342\224\200\342\224\200 /docs \342\224\202 \342\224\234\342\224\200\342\224\200 API_PAYMENTS.md \342\224\202 \342\224\234\342\224\200\342\224\200 INTEGRATION_GUIDE.md \342\224\202 \342\224\224\342\224\200\342\224\200 SECURITY_POLICY.md \342\224\202 \342\224\224\342\224\200\342\224\200 server.js" new file mode 100644 index 00000000..161ec70a --- /dev/null +++ "b/royalmix-global \342\224\202 \342\224\234\342\224\200\342\224\200 /api \342\224\202 \342\224\234\342\224\200\342\224\200 /auth \342\224\202 \342\224\234\342\224\200\342\224\200 /payments \342\224\202 \342\224\234\342\224\200\342\224\200 /wallet \342\224\202 \342\224\234\342\224\200\342\224\200 /marketplace \342\224\202 \342\224\234\342\224\200\342\224\200 /liquor \342\224\202 \342\224\234\342\224\200\342\224\200 /pharmacy \342\224\202 \342\224\224\342\224\200\342\224\200 index.js \342\224\202 \342\224\234\342\224\200\342\224\200 /config \342\224\202 \342\224\234\342\224\200\342\224\200 db.js \342\224\202 \342\224\234\342\224\200\342\224\200 pi-sdk.js \342\224\202 \342\224\224\342\224\200\342\224\200 env.js \342\224\202 \342\224\234\342\224\200\342\224\200 /controllers \342\224\202 \342\224\234\342\224\200\342\224\200 authController.js \342\224\202 \342\224\234\342\224\200\342\224\200 paymentController.js \342\224\202 \342\224\234\342\224\200\342\224\200 walletController.js \342\224\202 \342\224\234\342\224\200\342\224\200 marketController.js \342\224\202 \342\224\224\342\224\200\342\224\200 aiEngine.js \342\224\202 \342\224\234\342\224\200\342\224\200 /services \342\224\202 \342\224\234\342\224\200\342\224\200 PiPaymentService.js \342\224\202 \342\224\234\342\224\200\342\224\200 WalletService.js \342\224\202 \342\224\234\342\224\200\342\224\200 LiquorService.js \342\224\202 \342\224\234\342\224\200\342\224\200 PharmacyService.js \342\224\202 \342\224\224\342\224\200\342\224\200 AI_Recommendation.js \342\224\202 \342\224\234\342\224\200\342\224\200 /models \342\224\202 \342\224\234\342\224\200\342\224\200 User.js \342\224\202 \342\224\234\342\224\200\342\224\200 Wallet.js \342\224\202 \342\224\234\342\224\200\342\224\200 Order.js \342\224\202 \342\224\234\342\224\200\342\224\200 Product.js \342\224\202 \342\224\224\342\224\200\342\224\200 Transaction.js \342\224\202 \342\224\234\342\224\200\342\224\200 /utils \342\224\202 \342\224\234\342\224\200\342\224\200 logger.js \342\224\202 \342\224\234\342\224\200\342\224\200 validator.js \342\224\202 \342\224\224\342\224\200\342\224\200 encryption.js \342\224\202 \342\224\234\342\224\200\342\224\200 /public \342\224\202 \342\224\234\342\224\200\342\224\200 icons \342\224\202 \342\224\234\342\224\200\342\224\200 banners \342\224\202 \342\224\224\342\224\200\342\224\200 uploads \342\224\202 \342\224\234\342\224\200\342\224\200 /docs \342\224\202 \342\224\234\342\224\200\342\224\200 API_PAYMENTS.md \342\224\202 \342\224\234\342\224\200\342\224\200 INTEGRATION_GUIDE.md \342\224\202 \342\224\224\342\224\200\342\224\200 SECURITY_POLICY.md \342\224\202 \342\224\224\342\224\200\342\224\200 server.js" @@ -0,0 +1,26 @@ +import Pi from "@pi-network/sdk"; +import express from "express"; + +const app = express(); +app.use(express.json()); + +Pi.init({ + apiKey: process.env.PI_API_KEY, + walletPrivateKey: process.env.PI_PRIVATE_KEY, + environment: "sandbox" +}); + +app.post("/api/payments/create", async (req, res) => { + try { + const { amount, userId } = req.body; + const payment = await Pi.createPayment({ + amount, + memo: "Royal Mix Global Purchase", + metadata: { userId } + }); + + res.status(200).json({ payment }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); diff --git a/royalmix-global/ /services/ /fraud_engine/anomaly_monitor.pyclass AnomalyMonitor: def detect(self, transaction_history): if max(transaction_history) > (sum(transaction_history) /anomaly_monitor.py b/royalmix-global/ /services/ /fraud_engine/anomaly_monitor.pyclass AnomalyMonitor: def detect(self, transaction_history): if max(transaction_history) > (sum(transaction_history) /anomaly_monitor.py new file mode 100644 index 00000000..28216075 --- /dev/null +++ b/royalmix-global/ /services/ /fraud_engine/anomaly_monitor.pyclass AnomalyMonitor: def detect(self, transaction_history): if max(transaction_history) > (sum(transaction_history) /anomaly_monitor.py @@ -0,0 +1,5 @@ +class AnomalyMonitor: + def detect(self, transaction_history): + if max(transaction_history) > (sum(transaction_history) / 2): + return True + return False diff --git a/royalmix-global/ /services/ /fraud_engine/anomaly_monitor.pyclass AnomalyMonitor: def detect(self, transaction_history): if max(transaction_history) > (sum(transaction_history) /device_fingerprint.py b/royalmix-global/ /services/ /fraud_engine/anomaly_monitor.pyclass AnomalyMonitor: def detect(self, transaction_history): if max(transaction_history) > (sum(transaction_history) /device_fingerprint.py new file mode 100644 index 00000000..d9401eb6 --- /dev/null +++ b/royalmix-global/ /services/ /fraud_engine/anomaly_monitor.pyclass AnomalyMonitor: def detect(self, transaction_history): if max(transaction_history) > (sum(transaction_history) /device_fingerprint.py @@ -0,0 +1,9 @@ +import hashlib + +class DeviceFingerprint: + def generate(self, device_info): + raw = f"{device_info['ip']}-{device_info['browser']}-{device_info['os']}" + return hashlib.sha256(raw.encode()).hexdigest() + + def compare(self, stored_fingerprint, new_fingerprint): + return stored_fingerprint == new_fingerprint diff --git a/royalmix-global/ /services/ /fraud_engine/anomaly_monitor.pyclass AnomalyMonitor: def detect(self, transaction_history): if max(transaction_history) > (sum(transaction_history) /fraud_dashboard_api.py b/royalmix-global/ /services/ /fraud_engine/anomaly_monitor.pyclass AnomalyMonitor: def detect(self, transaction_history): if max(transaction_history) > (sum(transaction_history) /fraud_dashboard_api.py new file mode 100644 index 00000000..e5279872 --- /dev/null +++ b/royalmix-global/ /services/ /fraud_engine/anomaly_monitor.pyclass AnomalyMonitor: def detect(self, transaction_history): if max(transaction_history) > (sum(transaction_history) /fraud_dashboard_api.py @@ -0,0 +1,11 @@ +from fastapi import APIRouter + +router = APIRouter() + +@router.get("/fraud/score") +def score(user_id: str): + return { + "risk_score": 72, + "status": "medium", + "recommendation": "review manually" + } diff --git a/royalmix-global/ /services/ /fraud_engine/anomaly_monitor.pyclass AnomalyMonitor: def detect(self, transaction_history): if max(transaction_history) > (sum(transaction_history) /royalmix-global/ /services/ /fraud_engine/behavioral_biometrics.py b/royalmix-global/ /services/ /fraud_engine/anomaly_monitor.pyclass AnomalyMonitor: def detect(self, transaction_history): if max(transaction_history) > (sum(transaction_history) /royalmix-global/ /services/ /fraud_engine/behavioral_biometrics.py new file mode 100644 index 00000000..7f08d774 --- /dev/null +++ b/royalmix-global/ /services/ /fraud_engine/anomaly_monitor.pyclass AnomalyMonitor: def detect(self, transaction_history): if max(transaction_history) > (sum(transaction_history) /royalmix-global/ /services/ /fraud_engine/behavioral_biometrics.py @@ -0,0 +1,34 @@ +import statistics + +class BehavioralBiometrics: + def __init__(self): + self.typing_speed_threshold = 30 # ms per character + self.touch_pressure_min = 0.1 + self.touch_pressure_max = 0.8 + + def detect_bot_typing(self, typing_speeds): + avg_speed = statistics.mean(typing_speeds) + if avg_speed < self.typing_speed_threshold: + return True + return False + + def detect_swipe_anomaly(self, swipe_angles): + variance = statistics.variance(swipe_angles) if len(swipe_angles) > 1 else 0 + return variance < 0.01 # too perfect -> likely a bot + + def evaluate(self, typing_speeds, swipe_angles, touch_pressure): + anomalies = [] + + if self.detect_bot_typing(typing_speeds): + anomalies.append("bot-like typing detected") + + if self.detect_swipe_anomaly(swipe_angles): + anomalies.append("automated swipe pattern detected") + + if not (self.touch_pressure_min <= touch_pressure <= self.touch_pressure_max): + anomalies.append("abnormal touch pressure") + + return { + "status": "anomalies" if anomalies else "normal", + "issues": anomalies + } diff --git a/royalmix-global/ /services/ /fraud_engine/anomaly_monitor.pyclass AnomalyMonitor: def detect(self, transaction_history): if max(transaction_history) > (sum(transaction_history) /royalmix-global/ /services/ /fraud_engine/geolocation_mismatch.py b/royalmix-global/ /services/ /fraud_engine/anomaly_monitor.pyclass AnomalyMonitor: def detect(self, transaction_history): if max(transaction_history) > (sum(transaction_history) /royalmix-global/ /services/ /fraud_engine/geolocation_mismatch.py new file mode 100644 index 00000000..57528f92 --- /dev/null +++ b/royalmix-global/ /services/ /fraud_engine/anomaly_monitor.pyclass AnomalyMonitor: def detect(self, transaction_history): if max(transaction_history) > (sum(transaction_history) /royalmix-global/ /services/ /fraud_engine/geolocation_mismatch.py @@ -0,0 +1,18 @@ +class GeoMismatchDetector: + def __init__(self): + self.threshold_km = 1500 + + def is_mismatch(self, ip_country: str, card_country: str): + return ip_country != card_country + + def evaluate(self, ip_country, card_country): + if self.is_mismatch(ip_country, card_country): + return { + "status": "warning", + "reason": "IP location differs from card origin", + "risk_score": 40 + } + return { + "status": "ok", + "risk_score": 0 + } diff --git a/royalmix-global/ /services/ /fraud_engine/anomaly_monitor.pyclass AnomalyMonitor: def detect(self, transaction_history): if max(transaction_history) > (sum(transaction_history) /royalmix-global/ /services/ /fraud_engine/geolocation_mismatch.py sim_swap_detector.py ip_reputation_checker.py behavioral_biometrics.py b/royalmix-global/ /services/ /fraud_engine/anomaly_monitor.pyclass AnomalyMonitor: def detect(self, transaction_history): if max(transaction_history) > (sum(transaction_history) /royalmix-global/ /services/ /fraud_engine/geolocation_mismatch.py sim_swap_detector.py ip_reputation_checker.py behavioral_biometrics.py new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/royalmix-global/ /services/ /fraud_engine/anomaly_monitor.pyclass AnomalyMonitor: def detect(self, transaction_history): if max(transaction_history) > (sum(transaction_history) /royalmix-global/ /services/ /fraud_engine/geolocation_mismatch.py sim_swap_detector.py ip_reputation_checker.py behavioral_biometrics.py @@ -0,0 +1 @@ + diff --git a/royalmix-global/ /services/ /fraud_engine/anomaly_monitor.pyclass AnomalyMonitor: def detect(self, transaction_history): if max(transaction_history) > (sum(transaction_history) /royalmix-global/ /services/ /fraud_engine/ip_reputation_checker.py b/royalmix-global/ /services/ /fraud_engine/anomaly_monitor.pyclass AnomalyMonitor: def detect(self, transaction_history): if max(transaction_history) > (sum(transaction_history) /royalmix-global/ /services/ /fraud_engine/ip_reputation_checker.py new file mode 100644 index 00000000..68ddac6b --- /dev/null +++ b/royalmix-global/ /services/ /fraud_engine/anomaly_monitor.pyclass AnomalyMonitor: def detect(self, transaction_history): if max(transaction_history) > (sum(transaction_history) /royalmix-global/ /services/ /fraud_engine/ip_reputation_checker.py @@ -0,0 +1,18 @@ +class IPReputationChecker: + def __init__(self, reputation_api): + self.reputation_api = reputation_api + + def check_ip(self, ip_address): + result = self.reputation_api.lookup(ip_address) + + if result["is_tor"] or result["is_proxy"] or result["is_vpn"]: + return { + "status": "bad", + "risk_score": 60, + "reason": result + } + + return { + "status": "clean", + "risk_score": 0 + } diff --git a/royalmix-global/ /services/ /fraud_engine/anomaly_monitor.pyclass AnomalyMonitor: def detect(self, transaction_history): if max(transaction_history) > (sum(transaction_history) /royalmix-global/ /services/ /fraud_engine/sim_swap_detector.py b/royalmix-global/ /services/ /fraud_engine/anomaly_monitor.pyclass AnomalyMonitor: def detect(self, transaction_history): if max(transaction_history) > (sum(transaction_history) /royalmix-global/ /services/ /fraud_engine/sim_swap_detector.py new file mode 100644 index 00000000..b370ad0f --- /dev/null +++ b/royalmix-global/ /services/ /fraud_engine/anomaly_monitor.pyclass AnomalyMonitor: def detect(self, transaction_history): if max(transaction_history) > (sum(transaction_history) /royalmix-global/ /services/ /fraud_engine/sim_swap_detector.py @@ -0,0 +1 @@ +feat(fraud-engine): add geolocation mismatch AI, sim swap detector, IP reputation scanner, behavioral biometrics detection diff --git a/royalmix-global/ /services/ /fraud_engine/ml_detection_model.py b/royalmix-global/ /services/ /fraud_engine/ml_detection_model.py new file mode 100644 index 00000000..047b104f --- /dev/null +++ b/royalmix-global/ /services/ /fraud_engine/ml_detection_model.py @@ -0,0 +1,10 @@ +import joblib +import numpy as np + +class FraudMLModel: + def __init__(self): + self.model = joblib.load("fraud_model.pkl") + + def predict(self, features): + arr = np.array(features).reshape(1, -1) + return self.model.predict(arr)[0] diff --git a/royalmix-global/ /services/ /fraud_engine/payment_velocity_checker.py b/royalmix-global/ /services/ /fraud_engine/payment_velocity_checker.py new file mode 100644 index 00000000..a35c69d8 --- /dev/null +++ b/royalmix-global/ /services/ /fraud_engine/payment_velocity_checker.py @@ -0,0 +1,9 @@ +class PaymentVelocityChecker: + def __init__(self, db): + self.db = db + + def check_velocity(self, user_id): + last_1h = self.db.get_transactions_last_hour(user_id) + if len(last_1h) > 10: + return True + return False diff --git a/royalmix-global/ /services/ /fraud_engine/risk_rules_engine.py b/royalmix-global/ /services/ /fraud_engine/risk_rules_engine.py new file mode 100644 index 00000000..d2e3a9ef --- /dev/null +++ b/royalmix-global/ /services/ /fraud_engine/risk_rules_engine.py @@ -0,0 +1,15 @@ +class RiskRulesEngine: + def __init__(self): + self.rules = [ + ("LARGE_ORDER_CHECK", lambda order: order.amount > 5000), + ("SUSPICIOUS_COUNTRY", lambda order: order.country in ["NG", "SO", "PK"]), + ("ACCOUNT_AGE", lambda order: order.user_age_days < 7), + ("MULTIPLE_CARDS", lambda order: len(order.cards_used) > 3) + ] + + def evaluate(self, order): + triggered = [] + for rule_name, rule in self.rules: + if rule(order): + triggered.append(rule_name) + return triggered diff --git a/royalmix-global/ /services/ /fraud_engine/risk_rules_engine.py ml_detection_model.py payment_velocity_checker.py anomaly_monitor.py device_fingerprint.py fraud_dashboard_api.py __init__.py b/royalmix-global/ /services/ /fraud_engine/risk_rules_engine.py ml_detection_model.py payment_velocity_checker.py anomaly_monitor.py device_fingerprint.py fraud_dashboard_api.py __init__.py new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/royalmix-global/ /services/ /fraud_engine/risk_rules_engine.py ml_detection_model.py payment_velocity_checker.py anomaly_monitor.py device_fingerprint.py fraud_dashboard_api.py __init__.py @@ -0,0 +1 @@ + diff --git a/royalmix-global/ai_assistant/ nlp_engine.js intent_classifier.js voice_processor.js action_executor.js/action_executor.js b/royalmix-global/ai_assistant/ nlp_engine.js intent_classifier.js voice_processor.js action_executor.js/action_executor.js new file mode 100644 index 00000000..54028a33 --- /dev/null +++ b/royalmix-global/ai_assistant/ nlp_engine.js intent_classifier.js voice_processor.js action_executor.js/action_executor.js @@ -0,0 +1,6 @@ +export class ActionExecutor { + perform(intent, data) { + if (intent === "ORDER_STATUS") return "Your order is 15 minutes away."; + return "How may I assist you?"; + } +} diff --git a/royalmix-global/ai_assistant/ nlp_engine.js intent_classifier.js voice_processor.js action_executor.js/intent_classifier.js b/royalmix-global/ai_assistant/ nlp_engine.js intent_classifier.js voice_processor.js action_executor.js/intent_classifier.js new file mode 100644 index 00000000..1417cfc9 --- /dev/null +++ b/royalmix-global/ai_assistant/ nlp_engine.js intent_classifier.js voice_processor.js action_executor.js/intent_classifier.js @@ -0,0 +1,7 @@ +export class IntentClassifier { + classify(input) { + if (input.includes("order")) return "ORDER_STATUS"; + if (input.includes("pay")) return "PAYMENT_HELP"; + return "UNKNOWN"; + } +} diff --git a/royalmix-global/ai_assistant/ nlp_engine.js intent_classifier.js voice_processor.js action_executor.js/nlp_engine.js b/royalmix-global/ai_assistant/ nlp_engine.js intent_classifier.js voice_processor.js action_executor.js/nlp_engine.js new file mode 100644 index 00000000..8a9c172b --- /dev/null +++ b/royalmix-global/ai_assistant/ nlp_engine.js intent_classifier.js voice_processor.js action_executor.js/nlp_engine.js @@ -0,0 +1,5 @@ +export class NLPEngine { + analyze(text) { + return { intent: "order_status", entities: { orderId: "RMX-2026-001" } }; + } +} diff --git a/royalmix-global/ai_assistant/ nlp_engine.js intent_classifier.js voice_processor.js action_executor.js/voice_processor.js b/royalmix-global/ai_assistant/ nlp_engine.js intent_classifier.js voice_processor.js action_executor.js/voice_processor.js new file mode 100644 index 00000000..7f7e0bcd --- /dev/null +++ b/royalmix-global/ai_assistant/ nlp_engine.js intent_classifier.js voice_processor.js action_executor.js/voice_processor.js @@ -0,0 +1,5 @@ +export class VoiceProcessor { + transcribe(audioBuffer) { + return "User said: Check my delivery"; + } +} diff --git a/royalmix-global/ai_assistant/nlp_engine.js intent_classifier.js voice_processor.js action_executor.js b/royalmix-global/ai_assistant/nlp_engine.js intent_classifier.js voice_processor.js action_executor.js new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/royalmix-global/ai_assistant/nlp_engine.js intent_classifier.js voice_processor.js action_executor.js @@ -0,0 +1 @@ + diff --git a/royalmix-global/ai_assistant/royalmix-global/pos/ pos_terminal.js receipt_engine.js barcode_scanner.js/barcode_scanner.js b/royalmix-global/ai_assistant/royalmix-global/pos/ pos_terminal.js receipt_engine.js barcode_scanner.js/barcode_scanner.js new file mode 100644 index 00000000..69d6eb64 --- /dev/null +++ b/royalmix-global/ai_assistant/royalmix-global/pos/ pos_terminal.js receipt_engine.js barcode_scanner.js/barcode_scanner.js @@ -0,0 +1,5 @@ +export class BarcodeScanner { + scan(code) { + return { item: "Royal Mix Choco", price: 12.5 }; + } +} diff --git a/royalmix-global/ai_assistant/royalmix-global/pos/ pos_terminal.js receipt_engine.js barcode_scanner.js/pos_terminal.js b/royalmix-global/ai_assistant/royalmix-global/pos/ pos_terminal.js receipt_engine.js barcode_scanner.js/pos_terminal.js new file mode 100644 index 00000000..c62026be --- /dev/null +++ b/royalmix-global/ai_assistant/royalmix-global/pos/ pos_terminal.js receipt_engine.js barcode_scanner.js/pos_terminal.js @@ -0,0 +1,5 @@ +export class POSTerminal { + checkout(cart) { + return cart.items.reduce((sum, item) => sum + item.price, 0); + } +} diff --git a/royalmix-global/ai_assistant/royalmix-global/pos/ pos_terminal.js receipt_engine.js barcode_scanner.js/receipt_engine.js b/royalmix-global/ai_assistant/royalmix-global/pos/ pos_terminal.js receipt_engine.js barcode_scanner.js/receipt_engine.js new file mode 100644 index 00000000..277ca4fe --- /dev/null +++ b/royalmix-global/ai_assistant/royalmix-global/pos/ pos_terminal.js receipt_engine.js barcode_scanner.js/receipt_engine.js @@ -0,0 +1,5 @@ +export class ReceiptEngine { + generate(order) { + return `Receipt #${order.id}\nTotal: ${order.total}`; + } +} diff --git a/royalmix-global/defi/ staking_pool.js yield_engine.js swap_engine.js/staking_pool.js b/royalmix-global/defi/ staking_pool.js yield_engine.js swap_engine.js/staking_pool.js new file mode 100644 index 00000000..cddb3f70 --- /dev/null +++ b/royalmix-global/defi/ staking_pool.js yield_engine.js swap_engine.js/staking_pool.js @@ -0,0 +1,5 @@ +export class StakingPool { + stake(amount) { + return { staked: amount, apy: "8%" }; + } +} diff --git a/royalmix-global/defi/ staking_pool.js yield_engine.js swap_engine.js/swap_engine.js b/royalmix-global/defi/ staking_pool.js yield_engine.js swap_engine.js/swap_engine.js new file mode 100644 index 00000000..e8f0c265 --- /dev/null +++ b/royalmix-global/defi/ staking_pool.js yield_engine.js swap_engine.js/swap_engine.js @@ -0,0 +1,5 @@ +export class SwapEngine { + swap(tokenA, tokenB, amount) { + return `${amount} ${tokenA} swapped into ${tokenB}`; + } +} diff --git a/royalmix-global/defi/ staking_pool.js yield_engine.js swap_engine.js/yield_engine.js b/royalmix-global/defi/ staking_pool.js yield_engine.js swap_engine.js/yield_engine.js new file mode 100644 index 00000000..3630183b --- /dev/null +++ b/royalmix-global/defi/ staking_pool.js yield_engine.js swap_engine.js/yield_engine.js @@ -0,0 +1,5 @@ +export class YieldEngine { + calculate(amount, days) { + return (amount * days * 0.0005).toFixed(2); + } +} diff --git a/royalmix-global/food_delivery/ courier_tracker.js kitchen_timer.js eta_predictor.js/courier_tracker.js b/royalmix-global/food_delivery/ courier_tracker.js kitchen_timer.js eta_predictor.js/courier_tracker.js new file mode 100644 index 00000000..296ad158 --- /dev/null +++ b/royalmix-global/food_delivery/ courier_tracker.js kitchen_timer.js eta_predictor.js/courier_tracker.js @@ -0,0 +1,5 @@ +export class CourierTracker { + track(courierId) { + return { courierId, location: "Downtown", eta: "12 minutes" }; + } +} diff --git a/royalmix-global/food_delivery/ courier_tracker.js kitchen_timer.js eta_predictor.js/eta_predictor.js b/royalmix-global/food_delivery/ courier_tracker.js kitchen_timer.js eta_predictor.js/eta_predictor.js new file mode 100644 index 00000000..767ccaa8 --- /dev/null +++ b/royalmix-global/food_delivery/ courier_tracker.js kitchen_timer.js eta_predictor.js/eta_predictor.js @@ -0,0 +1,5 @@ +export class ETAPredictor { + predict(distance, speed) { + return `${Math.ceil(distance / speed)} minutes`; + } +} diff --git a/royalmix-global/food_delivery/ courier_tracker.js kitchen_timer.js eta_predictor.js/kitchen_timer.js b/royalmix-global/food_delivery/ courier_tracker.js kitchen_timer.js eta_predictor.js/kitchen_timer.js new file mode 100644 index 00000000..cbf99aff --- /dev/null +++ b/royalmix-global/food_delivery/ courier_tracker.js kitchen_timer.js eta_predictor.js/kitchen_timer.js @@ -0,0 +1,5 @@ +export class KitchenTimer { + start(dish) { + return `${dish} will be ready in 8 minutes`; + } +} diff --git a/royalmix-global/growth_engine/ xp_manager.js badge_engine.js streak_tracker.js referral_booster.js/badge_engine.js b/royalmix-global/growth_engine/ xp_manager.js badge_engine.js streak_tracker.js referral_booster.js/badge_engine.js new file mode 100644 index 00000000..c6d4fcf8 --- /dev/null +++ b/royalmix-global/growth_engine/ xp_manager.js badge_engine.js streak_tracker.js referral_booster.js/badge_engine.js @@ -0,0 +1,6 @@ +export class BadgeEngine { + assign(user, badge) { + if (!user.badges.includes(badge)) user.badges.push(badge); + return user.badges; + } +} diff --git a/royalmix-global/growth_engine/ xp_manager.js badge_engine.js streak_tracker.js referral_booster.js/referral_booster.js b/royalmix-global/growth_engine/ xp_manager.js badge_engine.js streak_tracker.js referral_booster.js/referral_booster.js new file mode 100644 index 00000000..920894e1 --- /dev/null +++ b/royalmix-global/growth_engine/ xp_manager.js badge_engine.js streak_tracker.js referral_booster.js/referral_booster.js @@ -0,0 +1,5 @@ +export class ReferralBooster { + reward(referrer, count) { + return referrer.wallet + count * 2; + } +} diff --git a/royalmix-global/growth_engine/ xp_manager.js badge_engine.js streak_tracker.js referral_booster.js/streak_tracker.js b/royalmix-global/growth_engine/ xp_manager.js badge_engine.js streak_tracker.js referral_booster.js/streak_tracker.js new file mode 100644 index 00000000..ebe6b6df --- /dev/null +++ b/royalmix-global/growth_engine/ xp_manager.js badge_engine.js streak_tracker.js referral_booster.js/streak_tracker.js @@ -0,0 +1,6 @@ +export class StreakTracker { + update(user) { + user.streakDays++; + return user.streakDays; + } +} diff --git a/royalmix-global/growth_engine/ xp_manager.js badge_engine.js streak_tracker.js referral_booster.js/xp_manager.js b/royalmix-global/growth_engine/ xp_manager.js badge_engine.js streak_tracker.js referral_booster.js/xp_manager.js new file mode 100644 index 00000000..c9616b82 --- /dev/null +++ b/royalmix-global/growth_engine/ xp_manager.js badge_engine.js streak_tracker.js referral_booster.js/xp_manager.js @@ -0,0 +1,6 @@ +export class XPManager { + addXP(user, amount) { + user.xp += amount; + return user.xp; + } +} diff --git a/royalmix-global/liquor/ age_verification.js brand_catalog.js liquor_auto_reorder.js/age_verification.js b/royalmix-global/liquor/ age_verification.js brand_catalog.js liquor_auto_reorder.js/age_verification.js new file mode 100644 index 00000000..e56782f3 --- /dev/null +++ b/royalmix-global/liquor/ age_verification.js brand_catalog.js liquor_auto_reorder.js/age_verification.js @@ -0,0 +1,5 @@ +export class AgeVerification { + verify(idNumber) { + return true; // AI + OCR checks can be added here + } +} diff --git a/royalmix-global/liquor/ age_verification.js brand_catalog.js liquor_auto_reorder.js/brand_catalog.js b/royalmix-global/liquor/ age_verification.js brand_catalog.js liquor_auto_reorder.js/brand_catalog.js new file mode 100644 index 00000000..0c4ee14a --- /dev/null +++ b/royalmix-global/liquor/ age_verification.js brand_catalog.js liquor_auto_reorder.js/brand_catalog.js @@ -0,0 +1,3 @@ +export const brands = [ + "Mosi", "Castle", "Heineken", "Eagle", "Black Label" +]; diff --git a/royalmix-global/liquor/ age_verification.js brand_catalog.js liquor_auto_reorder.js/liquor_auto_reorder.js b/royalmix-global/liquor/ age_verification.js brand_catalog.js liquor_auto_reorder.js/liquor_auto_reorder.js new file mode 100644 index 00000000..903cd53a --- /dev/null +++ b/royalmix-global/liquor/ age_verification.js brand_catalog.js liquor_auto_reorder.js/liquor_auto_reorder.js @@ -0,0 +1,6 @@ +export class LiquorAutoReorder { + check(stockLevel) { + if (stockLevel < 10) return "Reorder triggered"; + return "Stock OK"; + } +} diff --git a/royalmix-global/payments/ pi_gateway.js escrow_module.js settlement_engine.js fraud_guard.js/pi_gateway.js b/royalmix-global/payments/ pi_gateway.js escrow_module.js settlement_engine.js fraud_guard.js/pi_gateway.js new file mode 100644 index 00000000..7516848e --- /dev/null +++ b/royalmix-global/payments/ pi_gateway.js escrow_module.js settlement_engine.js fraud_guard.js/pi_gateway.js @@ -0,0 +1,11 @@ +import { Pi } from "@pi/sdk"; + +export class PiGateway { + async initiatePayment(amount, userId) { + return await Pi.createPayment({ + amount: amount, + memo: "RoyalMix Purchase", + metadata: { user_id: userId } + }); + } +} diff --git a/royalmix-global/pos/ pos_terminal.js receipt_engine.js barcode_scanner.js/barcode_scanner.js b/royalmix-global/pos/ pos_terminal.js receipt_engine.js barcode_scanner.js/barcode_scanner.js new file mode 100644 index 00000000..69d6eb64 --- /dev/null +++ b/royalmix-global/pos/ pos_terminal.js receipt_engine.js barcode_scanner.js/barcode_scanner.js @@ -0,0 +1,5 @@ +export class BarcodeScanner { + scan(code) { + return { item: "Royal Mix Choco", price: 12.5 }; + } +} diff --git a/royalmix-global/pos/ pos_terminal.js receipt_engine.js barcode_scanner.js/pos_terminal.js b/royalmix-global/pos/ pos_terminal.js receipt_engine.js barcode_scanner.js/pos_terminal.js new file mode 100644 index 00000000..c62026be --- /dev/null +++ b/royalmix-global/pos/ pos_terminal.js receipt_engine.js barcode_scanner.js/pos_terminal.js @@ -0,0 +1,5 @@ +export class POSTerminal { + checkout(cart) { + return cart.items.reduce((sum, item) => sum + item.price, 0); + } +} diff --git a/royalmix-global/pos/ pos_terminal.js receipt_engine.js barcode_scanner.js/receipt_engine.js b/royalmix-global/pos/ pos_terminal.js receipt_engine.js barcode_scanner.js/receipt_engine.js new file mode 100644 index 00000000..277ca4fe --- /dev/null +++ b/royalmix-global/pos/ pos_terminal.js receipt_engine.js barcode_scanner.js/receipt_engine.js @@ -0,0 +1,5 @@ +export class ReceiptEngine { + generate(order) { + return `Receipt #${order.id}\nTotal: ${order.total}`; + } +} diff --git a/royalmix-global/royalmix-global/infra/ autoscale.yaml loadbalancer.yaml cache_cluster.js global_cdn_config.json/autoscale.yaml b/royalmix-global/royalmix-global/infra/ autoscale.yaml loadbalancer.yaml cache_cluster.js global_cdn_config.json/autoscale.yaml new file mode 100644 index 00000000..f25ea36c --- /dev/null +++ b/royalmix-global/royalmix-global/infra/ autoscale.yaml loadbalancer.yaml cache_cluster.js global_cdn_config.json/autoscale.yaml @@ -0,0 +1,4 @@ +autoscaling: + min_replicas: 3 + max_replicas: 500 + cpu_target: 65 diff --git a/royalmix-global/royalmix-global/infra/ autoscale.yaml loadbalancer.yaml cache_cluster.js global_cdn_config.json/cache_cluster.js b/royalmix-global/royalmix-global/infra/ autoscale.yaml loadbalancer.yaml cache_cluster.js global_cdn_config.json/cache_cluster.js new file mode 100644 index 00000000..554b07b1 --- /dev/null +++ b/royalmix-global/royalmix-global/infra/ autoscale.yaml loadbalancer.yaml cache_cluster.js global_cdn_config.json/cache_cluster.js @@ -0,0 +1,13 @@ +export class CacheCluster { + constructor() { + this.cache = {}; + } + + set(key, value) { + this.cache[key] = value; + } + + get(key) { + return this.cache[key]; + } +} diff --git a/royalmix-global/royalmix-global/infra/ autoscale.yaml loadbalancer.yaml cache_cluster.js global_cdn_config.json/global_cdn_config.json b/royalmix-global/royalmix-global/infra/ autoscale.yaml loadbalancer.yaml cache_cluster.js global_cdn_config.json/global_cdn_config.json new file mode 100644 index 00000000..0c7d8ebf --- /dev/null +++ b/royalmix-global/royalmix-global/infra/ autoscale.yaml loadbalancer.yaml cache_cluster.js global_cdn_config.json/global_cdn_config.json @@ -0,0 +1,4 @@ +{ + "regions": ["Africa-East", "Africa-South", "Europe", "Asia"], + "cacheTTL": 3600 +} diff --git a/royalmix-global/royalmix-global/infra/ autoscale.yaml loadbalancer.yaml cache_cluster.js global_cdn_config.json/loadbalancer.yaml b/royalmix-global/royalmix-global/infra/ autoscale.yaml loadbalancer.yaml cache_cluster.js global_cdn_config.json/loadbalancer.yaml new file mode 100644 index 00000000..d07331d9 --- /dev/null +++ b/royalmix-global/royalmix-global/infra/ autoscale.yaml loadbalancer.yaml cache_cluster.js global_cdn_config.json/loadbalancer.yaml @@ -0,0 +1,6 @@ +loadBalancer: + rules: + - path: /payments + target: payment-service + - path: /fleet + target: fleet-service diff --git a/royalmix-global/supplychain_ai/ tracking_node.js audit_blockchain.js supplier_score_engine.js batch_verify.js/audit_blockchain.js b/royalmix-global/supplychain_ai/ tracking_node.js audit_blockchain.js supplier_score_engine.js batch_verify.js/audit_blockchain.js new file mode 100644 index 00000000..465eab48 --- /dev/null +++ b/royalmix-global/supplychain_ai/ tracking_node.js audit_blockchain.js supplier_score_engine.js batch_verify.js/audit_blockchain.js @@ -0,0 +1,15 @@ +export class AuditBlockchain { + constructor() { + this.chain = []; + } + + addRecord(record) { + const hash = this.hash(record); + this.chain.push({ record, hash }); + return hash; + } + + hash(input) { + return JSON.stringify(input).length * 999999; + } +} diff --git a/royalmix-global/supplychain_ai/ tracking_node.js audit_blockchain.js supplier_score_engine.js batch_verify.js/batch_verify.js b/royalmix-global/supplychain_ai/ tracking_node.js audit_blockchain.js supplier_score_engine.js batch_verify.js/batch_verify.js new file mode 100644 index 00000000..1be4ad99 --- /dev/null +++ b/royalmix-global/supplychain_ai/ tracking_node.js audit_blockchain.js supplier_score_engine.js batch_verify.js/batch_verify.js @@ -0,0 +1,8 @@ +export class BatchVerify { + verify(batch) { + return { + batch_id: batch.id, + verified: batch.temperature + batch.transport_condition < 10 + }; + } +} diff --git a/royalmix-global/supplychain_ai/ tracking_node.js audit_blockchain.js supplier_score_engine.js batch_verify.js/escrow_module.js b/royalmix-global/supplychain_ai/ tracking_node.js audit_blockchain.js supplier_score_engine.js batch_verify.js/escrow_module.js new file mode 100644 index 00000000..bc16713c --- /dev/null +++ b/royalmix-global/supplychain_ai/ tracking_node.js audit_blockchain.js supplier_score_engine.js batch_verify.js/escrow_module.js @@ -0,0 +1,8 @@ +export class EscrowModule { + hold(paymentId) { + return { status: "held", paymentId }; + } + release(paymentId) { + return { status: "released", paymentId }; + } +} diff --git a/royalmix-global/supplychain_ai/ tracking_node.js audit_blockchain.js supplier_score_engine.js batch_verify.js/supplier_score_engine.js b/royalmix-global/supplychain_ai/ tracking_node.js audit_blockchain.js supplier_score_engine.js batch_verify.js/supplier_score_engine.js new file mode 100644 index 00000000..50357e34 --- /dev/null +++ b/royalmix-global/supplychain_ai/ tracking_node.js audit_blockchain.js supplier_score_engine.js batch_verify.js/supplier_score_engine.js @@ -0,0 +1,8 @@ +export class SupplierScoreEngine { + score(supplier) { + let score = 100; + if (!supplier.on_time_delivery) score -= 25; + if (supplier.quality_issues) score -= 40; + return Math.max(0, score); + } +} diff --git a/royalmix-global/supplychain_ai/ tracking_node.js audit_blockchain.js supplier_score_engine.js batch_verify.js/tracking_node.js b/royalmix-global/supplychain_ai/ tracking_node.js audit_blockchain.js supplier_score_engine.js batch_verify.js/tracking_node.js new file mode 100644 index 00000000..6c631f78 --- /dev/null +++ b/royalmix-global/supplychain_ai/ tracking_node.js audit_blockchain.js supplier_score_engine.js batch_verify.js/tracking_node.js @@ -0,0 +1,9 @@ +export class TrackingNode { + registerEvent(orderId, status) { + return { + orderId, + status, + timestamp: Date.now() + }; + } +} diff --git a/royalmix-global/supplychain_ai/escrow_module.js b/royalmix-global/supplychain_ai/escrow_module.js new file mode 100644 index 00000000..bc16713c --- /dev/null +++ b/royalmix-global/supplychain_ai/escrow_module.js @@ -0,0 +1,8 @@ +export class EscrowModule { + hold(paymentId) { + return { status: "held", paymentId }; + } + release(paymentId) { + return { status: "released", paymentId }; + } +} diff --git a/royalmix-global/supplychain_ai/fraud_guard.js b/royalmix-global/supplychain_ai/fraud_guard.js new file mode 100644 index 00000000..44305474 --- /dev/null +++ b/royalmix-global/supplychain_ai/fraud_guard.js @@ -0,0 +1,7 @@ +export class FraudGuard { + evaluate(tx) { + return tx.ip_reputation === "clean" && + tx.sim_swap === false && + tx.geo_match === true; + } +} diff --git a/royalmix-global/supplychain_ai/settlement_engine.js b/royalmix-global/supplychain_ai/settlement_engine.js new file mode 100644 index 00000000..ee56c86e --- /dev/null +++ b/royalmix-global/supplychain_ai/settlement_engine.js @@ -0,0 +1,9 @@ +export class SettlementEngine { + distribute(funds) { + return { + supplier: funds * 0.70, + driver: funds * 0.20, + platform: funds * 0.10 + }; + } +} diff --git a/royalmix-global/ui_engine/ adaptive_layout.js theme_manager.js gesture_ai.js ui_personalization.js/adaptive_layout.js b/royalmix-global/ui_engine/ adaptive_layout.js theme_manager.js gesture_ai.js ui_personalization.js/adaptive_layout.js new file mode 100644 index 00000000..75bb0fae --- /dev/null +++ b/royalmix-global/ui_engine/ adaptive_layout.js theme_manager.js gesture_ai.js ui_personalization.js/adaptive_layout.js @@ -0,0 +1,9 @@ +export class AdaptiveLayout { + optimize(userContext) { + return { + fontScale: userContext.age > 45 ? 1.3 : 1.0, + buttonSize: userContext.device === "small" ? "large" : "normal", + layout: userContext.networkSpeed < 2 ? "lite" : "full" + }; + } +} diff --git a/royalmix-global/ui_engine/ adaptive_layout.js theme_manager.js gesture_ai.js ui_personalization.js/gesture_ai.js b/royalmix-global/ui_engine/ adaptive_layout.js theme_manager.js gesture_ai.js ui_personalization.js/gesture_ai.js new file mode 100644 index 00000000..ab56abac --- /dev/null +++ b/royalmix-global/ui_engine/ adaptive_layout.js theme_manager.js gesture_ai.js ui_personalization.js/gesture_ai.js @@ -0,0 +1,7 @@ +export class GestureAI { + analyze(gestureData) { + if (gestureData.speed < 0.2) return "increase-sensitivity"; + if (gestureData.swipeErrors > 4) return "enable-guided-mode"; + return "normal"; + } +} diff --git a/royalmix-global/ui_engine/ adaptive_layout.js theme_manager.js gesture_ai.js ui_personalization.js/theme_manager.js b/royalmix-global/ui_engine/ adaptive_layout.js theme_manager.js gesture_ai.js ui_personalization.js/theme_manager.js new file mode 100644 index 00000000..d1868cf4 --- /dev/null +++ b/royalmix-global/ui_engine/ adaptive_layout.js theme_manager.js gesture_ai.js ui_personalization.js/theme_manager.js @@ -0,0 +1,7 @@ +export class ThemeManager { + apply(context) { + if (context.battery < 15) return "ultra-lite"; + if (context.time >= 18) return "dark"; + return "default"; + } +} diff --git a/royalmix-global/ui_engine/ adaptive_layout.js theme_manager.js gesture_ai.js ui_personalization.js/ui_personalization.js b/royalmix-global/ui_engine/ adaptive_layout.js theme_manager.js gesture_ai.js ui_personalization.js/ui_personalization.js new file mode 100644 index 00000000..55aa75b5 --- /dev/null +++ b/royalmix-global/ui_engine/ adaptive_layout.js theme_manager.js gesture_ai.js ui_personalization.js/ui_personalization.js @@ -0,0 +1,5 @@ +export class UIPersonalization { + rankFeatures(history) { + return history.sort((a, b) => b.usage - a.usage) + } +} diff --git a/scoring.py b/scoring.py new file mode 100644 index 00000000..a9bcdfbd --- /dev/null +++ b/scoring.py @@ -0,0 +1,6 @@ +def score_content(metrics): + score = 0 + score += metrics["watch_time"] * 4 + score += metrics["likes"] * 2 + score += metrics["comments"] * 3 + return score diff --git a/script_generator.js b/script_generator.js new file mode 100644 index 00000000..e3b636ec --- /dev/null +++ b/script_generator.js @@ -0,0 +1,3 @@ +module.exports = function generateScript(topic) { + return `Today we explore ${topic} and how Royal Mix Global empowers Africa using AI + Pi Network integration.`; +}; diff --git a/security/cors.js b/security/cors.js new file mode 100644 index 00000000..86c3b065 --- /dev/null +++ b/security/cors.js @@ -0,0 +1,5 @@ +module.exports = { + origin: ["https://royal-mix-global.onrender.com"], + methods: ["GET", "POST"], + credentials: true, +}; diff --git a/security/sanitize.js b/security/sanitize.js new file mode 100644 index 00000000..7526885d --- /dev/null +++ b/security/sanitize.js @@ -0,0 +1,2 @@ +const mongoSanitize = require("express-mongo-sanitize"); +module.exports = mongoSanitize(); diff --git a/security/security/backend/security/mongo.js b/security/security/backend/security/mongo.js new file mode 100644 index 00000000..fca68ab1 --- /dev/null +++ b/security/security/backend/security/mongo.js @@ -0,0 +1,7 @@ +const mongoose = require("mongoose"); + +mongoose.connect(process.env.MONGO_URL, { + autoIndex: false, + family: 4, + serverSelectionTimeoutMS: 5000, +}); diff --git a/security/security/cors.js b/security/security/cors.js new file mode 100644 index 00000000..86c3b065 --- /dev/null +++ b/security/security/cors.js @@ -0,0 +1,5 @@ +module.exports = { + origin: ["https://royal-mix-global.onrender.com"], + methods: ["GET", "POST"], + credentials: true, +}; diff --git a/security/security/security/In reverse-proxy/Apply middleware in backend/Never commit .env b/security/security/security/In reverse-proxy/Apply middleware in backend/Never commit .env new file mode 100644 index 00000000..0b737bf5 --- /dev/null +++ b/security/security/security/In reverse-proxy/Apply middleware in backend/Never commit .env @@ -0,0 +1,3 @@ +.env +.env.local +.env.production diff --git a/security/security/security/In reverse-proxy/Apply middleware in backend/Required variables: b/security/security/security/In reverse-proxy/Apply middleware in backend/Required variables: new file mode 100644 index 00000000..8f0f0dac --- /dev/null +++ b/security/security/security/In reverse-proxy/Apply middleware in backend/Required variables: @@ -0,0 +1,5 @@ +PI_API_KEY= +PI_API_SECRET= +MONGO_URL= +SESSION_SECRET= +FRONTEND_URL=https://royal-mix-global.onrender.com diff --git a/security/security/security/In reverse-proxy/Apply middleware in backend/server.js: b/security/security/security/In reverse-proxy/Apply middleware in backend/server.js: new file mode 100644 index 00000000..b285055e --- /dev/null +++ b/security/security/security/In reverse-proxy/Apply middleware in backend/server.js: @@ -0,0 +1,12 @@ +const cors = require("./security/cors"); +const helmet = require("./security/helmet"); +const sanitize = require("./security/sanitize"); +const rateLimit = require("./security/rateLimit"); +const validateSignature = require("./security/validateSignature"); +const errorHandler = require("./security/errorHandler"); + +app.use(helmet); +app.use(sanitize); +app.use(rateLimit); +app.use(validateSignature); +app.use(errorHandler); diff --git a/security/security/security/In reverse-proxy/nginx.conf b/security/security/security/In reverse-proxy/nginx.conf new file mode 100644 index 00000000..e6e95e3f --- /dev/null +++ b/security/security/security/In reverse-proxy/nginx.conf @@ -0,0 +1,5 @@ +add_header X-Frame-Options "DENY"; +add_header X-Content-Type-Options "nosniff"; +add_header Referrer-Policy "no-referrer"; +add_header X-XSS-Protection "1; mode=block"; +client_max_body_size 5M; diff --git a/security/security/security/errorHandler.js b/security/security/security/errorHandler.js new file mode 100644 index 00000000..64c3827e --- /dev/null +++ b/security/security/security/errorHandler.js @@ -0,0 +1,4 @@ +module.exports = function (err, req, res, next) { + console.error("ERROR:", err.message); + res.status(500).json({ error: "Server error" }); +}; diff --git a/security/security/security/index.html b/security/security/security/index.html new file mode 100644 index 00000000..012f6afc --- /dev/null +++ b/security/security/security/index.html @@ -0,0 +1,2 @@ + diff --git a/security/security/security/rateLimit.js b/security/security/security/rateLimit.js new file mode 100644 index 00000000..74a85105 --- /dev/null +++ b/security/security/security/rateLimit.js @@ -0,0 +1,7 @@ +const rateLimit = require("express-rate-limit"); + +module.exports = rateLimit({ + windowMs: 1 * 60 * 1000, + max: 50, + message: "Too many requests — slow down!" +}); diff --git a/security/security/security/security/rateLimit.js b/security/security/security/security/rateLimit.js new file mode 100644 index 00000000..74a85105 --- /dev/null +++ b/security/security/security/security/rateLimit.js @@ -0,0 +1,7 @@ +const rateLimit = require("express-rate-limit"); + +module.exports = rateLimit({ + windowMs: 1 * 60 * 1000, + max: 50, + message: "Too many requests — slow down!" +}); diff --git a/security/security/security/security/security/helmet.js b/security/security/security/security/security/helmet.js new file mode 100644 index 00000000..a5b46bbd --- /dev/null +++ b/security/security/security/security/security/helmet.js @@ -0,0 +1,4 @@ +const helmet = require("helmet"); +module.exports = helmet({ + contentSecurityPolicy: false, +}); diff --git a/security/security/security/security/security/security/sanitize.js b/security/security/security/security/security/security/sanitize.js new file mode 100644 index 00000000..7526885d --- /dev/null +++ b/security/security/security/security/security/security/sanitize.js @@ -0,0 +1,2 @@ +const mongoSanitize = require("express-mongo-sanitize"); +module.exports = mongoSanitize(); diff --git a/security/security/validateSignature.js b/security/security/validateSignature.js new file mode 100644 index 00000000..680dfcbd --- /dev/null +++ b/security/security/validateSignature.js @@ -0,0 +1,17 @@ +const crypto = require("crypto"); + +module.exports = function validateSignature(req, res, next) { + const signature = req.headers["x-pi-signature"]; + const payload = JSON.stringify(req.body); + + const expected = crypto + .createHmac("sha256", process.env.PI_API_SECRET) + .update(payload) + .digest("hex"); + + if (signature !== expected) { + return res.status(403).json({ error: "Invalid signature" }); + } + + next(); +}; diff --git a/server/ai-intelligence/aiRoutes.js b/server/ai-intelligence/aiRoutes.js new file mode 100644 index 00000000..dcc95057 --- /dev/null +++ b/server/ai-intelligence/aiRoutes.js @@ -0,0 +1,9 @@ +const express = require("express"); +const router = express.Router(); +const ai = require("./aiController"); + +router.get("/economic-overview", ai.getEconomicOverview); +router.get("/fraud-detection", ai.detectFraud); +router.get("/sme-growth", ai.getSMEGrowth); + +module.exports = router; diff --git a/server/citizen-intelligence/citizenAIRoutes.js b/server/citizen-intelligence/citizenAIRoutes.js new file mode 100644 index 00000000..1ad854a6 --- /dev/null +++ b/server/citizen-intelligence/citizenAIRoutes.js @@ -0,0 +1,9 @@ +const express = require("express"); +const router = express.Router(); +const citizenAI = require("./citizenAIController"); + +router.get("/usage-stats", citizenAI.getCitizenUsageStats); +router.get("/service-demand", citizenAI.getServiceDemandMap); +router.get("/digital-inclusion", citizenAI.getDigitalInclusionReport); + +module.exports = router; diff --git a/server/config/env.template b/server/config/env.template new file mode 100644 index 00000000..c724a047 --- /dev/null +++ b/server/config/env.template @@ -0,0 +1,2 @@ +GOV_API_SECRET=change_this_to_secure_random_string +RISK_ALERT_THRESHOLD=60 diff --git a/server/integration/integrationRoutes.js b/server/integration/integrationRoutes.js new file mode 100644 index 00000000..23b65f79 --- /dev/null +++ b/server/integration/integrationRoutes.js @@ -0,0 +1,9 @@ +const express = require("express"); +const router = express.Router(); +const controller = require("./integrationController"); + +router.post("/sync-payment", controller.syncCitizenPayment); +router.post("/sync-business", controller.registerBusinessSync); +router.post("/sync-agent", controller.agentActivitySync); + +module.exports = router; diff --git a/server/middleware/verifyGovToken.js b/server/middleware/verifyGovToken.js new file mode 100644 index 00000000..63035a40 --- /dev/null +++ b/server/middleware/verifyGovToken.js @@ -0,0 +1,9 @@ +module.exports = function (req, res, next) { + const token = req.headers["x-gov-auth"]; + + if (!token || token !== process.env.GOV_API_SECRET) { + return res.status(403).json({ message: "Unauthorized Government Access" }); + } + + next(); +}; diff --git a/server/package.json b/server/package.json new file mode 100644 index 00000000..51e9dbd9 --- /dev/null +++ b/server/package.json @@ -0,0 +1,4 @@ +"main": "app.js", +"scripts": { + "start": "node app.js" +} diff --git a/server/routes/riskRoutes.js b/server/routes/riskRoutes.js new file mode 100644 index 00000000..59798344 --- /dev/null +++ b/server/routes/riskRoutes.js @@ -0,0 +1,11 @@ +const express = require("express"); +const router = express.Router(); + +router.get("/scan", (req, res) => { + res.json({ + riskLevel: "LOW", + message: "AI risk scan operational" + }); +}); + +module.exports = router; diff --git a/server/wallet-sync/walletRoutes.js b/server/wallet-sync/walletRoutes.js new file mode 100644 index 00000000..34046294 --- /dev/null +++ b/server/wallet-sync/walletRoutes.js @@ -0,0 +1,8 @@ +const express = require("express"); +const router = express.Router(); +const controller = require("./walletController"); + +router.post("/pi-payment", controller.syncPiPayment); +router.post("/transfer", controller.transferBetweenWallets); + +module.exports = router; diff --git "a/services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /api/stock/api/stock/api/stock/auto-reorder" "b/services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /api/stock/api/stock/api/stock/auto-reorder" new file mode 100644 index 00000000..7c2b61f4 --- /dev/null +++ "b/services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /api/stock/api/stock/api/stock/auto-reorder" @@ -0,0 +1,5 @@ +router.post("/auto-reorder", async (req, res) => { + const { productId } = req.body; + const result = await AutoReorderService.trigger(productId); + res.json(result); +}); diff --git "a/services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /api/stock/api/stock/update" "b/services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /api/stock/api/stock/update" new file mode 100644 index 00000000..76d12da1 --- /dev/null +++ "b/services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /api/stock/api/stock/update" @@ -0,0 +1,5 @@ +router.post("/update", async (req, res) => { + const { productId, quantity } = req.body; + const updated = await StockService.update(productId, quantity); + res.json(updated); +}); diff --git "a/services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /api/stock/get" "b/services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /api/stock/get" new file mode 100644 index 00000000..242be0a5 --- /dev/null +++ "b/services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /api/stock/get" @@ -0,0 +1,4 @@ +router.get("/get", async (req, res) => { + const data = await StockService.getAll(); + res.json(data); +}); diff --git "a/services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /stock \342\224\202 \342\224\202\342\224\200\342\224\200 getStock.js \342\224\202 \342\224\202\342\224\200\342\224\200 updateStock.js \342\224\202 \342\224\202\342\224\200\342\224\200 autoReorder.js" "b/services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /stock \342\224\202 \342\224\202\342\224\200\342\224\200 getStock.js \342\224\202 \342\224\202\342\224\200\342\224\200 updateStock.js \342\224\202 \342\224\202\342\224\200\342\224\200 autoReorder.js" new file mode 100644 index 00000000..eef51577 --- /dev/null +++ "b/services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /stock \342\224\202 \342\224\202\342\224\200\342\224\200 getStock.js \342\224\202 \342\224\202\342\224\200\342\224\200 updateStock.js \342\224\202 \342\224\202\342\224\200\342\224\200 autoReorder.js" @@ -0,0 +1 @@ +hash = SHA256(productId + oldQty + newQty + timestamp) diff --git "a/services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /stock \342\224\202 \342\224\202\342\224\200\342\224\200 getStock.js \342\224\202 \342\224\202\342\224\200\342\224\200 updateStock.js \342\224\202 \342\224\202\342\224\200\342\224\200 autoReorder.js" "b/services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /stock \342\224\202 \342\224\202\342\224\200\342\224\200 getStock.js \342\224\202 \342\224\202\342\224\200\342\224\200 updateStock.js \342\224\202 \342\224\202\342\224\200\342\224\200 autoReorder.js" new file mode 100644 index 00000000..34a83d4e --- /dev/null +++ "b/services \342\224\202\342\224\200\342\224\200 StockService.js \342\224\202\342\224\200\342\224\200 StockMonitor.js \342\224\202\342\224\200\342\224\200 AutoReorderService.js \342\224\202\342\224\200\342\224\200 PredictionEngine.js /controllers \342\224\202\342\224\200\342\224\200 stockController.js /models \342\224\202\342\224\200\342\224\200 Stock.js \342\224\202\342\224\200\342\224\200 Supplier.js \342\224\202\342\224\200\342\224\200 ReorderLog.js /api \342\224\202\342\224\200\342\224\200 /stock \342\224\202 \342\224\202\342\224\200\342\224\200 getStock.js \342\224\202 \342\224\202\342\224\200\342\224\200 updateStock.js \342\224\202 \342\224\202\342\224\200\342\224\200 autoReorder.js" @@ -0,0 +1,7 @@ +autoReorder(productId) { + if(stock < threshold) { + createSupplierOrder() + notifyAdmin() + lockHighRiskItems() + } +} diff --git a/settlement_engine.js b/settlement_engine.js new file mode 100644 index 00000000..ee56c86e --- /dev/null +++ b/settlement_engine.js @@ -0,0 +1,9 @@ +export class SettlementEngine { + distribute(funds) { + return { + supplier: funds * 0.70, + driver: funds * 0.20, + platform: funds * 0.10 + }; + } +} diff --git a/swap_engine.js b/swap_engine.js new file mode 100644 index 00000000..e8f0c265 --- /dev/null +++ b/swap_engine.js @@ -0,0 +1,5 @@ +export class SwapEngine { + swap(tokenA, tokenB, amount) { + return `${amount} ${tokenA} swapped into ${tokenB}`; + } +} diff --git a/theme_manager.js b/theme_manager.js new file mode 100644 index 00000000..d1868cf4 --- /dev/null +++ b/theme_manager.js @@ -0,0 +1,7 @@ +export class ThemeManager { + apply(context) { + if (context.battery < 15) return "ultra-lite"; + if (context.time >= 18) return "dark"; + return "default"; + } +} diff --git a/trend_detector.js b/trend_detector.js new file mode 100644 index 00000000..fd019657 --- /dev/null +++ b/trend_detector.js @@ -0,0 +1,6 @@ +module.exports = async function detectTrends() { + // Detects trending topics across platforms + return { + trends: ["Royal Mix Global", "Pi Network Africa", "AI Agents", "Crypto Utility"] + }; +}; diff --git a/ui_personalization.js b/ui_personalization.js new file mode 100644 index 00000000..55aa75b5 --- /dev/null +++ b/ui_personalization.js @@ -0,0 +1,5 @@ +export class UIPersonalization { + rankFeatures(history) { + return history.sort((a, b) => b.usage - a.usage) + } +} diff --git a/validation-key.txt b/validation-key.txt new file mode 100644 index 00000000..3801ec05 --- /dev/null +++ b/validation-key.txt @@ -0,0 +1 @@ +cefc3ac44cdbbea470881534ced3b575e61706a7310cd2a60fc242553d9a198c8588944b7df8352ac4806bb89f8584b86c439bd1fcbb1c789e154ce3cb3dc73f diff --git a/voice_processor.js b/voice_processor.js new file mode 100644 index 00000000..7f7e0bcd --- /dev/null +++ b/voice_processor.js @@ -0,0 +1,5 @@ +export class VoiceProcessor { + transcribe(audioBuffer) { + return "User said: Check my delivery"; + } +} diff --git a/yield_engine.js b/yield_engine.js new file mode 100644 index 00000000..3630183b --- /dev/null +++ b/yield_engine.js @@ -0,0 +1,5 @@ +export class YieldEngine { + calculate(amount, days) { + return (amount * days * 0.0005).toFixed(2); + } +}