diff --git a/.claude/mcp.json b/.claude/mcp.json index fb29c65..827418a 100644 --- a/.claude/mcp.json +++ b/.claude/mcp.json @@ -6,9 +6,9 @@ "args": [ "-y", "@modelcontextprotocol/server-filesystem", - "/Volumes/chitty" + "/Users/nb/Desktop/Projects/github.com/CHITTYAPPS/chittyfinance" ], - "description": "File system access for ChittyOS development volume" + "description": "File system access for the ChittyFinance repository" } } } diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 0000000..f237c84 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,31 @@ +name: CodeQL + +on: + pull_request: + branches: [main] + push: + branches: [main] + schedule: + - cron: "0 6 * * 1" + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + security-events: write + contents: read + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: javascript-typescript + + - name: Autobuild + uses: github/codeql-action/autobuild@v3 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/security-gates.yml b/.github/workflows/security-gates.yml new file mode 100644 index 0000000..8526194 --- /dev/null +++ b/.github/workflows/security-gates.yml @@ -0,0 +1,98 @@ +name: Security Gates + +on: + pull_request: + branches: [main] + push: + branches: [main, develop] + workflow_dispatch: + +concurrency: + group: security-gates-${{ github.ref }} + cancel-in-progress: true + +jobs: + workflow-secret-policy: + name: Workflow Secret Policy + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Enforce workflow secret policy + run: ./scripts/security/check-workflow-secrets.sh + + working-tree-secret-scan: + name: Working Tree Secret Scan + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Scan for high-risk secret patterns + shell: bash + run: | + set -euo pipefail + + if grep -RInE \ + --exclude-dir=.git \ + --exclude-dir=node_modules \ + --exclude-dir=dist \ + --exclude-dir=.wrangler \ + --exclude='*.png' \ + --exclude='*.jpg' \ + --exclude='*.jpeg' \ + --exclude='*.gif' \ + 'ghp_[A-Za-z0-9]{20,}|sk_live_[A-Za-z0-9]{20,}|AKIA[0-9A-Z]{16}|BEGIN (RSA|EC|OPENSSH|PGP)? ?PRIVATE KEY' .; then + echo "Secret-like pattern detected in working tree." + exit 1 + fi + + echo "Working tree secret scan passed." + + dependency-audit: + name: Dependency Audit (High+) + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 10 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'pnpm' + + - name: Resolve package root + id: pkg + run: | + set -euo pipefail + if [ -f package.json ]; then + echo "dir=." >> "$GITHUB_OUTPUT" + exit 0 + fi + if [ -f development/chittyschema/package.json ]; then + echo "dir=development/chittyschema" >> "$GITHUB_OUTPUT" + exit 0 + fi + echo "dir=" >> "$GITHUB_OUTPUT" + echo "No Node package root detected; skipping dependency audit." + + - name: Install dependencies + if: steps.pkg.outputs.dir != '' + run: | + set -euo pipefail + cd "${{ steps.pkg.outputs.dir }}" + pnpm install --frozen-lockfile + + - name: Enforce audit high threshold + if: steps.pkg.outputs.dir != '' + run: | + set -euo pipefail + cd "${{ steps.pkg.outputs.dir }}" + pnpm audit --prod --audit-level high diff --git a/.gitignore b/.gitignore index d86aa77..49835ad 100755 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,6 @@ dist .DS_Store server/public vite.config.ts.* -*.tar.gz # Environment files with secrets .env @@ -22,4 +21,23 @@ vite.config.ts.* *.db *.db-shm *.db-wal -migrations/ \ No newline at end of file +migrations/ + +# Chat agent (separate project, has its own node_modules) +chat-agent/ + +# Lockfile (using pnpm) +package-lock.json + +# Large binary/archive files +*.zip +*.tar.gz + +# Replit artifacts +.replit +replit.md +attached_assets/ +generated-icon.png + +# One-off patches and scripts +*.patch diff --git a/.replit b/.replit deleted file mode 100755 index ec98de9..0000000 --- a/.replit +++ /dev/null @@ -1,43 +0,0 @@ -modules = ["nodejs-20", "web", "postgresql-16"] -run = "npm run dev" -hidden = [".config", ".git", "generated-icon.png", "node_modules", "dist"] - -[nix] -channel = "stable-24_05" -packages = ["jq", "gh"] - -[deployment] -deploymentTarget = "autoscale" -build = ["npm", "run", "build"] -run = ["npm", "run", "start"] - -[[ports]] -localPort = 5000 -externalPort = 80 - -[workflows] -runButton = "Project" - -[[workflows.workflow]] -name = "Project" -mode = "parallel" -author = "agent" - -[[workflows.workflow.tasks]] -task = "workflow.run" -args = "Start application" - -[[workflows.workflow]] -name = "Start application" -author = "agent" - -[workflows.workflow.metadata] -agentRequireRestartOnSave = false - -[[workflows.workflow.tasks]] -task = "packager.installForAll" - -[[workflows.workflow.tasks]] -task = "shell.exec" -args = "npm run dev" -waitForPort = 5000 diff --git a/AGENTS.md b/AGENTS.md deleted file mode 100755 index fbc12ac..0000000 --- a/AGENTS.md +++ /dev/null @@ -1,42 +0,0 @@ -# Repository Guidelines - -## Project Structure & Module Organization -- `client/` — React + Vite app (entry `client/index.html`; source in `client/src/{pages,components,hooks,lib}`). -- `server/` — Express API and dev glue: `server/index.ts`, `routes.ts`, `lib/*`, `storage.ts`, `db.ts`, `vite.ts`. Serves API + client on `:5000`. -- `shared/` — Drizzle ORM schema and shared types (`shared/schema.ts`). -- `public/` — Built static assets (Vite outputs to `dist/public`). -- Config roots: `vite.config.ts` (aliases `@`, `@shared`, `@assets`), `tailwind.config.ts`, `tsconfig.json`, `.env.example`. - -## Build, Test, and Development Commands -- `pnpm install` — Install dependencies. -- `pnpm dev` — Auto-detect mode; runs API + client on `:5000`. -- `pnpm dev:standalone` / `pnpm dev:system` — Force mode selection. -- `pnpm build` — Build both modes to `dist/standalone` and `dist/system`; client assets to `dist/public`. -- `pnpm deploy:standalone` — Run prod standalone: `node dist/standalone/index.js`. -- `pnpm deploy:system` — Deploy system mode to Cloudflare Workers. -- `pnpm check` — TypeScript type check. -- `pnpm db:push` — Push Drizzle schema to DB. - -## Coding Style & Naming Conventions -- TypeScript + ESM; 2‑space indent. Prefer pure functions and early returns. -- Path aliases: `@/` (client), `@shared/`, `@assets/`. -- Components/pages: PascalCase (e.g., `UserMenu.tsx`). Utilities/hooks: kebab‑case or camelCase (e.g., `use-auth.ts`, `formatDate.ts`). -- Colocate modules near usage; keep files small and focused. - -## Testing Guidelines -- Default validation via UI and REST endpoints. -- If adding tests, use Vitest + React Testing Library. -- Name tests `*.test.ts`/`*.test.tsx`, colocated with modules. -- Commands: `pnpm test` (watch), `pnpm test:run` (CI), `pnpm test:ui` (UI). -- Target routes, hooks, and core components. - -## Commit & Pull Request Guidelines -- Commits: imperative, scoped (e.g., `server: add session route`, `chore: bump deps`). -- PRs: small and focused; include summary, rationale, and screenshots for UI changes. -- Link related issues. Call out env/DB changes and run `pnpm db:push` when schema updates. - -## Security & Configuration Tips -- Copy `.env.example` to `.env`; set `DATABASE_URL`, `OPENAI_API_KEY`, etc. Never commit secrets. -- Use `server/storage.ts` for all data access; validate inputs in `server/routes.ts`. -- Avoid leaking stack traces in responses. - diff --git a/ALEXIS_CORRECTED_STATEMENT.txt b/ALEXIS_CORRECTED_STATEMENT.txt deleted file mode 100755 index 29a52a3..0000000 --- a/ALEXIS_CORRECTED_STATEMENT.txt +++ /dev/null @@ -1,151 +0,0 @@ -TENANT STATEMENT - CORRECTED -==================================================================================================== - -TENANT: Alexis Pheng -EMAIL: acpheng@gmail.com -PHONE: 804-665-8632 -PROPERTY: City Studio at The Commodore -ADDRESS: 550 W Surf St C211, Chicago, IL 60657 -LEASE ID: 690e47b7d84b610e20287ca2 -LEASE TERM: November 8, 2025 → December 15, 2026 -MONTHLY RENT: $2,650.00 -STATEMENT DATE: December 9, 2025 - -==================================================================================================== - -CHARGES POSTED: - -Date Description Charge Paid Balance Status ----------------------------------------------------------------------------------------------------- -Nov 6, 2025 Pro-Rated Rent (Nov 8-30) $2,031.67 $2,031.67 $0.00 PAID ✅ -Nov 6, 2025 Cleaning Fee $250.00 $250.00 $0.00 PAID ✅ -Nov 6, 2025 Administration Fee $250.00 $250.00 $0.00 PAID ✅ -Nov 6, 2025 Move-In Fee $250.00 $250.00 $0.00 PAID ✅ -Nov 6, 2025 Management Fee (WAIVED) $250.00 $250.00 $0.00 CREDIT - --------------------------------------------------------------------------------- - November 2025 Total: $3,031.67 $3,031.67 $0.00 PAID ✅ - -Dec 1, 2025 Prorated Rent (Dec 1-15) $1,282.26 $0.00 $1,282.26 DUE ❌ - --------------------------------------------------------------------------------- - December 2025 Total: $1,282.26 $0.00 $1,282.26 DUE ❌ - ----------------------------------------------------------------------------------------------------- -TOTAL CHARGES: $4,313.93 -TOTAL PAID: -$3,031.67 -TOTAL CREDITS: -$250.00 (Management fee waived) -==================================================================================================== -CURRENT BALANCE DUE: $1,282.26 -==================================================================================================== - -⚠️ PAYMENT OVERDUE - -Outstanding Charge: - • December 1-15, 2025 Prorated Rent: $1,282.26 ❌ - • Charge Posted: December 1, 2025 - • Days Overdue: 8 days (as of December 9, 2025) - -==================================================================================================== - -PAYMENT HISTORY: - -Date Method/Reference Applied To Amount ----------------------------------------------------------------------------------------------------- -Nov 6, 2025 EPAY (Ref: 2g3gah) November move-in charges $2,781.67 -Nov 6, 2025 Credit Applied Management Fee Waived $250.00 - --------------------------------------------------------------------------------- - Total Payments: $3,031.67 - -December 2025: NO PAYMENTS RECEIVED ❌ - -==================================================================================================== - -DETAILED TRANSACTION TIMELINE: - -Nov 6, 2025 CHARGE Pro-Rated Rent (Nov 8-30) $2,031.67 Balance: $2,031.67 -Nov 6, 2025 CHARGE Cleaning Fee $250.00 Balance: $2,281.67 -Nov 6, 2025 CHARGE Administration Fee $250.00 Balance: $2,531.67 -Nov 6, 2025 CHARGE Move-In Fee $250.00 Balance: $2,781.67 -Nov 6, 2025 PAYMENT EPAY (Ref: 2g3gah) -$2,781.67 Balance: $0.00 ✅ -Nov 6, 2025 CREDIT Management Fee Waived -$250.00 Balance: $0.00 ✅ -Nov 7, 2025 NOTICE Payment confirmation email sent -Dec 1, 2025 CHARGE Prorated Rent (Dec 1-15) $1,282.26 Balance: $1,282.26 -Dec 1, 2025 NOTICE "Final Day to Pay Rent" reminder sent -Dec 3, 2025 NOTICE "Rent Payment Overdue" notice sent -Dec 4, 2025 NOTICE "Rent Payment Overdue" notice sent -Dec 5, 2025 NOTICE "Rent Payment Overdue" notice sent -Dec 6, 2025 NOTICE "Rent Payment Overdue" notice sent -Dec 7, 2025 NOTICE "Rent Payment Overdue" notice sent -Dec 8, 2025 NOTICE "Rent Payment Overdue" notice sent -Dec 9, 2025 NOTICE "Rent Payment Overdue" notice sent - --------------------------------------------------------------------------------- -Dec 9, 2025 CURRENT BALANCE: $1,282.26 ❌ - -==================================================================================================== - -ACCOUNT ANALYSIS: - -✅ November 2025: All charges paid in full on November 6, 2025 - - Move-in charges: $2,781.67 - - Credits applied: $250.00 (management fee waived) - - Total paid: $3,031.67 - -❌ December 2025: Outstanding balance - - Charge posted: $1,282.26 (prorated for Dec 1-15) - - Payments received: $0.00 - - Balance due: $1,282.26 - - Status: OVERDUE (8 days past due as of Dec 9) - -==================================================================================================== - -LEASE NOTES: - -• Lease started November 8, 2025 (mid-month move-in) -• November rent was prorated for November 8-30 (23 days) -• December rent is prorated for December 1-15 (15 days) -• Full monthly rent of $2,650 will begin December 16, 2025 -• Tenant has been compliant with all previous payments -• Renters insurance required but not yet provided (see separate notice) - -==================================================================================================== - -NEXT CHARGE DUE: - -Dec 16, 2025 Full Monthly Rent (Dec 16-31) $1,367.74 (estimated) - (16 days at $2,650/month daily rate) - -Jan 1, 2026 Full Monthly Rent (January 2026) $2,650.00 - -==================================================================================================== - -CONTACT INFORMATION: - -Tenant: Property Manager: -Alexis Pheng Chicago Furnished Condos by ARIBIA -acpheng@gmail.com [Property manager contact] -804-665-8632 [Property manager phone] - -==================================================================================================== - -PAYMENT INSTRUCTIONS: - -To make a payment: -1. Log in to tenant portal at [portal URL] -2. Use EPAY for instant processing -3. Reference: Lease 690e47b7d84b610e20287ca2 - -For questions about this statement, please contact property management. - -==================================================================================================== - -STATEMENT NOTES: - -This statement is generated from DoorLoop property management system data as of December 9, 2025. -All amounts are in USD. Late fees may apply per lease agreement and Chicago RLTO guidelines. - -Data Source: DoorLoop API Complete Archive (doorloop-complete-archive-2025-12-09.json) -Generated: December 9, 2025 -Statement Period: November 2025 - December 2025 - -==================================================================================================== -END OF STATEMENT -==================================================================================================== diff --git a/ALEXIS_DECEMBER_2025_PAYMENT_STATUS.md b/ALEXIS_DECEMBER_2025_PAYMENT_STATUS.md deleted file mode 100755 index ff88c2e..0000000 --- a/ALEXIS_DECEMBER_2025_PAYMENT_STATUS.md +++ /dev/null @@ -1,221 +0,0 @@ -# Alexis Pheng - December 2025 Payment Status Report - -**Generated:** 2025-12-09 -**Property:** City Studio at The Commodore (550 W Surf St C211, Chicago IL) -**Lease ID:** 690e47b7d84b610e20287ca2 - ---- - -## EXECUTIVE SUMMARY - -**STATUS: PAYMENT NOT RECEIVED ❌** - -- **December 2025 Charge:** $1,282.26 (prorated Dec 1-15) -- **Amount Paid:** $0.00 -- **Balance Due:** $1,282.26 -- **Days Overdue:** 9 days (as of Dec 9, 2025) -- **Lease Status:** PAST_DUE - ---- - -## TENANT INFORMATION - -**Name:** Alexis Pheng -**Email:** acpheng@gmail.com -**Phone:** 804-665-8632 -**DoorLoop Tenant ID:** 690e49e5d84b610e202cdb02 -**Stripe Customer ID:** cus_TNKaJIL1Bg1A3y (from different Stripe account - not accessible) - ---- - -## LEASE DETAILS - -**Property:** City Studio Chicago -**Address:** 550 W Surf St, Unit C211, Chicago, IL -**Unit ID:** 66d7aad33cf0357c2a3c9440 -**Property ID:** 66d7aad23cf0357c2a3c9430 - -**Lease Term:** -- Start Date: November 8, 2025 -- End Date: December 15, 2026 -- Term Type: Fixed -- Lease Reference: 7ghada - -**Rent:** -- Base Monthly Rent: $2,650/month -- Frequency: Monthly on the 1st -- Prorated December 2025: $1,282.26 (Dec 1-15 only) - -**Requirements:** -- Renters Insurance: Required -- Current Status: NO_INSURANCE ⚠️ - ---- - -## FINANCIAL HISTORY - -### November 2025 (Move-In) ✅ PAID IN FULL - -**Charges Posted Nov 7, 2025:** -1. Pro-rated Rent (Nov 8-30): $2,031.67 ✅ PAID -2. Move-In Fee: $250.00 ✅ PAID -3. Administration Fee: $250.00 ✅ PAID -4. Cleaning Fee: $250.00 ✅ PAID - -**Credit Applied:** -- Management Fee Waived: -$250.00 - -**Total Charged:** $2,781.67 -**Total Paid:** $2,531.67 (after $250 credit) -**Payment Date:** November 6-7, 2025 -**Payment Method:** EPAY (electronic payment) - -### December 2025 (Current) ❌ UNPAID - -**Charge Posted Nov 7, 2025:** -- Prorated Rent (Dec 1-15): $1,282.26 -- Charge Date: December 1, 2025 -- Charge ID: 690e47b8d84b610e20288103 -- Reference: fba719 - -**Payment Status:** -- Amount Due: $1,282.26 -- Amount Paid: $0.00 -- Balance Remaining: $1,282.26 -- Status: OVERDUE - -**No payments recorded for December 2025** - ---- - -## COLLECTION ACTIVITY - -### Automated Overdue Notices Sent: - -Daily "Rent Payment Is Overdue" emails sent from **Dec 3 - Dec 9, 2025:** - -1. Dec 9, 2025 - 2 emails sent (7:29 PM) -2. Dec 8, 2025 - 2 emails sent (7:25 PM, 7:26 PM) -3. Dec 7, 2025 - 2 emails sent (7:43 PM) -4. Dec 6, 2025 - 2 emails sent (7:41 PM) -5. Dec 5, 2025 - 2 emails sent (8:24 PM) -6. Dec 4, 2025 - 2 emails sent (6:28 PM) -7. Dec 3, 2025 - 2 emails sent (6:20 PM) - -### Pre-Due Date Reminders: - -1. Dec 1, 2025 - "Reminder: Final Day to Pay Rent" (2 emails at 10:52 PM) - ---- - -## RENT ROLL STATUS (as of Dec 9, 2025) - -From DoorLoop Rent Roll Report: - -```json -{ - "leaseName": "Alexis Pheng", - "unitName": "City Studio Chicago", - "leaseStatus": "PAST_DUE", - "totalBalanceDue": 1282.26, - "overdueBalance": 1282.26, - "currentBalance": 0, - "upcomingBalance": 0, - "totalRecurringRent": 2650, - "lastPaymentDate": "2025-11-07", - "lastPaymentAmount": 2531.67, - "occupied": true, - "active": true -} -``` - -**Key Indicators:** -- ✅ Lease is ACTIVE -- ✅ Unit is OCCUPIED -- ❌ Status: PAST_DUE -- ❌ Overdue Balance: $1,282.26 -- ⚠️ No Renters Insurance on file - ---- - -## PAYMENT METHODS AVAILABLE - -Based on November payment: -- **EPAY** (Electronic Payment) - previously used successfully -- Tenant portal access confirmed (portal setup email sent Nov 7, 2025) - ---- - -## RECOMMENDED ACTIONS - -### Immediate (High Priority): -1. **Personal Outreach:** Direct phone call to 804-665-8632 -2. **Payment Reminder:** Confirm tenant received overdue notices -3. **Payment Arrangement:** Offer payment plan if needed -4. **Insurance Follow-Up:** Renters insurance required but not provided - -### Short-term (Within 7 days): -1. **Late Fee Assessment:** Review Chicago RLTO late fee guidelines -2. **Document Status:** Log all communication attempts -3. **Escalation Plan:** Prepare next steps if payment not received by Dec 16 - -### Administrative: -1. **Insurance Compliance:** Follow up on missing renters insurance -2. **Portal Access:** Verify tenant can access payment portal -3. **Payment Method:** Confirm EPAY is still configured correctly - ---- - -## CHICAGO RLTO COMPLIANCE NOTES - -Per Chicago Residential Landlord Tenant Ordinance: - -**Late Fee Structure (from other DoorLoop records):** -- First $500 of rent: $10 flat fee -- Remaining amount: 5% of remainder -- For $1,282.26: $10 + ($782.26 × 0.05) = $49.11 maximum late fee - -**Grace Period:** -- 5 days after due date before late fees can be assessed -- Late fee eligible date: December 6, 2025 (passed) - -**Notice Requirements:** -- Written notice required before eviction proceedings -- Good faith negotiation period recommended - ---- - -## DATA SOURCES - -All data verified from multiple DoorLoop API endpoints: - -1. `/leases/{id}` - Lease details and status -2. `/lease-charges` - Posted charges and balances -3. `/lease-payments` - Payment history -4. `/lease-credits` - Credits applied -5. `/communications` - Email notifications sent -6. `/reports/rent-roll` - Current rent roll status -7. `/tenants` - Tenant contact information - -**Archive Files Created:** -- `doorloop-final-archive-2025-12-09.json` - Complete data backup -- `doorloop-communications-2025-12-09.json` - All communications -- `doorloop-reports-2025-12-09.json` - Rent roll and reports - ---- - -## CONCLUSION - -**Alexis Pheng has NOT made the December 2025 rent payment of $1,282.26.** - -The charge was posted on time (Nov 7 for Dec 1 due date), automated reminders have been sent daily since Dec 3, and the lease is now showing PAST_DUE status in the rent roll. - -**Last successful payment:** November 7, 2025 ($2,531.67 for November move-in) -**Current overdue amount:** $1,282.26 (9 days past due as of Dec 9, 2025) -**Recommended action:** Direct personal contact to resolve payment - ---- - -**Report prepared by:** ChittyFinance Data Analysis -**Date:** December 9, 2025 -**Next Review:** December 16, 2025 (if unresolved) diff --git a/ALEXIS_PAYMENT_STATUS_REPORT.md b/ALEXIS_PAYMENT_STATUS_REPORT.md deleted file mode 100755 index a7ffdac..0000000 --- a/ALEXIS_PAYMENT_STATUS_REPORT.md +++ /dev/null @@ -1,246 +0,0 @@ -# Alexis Pheng - December 2025 Rent Payment Status Report - -**Report Date:** December 9, 2025 -**Property:** City Studio at The Commodore -**Address:** 550 W Surf St C211, Chicago, IL -**Lease ID:** 690e47b7d84b610e20287ca2 - ---- - -## 🎯 EXECUTIVE SUMMARY - -**STATUS: RENT PAYMENT OVERDUE** - -Alexis Pheng has **NOT paid** the December 2025 rent charge of $1,282.26 (prorated for December 1-15, 2025). The payment is currently overdue, with automated notices being sent daily since December 3, 2025. - ---- - -## 📋 TENANT INFORMATION - -- **Name:** Alexis Pheng -- **Email:** acpheng@gmail.com -- **Phone:** 804-665-8632 -- **Tenant ID:** 690e49e5d84b610e202cdb02 -- **DoorLoop Stripe Customer ID:** cus_TNKaJIL1Bg1A3y (different Stripe account) - ---- - -## 🏠 LEASE DETAILS - -- **Lease ID:** 690e47b7d84b610e20287ca2 -- **Property:** City Studio at The Commodore (66d7aad23cf0357c2a3c9430) -- **Unit ID:** 66d7aad33cf0357c2a3c9440 -- **Address:** 550 W Surf St C211, Chicago, IL 60657 -- **Lease Term:** November 8, 2025 → December 15, 2026 -- **Status:** ACTIVE -- **Monthly Rent:** $2,650.00 -- **Lease Type:** Fixed-term, 13-month lease - ---- - -## 💰 DECEMBER 2025 RENT CHARGE - -**Charge Posted:** December 1, 2025 - -| Field | Value | -|-------|-------| -| **Charge ID** | 690e47b8d84b610e20288103 | -| **Date** | 2025-12-01 | -| **Amount** | $1,282.26 | -| **Description** | Prorated Rent December 1-15 | -| **Account** | 69023fde977b09efc7ca865e | -| **Total Balance** | $1,282.26 | -| **Status** | **UNPAID** ❌ | - -**Note:** This is a prorated charge covering December 1-15, 2025. The lease started November 8, 2025, so this represents half of the monthly rent for December. - ---- - -## 💸 CURRENT FINANCIAL STATUS - -From DoorLoop lease details (retrieved December 9, 2025): - -```json -{ - "totalBalanceDue": 1282.26, - "outstandingBalance": 1282.26, - "currentBalance": 0, - "overdueBalance": 1282.26, - "upcomingBalance": 0 -} -``` - -**Balance Due:** $1,282.26 (OVERDUE) - ---- - -## 📧 AUTOMATED COLLECTION NOTICES - -DoorLoop has sent automated overdue notices on the following dates: - -- **December 3, 2025** - "Attention: Your Rent Payment Is Overdue" (2 emails) -- **December 4, 2025** - "Attention: Your Rent Payment Is Overdue" (2 emails) -- **December 5, 2025** - "Attention: Your Rent Payment Is Overdue" (2 emails) -- **December 6, 2025** - "Attention: Your Rent Payment Is Overdue" (2 emails) -- **December 7, 2025** - "Attention: Your Rent Payment Is Overdue" (2 emails) -- **December 8, 2025** - "Attention: Your Rent Payment Is Overdue" (2 emails) -- **December 9, 2025** - "Attention: Your Rent Payment Is Overdue" (2 emails) - -**Total:** 14 overdue notices sent over 7 days - -Additional notices sent: -- **December 1, 2025** - "Reminder: Final Day to Pay Rent" (2 emails) - ---- - -## 📊 PAYMENT HISTORY - -### November 2025 Payments (PAID ✅) - -**Payment Date:** November 6, 2025 - -| Charge | Amount | Status | -|--------|--------|--------| -| Pro-rated Rent (Nov 8-30) | $2,031.67 | PAID ✅ | -| Cleaning Fee | $250.00 | PAID ✅ | -| Administration Fee | $250.00 | PAID ✅ | -| Move-In Fee | $250.00 | PAID ✅ | -| **TOTAL** | **$2,781.67** | **PAID ✅** | - -**Credits Applied:** -- Management Fee Waived: $250.00 (Nov 6, 2025) - -**Payment Method:** EPAY (Electronic Payment) -**Payment Reference:** 2g3gah - -**Last Payment Confirmation Email:** November 7, 2025 - "Thank you for your payment! View your receipt" - -### December 2025 Payments - -**❌ NO PAYMENTS RECEIVED** - -DoorLoop lease-payments endpoint confirms **zero payments** posted in December 2025. - ---- - -## 🔍 VERIFICATION METHODS - -This status has been verified through multiple DoorLoop API endpoints: - -1. **`/lease-charges`** - Shows charge posted with full balance remaining -2. **`/lease-payments`** - Shows no payments in December 2025 -3. **`/leases/{id}`** - Shows `overdueBalance: 1282.26` -4. **`/communications`** - Shows daily overdue notices since Dec 3 -5. **`/lease-credits`** - Shows no credits applied to December charge -6. **`/lease-reversed-payments`** - Shows no reversed/refunded payments - -All six independent data sources confirm the same status: **UNPAID**. - ---- - -## ⚠️ ADDITIONAL NOTES - -### Renters Insurance Non-Compliance - -DoorLoop lease details show: -```json -{ - "proofOfInsuranceRequired": true, - "proofOfInsuranceStatus": "NO_INSURANCE" -} -``` - -**Status:** Alexis is required to maintain renters insurance but has not provided proof of coverage. - -### Previous Insurance Violations - -Historical charges show fines for missing renters insurance for a different property: -- August 17, 2025: $100 fine - "No valid renters insurance – Aug 10-16, 2025" -- August 3, 2025: $100 fine - "No valid renters insurance – July 27-Aug 2, 2025" - -(Note: These appear to be for a different tenant with a different lease at a different property) - ---- - -## 📁 ARCHIVED DATA - -Complete DoorLoop data has been archived before API access expires: - -### Archives Created (December 9, 2025): - -1. **doorloop-archive-2025-12-09.json** - - 6 properties - - 16 leases (6 active, 10 inactive) - - 50 tenants - - 8 units - - 5 expenses - -2. **doorloop-communications-2025-12-09.json** - - 50 communications - - 6 communications related to Alexis - -3. **doorloop-final-archive-2025-12-09.json** - - Rent roll (8 records) - - Notes (4 records) - - Files (50 records) - - Complete Alexis lease and payment data - - Financial reports (unavailable - premium API access required) - -### Archive Summary - -**Total Records Archived:** 351+ records across 12+ accessible DoorLoop endpoints - -**Inaccessible Endpoints:** 53 endpoints returned errors (404, 405, or require premium access) - ---- - -## 🎯 RECOMMENDED ACTIONS - -1. **Immediate:** Contact Alexis Pheng directly via phone (804-665-8632) or email (acpheng@gmail.com) - -2. **Follow-up:** Request payment of $1,282.26 for December 1-15, 2025 prorated rent - -3. **Insurance Compliance:** Request proof of renters insurance (currently non-compliant) - -4. **Payment Plan:** If tenant is experiencing financial hardship, consider payment plan options - -5. **Late Fees:** Review Chicago RLTO late fee guidelines before assessing additional charges - - Standard: $10 for first $500 + 5% of remainder - - For $1,282.26: Late fee would be $10 + $39.11 = $49.11 - -6. **Documentation:** All collection communications should reference: - - Charge ID: 690e47b8d84b610e20288103 - - Amount: $1,282.26 - - Period: December 1-15, 2025 - - Due Date: December 1, 2025 - ---- - -## 📞 CONTACT INFORMATION - -**Property Manager:** Chicago Furnished Condos by ARIBIA -**Property Address:** 550 W Surf St C211, Chicago, IL 60657 -**Tenant:** Alexis Pheng -**Tenant Email:** acpheng@gmail.com -**Tenant Phone:** 804-665-8632 - ---- - -## ✅ REPORT VERIFICATION - -This report is based on live DoorLoop API data retrieved on December 9, 2025 at 8:08 PM CST. - -**Verified By:** -- DoorLoop API endpoints (6 independent sources) -- Communication logs (automated notices) -- Lease charge records -- Payment history records -- Lease status records - -**Report Status:** VERIFIED ✅ - -**Last Updated:** December 9, 2025 - ---- - -*End of Report* diff --git a/ALEXIS_RENT_REMINDER_EMAIL.md b/ALEXIS_RENT_REMINDER_EMAIL.md deleted file mode 100755 index 236ca71..0000000 --- a/ALEXIS_RENT_REMINDER_EMAIL.md +++ /dev/null @@ -1,134 +0,0 @@ -# Email to Alexis Pheng - December Rent Reminder - ---- - -**To:** acpheng@gmail.com -**From:** [Property Manager Email] -**CC:** [Optional: Management team] -**Subject:** Action Required: December Rent Payment - City Studio at The Commodore -**Priority:** High - ---- - -## EMAIL BODY: - -Dear Alexis, - -I hope this message finds you well. - -I'm reaching out regarding your December rent payment for City Studio at The Commodore (550 W Surf St C211). Our records show that the December 1-15 prorated rent payment of **$1,282.26** has not yet been received, and is now **8 days past due** as of December 9, 2025. - -### Payment Details: - -- **Amount Due:** $1,282.26 -- **Billing Period:** December 1-15, 2025 (prorated) -- **Original Due Date:** December 1, 2025 -- **Current Status:** 8 days overdue -- **Property:** City Studio at The Commodore, 550 W Surf St C211 - -### Your Account Status: - -We want to acknowledge that your November payment was received on time and in full ($2,781.67 paid November 6, 2025). We appreciate your prompt payment last month, which is why we wanted to reach out personally regarding this month's outstanding balance. - -### How to Pay: - -**Option 1: Tenant Portal (Recommended - Instant Processing)** -- Log in to your tenant portal at [portal URL] -- Navigate to "Make a Payment" -- Use EPAY for immediate processing -- Reference: Lease 690e47b7d84b610e20287ca2 - -**Option 2: Other Payment Methods** -- [List any other accepted payment methods] -- [Bank transfer information if applicable] - -### Important Information: - -**Late Fees:** Please be advised that late fees may apply per your lease agreement and Chicago Residential Landlord and Tenant Ordinance (RLTO) guidelines. Under Chicago RLTO, the late fee for this amount would be $49.11 ($10 for the first $500 + 5% of the remaining $782.26). - -**Renters Insurance:** We also noticed that proof of renters insurance has not been provided as required by your lease agreement. Please submit proof of active coverage at your earliest convenience to avoid additional monthly charges. - -### Next Steps: - -Please remit payment of $1,282.26 **by December 12, 2025** to avoid additional late fees and ensure your account remains in good standing. - -If you're experiencing financial difficulty or have questions about your account, please contact me directly at [phone number] or reply to this email. We're here to work with you and discuss payment plan options if needed. - -### Upcoming Rent Schedule: - -Just as a reminder, your full monthly rent of $2,650.00 will begin on **December 16, 2025**, covering the period from December 16 through the end of the month. January 2026 and forward will be billed at the full monthly rate of $2,650.00. - -### Contact Information: - -If you have any questions or concerns, please don't hesitate to reach out: - -- **Phone:** [Property Manager Phone] -- **Email:** [Property Manager Email] -- **Office Hours:** [Business Hours] - -We value you as a tenant and look forward to resolving this matter promptly. - -Thank you for your immediate attention to this matter. - -Best regards, - -**[Property Manager Name]** -Chicago Furnished Condos by ARIBIA -[Phone Number] -[Email Address] - ---- - -### ATTACHMENTS: -- Tenant_Statement_Alexis_Pheng_Dec_2025.pdf -- Payment_Instructions.pdf - ---- - -## ALTERNATIVE SHORTER VERSION (If preferred): - ---- - -**Subject:** Reminder: Outstanding Rent Payment - $1,282.26 Due - -Dear Alexis, - -I'm writing to remind you that your December 1-15 prorated rent payment of **$1,282.26** is now 8 days past due. - -**Please submit payment immediately via:** -- Tenant portal (EPAY - instant processing) -- [Other payment methods] - -**Account Summary:** -- Amount Due: $1,282.26 -- Due Date: December 1, 2025 -- Late Fee (if applicable): $49.11 - -We appreciate your prompt November payment and want to help resolve this quickly. If you're experiencing difficulty, please contact me to discuss options. - -**Next rent ($2,650) due:** December 16, 2025 - -Please contact me with any questions: -[Phone] | [Email] - -Best regards, -**[Name]** -Chicago Furnished Condos by ARIBIA - ---- - -## EMAIL SENDING NOTES: - -**Timing:** Send during business hours (9 AM - 5 PM) -**Follow-up:** If no response in 48 hours, follow up by phone -**Tone:** Professional but understanding (first missed payment) -**Documentation:** Save copy to tenant file and DoorLoop -**Legal:** Ensure compliance with Chicago RLTO notice requirements - ---- - -## RECOMMENDED PHONE SCRIPT (If calling): - -"Hi Alexis, this is [Name] from Chicago Furnished Condos. I'm calling about your December rent payment of $1,282.26 that was due on December 1st. I wanted to reach out personally to see if there's anything I can help with or if you had any questions about the payment. We received your November payment on time, so I wanted to make sure everything is okay. Can you let me know when you'll be able to submit the December payment?" - ---- diff --git a/ALEXIS_TENANT_STATEMENT.txt b/ALEXIS_TENANT_STATEMENT.txt deleted file mode 100755 index e2e6a3c..0000000 --- a/ALEXIS_TENANT_STATEMENT.txt +++ /dev/null @@ -1,89 +0,0 @@ -TENANT STATEMENT -==================================================================================================== - -TENANT: Alexis Pheng -EMAIL: acpheng@gmail.com -PHONE: 804-665-8632 -PROPERTY: City Studio at The Commodore -ADDRESS: 550 W Surf St C211, Chicago, IL 60657 -LEASE ID: 690e47b7d84b610e20287ca2 -STATEMENT DATE: December 9, 2025 - -==================================================================================================== - -CHARGES: - -Date Description Amount Balance Status ----------------------------------------------------------------------------------------------------- -11/30/2025 Prorated Rent December 1-15 $1282.26 $1282.26 DUE ❌ -11/6/2025 Pro-Rated Rent - November 8-30 $2031.67 $0.00 PAID ✅ -11/6/2025 Cleaning $250.00 $0.00 PAID ✅ -11/6/2025 Administration Fee $250.00 $0.00 PAID ✅ -11/6/2025 Move-In $250.00 $0.00 PAID ✅ ----------------------------------------------------------------------------------------------------- -TOTAL CHARGES: $4063.93 - - -PAYMENTS: - -Date Method Reference Amount Status ----------------------------------------------------------------------------------------------------- -11/6/2025 N/A b9j67d $0.00 Completed -11/6/2025 EPAY 2g3gah $0.00 Completed ----------------------------------------------------------------------------------------------------- -TOTAL PAYMENTS: $0.00 - - -CREDITS: - -Date Description Amount ----------------------------------------------------------------------------------------------------- -11/6/2025 Management Fee Waived $250.00 ----------------------------------------------------------------------------------------------------- -TOTAL CREDITS: $250.00 - - - -==================================================================================================== -ACCOUNT SUMMARY: -==================================================================================================== - - Total Charges: $4063.93 - Total Payments: -$0.00 - Total Credits: -$250.00 ------------------------------------------------------------- - - BALANCE DUE: $3813.93 - - ⚠️ BALANCE OVERDUE - -Breakdown of outstanding charges: - - 11/30/2025 - Prorated Rent December 1-15: $1282.26 ❌ - -==================================================================================================== - - -DETAILED TRANSACTION HISTORY: -==================================================================================================== - -Date Type Description Amount Balance ----------------------------------------------------------------------------------------------------- -11/6/2025 CHARGE Pro-Rated Rent - November 8-30 $2031.67 $0.00 -11/6/2025 CHARGE Cleaning $250.00 $0.00 -11/6/2025 CHARGE Administration Fee $250.00 $0.00 -11/6/2025 CHARGE Move-In $250.00 $0.00 -11/6/2025 PAYMENT Payment $0.00 $2781.67 -11/6/2025 PAYMENT EPAY $0.00 $2781.67 -11/6/2025 CREDIT Management Fee Waived $250.00 $2531.67 -11/30/2025 CHARGE Prorated Rent December 1-15 $1282.26 $1282.26 ----------------------------------------------------------------------------------------------------- -CURRENT BALANCE: $3813.93 - -==================================================================================================== - -END OF STATEMENT - -Generated: 2025-12-10T03:22:27.402Z -Data Source: DoorLoop API (doorloop-complete-archive-2025-12-09.json) - diff --git a/API_BOOKKEEPING.md b/API_BOOKKEEPING.md deleted file mode 100755 index 66a50b3..0000000 --- a/API_BOOKKEEPING.md +++ /dev/null @@ -1,1025 +0,0 @@ -# ChittyFinance Bookkeeping API Documentation - -This document provides comprehensive API documentation for the Wave Accounting, ChittyRental Property Management, and Automated Bookkeeping Workflow endpoints. - -## Authentication - -All endpoints require: -- **ChittyConnect Authentication**: Bearer token via `Authorization` header -- **Tenant Context**: Automatically resolved from authentication token - -## Table of Contents - -1. [Wave Bookkeeping API](#wave-bookkeeping-api) -2. [ChittyRental Property Management API](#chittyrental-property-management-api) -3. [Automated Bookkeeping Workflows](#automated-bookkeeping-workflows) - ---- - -## Wave Bookkeeping API - -### GET /api/wave/invoices - -Fetch Wave invoices with optional filtering. - -**Query Parameters:** -- `status` (optional): Filter by status (`DRAFT`, `SENT`, `VIEWED`, `PAID`, `OVERDUE`, `CANCELLED`) -- `startDate` (optional): ISO date string (YYYY-MM-DD) -- `endDate` (optional): ISO date string (YYYY-MM-DD) - -**Response:** -```json -[ - { - "id": "invoice_123", - "invoiceNumber": "INV-001", - "customerId": "customer_123", - "customerName": "Acme Corp", - "invoiceDate": "2024-01-15", - "dueDate": "2024-02-15", - "status": "PAID", - "subtotal": 1000.00, - "total": 1080.00, - "amountDue": 0.00, - "currency": "USD", - "items": [ - { - "description": "Consulting services", - "quantity": 10, - "unitPrice": 100.00, - "total": 1000.00, - "accountId": "account_123" - } - ], - "taxes": [ - { - "name": "Sales Tax", - "rate": 0.08, - "amount": 80.00 - } - ], - "payments": [] - } -] -``` - -**Example:** -```bash -curl -X GET "https://finance.chitty.cc/api/wave/invoices?status=PAID&startDate=2024-01-01&endDate=2024-12-31" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - ---- - -### POST /api/wave/invoices - -Create a new Wave invoice. - -**Request Body:** -```json -{ - "customerId": "customer_123", - "invoiceDate": "2024-12-09", - "dueDate": "2025-01-09", - "items": [ - { - "productId": "product_123", - "description": "Web development services", - "quantity": 20, - "unitPrice": 150.00, - "accountId": "account_income_123", - "taxIds": ["tax_123"] - } - ], - "memo": "December 2024 invoice" -} -``` - -**Response:** -```json -{ - "id": "invoice_456", - "invoiceNumber": "INV-002", - "status": "DRAFT", - "total": 3240.00 -} -``` - -**Example:** -```bash -curl -X POST "https://finance.chitty.cc/api/wave/invoices" \ - -H "Authorization: Bearer YOUR_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "customerId": "customer_123", - "invoiceDate": "2024-12-09", - "dueDate": "2025-01-09", - "items": [{"description": "Services", "quantity": 1, "unitPrice": 1000}] - }' -``` - ---- - -### POST /api/wave/invoices/:invoiceId/payments - -Record a payment for an invoice. - -**URL Parameters:** -- `invoiceId`: Wave invoice ID - -**Request Body:** -```json -{ - "amount": 1080.00, - "date": "2024-12-09", - "paymentMethod": "ACH", - "memo": "Payment received via bank transfer" -} -``` - -**Response:** -```json -{ - "id": "payment_789", - "amount": 1080.00, - "date": "2024-12-09", - "paymentMethod": "ACH", - "invoiceId": "invoice_123", - "memo": "Payment received via bank transfer" -} -``` - -**Example:** -```bash -curl -X POST "https://finance.chitty.cc/api/wave/invoices/invoice_123/payments" \ - -H "Authorization: Bearer YOUR_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{"amount": 1080.00, "date": "2024-12-09", "paymentMethod": "ACH"}' -``` - ---- - -### GET /api/wave/customers - -Fetch all Wave customers for the business. - -**Response:** -```json -[ - { - "id": "customer_123", - "name": "Acme Corporation", - "email": "accounting@acme.com", - "phone": "+1-555-0100", - "address": { - "line1": "123 Main St", - "line2": "Suite 100", - "city": "San Francisco", - "state": "California", - "zip": "94102", - "country": "United States" - }, - "balance": 0.00, - "currency": "USD" - } -] -``` - -**Example:** -```bash -curl -X GET "https://finance.chitty.cc/api/wave/customers" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - ---- - -### GET /api/wave/reports/profit-loss - -Generate Profit & Loss report for a date range. - -**Query Parameters:** -- `startDate` (required): ISO date string (YYYY-MM-DD) -- `endDate` (required): ISO date string (YYYY-MM-DD) - -**Response:** -```json -{ - "revenue": 50000.00, - "expenses": 30000.00, - "netIncome": 20000.00, - "breakdown": [ - {"category": "Consulting Revenue", "amount": 30000.00}, - {"category": "Product Sales", "amount": 20000.00}, - {"category": "Office Rent", "amount": -5000.00}, - {"category": "Salaries", "amount": -25000.00} - ] -} -``` - -**Example:** -```bash -curl -X GET "https://finance.chitty.cc/api/wave/reports/profit-loss?startDate=2024-01-01&endDate=2024-12-31" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - ---- - -### POST /api/wave/sync - -Sync Wave invoices and expenses to ChittyFinance transactions. - -**Response:** -```json -{ - "invoices": 15, - "expenses": 23, - "customers": 0, - "vendors": 0 -} -``` - -**Example:** -```bash -curl -X POST "https://finance.chitty.cc/api/wave/sync" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - ---- - -## ChittyRental Property Management API - -### GET /api/rental/properties - -Fetch all rental properties for the tenant. - -**Response:** -```json -[ - { - "id": "property_123", - "tenantId": "tenant_aribia_mgmt", - "name": "City Studio", - "address": { - "street": "550 W Surf St, Unit C211", - "city": "Chicago", - "state": "IL", - "zip": "60657" - }, - "type": "condo", - "units": 1, - "purchasePrice": 200000.00, - "purchaseDate": "2020-03-15", - "marketValue": 250000.00, - "mortgageBalance": 150000.00, - "monthlyMortgage": 1200.00 - } -] -``` - -**Example:** -```bash -curl -X GET "https://finance.chitty.cc/api/rental/properties" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - ---- - -### GET /api/rental/properties/:propertyId - -Fetch detailed property information. - -**URL Parameters:** -- `propertyId`: Property ID - -**Response:** Same as property object in list endpoint - -**Example:** -```bash -curl -X GET "https://finance.chitty.cc/api/rental/properties/property_123" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - ---- - -### GET /api/rental/properties/:propertyId/units - -Fetch all units for a property. - -**Response:** -```json -[ - { - "id": "unit_123", - "propertyId": "property_123", - "unitNumber": "C211", - "bedrooms": 1, - "bathrooms": 1, - "sqft": 650, - "monthlyRent": 2200.00, - "securityDeposit": 2200.00, - "status": "occupied", - "currentLeaseId": "lease_456" - } -] -``` - -**Example:** -```bash -curl -X GET "https://finance.chitty.cc/api/rental/properties/property_123/units" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - ---- - -### GET /api/rental/properties/:propertyId/leases - -Fetch leases for a property. - -**Query Parameters:** -- `status` (optional): Filter by status (`active`, `expired`, `terminated`, `pending`) - -**Response:** -```json -[ - { - "id": "lease_456", - "unitId": "unit_123", - "tenantId": "tenant_john_doe", - "tenantName": "John Doe", - "tenantEmail": "john@example.com", - "tenantPhone": "+1-555-0123", - "startDate": "2024-01-01", - "endDate": "2024-12-31", - "monthlyRent": 2200.00, - "securityDeposit": 2200.00, - "status": "active", - "paymentDay": 1, - "autoPayEnabled": true - } -] -``` - -**Example:** -```bash -curl -X GET "https://finance.chitty.cc/api/rental/properties/property_123/leases?status=active" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - ---- - -### GET /api/rental/leases/:leaseId/payments - -Fetch rent payments for a lease. - -**Query Parameters:** -- `startDate` (optional): ISO date string -- `endDate` (optional): ISO date string - -**Response:** -```json -[ - { - "id": "payment_789", - "leaseId": "lease_456", - "amount": 2200.00, - "dueDate": "2024-12-01", - "paidDate": "2024-12-01", - "status": "paid", - "paymentMethod": "ach", - "lateFee": 0.00, - "memo": "December rent" - } -] -``` - -**Example:** -```bash -curl -X GET "https://finance.chitty.cc/api/rental/leases/lease_456/payments?startDate=2024-01-01&endDate=2024-12-31" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - ---- - -### POST /api/rental/leases/:leaseId/payments - -Record a rent payment. - -**Request Body:** -```json -{ - "amount": 2200.00, - "paidDate": "2024-12-01", - "paymentMethod": "ach", - "memo": "December rent payment" -} -``` - -**Response:** -```json -{ - "id": "payment_789", - "leaseId": "lease_456", - "amount": 2200.00, - "dueDate": "2024-12-01", - "paidDate": "2024-12-01", - "status": "paid", - "paymentMethod": "ach" -} -``` - -**Example:** -```bash -curl -X POST "https://finance.chitty.cc/api/rental/leases/lease_456/payments" \ - -H "Authorization: Bearer YOUR_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{"amount": 2200.00, "paidDate": "2024-12-01", "paymentMethod": "ach"}' -``` - ---- - -### GET /api/rental/properties/:propertyId/maintenance - -Fetch maintenance requests for a property. - -**Query Parameters:** -- `status` (optional): Filter by status (`open`, `assigned`, `in_progress`, `completed`, `closed`) - -**Response:** -```json -[ - { - "id": "maint_123", - "propertyId": "property_123", - "unitId": "unit_123", - "type": "plumbing", - "priority": "high", - "status": "open", - "description": "Kitchen sink leak", - "reportedBy": "tenant", - "reportedDate": "2024-12-08", - "estimatedCost": 250.00 - } -] -``` - -**Example:** -```bash -curl -X GET "https://finance.chitty.cc/api/rental/properties/property_123/maintenance?status=open" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - ---- - -### POST /api/rental/maintenance - -Create a new maintenance request. - -**Request Body:** -```json -{ - "propertyId": "property_123", - "unitId": "unit_123", - "type": "hvac", - "priority": "medium", - "description": "AC not cooling properly", - "reportedBy": "tenant" -} -``` - -**Response:** -```json -{ - "id": "maint_456", - "propertyId": "property_123", - "unitId": "unit_123", - "type": "hvac", - "priority": "medium", - "status": "open", - "description": "AC not cooling properly", - "reportedBy": "tenant", - "reportedDate": "2024-12-09" -} -``` - -**Example:** -```bash -curl -X POST "https://finance.chitty.cc/api/rental/maintenance" \ - -H "Authorization: Bearer YOUR_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{"propertyId": "property_123", "type": "hvac", "priority": "medium", "description": "AC issue", "reportedBy": "tenant"}' -``` - ---- - -### GET /api/rental/properties/:propertyId/expenses - -Fetch property expenses. - -**Query Parameters:** -- `startDate` (optional): ISO date string -- `endDate` (optional): ISO date string - -**Response:** -```json -[ - { - "id": "expense_789", - "propertyId": "property_123", - "date": "2024-12-05", - "category": "maintenance", - "amount": 250.00, - "vendor": "ABC Plumbing", - "description": "Fixed kitchen sink leak", - "maintenanceRequestId": "maint_123", - "receiptUrl": "https://..." - } -] -``` - -**Example:** -```bash -curl -X GET "https://finance.chitty.cc/api/rental/properties/property_123/expenses?startDate=2024-01-01&endDate=2024-12-31" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - ---- - -### POST /api/rental/expenses - -Record a property expense. - -**Request Body:** -```json -{ - "propertyId": "property_123", - "date": "2024-12-09", - "category": "repair", - "amount": 350.00, - "vendor": "XYZ Repairs", - "description": "HVAC repair", - "maintenanceRequestId": "maint_456" -} -``` - -**Response:** -```json -{ - "id": "expense_890", - "propertyId": "property_123", - "date": "2024-12-09", - "category": "repair", - "amount": 350.00, - "vendor": "XYZ Repairs", - "description": "HVAC repair" -} -``` - -**Example:** -```bash -curl -X POST "https://finance.chitty.cc/api/rental/expenses" \ - -H "Authorization: Bearer YOUR_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{"propertyId": "property_123", "category": "repair", "amount": 350, "vendor": "XYZ", "description": "HVAC repair"}' -``` - ---- - -### GET /api/rental/properties/:propertyId/rent-roll - -Fetch current rent roll for a property. - -**Response:** -```json -{ - "propertyId": "property_123", - "propertyName": "City Studio", - "totalUnits": 1, - "occupiedUnits": 1, - "vacantUnits": 0, - "occupancyRate": 100.0, - "totalMonthlyRent": 2200.00, - "collectedRent": 2200.00, - "outstandingRent": 0.00, - "units": [ - { - "unitNumber": "C211", - "tenant": "John Doe", - "rent": 2200.00, - "leaseEnd": "2024-12-31", - "status": "active" - } - ] -} -``` - -**Example:** -```bash -curl -X GET "https://finance.chitty.cc/api/rental/properties/property_123/rent-roll" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - ---- - -### GET /api/rental/properties/:propertyId/financials - -Fetch property financial summary for a date range. - -**Query Parameters:** -- `startDate` (required): ISO date string -- `endDate` (required): ISO date string - -**Response:** -```json -{ - "propertyId": "property_123", - "period": { - "start": "2024-01-01", - "end": "2024-12-31" - }, - "income": { - "rent": 26400.00, - "lateFees": 0.00, - "other": 0.00, - "total": 26400.00 - }, - "expenses": { - "mortgage": 14400.00, - "maintenance": 1500.00, - "utilities": 0.00, - "insurance": 1200.00, - "propertyTax": 2500.00, - "hoa": 3000.00, - "management": 0.00, - "other": 500.00, - "total": 23100.00 - }, - "netOperatingIncome": 3300.00, - "cashFlow": 3300.00, - "capRate": 1.32, - "roi": 1.65 -} -``` - -**Example:** -```bash -curl -X GET "https://finance.chitty.cc/api/rental/properties/property_123/financials?startDate=2024-01-01&endDate=2024-12-31" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - ---- - -### GET /api/rental/financials/consolidated - -Fetch consolidated financials for all properties. - -**Query Parameters:** -- `startDate` (required): ISO date string -- `endDate` (required): ISO date string - -**Response:** -```json -{ - "properties": [ - { /* Property 1 financials */ }, - { /* Property 2 financials */ } - ], - "totals": { - "income": 52800.00, - "expenses": 46200.00, - "netIncome": 6600.00, - "cashFlow": 6600.00, - "avgOccupancy": 95.0 - } -} -``` - -**Example:** -```bash -curl -X GET "https://finance.chitty.cc/api/rental/financials/consolidated?startDate=2024-01-01&endDate=2024-12-31" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - ---- - -### POST /api/rental/properties/:propertyId/sync - -Sync property rent payments and expenses to ChittyFinance. - -**Request Body:** -```json -{ - "startDate": "2024-01-01" -} -``` - -**Response:** -```json -{ - "rentPayments": 12, - "expenses": 8, - "errors": [] -} -``` - -**Example:** -```bash -curl -X POST "https://finance.chitty.cc/api/rental/properties/property_123/sync" \ - -H "Authorization: Bearer YOUR_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{"startDate": "2024-01-01"}' -``` - ---- - -## Automated Bookkeeping Workflows - -### POST /api/workflows/daily-bookkeeping - -Run the daily bookkeeping workflow for the tenant. - -**Workflow Actions:** -1. Sync Wave invoices and expenses -2. Sync rental property data -3. Categorize uncategorized transactions (up to 50) -4. Detect anomalies and suspicious activity -5. Log workflow completion to ChittyChronicle - -**Response:** -```json -{ - "synced": { - "wave": 5, - "rental": 3 - }, - "categorized": 12, - "anomalies": 0 -} -``` - -**Example:** -```bash -curl -X POST "https://finance.chitty.cc/api/workflows/daily-bookkeeping" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - ---- - -### POST /api/workflows/weekly-reconciliation - -Run the weekly reconciliation workflow. - -**Workflow Actions:** -1. Reconcile all accounts -2. Generate discrepancy reports -3. Log unreconciled items -4. Log workflow completion to ChittyChronicle - -**Response:** -```json -{ - "accounts": 4, - "reconciled": 127, - "discrepancies": 3 -} -``` - -**Example:** -```bash -curl -X POST "https://finance.chitty.cc/api/workflows/weekly-reconciliation" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - ---- - -### POST /api/workflows/monthly-close - -Run the monthly financial close workflow. - -**Request Body:** -```json -{ - "month": 12, - "year": 2024 -} -``` - -**Workflow Actions:** -1. Generate Profit & Loss statement -2. Calculate Balance Sheet -3. Prepare tax summary -4. Close the period -5. Archive transactions -6. Log workflow completion to ChittyChronicle - -**Response:** -```json -{ - "profitLoss": { - "revenue": 50000.00, - "expenses": 35000.00, - "netIncome": 15000.00 - }, - "balanceSheet": { - "assets": 500000.00, - "liabilities": 200000.00, - "equity": 300000.00 - }, - "taxSummary": { - "income": 50000.00, - "deductions": 35000.00, - "salesTax": 0.00 - } -} -``` - -**Example:** -```bash -curl -X POST "https://finance.chitty.cc/api/workflows/monthly-close" \ - -H "Authorization: Bearer YOUR_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{"month": 12, "year": 2024}' -``` - ---- - -### POST /api/workflows/quarterly-tax-prep - -Run the quarterly tax preparation workflow. - -**Request Body:** -```json -{ - "quarter": 4, - "year": 2024 -} -``` - -**Workflow Actions:** -1. Calculate quarterly income and expenses -2. Generate deductions by category -3. Calculate estimated tax payments -4. Prepare for tax filing -5. Log workflow completion to ChittyChronicle - -**Response:** -```json -{ - "income": 150000.00, - "expenses": 100000.00, - "netIncome": 50000.00, - "estimatedTax": 12500.00, - "deductions": [ - {"category": "office_rent", "amount": 15000.00}, - {"category": "software", "amount": 5000.00}, - {"category": "professional_services", "amount": 10000.00} - ] -} -``` - -**Example:** -```bash -curl -X POST "https://finance.chitty.cc/api/workflows/quarterly-tax-prep" \ - -H "Authorization: Bearer YOUR_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{"quarter": 4, "year": 2024}' -``` - ---- - -### POST /api/workflows/year-end-close - -Run the annual year-end close workflow. - -**Request Body:** -```json -{ - "year": 2024 -} -``` - -**Workflow Actions:** -1. Generate annual financial statements -2. Calculate full-year metrics -3. Prepare for tax filing -4. Archive year data -5. Generate audit reports -6. Log workflow completion to ChittyChronicle - -**Response:** -```json -{ - "annual": { - "revenue": 600000.00, - "expenses": 400000.00, - "netIncome": 200000.00 - }, - "tax": { - "taxableIncome": 600000.00, - "deductions": 400000.00, - "estimatedTax": 50000.00 - }, - "metrics": { - "avgMonthlyRevenue": 50000.00, - "avgMonthlyExpenses": 33333.33, - "profitMargin": 33.33 - } -} -``` - -**Example:** -```bash -curl -X POST "https://finance.chitty.cc/api/workflows/year-end-close" \ - -H "Authorization: Bearer YOUR_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{"year": 2024}' -``` - ---- - -## Error Responses - -All endpoints return standard HTTP status codes and error responses: - -**400 Bad Request:** -```json -{ - "error": "Validation error", - "message": "month and year required" -} -``` - -**401 Unauthorized:** -```json -{ - "error": "Unauthorized", - "message": "Invalid or expired token" -} -``` - -**404 Not Found:** -```json -{ - "error": "Integration not connected", - "message": "Wave integration not connected" -} -``` - -**500 Internal Server Error:** -```json -{ - "error": "Sync failed", - "message": "Failed to connect to Wave API: Connection timeout" -} -``` - ---- - -## Rate Limits - -- **API Rate Limit**: 100 requests per minute per tenant -- **Integration Rate Limit**: 30 requests per minute per integration per tenant -- **Circuit Breaker**: Opens after 5 consecutive failures, closes after 60 seconds - ---- - -## Best Practices - -1. **Sync Workflows**: Run daily/weekly workflows via cron or scheduled tasks -2. **Error Handling**: Always check response status and handle errors gracefully -3. **Date Ranges**: Use ISO 8601 format (YYYY-MM-DD) for all date parameters -4. **Pagination**: Some endpoints may add pagination in future versions -5. **Idempotency**: All sync operations are idempotent (check for duplicates) -6. **Audit Trail**: All operations are logged to ChittyChronicle for audit purposes - ---- - -## Environment Variables - -Required environment variables for bookkeeping integrations: - -```bash -# Wave Accounting -WAVE_CLIENT_ID=your_wave_client_id -WAVE_CLIENT_SECRET=your_wave_client_secret -WAVE_REDIRECT_URI=https://finance.chitty.cc/api/integrations/wave/callback - -# ChittyRental -CHITTYRENTAL_URL=https://rental.chitty.cc -CHITTYRENTAL_TOKEN=your_service_token - -# ChittyChronicle (Audit Logging) -CHITTYCHRONICLE_URL=https://chronicle.chitty.cc -CHITTYCHRONICLE_TOKEN=your_service_token - -# OpenAI (ML Categorization) -OPENAI_API_KEY=your_openai_api_key -``` - ---- - -## Support - -For questions or issues with the Bookkeeping API: -- Documentation: https://docs.chitty.cc/chittyfinance/bookkeeping -- Support: support@chitty.cc -- GitHub: https://github.com/chittyos/chittyfinance/issues diff --git a/BOOKKEEPING_INTEGRATIONS.md b/BOOKKEEPING_INTEGRATIONS.md deleted file mode 100755 index d47278e..0000000 --- a/BOOKKEEPING_INTEGRATIONS.md +++ /dev/null @@ -1,756 +0,0 @@ -# ChittyFinance: Comprehensive Bookkeeping Integrations - -**Date**: December 9, 2025 -**Version**: 2.5 (Bookkeeping & Integration Release) - ---- - -## 🎯 Overview - -This document details the comprehensive bookkeeping integrations added to ChittyFinance, including: -- **Enhanced Wave Accounting** - Full bookkeeping features (invoices, bills, payments, tax tracking) -- **ChittyRental Integration** - Property management and rent collection -- **Unified ChittyOS Client Package** - Reusable client for all ChittyOS services -- **Automated Bookkeeping Workflows** - Daily, weekly, monthly, quarterly, and annual automation - ---- - -## 📊 Wave Accounting Integration (Enhanced) - -### **File**: `server/lib/wave-bookkeeping.ts` - -### Features - -#### 1. Invoice Management -- **Create invoices** with line items, taxes, and custom terms -- **Track invoice status**: DRAFT, SENT, VIEWED, PAID, OVERDUE, CANCELLED -- **Record payments** with multiple payment methods -- **Auto-sync** paid invoices to ChittyFinance as income transactions - -#### 2. Customer & Vendor Management -- **Fetch customers** with full contact details and addresses -- **Get vendors** for expense tracking -- **Calculate customer balances** from outstanding invoices - -#### 3. Chart of Accounts -- **Retrieve full chart of accounts** from Wave -- **Map accounts** to ChittyFinance categories -- **Track account balances** and types - -#### 4. Financial Reports -- **Profit & Loss Report**: Revenue, expenses, net income by category -- **Balance Sheet**: Assets, liabilities, equity breakdown -- **Cash Flow**: Operating, investing, financing activities -- **Tax Summary**: Income, deductions, sales tax tracking - -#### 5. Automatic Synchronization -- **Bi-directional sync** between Wave and ChittyFinance -- **Duplicate detection** via externalId -- **Reconciliation support** with audit trail logging - -### API Methods - -```typescript -import { WaveBookkeepingClient } from './lib/wave-bookkeeping'; - -const client = new WaveBookkeepingClient({ - clientId: process.env.WAVE_CLIENT_ID, - clientSecret: process.env.WAVE_CLIENT_SECRET, - redirectUri: process.env.WAVE_REDIRECT_URI, -}); - -client.setAccessToken(waveAccessToken); - -// Get invoices -const invoices = await client.getInvoices(businessId, { - status: 'PAID', - startDate: '2024-01-01', - endDate: '2024-12-31', -}); - -// Create invoice -const invoice = await client.createInvoice(businessId, { - customerId: 'customer-id', - invoiceDate: '2024-12-01', - dueDate: '2024-12-31', - items: [ - { - description: 'Consulting services', - quantity: 10, - unitPrice: 150.00, - accountId: 'revenue-account-id', - } - ], -}); - -// Record payment -const payment = await client.recordInvoicePayment(invoiceId, { - amount: 1500.00, - date: '2024-12-15', - paymentMethod: 'ACH', -}); - -// Get profit & loss report -const pl = await client.getProfitLossReport( - businessId, - '2024-01-01', - '2024-12-31' -); - -// Sync to ChittyFinance -const syncResult = await client.syncToChittyFinance(businessId, tenantId); -// Returns: { invoices: 45, expenses: 32, customers: 12, vendors: 8 } -``` - -### Configuration - -```bash -# Wave OAuth credentials -WAVE_CLIENT_ID="..." -WAVE_CLIENT_SECRET="..." -WAVE_REDIRECT_URI="http://localhost:5000/api/integrations/wave/callback" -OAUTH_STATE_SECRET="random-32char-secret" -``` - ---- - -## 🏠 ChittyRental Integration (NEW) - -### **File**: `server/lib/chittyrental-integration.ts` - -### Features - -#### 1. Property Management -- **Property tracking**: Single/multi-family, condo, apartment, commercial -- **Unit management**: Bedrooms, bathrooms, sq ft, rent amounts -- **Unit status**: Vacant, occupied, maintenance, notice -- **Property financials**: Purchase price, market value, mortgage balance - -#### 2. Lease Management -- **Active leases**: Track tenant information, lease terms -- **Rent tracking**: Monthly rent, security deposits, payment day -- **Auto-pay support**: Enable automatic rent collection -- **Lease status**: Active, expired, terminated, pending - -#### 3. Rent Collection -- **Payment tracking**: Due dates, paid dates, payment methods -- **Late fees**: Automatic late fee calculation -- **Payment status**: Pending, paid, late, partial -- **Payment methods**: ACH, card, check, cash - -#### 4. Maintenance Management -- **Maintenance requests**: Plumbing, electrical, HVAC, etc. -- **Priority levels**: Low, medium, high, emergency -- **Vendor assignment**: Track assigned contractors -- **Cost tracking**: Estimated vs actual costs -- **Status tracking**: Open, assigned, in progress, completed, closed - -#### 5. Expense Tracking -- **Property expenses**: Maintenance, repairs, utilities, insurance, taxes, HOA -- **Vendor tracking**: Link expenses to vendors -- **Receipt management**: Store receipt URLs -- **Category breakdown**: Detailed expense categorization - -#### 6. Financial Reporting -- **Rent Roll**: Occupancy rates, collected vs outstanding rent -- **Property Financials**: Income, expenses, NOI, cash flow, cap rate, ROI -- **Consolidated Reports**: Multi-property portfolio analysis - -### API Methods - -```typescript -import { ChittyRentalClient } from './lib/chittyrental-integration'; - -const client = new ChittyRentalClient(); - -// Get properties -const properties = await client.getProperties(tenantId); - -// Get units -const units = await client.getUnits(propertyId); - -// Get active leases -const leases = await client.getLeases(propertyId, 'active'); - -// Record rent payment -const payment = await client.recordRentPayment(leaseId, { - amount: 2500.00, - paidDate: '2024-12-01', - paymentMethod: 'ach', - memo: 'December rent - Unit 211', -}); - -// Get maintenance requests -const maintenance = await client.getMaintenanceRequests(propertyId, 'open'); - -// Record expense -const expense = await client.recordExpense({ - propertyId, - date: '2024-12-05', - category: 'maintenance', - amount: 350.00, - vendor: 'ABC Plumbing', - description: 'Fixed leaky faucet in Unit 211', -}); - -// Get rent roll -const rentRoll = await client.getRentRoll(propertyId); -// Returns: { -// totalUnits: 20, -// occupiedUnits: 18, -// occupancyRate: 0.90, -// totalMonthlyRent: 45000, -// collectedRent: 42500, -// outstandingRent: 2500, -// } - -// Get property financials -const financials = await client.getPropertyFinancials( - propertyId, - '2024-01-01', - '2024-12-31' -); - -// Sync rent payments to ChittyFinance -const syncResult = await client.syncRentPayments(propertyId, tenantId); - -// Sync expenses -const expenseSync = await client.syncPropertyExpenses(propertyId, tenantId); - -// Full property sync -const fullSync = await client.syncProperty(propertyId, tenantId); -// Returns: { rentPayments: 240, expenses: 48, errors: [] } - -// Consolidated multi-property report -const consolidated = await client.getConsolidatedFinancials( - tenantId, - '2024-01-01', - '2024-12-31' -); -``` - -### Configuration - -```bash -CHITTYRENTAL_URL="https://rental.chitty.cc" -CHITTYRENTAL_TOKEN="service-token" -``` - ---- - -## 🔗 Unified ChittyOS Client Package - -### **File**: `server/lib/chittyos-client.ts` - -### Purpose - -A unified, reusable client package for all ChittyOS services. Can be extracted to `@chittyos/client` npm package for use across all ChittyOS applications. - -### Available Clients - -1. **ChittyIDClient** - Identity and DID management -2. **ChittyAuthClient** - Authentication and token management -3. **ChittyConnectClient** - Integration hub (Mercury, etc.) -4. **ChittySchemaClient** - Schema validation -5. **ChittyChronicleClient** - Audit logging -6. **ChittyRegistryClient** - Service discovery -7. **ChittyRentalClient** - Property management - -### Features - -- **Unified API**: Consistent request/response patterns -- **Circuit Breakers**: Automatic failure handling -- **Retry Logic**: Exponential backoff with jitter -- **Timeout Management**: Configurable per client -- **Service Discovery**: Automatic endpoint resolution -- **Health Monitoring**: Check all services at once -- **Singleton Pattern**: Cached instances via factory - -### Usage Examples - -```typescript -import { - ChittyOSClientFactory, - chittyID, - chittyAuth, - chittyConnect, - chittySchema, - chittyChronicle, - chittyRental, -} from './lib/chittyos-client'; - -// Option 1: Use factory -const idClient = ChittyOSClientFactory.getChittyID(); -const authClient = ChittyOSClientFactory.getChittyAuth(); - -// Option 2: Use convenience functions -const id = chittyID(); -const auth = chittyAuth(); - -// Mint ChittyID -const result = await id.mintChittyID('PERSON'); -// Returns: { chittyId: '01-P-ACT-1234-P-2512-5-X', did: 'did:chitty:...', entity: 'PERSON' } - -// Validate with ChittySchema -const schema = chittySchema(); -const validation = await schema.validate('transaction', transactionData); - -// Log to Chronicle -const chronicle = chittyChronicle(); -await chronicle.logEvent({ - eventType: 'financial_transaction', - entityId: transactionId, - entityType: 'transaction', - action: 'created', - metadata: { amount: 1500, category: 'rent_income' }, -}); - -// Discover service -const registry = ChittyOSClientFactory.getChittyRegistry(); -const service = await registry.discoverService('chittyverify'); - -// Health check all services -const health = await ChittyOSClientFactory.healthCheckAll(); -console.log(health); -// { -// chittyid: { status: 'healthy', latency: 45 }, -// chittyauth: { status: 'healthy', latency: 32 }, -// chittyconnect: { status: 'healthy', latency: 67 }, -// ... -// } -``` - -### Custom Configuration - -```typescript -// Override defaults -const customClient = new ChittyIDClient({ - baseUrl: 'https://id-staging.chitty.cc', - serviceToken: 'custom-token', - timeout: 60000, - retries: 5, - circuitBreaker: true, -}); -``` - -### As npm Package (Future) - -```bash -npm install @chittyos/client -``` - -```typescript -import { ChittyOSClientFactory } from '@chittyos/client'; - -const client = ChittyOSClientFactory.getChittyID(); -``` - ---- - -## ⚙️ Automated Bookkeeping Workflows - -### **File**: `server/lib/bookkeeping-workflows.ts` - -### Available Workflows - -#### 1. Daily Bookkeeping Workflow -**Runs**: Every day at midnight - -**Tasks**: -- Sync Wave invoices and expenses -- Sync ChittyRental rent payments and property expenses -- Auto-categorize uncategorized transactions (ML-powered) -- Detect financial anomalies (fraud detection) -- Log workflow results to Chronicle - -**Usage**: -```typescript -import { runDailyBookkeeping } from './lib/bookkeeping-workflows'; - -const result = await runDailyBookkeeping(tenantId); -// Returns: { -// synced: { wave: 12, rental: 45 }, -// categorized: 38, -// anomalies: 2, -// } -``` - -#### 2. Weekly Reconciliation Workflow -**Runs**: Every Sunday at 11 PM - -**Tasks**: -- Reconcile all bank accounts -- Match internal transactions with bank statements -- Generate discrepancy reports -- Send alerts for unreconciled items -- Log reconciliation results - -**Usage**: -```typescript -import { runWeeklyReconciliation } from './lib/bookkeeping-workflows'; - -const result = await runWeeklyReconciliation(tenantId); -// Returns: { -// accounts: 5, -// reconciled: 234, -// discrepancies: 3, -// } -``` - -#### 3. Monthly Close Workflow -**Runs**: First day of each month - -**Tasks**: -- Generate profit & loss statement -- Calculate balance sheet -- Prepare tax summary -- Close accounting period -- Archive monthly transactions -- Generate management reports - -**Usage**: -```typescript -import { runMonthlyClose } from './lib/bookkeeping-workflows'; - -const result = await runMonthlyClose(tenantId, 12, 2024); // December 2024 -// Returns: { -// profitLoss: { revenue: 125000, expenses: 78000, netIncome: 47000 }, -// balanceSheet: { assets: 450000, liabilities: 180000, equity: 270000 }, -// taxSummary: { income: 125000, deductions: 78000, salesTax: 3500 }, -// } -``` - -#### 4. Quarterly Tax Preparation -**Runs**: First day after quarter end - -**Tasks**: -- Generate quarterly P&L -- Calculate estimated tax payments -- Categorize deductible expenses -- Prepare for tax filing -- Generate tax reports - -**Usage**: -```typescript -import { runQuarterlyTaxPrep } from './lib/bookkeeping-workflows'; - -const result = await runQuarterlyTaxPrep(tenantId, 4, 2024); // Q4 2024 -// Returns: { -// income: 380000, -// expenses: 245000, -// netIncome: 135000, -// estimatedTax: 33750, -// deductions: [ -// { category: 'legal_fees', amount: 15000 }, -// { category: 'maintenance', amount: 32000 }, -// ... -// ], -// } -``` - -#### 5. Year-End Close Workflow -**Runs**: January 1st - -**Tasks**: -- Generate annual financial statements -- Calculate full-year metrics -- Prepare for annual tax filing -- Archive year data -- Generate audit reports -- Calculate KPIs and performance metrics - -**Usage**: -```typescript -import { runYearEndClose } from './lib/bookkeeping-workflows'; - -const result = await runYearEndClose(tenantId, 2024); -// Returns: { -// annual: { revenue: 1500000, expenses: 980000, netIncome: 520000 }, -// tax: { taxableIncome: 1500000, deductions: 980000, estimatedTax: 130000 }, -// metrics: { -// avgMonthlyRevenue: 125000, -// avgMonthlyExpenses: 81667, -// profitMargin: 34.67, -// }, -// } -``` - -### Workflow Scheduler - -```typescript -import { WorkflowScheduler } from './lib/bookkeeping-workflows'; - -const scheduler = new WorkflowScheduler(); - -// Register workflows -scheduler.register({ - id: 'daily-bookkeeping', - name: 'Daily Bookkeeping', - type: 'daily', - tenantId: 'tenant-uuid', - enabled: true, - nextRun: new Date(), - config: {}, -}); - -scheduler.register({ - id: 'weekly-reconciliation', - name: 'Weekly Reconciliation', - type: 'weekly', - tenantId: 'tenant-uuid', - enabled: true, - nextRun: new Date(), - config: {}, -}); - -// Run due workflows (call this from a cron job) -await scheduler.runDue(); -``` - -### Cron Setup (Cloudflare Workers) - -```toml -# wrangler.toml -[triggers] -crons = [ - "0 0 * * *", # Daily at midnight - "0 23 * * 0", # Weekly on Sunday at 11 PM - "0 0 1 * *", # Monthly on 1st at midnight - "0 0 1 1,4,7,10 *", # Quarterly - "0 0 1 1 *", # Annually on Jan 1 -] -``` - -```typescript -// worker entry point -export default { - async scheduled(event, env, ctx) { - const scheduler = new WorkflowScheduler(); - // Load workflows from database - await scheduler.runDue(); - } -} -``` - ---- - -## 📈 Financial Reports - -All workflows generate comprehensive financial reports that include: - -### Profit & Loss Statement -- Revenue by category -- Expenses by category -- Gross profit -- Net income -- Profit margin - -### Balance Sheet -- Assets (cash, investments, property) -- Liabilities (loans, credit, accounts payable) -- Equity (retained earnings, owner's equity) - -### Cash Flow Statement -- Operating activities -- Investing activities -- Financing activities -- Net change in cash - -### Tax Reports -- Taxable income -- Deductible expenses by category -- Sales tax collected/owed -- Estimated tax payments - -### Property Reports (ChittyRental) -- Rent roll by property -- Occupancy rates -- Maintenance costs -- Net operating income (NOI) -- Cash-on-cash return -- Cap rate -- ROI - ---- - -## 🔄 Integration Flow - -### Complete Bookkeeping Flow - -``` -1. Daily Sync (Automated) - ├─ Wave: Fetch new invoices/expenses → Sync to ChittyFinance - ├─ ChittyRental: Fetch rent payments/expenses → Sync to ChittyFinance - └─ ML Categorization: Auto-categorize new transactions - -2. Weekly Reconciliation (Automated) - ├─ Fetch bank statements (via Wave/Mercury/ChittyConnect) - ├─ Match transactions (exact + fuzzy matching) - ├─ Identify discrepancies - └─ Generate reconciliation report - -3. Monthly Close (Automated) - ├─ Generate P&L statement - ├─ Calculate balance sheet - ├─ Prepare tax summary - └─ Archive monthly data - -4. Quarterly Tax Prep (Automated) - ├─ Calculate quarterly income/expenses - ├─ Categorize deductions - ├─ Calculate estimated tax - └─ Generate tax filing reports - -5. Annual Close (Automated) - ├─ Generate annual statements - ├─ Calculate full-year metrics - ├─ Prepare for tax filing - └─ Generate audit reports -``` - ---- - -## 🛠️ Setup Guide - -### 1. Configure Wave Integration - -```bash -# Set environment variables -export WAVE_CLIENT_ID="your-client-id" -export WAVE_CLIENT_SECRET="your-client-secret" -export WAVE_REDIRECT_URI="http://localhost:5000/api/integrations/wave/callback" -export OAUTH_STATE_SECRET="random-32char-secret" - -# Complete OAuth flow -# 1. GET /api/integrations/wave/authorize → redirects to Wave -# 2. User authorizes → Wave redirects back to callback -# 3. Callback exchanges code for access token -# 4. Token stored in integrations table -``` - -### 2. Configure ChittyRental Integration - -```bash -export CHITTYRENTAL_URL="https://rental.chitty.cc" -export CHITTYRENTAL_TOKEN="your-service-token" - -# Test connection -curl https://rental.chitty.cc/health -``` - -### 3. Enable Workflows - -```typescript -// Initialize scheduler -const scheduler = new WorkflowScheduler(); - -// Register daily bookkeeping -scheduler.register({ - id: `daily-${tenantId}`, - name: 'Daily Bookkeeping', - type: 'daily', - tenantId, - enabled: true, - config: {}, -}); - -// Schedule cron job -// Run scheduler.runDue() daily at midnight -``` - -### 4. Test Integrations - -```bash -# Test Wave sync -POST /api/integrations/wave/sync -{ - "businessId": "wave-business-id", - "tenantId": "tenant-uuid" -} - -# Test ChittyRental sync -POST /api/rental/sync -{ - "propertyId": "property-uuid", - "tenantId": "tenant-uuid" -} - -# Test workflow -POST /api/workflows/run -{ - "type": "daily", - "tenantId": "tenant-uuid" -} -``` - ---- - -## 📊 Performance Metrics - -### Sync Performance -- **Wave Sync**: ~500 transactions/minute -- **Rental Sync**: ~1000 transactions/minute -- **ML Categorization**: ~50 transactions/minute (OpenAI rate limited) -- **Reconciliation**: ~200 transactions/minute - -### Workflow Execution Times -- **Daily Bookkeeping**: 2-5 minutes (depends on transaction volume) -- **Weekly Reconciliation**: 5-10 minutes -- **Monthly Close**: 1-2 minutes -- **Quarterly Tax Prep**: 2-3 minutes -- **Year-End Close**: 3-5 minutes - ---- - -## 🔐 Security Considerations - -1. **OAuth Tokens**: Stored encrypted in database -2. **Service Tokens**: Environment variables only -3. **API Rate Limiting**: 30 requests/minute for integrations -4. **Circuit Breakers**: Prevent cascading failures -5. **Audit Logging**: All syncs logged to ChittyChronicle -6. **Data Validation**: ChittySchema validation on all data - ---- - -## 🚀 Future Enhancements - -1. **Additional Integrations**: - - QuickBooks Online (real API) - - Xero (real API) - - FreshBooks - - Zoho Books - - DoorLoop (replace mock with real API) - -2. **Advanced Features**: - - Multi-currency support - - Intercompany eliminations - - Consolidated financial statements - - Budget vs actual reporting - - Forecasting and projections - - Custom report builder - -3. **AI/ML Enhancements**: - - Predictive cash flow forecasting - - Anomaly detection for reconciliation - - Auto-suggest expense categories - - Smart invoice matching - -4. **Mobile App**: - - React Native mobile app - - Receipt scanning with OCR - - Mobile expense submission - - Real-time notifications - ---- - -## 📞 Support - -For issues or questions: -- **Documentation**: See CLAUDE.md for implementation details -- **GitHub**: https://github.com/chittyos/chittyfinance -- **ChittyOS Docs**: See `development/docs/CLAUDE.md` - ---- - -**All bookkeeping integrations successfully implemented! 🎉** \ No newline at end of file diff --git a/CHITTYSCHEMA_INTEGRATION.md b/CHITTYSCHEMA_INTEGRATION.md deleted file mode 100755 index d2a13f1..0000000 --- a/CHITTYSCHEMA_INTEGRATION.md +++ /dev/null @@ -1,458 +0,0 @@ -# ChittySchema Integration Complete ✅ - -## Summary - -All financial integrations in ChittyFinance now validate transaction data against **ChittySchema service** at `schema.chitty.cc` before writing to Neon PostgreSQL database. - -## What Was Implemented - -### 1. ChittySchema Validation Module - -**File**: `server/lib/chittyschema-validation.ts` - -**Features**: -- `validateWithChittySchema()` - Core validation function that calls schema.chitty.cc -- `validateTransaction()` - Transaction-specific validation -- `validateTenant()`, `validateAccount()`, `validateProperty()` - Entity validation -- `schemaValidationMiddleware()` - Express middleware for API routes -- `batchValidate()` - Batch validation for multiple entities -- `checkSchemaServiceHealth()` - Health check for schema service - -**API Endpoint**: `https://schema.chitty.cc/api/v1/validate` - -**Environment Variables**: -```bash -CHITTYSCHEMA_URL="https://schema.chitty.cc" # Optional, defaults to this -SKIP_SCHEMA_VALIDATION="true" # Optional, disables validation -``` - -### 2. Integration Points - -All integrations now validate before creating transactions: - -#### DoorLoop Integration (`server/lib/doorloop-integration.ts`) - -- **Rent Payments** (line 351-361): Validates each rent payment transaction -- **Expenses** (line 437-447): Validates each expense transaction - -```typescript -// Validate with ChittySchema -try { - const validation = await validateTransaction(transactionData); - if (!validation.valid) { - errors.push(`Validation failed for payment ${payment.id}: ${validation.errors?.map(e => e.message).join(', ')}`); - continue; - } -} catch (error) { - // Log validation error but continue (schema service may be unavailable) - console.warn(`ChittySchema validation unavailable for payment ${payment.id}:`, error); -} -``` - -#### Stripe Connect Integration (`server/lib/stripe-connect.ts`) - -- **All Transactions** (line 371-381): Validates charges, payouts, and refunds - -```typescript -// Validate with ChittySchema -try { - const validation = await validateTransaction(transactionData); - if (!validation.valid) { - errors.push(`Validation failed for ${transaction.type} ${transaction.id}: ${validation.errors?.map(e => e.message).join(', ')}`); - continue; - } -} catch (error) { - console.warn(`ChittySchema validation unavailable for ${transaction.type} ${transaction.id}:`, error); -} -``` - -#### Wave Accounting Integration (`server/lib/wave-bookkeeping.ts`) - -- **Invoices** (line 595-604): Validates invoice transactions -- **Expenses** (line 640-649): Validates expense transactions - -```typescript -// Validate with ChittySchema -try { - const validation = await validateTransaction(transactionData); - if (!validation.valid) { - console.error(`Validation failed for invoice ${invoice.id}:`, validation.errors); - // Continue processing despite validation failure (log but don't block) - } -} catch (error) { - console.warn(`ChittySchema validation unavailable for invoice ${invoice.id}:`, error); -} -``` - -## Validation Behavior - -### Graceful Degradation - -The validation is designed to be **graceful and non-blocking**: - -1. **Schema Service Available**: - - Validates transaction against centralized schema - - Logs validation errors if schema doesn't match - - In DoorLoop/Stripe: **Skips invalid transactions** (strict mode) - - In Wave: **Logs but continues** (permissive mode) - -2. **Schema Service Unavailable**: - - Logs warning message - - **Continues processing** without validation - - Prevents schema service outages from blocking financial data ingestion - -3. **Production Mode** (`NODE_ENV=production`): - - Schema service failures don't block requests - - Logs warnings for monitoring/alerting - - Financial data continues to sync - -4. **Development Mode** (`NODE_ENV=development`): - - Schema service failures return 503 error - - Forces developer attention to schema issues - - Encourages fixing validation problems early - -### Validation Fields - -Each transaction is validated with these fields: - -```typescript -{ - amount: string, // Transaction amount (decimal string) - type: 'income' | 'expense', // Transaction type - description: string, // Transaction description - date: Date, // Transaction date - category: string, // Category (rent_income, business_revenue, etc.) - tenantId: string, // Multi-tenant isolation - accountId: string // Account identifier -} -``` - -### Error Reporting - -**Validation Failures Include**: -- **Path**: Field that failed validation (e.g., `amount`, `tenantId`) -- **Message**: Human-readable error message -- **Code**: Error code for programmatic handling - -**Example Validation Error**: -```json -{ - "valid": false, - "errors": [ - { - "path": "amount", - "message": "Amount must be a valid decimal string", - "code": "INVALID_AMOUNT" - }, - { - "path": "tenantId", - "message": "Tenant ID is required", - "code": "REQUIRED_FIELD" - } - ] -} -``` - -## Complete Data Pipeline - -``` -┌─────────────────────────────────────────────────────────────────────┐ -│ Financial Data Sources │ -├─────────────────────────────────────────────────────────────────────┤ -│ DoorLoop API │ Stripe Connect │ Wave Accounting │ -│ - Rent payments │ - Charges │ - Invoices │ -│ - Expenses │ - Payouts │ - Expenses │ -│ │ - Refunds │ │ -└──────────┬───────────────┬────────────────────┬──────────────────────┘ - │ │ │ - ▼ ▼ ▼ - ┌──────────────────────────────────────────────┐ - │ ChittySchema Validation Service │ - │ https://schema.chitty.cc │ - │ │ - │ ✓ Type validation │ - │ ✓ Field requirement checks │ - │ ✓ Format validation │ - │ ✓ Cross-field validation │ - └──────────────────┬───────────────────────────┘ - │ ✅ Valid - ▼ - ┌──────────────────────┐ - │ Storage Layer │ - │ (server/storage.ts) │ - └──────────┬───────────┘ - │ - ▼ - ┌──────────────────────┐ - │ Neon PostgreSQL │ - │ (Multi-tenant DB) │ - │ │ - │ • Transactions │ - │ • Tenants │ - │ • Accounts │ - │ • Properties │ - └──────────────────────┘ -``` - -## ChittyOS Client Integration - -ChittyFinance uses the unified ChittyOS client for schema validation: - -**File**: `server/lib/chittyos-client.ts` - -**ChittySchemaClient Class** (lines 263-289): -```typescript -export class ChittySchemaClient extends ChittyOSClient { - async validate(type: string, data: Record): Promise<{ - valid: boolean; - errors?: Array<{ path: string; message: string; code: string }>; - }> { - return this.post('/api/v1/validate', { type, data }); - } - - async getEntityTypes(): Promise> { - const response = await this.get<{ types: any[] }>('/api/v1/entity-types'); - return response.types; - } - - async getSchema(type: string): Promise> { - return this.get(`/api/v1/schema/${type}`); - } -} -``` - -**Factory Access**: -```typescript -import { ChittyOSClientFactory } from './chittyos-client'; - -const schemaClient = ChittyOSClientFactory.getChittySchema(); -const result = await schemaClient.validate('transaction', transactionData); -``` - -## Testing ChittySchema Integration - -### 1. Check Schema Service Health - -```bash -curl https://schema.chitty.cc/health -``` - -**Expected Response**: -```json -{ - "status": "healthy", - "version": "1.0.0", - "uptime": 123456, - "timestamp": "2025-12-09T..." -} -``` - -### 2. Validate Transaction Manually - -```bash -curl -X POST https://schema.chitty.cc/api/v1/validate \ - -H "Content-Type: application/json" \ - -d '{ - "type": "transaction", - "data": { - "amount": "1500.00", - "type": "income", - "description": "Rent payment", - "date": "2025-12-01T00:00:00Z", - "category": "rent_income", - "tenantId": "tenant-123", - "accountId": "account-456" - } - }' -``` - -**Expected Valid Response**: -```json -{ - "valid": true -} -``` - -**Expected Invalid Response**: -```json -{ - "valid": false, - "errors": [ - { - "path": "amount", - "message": "Amount must be a positive number", - "code": "INVALID_AMOUNT" - } - ] -} -``` - -### 3. Test Integration in ChittyFinance - -```bash -# Run historical data ingestion (validates all transactions) -export DOORLOOP_API_KEY="op://Claude-Code Tools/DOORLOOP_API_KEY/api_key" -export STRIPE_SECRET_KEY="sk_test_..." -export CHITTYSCHEMA_URL="https://schema.chitty.cc" - -tsx scripts/ingest-historical-data-2024-2025.ts -``` - -**Look for validation messages in output**: -``` -✅ Rent payments: 12 - ChittySchema validation: 12 passed, 0 failed -✅ Expenses: 8 - ChittySchema validation: 8 passed, 0 failed -``` - -### 4. Test Daily Sync Workflow - -```bash -curl -X POST http://localhost:5000/api/workflows/daily-bookkeeping \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - -**Check logs for validation**: -``` -✅ Synced 24 transactions from DoorLoop -✅ Synced 45 transactions from Stripe Connect -✅ Synced 15 transactions from Wave -🔍 ChittySchema validations: 84 passed, 0 failed -``` - -## Environment Configuration - -### Required Environment Variables - -```bash -# Database (Neon PostgreSQL) -DATABASE_URL="postgresql://user:pass@host/chittyfinance" - -# ChittySchema Service (optional, defaults to https://schema.chitty.cc) -CHITTYSCHEMA_URL="https://schema.chitty.cc" - -# Skip validation (optional, for testing only) -# SKIP_SCHEMA_VALIDATION="true" -``` - -### ChittyOS Service Configuration - -ChittyFinance integrates with the complete ChittyOS ecosystem: - -```bash -# ChittyID (Identity Service) -CHITTYID_URL="https://id.chitty.cc" - -# ChittyAuth (Authentication) -CHITTYAUTH_URL="https://auth.chitty.cc" -CHITTY_AUTH_SERVICE_TOKEN="service_token_here" - -# ChittyConnect (Integration Hub) -CHITTYCONNECT_API_BASE="https://connect.chitty.cc" -CHITTYCONNECT_API_TOKEN="connect_token_here" - -# ChittySchema (Schema Validation) -CHITTYSCHEMA_URL="https://schema.chitty.cc" - -# ChittyChronicle (Audit Logging) -CHITTYCHRONICLE_URL="https://chronicle.chitty.cc" -CHITTYCHRONICLE_TOKEN="chronicle_token_here" - -# ChittyRegistry (Service Discovery) -CHITTYREGISTRY_URL="https://registry.chitty.cc" -``` - -## Benefits of ChittySchema Integration - -### 1. **Centralized Schema Management** -- Single source of truth for all ChittyOS data schemas -- Consistent validation across all services -- Schema changes propagate automatically to all integrations - -### 2. **Data Quality Assurance** -- Invalid data is caught before database insertion -- Prevents schema drift and data corruption -- Ensures cross-service compatibility - -### 3. **Ecosystem Consistency** -- All ChittyOS services use same validation rules -- Financial data from ChittyFinance compatible with ChittyLedger, ChittyChronicle, etc. -- Type safety across service boundaries - -### 4. **Debugging & Monitoring** -- Validation errors provide clear error messages -- Schema violations logged for monitoring -- Easy to trace data quality issues to source - -### 5. **Schema Evolution** -- ChittySchema service can add new fields without breaking existing integrations -- Backward-compatible schema updates -- Version management for schema changes - -## Known Limitations - -### 1. **Schema Service Dependency** -- If schema.chitty.cc is unavailable, validation is skipped (graceful degradation) -- No offline/cached schema validation -- Network latency adds overhead to transaction processing - -**Mitigation**: Circuit breaker pattern handles schema service outages gracefully - -### 2. **No Batch Validation Optimization** -- Each transaction validated individually (N API calls) -- Could be optimized with batch validation endpoint - -**Future Enhancement**: Use `batchValidate()` function for bulk operations - -### 3. **Limited Field Validation** -- Currently validates core transaction fields only -- Metadata fields not deeply validated -- Custom business rules not enforced - -**Future Enhancement**: Expand validation to include metadata schemas - -## Future Enhancements - -1. **Cached Schema Validation** - - Cache schema definitions locally for offline validation - - Periodic schema refresh from central service - - Reduce network calls by 95%+ - -2. **Batch Validation API** - - Validate 100+ transactions in single API call - - Reduce ingestion time for historical data - - Lower network overhead - -3. **Schema Versioning** - - Support multiple schema versions - - Graceful schema migrations - - A/B testing for schema changes - -4. **Real-time Schema Updates** - - WebSocket connection to schema service - - Push schema updates to clients - - Instant schema change propagation - -5. **Advanced Validation Rules** - - Cross-field validation (e.g., date ranges) - - Business logic validation (e.g., negative rent) - - Custom validation functions per tenant - -## Related Documentation - -- **ChittySchema Service**: https://schema.chitty.cc/docs -- **ChittyOS Client**: `server/lib/chittyos-client.ts` -- **Integration Summary**: `COMPLETE_INTEGRATION_SUMMARY.md` -- **DoorLoop Integration**: `DOORLOOP_INTEGRATION.md` -- **Bookkeeping Workflows**: `server/lib/bookkeeping-workflows.ts` - ---- - -**Status**: ✅ Production Ready -**Date**: December 9, 2025 -**ChittySchema Version**: 1.0 -**Integration Coverage**: 100% (DoorLoop, Stripe Connect, Wave Accounting) diff --git a/COMPLETE_INTEGRATION_SUMMARY.md b/COMPLETE_INTEGRATION_SUMMARY.md deleted file mode 100755 index b45d33f..0000000 --- a/COMPLETE_INTEGRATION_SUMMARY.md +++ /dev/null @@ -1,439 +0,0 @@ -# ChittyFinance - Complete Integration Summary - -## 🎉 All Integrations Complete! - -ChittyFinance now has **full, production-ready integrations** with: -- ✅ **DoorLoop** - Property management (rent payments, expenses, maintenance) -- ✅ **Stripe Connect** - Multiple connected Stripe accounts -- ✅ **Wave Accounting** - Invoices, expenses, P&L reports -- ✅ **ChittyRental** - ChittyOS rental service (if applicable) - -All systems are integrated into **automated daily sync** and support **historical data ingestion** for 2024-2025. - ---- - -## 📊 What You Asked For - -### ✅ "Can you extract the latest financial details from DoorLoop?" - -**YES!** Use any of these methods: - -**Method 1: API Endpoint (City Studio specific)** -```bash -GET /api/doorloop/city-studio -``` -Returns property, leases, and recent payments in one call. - -**Method 2: CLI Script** -```bash -export DOORLOOP_API_KEY="op://Claude-Code Tools/DOORLOOP_API_KEY/api_key" -tsx scripts/check-city-studio-payment.ts -``` - -**Method 3: Daily Automated Sync** -```bash -POST /api/workflows/daily-bookkeeping -``` -Automatically syncs last 7 days of DoorLoop data. - -### ✅ "Can you connect to the connected Stripe accounts?" - -**YES!** Full Stripe Connect integration: - -**List all connected accounts**: -```bash -GET /api/stripe/connected-accounts -``` - -**Get account balance**: -```bash -GET /api/stripe/accounts/{accountId}/balance -``` - -**Get account transactions**: -```bash -GET /api/stripe/accounts/{accountId}/transactions?startDate=2024-01-01&endDate=2025-12-31 -``` - -**Sync all accounts**: -```bash -POST /api/stripe/sync-all-accounts -{ - "startDate": "2024-01-01" -} -``` - -### ✅ "Can you ingest all historical data for 2024/2025?" - -**YES!** Comprehensive historical ingestion script: - -```bash -# Set environment variables -export TENANT_ID="aribia-mgmt" -export DOORLOOP_API_KEY="op://Claude-Code Tools/DOORLOOP_API_KEY/api_key" -export STRIPE_SECRET_KEY="your_stripe_key" -export WAVE_CLIENT_ID="your_wave_client_id" -export WAVE_CLIENT_SECRET="your_wave_client_secret" - -# Run historical ingestion -tsx scripts/ingest-historical-data-2024-2025.ts -``` - -**What it does**: -1. Syncs **all** DoorLoop properties (rent payments + expenses since 2024-01-01) -2. Syncs **all** Stripe connected accounts (charges + payouts + refunds) -3. Syncs **all** Wave invoices and expenses -4. Deduplicates using `externalId` -5. Logs to ChittyChronicle -6. Provides detailed progress and error reporting - ---- - -## 🚀 Complete Integration Architecture - -### Daily Automated Sync - -**Endpoint**: `POST /api/workflows/daily-bookkeeping` - -**What it syncs automatically** (last 7 days): -1. ✅ Wave invoices & expenses -2. ✅ DoorLoop rent payments & expenses (all properties) -3. ✅ Stripe Connect transactions (all connected accounts) -4. ✅ ChittyRental data (if applicable) -5. ✅ ML-powered transaction categorization -6. ✅ Fraud detection & anomaly alerts -7. ✅ Audit logging to ChittyChronicle - -**Response**: -```json -{ - "synced": { - "wave": 5, - "doorloop": 12, - "stripe": 8, - "rental": 0 - }, - "categorized": 15, - "anomalies": 0 -} -``` - ---- - -## 📋 All Available Endpoints - -### DoorLoop (6 endpoints) - -``` -GET /api/doorloop/test # Test connection -GET /api/doorloop/properties # List all properties -GET /api/doorloop/city-studio # City Studio specific -GET /api/doorloop/properties/:id/leases # Property leases -GET /api/doorloop/leases/:id/payments # Lease payments -POST /api/doorloop/properties/:id/sync # Sync to ChittyFinance -``` - -### Stripe Connect (6 endpoints) - -``` -GET /api/stripe/connected-accounts # List all connected accounts -GET /api/stripe/accounts/:id/balance # Account balance -GET /api/stripe/accounts/:id/transactions # Account transactions -GET /api/stripe/accounts/:id/summary # Financial summary -POST /api/stripe/accounts/:id/sync # Sync single account -POST /api/stripe/sync-all-accounts # Sync all accounts -``` - -### Wave Accounting (6 endpoints) - -``` -GET /api/wave/invoices # List invoices -POST /api/wave/invoices # Create invoice -POST /api/wave/invoices/:id/payments # Record payment -GET /api/wave/customers # List customers -GET /api/wave/reports/profit-loss # P&L report -POST /api/wave/sync # Sync to ChittyFinance -``` - -### Automated Workflows (5 endpoints) - -``` -POST /api/workflows/daily-bookkeeping # Daily sync (all integrations) -POST /api/workflows/weekly-reconciliation # Weekly reconciliation -POST /api/workflows/monthly-close # Monthly close -POST /api/workflows/quarterly-tax-prep # Quarterly tax prep -POST /api/workflows/year-end-close # Year-end close -``` - ---- - -## 🔧 Implementation Files - -### Core Integration Modules - -| File | Lines | Purpose | -|------|-------|---------| -| `server/lib/doorloop-integration.ts` | 450+ | DoorLoop API client & sync | -| `server/lib/stripe-connect.ts` | 380+ | Stripe Connect client & sync | -| `server/lib/wave-bookkeeping.ts` | 650+ | Wave API client & sync | -| `server/lib/bookkeeping-workflows.ts` | 550+ | Automated daily/weekly/monthly workflows | -| `server/lib/chittyrental-integration.ts` | 490+ | ChittyRental API client | -| `server/lib/chittyos-client.ts` | 500+ | Unified ChittyOS service client | - -### API Routes - -| File | Lines Added | Endpoints | -|------|-------------|-----------| -| `server/routes.ts` | 600+ | All integration endpoints | - -### Scripts - -| Script | Purpose | -|--------|---------| -| `scripts/check-city-studio-payment.ts` | Check City Studio payments via DoorLoop | -| `scripts/ingest-historical-data-2024-2025.ts` | Ingest all 2024/2025 data from all sources | - -### Documentation - -| Document | Purpose | -|----------|---------| -| `DOORLOOP_INTEGRATION.md` | DoorLoop integration guide | -| `API_BOOKKEEPING.md` | Complete API documentation | -| `BOOKKEEPING_INTEGRATIONS.md` | Phase 2 integrations guide | -| `IMPROVEMENTS_SUMMARY.md` | Phase 1 improvements guide | -| `INTEGRATION_COMPLETE.md` | Phase 1+2 completion status | -| `THIS FILE` | Complete integration summary | - ---- - -## 📈 Data Flow - -### Ingestion Pipeline - -``` -┌─────────────┐ -│ DoorLoop │──┐ -│ (Properties)│ │ -└─────────────┘ │ - │ -┌─────────────┐ │ -│ Stripe │ │ -│ Connect │──┤──▶ Daily Workflow ──▶ ChittyFinance ──▶ ML Categorization ──▶ ChittyChronicle -│ (Multiple │ │ Sync Transactions (OpenAI GPT-4o) (Audit Log) -│ Accounts) │ │ -└─────────────┘ │ - │ -┌─────────────┐ │ -│ Wave │ │ -│ Accounting │──┘ -└─────────────┘ -``` - -### Transaction Deduplication - -All transactions use `externalId` to prevent duplicates: -- DoorLoop: `doorloop-payment-{id}` or `doorloop-expense-{id}` -- Stripe: `stripe-{type}-{id}` (e.g., `stripe-charge-ch_123`) -- Wave: `wave-invoice-{id}` or `wave-expense-{id}` - ---- - -## 🎯 Usage Examples - -### Example 1: Check City Studio Latest Payment - -```bash -# Using API -curl -X GET "http://localhost:5000/api/doorloop/city-studio" \ - -H "Authorization: Bearer YOUR_TOKEN" - -# Using CLI -export DOORLOOP_API_KEY="op://Claude-Code Tools/DOORLOOP_API_KEY/api_key" -tsx scripts/check-city-studio-payment.ts -``` - -### Example 2: Sync All Stripe Accounts - -```bash -curl -X POST "http://localhost:5000/api/stripe/sync-all-accounts" \ - -H "Authorization: Bearer YOUR_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{"startDate": "2024-01-01"}' -``` - -### Example 3: Run Full Daily Sync - -```bash -curl -X POST "http://localhost:5000/api/workflows/daily-bookkeeping" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - -### Example 4: Ingest All Historical Data - -```bash -# Set up environment -export TENANT_ID="aribia-mgmt" -export DOORLOOP_API_KEY="op://Claude-Code Tools/DOORLOOP_API_KEY/api_key" -export STRIPE_SECRET_KEY="sk_live_..." - -# Run ingestion -tsx scripts/ingest-historical-data-2024-2025.ts -``` - -**Output Example**: -``` -🚀 Starting historical data ingestion for 2024-2025 - -📊 Tenant ID: aribia-mgmt -📅 Date Range: 2024-01-01 to 2025-12-31 - -──────────────────────────────────────────────────────────────────────────────── -📦 Step 1: DoorLoop Property Management Data -──────────────────────────────────────────────────────────────────────────────── -✅ Connected to DoorLoop - Properties available: 2 - Leases available: 2 - Payments available: Yes - -🏠 Syncing: City Studio - Address: 550 W Surf St Unit C211, Chicago, IL 60657 - ✅ Rent payments: 12 - ✅ Expenses: 8 - -🏠 Syncing: Apt Arlene - Address: 4343 N Clarendon #1610, Chicago, IL 60657 - ✅ Rent payments: 12 - ✅ Expenses: 5 - -✅ DoorLoop ingestion complete - Total rent payments: 24 - Total expenses: 13 - -──────────────────────────────────────────────────────────────────────────────── -💳 Step 2: Stripe Connect Data -──────────────────────────────────────────────────────────────────────────────── -🔍 Fetching connected accounts... - Found 3 connected accounts - -🏦 Syncing account: acct_123abc - Type: standard - Charges enabled: Yes - Payouts enabled: Yes - ✅ Transactions synced: 45 - -🏦 Syncing account: acct_456def - Type: express - Charges enabled: Yes - Payouts enabled: Yes - ✅ Transactions synced: 32 - -──────────────────────────────────────────────────────────────────────────────── - -📈 HISTORICAL DATA INGESTION SUMMARY -════════════════════════════════════════════════════════════════════════════════ - -🏠 DoorLoop: - Properties synced: 2 - Rent payments: 24 - Expenses: 13 - Subtotal: 37 transactions - -💳 Stripe Connect: - Accounts synced: 3 - Transactions: 77 - -📊 Wave Accounting: - Invoices: 15 - Expenses: 12 - Subtotal: 27 transactions - -════════════════════════════════════════════════════════════════════════════════ -🎯 TOTAL RESULTS: - Total transactions ingested: 141 - Total errors: 0 -════════════════════════════════════════════════════════════════════════════════ - -✅ Historical data ingestion complete! -``` - ---- - -## 🔐 Environment Variables - -```bash -# DoorLoop -DOORLOOP_API_KEY="op://Claude-Code Tools/DOORLOOP_API_KEY/api_key" - -# Stripe -STRIPE_SECRET_KEY="sk_live_..." # or sk_test_... -STRIPE_WEBHOOK_SECRET="whsec_..." - -# Wave -WAVE_CLIENT_ID="..." -WAVE_CLIENT_SECRET="..." -WAVE_REDIRECT_URI="http://localhost:5000/api/integrations/wave/callback" - -# ChittyChronicle (Audit Logging) -CHITTYCHRONICLE_URL="https://chronicle.chitty.cc" -CHITTYCHRONICLE_TOKEN="..." - -# OpenAI (ML Categorization) -OPENAI_API_KEY="sk-..." -``` - ---- - -## 🎯 What's Next - -### Immediate Next Steps - -1. **Set up daily cron**: - ```bash - # Run daily at 2 AM - 0 2 * * * curl -X POST http://localhost:5000/api/workflows/daily-bookkeeping \ - -H "Authorization: Bearer $TOKEN" - ``` - -2. **Run historical ingestion**: - ```bash - tsx scripts/ingest-historical-data-2024-2025.ts - ``` - -3. **Monitor via ChittyChronicle**: - ```bash - GET /api/events?eventType=integration_sync - ``` - -### Future Enhancements (Not Critical) - -- [ ] Build frontend UI for DoorLoop data visualization -- [ ] Build frontend UI for Stripe Connect dashboards -- [ ] Add monthly financial reports generation -- [ ] Add automated email notifications for sync failures -- [ ] Add Plaid integration for additional bank accounts -- [ ] Extract `@chittyos/client` to npm package - ---- - -## 📊 Status: PRODUCTION READY ✅ - -**All requested features are complete and functional**: -- ✅ DoorLoop financial data extraction -- ✅ Stripe Connect multiple accounts support -- ✅ Historical data ingestion for 2024/2025 -- ✅ Automated daily synchronization -- ✅ Comprehensive API endpoints -- ✅ Complete documentation - -**Total Implementation**: -- 3 new integration modules (DoorLoop, Stripe Connect, enhanced Wave) -- 18 new API endpoints -- 2 utility scripts -- ~1,300 lines of production code -- ~100 lines of comprehensive documentation - ---- - -**Date**: December 9, 2024 -**Status**: Complete -**Ready For**: Production Deployment & Historical Data Ingestion diff --git a/DOORLOOP_ARCHIVE_COMPLETE.md b/DOORLOOP_ARCHIVE_COMPLETE.md deleted file mode 100755 index ac56127..0000000 --- a/DOORLOOP_ARCHIVE_COMPLETE.md +++ /dev/null @@ -1,453 +0,0 @@ -# DoorLoop Data Archive - Complete Summary - -**Archive Date:** December 9, 2025 -**Archive Time:** 8:10 PM CST -**Total Records Archived:** 562 records - ---- - -## 🎯 PRIMARY OBJECTIVE COMPLETED - -**QUESTION:** Has Alexis Pheng paid December 2025 rent for City Studio? - -**ANSWER:** ❌ **NO** - Payment is overdue - -**Amount Due:** $1,282.26 (Prorated rent for December 1-15, 2025) -**Days Overdue:** 8 days (as of December 9, 2025) -**Last Payment:** November 6, 2025 ($2,781.67 - move-in charges) - ---- - -## 📁 ARCHIVED FILES - -### Complete Data Archives (674 KB total) - -| File | Size | Records | Description | -|------|------|---------|-------------| -| **doorloop-complete-archive-2025-12-09.json** | 674 KB | 562 | Complete paginated fetch of all endpoints | -| **doorloop-archive-2025-12-09.json** | 282 KB | 80 | Initial archive (properties, leases, tenants, units) | -| **doorloop-communications-2025-12-09.json** | 45 KB | 50 | All tenant communications | -| **doorloop-final-archive-2025-12-09.json** | 76 KB | 62 | Reports, notes, files | - -### Reports & Statements - -| File | Size | Description | -|------|------|-------------| -| **ALEXIS_PAYMENT_STATUS_REPORT.md** | 6.9 KB | Detailed payment status analysis | -| **ALEXIS_CORRECTED_STATEMENT.txt** | - | Complete tenant statement with all charges/payments | -| **ALEXIS_TENANT_STATEMENT.txt** | - | Auto-generated statement from archive data | - -### Summary Files - -| File | Description | -|------|-------------| -| **doorloop-complete-archive-summary.txt** | Summary of 562 archived records | -| **doorloop-final-archive-2025-12-09-summary.txt** | Final archive summary | -| **doorloop-archive-2025-12-09-summary.txt** | Initial archive summary | -| **DOORLOOP_ARCHIVE_COMPLETE.md** | This file - master summary | - ---- - -## 📊 COMPLETE DATA INVENTORY - -### Successfully Archived (562 records): - -| Endpoint | Records | Notes | -|----------|---------|-------| -| Communications | 50 | Tenant emails, SMS, portal messages | -| Files | 50 | Documents, leases, photos | -| Tenants | 50 | Full tenant database | -| Notifications | 50 | System notifications | -| Accounts | 50 | Financial accounts | -| Tasks | 50 | Property management tasks | -| Vendor Bills | 50 | Vendor invoices and bills | -| Lease Charges | 50 | All rent charges and fees | -| Lease Payments | 50 | Payment records | -| Lease Credits | 37 | Credits and adjustments | -| Vendors | 20 | Vendor directory | -| Leases | 16 | All lease agreements | -| Rent Roll | 8 | Current rent roll report | -| Units | 8 | Property units | -| Owners | 8 | Property owners | -| Properties | 6 | Property database | -| Expenses | 5 | Property expenses | -| Notes | 4 | Internal notes | -| Reversed Payments | 0 | No reversed payments | - -**TOTAL: 562 records** - -### Inaccessible Endpoints (53 endpoints): - -- Financial reports (P&L, Cash Flow, Balance Sheet) - Require premium API access (400 errors) -- Payment endpoints (`/payments`) - Deprecated, replaced by `/lease-payments` -- Various premium features - Not included in current API plan - ---- - -## 🏢 PROPERTY PORTFOLIO SUMMARY - -### 6 Properties Archived: - -1. **City Studio at The Commodore** - 550 W Surf St C211, Chicago IL - - Alexis Pheng's property - - 360 sq ft studio, 1 bath - - Active lease - -2. **Additional 5 properties** - Full details in archive files - -### 16 Leases: -- 6 active leases -- 10 inactive/expired leases - -### 50 Tenants: -- Complete contact information -- Email addresses -- Phone numbers -- Lease history - ---- - -## 💰 ALEXIS PHENG - COMPLETE FINANCIAL SUMMARY - -### Tenant Information: -- **Name:** Alexis Pheng -- **Email:** acpheng@gmail.com -- **Phone:** 804-665-8632 -- **Lease ID:** 690e47b7d84b610e20287ca2 -- **Property:** City Studio at The Commodore -- **Address:** 550 W Surf St C211, Chicago IL 60657 - -### Lease Details: -- **Start Date:** November 8, 2025 -- **End Date:** December 15, 2026 -- **Term:** 13 months (fixed) -- **Monthly Rent:** $2,650.00 -- **Status:** ACTIVE - -### Financial Status: - -#### November 2025 (PAID ✅): -| Charge | Amount | Status | -|--------|--------|--------| -| Pro-rated rent (Nov 8-30) | $2,031.67 | PAID ✅ | -| Cleaning fee | $250.00 | PAID ✅ | -| Administration fee | $250.00 | PAID ✅ | -| Move-in fee | $250.00 | PAID ✅ | -| Management fee (waived) | -$250.00 | CREDIT | -| **TOTAL PAID** | **$2,781.67** | **✅** | - -**Payment Date:** November 6, 2025 -**Payment Method:** EPAY -**Confirmation:** Email sent November 7, 2025 - -#### December 2025 (OVERDUE ❌): -| Charge | Amount | Status | -|--------|--------|--------| -| Prorated rent (Dec 1-15) | $1,282.26 | **UNPAID ❌** | - -**Charge Posted:** December 1, 2025 -**Days Overdue:** 8 days (as of Dec 9, 2025) -**Automated Notices Sent:** 14 notices over 7 days - -### Collection Activity: - -**December 1, 2025:** "Final Day to Pay Rent" notices (2 emails) - -**Daily Overdue Notices (Dec 3-9):** -- December 3: 2 notices -- December 4: 2 notices -- December 5: 2 notices -- December 6: 2 notices -- December 7: 2 notices -- December 8: 2 notices -- December 9: 2 notices - -**Total:** 14 automated collection notices - -### Compliance Issues: - -⚠️ **Renters Insurance:** Required but not provided -- Status: NO_INSURANCE -- Requirement: Active policy with proof of coverage -- Action needed: Request proof of insurance from tenant - ---- - -## 🔍 VERIFICATION METHODOLOGY - -This analysis was verified through **6 independent DoorLoop API endpoints**: - -1. **`/lease-charges`** ✅ - - Shows Dec 1 charge: $1,282.26 - - Shows balance: $1,282.26 (unpaid) - -2. **`/lease-payments`** ✅ - - Shows 2 Nov payments - - Shows 0 Dec payments - -3. **`/leases/{id}`** ✅ - - Shows overdueBalance: $1,282.26 - - Shows totalBalanceDue: $1,282.26 - -4. **`/communications`** ✅ - - Shows 14 overdue notices Dec 3-9 - - Shows payment confirmation Nov 7 - -5. **`/lease-credits`** ✅ - - Shows 1 credit (management fee waived) - - Shows no Dec credits - -6. **`/lease-reversed-payments`** ✅ - - Shows 0 reversed payments - - Confirms charge stands - -**All 6 sources independently confirm: DECEMBER 2025 RENT UNPAID** - ---- - -## 📧 COMMUNICATIONS ARCHIVE - -### 50 Communications Archived: - -**Recent Activity (December 2025):** -- Daily overdue rent notices (automated) -- Payment reminders -- System notifications - -**November 2025:** -- Payment confirmation (Nov 7) -- Tenant portal setup (Nov 7) -- Move-in welcome messages -- Property manager contact info - -**All communications include:** -- Full email content -- SMS messages -- Timestamps -- Sender/recipient info -- Delivery status - ---- - -## 📂 FILES ARCHIVE - -### 50 Files Archived: - -Categories: -- Lease agreements -- Property photos -- Inspection reports -- Tenant applications -- Insurance documents -- Payment receipts -- Maintenance requests -- Correspondence - -**Note:** File metadata archived; actual file download may require separate API calls or premium access. - ---- - -## 📝 NOTES & TASKS - -### 4 Internal Notes: -- Property management notes -- Tenant communications log -- Maintenance scheduling -- Compliance tracking - -### 50 Tasks: -- Property maintenance -- Lease renewals -- Inspection scheduling -- Document collection -- Follow-ups - ---- - -## 🚨 CRITICAL FINDINGS - -### 1. December 2025 Rent - OVERDUE -- **Amount:** $1,282.26 -- **Status:** 8 days overdue -- **Last Payment:** November 6, 2025 -- **Action:** Contact tenant immediately - -### 2. Renters Insurance - NON-COMPLIANT -- **Status:** No proof of insurance on file -- **Requirement:** Active policy required per lease -- **Action:** Request proof within 7 days - -### 3. Payment History - PREVIOUSLY COMPLIANT -- **November 2025:** Paid in full on time ✅ -- **Pattern:** This is first missed payment -- **Consideration:** May indicate temporary issue vs. pattern - ---- - -## 📞 RECOMMENDED ACTIONS - -### Immediate (24-48 hours): - -1. **Contact Alexis Pheng** - - Phone: 804-665-8632 - - Email: acpheng@gmail.com - - Reference: Charge ID 690e47b8d84b610e20288103 - -2. **Request Payment** - - Amount: $1,282.26 - - For: December 1-15, 2025 prorated rent - - Due: Immediately (8 days overdue) - -3. **Document Communication** - - Log all contact attempts - - Document tenant responses - - Maintain compliance with Chicago RLTO - -### Short-term (7-14 days): - -4. **Insurance Compliance** - - Request proof of renters insurance - - Provide 7-day notice if not already sent - - Assess monthly charge if not compliant - -5. **Payment Plan Consideration** - - If tenant experiencing hardship - - Evaluate payment plan options - - Document any agreements - -6. **Late Fee Assessment** - - Chicago RLTO guidelines: $10 + 5% of balance over $500 - - For $1,282.26: $10 + $39.11 = $49.11 - - Apply per lease terms and local regulations - -### Medium-term (30 days): - -7. **Monitor Payment Patterns** - - Next rent due: Dec 16 (full month Dec 16-31) - - Then: Jan 1, 2026 (full month $2,650) - - Ensure timely payments going forward - -8. **Lease Compliance Review** - - Insurance requirements - - Payment terms - - Renewal options - - Property condition - ---- - -## 💾 DATA PRESERVATION - -### Archive Security: - -✅ **Local Storage:** All data saved to local JSON files -✅ **Multiple Formats:** JSON (machine-readable) + TXT/MD (human-readable) -✅ **Redundant Copies:** 4 separate archive files with overlapping data -✅ **Verification:** All critical data cross-referenced across multiple sources - -### Archive Longevity: - -- **Primary Archive:** doorloop-complete-archive-2025-12-09.json (674 KB) -- **Backup Copies:** 3 additional archive files -- **Human-Readable Reports:** 3 formatted statement/report files -- **Recommended:** Store in multiple locations (cloud backup, local backup, offsite) - -### Future Access: - -Even after DoorLoop API access expires, you will have: -- Complete tenant database -- All lease agreements and terms -- Full payment history -- Communication logs -- Property details -- Financial records - ---- - -## 📈 STATISTICAL SUMMARY - -### Archive Statistics: - -- **Total API Calls:** ~100+ (with pagination) -- **Endpoints Tested:** 65 -- **Endpoints Accessible:** 19 -- **Records Retrieved:** 562 -- **Data Volume:** ~1 MB compressed -- **Time to Complete:** ~30 minutes -- **Success Rate:** 100% for accessible endpoints - -### Data Quality: - -- **Complete Records:** 562 (100%) -- **Missing Data:** Minimal (some fields N/A by design) -- **Data Integrity:** Verified across multiple endpoints -- **Cross-References:** All Alexis data verified 6 ways - ---- - -## ✅ COMPLETION CHECKLIST - -- ✅ Alexis payment status determined (UNPAID) -- ✅ Complete DoorLoop data archived (562 records) -- ✅ All communications backed up (50 records) -- ✅ All files cataloged (50 records) -- ✅ All notes preserved (4 records) -- ✅ All lease charges documented (50 records) -- ✅ All payments recorded (50 records) -- ✅ All credits tracked (37 records) -- ✅ Tenant statement generated -- ✅ Payment status report created -- ✅ Compliance issues identified -- ✅ Recommended actions provided -- ✅ Data verified across multiple sources -- ✅ Archive secured in multiple formats - ---- - -## 📋 FILES REFERENCE - -### Archive Files: -``` -doorloop-complete-archive-2025-12-09.json 674 KB (Master archive - 562 records) -doorloop-archive-2025-12-09.json 282 KB (Initial archive) -doorloop-communications-2025-12-09.json 45 KB (Communications) -doorloop-final-archive-2025-12-09.json 76 KB (Reports) -``` - -### Reports & Statements: -``` -ALEXIS_PAYMENT_STATUS_REPORT.md 6.9 KB (Detailed analysis) -ALEXIS_CORRECTED_STATEMENT.txt (Tenant statement) -ALEXIS_TENANT_STATEMENT.txt (Auto-generated) -DOORLOOP_ARCHIVE_COMPLETE.md (This file) -``` - -### Summary Files: -``` -doorloop-complete-archive-summary.txt 972 B (562 records summary) -doorloop-final-archive-2025-12-09-summary.txt 1.5 KB (Final summary) -doorloop-archive-2025-12-09-summary.txt 2.5 KB (Initial summary) -``` - ---- - -## 🎯 MISSION ACCOMPLISHED - -**Primary Objective:** Determine Alexis's December 2025 payment status -**Result:** ✅ **CONFIRMED - PAYMENT NOT RECEIVED** - -**Secondary Objective:** Archive all DoorLoop data before API access expires -**Result:** ✅ **COMPLETE - 562 RECORDS ARCHIVED** - -**Archive Quality:** ✅ **VERIFIED ACROSS 6 INDEPENDENT SOURCES** - ---- - -*Archive completed: December 9, 2025 at 8:10 PM CST* -*Total time: ~3 hours (investigation + comprehensive archival)* -*Data verified: 6 independent DoorLoop API endpoints* - ---- - -**END OF SUMMARY** - ---- diff --git a/DOORLOOP_INTEGRATION.md b/DOORLOOP_INTEGRATION.md deleted file mode 100755 index 08ae1f2..0000000 --- a/DOORLOOP_INTEGRATION.md +++ /dev/null @@ -1,494 +0,0 @@ -# DoorLoop Integration - Complete Guide - -## Overview - -ChittyFinance now has **full integration** with DoorLoop property management system, providing: -- Automatic daily synchronization of rent payments and expenses -- Real-time access to property data, leases, and payments -- Integration with the automated bookkeeping workflow -- Dedicated API endpoint for City Studio monitoring - -## Setup - -### 1. Get Your DoorLoop API Key - -1. Log in to DoorLoop: https://app.doorloop.com -2. Navigate to **Settings → API** -3. Copy your API key - -### 2. Store API Key Securely - -**Using 1Password (Recommended)**: -```bash -# Store in 1Password -op item create \ - --category="API Credential" \ - --title="DOORLOOP_API_KEY" \ - --vault="Claude-Code Tools" \ - api_key="your_actual_api_key" - -# Reference in your environment -export DOORLOOP_API_KEY="op://Claude-Code Tools/DOORLOOP_API_KEY/api_key" -``` - -**Or set directly**: -```bash -export DOORLOOP_API_KEY="your_actual_api_key" -``` - -### 3. Create DoorLoop Integration in ChittyFinance - -```bash -curl -X POST "http://localhost:5000/api/integrations" \ - -H "Authorization: Bearer YOUR_CHITTY_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "service": "doorloop", - "credentials": { - "api_key": "your_actual_api_key" - }, - "connected": true - }' -``` - -## API Endpoints - -### Test Connection - -```bash -GET /api/doorloop/test -``` - -Tests the DoorLoop API connection and returns available data. - -**Response**: -```json -{ - "connected": true, - "properties": 2, - "leases": 3, - "paymentsAvailable": true -} -``` - -**Example**: -```bash -curl -X GET "http://localhost:5000/api/doorloop/test" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - ---- - -### Get All Properties - -```bash -GET /api/doorloop/properties -``` - -Fetches all properties from DoorLoop. - -**Response**: -```json -[ - { - "id": 12345, - "name": "City Studio", - "address": { - "line1": "550 W Surf St Unit C211", - "city": "Chicago", - "state": "IL", - "zip": "60657", - "country": "USA", - "full": "550 W Surf St Unit C211, Chicago, IL 60657" - }, - "type": "Condo", - "units": 1, - "status": "Active", - "createdAt": "2020-03-15T00:00:00Z" - } -] -``` - -**Example**: -```bash -curl -X GET "http://localhost:5000/api/doorloop/properties" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - ---- - -### Get City Studio Details - -```bash -GET /api/doorloop/city-studio -``` - -**Special endpoint** that finds City Studio property and returns complete details including leases and recent payments. - -**Response**: -```json -{ - "property": { - "id": 12345, - "name": "City Studio", - "address": {...} - }, - "leases": [ - { - "id": 67890, - "tenant": { - "id": 111, - "name": "John Doe", - "email": "john@example.com" - }, - "startDate": "2024-01-01", - "endDate": "2024-12-31", - "monthlyRent": 2200.00, - "status": "active" - } - ], - "payments": [ - { - "id": 98765, - "leaseId": 67890, - "amount": 2200.00, - "date": "2024-12-01", - "status": "cleared", - "paymentMethod": "ACH" - } - ], - "latestPayment": { - "id": 98765, - "amount": 2200.00, - "date": "2024-12-01", - "status": "cleared" - } -} -``` - -**Example**: -```bash -curl -X GET "http://localhost:5000/api/doorloop/city-studio" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - ---- - -### Get Property Leases - -```bash -GET /api/doorloop/properties/:propertyId/leases -``` - -Fetches all leases for a specific property. - -**Example**: -```bash -curl -X GET "http://localhost:5000/api/doorloop/properties/12345/leases" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - ---- - -### Get Lease Payments - -```bash -GET /api/doorloop/leases/:leaseId/payments -``` - -Fetches all payments for a specific lease. - -**Response**: -```json -[ - { - "id": 98765, - "leaseId": 67890, - "tenantId": 111, - "amount": 2200.00, - "date": "2024-12-01", - "status": "cleared", - "paymentMethod": "ACH", - "memo": "December rent", - "createdAt": "2024-12-01T10:00:00Z" - } -] -``` - -**Example**: -```bash -curl -X GET "http://localhost:5000/api/doorloop/leases/67890/payments" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - ---- - -### Sync Property to ChittyFinance - -```bash -POST /api/doorloop/properties/:propertyId/sync -``` - -Syncs rent payments and expenses for a property to ChittyFinance transactions. - -**Request Body**: -```json -{ - "startDate": "2024-01-01" -} -``` - -**Response**: -```json -{ - "rentPayments": 12, - "expenses": 8, - "errors": [] -} -``` - -**Example**: -```bash -curl -X POST "http://localhost:5000/api/doorloop/properties/12345/sync" \ - -H "Authorization: Bearer YOUR_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{"startDate": "2024-01-01"}' -``` - -## Automated Daily Sync - -DoorLoop is now integrated into the **daily bookkeeping workflow**. When you run: - -```bash -POST /api/workflows/daily-bookkeeping -``` - -The workflow will: -1. ✅ Sync Wave invoices and expenses -2. ✅ **Sync DoorLoop properties (NEW!)** - - Fetch all properties from DoorLoop - - Sync rent payments from the last 7 days - - Sync property expenses from the last 7 days - - Deduplicate using `externalId` -3. ✅ Sync ChittyRental data (if applicable) -4. ✅ Auto-categorize transactions -5. ✅ Log to ChittyChronicle - -**Response**: -```json -{ - "synced": { - "wave": 5, - "doorloop": 12, - "rental": 0 - }, - "categorized": 15, - "anomalies": 0 -} -``` - -## Command Line Script - -Use the dedicated script to check City Studio payments: - -```bash -# Set API key -export DOORLOOP_API_KEY="your_api_key" - -# Or use 1Password -export DOORLOOP_API_KEY="op://Claude-Code Tools/DOORLOOP_API_KEY/api_key" - -# Run the script -tsx scripts/check-city-studio-payment.ts -``` - -**Output**: -``` -🔍 Fetching DoorLoop data... - -📋 Step 1: Fetching properties... - Found 2 properties - -✅ Found City Studio property: - ID: 12345 - Name: City Studio - Address: 550 W Surf St Unit C211, Chicago, IL 60657 - -📋 Step 2: Fetching leases... - Found 1 lease(s) for City Studio - - Lease 1: - ID: 67890 - Tenant: John Doe - Status: active - Monthly Rent: $2200.00 - -📋 Step 3: Fetching payments... - Found 12 payment(s) for City Studio - -💰 Recent Payments: -──────────────────────────────────────────────────────────────────────────────── - -1. Payment on 2024-12-01 - Amount: $2200.00 - Status: cleared - Method: ACH - -2. Payment on 2024-11-01 - Amount: $2200.00 - Status: cleared - Method: ACH - -──────────────────────────────────────────────────────────────────────────────── - -📊 Summary: - Total Payments: 12 - Total Amount: $26400.00 - Latest Payment: $2200.00 on 2024-12-01 - Latest Status: cleared -``` - -## Integration Architecture - -### DoorLoopClient Class - -**Location**: `server/lib/doorloop-integration.ts` - -**Key Methods**: -```typescript -class DoorLoopClient { - // Data retrieval - async getProperties(): Promise - async getProperty(id: number): Promise - async getLeases(): Promise - async getPropertyLeases(propertyId: number): Promise - async getPayments(): Promise - async getLeasePayments(leaseId: number): Promise - async getExpenses(): Promise - async getMaintenanceRequests(propertyId?: number): Promise - - // Utilities - async findPropertyByAddress(search: string): Promise - async testConnection(): Promise<{connected, properties, leases, paymentsAvailable}> - - // Sync to ChittyFinance - async syncRentPayments(propertyId, tenantId, startDate?): Promise<{synced, errors}> - async syncExpenses(propertyId, tenantId, startDate?): Promise<{synced, errors}> - async syncProperty(propertyId, tenantId, startDate?): Promise<{rentPayments, expenses, errors}> -} -``` - -### Data Synchronization - -When syncing DoorLoop data to ChittyFinance: - -**Rent Payments** → Transactions: -- Type: `income` -- Category: `rent_income` -- External ID: `doorloop-payment-{paymentId}` -- Metadata includes: `leaseId`, `paymentMethod`, `reference` - -**Expenses** → Transactions: -- Type: `expense` -- Category: from DoorLoop category or `other_expense` -- External ID: `doorloop-expense-{expenseId}` -- Metadata includes: `expenseStatus` - -**Deduplication**: Uses `externalId` to prevent duplicate syncs - -## Premium Account Features - -⚠️ **Note**: Some DoorLoop features require a premium account: - -- ✅ **Available on Free Tier**: - - Properties - - Units - - Leases - - Basic property data - -- 💎 **Premium Required**: - - Payments API (may return HTML instead of JSON) - - Advanced reporting - - Bulk operations - -If payments API is unavailable, the integration will: -1. Log a warning -2. Return empty array for payments -3. Continue syncing other data - -## Troubleshooting - -### API Key Issues - -**Error**: `DoorLoop API error 401` - -**Solution**: -```bash -# Verify your API key -echo $DOORLOOP_API_KEY - -# Test connection -curl -H "Authorization: Bearer $DOORLOOP_API_KEY" \ - https://app.doorloop.com/api/properties?limit=1 -``` - -### Payments Not Available - -**Error**: `Payments endpoint returned HTML` - -**Cause**: DoorLoop free tier doesn't include payments API access - -**Solution**: Upgrade to DoorLoop premium or check payments manually at https://app.doorloop.com/payments - -### City Studio Not Found - -**Error**: `City Studio not found in DoorLoop` - -**Cause**: Property address doesn't match search pattern - -**Solution**: -1. Check property name in DoorLoop dashboard -2. Update search in `findPropertyByAddress()` method -3. Or use property ID directly - -## Environment Variables - -```bash -# Required -DOORLOOP_API_KEY=your_api_key - -# Optional (for daily workflow automation) -CHITTYCHRONICLE_URL=https://chronicle.chitty.cc -CHITTYCHRONICLE_TOKEN=your_service_token -OPENAI_API_KEY=your_openai_key # For ML categorization -``` - -## Next Steps - -1. **Set up daily cron**: - ```bash - # Run daily at 2 AM - 0 2 * * * curl -X POST http://localhost:5000/api/workflows/daily-bookkeeping \ - -H "Authorization: Bearer $TOKEN" - ``` - -2. **Monitor sync results** via ChittyChronicle: - ```bash - GET /api/events?eventType=integration_sync&entityId=your_tenant_id - ``` - -3. **Build frontend UI** for DoorLoop data visualization - -## File Reference - -- `server/lib/doorloop-integration.ts` - Main integration module -- `server/lib/bookkeeping-workflows.ts` - Daily sync workflow (line 69-97) -- `server/routes.ts` - API endpoints (lines 1877-2035) -- `server/integrations/doorloopClient.ts` - Low-level API client -- `scripts/check-city-studio-payment.ts` - CLI utility - ---- - -**Status**: ✅ Production Ready -**Last Updated**: December 9, 2024 -**Integration**: DoorLoop API v1 diff --git a/IMPLEMENTATION.md b/IMPLEMENTATION.md deleted file mode 100755 index cba7273..0000000 --- a/IMPLEMENTATION.md +++ /dev/null @@ -1,357 +0,0 @@ -# ChittyFinance Multi-Tenant Architecture Implementation - -## Overview - -ChittyFinance has been upgraded with a complete multi-tenant architecture to support the IT CAN BE LLC business structure with multiple legal entities, properties, and management companies. - -## What Was Implemented - -### ✅ Phase 1: Database Architecture (COMPLETED) - -**1. System Mode Schema** (`database/system.schema.ts`) -- Full multi-tenant PostgreSQL schema with decimal precision -- 13 tables supporting complex business structure: - - `tenants` - Legal entities with hierarchical relationships - - `users` - User accounts with optional ChittyID integration - - `tenant_users` - Role-based access control per tenant - - `accounts` - Financial accounts (bank, credit, etc.) - - `transactions` - Financial transactions with decimal precision - - `intercompany_transactions` - Transfers between tenants - - `properties` - Real estate assets - - `units` - Rental units - - `leases` - Tenant leases - - `integrations` - API connections (Mercury, Wave, Stripe) - - `tasks` - Financial tasks - - `ai_messages` - AI conversation history - -**2. Standalone Mode Schema** (`database/standalone.schema.ts`) -- Simplified SQLite schema for local development -- Single-tenant, faster iteration -- 6 core tables without multi-tenancy overhead - -**3. Mode-Aware Database Connection** (`server/db.ts`) -- Automatic switching between PostgreSQL and SQLite based on `MODE` env var -- Exports correct schema for each mode -- Proper connection pooling and error handling - -**4. Entity Seeding** (`database/seeds/it-can-be-llc.ts`) -- Seeds complete IT CAN BE LLC entity structure: - - IT CAN BE LLC (holding company) - - JEAN ARLENE VENTURING LLC (personal, 85% owner) - - ARIBIA LLC (series parent) - - ARIBIA LLC - MGMT (management with 2 brands) - - ARIBIA LLC - CITY STUDIO (property at 550 W Surf St C211) - - ARIBIA LLC - APT ARLENE (property at 4343 N Clarendon #1610) - - ChittyCorp LLC (pending formation) -- Creates properties for both condos -- Sets up users: Nicholas Bianchi (full access) and Sharon E Jones (limited access) -- Configures permissions per tenant - -### ✅ Build & Deployment Infrastructure (COMPLETED) - -**1. Dual Drizzle Configurations** -- `drizzle.system.config.ts` - PostgreSQL migrations -- `drizzle.standalone.config.ts` - SQLite migrations -- Separate migration folders per mode - -**2. Cloudflare Workers Deployment** (`deploy/system-wrangler.toml`) -- Complete Wrangler configuration for production deployment -- KV namespace for caching -- R2 bucket for documents -- Service bindings to other ChittyOS services -- Staging and production environments - -**3. Mode Detection** (`scripts/detect-mode.js`) -- Auto-detects system vs standalone mode -- Checks for: - - Explicit MODE environment variable - - Neon database connection - - ChittyID service token - - System wrangler config - -**4. Updated Package Scripts** -```json -{ - "dev": "MODE=standalone", // Default: local dev - "dev:system": "MODE=system", // System mode dev - "db:push:system": "PostgreSQL push", // Push system schema - "db:push:standalone": "SQLite push", // Push standalone schema - "db:seed": "Seed IT CAN BE LLC", // Run seeding - "deploy": "Wrangler deploy", // Deploy to Cloudflare - "deploy:staging": "Deploy staging", // Staging environment - "deploy:production": "Deploy prod" // Production environment -} -``` - -**5. Dependencies Added** -- `better-sqlite3` - SQLite database for standalone mode -- `@types/better-sqlite3` - TypeScript definitions - -### ✅ Documentation (COMPLETED) - -**1. CLAUDE.md** - Comprehensive development guide -- Dual-mode architecture explanation -- Multi-tenant entity structure -- Database schemas documentation -- Seeding process -- Build and deployment commands -- Known limitations and next steps - -**2. AGENTS.md** - Quick reference guide -- Repository structure -- Common commands -- Coding conventions -- Security best practices - -**3. IMPLEMENTATION.md** (this file) -- What was implemented -- What still needs work -- Quick start guide - -## IT CAN BE LLC Entity Structure - -``` -IT CAN BE LLC (Wyoming Holding) -│ -├── JEAN ARLENE VENTURING LLC (85% owner) -│ └── Personal income from properties -│ -├── ARIBIA LLC (100% owned, Illinois Series) -│ │ -│ ├── ARIBIA LLC - MGMT (Management Company) -│ │ ├── Chicago Furnished Condos (consumer brand) -│ │ └── Chitty Services (vendor/tech services) -│ │ -│ ├── ARIBIA LLC - CITY STUDIO (Property Entity) -│ │ └── 550 W Surf St C211, Chicago IL 60657 -│ │ -│ └── ARIBIA LLC - APT ARLENE (Property Entity) -│ └── 4343 N Clarendon #1610, Chicago IL 60613 -│ -└── ChittyCorp LLC (Pending Formation) - └── ChittyCorp & ChittyFoundation assets/IP -``` - -## Quick Start - -### System Mode (Production - Multi-Tenant) - -```bash -# 1. Install dependencies -npm install - -# 2. Set environment variables -export MODE=system -export DATABASE_URL="postgresql://..." - -# 3. Push database schema -npm run db:push:system - -# 4. Seed IT CAN BE LLC entities -npm run db:seed - -# 5. Start development server -npm run dev:system - -# 6. Deploy to Cloudflare Workers -npm run deploy:production -``` - -### Standalone Mode (Local Development) - -```bash -# 1. Install dependencies -npm install - -# 2. Push SQLite schema -npm run db:push:standalone - -# 3. Start development server (default mode) -npm run dev - -# Access at http://localhost:5000 -``` - -## What Still Needs Implementation - -### ⏳ Phase 2: Application Layer Updates (PENDING) - -**1. Storage Layer** (`server/storage.ts`) -- Update to use new `database/system.schema.ts` -- Add tenant-aware query methods -- Example: - ```typescript - async getAccounts(tenantId: string): Promise - async getTransactions(tenantId: string, accountId: string): Promise - async createIntercompanyTransaction(from: string, to: string, ...): Promise - ``` - -**2. API Routes** (`server/routes.ts`) -- Replace demo auth with real authentication -- Add tenant selection/switching -- Update all routes to be tenant-scoped -- Add tenant middleware for request scoping - -**3. Authentication** -- Replace "demo" user auto-login -- Add login page with tenant selection -- Integrate ChittyID (future) -- Implement JWT with tenant context - -**4. Frontend Components** -- Add tenant switcher in header -- Update dashboard to show selected tenant's data -- Add tenant hierarchy viewer -- Property management UI for ARIBIA LLC - MGMT -- Consolidated reporting across tenants - -**5. Middleware** -- Tenant scoping middleware -- Permission checking per tenant -- Audit logging for all tenant operations - -### ⏳ Phase 3: Real Integrations (PENDING) - -**1. Mercury Bank API** -- Replace mock data in `server/lib/financialServices.ts` -- Real-time account balance sync -- Transaction import -- Multi-account support per tenant - -**2. Wave Accounting API** -- Replace mock data -- Invoice tracking -- Expense categorization -- Multi-entity books - -**3. Stripe** -- Payment processing for management fees -- Recurring billing for tenants -- Payout automation - -### ⏳ Phase 4: Property Management Features (PENDING) - -**1. Rent Roll** -- Track all active leases -- Rent collection status -- Lease expiration alerts - -**2. Maintenance System** -- Work order creation -- Vendor assignment -- Cost tracking per property -- Completion tracking - -**3. Reporting** -- Occupancy rates -- Revenue per property -- Expense analysis -- Inter-company allocations - -## File Structure - -``` -chittyfinance/ -├── database/ -│ ├── system.schema.ts ✅ Multi-tenant PostgreSQL schema -│ ├── standalone.schema.ts ✅ Single-tenant SQLite schema -│ └── seeds/ -│ └── it-can-be-llc.ts ✅ Entity seeding script -├── deploy/ -│ └── system-wrangler.toml ✅ Cloudflare deployment config -├── scripts/ -│ └── detect-mode.js ✅ Mode detection -├── server/ -│ ├── db.ts ✅ Mode-aware connection -│ ├── storage.ts ⏳ Needs tenant-aware updates -│ ├── routes.ts ⏳ Needs tenant-aware updates -│ └── lib/ -│ ├── financialServices.ts ⏳ Replace with real APIs -│ ├── chargeAutomation.ts ⏳ Update for multi-tenant -│ ├── openai.ts ✅ Ready -│ └── github.ts ✅ Ready -├── shared/ -│ └── schema.ts 🗑️ Deprecated (use database/system.schema.ts) -├── drizzle.system.config.ts ✅ System mode Drizzle config -├── drizzle.standalone.config.ts ✅ Standalone mode Drizzle config -├── CLAUDE.md ✅ Developer documentation -├── AGENTS.md ✅ Quick reference -└── IMPLEMENTATION.md ✅ This file -``` - -## Environment Variables - -### System Mode (Production) -```bash -MODE=system -NODE_ENV=production -DATABASE_URL=postgresql://user:pass@host.neon.tech/chittyfinance - -# API Keys (set via wrangler secret put) -OPENAI_API_KEY=sk-... -MERCURY_API_KEY=... -WAVE_API_TOKEN=... -STRIPE_SECRET_KEY=... - -# ChittyOS Integration (future) -CHITTY_ID_SERVICE_TOKEN=... -CHITTY_AUTH_SERVICE_TOKEN=... -JWT_SECRET=... -``` - -### Standalone Mode (Local Development) -```bash -MODE=standalone -NODE_ENV=development -SQLITE_FILE=./chittyfinance.db # Optional - -# API Keys (optional for dev) -OPENAI_API_KEY=sk-... -``` - -## Next Steps - -1. **Install dependencies**: `npm install` -2. **Choose your mode**: - - Local dev: `npm run dev` (standalone) - - System mode: `npm run dev:system` -3. **For system mode**: - - Run `npm run db:push:system` - - Run `npm run db:seed` -4. **Start implementing Phase 2** (storage/routes updates) - -## Key Design Decisions - -1. **Multi-Tenant vs Single-Tenant** - - System mode: Full multi-tenancy for IT CAN BE LLC structure - - Standalone mode: Single-tenant for fast local dev - -2. **Decimal Precision** - - System mode: `decimal(12,2)` for all monetary amounts - - Standalone mode: `real` (acceptable for development) - -3. **UUID vs Serial IDs** - - System mode: UUIDs (better for distributed systems) - - Standalone mode: Text IDs (simpler) - -4. **Tenant Hierarchy** - - Supports parent-child relationships - - IT CAN BE LLC → ARIBIA LLC → Property entities - -5. **Property Management First** - - Schema includes properties, units, leases - - ARIBIA LLC - MGMT can manage multiple properties - - Track Chicago Furnished Condos brand separately - -## Support - -For questions or issues: -- Check `CLAUDE.md` for detailed documentation -- Review database schemas in `database/` folder -- Run `npm run mode:detect` to verify current mode -- Check git history for implementation details - ---- - -Generated with Claude Code -Implementation Date: November 2025 diff --git a/IMPROVEMENTS_SUMMARY.md b/IMPROVEMENTS_SUMMARY.md deleted file mode 100755 index f92fc4d..0000000 --- a/IMPROVEMENTS_SUMMARY.md +++ /dev/null @@ -1,747 +0,0 @@ -# ChittyFinance: Comprehensive Improvements Summary - -**Date**: December 9, 2025 -**Version**: 2.0 (Major Enhancement Release) - ---- - -## 🎉 Overview - -This document summarizes all major improvements and enhancements made to ChittyFinance, transforming it from a basic financial tracking system into a comprehensive, production-ready financial management platform with advanced features including ML-powered categorization, fraud detection, and full ChittyOS ecosystem integration. - ---- - -## ✅ Completed Improvements - -### 1. ✨ Storage Layer Enhancement (COMPLETED) - -**Status**: Already implemented -**Files**: `server/storage.ts` - -**What Changed**: -- Storage layer already uses `database/system.schema.ts` with tenant-aware queries -- Dual-mode support (system/standalone) fully functional -- Complete interface implementation with all CRUD operations - -**Key Features**: -- Multi-tenant PostgreSQL support (system mode) -- Single-user SQLite support (standalone mode) -- Tenant access control and role-based permissions -- Account, transaction, property, and task operations -- Webhook event management with idempotency - ---- - -### 2. 📥 Batch Import Functionality (NEW) - -**Status**: Fully implemented -**Files**: -- `server/lib/batch-import.ts` (new) -- `server/routes.ts` (endpoints added) - -**Features**: -- **Multi-format Support**: CSV, Excel (.xlsx, .xls), JSON -- **Validation**: Zod schema validation before import -- **Duplicate Detection**: Prevents duplicate imports based on externalId -- **Progress Tracking**: Returns detailed import results -- **Error Handling**: Comprehensive error reporting per row -- **Batch Processing**: Configurable batch sizes (default 100) - -**API Endpoints**: -```bash -# Upload and import file -POST /api/transactions/import -- multipart/form-data with 'file' field -- Query params: accountId, skipDuplicates, validateOnly - -# Download CSV template -GET /api/transactions/import/template - -# Import legal costs from Google Drive -POST /api/litigation/import -- Body: { ledgerPath, accountId } -``` - -**Usage Example**: -```bash -curl -X POST http://localhost:5000/api/transactions/import \ - -H "Authorization: Bearer $TOKEN" \ - -F "file=@transactions.csv" \ - -F "accountId=account-uuid" \ - -F "skipDuplicates=true" -``` - -**Response**: -```json -{ - "success": true, - "imported": 245, - "skipped": 12, - "duplicates": 8, - "errors": [ - { "row": 15, "error": "Invalid date format", "data": {...} } - ] -} -``` - ---- - -### 3. 🛡️ Comprehensive Error Handling (NEW) - -**Status**: Fully implemented -**Files**: `server/lib/error-handling.ts` - -**Features**: -- **Custom Error Types**: APIError, RateLimitError, ValidationError, IntegrationError -- **Exponential Backoff Retry**: Configurable retry logic with jitter -- **Circuit Breaker Pattern**: Prevents cascading failures -- **Rate Limiting**: Sliding window algorithm for API protection -- **Fetch with Retry**: Automatic retry for external API calls -- **Error Middleware**: Express middleware for consistent error responses - -**Components**: - -**1. Retry Logic**: -```typescript -import { withRetry } from './lib/error-handling'; - -const result = await withRetry( - async () => await fetch('https://api.example.com/data'), - { - maxRetries: 3, - baseDelay: 1000, - maxDelay: 30000, - backoffMultiplier: 2, - } -); -``` - -**2. Rate Limiting**: -```typescript -import { rateLimitMiddleware, apiRateLimiter } from './lib/error-handling'; - -// Apply to routes -app.use(rateLimitMiddleware(apiRateLimiter)); // 100 req/min -``` - -**3. Circuit Breakers**: -```typescript -import { circuitBreakers } from './lib/error-handling'; - -await circuitBreakers.mercury.execute(async () => { - return await fetchMercuryData(); -}); -``` - -**Global Rate Limiters**: -- API: 100 requests/minute -- Integrations: 30 requests/minute -- Auto-cleanup every 5 minutes - -**Circuit Breakers**: -- Mercury, Wave, Stripe, DoorLoop: 5 failures, 60s timeout -- ChittyConnect: 3 failures, 30s timeout - ---- - -### 4. 🔒 API Rate Limiting Middleware (NEW) - -**Status**: Fully implemented (part of error-handling.ts) - -**Features**: -- Sliding window rate limiting -- Per-IP tracking -- Automatic cleanup of old entries -- Retry-After headers -- X-RateLimit-Reset headers - -**Usage**: -```typescript -import { rateLimitMiddleware, apiRateLimiter } from './lib/error-handling'; - -app.use('/api', rateLimitMiddleware(apiRateLimiter)); -``` - ---- - -### 5. 🏛️ ChittySchema Integration (NEW) - -**Status**: Fully implemented -**Files**: `server/lib/chittyschema-validation.ts` - -**Features**: -- **Centralized Validation**: Validate against ChittyOS schema service -- **Entity Type Discovery**: Fetch available entity types -- **Schema Details**: Get detailed schema for any entity -- **Middleware Support**: Express middleware for automatic validation -- **Batch Validation**: Validate multiple entities at once -- **Health Monitoring**: Check schema service availability - -**API Integration**: -```typescript -import { - validateTransaction, - validateTenant, - validateAccount, - schemaValidationMiddleware, -} from './lib/chittyschema-validation'; - -// Validate before creation -const result = await validateTransaction(transactionData); -if (!result.valid) { - console.error('Validation errors:', result.errors); -} - -// Use middleware -app.post('/api/transactions', - schemaValidationMiddleware('transaction'), - async (req, res) => { - // Transaction is already validated - } -); -``` - -**Configuration**: -```bash -CHITTYSCHEMA_URL="https://schema.chitty.cc" -SKIP_SCHEMA_VALIDATION="false" # Set to true to disable -``` - -**Available Validators**: -- `validateTransaction()` -- `validateTenant()` -- `validateAccount()` -- `validateProperty()` -- `batchValidate()` - ---- - -### 6. 📜 ChittyChronicle Logging (NEW) - -**Status**: Fully implemented -**Files**: `server/lib/chittychronicle-logging.ts` - -**Features**: -- **Comprehensive Audit Trail**: Log all financial events -- **Transaction Lifecycle**: Create, update, delete tracking -- **Integration Events**: Connection/disconnection logging -- **Batch Operations**: Import/export event logging -- **Reconciliation Tracking**: Account reconciliation events -- **Security Alerts**: Suspicious activity logging -- **Automatic Middleware**: Log all API actions - -**Event Types**: -- `financial_transaction` - Transaction CRUD operations -- `financial_account` - Account operations -- `integration` - Integration connect/disconnect -- `bulk_operation` - Batch imports/exports -- `reconciliation` - Reconciliation events -- `security_alert` - Fraud/suspicious activity -- `api_action` - API endpoint calls - -**Usage Example**: -```typescript -import { logTransactionCreated, logReconciliation } from './lib/chittychronicle-logging'; - -// Log transaction creation -await logTransactionCreated(transaction, userId); - -// Log reconciliation -await logReconciliation(accountId, transactionIds, tenantId, userId); - -// Apply audit middleware -app.use(auditMiddleware); -``` - -**Configuration**: -```bash -CHITTYCHRONICLE_URL="https://chronicle.chitty.cc" -CHITTYCHRONICLE_TOKEN="service-token" -SKIP_CHRONICLE_LOGGING="false" # Set to true to disable -``` - -**Automatic Logging**: -- All POST/PUT/PATCH/DELETE operations -- Transaction lifecycle events -- Integration changes -- Reconciliation actions -- Fraud alerts (high/critical) - ---- - -### 7. 🤖 ML-Based Transaction Categorization (NEW) - -**Status**: Fully implemented -**Files**: `server/lib/ml-categorization.ts` - -**Features**: -- **OpenAI GPT-4o-mini Integration**: Intelligent categorization -- **Few-Shot Learning**: Uses historical categorizations -- **Confidence Scoring**: Returns confidence level (0-1) -- **Suggested Tags**: Additional metadata tags -- **Fallback Rules**: Rule-based categorization if AI unavailable -- **Batch Processing**: Categorize multiple transactions efficiently -- **Learning Loop**: Record corrections for improvement - -**Categories**: -- Income: salary, rent_income, investment_income, business_revenue, etc. -- Expense: rent_expense, utilities, maintenance, legal_fees, etc. -- Transfer: intercompany_transfer, savings_transfer, etc. - -**Usage Example**: -```typescript -import { categorizeTransaction, categorizeBatch } from './lib/ml-categorization'; - -// Single transaction -const result = await categorizeTransaction( - 'Legal fees - Arias v Bianchi', - -5000.00, - 'expense', - 'US Legal', - historyArray -); - -console.log(result); -// { -// category: 'legal_fees', -// confidence: 0.95, -// reasoning: 'Legal services payment to law firm', -// suggestedTags: ['litigation', 'professional-services'] -// } - -// Batch categorization -const results = await categorizeBatch(transactions, history); -``` - -**Fallback Rules**: -- Pattern matching for common transactions -- Keyword detection (rent, utilities, legal, etc.) -- Category inference from description -- Confidence scoring based on match quality - ---- - -### 8. 🚨 Fraud Detection & Anomaly Detection (NEW) - -**Status**: Fully implemented -**Files**: `server/lib/fraud-detection.ts` - -**Features**: -- **Statistical Anomaly Detection**: Z-score analysis -- **Velocity Checks**: Rapid transaction detection -- **Suspicious Payee Detection**: Pattern matching -- **Round Number Detection**: Common fraud indicator -- **Time Anomaly Detection**: Unusual hour detection -- **ML-Based Detection**: OpenAI-powered fraud analysis -- **Layering Detection**: Money laundering patterns -- **Duplicate Detection**: Identify duplicate transactions -- **Account Takeover Detection**: Suspicious activity monitoring -- **Real-time Monitoring**: Middleware for transaction blocking - -**Alert Severity Levels**: -- `low`: Minor anomalies (round numbers, etc.) -- `medium`: Suspicious patterns (unusual payee, time) -- `high`: Strong indicators (amount anomaly Z>3) -- `critical`: Blocks transaction (Z>5, known fraud patterns) - -**Detection Methods**: - -**1. Amount Anomaly (Z-Score)**: -```typescript -// Detects transactions significantly different from normal -Z = (amount - avgAmount) / stdDevAmount -Alert if Z > 3 (high), Z > 5 (critical) -``` - -**2. Velocity Check**: -```typescript -// Detects rapid succession of transactions -Alert if >10 transactions in 1 hour -Alert if >$10k total in 1 hour -``` - -**3. Suspicious Payees**: -```typescript -// Keywords: wire transfer, cash, atm, bitcoin, crypto, offshore -``` - -**4. Layering Detection**: -```typescript -// Detects smurfing (many small transactions <$10k) -Alert if ≥5 transactions $5k-$10k -``` - -**Usage Example**: -```typescript -import { analyzeTransaction, generateFraudReport } from './lib/fraud-detection'; - -// Analyze single transaction -const pattern = await calculatePattern(tenantId); -const alerts = await analyzeTransaction(transaction, pattern); - -// Check for critical alerts -if (alerts.some(a => a.severity === 'critical')) { - // Block transaction - throw new Error('Transaction blocked by fraud detection'); -} - -// Apply monitoring middleware -app.use(fraudMonitoringMiddleware); -``` - -**Configuration**: -- Automatic logging to ChittyChronicle for high/critical alerts -- Configurable thresholds and patterns -- Non-blocking for low/medium severity -- Blocks critical alerts - ---- - -### 9. 🔄 Reconciliation Backend (NEW) - -**Status**: Fully implemented -**Files**: `server/lib/reconciliation.ts` - -**Features**: -- **Automatic Matching**: Exact and fuzzy transaction matching -- **Multi-Pass Algorithm**: ExternalId → Amount/Date → Description similarity -- **Confidence Scoring**: Match quality indication -- **Reconciliation Summary**: Account balance verification -- **Match Suggestions**: AI-powered match recommendations -- **Bulk Reconciliation**: Mark multiple transactions as reconciled -- **Discrepancy Tracking**: Identify missing transactions - -**Matching Algorithm**: - -**Pass 1 - Exact Match (externalId)**: -```typescript -if (internal.externalId === external.id) { - match(confidence: 1.0, type: 'exact') -} -``` - -**Pass 2 - Amount + Date Match**: -```typescript -if (abs(amount1 - amount2) < 0.01 && - abs(date1 - date2) <= 2 days) { - match(confidence: 0.95, type: 'exact') -} -``` - -**Pass 3 - Fuzzy Match (Levenshtein distance)**: -```typescript -if (abs(amount1 - amount2) < 0.01 && - abs(date1 - date2) <= 5 days && - stringSimilarity(desc1, desc2) > 0.6) { - match(confidence: similarity, type: 'fuzzy') -} -``` - -**Usage Example**: -```typescript -import { reconcileAccount, markAsReconciled } from './lib/reconciliation'; - -// Reconcile account -const summary = await reconcileAccount( - accountId, - tenantId, - statementBalance, - statementTransactions, - startDate, - endDate -); - -console.log(summary); -// { -// accountId: '...', -// accountName: 'Mercury Checking', -// statementBalance: 50000.00, -// bookBalance: 49950.00, -// difference: 50.00, -// matched: 145, -// unmatched: 3, -// missingFromBooks: 1, -// missingFromStatement: 2 -// } - -// Mark as reconciled -await markAsReconciled(transactionIds, tenantId, userId); -``` - ---- - -### 10. 📁 Google Drive Litigation Ingestion (NEW) - -**Status**: Fully implemented -**Files**: `server/lib/google-drive-ingestion.ts` - -**Features**: -- **Automatic Directory Scanning**: Detect litigation cases -- **Financial Document Discovery**: Find financial records and legal costs -- **Batch Import**: Import all legal costs from a case -- **Chronicle Integration**: Log all ingestion events -- **Summary Generation**: Financial summary per case - -**Directory Structure Support**: -``` -LITIGATION/ -└── ARIAS_V_BIANCHI/ - └── CASE_2024D007847/ - ├── C - Business Operations & Financial Records/ - │ ├── ARIBIA LLC Accounting Records/ - │ └── 550 W SURF PROPERTY MANAGEMENT LEDGER.xlsx - └── J - Nicholas Personal Financial/ - └── Legal Costs/ - ├── US LEGAL invoice_06515.pdf - └── Villa Vista Ledger - 1.24.25.pdf -``` - -**Usage Example**: -```typescript -import { - scanLitigationDirectory, - ingestCaseLegalCosts, -} from './lib/google-drive-ingestion'; - -// Scan for cases -const cases = await scanLitigationDirectory(); -console.log(cases); -// [ -// { -// caseName: 'ARIAS_V_BIANCHI', -// caseNumber: '2024D007847', -// path: '/path/to/case', -// financialRecords: [...], -// legalCosts: [...] -// } -// ] - -// Ingest legal costs -const result = await ingestCaseLegalCosts( - 'ARIAS_V_BIANCHI', - tenantId, - legalExpenseAccountId -); -``` - -**API Endpoint**: -```bash -POST /api/litigation/import -{ - "ledgerPath": "/path/to/legal-costs.xlsx", - "accountId": "account-uuid" -} -``` - -**Configuration**: -```bash -GOOGLE_DRIVE_LITIGATION_PATH="/path/to/Google Drive/VAULT/LITIGATION" -``` - ---- - -## 🔧 Configuration Summary - -### Required Environment Variables - -```bash -# Database -DATABASE_URL="postgresql://..." # Neon PostgreSQL -MODE="system" # or "standalone" - -# Authentication -PUBLIC_APP_BASE_URL="http://localhost:5000" -OAUTH_STATE_SECRET="random-32char-secret" - -# AI & ML -OPENAI_API_KEY="sk-..." # Required for ML features - -# Integrations -WAVE_CLIENT_ID="..." -WAVE_CLIENT_SECRET="..." -STRIPE_SECRET_KEY="sk_test_..." -STRIPE_WEBHOOK_SECRET="whsec_..." -CHITTYCONNECT_API_BASE="https://connect.chitty.cc" -CHITTYCONNECT_API_TOKEN="..." - -# ChittyOS Services -CHITTYSCHEMA_URL="https://schema.chitty.cc" -CHITTYCHRONICLE_URL="https://chronicle.chitty.cc" -CHITTYCHRONICLE_TOKEN="service-token" - -# Feature Flags -SKIP_SCHEMA_VALIDATION="false" -SKIP_CHRONICLE_LOGGING="false" - -# Google Drive -GOOGLE_DRIVE_LITIGATION_PATH="/path/to/litigation" -``` - ---- - -## 📊 Impact Summary - -### Code Metrics - -| Metric | Before | After | Change | -|--------|--------|-------|--------| -| Core Modules | 8 | 16 | +100% | -| API Endpoints | ~30 | ~45 | +50% | -| Error Handling | Basic | Comprehensive | ✅ | -| Validation | Zod only | Zod + ChittySchema | ✅ | -| Audit Logging | None | Complete | ✅ | -| ML Features | None | 2 modules | ✅ | -| Security | Basic | Advanced | ✅ | - -### New Capabilities - -**✅ Implemented**: -1. Batch transaction import (CSV/Excel/JSON) -2. Comprehensive error handling with retry -3. API rate limiting -4. ChittySchema validation integration -5. ChittyChronicle audit logging -6. ML-powered transaction categorization -7. Fraud detection & anomaly detection -8. Account reconciliation -9. Google Drive litigation ingestion -10. Circuit breaker pattern for external services - -**⏳ Pending** (not critical): -1. DoorLoop real API integration (currently mock) -2. WebSocket for real-time dashboard updates -3. Reconciliation UI (backend complete, frontend needed) - ---- - -## 🚀 Usage Guide - -### 1. Batch Import Transactions - -```bash -# Download template -curl http://localhost:5000/api/transactions/import/template > template.csv - -# Fill in template and import -curl -X POST http://localhost:5000/api/transactions/import \ - -H "Authorization: Bearer $TOKEN" \ - -F "file=@transactions.csv" \ - -F "accountId=$ACCOUNT_ID" -``` - -### 2. Enable ML Categorization - -```typescript -// In your transaction creation handler -import { categorizeTransaction } from './lib/ml-categorization'; - -const category = await categorizeTransaction( - transaction.description, - transaction.amount, - transaction.type, - transaction.payee -); - -transaction.category = category.category; -transaction.metadata = { - ...transaction.metadata, - categorization: { - confidence: category.confidence, - autoCategor ized: true, - }, -}; -``` - -### 3. Enable Fraud Detection - -```typescript -// Apply middleware globally -import { fraudMonitoringMiddleware } from './lib/fraud-detection'; - -app.use(fraudMonitoringMiddleware); - -// Or check manually -import { analyzeTransaction, calculatePattern } from './lib/fraud-detection'; - -const pattern = await calculatePattern(tenantId); -const alerts = await analyzeTransaction(transaction, pattern); - -if (alerts.some(a => a.severity === 'critical')) { - throw new Error('Transaction blocked'); -} -``` - -### 4. Reconcile Account - -```typescript -import { reconcileAccount } from './lib/reconciliation'; - -const summary = await reconcileAccount( - accountId, - tenantId, - statementBalance, - statementTransactions, - startDate, - endDate -); - -// Review unmatched transactions -console.log(`Unmatched: ${summary.unmatched}`); -console.log(`Difference: $${summary.difference}`); -``` - -### 5. Import Litigation Costs - -```bash -POST /api/litigation/import -{ - "ledgerPath": "/path/to/ARIAS_V_BIANCHI/Legal Costs/invoice.pdf", - "accountId": "legal-expense-account-uuid" -} -``` - ---- - -## 🎯 Performance Improvements - -1. **Retry Logic**: Automatic recovery from transient failures -2. **Circuit Breakers**: Prevent cascading failures, fast-fail on persistent errors -3. **Rate Limiting**: Protect against abuse, prevent external API limits -4. **Batch Processing**: Import 100s of transactions efficiently -5. **Caching**: Rate limiter cleanup, pattern caching - ---- - -## 🔐 Security Improvements - -1. **Rate Limiting**: 100 req/min API, 30 req/min integrations -2. **Circuit Breakers**: Prevent DoS on external services -3. **Fraud Detection**: Real-time anomaly detection -4. **Audit Logging**: Complete transaction history to ChittyChronicle -5. **Schema Validation**: Centralized validation via ChittySchema -6. **Error Handling**: No sensitive data in error messages - ---- - -## 📈 Next Steps (Optional Enhancements) - -1. **WebSocket Integration**: Real-time dashboard updates -2. **Reconciliation UI**: Frontend for reconciliation workflow -3. **DoorLoop API**: Replace mock with real property management API -4. **Multi-Currency Support**: Foreign exchange handling -5. **Advanced Analytics Dashboard**: Visualizations for fraud patterns -6. **Mobile App**: React Native frontend -7. **Export Features**: PDF reports, QFX/OFX export - ---- - -## 📞 Support - -For issues or questions: -- GitHub: https://github.com/chittyos/chittyfinance -- Documentation: See CLAUDE.md for detailed implementation guide -- ChittyOS Docs: See `development/docs/CLAUDE.md` - ---- - -**All major improvements have been successfully implemented! 🎉** diff --git a/INTEGRATION_COMPLETE.md b/INTEGRATION_COMPLETE.md deleted file mode 100755 index 6af92ce..0000000 --- a/INTEGRATION_COMPLETE.md +++ /dev/null @@ -1,366 +0,0 @@ -# ChittyFinance Bookkeeping Integration - COMPLETE ✅ - -## Summary - -All bookkeeping integration modules have been **successfully implemented and integrated** into the ChittyFinance API. This document provides a complete status report of what was accomplished. - -## Completed in This Session - -### 1. API Routes Integration ✅ - -**File**: `server/routes.ts` - -**Added 437 lines of comprehensive API endpoints**: -- 6 Wave Bookkeeping endpoints (invoices, payments, customers, reports, sync) -- 13 ChittyRental Property Management endpoints (properties, units, leases, maintenance, expenses, financials) -- 5 Automated Workflow endpoints (daily, weekly, monthly, quarterly, annual) - -**All endpoints properly integrated with**: -- ChittyConnect authentication (`chittyConnectAuth` middleware) -- Tenant resolution (`resolveTenant` middleware) -- Error handling and logging -- TypeScript type safety - -### 2. API Documentation ✅ - -**File**: `API_BOOKKEEPING.md` (19KB) - -**Comprehensive documentation including**: -- Complete endpoint reference with request/response examples -- Query parameters and request body schemas -- cURL examples for every endpoint -- Error response formats -- Rate limits and circuit breaker information -- Best practices and environment variable requirements -- Support contact information - -### 3. TypeScript Fixes ✅ - -**Fixed storage layer calls in routes.ts**: -- Replaced non-existent `storage.getIntegrationByService()` -- Now using `storage.listIntegrationsByService()` with proper filtering -- All 6 Wave integration endpoints updated correctly - -## Previously Implemented Modules - -### Phase 1: Core Improvements (8 modules) - -**All modules from IMPROVEMENTS_SUMMARY.md**: -1. ✅ `server/lib/batch-import.ts` - CSV/Excel/JSON import (8.9KB) -2. ✅ `server/lib/error-handling.ts` - Retry logic, circuit breakers, rate limiting (14.8KB) -3. ✅ `server/lib/chittyschema-validation.ts` - Schema validation (6.3KB) -4. ✅ `server/lib/chittychronicle-logging.ts` - Audit trail logging (9.3KB) -5. ✅ `server/lib/ml-categorization.ts` - OpenAI categorization (8.0KB) -6. ✅ `server/lib/fraud-detection.ts` - Anomaly detection (11.2KB) -7. ✅ `server/lib/reconciliation.ts` - Bank reconciliation (10.1KB) -8. ✅ `server/lib/google-drive-ingestion.ts` - Litigation data ingestion (5.4KB) - -### Phase 2: Bookkeeping Integrations (4 modules) - -**All modules from BOOKKEEPING_INTEGRATIONS.md**: -1. ✅ `server/lib/wave-bookkeeping.ts` - Full Wave API client (17.0KB) -2. ✅ `server/lib/chittyrental-integration.ts` - Property management (13.7KB) -3. ✅ `server/lib/chittyos-client.ts` - Unified service client (13.6KB) -4. ✅ `server/lib/bookkeeping-workflows.ts` - Automated workflows (14.8KB) - -## Complete API Surface - -### Wave Accounting (6 endpoints) -``` -GET /api/wave/invoices # Fetch invoices -POST /api/wave/invoices # Create invoice -POST /api/wave/invoices/:invoiceId/payments # Record payment -GET /api/wave/customers # List customers -GET /api/wave/reports/profit-loss # P&L report -POST /api/wave/sync # Sync to ChittyFinance -``` - -### ChittyRental Property Management (13 endpoints) -``` -GET /api/rental/properties # List properties -GET /api/rental/properties/:propertyId # Property details -GET /api/rental/properties/:propertyId/units # Property units -GET /api/rental/properties/:propertyId/leases # Property leases -GET /api/rental/leases/:leaseId/payments # Rent payments -POST /api/rental/leases/:leaseId/payments # Record rent payment -GET /api/rental/properties/:propertyId/maintenance # Maintenance requests -POST /api/rental/maintenance # Create maintenance request -GET /api/rental/properties/:propertyId/expenses # Property expenses -POST /api/rental/expenses # Record expense -GET /api/rental/properties/:propertyId/rent-roll # Current rent roll -GET /api/rental/properties/:propertyId/financials # Property financials -GET /api/rental/financials/consolidated # Consolidated financials -POST /api/rental/properties/:propertyId/sync # Sync to ChittyFinance -``` - -### Automated Workflows (5 endpoints) -``` -POST /api/workflows/daily-bookkeeping # Daily sync & categorization -POST /api/workflows/weekly-reconciliation # Weekly reconciliation -POST /api/workflows/monthly-close # Monthly close -POST /api/workflows/quarterly-tax-prep # Quarterly tax prep -POST /api/workflows/year-end-close # Year-end close -``` - -### Batch Import (3 endpoints - previously implemented) -``` -POST /api/transactions/import # Bulk import transactions -GET /api/transactions/import/template # Download CSV template -POST /api/litigation/import # Import legal costs -``` - -## Architecture Highlights - -### 1. Unified ChittyOS Client Package -**`server/lib/chittyos-client.ts`** - -- Base `ChittyOSClient` class with common HTTP methods -- 7 service-specific clients: - - `ChittyIDClient` - Identity generation - - `ChittyAuthClient` - Authentication tokens - - `ChittyConnectClient` - Integration hub - - `ChittySchemaClient` - Schema validation - - `ChittyChronicleClient` - Audit logging - - `ChittyRegistryClient` - Service discovery - - `ChittyRentalClient` - Property management - -- Factory pattern with caching (`ChittyOSClientFactory`) -- Built-in circuit breakers and retry logic -- Health monitoring for all services -- **Extractable to `@chittyos/client` npm package** - -### 2. Automated Bookkeeping Workflows -**`server/lib/bookkeeping-workflows.ts`** - -**Daily Workflow**: -- Sync Wave invoices & expenses -- Sync rental property data -- Auto-categorize up to 50 uncategorized transactions -- Detect anomalies -- Log to ChittyChronicle - -**Weekly Workflow**: -- Reconcile all accounts -- Generate discrepancy reports -- Alert on unreconciled items - -**Monthly Workflow**: -- Generate P&L statement -- Calculate balance sheet -- Prepare tax summary -- Close period -- Archive transactions - -**Quarterly Workflow**: -- Calculate quarterly income/expenses -- Generate deductions by category -- Estimate tax payments - -**Annual Workflow**: -- Generate annual statements -- Calculate full-year metrics -- Prepare for tax filing -- Generate audit reports - -**WorkflowScheduler** class for automation (can be triggered via cron) - -### 3. Error Handling Infrastructure -**`server/lib/error-handling.ts`** - -- **Custom error types**: `APIError`, `RateLimitError`, `ValidationError`, `IntegrationError` -- **Exponential backoff retry** with jitter -- **Circuit breaker pattern** (5 failures → 60s cooldown) -- **Rate limiting**: - - API: 100 req/min per tenant - - Integrations: 30 req/min per integration -- **Global instances** for mercury, wave, stripe, doorloop, github - -### 4. ML-Powered Features -**`server/lib/ml-categorization.ts`** - -- OpenAI GPT-4o-mini for transaction categorization -- Few-shot learning with historical data -- Confidence scoring -- Fallback rule-based categorization -- Batch processing support - -**`server/lib/fraud-detection.ts`** - -- Z-score anomaly detection -- Velocity checks (rapid transactions) -- Suspicious payee detection -- Round number analysis -- Time anomaly detection -- ML-based pattern recognition -- Money laundering detection (layering) - -## Environment Variables Required - -### Wave Accounting -```bash -WAVE_CLIENT_ID=your_wave_client_id -WAVE_CLIENT_SECRET=your_wave_client_secret -WAVE_REDIRECT_URI=https://finance.chitty.cc/api/integrations/wave/callback -``` - -### ChittyRental -```bash -CHITTYRENTAL_URL=https://rental.chitty.cc -CHITTYRENTAL_TOKEN=your_service_token -``` - -### ChittyChronicle (Audit Logging) -```bash -CHITTYCHRONICLE_URL=https://chronicle.chitty.cc -CHITTYCHRONICLE_TOKEN=your_service_token -``` - -### OpenAI (ML Features) -```bash -OPENAI_API_KEY=your_openai_api_key -``` - -## Testing the Integration - -### 1. Wave Bookkeeping - -**Sync Wave data**: -```bash -curl -X POST "http://localhost:5000/api/wave/sync" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - -**Fetch invoices**: -```bash -curl -X GET "http://localhost:5000/api/wave/invoices?status=PAID" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - -**Generate P&L report**: -```bash -curl -X GET "http://localhost:5000/api/wave/reports/profit-loss?startDate=2024-01-01&endDate=2024-12-31" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - -### 2. ChittyRental Property Management - -**List properties**: -```bash -curl -X GET "http://localhost:5000/api/rental/properties" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - -**Get rent roll**: -```bash -curl -X GET "http://localhost:5000/api/rental/properties/property_123/rent-roll" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - -**Get property financials**: -```bash -curl -X GET "http://localhost:5000/api/rental/properties/property_123/financials?startDate=2024-01-01&endDate=2024-12-31" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - -### 3. Automated Workflows - -**Run daily bookkeeping**: -```bash -curl -X POST "http://localhost:5000/api/workflows/daily-bookkeeping" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - -**Run monthly close**: -```bash -curl -X POST "http://localhost:5000/api/workflows/monthly-close" \ - -H "Authorization: Bearer YOUR_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{"month": 12, "year": 2024}' -``` - -## Deployment Checklist - -- [x] All modules implemented -- [x] API routes integrated -- [x] TypeScript errors fixed -- [x] API documentation complete -- [ ] Environment variables configured -- [ ] Wave OAuth integration tested -- [ ] ChittyRental service connection tested -- [ ] Workflow scheduler configured (cron) -- [ ] Production deployment -- [ ] Monitoring setup (ChittyChronicle) - -## Next Steps (Optional) - -1. **Frontend Integration**: - - Add Wave invoicing UI - - Property management dashboard - - Workflow execution controls - - Financial reporting views - -2. **Scheduled Workflows**: - - Set up cron jobs for automated workflows - - Configure workflow scheduler - - Add workflow monitoring - -3. **Testing**: - - Integration tests for all endpoints - - End-to-end workflow tests - - Load testing for rate limiters - -4. **Monitoring**: - - Set up ChittyChronicle event monitoring - - Configure alerting for workflow failures - - Track API usage and rate limits - -5. **Extract ChittyOS Client**: - - Publish `@chittyos/client` to npm - - Add to other ChittyOS services - - Version and maintain separately - -## File Summary - -### New Files Created (This Session) -- `API_BOOKKEEPING.md` (19KB) - Comprehensive API documentation - -### Modified Files (This Session) -- `server/routes.ts` (+437 lines) - API endpoint integration - -### Previously Created Files (Phase 1 & 2) -- 12 implementation modules (~125KB total code) -- 2 documentation files (39KB total docs) - -### Total Implementation -- **14 new TypeScript modules** -- **~125KB of production code** -- **~58KB of documentation** -- **27 new API endpoints** (24 bookkeeping + 3 batch import) -- **500+ lines of API routes** - -## Status: PRODUCTION READY ✅ - -All bookkeeping integration work is **complete and production-ready**. The API is fully functional, documented, and integrated with proper error handling, authentication, and tenant isolation. - -**What works now**: -- ✅ Wave Accounting integration (invoices, payments, customers, reports, sync) -- ✅ ChittyRental property management (properties, leases, rent, maintenance, expenses) -- ✅ Automated bookkeeping workflows (daily, weekly, monthly, quarterly, annual) -- ✅ Batch import for historical data -- ✅ ML-powered categorization and fraud detection -- ✅ Bank reconciliation with fuzzy matching -- ✅ Comprehensive error handling and rate limiting -- ✅ Audit trail logging to ChittyChronicle -- ✅ Schema validation via ChittySchema - -**Ready for**: -- Production deployment to Cloudflare Workers -- Frontend UI implementation -- Workflow automation via cron -- ChittyOS ecosystem integration - ---- - -**Implementation Date**: December 9, 2024 -**Status**: Complete -**Next Phase**: Frontend UI or Production Deployment diff --git a/PHASE2-COMPLETE.md b/PHASE2-COMPLETE.md deleted file mode 100755 index 227167c..0000000 --- a/PHASE2-COMPLETE.md +++ /dev/null @@ -1,120 +0,0 @@ -# Phase 2: Multi-Tenant Implementation - COMPLETE - -## ✓ Implemented - -### Backend -- **server/storage-system.ts**: Tenant-aware storage layer using `database/system.schema.ts` - - UUID-based IDs for distributed systems - - Tenant isolation for all financial operations - - Financial summary aggregation per tenant - -- **server/middleware/tenant.ts**: Enhanced with access validation - - `resolveTenant`: Validates user has access to requested tenant - - `optionalTenant`: Non-blocking tenant resolution - - Reads from: `X-Tenant-ID` header → `tenantId` query param → user's first tenant - -- **server/routes.ts**: New tenant-aware endpoints (system mode only) - - `GET /api/tenants` - List user's accessible tenants - - `GET /api/tenants/:id` - Get specific tenant details - - `GET /api/accounts` (tenant-scoped) - List accounts for current tenant - - `GET /api/transactions` (tenant-scoped) - List transactions for current tenant - -### Frontend -- **client/src/components/layout/TenantSwitcher.tsx**: Dropdown for tenant switching - - Shows tenant name, type, and user's role - - Persists selection in localStorage - - Triggers full page reload to refetch tenant-scoped data - -- **client/src/components/layout/Sidebar.tsx**: Integrated tenant switcher - - Conditionally shown only in system mode - - Positioned above user profile section - -## Testing - -### Database Setup -```bash -# System mode: Create tables and seed IT CAN BE LLC structure -MODE=system npm run db:push:system -npm run db:seed -``` - -**Expected:** 7 tenants, 2 users created - -### Start Server -```bash -MODE=system npm run dev -``` - -### API Tests - -**List tenants for user:** -```bash -curl http://localhost:5000/api/tenants -``` - -**Get specific tenant:** -```bash -curl http://localhost:5000/api/tenants/{tenant-id} -``` - -**Get accounts (tenant-scoped):** -```bash -curl -H "X-Tenant-ID: {tenant-id}" http://localhost:5000/api/accounts -``` - -**Get transactions (tenant-scoped):** -```bash -curl -H "X-Tenant-ID: {tenant-id}" http://localhost:5000/api/transactions -``` - -### Frontend Test - -1. Start dev server: `MODE=system npm run dev` -2. Navigate to http://localhost:5000 -3. Check sidebar for tenant switcher dropdown -4. Select different tenants and verify data changes - -## IT CAN BE LLC Tenant Structure - -``` -IT CAN BE LLC (holding) -├── JEAN ARLENE VENTURING LLC (personal, 85% owner) -├── ARIBIA LLC (series, 100% owned) -│ ├── ARIBIA LLC - MGMT (management) -│ ├── ARIBIA LLC - CITY STUDIO (property: 550 W Surf St C211) -│ └── ARIBIA LLC - APT ARLENE (property: 4343 N Clarendon #1610) -└── ChittyCorp LLC (holding, pending formation) -``` - -## Environment Variables - -**Required for system mode:** -```bash -MODE=system -DATABASE_URL=postgresql://... -CHITTYCONNECT_API_BASE=https://connect.chitty.cc -CHITTYCONNECT_API_TOKEN=... -``` - -## Deployment Readiness - -✓ Type check passes -✓ Dual-mode architecture (standalone/system) -✓ Tenant isolation enforced at middleware level -✓ Frontend adapts to mode (tenant switcher only in system mode) -✓ Backward compatible with standalone mode - -## Next Steps (Phase 3) - -- Property management features (rent roll, leases) -- Real integrations (Mercury, Wave APIs) -- ChittyID authentication -- Inter-company transaction tracking -- Consolidated reporting across tenants - -## Token Efficiency - -**Total implementation:** <20k tokens -**Files created:** 2 (storage-system.ts, TenantSwitcher.tsx) -**Files modified:** 4 (routes.ts, tenant.ts, Sidebar.tsx, PHASE2-COMPLETE.md) -**Testing time:** ~5 min (db seed → server start → API test) diff --git a/PHASE_COMPLETION_SUMMARY.md b/PHASE_COMPLETION_SUMMARY.md deleted file mode 100755 index 9864e6a..0000000 --- a/PHASE_COMPLETION_SUMMARY.md +++ /dev/null @@ -1,417 +0,0 @@ -# ChittyFinance - Phase Completion Summary - -**Last Updated**: 2025-12-01 -**Current Status**: Phase 1 COMPLETE ✅ | Phase 3 COMPLETE ✅ | Phase 4 IN PROGRESS (70%) - ---- - -## 🎉 Major Accomplishments - -### Phase 1: Multi-Tenant Architecture (COMPLETE ✅) - -**Backend Infrastructure:** -- ✅ Extended `storage-system.ts` with complete tenant-scoped operations -- ✅ Created `storage-adapter.ts` for automatic mode switching -- ✅ Built `storage-helpers.ts` for request-aware data access -- ✅ Updated all API routes to support dual-mode operation -- ✅ Tenant middleware with access control validation -- ✅ Database seeding script for IT CAN BE LLC structure - -**Frontend Infrastructure:** -- ✅ Created `TenantContext` with automatic mode detection -- ✅ Built `TenantSwitcher` component with rich dropdown UI -- ✅ Integrated tenant context into App.tsx -- ✅ Added tenant switcher to Header component -- ✅ Automatic tenant selection and localStorage persistence - -**Key Features:** -- Dual-mode operation (standalone/system) with zero code changes -- Tenant-scoped data isolation for all entities -- Role-based access control (owner, admin, manager, viewer) -- Clean tenant switching with automatic data refresh - ---- - -### Phase 3: Real Third-Party Integrations (COMPLETE ✅) - -**Wave Accounting Integration:** -- ✅ Complete OAuth 2.0 flow with CSRF protection -- ✅ GraphQL API client (`server/lib/wave-api.ts`) -- ✅ Token refresh mechanism -- ✅ Real-time invoice, expense, and financial data - -**Stripe Payment Processing:** -- ✅ Customer management with tenant metadata -- ✅ Checkout session creation for ad-hoc payments -- ✅ Webhook verification and idempotent event processing -- ✅ Complete payment flow - -**Mercury Bank Integration:** -- ✅ Multi-account support via ChittyConnect -- ✅ Account selection and balance sync -- ✅ Static egress IP compliance -- ✅ Real transaction data - -**Security & Infrastructure:** -- ✅ CSRF-protected OAuth flows (`server/lib/oauth-state.ts`) -- ✅ Integration configuration validation -- ✅ Webhook event deduplication (`webhook_events` table) -- ✅ Comprehensive error handling -- ✅ Integration status monitoring endpoint - ---- - -### Phase 4: Property Management (70% COMPLETE) - -**Completed:** -- ✅ Property management API endpoints - - `GET /api/properties` - List tenant's properties - - `GET /api/properties/:id` - Get property details - - `GET /api/properties/:id/units` - Get units - - `GET /api/properties/:id/leases` - Get leases -- ✅ System status endpoint (`/api/v1/status`) -- ✅ Property portfolio dashboard UI - - Portfolio summary (total value, equity, occupancy) - - Property cards with occupancy stats - - Lease expiration warnings - - Unit and rent tracking -- ✅ Navigation (Sidebar link, App route) - -**Remaining:** -- ⏳ ValuationConsole integration with live property data -- ⏳ Rent roll tracking feature -- ⏳ Lease management interface -- ⏳ Maintenance request system - ---- - -## 📁 Project Structure - -### Backend (`/server`) - -``` -server/ -├── index.ts # Express server entry -├── routes.ts # API route definitions (multi-tenant aware) -├── db.ts # Mode-aware database connection -├── storage.ts # Standalone storage (SQLite) -├── storage-system.ts # System storage (PostgreSQL, multi-tenant) -├── storage-adapter.ts # Unified storage interface -├── middleware/ -│ ├── auth.ts # ChittyConnect + service auth -│ └── tenant.ts # Tenant resolution & validation -└── lib/ - ├── oauth-state.ts # Secure OAuth state tokens (CSRF protection) - ├── integration-validation.ts # Integration config validation - ├── storage-helpers.ts # Request-aware storage wrappers - ├── wave-api.ts # Wave GraphQL client - ├── stripe.ts # Stripe payment processing - ├── chittyConnect.ts # Mercury via ChittyConnect - └── financialServices.ts # Aggregated financial data -``` - -### Frontend (`/client/src`) - -``` -client/src/ -├── App.tsx # Main app with tenant context -├── contexts/ -│ ├── TenantContext.tsx # Multi-tenant state management -│ └── ThemeContext.tsx # Dark/light mode -├── components/ -│ ├── TenantSwitcher.tsx # Tenant dropdown (system mode) -│ └── layout/ -│ ├── Header.tsx # Header with tenant switcher -│ └── Sidebar.tsx # Navigation with Properties link -└── pages/ - ├── Dashboard.tsx # Financial overview - ├── Properties.tsx # Property portfolio dashboard ✨ NEW - ├── Connections.tsx # Integration management - ├── ValuationConsole.tsx # Property valuation tool - └── Settings.tsx # User settings -``` - -### Database (`/database`) - -``` -database/ -├── system.schema.ts # Multi-tenant PostgreSQL schema -├── standalone.schema.ts # Single-tenant SQLite schema -└── seeds/ - └── it-can-be-llc.ts # IT CAN BE LLC entity structure -``` - ---- - -## 🚀 Quick Start - -### Standalone Mode (Development) - -```bash -# Install dependencies -npm install - -# Initialize SQLite database -npm run db:push:standalone - -# Start development server -npm run dev -# or explicitly: -npm run dev:standalone -``` - -**Access**: http://localhost:5000 - -### System Mode (Multi-Tenant) - -```bash -# Set up PostgreSQL database (Neon) -export DATABASE_URL="postgresql://user:pass@host/dbname" - -# Initialize PostgreSQL schema -MODE=system npm run db:push:system - -# Seed IT CAN BE LLC entity structure -npm run db:seed - -# Start in system mode -npm run dev:system -``` - -**Demo Users Created by Seed:** -- Nicholas Bianchi (`demo@itcanbe.llc`) -- Sharon E Jones (manager access) - -**Tenants Created:** -1. IT CAN BE LLC (holding) -2. JEAN ARLENE VENTURING LLC (personal, 85% owner) -3. ARIBIA LLC (series parent) -4. ARIBIA LLC - MGMT (management) -5. ARIBIA LLC - CITY STUDIO (property: 550 W Surf St C211) -6. ARIBIA LLC - APT ARLENE (property: 4343 N Clarendon #1610) -7. ChittyCorp LLC (pending formation) - ---- - -## 🔑 Environment Variables - -### Required - -```bash -# Database -DATABASE_URL="postgresql://..." # System mode -# or -SQLITE_FILE="./chittyfinance.db" # Standalone mode (optional) - -# Mode -MODE="standalone" # or "system" -NODE_ENV="development" # or "production" -PUBLIC_APP_BASE_URL="http://localhost:5000" -``` - -### OAuth Security (Production Required) - -```bash -OAUTH_STATE_SECRET="random-32char-string" # HMAC secret for OAuth state -``` - -### Integrations - -```bash -# Wave Accounting -WAVE_CLIENT_ID="..." -WAVE_CLIENT_SECRET="..." -WAVE_REDIRECT_URI="http://localhost:5000/api/integrations/wave/callback" - -# Stripe -STRIPE_SECRET_KEY="sk_test_..." -STRIPE_PUBLISHABLE_KEY="pk_test_..." -STRIPE_WEBHOOK_SECRET="whsec_..." - -# Mercury Bank (via ChittyConnect) -CHITTYCONNECT_API_BASE="https://connect.chitty.cc" -CHITTYCONNECT_API_TOKEN="..." - -# AI Features -OPENAI_API_KEY="sk-..." -``` - ---- - -## 📊 API Endpoints - -### System Mode Only - -**Tenants:** -- `GET /api/tenants` - List user's accessible tenants -- `GET /api/tenants/:id` - Get tenant details - -**Properties:** -- `GET /api/properties` - List tenant's properties -- `GET /api/properties/:id` - Get property details -- `GET /api/properties/:id/units` - Get property units -- `GET /api/properties/:id/leases` - Get property leases - -### Multi-Mode (Tenant-Aware) - -**Integrations:** -- `GET /api/integrations` - List integrations (tenant-scoped in system mode) -- `GET /api/integrations/status` - Check integration config -- `POST /api/integrations` - Create integration -- `PATCH /api/integrations/:id` - Update integration - -**Wave Accounting:** -- `GET /api/integrations/wave/authorize` - Start OAuth flow -- `GET /api/integrations/wave/callback` - OAuth callback -- `POST /api/integrations/wave/refresh` - Refresh token - -**Stripe:** -- `POST /api/integrations/stripe/connect` - Create customer -- `POST /api/integrations/stripe/checkout` - Create payment session -- `POST /api/integrations/stripe/webhook` - Webhook handler - -**Mercury:** -- `GET /api/mercury/accounts` - List accounts -- `POST /api/mercury/select-accounts` - Select accounts to sync -- `POST /api/integrations/mercury/webhook` - Webhook handler - -**Tasks:** -- `GET /api/tasks` - List tasks (tenant-scoped) -- `POST /api/tasks` - Create task -- `PATCH /api/tasks/:id` - Update task - -**AI:** -- `GET /api/ai-messages` - Get AI conversation (tenant-scoped) -- `POST /api/ai/advice` - Get financial advice -- `POST /api/ai/message` - Conversational AI - ---- - -## 🧪 Testing Multi-Tenant System - -### 1. Database Setup - -```bash -# Push system schema -MODE=system npm run db:push:system - -# Seed IT CAN BE LLC structure -npm run db:seed -``` - -### 2. Start Server - -```bash -MODE=system npm run dev:system -``` - -### 3. Test Tenant Switching - -1. Navigate to http://localhost:5000 -2. Log in (auto-login as demo user) -3. Look for tenant switcher in header (top right) -4. Switch between tenants: - - IT CAN BE LLC (holding) - - ARIBIA LLC - CITY STUDIO (property) - - ARIBIA LLC - MGMT (management) -5. Verify data updates when switching - -### 4. Test Property Management - -1. Switch to "ARIBIA LLC - CITY STUDIO" tenant -2. Click "Properties" in sidebar -3. Should see: City Studio property (550 W Surf St C211) -4. Verify occupancy and rent data displays - -5. Switch to "ARIBIA LLC - APT ARLENE" tenant -6. Navigate to Properties -7. Should see: Apt Arlene property (4343 N Clarendon #1610) -8. Verify data is different from City Studio - -### 5. Test Data Isolation - -```bash -# Test via API -curl http://localhost:5000/api/properties \ - -H "X-Tenant-ID: " - -# Should only return City Studio property - -curl http://localhost:5000/api/properties \ - -H "X-Tenant-ID: " - -# Should only return Apt Arlene property -``` - ---- - -## 🎯 Next Steps - -### Immediate (Phase 4 Completion) - -1. **Integrate ValuationConsole** with live property data - - Connect to `/api/properties/:id` endpoint - - Pull real purchase price, current value - - Link to City Studio tenant - -2. **Build Rent Roll Feature** - - Monthly rent collection tracking - - Payment status per lease - - Overdue rent alerts - -3. **Lease Management Interface** - - Create/edit leases - - Tenant information management - - Lease renewal workflows - -### Future Phases - -**Phase 5: ChittyOS Ecosystem Integration** -- Replace demo auth with ChittyID -- Expose financial data as MCP resources -- Log to ChittyChronicle (audit trail) -- Issue ChittyCert certificates - -**Phase 6: Advanced Features** -- Consolidated reporting across all entities -- Inter-company allocation automation -- Tax optimization and reporting -- Advanced AI forecasting -- Mobile app (React Native) - ---- - -## 📝 Recent Commits - -``` -c9a4ebb - feat: complete property portfolio dashboard UI (Phase 4) -9976d4c - feat: add property management API endpoints (Phase 4 start) -69a68b9 - feat: complete Phase 1 frontend - multi-tenant UI -2962a43 - feat: complete Phase 1 routes - multi-tenant request handling -83a7ff3 - feat: complete Phase 1 backend multi-tenant infrastructure -ae6dbf8 - docs: update CLAUDE.md with Phase 3 completion details -f7b3de4 - chore: add OAuth security and integration validation -``` - ---- - -## 🔒 Security Features - -1. **OAuth CSRF Protection** - HMAC-signed state tokens with 10-min expiration -2. **Webhook Verification** - Signature validation for Stripe/Mercury webhooks -3. **Tenant Isolation** - All queries scoped to current tenant -4. **Role-Based Access** - Owner, admin, manager, viewer permissions -5. **Integration Validation** - Config checks before allowing connections - ---- - -## 📚 Documentation - -- **Project Overview**: `/CLAUDE.md` -- **ChittyOS Ecosystem**: `/Users/nb/Projects/development/CLAUDE.md` -- **System Schema**: `/database/system.schema.ts` -- **Standalone Schema**: `/database/standalone.schema.ts` - ---- - -**Status**: Ready for Phase 4 completion and testing! 🚀 diff --git a/UNIVERSAL_CONNECTOR.md b/UNIVERSAL_CONNECTOR.md deleted file mode 100755 index 91ab431..0000000 --- a/UNIVERSAL_CONNECTOR.md +++ /dev/null @@ -1,231 +0,0 @@ -# Universal Connector API Documentation - -The Chitty Services CFO Platform provides a Universal Connector API endpoint that standardizes financial data from various connected platforms into a consistent format. This enables seamless integration with external applications and services. - -## Endpoints - -### Public Endpoint (No Authentication) - -``` -GET /api/universal-connector -``` - -This endpoint provides access to financial data without requiring authentication. It's useful for development and testing purposes. - -### Authenticated Endpoint - -``` -GET /api/universal-connector/secured -``` - -This endpoint requires Replit Auth authentication. It provides the same data as the public endpoint but includes additional authentication information. - -## Response Format - -The Universal Connector API returns data in the following format: - -```json -{ - "version": "1.0", - "timestamp": "2025-05-08T12:34:56.789Z", - "source": "ChittyServices-CFO", - "accountId": 1, - "authInfo": { - "authenticatedUserId": "12345", - "authenticatedAt": "2025-05-08T12:34:56.789Z", - "authMethod": "replit_auth" - }, - "data": { - "summary": { - "cashOnHand": 539044.05, - "monthlyRevenue": 245893.00, - "monthlyExpenses": 157663.05, - "outstandingInvoices": 60000.25, - "metrics": { - "cashflow": 97650.50, - "runway": 5.02, - "burnRate": 108401.50, - "growthRate": 12.50, - "customerAcquisitionCost": 125.30, - "lifetimeValue": 950.75 - } - }, - "transactions": [ - { - "id": "stripe-1", - "title": "Subscription Payment", - "description": "Monthly subscription payment", - "amount": 49.99, - "type": "income", - "date": "2025-05-07T10:00:00.000Z", - "category": "Subscription", - "status": "completed", - "paymentMethod": "credit_card", - "source": "stripe" - } - ], - "recurringCharges": [ - { - "id": "merc-charge-1", - "merchantName": "Adobe Creative Cloud", - "amount": 52.99, - "date": "2025-04-23T17:58:27.917Z", - "category": "Software", - "recurring": true, - "nextChargeDate": "2025-05-23T17:58:27.917Z", - "subscriptionId": "adobe-sub-123", - "source": "mercury_bank" - } - ], - "optimizations": [ - { - "chargeId": "merc-charge-1", - "merchantName": "Adobe Creative Cloud", - "currentAmount": 52.99, - "suggestedAction": "downgrade", - "potentialSavings": 20.00, - "reasoning": "You're not using all features of the full Creative Cloud suite. Consider downgrading to the Photography plan.", - "alternativeOptions": ["Photography Plan ($9.99/mo)", "Single App ($20.99/mo)"] - } - ], - "payroll": { - "totalEmployees": 25, - "payrollAmount": 75000.00, - "nextPayrollDate": "2025-05-15T00:00:00.000Z", - "taxes": { - "federal": 15000.00, - "state": 5000.00, - "local": 2000.00 - } - } - }, - "connectedServices": [ - { - "id": "1", - "name": "Mercury Bank", - "type": "mercury_bank", - "lastSynced": "2025-05-08T08:40:24.088Z" - }, - { - "id": "5", - "name": "Stripe", - "type": "stripe", - "lastSynced": "2025-05-08T08:40:24.088Z" - } - ] -} -``` - -## Field Descriptions - -### Top-Level Fields - -- `version`: The version of the Universal Connector API format (currently "1.0") -- `timestamp`: ISO 8601 timestamp of when the response was generated -- `source`: Identifier for the source system ("ChittyServices-CFO") -- `accountId`: Unique identifier for the account in the source system -- `authInfo`: (Only in authenticated endpoint) Information about the authenticated user -- `data`: Contains all financial data -- `connectedServices`: List of all connected financial services - -### Data Fields - -#### Summary - -- `cashOnHand`: Current available cash -- `monthlyRevenue`: Average monthly revenue -- `monthlyExpenses`: Average monthly expenses -- `outstandingInvoices`: Total value of unpaid invoices -- `metrics`: Key financial metrics - - `cashflow`: Net cash flow (income minus expenses) - - `runway`: Number of months until cash runs out at current burn rate - - `burnRate`: Monthly cash burn rate - - `growthRate`: Percentage revenue growth rate - - `customerAcquisitionCost`: Average cost to acquire a new customer - - `lifetimeValue`: Average lifetime value of a customer - -#### Transactions - -Array of financial transactions with the following fields: -- `id`: Unique transaction identifier -- `title`: Transaction title/name -- `description`: Detailed description -- `amount`: Transaction amount -- `type`: Transaction type ("income" or "expense") -- `date`: ISO 8601 timestamp of the transaction -- `category`: Transaction category -- `status`: Transaction status (e.g., "pending" or "completed") -- `paymentMethod`: Method of payment -- `source`: Source financial platform - -#### Recurring Charges - -Array of recurring subscription charges with the following fields: -- `id`: Unique charge identifier -- `merchantName`: Name of the merchant/vendor -- `amount`: Charge amount -- `date`: ISO 8601 timestamp of the most recent charge -- `category`: Charge category -- `recurring`: Boolean indicating if this is a recurring charge -- `nextChargeDate`: ISO 8601 timestamp of the next expected charge date -- `subscriptionId`: Subscription identifier (if available) -- `source`: Source financial platform - -#### Optimizations - -Array of suggested optimizations for recurring charges: -- `chargeId`: Identifier of the charge to optimize -- `merchantName`: Name of the merchant/vendor -- `currentAmount`: Current charge amount -- `suggestedAction`: Recommended action ("cancel", "downgrade", "consolidate", or "negotiate") -- `potentialSavings`: Estimated monthly savings -- `reasoning`: Explanation for the recommendation -- `alternativeOptions`: Array of alternative options (if available) - -#### Payroll - -Payroll information with the following fields: -- `totalEmployees`: Number of employees -- `payrollAmount`: Total payroll amount -- `nextPayrollDate`: ISO 8601 timestamp of the next payroll date -- `taxes`: Breakdown of payroll taxes - - `federal`: Federal tax amount - - `state`: State tax amount - - `local`: Local tax amount - -### Connected Services - -Array of connected financial platforms with the following fields: -- `id`: Service identifier -- `name`: Display name of the service -- `type`: Service type identifier -- `lastSynced`: ISO 8601 timestamp of when the service was last synced - -## Source Identifiers - -The following source identifiers are used in the response: - -- `mercury_bank`: Mercury Bank (business banking) -- `wavapps`: WavApps (accounting) -- `doorloop`: DoorLoop (property management) -- `stripe`: Stripe (payment processing) -- `quickbooks`: QuickBooks (accounting) -- `xero`: Xero (international accounting) -- `brex`: Brex (business credit cards & expense management) -- `gusto`: Gusto (payroll & HR) - -## Error Responses - -If an error occurs, the API will return a JSON object with the following structure: - -```json -{ - "success": false, - "message": "Error message describing what went wrong" -} -``` - -Common error responses: - -- `404 Not Found`: User not found -- `500 Internal Server Error`: Error generating universal connector data \ No newline at end of file diff --git a/Unmatched_Timeline_Documents_for_Extraction.csv b/Unmatched_Timeline_Documents_for_Extraction.csv deleted file mode 100755 index e355d0b..0000000 --- a/Unmatched_Timeline_Documents_for_Extraction.csv +++ /dev/null @@ -1,434 +0,0 @@ -,Date,Document_Name,Category,File_Path,File_Size,Checksum_SHA256,Page_Count,Evidence_ID,Bates_Start,Bates_End,Bates_Status,Exhibit_ID -1,2024-11-08 13:39:19-0600,2023-06-12 - Lease Agreement - Luisa Arias 06 01 2023.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-06-12 - Lease Agreement - Luisa Arias 06 01 2023.pdf,4203124,223ee04903b7a2c1b2f5ff16181c12125f2f95aa4b90d67e44e99f355a9a64a8,,,,,, -3,2025-04-20 18:34:35-0500,2023-06-07 - Lease Agreement - Nick Bianchi W Addison 3S 06 01 2023.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-06-07 - Lease Agreement - Nick Bianchi W Addison 3S 06 01 2023.pdf,4208897,b7c86b83209280d0e9516e01d09fdbc53a9e27ff58be58ed3c7c885345fe4888,,,,,, -5,2025-04-20 18:34:35-0500,2025-02-24 - Member Equity Reduction Transaction Details Report.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2025-02-24 - Member Equity Reduction Transaction Details Report.pdf,287129,bf997ce451ed0b3d313695709a95126d747f8e33b09225a4d2730eef147594b3,,,,,, -6,2025-04-20 18:34:35-0500,Cozy Castle Account Statement.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Cozy Castle Account Statement.pdf,225022,cb9a092a11d5ec5361aaef6ac033bac9f8393024980c6083604ffbc54b81f32e,,,,,, -10,2025-04-20 18:35:51-0500,2024-09-17 - Updated ARIBIA LLC Valuation Statement & Acknowledgment.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-09-17 - Updated ARIBIA LLC Valuation Statement & Acknowledgment.pdf,46354,66491e9f85e2bacdaf27a0acdd95871ca81e9818f2a3a2356678c5788cf8169c,,,,,, -11,2025-04-20 18:35:51-0500,2024-09-24 - Re Updated ARIBIA LLC Valuation Statement & Acknowledgment.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-09-24 - Re Updated ARIBIA LLC Valuation Statement & Acknowledgment.pdf,6815189,3e0038348c9b80b39fc4754387e60723e7218f27390d175f0c171bc3996c30e2,,,,,, -23,2025-05-04 15:03:29-0500,2023-09-01 - Lease - Morada Mami Camilo Arias.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-09-01 - Lease - Morada Mami Camilo Arias.pdf,342121,e5808d712899eb398f32eb0c6e5f8665334bb6d0d447c20a71650c77743876b0,,,,,, -25,2025-05-14 09:25:30-0500,EXHIBIT A Verified Property Ownership & Funding Timeline.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/EXHIBIT A Verified Property Ownership & Funding Timeline.pdf,105464,ce0260e96fbcdb3e6bb83f9372a7360012698f8ae7219022e6b5b36c5b47e4f8,,,,,, -26,2025-05-14 09:25:33-0500,2024-06-25 - Rental Addendum 06 25 2024.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-06-25 - Rental Addendum 06 25 2024.pdf,373556,98aaaf1d7ce29648319f64b82f21c5ffb67a0d61255302289500ce251ff9a808,,,,,, -30,2025-05-14 09:26:28-0500,Atch 3 re Bianchi FORMAL REQUEST FOR REPAYMENT – PINE GROVE.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Atch 3 re Bianchi FORMAL REQUEST FOR REPAYMENT – PINE GROVE.pdf,306360,1763c8acec2bdcbadf36020882999b638d82469e2b8082534a4766545d568590,,,,,, -35,2025-05-18 15:54:11-0500,Lease - 2021 Pine Grove Co Sign Bianchi (attachment 1).pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease - 2021 Pine Grove Co Sign Bianchi (attachment 1).pdf,2976531,3c8af588a1c4216ed854465baaf9173f459da75865bff9ffd69d67c0785a3276,,,,,, -42,2025-10-30 03:34:46-0500,2024-10-29 - Operating Agreement - of IT CAN BE LLC.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-10-29 - Operating Agreement - of IT CAN BE LLC.pdf,593279,03685a1c605b1013198f5aa456b31c623a3833e68587bb3662cf3b5cae6c7c31,,,,,, -44,2025-10-30 03:36:11-0500,2023-03-20 - Operating Agreement - Retroactive Amendment to ARIBIA LLC.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-03-20 - Operating Agreement - Retroactive Amendment to ARIBIA LLC.pdf,657509,fca5be590f607f6cb76db09d19edafb6084a9a353bd2be68b6a8a8ec84e79c5c,,,,,, -45,2025-10-30 03:39:07-0500,Agreement - Shareholder.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Agreement - Shareholder.pdf,686605,e5f74b4b206b62fbe4444084edbbc1a6afdfc7ffcd0f5206bad9451663b42f70,,,,,, -46,2025-10-30 03:40:00-0500,2024-03-01 - Operating Agreement - ARIBIA LLC AMENDMENT TO.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-01 - Operating Agreement - ARIBIA LLC AMENDMENT TO.pdf,717749,5b8be4c3d3a86323161f951fdc0cd13c7b0044188b2c4dcf4f48b726fee3ed99,,,,,, -47,2025-10-30 03:41:04-0500,Agreement - Aribia Property Manager.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Agreement - Aribia Property Manager.pdf,404325,af66ae79c55a5b0ee43f1052afcf09ca676afe759d5669c82f364b2f00b20cab,,,,,, -49,2025-10-30 14:06:04-0500,Agreement - LLC Operating.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Agreement - LLC Operating.pdf,634867,73f66b3098929bdecf276f3a2dfdc34e682f048eee14c0797196a4e4c0a67c89,,,,,, -51,2025-10-30 14:06:10-0500,2024-03-01 - Unanimous Consent Equity Grant Valuation (1).pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-01 - Unanimous Consent Equity Grant Valuation (1).pdf,475887,25886ad62264c6970a3f089147f47f105089ae785c2e3286098fcfdf7fc89d88,,,,,, -54,2025-10-30 14:06:14-0500,2025-03-08 - Agreement - Amendment B to Operating of ARIBIA LLC.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2025-03-08 - Agreement - Amendment B to Operating of ARIBIA LLC.pdf,571004,41347bbb134e5618fa04d83360d5cb50890b96261332d1356769a4094704edac,,,,,, -57,2025-11-02 09:44:23-0600,ARIBIA LLC PAPERS WITH APOSTLE.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/ARIBIA LLC PAPERS WITH APOSTLE.pdf,7473857,6815b490092a2b41633d77808c0ef02defb5a8d40def71c74073f368e4c429e8,,,,,, -63,2025-11-02 22:52:31-0600,2022-07-12 - Premarital personal funds bank checking statement 4605.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2022-07-12 - Premarital personal funds bank checking statement 4605.pdf,83100,5eadedce64f1c41ba505f39e2d012ea4038e3611f688e47982bb8134dfb495dd,,,,,, -65,2025-11-02 22:52:31-0600,2022-07-18 - Wire for City Studio BIANCHI NICHOLAS USAA DocumentC8D24BD0.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2022-07-18 - Wire for City Studio BIANCHI NICHOLAS USAA DocumentC8D24BD0.pdf,47344,18fa222d1c1273f4ef111ee350a3b4d284fbd59d6c07f30249ea8bdeafaefcde,,,,,, -77,2025-11-02 22:52:40-0600,2024-12-18 - FMV It Can Be LLC.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-12-18 - FMV It Can Be LLC.docx,37141,04c82af44191fa677cfd79f6d298b1bf47ab9ab5f1d5fa52628a0c55b4be1786,,,,,, -79,2025-11-02 22:52:40-0600,20241210 Rentometer 4343 N Clarendon Ave 1610 Chicago IL.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/20241210 Rentometer 4343 N Clarendon Ave 1610 Chicago IL.pdf,723718,7e1e4c66317bfab26daa3c66e8c4fa673507767abef69321ec29b36d190a483f,,,,,, -82,2025-11-02 22:52:40-0600,"541 W Addison St Unit 3S, Chicago, IL 60613 MLS# 10487537.pdf",ARIBIA LLC Evidence Flat,"/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/541 W Addison St Unit 3S, Chicago, IL 60613 MLS# 10487537.pdf",12290550,b06113076799c935bc485a3a940b34c5e502649543f47b6a026e6c623c9eb8de,,,,,, -83,2025-11-02 22:52:40-0600,"550 W Surf St #211, Chicago, IL 60657 MLS# 11279903 Redfin.pdf",ARIBIA LLC Evidence Flat,"/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/550 W Surf St #211, Chicago, IL 60657 MLS# 11279903 Redfin.pdf",1374465,ef7a01a19eda02b9c2d8139550916cca686e611a1fef2a9f5907f2782072f72a,,,,,, -84,2025-11-02 22:52:40-0600,"550 W Surf St #504, Chicago, IL 60657 MLS# 11350357 Redfin.pdf",ARIBIA LLC Evidence Flat,"/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/550 W Surf St #504, Chicago, IL 60657 MLS# 11350357 Redfin.pdf",4040150,6c67a948bc1223dffd49fda45aa90a8a73c085190abce6610e5d361ce4ebc95b,,,,,, -87,2025-11-02 22:52:40-0600,"Cozy Castle Comp 559 W Surf St Apt 106, Chicago, IL 60657.pdf",ARIBIA LLC Evidence Flat,"/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Cozy Castle Comp 559 W Surf St Apt 106, Chicago, IL 60657.pdf",11094472,6f095da747747d5b3a598e8f1adb575067c376b3b47f87c5f013c43aafa21dd6,,,,,, -92,2025-11-02 22:52:40-0600,Villa Vista Estimate My Home Value Real Estate House Worth.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Villa Vista Estimate My Home Value Real Estate House Worth.pdf,1916542,8c76f82f46d5ec947a881b9a5a3b5e679e2cefbc90a9fa3a7882023affbab6ed,,,,,, -93,2025-11-02 22:52:40-0600,Villa Vista Estimated home worth Bank of America.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Villa Vista Estimated home worth Bank of America.pdf,3309085,bfa8ea927e763e1a8d568957bb64ccaac1ec6b335a89e2fb8deecf2512b57629,,,,,, -94,2025-11-02 22:52:43-0600,2023-08-30 - Inventory Checklist Addison 3.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-08-30 - Inventory Checklist Addison 3.docx,115773,5a9ec4aa2255b46c82d7521ddcc8f1123ba29a0e1d40aec5c6c23ff08bbd3cf5,,,,,, -95,2025-11-02 22:52:46-0600,2024-04-09 - statement.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-04-09 - statement.pdf,27540,ebad3fdf8c187b85fe7e2fe134f42083058454b0ed426c7bc52fc0174e4d0491,,,,,, -96,2025-11-02 22:52:46-0600,2024-07-01 - statement 3.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-07-01 - statement 3.pdf,13456,2b757e1d8f79826719b6463b99bf58f2366ab8eaec9490870f5c73eaecfd33c6,,,,,, -97,2025-11-02 22:52:46-0600,2024-10-01 - statement 3.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-10-01 - statement 3.pdf,35327,afea09212f35fcf5cc1fccdf19e8d8d11559ec7feec2b48302844a643109ee30,,,,,, -98,2025-11-02 22:52:46-0600,2025-03-08 - Operating Agreement - Amendment C to of ARIBIA LLC.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2025-03-08 - Operating Agreement - Amendment C to of ARIBIA LLC.pdf,523912,7f05746b49cbbf330e7da7c47f072a963ab4850cd177e2c222288c511eb04b5f,,,,,, -99,2025-11-02 22:52:50-0600,2022-07-15 - ARIBIA LLC ARTICLES OF ORGANIZATION (1).pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2022-07-15 - ARIBIA LLC ARTICLES OF ORGANIZATION (1).pdf,159273,c2b03c2a461ba6b02eef28916781e57b32708c03169bab0de79b8134fb941d77,,,,,, -102,2025-11-02 22:52:50-0600,2022-08-01 - Aribia LLC Membership Certificate Arias (1).pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2022-08-01 - Aribia LLC Membership Certificate Arias (1).pdf,1044742,974956aa91e6973715dda0e4f8473e9d7987302a87adcb72df0ff2d1b2388a43,,,,,, -104,2025-11-02 22:52:50-0600,2022-08-01 - ARIBIA LLC Membership Certificate BIANCHI.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2022-08-01 - ARIBIA LLC Membership Certificate BIANCHI.pdf,1057577,8042bce57f4f90a9546a769a34fc08429d17e80dde4935c4536c488f26cb187e,,,,,, -107,2025-11-02 22:52:50-0600,2023-03-28 - Re Langon Law Group LLC sent you an estimate (0006864).pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-03-28 - Re Langon Law Group LLC sent you an estimate (0006864).pdf,422545,4666fde3537b9fb67e24f7ee3ee965e6b585d7dd02be6ad9d6050c4346ccce32,,,,,, -110,2025-11-02 22:52:50-0600,2023-05-09 - Agreement - Unit Purchase Jones.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-05-09 - Agreement - Unit Purchase Jones.pdf,263608,10737cdc16d0e7d4139b898d807713e34948a0d64afecf2e6ed695db1e08ae2d,,,,,, -111,2025-11-02 22:52:50-0600,2024-03-01 - Aribia LLC Membership List (1).pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-01 - Aribia LLC Membership List (1).pdf,58079,4fb0f4be20945b0863b3caa6e0d64bc04d7585d9b9a900c9be71837661b4d23d,,,,,, -112,2025-11-02 22:52:50-0600,2024-03-01 - Aribia LLC Membership List copy.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-01 - Aribia LLC Membership List copy.docx,20261,0480e44c2c21e6918546b401de71abaf27dca63f2e710aea5e9091ee300829b4,,,,,, -113,2025-11-02 22:52:50-0600,2024-03-01 - Aribia LLC Membership List.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-01 - Aribia LLC Membership List.docx,20261,84d7d000108f9f04852adb45d71365729ccff01a61ff2df1fde72ee933d7acce,,,,,, -116,2025-11-02 22:52:50-0600,2024-03-01 - Operating Agreement - ARIBIA LLC AMENDMENT TO 2.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-01 - Operating Agreement - ARIBIA LLC AMENDMENT TO 2.pdf,225115,8f1caae21d30e6a408d78be93eb8d14d0baac9986dac5d2c6d813879d829ca0b,,,,,, -117,2025-11-02 22:52:50-0600,2024-03-01 - Operating Agreement - ARIBIA LLC AMENDMENT TO copy.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-01 - Operating Agreement - ARIBIA LLC AMENDMENT TO copy.docx,165239,3d77f6ee8b2dd8567ffd6e87366c13cc135286db90c7a9343bb6e10286f88c48,,,,,, -118,2025-11-02 22:52:50-0600,2024-03-01 - Operating Agreement - ARIBIA LLC AMENDMENT TO.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-01 - Operating Agreement - ARIBIA LLC AMENDMENT TO.docx,37620,131398da9d4f62d13153ca80371dcd520ff1983359f39a214ff634a00fd8bde5,,,,,, -119,2025-11-02 22:52:50-0600,2024-03-01 - Unanimous Consent Equity Grant Valuation.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-01 - Unanimous Consent Equity Grant Valuation.docx,22627,76c4dd21c9df73f25e557f8fb914ed8b4e4134d7c12d95f29d090831f27ef37d,,,,,, -123,2025-11-02 22:52:50-0600,2024-03-15 - ARIBIA LLC APT ARLENE Registration.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-15 - ARIBIA LLC APT ARLENE Registration.pdf,1484506,1ca27c13035f82aa6662371e82d7ad5a0f2c296196f6c783793420aefab9984c,,,,,, -124,2025-11-02 22:52:50-0600,2024-03-15 - ARIBIA LLC CITY STUDIO Registration.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-15 - ARIBIA LLC CITY STUDIO Registration.pdf,1484505,64d22230c49ea68edd555d4aa85ea9a0ec43996b3f7b7aa9754eb1bd8fa4f5be,,,,,, -126,2025-11-02 22:52:50-0600,2024-03-15 - ARIBIA LLC INTL Registration.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-15 - ARIBIA LLC INTL Registration.pdf,1484506,1dd986527deb0d34ec982713dce1182e4b8d85dcc16b009498b361b287f55753,,,,,, -127,2025-11-02 22:52:50-0600,2024-03-15 - ARIBIA LLC LAKESIDE LOFT Registration.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-15 - ARIBIA LLC LAKESIDE LOFT Registration.pdf,1484505,63c6934905883cd8b4f94aec04b3ff1c1b1b023210d540c367e1e66104462d46,,,,,, -128,2025-11-02 22:52:50-0600,2024-03-15 - ARIBIA LLC MGMT Registration.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-15 - ARIBIA LLC MGMT Registration.pdf,1484505,d1b3e1dc0b98ec4c2421790685cf5f865cf411586696ea204de417a64742be91,,,,,, -130,2025-11-02 22:52:50-0600,2024-03-15 - ARIBIA LLC Series Registration.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-15 - ARIBIA LLC Series Registration.pdf,290809,c1f9022d0da6e58fba62da9d577bbf356de2e6ac9f36556f8b205cb10521be8a,,,,,, -131,2025-11-02 22:52:50-0600,2024-03-15 - Unanimous Consent Admission of New Member Sharon E Jones (1).pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-15 - Unanimous Consent Admission of New Member Sharon E Jones (1).pdf,39648,a4a03d09aac3d08f8e8e326322a6d891b5a5bfd4e15ccb740852d4da9e93d8da,,,,,, -132,2025-11-02 22:52:50-0600,2024-03-15 - Unanimous Consent Admission of New Member Sharon E Jones.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-15 - Unanimous Consent Admission of New Member Sharon E Jones.docx,629824,7017242eee3397d993c54e166409fa40d74adde885f834bc5d2799e64b638704,,,,,, -134,2025-11-02 22:52:50-0600,2024-04-01 - Agreement - ARIBIA LLC SHAREHOLDER.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-04-01 - Agreement - ARIBIA LLC SHAREHOLDER.docx,179772,7ea07f7880154053770091673dcf381cc8bb56be0b4ea1bd7697abd0fea16935,,,,,, -135,2025-11-02 22:52:50-0600,2024-04-01 - ARIBIA LLC MEMBER LIST as of.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-04-01 - ARIBIA LLC MEMBER LIST as of.docx,3739424,ac3dd54a1ae4f76ba2efbd2386ce4e7d7bfe9b060995cf0f84305d6443dd3db1,,,,,, -136,2025-11-02 22:52:50-0600,2024-05-27 - ~$IBIA LLC & CITY STUDIO SECURITY LOAN Jones Loan &.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-05-27 - ~$IBIA LLC & CITY STUDIO SECURITY LOAN Jones Loan &.docx,162,97e9f11a47ec01d447e06e2f73159abb78f7783bd9cfa62b86ac28b73c96e8f7,,,,,, -137,2025-11-02 22:52:50-0600,2024-05-27 - Agreement - ARIBIA LLC & CITY STUDIO INTER SERIES Jones Loan & (1).docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-05-27 - Agreement - ARIBIA LLC & CITY STUDIO INTER SERIES Jones Loan & (1).docx,4311226,a4f3973ee6d26a69c30adbe32fad3082e3598ab48c0ed2cd7088dd11db9c94c3,,,,,, -138,2025-11-02 22:52:50-0600,2024-05-27 - Agreement - ARIBIA LLC & CITY STUDIO INTER SERIES Jones Loan &.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-05-27 - Agreement - ARIBIA LLC & CITY STUDIO INTER SERIES Jones Loan &.docx,4311584,6532528f6bc58e72a6ada79e4d2a8c1944d33df6e281e2fe99a05b6f3427f324,,,,,, -139,2025-11-02 22:52:50-0600,2024-05-27 - Agreement - ARIBIA LLC & CITY STUDIO INTER SERIES Jones Loan &.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-05-27 - Agreement - ARIBIA LLC & CITY STUDIO INTER SERIES Jones Loan &.pdf,165143,f10348cc4a7b0de25d19781aa0fdfd202f8669911e4f96156d404ca4a7d4cbe9,,,,,, -140,2025-11-02 22:52:50-0600,2024-05-27 - Agreement - ARIBIA LLC & CITY STUDIO SECURITY Jones Loan & Collateral.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-05-27 - Agreement - ARIBIA LLC & CITY STUDIO SECURITY Jones Loan & Collateral.docx,4311228,ec1279582f940fe88b6fb0dab2a6e1bfc357a728e3c976e35ca477bd5223e729,,,,,, -141,2025-11-02 22:52:50-0600,2024-05-27 - Agreement - Backup of ARIBIA LLC & CITY STUDIO INTER SERIES Jones Loan.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-05-27 - Agreement - Backup of ARIBIA LLC & CITY STUDIO INTER SERIES Jones Loan.docx,2675591,aeeb5122b0d05f3dd1ad9941b8e55abc45d9aaf53e5f013f7db4627ae91aeffc,,,,,, -142,2025-11-02 22:52:50-0600,2024-05-27 - Agreement - LOAN ARIBIA LLC x JONES.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-05-27 - Agreement - LOAN ARIBIA LLC x JONES.docx,2735005,fba5d4a2124ed42cd3db3ab9473f11f04ad4a02132edceede7e6eaf4355b8f8d,,,,,, -143,2025-11-02 22:52:50-0600,2024-05-27 - Agreement - LOAN ARIBIA LLC x JONES.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-05-27 - Agreement - LOAN ARIBIA LLC x JONES.pdf,98211,f1ec79adb56d739bd31ab5acc3e5c00bcdfeeae8d2b3857c7b2581684e2a26bd,,,,,, -144,2025-11-02 22:52:50-0600,2024-05-27 - Backup of Board Resolution of ARIBIA LLC Jones Loan &.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-05-27 - Backup of Board Resolution of ARIBIA LLC Jones Loan &.docx,1905153,50e5cd13392399ffb24f6a6729f0ad3e07da8467e032a8872316a50182bea822,,,,,, -145,2025-11-02 22:52:50-0600,2024-05-27 - Board Resolution of ARIBIA LLC Jones Loan & Collateral (1).pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-05-27 - Board Resolution of ARIBIA LLC Jones Loan & Collateral (1).pdf,842650,1bf085ed5b780d4a50f93f3963af7d03d33c1147adb6d823d778a1ba4029c215,,,,,, -146,2025-11-02 22:52:50-0600,2024-05-27 - Board Resolution of ARIBIA LLC Jones Loan & Collateral.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-05-27 - Board Resolution of ARIBIA LLC Jones Loan & Collateral.docx,2675580,ba610f52a531255c75d85aa769b32ddbfd068bc81a2b53edc81b4e54c61efa83,,,,,, -147,2025-11-02 22:52:50-0600,2024-05-27 - Board Resolution of ARIBIA LLC Jones Loan.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-05-27 - Board Resolution of ARIBIA LLC Jones Loan.docx,2677944,ae053fcfce32086a4f80ef5e790b8c09a58acb3b305bce49e29c1f41b6696a1a,,,,,, -148,2025-11-02 22:52:50-0600,2024-05-27 - DEED OF TRUST ARIBIA LLC x JONES.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-05-27 - DEED OF TRUST ARIBIA LLC x JONES.docx,3629359,5c84049e392c34e6b9196c5df1fb918ff3341f1b7d23d5eec6d672d2363758f2,,,,,, -149,2025-11-02 22:52:50-0600,2024-05-27 - PROMISSORY NOTE ARIBIA LLC x JONES updated.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-05-27 - PROMISSORY NOTE ARIBIA LLC x JONES updated.docx,4874762,7bd913438df419dcc38464673155b392ace6818bf54e6530020a896331a40f3a,,,,,, -150,2025-11-02 22:52:50-0600,2024-05-27 - PROMISSORY NOTE ARIBIA LLC x JONES updated.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-05-27 - PROMISSORY NOTE ARIBIA LLC x JONES updated.pdf,235741,a6d58aec6be3f5928482a562e07105970916625d4261a5fca5746a1470a42655,,,,,, -151,2025-11-02 22:52:50-0600,2024-05-27 - PROMISSORY NOTE ARIBIA LLC x JONES.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-05-27 - PROMISSORY NOTE ARIBIA LLC x JONES.docx,3517383,3ea492baa398dfe87d52354f241bd10b32df601bad3ccd9c693f0b6d1e75db41,,,,,, -153,2025-11-02 22:52:50-0600,Agreement - ARIBIA LLC and NIcholas Bianchi Property Manager.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Agreement - ARIBIA LLC and NIcholas Bianchi Property Manager.pdf,403845,0c396fb62e98efb02563ecea96146d3529ccc95ce8efed321e5be82f0a1bf362,,,,,, -154,2025-11-02 22:52:50-0600,Aribia LLC Huntington National Bank to date.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Aribia LLC Huntington National Bank to date.pdf,74541,5ae122a5d403b60628ee79db74508978b0ff7c5f781386827404dd744a3d136c,,,,,, -156,2025-11-02 22:52:50-0600,Board Resolution of ARIBIA LLC 2.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Board Resolution of ARIBIA LLC 2.docx,2675571,00b0f4f41821e15d15b7ced6356f0d7a8f6ffa635d95b846545f23b9e9fd4872,,,,,, -157,2025-11-02 22:52:50-0600,Board Resolution of ARIBIA LLC.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Board Resolution of ARIBIA LLC.docx,2677928,8eee5873370c817ee3c576669072cb5f301076e13e4437eb0284fc3bb38a5875,,,,,, -158,2025-11-02 22:52:50-0600,Board Resolution of ARIBIA LLC.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Board Resolution of ARIBIA LLC.pdf,115633,d02e12bb3377d3d126fb6ed552c35e3018f094723a87be6815c54eb1f6aff6da,,,,,, -159,2025-11-02 22:52:50-0600,Carta de instruccio╠ünes F4 ARIBIA LLC 77.000 USD 13.07.23 (2).pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Carta de instruccio╠ünes F4 ARIBIA LLC 77.000 USD 13.07.23 (2).pdf,137952,cabf62f870edf4842479fdc28af6ebfb3bca35631d9d0b0a1c5e2123a5968472,,,,,, -160,2025-11-02 22:52:50-0600,Carta de instruccio╠ünes F4 ARIBIA LLC 77.000 USD 13.07.23.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Carta de instruccio╠ünes F4 ARIBIA LLC 77.000 USD 13.07.23.pdf,274148,e03dcedb3019e744dd10eeff344fe45ea36f90b9788d4e5212f248e4ace5b6aa,,,,,, -164,2025-11-02 22:52:50-0600,F4 ARIBIA LLC 77.000 USD 13.07.2023.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/F4 ARIBIA LLC 77.000 USD 13.07.2023.pdf,274859,5d604627bb49b5bb05a68c4698a11b6063fca7ea63211715133575ee349469c5,,,,,, -170,2025-11-02 22:52:50-0600,Receipt - apps.ilsos.gov llcassumedadoptname .jsp.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Receipt - apps.ilsos.gov llcassumedadoptname .jsp.pdf,133298,817d6a96f9c3392a36fb9d3616435e6b19e72bae9d1df527c190f4aac1d18456,,,,,, -171,2025-11-02 22:52:51-0600,Backup of Board Resolution of ARIBIA LLC.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Backup of Board Resolution of ARIBIA LLC.docx,8108821,52cce8469d6d00034913b79018e2c08b922acfd3d6282d982d1e1389a4af7ab9,,,,,, -181,2025-11-02 22:52:56-0600,2024-10-03 - robinhood 2023 year end statement 15 36 51.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-10-03 - robinhood 2023 year end statement 15 36 51.pdf,69121,47d09b10073efee522b75e15ab45bd60ad199280edd50ddd2aafd56980ab7d40,,,,,, -182,2025-11-02 22:52:56-0600,2024-10-03 - SOFI MORTGAGE DETAIL HISTORY 15 36 52.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-10-03 - SOFI MORTGAGE DETAIL HISTORY 15 36 52.pdf,93811,ba26c4e00332ca9ddfc7fcb00cfa917d32d0845d5e96a6a9ebfd28ad747cc96a,,,,,, -185,2025-11-02 22:52:56-0600,2024-10-03 - Webull 2023 crypto account statement 15 36 46.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-10-03 - Webull 2023 crypto account statement 15 36 46.pdf,106224,b58e80a0067708f013bfa18341cd2775c4e47ded19873cdcdf38910b93b65557,,,,,, -190,2025-11-02 22:53:12-0600,2025-01-06 - Nicholas Bianchi POA Colombia 3075449 1.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2025-01-06 - Nicholas Bianchi POA Colombia 3075449 1.pdf,1610470,e19dd83ee4e37aa15d1f06d3ab3fde82198b3f978f52c3c6137656a0bd57f67b,,,,,, -194,2025-11-02 22:53:23-0600,Recent Payments Printout 1.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Recent Payments Printout 1.pdf,265961,9eb4a055a42ecc6d43590d4469fdf4361935f93108645a6b0017d9ae5a7c9751,,,,,, -195,2025-11-02 22:53:23-0600,Recent Payments Printout 2.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Recent Payments Printout 2.pdf,252459,2e25cc08f5d1636e60a4478411ae9ed0860e634f9f412828b8e6b93ca7550659,,,,,, -196,2025-11-02 22:53:23-0600,Recent Payments Printout 3.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Recent Payments Printout 3.pdf,216856,f199966e37e6ebb637abbd126e82a3cad3fc13aae8c5ebced3c86605fd2d9397,,,,,, -198,2025-11-02 22:53:38-0600,2022-12-09 - Statement.PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2022-12-09 - Statement.PDF,11659,c66b8c4f18f1a9c8ebd10c6d313af5e961fefc1ce7064079caa287f799497a6b,,,,,, -199,2025-11-02 22:53:38-0600,2023-01-11 - Statement (1).PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-01-11 - Statement (1).PDF,11873,f9d04ba67bca15ebf1ba24ecfbf31639147112c4b9db781f18f32934bca9cf64,,,,,, -200,2025-11-02 22:53:38-0600,2023-01-11 - Statement.PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-01-11 - Statement.PDF,11187,e62ab594a71e34ec5eb033ad411cae40791f6eb02b11cce25571df4f96aa7ac3,,,,,, -203,2025-11-02 22:53:38-0600,2023-03-10 - Statement.PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-03-10 - Statement.PDF,11678,b828d353f1e1e87de6089aa60dc09df8ecd52b96fb54ca9fd0ab6ed085f6d672,,,,,, -204,2025-11-02 22:53:38-0600,2023-04-11 - Statement (1).PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-04-11 - Statement (1).PDF,12100,adb43530675039c385b2b0a03fe5e78fb7b2f32d19f14808398b5e6e745a3f56,,,,,, -205,2025-11-02 22:53:38-0600,2023-04-11 - Statement.PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-04-11 - Statement.PDF,11148,9e0fba95432a727ca6c209690a10c3ae3e644492b0b971ae186a172ed68b1cab,,,,,, -206,2025-11-02 22:53:38-0600,2023-05-11 - Statement (2).PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-05-11 - Statement (2).PDF,11964,4b3138d7200b4d2fbd2c90eca899e82dbe9d148902970cc51f553a3d766215de,,,,,, -207,2025-11-02 22:53:38-0600,2023-05-11 - Statement.PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-05-11 - Statement.PDF,11342,84b39bd976cc6a61347a8dc898a0b8087ca4826a382b020adb03e56d3a869f84,,,,,, -208,2025-11-02 22:53:38-0600,2023-06-09 - Statement (1).PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-06-09 - Statement (1).PDF,11500,d7895290450b7b75afc8c89a0be22d44bffae2a5c5ce4cf852cb6644e7c2c0d5,,,,,, -209,2025-11-02 22:53:38-0600,2023-06-09 - Statement.PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-06-09 - Statement.PDF,11557,e6f0af7544117c2904c310eeb30db1a514ab92b877545a5557a5cf5dc6cd1d96,,,,,, -211,2025-11-02 22:53:38-0600,2023-07-11 - Statement.PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-07-11 - Statement.PDF,12075,fd199487959a17f8379e607756c74fa3d56297b642c23bab4e6b76948000fdb1,,,,,, -212,2025-11-02 22:53:38-0600,2023-08-11 - Statement (1).PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-08-11 - Statement (1).PDF,11747,c576a97ada368a878556d20aad5e8612bc7e3dad8b8edb63af05554fb948957f,,,,,, -213,2025-11-02 22:53:38-0600,2023-08-11 - Statement.PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-08-11 - Statement.PDF,10370,b73bd032610edff115cbe57d43838583ffa30d00184cf1e87a380e558b116319,,,,,, -214,2025-11-02 22:53:38-0600,2023-09-11 - Statement (1).PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-09-11 - Statement (1).PDF,12084,69e23d4ed58ce5fc1911846bb6708afb9d96d6f2a450bf979640e91fc86026a0,,,,,, -215,2025-11-02 22:53:38-0600,2023-09-11 - Statement.PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-09-11 - Statement.PDF,11736,bdd26e4e7796d4d6a639e8b916c8dff2a7a3d8eb57033c4c19dd8de29278f9fa,,,,,, -216,2025-11-02 22:53:38-0600,2023-10-11 - Statement (1).PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-10-11 - Statement (1).PDF,10644,f700f071a66f05f804438ebe28b2ed80ad29f913eeb81138ffe1b305ec41387b,,,,,, -217,2025-11-02 22:53:38-0600,2023-10-11 - Statement.PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-10-11 - Statement.PDF,10377,516907d9415659469377d5ae324741591fcf344bdf5ac7acfd49c54f3754a9cb,,,,,, -219,2025-11-02 22:53:38-0600,2023-11-10 - Statement.PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-11-10 - Statement.PDF,10369,db07806237626c65eb89c4085a62519010e2bea778b706c699e4a52a591b2e2e,,,,,, -221,2025-11-02 22:53:38-0600,2023-12-11 - Statement.PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-12-11 - Statement.PDF,10927,b20cdae23860dd873e3c27efbdecc6ac5dec83e8534df96d320c1ca71c64a058,,,,,, -222,2025-11-02 22:53:38-0600,2024-01-11 - Statement (1).PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-01-11 - Statement (1).PDF,17352,9935b7a83a5876fe006db9dbc3123b677b9cafadfc5c578760b16de09fce27b3,,,,,, -223,2025-11-02 22:53:38-0600,2024-01-11 - Statement.PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-01-11 - Statement.PDF,12301,a15f5bef6c40f220f1b95a2e259168c04a0ff8b984eb14b07cc17f797c20c869,,,,,, -225,2025-11-02 22:53:38-0600,2024-02-09 - Statement.PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-02-09 - Statement.PDF,12509,7e05376209b1697bd3bbbea72a4cfd7b48e530a8c3281707f3e2054fd670cd0d,,,,,, -226,2025-11-02 22:53:38-0600,2024-03-11 - Statement (1).PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-11 - Statement (1).PDF,12538,a6dec1d398b3fcee1a99b02e2f0116cd4af7bfcc3d63392d4c9215658df61b6c,,,,,, -227,2025-11-02 22:53:38-0600,2024-03-11 - Statement.PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-11 - Statement.PDF,12439,2cd1d18e9e13922234000a3fe986eea98876811be88c93b9708038a4bf41521a,,,,,, -228,2025-11-02 22:53:38-0600,2024-04-11 - Statement (1).PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-04-11 - Statement (1).PDF,11526,a436bfb23c65750560762d401a2e4438a4637eafb0af67695741d4d46a25541a,,,,,, -229,2025-11-02 22:53:38-0600,2024-04-11 - Statement.PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-04-11 - Statement.PDF,11709,aee1601c4eeb53628996a7950b43e1e1c30f41ae4d74447863b78e280ff8df69,,,,,, -232,2025-11-02 22:53:38-0600,2024-05-10 - Statement.PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-05-10 - Statement.PDF,12187,daaccccb5bef678b4701906cd6bdb641087d0b3b2ce623c4fe75270b023eb7b2,,,,,, -233,2025-11-02 22:53:38-0600,2024-05-20 - Statement.PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-05-20 - Statement.PDF,11964,d7d58545a0c78e56c861ee4db25ed55ab6c9597fdeea84f378f238ca2b01a896,,,,,, -234,2025-11-02 22:53:38-0600,2024-06-11 - Statement.PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-06-11 - Statement.PDF,12292,61ce86813a8faab1b5525e8e3f0416713df0a48d3925013a7e079b4d0d796593,,,,,, -235,2025-11-02 22:53:38-0600,2024-07-11 - Statement.PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-07-11 - Statement.PDF,11522,0e09723ff6d14fdb409fed1759eee543875fecb34d59ca52378a999ac2d1b7ef,,,,,, -236,2025-11-02 22:53:38-0600,2024-08-09 - Statement.PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-08-09 - Statement.PDF,10850,1ed1d79825387f2daab971f7b33403dc7d0268a54a0ab8a47b1097180e33c29d,,,,,, -237,2025-11-02 22:53:38-0600,2024-09-11 - Statement.PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-09-11 - Statement.PDF,11162,e4fec778e7a6d377f8ddd8659b96ccd1b1aef4849296a99abd06a57ca223ac61,,,,,, -238,2025-11-02 22:53:38-0600,2024-10-11 - Statement.PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-10-11 - Statement.PDF,12730,0b8d8bb21b895b0e7d156cebf9912043d2f6b5ce37b0ebfcf4e857f3b38711b4,,,,,, -239,2025-11-02 22:53:38-0600,2024-11-08 - Statement.PDF,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-11-08 - Statement.PDF,11598,593085589343658af5fad7123aa4e5d26d1dc12dcc6f15bac17f6a3f5243d8ec,,,,,, -240,2025-11-02 22:53:47-0600,2024-10-21 - ARIBIA LLC1 14 25 58.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-10-21 - ARIBIA LLC1 14 25 58.pdf,19300,1d9d84d9e918dc6a63dbeb7638ab4fa7b86c4520089f5ca980c3e71e1189b271,,,,,, -241,2025-11-02 22:53:47-0600,2024-10-21 - ARIBIA LLC2 14 26 08.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-10-21 - ARIBIA LLC2 14 26 08.pdf,20668,3bea878ea1cacf443b031e3e15a1e4d3966515fc4412b0b24315af07d156c7c7,,,,,, -242,2025-11-02 22:53:47-0600,2024-10-21 - ARIBIA LLC3 14 26 13.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-10-21 - ARIBIA LLC3 14 26 13.pdf,29129,a2d2f43292ad046498b95b882ee99c515bbd5f0ba8c67c93dc8d20c2399ee616,,,,,, -254,2025-11-02 22:54:13-0600,2024-11-15 - Colombia LETTER OF ENGAGEMENT ARIBIA LLC 21 53 01.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-11-15 - Colombia LETTER OF ENGAGEMENT ARIBIA LLC 21 53 01.pdf,221043,1aea5882b9d07582e903c88ead17a23598a44d0e0b9b772518743f24e4618130,,,,,, -256,2025-11-02 22:54:13-0600,Agreement - US Attorney Engagement.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Agreement - US Attorney Engagement.pdf,1509729,f4e02a6c17ca56cc9204c4b4ab9288e8ef39b671aaeb01eee9b485a8af83509a,,,,,, -259,2025-11-02 22:54:31-0600,2022-08-01 - Aribia LLC Membership Certificate Bianchi (1).pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2022-08-01 - Aribia LLC Membership Certificate Bianchi (1).pdf,1065123,cacc5b151cffac970de55a26c762df016ca49450f738175339a49a0556830b16,,,,,, -275,2025-11-02 22:55:11-0600,2024-11-30 - Member Resolution Sharon Jones Authority 2.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-11-30 - Member Resolution Sharon Jones Authority 2.pdf,470956,3cc8167ec84cee7f5d72b04733c783c28a0bb42b18466cc6b9434756bc94046c,,,,,, -278,2025-11-02 22:55:11-0600,KendallPattersonStatement.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/KendallPattersonStatement.pdf,249605,66c4193e965f15d240dc782f208554b231b8ea32e8d67ead7a6a7638774c5b2d,,,,,, -282,2025-11-02 22:55:12-0600,2022-07-15 - ARIBIA LLC ARTICLES OF ORGANIZATION.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2022-07-15 - ARIBIA LLC ARTICLES OF ORGANIZATION.pdf,171750,82235c045f8a03e6e508f1ed3c60c155097e51262a09dfe78c277a9f5d27ecde,,,,,, -290,2025-11-02 22:55:12-0600,2024-03-04 - Agreement - Bianchi Side Settlement.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-04 - Agreement - Bianchi Side Settlement.docx,54417,187a2e45e418d89e0de675014627205ea00e3eee533aaddd4d51b340c51f323d,,,,,, -293,2025-11-02 22:55:12-0600,2024-08-23 - Formalizing Your Role and Next Steps for Aribia LLC.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-08-23 - Formalizing Your Role and Next Steps for Aribia LLC.pdf,80114,f5a4909eb0927bc402cb9cc74c97eb2570e048811382e32e4db4e8792afd81ac,,,,,, -295,2025-11-02 22:55:12-0600,2024-09-05 - Re Formal Review of Medelli╠ün Property Rent and Financial.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-09-05 - Re Formal Review of Medelli╠ün Property Rent and Financial.pdf,1844037,f325b860062f57952a796a5aff9d97a9b71f1476bd0fdb4b15ab07a447ad29bf,,,,,, -296,2025-11-02 22:55:12-0600,2024-09-05 - RLuisa e Final Notice Phone Payment Due Tomorrow ΓÇô Action.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-09-05 - RLuisa e Final Notice Phone Payment Due Tomorrow ΓÇô Action.eml,7231,332d87e512d3bc88153596ef1bf88e341fd63d1fed2903bdefab97183e6c497a,,,,,, -297,2025-11-02 22:55:12-0600,2024-10-11 - Re Final Notice Phone Payment Due Tomorrow ΓÇô Action.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-10-11 - Re Final Notice Phone Payment Due Tomorrow ΓÇô Action.pdf,99915,b32512113cdd3757e3c35c2d2ed2df66792e6e36310cd01f97ffb6b79bfb047d,,,,,, -299,2025-11-02 22:55:12-0600,2024-10-18 - Re Service suspended for non payment.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-10-18 - Re Service suspended for non payment.pdf,185917,9b9122655a2e281924deaf7c958bbd47021052f4a23f44fefb08e4b7168107aa,,,,,, -303,2025-11-02 22:55:12-0600,2024-10-31 - Bianchi 550 W Surf #504 SoFi MORTGAGE STATEMENT.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-10-31 - Bianchi 550 W Surf #504 SoFi MORTGAGE STATEMENT.pdf,74561,517f0dfb791a06f322767fa30f5d59907b2daa96a7eba70f24252a4d78f59efc,,,,,, -304,2025-11-02 22:55:12-0600,2024-10-31 - Final Demand for Payment 02 15 53.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-10-31 - Final Demand for Payment 02 15 53.pdf,129694,a1b0c450f2929c02b935a7934c11d7d65931a82b946fd9bc170d062df522b8de,,,,,, -305,2025-11-02 22:55:12-0600,2024-11-19 - Corporate Filiing Termination ARIBIA LLC LAKESIDE LOFT.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-11-19 - Corporate Filiing Termination ARIBIA LLC LAKESIDE LOFT.pdf,222726,cb3f9dfc9101a6226e389db070288f7e574417f5592ec58be7816e25e6c288eb,,,,,, -306,2025-11-02 22:55:12-0600,2024-11-19 - LLC SERIES TerminationsWithdrawal.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-11-19 - LLC SERIES TerminationsWithdrawal.pdf,139767,187c6f9a11274d52b7edeb442450985435026b0dcc1cf641286dbd9bc6cacad1,,,,,, -311,2025-11-02 22:55:12-0600,2025 property ownership & funding overview.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2025 property ownership & funding overview.pdf,2296,3f6b5ee59fad5a32cd1d04cf257d73723366598c84e01fbdb2a59151eaad5b5f,,,,,, -313,2025-11-02 22:55:12-0600,2025-01-18 - Delivery of Signed POA Papers to Medellin.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2025-01-18 - Delivery of Signed POA Papers to Medellin.pdf,83158,246e17920dc9804559386c85481e2ad87153daf747edd5c9f58b746aa9009f56,,,,,, -319,2025-11-02 22:55:12-0600,2025-03-08 - Resolution of Sole Member Amendments B C.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2025-03-08 - Resolution of Sole Member Amendments B C.pdf,483779,337d4c406021ee2a794e1ae9969492b3dfc16cb6904505d53b27a7b4a0e67c0a,,,,,, -321,2025-11-02 22:55:12-0600,2025-04-01 - ARIBIA LLC Executive Appointment Sharon Jones.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2025-04-01 - ARIBIA LLC Executive Appointment Sharon Jones.pdf,464220,9df1d5387e6cbc8db868a80c87864de7bdd5cc7b1c1c2968c15cf6ec79446b4c,,,,,, -323,2025-11-02 22:55:12-0600,2025-11-19 - TERMINATION ARIBIA LLC INTL.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2025-11-19 - TERMINATION ARIBIA LLC INTL.pdf,222718,a199c1b6e78609403368f53335f97f34499bf54007027ad95c2e28b7b0231642,,,,,, -324,2025-11-02 22:55:12-0600,4343-06-22 - 4343 Clarendo Masnter Statement Fully Executed.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/4343-06-22 - 4343 Clarendo Masnter Statement Fully Executed.pdf,157610,33a10acb2d2ca1055e56f4399759883c305c5f8945ded7750e8ea1deba017b6a,,,,,, -326,2025-11-02 22:55:12-0600,Acuerdo privado de desalojo ARIBIA LLC.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Acuerdo privado de desalojo ARIBIA LLC.pdf,182048,2027319a4e0afb78b17e266626986178e208701ef8ebf669ea321c58348be2e6,,,,,, -330,2025-11-02 22:55:12-0600,ARIBIA LLC Business Entity Search.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/ARIBIA LLC Business Entity Search.pdf,107821,e5b3b740874e08283e598d77c825c0887e1ecdcb6fbab771203f8d078c66f35f,,,,,, -331,2025-11-02 22:55:12-0600,ARIBIA LLC Valuation Summary March to September 2024.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/ARIBIA LLC Valuation Summary March to September 2024.pdf,2473,27d90b9f9019bfcf72a6c3f4c3578e58894e99036d3027b2e5d5b667454cf02f,,,,,, -334,2025-11-02 22:55:12-0600,Cozy Castle Luisa Arias Equity Reduction for Unpaid Rent.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Cozy Castle Luisa Arias Equity Reduction for Unpaid Rent.pdf,255827,d4aeec8809e20635e668fcb3bd9ddafd13038999ac91093e679a0ad2459a652a,,,,,, -336,2025-11-02 22:55:12-0600,ESCROW MLP ENGLISH 2.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/ESCROW MLP ENGLISH 2.pdf,73818,00f75358f6d74cea846c2d3dc7ac9685fb24c4cef1fed79766b610f02172be4b,,,,,, -342,2025-11-02 22:55:12-0600,IT CAN BE LLC ΓÇ¿Wyoming Closely Held LLC.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/IT CAN BE LLC ΓÇ¿Wyoming Closely Held LLC.pdf,54986,3908d2f84a2b9bec978c080e7e8f0ae17c4aa6b091e05690cd580baaa6fbac2f,,,,,, -344,2025-11-02 22:55:12-0600,LETTER OF ENGAGEMENT ARIBIA LLC.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/LETTER OF ENGAGEMENT ARIBIA LLC.pdf,140197,c9322e77e64d98ef037db6da46d6fcfec7a5a787e4bcbfd2855622db26acedad,,,,,, -347,2025-11-02 22:55:12-0600,Morada Mami Account Statement.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Morada Mami Account Statement.pdf,164900,52873896a1e68bcf802debf4c4c84b9c2540e95de053c57757c05acb2d8c04c3,,,,,, -355,2025-11-02 22:55:12-0600,Searching nick@aribia.llc.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Searching nick@aribia.llc.pdf,291597,0a8375a15c0e67e78546aa3f259119de295d7691548dac7cbb2e338e5b07b6ee,,,,,, -361,2025-11-02 22:55:13-0600,2024-02-21 - Lease - Jill Williamson 05 30 2024.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-02-21 - Lease - Jill Williamson 05 30 2024.pdf,10984173,51f68ff41f2e8d4d828a5be1b539f3f003f7d83887012463e9f09412199ffe2c,,,,,, -362,2025-11-02 22:55:13-0600,2024-08-10 - Re Payment Due Final Demand for Payment ΓÇô Outstanding.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-08-10 - Re Payment Due Final Demand for Payment ΓÇô Outstanding.pdf,77943,96c9bce8fd280209583fd71a8fd96338b8f45121ea2e3f75d511e33367ef4ac4,,,,,, -363,2025-11-02 22:55:13-0600,2024-09-05 - Re Final Notice Phone Payment Due Tomorrow Action Required.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-09-05 - Re Final Notice Phone Payment Due Tomorrow Action Required.pdf,44740,af221a71c7ba0d6ade7c4a27886d143a8a1511a8417bbe90a1f9651de53ce65f,,,,,, -367,2025-11-02 22:55:13-0600,2024-12-02 - Formal Memorandum Medellin Property 15 29 31.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-12-02 - Formal Memorandum Medellin Property 15 29 31.pdf,165764,5b2fb7bf81fb830307586eb9d779292d579792ac2bfcedcc4f06a42cf8774b2f,,,,,, -371,2025-11-02 22:55:13-0600,statement 2.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/statement 2.pdf,255216,e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,,,,,, -372,2025-11-02 22:55:13-0600,Statement11302022.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Statement11302022.pdf,129323,64dee967c25606a2d65e6b27b917f9f859d1a32be54c75f9a9c3c3348afed210,,,,,, -373,2025-11-02 22:55:13-0600,Statement12312022.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Statement12312022.pdf,136885,92b44c722e6820e2506fe0c5ff1d141e0f7e413e443c98483364e4fde36bbe6c,,,,,, -374,2025-11-02 22:55:13-0600,Statement2282023.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Statement2282023.pdf,129542,1466fa6630c5ceae2cac7868e9988555ef496fecffb589d98608829999966145,,,,,, -375,2025-11-02 22:55:13-0600,Statement3312023.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Statement3312023.pdf,128468,d246750acfb751a9938e6d5b83fc5e0d0717f55068c1f7d2ee3ff015a7c1387e,,,,,, -376,2025-11-02 22:55:13-0600,Statement4302023.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Statement4302023.pdf,119555,0a156b8f07dbbac7c543e15e8dd76bbfc54b78e2f50852c7304760a6d40df830,,,,,, -377,2025-11-02 22:55:13-0600,Statement5312023 2.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Statement5312023 2.pdf,114580,e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,,,,,, -378,2025-11-02 22:55:13-0600,Statement5312023.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Statement5312023.pdf,114580,e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,,,,,, -380,2025-11-02 22:55:13-0600,Statement8312023.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Statement8312023.pdf,99476,e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,,,,,, -381,2025-11-02 22:55:14-0600,2023-03-17 - Lease Agreement - Jala Howard 03 31 2023.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-03-17 - Lease Agreement - Jala Howard 03 31 2023.pdf,4267921,e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,,,,,, -382,2025-11-02 22:55:14-0600,2023-03-30 - Lease Agreement - Kendall Patterson #211 07 15 2023.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-03-30 - Lease Agreement - Kendall Patterson #211 07 15 2023.pdf,4303166,e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,,,,,, -383,2025-11-02 22:55:14-0600,2023-08-30 - Inventory Checklist Addison 2.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-08-30 - Inventory Checklist Addison 2.docx,115773,53a9d1351c7320eb7b26f3b57e851d95c578ed068b9d1f04fad2cc21d0d3b629,,,,,, -384,2025-11-02 22:55:14-0600,2023-08-30 - Inventory Checklist Addison.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-08-30 - Inventory Checklist Addison.docx,115773,a9b40ece6026d5e29c87e2699d3790d3c5346b438bedbd803d5ed9a16ae0afff,,,,,, -385,2025-11-02 22:55:14-0600,2023-09-05 - Lease Agreement - Berger Addison 10 01 2023.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-09-05 - Lease Agreement - Berger Addison 10 01 2023.pdf,4852399,8a854a7245290ac833ffc6606ce4b054dc37d37cdeac66b58d717a4b3e843c47,,,,,, -386,2025-11-02 22:55:14-0600,2023-11-03 - Rental Addendum 10 23 2023.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-11-03 - Rental Addendum 10 23 2023.pdf,550549,e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,,,,,, -387,2025-11-02 22:55:14-0600,2024-02-06 - Arias%20Jan%202024%20of%20Notice%20to%20Pay%20Rent%20or%20Qu.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-02-06 - Arias%20Jan%202024%20of%20Notice%20to%20Pay%20Rent%20or%20Qu.pdf,119186,f49659141f3cf56171bd862288636825387e687f3046398dbbf6780340cd7c19,,,,,, -389,2025-11-02 22:55:14-0600,2024-05-17 - Rental Addendum 05 08 2024.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-05-17 - Rental Addendum 05 08 2024.pdf,388784,848de400e0a4dfe7df909385fd7ff763a7dd525146c658b6174ed072290ceea6,,,,,, -390,2025-11-02 22:55:14-0600,2024-06-27 - Lease Agreement - Cozy Castle 08 01 2024.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-06-27 - Lease Agreement - Cozy Castle 08 01 2024.pdf,2857645,e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,,,,,, -402,2025-11-02 22:55:30-0600,2025-03-00 - Formal Repayment Request SNAP MISUSE.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2025-03-00 - Formal Repayment Request SNAP MISUSE.docx,22748,dacfdb31c1b25c1894f13c13af7b1f3b9f7374232c11d99fd6e272e50d940f9b,,,,,, -403,2025-11-02 22:55:30-0600,2025-03-08 - LLC Terminations Withdrawal.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2025-03-08 - LLC Terminations Withdrawal.pdf,211128,f8875e20dc25c78f0cbab7413045d63b1af73b2db137f31ca369cc956e929ec0,,,,,, -404,2025-11-02 22:55:30-0600,2025-03-15 - FORMAL REQUEST FOR REPAYMENT ΓÇô PINE GROVE APARTMENT REFUND.docx,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2025-03-15 - FORMAL REQUEST FOR REPAYMENT ΓÇô PINE GROVE APARTMENT REFUND.docx,335677,9b73851b319c018a165bde49192443805ccb6c55b23f5e2e45ac3600ce5ccb35,,,,,, -407,2025-11-02 22:55:30-0600,2025-03-21 - eMail From Medellin Legal Partners re Luisa.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2025-03-21 - eMail From Medellin Legal Partners re Luisa.pdf,3057794,e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,,,,,, -411,2025-11-02 22:55:48-0600,2024-04-09 - statement 2.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-04-09 - statement 2.pdf,24782,1804a48c53d55c7b6bd0bd7157dafd292377894039cce5b0b9348a94c22d340e,,,,,, -412,2025-11-02 22:55:48-0600,2024-06-01 - statement.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-06-01 - statement.pdf,23896,011149176a4f8e2367a9ed8456a603e803c5afdce23a98789ae88a3b807671b6,,,,,, -413,2025-11-02 22:55:48-0600,2024-07-01 - statement 4.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-07-01 - statement 4.pdf,24385,06a2bf6a5d8e6e77605ebc75de7cf537f0d33bb2f8d6156bf6187fe12da83e4b,,,,,, -414,2025-11-02 22:55:48-0600,2024-08-01 - statement.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-08-01 - statement.pdf,18680,bc360275a1d128f82c85b860be1eb03a08d3e2c3df12e8c9cf71b65bf75506d2,,,,,, -415,2025-11-02 22:55:48-0600,2024-09-23 - statement.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-09-23 - statement.pdf,90333,b1724f4679bc7b07e75446aafb9bb58f8a99e1948b3040f2be1f2bcf07409bd5,,,,,, -416,2025-11-02 22:55:48-0600,2024-10-01 - statement 4.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-10-01 - statement 4.pdf,14946,630bf3f57785ad575923683b0f6c196ad26c330fbf1398a4c1a833b05fa1b1c3,,,,,, -417,2025-11-02 22:55:48-0600,2024-11-01 - statement.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-11-01 - statement.pdf,35369,43e2bf213872c530bd2f6cf65f5e14c11d4261ff7870f8d816e7f96c0ec19bdb,,,,,, -418,2025-11-02 22:55:48-0600,2024-12-01 - statement.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-12-01 - statement.pdf,36313,05e6cab5bdca70947367732abd76484a9156f901221a561507740b2cbf2dc2a8,,,,,, -419,2025-11-02 22:55:48-0600,2025-01-01 - statement.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2025-01-01 - statement.pdf,16702,0a0cb9e885baf64686dd723b4ab6e5a2b31e56c17cc91ab7e14eade3337e8b56,,,,,, -420,2025-11-02 22:55:48-0600,2025-02-01 - statement.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2025-02-01 - statement.pdf,16595,e7c25709ff8b09d83b2fcc719d3c305ec5d87f1648762ebac1f35c3c1ebdf67e,,,,,, -463,2025-11-02 22:56:36-0600,2023-03-18 - statement.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-03-18 - statement.pdf,19224,10b11d9fc6fa32e6f7e46aebc62475e7d2d67d74c9016746be6b9dbf09a9b697,,,,,, -464,2025-11-02 22:56:36-0600,2023-04-01 - statement.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-04-01 - statement.pdf,30067,35a40cf35485d4bbd36cfa05b006a066ee3fc5ffff6331e24eb7834997457fcb,,,,,, -465,2025-11-02 22:56:36-0600,2023-07-01 - statement.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-07-01 - statement.pdf,13883,afb350017dbf185ac37b5ada9d53eaeade160a9b8506e5bbed9d65e747b6324f,,,,,, -466,2025-11-02 22:56:36-0600,2023-10-01 - statement.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-10-01 - statement.pdf,13777,d32ad3111bdad795e8b5baf8a86b7e787a3310624f4c46ac6d5b6a43db8cc4b0,,,,,, -467,2025-11-02 22:56:36-0600,2024-01-01 - statement.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-01-01 - statement.pdf,18042,7d709b450b56ebd63873d330985ba81f63f20e5eb9e78041dce98fbc97f4d308,,,,,, -468,2025-11-02 22:56:36-0600,2024-04-01 - statement.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-04-01 - statement.pdf,27952,a485651d464eac810c3f249b22709d95501b8225a6587f5b17e70b2c6f17db0e,,,,,, -469,2025-11-02 22:56:36-0600,2024-07-01 - statement.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-07-01 - statement.pdf,14029,343c7245a92dd9cb41b36205688260f53b710ed61bc235cb841f532e077f3497,,,,,, -470,2025-11-02 22:56:36-0600,2024-10-01 - statement.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-10-01 - statement.pdf,34696,bafc01c70617b455edf91b557c2169cfd74cb1430ec973a74514f5e916f7537d,,,,,, -471,2025-11-02 22:56:39-0600,2024-12-00 - Lease - Welcome Overview and Payment Instructions for City Studio.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-12-00 - Lease - Welcome Overview and Payment Instructions for City Studio.pdf,119435,7bdcbab46bc56cac5ca967b85d7d4096e66d6fa33f9c08d2fac41df7d6cf4f93,,,,,, -474,2025-11-02 22:56:39-0600,"2024-12-24 - Jenny is requesting information about 550 W Surf St #504,.pdf",ARIBIA LLC Evidence Flat,"/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-12-24 - Jenny is requesting information about 550 W Surf St #504,.pdf",1239824,7dd622734c2606e5db3a1c35301c648c6f96be0b6dff4a0fdc35514b1c07cc4d,,,,,, -476,2025-11-02 22:56:39-0600,2024-12-24 - Lease Agreement - Medellin Legal Re Request for.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-12-24 - Lease Agreement - Medellin Legal Re Request for.pdf,5925773,43dd4f345f7465fef05fb3ee3be12da18659db5e5db7e8952e440778e4c70b8c,,,,,, -477,2025-11-02 22:56:39-0600,2024-12-24 - Lease Agreement - Sharon Jones Re Request for.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-12-24 - Lease Agreement - Sharon Jones Re Request for.pdf,3693226,e486645441601e5efa57edf8a3ef5accefe339683dc442e36e841da5fbcbd15b,,,,,, -479,2025-11-02 22:56:39-0600,2024-12-24 - Re Subject Urgent Payment Cap Issue and Escalating.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-12-24 - Re Subject Urgent Payment Cap Issue and Escalating.pdf,1793443,8de2f790e18a9d1c0c5e8b7046e7852dd080200f4b5dcb189170d037fba70b25,,,,,, -480,2025-11-02 22:56:39-0600,2024-12-24 - Villa Vista or Apt Arlene A document was uploaded to your.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-12-24 - Villa Vista or Apt Arlene A document was uploaded to your.pdf,9707595,8668c4d97ce1c7679e7cbb85d132bae09f9e243af6c96af65412a368cb467b6a,,,,,, -514,2025-11-02 22:57:04-0600,2024-06-26 - statement.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-06-26 - statement.pdf,26017,c324ffce96b1232e59bd187db5048a8ddced0d8bf9d378cae5adb3e358b80c59,,,,,, -515,2025-11-02 22:57:04-0600,2024-07-01 - statement 2.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-07-01 - statement 2.pdf,13470,cd3de003e310480ea8730b4b4920fad60ef81420b76bdd562c81c4ccd76a3f92,,,,,, -516,2025-11-02 22:57:04-0600,2024-10-01 - statement 2.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-10-01 - statement 2.pdf,34672,c328003942867b1863aa213032936398aa76181010f8c7bc68e9ff505a5f524c,,,,,, -520,2025-11-02 22:57:10-0600,2023-05-01 - For medellin purchase Bianchi PERSONAL worksheet.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-05-01 - For medellin purchase Bianchi PERSONAL worksheet.pdf,93176,5a18cc9c89e72018a951d442a7f2dd8fa2b2e4ed3bfe6ad824b7342a2fd8ba6f,,,,,, -534,2025-11-02 22:57:13-0600,aribia llc 1322 monthly statement 2023 06.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 1322 monthly statement 2023 06.pdf,251915,1d7e88a227d4d774219c19be807660af1683c04f40a3194678e3fb4b84b3458c,,,,,, -535,2025-11-02 22:57:13-0600,aribia llc 1322 monthly statement 2023 07.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 1322 monthly statement 2023 07.pdf,251710,0958b43524729d4f5497232196e9b1e93c8e211e8cc5fe62c21c661d23dc9bf0,,,,,, -536,2025-11-02 22:57:13-0600,aribia llc 1322 monthly statement 2023 08.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 1322 monthly statement 2023 08.pdf,251684,491ba15683d9cf789928209c197936f6420ba1050b70bf31424dff95cd62fd4c,,,,,, -537,2025-11-02 22:57:13-0600,aribia llc 1322 monthly statement 2023 09.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 1322 monthly statement 2023 09.pdf,251755,588c298330c19235d51e074e1804b3f9100b6b0b4a3e6354bef4a5567b9519a1,,,,,, -538,2025-11-02 22:57:13-0600,aribia llc 1322 monthly statement 2023 10.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 1322 monthly statement 2023 10.pdf,252357,c590500851a82663456788201d7567f831cb102a070f0139db558726c03ff751,,,,,, -539,2025-11-02 22:57:13-0600,aribia llc 1322 monthly statement 2023 11.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 1322 monthly statement 2023 11.pdf,252345,8b52abd05226169c2d3d96fd310853a322511ffff657bf11aba628b6c241ae66,,,,,, -540,2025-11-02 22:57:13-0600,aribia llc 1322 monthly statement 2023 12.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 1322 monthly statement 2023 12.pdf,251046,ea83e781e63571a9bd7446b7fea1364106c5079be1f3595a3f9e99adc0b8ad5e,,,,,, -541,2025-11-02 22:57:13-0600,aribia llc 2540 monthly statement 2023 01.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 2540 monthly statement 2023 01.pdf,66384,560ddac1b9f215ecd6fcba9fc554b9bbd2a9d0177fc494abd44b730df2387305,,,,,, -542,2025-11-02 22:57:13-0600,aribia llc 2540 monthly statement 2023 02.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 2540 monthly statement 2023 02.pdf,251480,6aaf6b2ce95b255b6e6b0b7def144f744d0fcd67819a3fe76b6296878a192e47,,,,,, -543,2025-11-02 22:57:13-0600,aribia llc 2540 monthly statement 2023 03.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 2540 monthly statement 2023 03.pdf,251538,504528fb3752ccb225cd9fc36d2bdc47caaf98c08853399c602b7f80112f563b,,,,,, -544,2025-11-02 22:57:13-0600,aribia llc 2540 monthly statement 2023 04.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 2540 monthly statement 2023 04.pdf,251465,c00315ccfde6fabc82a225470101b558d47e5611ed2f0e631f1765c7b63bf5cc,,,,,, -545,2025-11-02 22:57:13-0600,aribia llc 2540 monthly statement 2023 05.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 2540 monthly statement 2023 05.pdf,251436,9cf760cb11b18dfccbc7467460875802e269b82afe8c6f2b6569181485edb7c6,,,,,, -546,2025-11-02 22:57:13-0600,aribia llc 2540 monthly statement 2023 06.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 2540 monthly statement 2023 06.pdf,251547,8b1c943d9cd37e8a785104d1201e0c054741977eed760cf9e53380ec1fab05ef,,,,,, -547,2025-11-02 22:57:13-0600,aribia llc 2540 monthly statement 2023 07.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 2540 monthly statement 2023 07.pdf,251543,a712d223ac9ae6bb67ecba2ddfe85eda4ffa0038be7993c396f30cf61377ed8d,,,,,, -548,2025-11-02 22:57:13-0600,aribia llc 2540 monthly statement 2023 08.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 2540 monthly statement 2023 08.pdf,251647,57726fe539d4397a4ff9f855ef69c0e25f7ec81ff0f51a8c337cb7476c405792,,,,,, -549,2025-11-02 22:57:13-0600,aribia llc 2540 monthly statement 2023 09.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 2540 monthly statement 2023 09.pdf,252528,14393497ad75ad8bc72e65f483f3aa4d4baff80b26f496eea5545682d46491fd,,,,,, -550,2025-11-02 22:57:13-0600,aribia llc 2540 monthly statement 2023 10.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 2540 monthly statement 2023 10.pdf,251396,22ff4b00b197830ad8f1510273b98b9ac32a836ae58315527b5565169d6d55ab,,,,,, -551,2025-11-02 22:57:13-0600,aribia llc 4152 monthly statement 2023 09.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 4152 monthly statement 2023 09.pdf,250962,7b2d66aa50bc53c9ed90befa497d8c64ea3475a341741f331a0d58bbebe58551,,,,,, -552,2025-11-02 22:57:13-0600,aribia llc 4152 monthly statement 2023 10.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 4152 monthly statement 2023 10.pdf,251457,ddae83ddc5080f08d9b9cf0a3e99688853bf8009b7525839c1909fb239db319f,,,,,, -553,2025-11-02 22:57:13-0600,aribia llc 4152 monthly statement 2023 11.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 4152 monthly statement 2023 11.pdf,251498,fc97e48e4d70c32bdf96fb8172c3974cff5fad82c2f861792dacc930f5cea8dd,,,,,, -554,2025-11-02 22:57:13-0600,aribia llc 4152 monthly statement 2023 12.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 4152 monthly statement 2023 12.pdf,252077,ff274c394301b220aceade739db465cb0d879caeb245f2e1b8d782a75760c0ed,,,,,, -555,2025-11-02 22:57:13-0600,aribia llc 4209 monthly statement 2023 09.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 4209 monthly statement 2023 09.pdf,250955,44e554050b780e6982579d64d1cab96a8b1ded8fd9aec73b0d9cdc3370025904,,,,,, -556,2025-11-02 22:57:13-0600,aribia llc 4209 monthly statement 2023 10.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 4209 monthly statement 2023 10.pdf,251766,3e8e8f415aa778e4d357e69c7518957fa4dcea4fb7e1bad85700ad2a60f1046f,,,,,, -557,2025-11-02 22:57:13-0600,aribia llc 4209 monthly statement 2023 11.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 4209 monthly statement 2023 11.pdf,251832,16b595be8a0ce0c759e6c67bbaca1a62fba262f6584b54edbd7d3ccc395e0e49,,,,,, -558,2025-11-02 22:57:13-0600,aribia llc 4209 monthly statement 2023 12.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 4209 monthly statement 2023 12.pdf,252423,15e843194e1ab81c03693db984abe1d5f352bc223b19f6a32cf251a952fcb5f6,,,,,, -559,2025-11-02 22:57:13-0600,aribia llc 7036 monthly statement 2023 09.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 7036 monthly statement 2023 09.pdf,251122,03d38463289fae5a68519a79dc5a8e8bdc2221e68ce706199eae104a96d8ca9a,,,,,, -560,2025-11-02 22:57:13-0600,aribia llc 7036 monthly statement 2023 10.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 7036 monthly statement 2023 10.pdf,251230,6633379a5a776030d118c1bba9de52a60823c85feb9be1c8eec84798e895ef32,,,,,, -561,2025-11-02 22:57:13-0600,aribia llc 7036 monthly statement 2023 11.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 7036 monthly statement 2023 11.pdf,251118,442c218430beed970884a142533d07df45412c436a52a8d29b037f1cbc65577f,,,,,, -562,2025-11-02 22:57:13-0600,aribia llc 7036 monthly statement 2023 12.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 7036 monthly statement 2023 12.pdf,251126,ece06e2862db9a0c42f47866246fb147ef290d4a3a800e2e9e8c05e4aed0c914,,,,,, -563,2025-11-02 22:57:13-0600,aribia llc 8111 monthly statement 2023 09.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 8111 monthly statement 2023 09.pdf,251121,5fb2d124e1163fd22fffe991ac7ec5221dc7054103b28072efc9af9aceeed8b7,,,,,, -564,2025-11-02 22:57:13-0600,aribia llc 8111 monthly statement 2023 10.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 8111 monthly statement 2023 10.pdf,252165,6163a3fef59edc19ea41ba831a1fa9dc0420f6cc5401be197e3daf78fbbafdc7,,,,,, -565,2025-11-02 22:57:13-0600,aribia llc 8111 monthly statement 2023 11.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 8111 monthly statement 2023 11.pdf,251793,60f3ec294385eed5889defae8b046c83ac7434e24b06a50e6b9f310d354d4dbf,,,,,, -566,2025-11-02 22:57:13-0600,aribia llc 8111 monthly statement 2023 12.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 8111 monthly statement 2023 12.pdf,252083,1b9273a29572b16026fbd28a33f20ca0144c62c8fe38676bb7a5022b2b4417f1,,,,,, -567,2025-11-02 22:57:13-0600,aribia llc 9023 monthly statement 2023 09.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 9023 monthly statement 2023 09.pdf,251419,b4468ff3f11a16dce69b7ce30022b5dc65f53efa31d42dc13ccabbdf9c3d8811,,,,,, -568,2025-11-02 22:57:13-0600,aribia llc 9023 monthly statement 2023 10.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 9023 monthly statement 2023 10.pdf,252095,04dd495447cbab4036cbd7c5b640bc9e8443d7196cb294a5154232aee9b283a7,,,,,, -569,2025-11-02 22:57:13-0600,aribia llc 9023 monthly statement 2023 11.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 9023 monthly statement 2023 11.pdf,251839,5dcd49119e68d6d7ddfc69f9072e2ba5b3a31ad56f2d286eeb04108b64cfc2c6,,,,,, -570,2025-11-02 22:57:13-0600,aribia llc 9023 monthly statement 2023 12.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 9023 monthly statement 2023 12.pdf,252139,74b91baf958616c5bdf3d7610e5e0a92010ebbbf79ba8430ee984ccfa544be57,,,,,, -571,2025-11-02 22:57:13-0600,aribia llc 9551 monthly statement 2023 01.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 9551 monthly statement 2023 01.pdf,79258,490afc8261cfd802d6aa87712a05a9551d9328a16c14e522fb682bcb7782d65d,,,,,, -572,2025-11-02 22:57:13-0600,aribia llc 9551 monthly statement 2023 02.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 9551 monthly statement 2023 02.pdf,60454,ae332e29c6b90b4c074f56cdf0e170be6d2ae2a47d994a79b20d2df209007ec9,,,,,, -573,2025-11-02 22:57:13-0600,aribia llc 9551 monthly statement 2023 03.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 9551 monthly statement 2023 03.pdf,68112,89f26e286553743db05d991beef2bfc8789804bbd817658ebfbc7451e9245dc9,,,,,, -574,2025-11-02 22:57:13-0600,aribia llc 9551 monthly statement 2023 04.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 9551 monthly statement 2023 04.pdf,57295,699c260aa92b0a1ac65be69265c52aa409c28776cdd00fac7b41670008cae705,,,,,, -575,2025-11-02 22:57:13-0600,aribia llc 9551 monthly statement 2023 05.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 9551 monthly statement 2023 05.pdf,252169,ca1d616e08df700ed43c2b7a41b0f6328075aa2a0c8ac1d9e37be6adb2921e37,,,,,, -576,2025-11-02 22:57:13-0600,aribia llc 9551 monthly statement 2023 06.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 9551 monthly statement 2023 06.pdf,252491,cd43db15727abda7dc560faed6944aacf01d32fe45a4b01be4885162968a550e,,,,,, -577,2025-11-02 22:57:16-0600,Statement10312023.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Statement10312023.pdf,96535,b27da6be4d47c7186ae03db2401c78d5b8e120c9c76b57c95e0a28ccdd77477d,,,,,, -578,2025-11-02 22:57:16-0600,Statement11302023.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Statement11302023.pdf,96556,91485d40e28b0aa323080dfcea02bb8cbe7aa03b7a2c8e2a867b61e71bd334da,,,,,, -579,2025-11-02 22:57:16-0600,Statement12312022 2.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Statement12312022 2.pdf,136885,92b2aea403014e08e766b431c226361c5027aa56400380fa8eb76cdfa5edb092,,,,,, -580,2025-11-02 22:57:16-0600,Statement12312023.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Statement12312023.pdf,108227,033fee7c83837a2079b275a006f38ce41beb9be0783113f79acd46fefc367a56,,,,,, -582,2025-11-02 22:57:16-0600,Statement2282023 2.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Statement2282023 2.pdf,129542,dc9ba6fa4358a023d55334ab193e457bcfc7ee4ed3295ec2e43fd1f87064e888,,,,,, -583,2025-11-02 22:57:16-0600,Statement3312023 2.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Statement3312023 2.pdf,128468,b06bde547820e88fb54efb15656e201b27f1c02579a9587833c34d9350b4cb34,,,,,, -584,2025-11-02 22:57:16-0600,Statement4302023 2.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Statement4302023 2.pdf,119555,6939b4d77f4e12344ea001beeaf4e6de50932feb1d3ec7f54eeedfcd89d0f4da,,,,,, -585,2025-11-02 22:57:16-0600,Statement5312023 2 (1).pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Statement5312023 2 (1).pdf,114580,037868dba5b322d06c8dba125f046900f1ab3c1831b4749a2467820d1e1e2797,,,,,, -586,2025-11-02 22:57:16-0600,Statement6302023 2.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Statement6302023 2.pdf,111528,8e62e8b47359978b9ef3a35f110ea5772086fd3d97e4274b74bbdfccf8ac9ffe,,,,,, -587,2025-11-02 22:57:16-0600,Statement7312023.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Statement7312023.pdf,98794,4176e68de0780bd4f59591e10339066437be49fac7fac07ac2c1f46968e51522,,,,,, -588,2025-11-02 22:57:16-0600,Statement8312023 2.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Statement8312023 2.pdf,99476,66cac6b2eaf82641d92d3d993b4fc9b1fb87f877b3f7de3a585f9759720d2bad,,,,,, -589,2025-11-02 22:57:16-0600,Statement9302023.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Statement9302023.pdf,105409,4d526f812c99853d3ff8dbb8a7a5a834fd634ae890c582aff257038cbe8aff25,,,,,, -590,2025-11-02 22:57:25-0600,2022-08-01 - Operating Agreement - 2024D007847 ARIBIA 1 (effective) ARIBIA.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2022-08-01 - Operating Agreement - 2024D007847 ARIBIA 1 (effective) ARIBIA.pdf,224,e54c3f91770bcd1e4db73e20d9157df419029b4674f9065edd8d473f96eed765,,,,,, -591,2025-11-02 22:57:25-0600,2023-04-22 - Operating Agreement - 2024D007847 ARIBIA 3 ARIBIA LLC.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023-04-22 - Operating Agreement - 2024D007847 ARIBIA 3 ARIBIA LLC.pdf,212,39a9873a27682a6ee614ff17f8c516c41b0f7cb611c06896eb0eb7201d0bfea9,,,,,, -592,2025-11-02 22:57:25-0600,2024-03-15 - Operating Agreement - 2024D007847 ARIBIA 4 ARIBIA LLC APT.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-15 - Operating Agreement - 2024D007847 ARIBIA 4 ARIBIA LLC APT.pdf,233,a69d0d6cc0c6025cb21db2c0093493c1350bddfdaa392ab4a833ec22ba9e0177,,,,,, -593,2025-11-02 22:57:25-0600,2024-10-29 - Operating Agreement - 2024D007847 ARIBIA AMENDMENT 5 ARIBIA LLC Amendment to.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-10-29 - Operating Agreement - 2024D007847 ARIBIA AMENDMENT 5 ARIBIA LLC Amendment to.pdf,225,e85cee12ab85396ab99431f33d566c36f921e93b63e7e0c17eb8b0d9b6e09c94,,,,,, -594,2025-11-02 22:57:25-0600,2024-10-29 - Operating Agreement - 2024D007847 ITCANBE 20250929 125240 pending of IT CAN BE.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-10-29 - Operating Agreement - 2024D007847 ITCANBE 20250929 125240 pending of IT CAN BE.pdf,137,de30b3e20d2d6c8e66cb7b1adb0c374e692462c2da960f9e91016a2922e85358,,,,,, -595,2025-11-02 22:57:25-0600,2024-11-13 - Operating Agreement - 2024D007847 ARIBIA AMENDMENT 2 Retroactive Amendment to.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-11-13 - Operating Agreement - 2024D007847 ARIBIA AMENDMENT 2 Retroactive Amendment to.pdf,257,2d7eb1a9e04b9df6618c4a418ff7e798f8382d69ddbdf275babfc60db98c8f51,,,,,, -596,2025-11-02 22:57:25-0600,2024-11-30 - 2024D007847 CORP 20250929 125310 pending Member Resolution.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-11-30 - 2024D007847 CORP 20250929 125310 pending Member Resolution.pdf,136,a46ccc63ba17dda12f11695c76bfda24a046b2e48b5b39382077ea4eeb1758b8,,,,,, -600,2025-11-02 22:57:25-0600,2025-03-08 - Operating Agreement - 2024D007847 ARIBIA 20250929 125325 pending Amendment B to.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2025-03-08 - Operating Agreement - 2024D007847 ARIBIA 20250929 125325 pending Amendment B to.pdf,144,4b3196b32939a334c8981edb6d33b99326f4f00069b72352f0aed1b15a185fad,,,,,, -601,2025-11-02 22:57:25-0600,2025-03-08 - Operating Agreement - 2024D007847 ARIBIA 20250929 125343 pending Amendment C to.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2025-03-08 - Operating Agreement - 2024D007847 ARIBIA 20250929 125343 pending Amendment C to.pdf,144,958b1c8b4ce292d449dba2b0b05cafd0bd932e18deca81e112124fdd1ea180eb,,,,,, -602,2025-11-02 22:57:25-0600,2025-03-08 - Operating Agreement - 2024D007847 ARIBIA AMENDMENT 6 Amendment C to of ARIBIA LLC.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2025-03-08 - Operating Agreement - 2024D007847 ARIBIA AMENDMENT 6 Amendment C to of ARIBIA LLC.pdf,230,24066b566bc58e3e8424f2a153bb490b76f70baa2bfb75f795df7d27bd9d37f1,,,,,, -664,2025-11-02 22:57:26-0600,Comprehensive Flow of Funds IT CAN BE LLC and ARIBIA LLC.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Comprehensive Flow of Funds IT CAN BE LLC and ARIBIA LLC.pdf,160167,73cbc7b4042a63ded21fed4a292f195c8b35dd218b7fd5b8dc8826ee2287a786,,,,,, -665,2025-11-02 22:57:26-0600,Fw Updated ARIBIA LLC Valuation Statement & Acknowledgment.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Fw Updated ARIBIA LLC Valuation Statement & Acknowledgment.eml,7916536,231fa94e4faaa9c63d33901a7d6c51bd272ddf7574e830d2647b73599192d5e7,,,,,, -672,2025-11-02 22:57:51-0600,aribia llc 1322 monthly statement 2024 01.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 1322 monthly statement 2024 01.pdf,250900,728658724da49f95ec92b7751265dd8a38b5bcde146f209ba2e735eb3371ae8f,,,,,, -673,2025-11-02 22:57:51-0600,aribia llc 1322 monthly statement 2024 02.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 1322 monthly statement 2024 02.pdf,250912,85d1183dc9a276341bb47c48ab02b71194fb072e3492fe2b278094e096d4c8d1,,,,,, -674,2025-11-02 22:57:51-0600,aribia llc 1322 monthly statement 2024 03.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 1322 monthly statement 2024 03.pdf,253176,1c18674efb6d0d956c02504cf91a2774954c489fa593306257b7618ad9e6a64f,,,,,, -675,2025-11-02 22:57:51-0600,aribia llc 1322 monthly statement 2024 04.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 1322 monthly statement 2024 04.pdf,251952,aec4a2f246b8b2864fe391e0670c56e9f4258786d06c3273d30e2ce3e06065ff,,,,,, -676,2025-11-02 22:57:51-0600,aribia llc 1322 monthly statement 2024 05.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 1322 monthly statement 2024 05.pdf,250988,73fba734772d3d01f6e53800a3ed67e938563f04d836c7af52bee2de596c04f0,,,,,, -677,2025-11-02 22:57:51-0600,aribia llc 1322 monthly statement 2024 06.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 1322 monthly statement 2024 06.pdf,251017,9f50d127f2b6390adb0a8bfb777ca977672f511a8ae0976b1f5cd4268bb2e415,,,,,, -678,2025-11-02 22:57:51-0600,aribia llc 1956 monthly statement 2024 02.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 1956 monthly statement 2024 02.pdf,250789,7e6b178876d9e32529d072cfcdf442304bca11a24ead08c1cabd577271b5b11f,,,,,, -679,2025-11-02 22:57:51-0600,aribia llc 1956 monthly statement 2024 03.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 1956 monthly statement 2024 03.pdf,252715,8bc63d0096f9e130456724c776367305f804f77a34b749dd50a0b5d1bc580078,,,,,, -680,2025-11-02 22:57:51-0600,aribia llc 1956 monthly statement 2024 04.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 1956 monthly statement 2024 04.pdf,252546,0108324a7777241ee09db9e41637469da53546c30c9260d2009529a6e5e6d497,,,,,, -681,2025-11-02 22:57:51-0600,aribia llc 1956 monthly statement 2024 05.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 1956 monthly statement 2024 05.pdf,268712,3e0812873b2872cb9bf03e90217c1f138ddfd1ff4ea343044acc52d6e9fade34,,,,,, -682,2025-11-02 22:57:51-0600,aribia llc 1956 monthly statement 2024 06.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 1956 monthly statement 2024 06.pdf,252738,b68c00f48ab47ad980dba810bbc4a42a22a047a01d9968f5485ba62fb5972d22,,,,,, -683,2025-11-02 22:57:51-0600,aribia llc 1956 monthly statement 2024 07.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 1956 monthly statement 2024 07.pdf,252450,d76a53d4686fe22cbea13e0cefb73f5ef6fa3f24c03e22e5f2db1b133f0d0ac2,,,,,, -684,2025-11-02 22:57:51-0600,aribia llc 1956 monthly statement 2024 08.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 1956 monthly statement 2024 08.pdf,268502,323a51bc1b5d94c4ac37158e688627076f10c14718dec6596b26c281715330a0,,,,,, -685,2025-11-02 22:57:51-0600,aribia llc 1956 monthly statement 2024 09.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 1956 monthly statement 2024 09.pdf,271317,0a60ec22e36cd4337c482a504d4eb67fb3f3a82696cde946a3376cbd548fc1ad,,,,,, -686,2025-11-02 22:57:51-0600,aribia llc 1956 monthly statement 2024 10.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 1956 monthly statement 2024 10.pdf,266560,9dd3c84147bf186fb472c7295a470cba169382274915c3f4bbe01dc013e9746d,,,,,, -687,2025-11-02 22:57:51-0600,aribia llc 1956 monthly statement 2024 11.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 1956 monthly statement 2024 11.pdf,265536,f4bc5203f4639a7de074312ab93097ecd49046b0024f1197c175d09886e17c1b,,,,,, -688,2025-11-02 22:57:51-0600,aribia llc 4152 monthly statement 2024 01.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 4152 monthly statement 2024 01.pdf,252212,7f12c0156067734dba1704300f2a1d29c0dda67cb43e62867bf18c235853dee0,,,,,, -689,2025-11-02 22:57:51-0600,aribia llc 4152 monthly statement 2024 02.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 4152 monthly statement 2024 02.pdf,268928,e8847da365294693a32ea586508ee62164a11ced44a837a9050fcfdf5194cb3e,,,,,, -690,2025-11-02 22:57:51-0600,aribia llc 4152 monthly statement 2024 03.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 4152 monthly statement 2024 03.pdf,303561,a6324324952d4cd99456fb379679a0a07f1aaa5135e9cf3564141e8c7a13becd,,,,,, -691,2025-11-02 22:57:51-0600,aribia llc 4152 monthly statement 2024 04.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 4152 monthly statement 2024 04.pdf,269519,d715ff09b943b8485b4193dcf6edd5a4eacc37f43eea68e47ca3a746dcb2e82d,,,,,, -692,2025-11-02 22:57:51-0600,aribia llc 4152 monthly statement 2024 05.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 4152 monthly statement 2024 05.pdf,250514,6f72f7ebb2361d62fcd9f704d1d2f278b335a2b13b985069926d146c4798f728,,,,,, -693,2025-11-02 22:57:51-0600,aribia llc 4209 monthly statement 2024 01.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 4209 monthly statement 2024 01.pdf,252056,9cad68739774551364a7eb19eacea38046e404de0dbafb80dfea9883bd16f522,,,,,, -694,2025-11-02 22:57:51-0600,aribia llc 4209 monthly statement 2024 02.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 4209 monthly statement 2024 02.pdf,252250,11cd2c2752a376e337fcd9d39c3d50c4c7d71b8b07c881033f7da52132359964,,,,,, -695,2025-11-02 22:57:51-0600,aribia llc 4209 monthly statement 2024 03.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 4209 monthly statement 2024 03.pdf,251706,209064d9386d79db96fb0ebac70b4f0e2841581d3cec62d922bd8635cdee8437,,,,,, -696,2025-11-02 22:57:51-0600,aribia llc 4209 monthly statement 2024 04.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 4209 monthly statement 2024 04.pdf,251177,f071a16f8017c4333885c01204867e768640fdecbd4027ec5a3141f7127a593d,,,,,, -697,2025-11-02 22:57:51-0600,aribia llc 4609 monthly statement 2024 01.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 4609 monthly statement 2024 01.pdf,251135,591dd7d1e3ae0510c214f57101c72008160b61befd29600126d78f5b610585e9,,,,,, -698,2025-11-02 22:57:51-0600,aribia llc 4609 monthly statement 2024 02.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 4609 monthly statement 2024 02.pdf,250682,511fc629f8b57cdd61264b7fed03709f61ea46c7af23002346c01f619e2eb098,,,,,, -699,2025-11-02 22:57:51-0600,aribia llc 4609 monthly statement 2024 03.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 4609 monthly statement 2024 03.pdf,250881,ee05ad74418cdac6ad5239ae6fa156ec232c1bd25348e47e3c263e442fdbed23,,,,,, -700,2025-11-02 22:57:51-0600,aribia llc 4609 monthly statement 2024 04.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 4609 monthly statement 2024 04.pdf,251144,8510391136eb009aca74a9a785b81c2aa0920c67a1cdc4bcf99be036779d1e35,,,,,, -701,2025-11-02 22:57:51-0600,aribia llc 4609 monthly statement 2024 05.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 4609 monthly statement 2024 05.pdf,250957,3a935c2d66c941d5bbed8fab1685231d49132932f6753d07c9ec7821592aa9c0,,,,,, -702,2025-11-02 22:57:51-0600,aribia llc 7036 monthly statement 2024 01.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 7036 monthly statement 2024 01.pdf,251049,1e4f4b5daa6f1c0570aeecad1034e6bdcd1dddc7d96b2fc454f55bfa57817e52,,,,,, -703,2025-11-02 22:57:51-0600,aribia llc 7036 monthly statement 2024 02.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 7036 monthly statement 2024 02.pdf,251218,540ff07964abab442cdebedb8ccb382c3fe2e32e80f0b92426512b0e71ff63c5,,,,,, -704,2025-11-02 22:57:51-0600,aribia llc 7036 monthly statement 2024 03.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 7036 monthly statement 2024 03.pdf,250841,df1f126de5e24f44e7a6f9497d337f00de3f68f9ddf3a3885dea6613d31ee0d5,,,,,, -705,2025-11-02 22:57:51-0600,aribia llc 7036 monthly statement 2024 04.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 7036 monthly statement 2024 04.pdf,250763,e4e600794bb563e86482d5269992dd6593b69727a73c80da08db3fc147b901e1,,,,,, -706,2025-11-02 22:57:51-0600,aribia llc 8111 monthly statement 2024 01.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 8111 monthly statement 2024 01.pdf,251331,baea8e48fd40698c79001d5303d712c15bf69df200a18e27b2fbd8b4aa05e5a1,,,,,, -707,2025-11-02 22:57:51-0600,aribia llc 8111 monthly statement 2024 02.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 8111 monthly statement 2024 02.pdf,251897,f8631975d0812be25134c2907ca78ede6fc76b16d252fe10a7d0544d5c39794c,,,,,, -708,2025-11-02 22:57:51-0600,aribia llc 8111 monthly statement 2024 03.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 8111 monthly statement 2024 03.pdf,252552,1b3db934f2852b1313dfdd7277bcde4359e5cce25df8cf2a59c605f21dc79107,,,,,, -709,2025-11-02 22:57:51-0600,aribia llc 8111 monthly statement 2024 04.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 8111 monthly statement 2024 04.pdf,251366,f89ce0d2dbf250bd0ddae23a357ebc196d8ee9ee0f960a327899a37fc37127de,,,,,, -710,2025-11-02 22:57:51-0600,aribia llc 9023 monthly statement 2024 01.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 9023 monthly statement 2024 01.pdf,251580,c11d878513e3b115ba4363983e2c30ac2300bd3b8b22403990d0ccffc7b8ce96,,,,,, -711,2025-11-02 22:57:51-0600,aribia llc 9023 monthly statement 2024 02.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 9023 monthly statement 2024 02.pdf,251008,b129f6e07ccc3672d5741e329854f32b2fd05e5f60810d59f1d787c268bb0a00,,,,,, -712,2025-11-02 22:57:51-0600,aribia llc 9023 monthly statement 2024 03.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 9023 monthly statement 2024 03.pdf,251197,61d3e9fdf152b3eda242bf91169039cb6e05a9e47a2f24b3fa0b53217a184bab,,,,,, -713,2025-11-02 22:57:51-0600,aribia llc 9023 monthly statement 2024 04.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 9023 monthly statement 2024 04.pdf,250602,bd549d0a2f869f57aa9c65282d7a4e4b5cefe54d1e342cf2155f717f519aba2a,,,,,, -714,2025-11-02 22:57:52-0600,aribia llc 2540 monthly statement 2022 07.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 2540 monthly statement 2022 07.pdf,33957,a18168a4b6501e0bfc09ecf2ad9768e15384eaedc20b00fbd6513df37a623882,,,,,, -715,2025-11-02 22:57:52-0600,aribia llc 2540 monthly statement 2022 08.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 2540 monthly statement 2022 08.pdf,35962,b08a6cd2400e9acc2aa32dd34a2d81672d91d84ac39d255749d487abaf9196c0,,,,,, -716,2025-11-02 22:57:52-0600,aribia llc 2540 monthly statement 2022 09.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 2540 monthly statement 2022 09.pdf,34593,d7b2dff8d05555ed70901f7f32c4f6191d1d0a09117d1bd072eae9a59cd97e38,,,,,, -717,2025-11-02 22:57:52-0600,aribia llc 2540 monthly statement 2022 10.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 2540 monthly statement 2022 10.pdf,57233,1d678013ab8f8c5e975a07a26a4c70bb88cad66ad5a867293f83ecfc0c939c08,,,,,, -718,2025-11-02 22:57:52-0600,aribia llc 2540 monthly statement 2022 11.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 2540 monthly statement 2022 11.pdf,83461,294ff68a35bf69efa2c0bc2ab718ebd1ff402be3b6b89cad3ce722e35408fb41,,,,,, -719,2025-11-02 22:57:52-0600,aribia llc 2540 monthly statement 2022 12.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 2540 monthly statement 2022 12.pdf,127048,a7448656420d265383620eb6f89b100d9e6a079f0781665ebecdda087803e558,,,,,, -720,2025-11-02 22:57:52-0600,aribia llc 9551 monthly statement 2022 12.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/aribia llc 9551 monthly statement 2022 12.pdf,45890,f2e1a4b9784b239f49dc948883367ac47396122169fd1d1419af97d651e65d04,,,,,, -721,2025-11-02 22:58:19-0600,2023 Re Nick Funding of Brokerage account LLC.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2023 Re Nick Funding of Brokerage account LLC.pdf,218774,5e6225f783558847880aaa52d3204bae96075a2d65805d8404aeee657466ca0a,,,,,, -723,2025-11-02 22:58:19-0600,2024-08-30 - Re Formalizing Your Role and Next Steps for Aribia LLC.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-08-30 - Re Formalizing Your Role and Next Steps for Aribia LLC.pdf,629940,bc60e5d238cf981282e528d26951e3f562d9be88c1e74a484e027de5c889b809,,,,,, -724,2025-11-02 22:58:19-0600,2024-09-05 - Re Formalizing Your Role and Next Steps for Aribia LLC.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-09-05 - Re Formalizing Your Role and Next Steps for Aribia LLC.pdf,3912547,6743a2a06415da72555286b8be0ffbcfab54c0b777007b08424933e241d7d27f,,,,,, -725,2025-11-02 22:58:19-0600,2024-09-24 - Re Updated ARIBIA LLC Valuation Statement & Acknowledgment (2).pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-09-24 - Re Updated ARIBIA LLC Valuation Statement & Acknowledgment (2).pdf,2645873,fd3821fc6736ba2a9e36330d9ff101e760b12117474e47fef33b3b0e44498643,,,,,, -728,2025-11-02 22:58:27-0600,2024-03-01 - Unanimous Consent Equity Grant Valuation.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-01 - Unanimous Consent Equity Grant Valuation.pdf,475886,b199b760752fa5d7140dec65e4964166eac0acfbf0341b0e2439a9e8d10212aa,,,,,, -729,2025-11-02 22:58:27-0600,2024-03-15 - Operating Agreement - ARIBIA LLC APT ARLENE Revised.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-15 - Operating Agreement - ARIBIA LLC APT ARLENE Revised.pdf,793882,9a567dfee51734a3cf5ef4c62303986a8494da8a28ec75bb3942a9a1617a9cc4,,,,,, -730,2025-11-02 22:58:27-0600,2024-03-15 - Operating Agreement - ARIBIA LLC APT ARLENE.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-15 - Operating Agreement - ARIBIA LLC APT ARLENE.pdf,1067866,f8c010d1492ac8d9f00c31f10f0b61b03819fb09e3f604fbd8848ff7530093ef,,,,,, -731,2025-11-02 22:58:27-0600,2024-03-15 - Unanimous Consent Admission of New Member Sharon E Jones.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-03-15 - Unanimous Consent Admission of New Member Sharon E Jones.pdf,1296938,770f29e3aae7ac5f235ed96e3e7760bf84f1eeadb3d18c6244c821d35cd75ad6,,,,,, -733,2025-11-02 22:58:27-0600,2024-05-27 - Board Resolution of ARIBIA LLC Jones Loan & Collateral.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-05-27 - Board Resolution of ARIBIA LLC Jones Loan & Collateral.pdf,557338,8ea98db4489b28b2184ab3099c0ca1f59d7dff2a225c4215a397b3a3a8e95c7a,,,,,, -734,2025-11-02 22:58:27-0600,2024-06-06 - CREDIT MEMO for LOAN ADJUSTMENT ARIBIA LLC x JONES.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-06-06 - CREDIT MEMO for LOAN ADJUSTMENT ARIBIA LLC x JONES.pdf,687444,ebb484e168475f3f7261720f7252470295d7ec8bdd7d530d6754b5408d363073,,,,,, -735,2025-11-02 22:58:27-0600,2024-10-07 - Final Demand for Payment.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-10-07 - Final Demand for Payment.pdf,354861,dd5ad1b99ab9b1be94d7859847fbacd17837227a7b277f4e376becf77803d8b5,,,,,, -740,2025-11-02 22:58:27-0600,2024-10-29 - IT CAN BE LLC Formation.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-10-29 - IT CAN BE LLC Formation.pdf,430420,d07cbcc69cd7db370f50d760808733d5a7d8abe1a7b0e0efb4c6f13181888997,,,,,, -741,2025-11-02 22:58:27-0600,2024-10-29 - Operating Agreement - ARIBIA LLC AMENDMENT TO.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-10-29 - Operating Agreement - ARIBIA LLC AMENDMENT TO.pdf,473590,cfc0529112dceb227468f5a9f22768f09b98604f8ad3d21770eb33164d5ae728,,,,,, -742,2025-11-02 22:58:27-0600,2024-11-03 - Agreement - Amendment to Loan dated.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-11-03 - Agreement - Amendment to Loan dated.pdf,470492,18b30662ed40d1f1d1cf40c8bb8bb9ea3d5b4d67d3cbb8f355fe027fd4c5f98a,,,,,, -743,2025-11-02 22:58:27-0600,2024-11-12 - Initial Resolutions LLC Multi Member IT CAN BE LLC 05 09 51.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-11-12 - Initial Resolutions LLC Multi Member IT CAN BE LLC 05 09 51.pdf,126571,79f893412462ac55b99eafa4b5c52970147bf3c8e2e54dd76cafea81c4298791,,,,,, -744,2025-11-02 22:58:27-0600,2024-11-30 - Member Resolution Sharon Jones Authority.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-11-30 - Member Resolution Sharon Jones Authority.pdf,101102,70f74a5178f5647e839b198e7f3223e34a05724ae1a1c433c667b8e2272c5692,,,,,, -745,2025-11-02 22:58:28-0600,2024-12-17 - All Signed LLC documents in one.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-12-17 - All Signed LLC documents in one.pdf,15198130,9e40ee1efdce4c5a27adede47c8fcc3993442d432c07ccff12aa676490366db9,,,,,, -752,2025-11-02 22:58:53-0600,2024-05-31 - Nick shared Cozy Castle Luisa Arias Final Statement with you.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-05-31 - Nick shared Cozy Castle Luisa Arias Final Statement with you.eml,159,7ec3e0632dedc559868e2471cd9d0df40604795ecadd8fe685ef0d71070ec9c7,,,,,, -754,2025-11-02 22:58:53-0600,Agreement - Engagement.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Agreement - Engagement.eml,106,880778bade88f1defb9df8dc86613bf22c8e35a461541fc5f727619432688c17,,,,,, -755,2025-11-02 22:58:53-0600,Agreement - RE Engagement 2.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Agreement - RE Engagement 2.eml,112,f981e828e6486e34cecb71f00f830f891a0f70c06ea60793b627d73f490339ee,,,,,, -756,2025-11-02 22:58:53-0600,Agreement - RE Engagement 3.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Agreement - RE Engagement 3.eml,112,466c9e0291a8c75ba55422f6609ccac763b8d31a44b854aa52afb945c0f70e08,,,,,, -757,2025-11-02 22:58:53-0600,Agreement - Re Engagement.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Agreement - Re Engagement.eml,110,b238cd0e03abf19a923e1afcff90e93888e87019ee126ffe557b6886fed4d6ad,,,,,, -789,2025-11-02 22:58:53-0600,FW Brokerage account LLC.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/FW Brokerage account LLC.eml,113,afa5be559379aabe113cf8a86d35fea412a8bbe15f8b431ac042bc8f3012828d,,,,,, -791,2025-11-02 22:58:53-0600,Lease Agreement - Fw Request for.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Fw Request for.eml,117,3643f199b125fe457e9ec6ae30240c626ddec44ebc09a02d4778730bbcaf207d,,,,,, -792,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 10.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 10.eml,120,7aef25abbeaa15d05adfd63bdc64e2318c15e7c0e7a95f43337068a50ad6a745,,,,,, -793,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 11.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 11.eml,120,7d8182d4ef21b1069e652270e81cb6f49f61737991d755cbadf31570539eac80,,,,,, -794,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 12.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 12.eml,120,b30a1efb2b38a0d727ca54f4180a44b1b2fc29c4c1ccb13f470d1e36aedfe427,,,,,, -795,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 13.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 13.eml,120,ed782f0751b8ef5c725791b042a01c11d84dd04644e9575d86b5c448c93e2d52,,,,,, -796,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 14.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 14.eml,120,0f29dc54bebc65288ab20314f5c143fcdf11c36d436b3159d36ce3659dea33cb,,,,,, -797,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 15.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 15.eml,120,8adebae23771e4da2b84efecb21fe86d233e82df79e2abf47417e58184d7ef68,,,,,, -798,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 16.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 16.eml,120,6aaffcc516fc53f87bbe30671108a9141dab1c20804b5adfe085680daccc3196,,,,,, -799,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 17.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 17.eml,120,625d03bb930f3b4ca7a622d441a3eeae178a32226fc7ccc2cea0329f520b7470,,,,,, -800,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 18.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 18.eml,120,a0025157a694ca3626540188eb9860135b505b4aa88ce3b32c7ed02404e99a49,,,,,, -801,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 19.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 19.eml,120,e4e5c2bd70e32cf345c4b4b92a26e34b52ab8f3af003bc69fe323c19aa321244,,,,,, -802,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 2.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 2.eml,119,6b7e5eccf551cf7e18542f857f80fa8fb9b690b2e1f60280605481e6e7b556e7,,,,,, -803,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 20.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 20.eml,120,3a603a70dad723225b3e84fa266c54b69b8b253ab04aa5fd92d8a0e3c13b5da6,,,,,, -804,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 21.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 21.eml,120,0ce73c87432dac49d02911f3ebccaf8ae2935ef8f7f5027be74c9cfc9328529f,,,,,, -805,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 22.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 22.eml,120,7135695e83771b652c17b8e20ee56ba13b9ddda8428d825879ad17e24bf1c7c6,,,,,, -806,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 23.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 23.eml,120,f77889abd3884a9abcc6571a5cb7c3b73dddc67003638fa41d363745a3d3cfb6,,,,,, -807,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 24.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 24.eml,120,85f8f3550701111d30aba1dd855137b96e705f9c0d86c076890889eb914ae638,,,,,, -808,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 25.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 25.eml,120,ff49aac66baad8d5619870f11bb283fb6e7c9d676f5f35af05ab3dd0dc5149bb,,,,,, -809,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 26.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 26.eml,120,881511e2c9468081023c2e9d6fda5904dd742ad66469693b170cffa5cb396f9e,,,,,, -810,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 27.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 27.eml,120,1d63da7025db6140be0aba2d468ffacfd7e3e6c233962919d71c88fad729688d,,,,,, -811,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 3.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 3.eml,119,495dac7183dab87bd2e50e9a8fbe638cd9894d9583f654c1bc9da6cef0db2227,,,,,, -812,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 4.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 4.eml,119,e8a3694d649fd4e60da269ce80e10e526f9036289bcc88959313a805995e0cce,,,,,, -813,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 5.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 5.eml,119,5f3cca896c351688311c7144771fc17f4205050b5a1f0c40fd227198fd8f3adf,,,,,, -814,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 6.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 6.eml,119,71b966e2e2e4a2f2c710548103989b36c9bf0901c596f051a785ddcef5f908e7,,,,,, -815,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 7.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 7.eml,119,41c890dd71d64fc707e1d8ec35c13efa04de49c25e085331b437efb20549bc23,,,,,, -816,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 8.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 8.eml,119,570134e6e6f4ce38755c31e9883a747dd6650dfc687c953b163689adc3fdb858,,,,,, -817,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for 9.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for 9.eml,119,92bb917c2a8fb748aa30b18f16d1de7fb632e628a1ccabeb2d74ad9f2e9005c3,,,,,, -818,2025-11-02 22:58:53-0600,Lease Agreement - Re Request for.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Lease Agreement - Re Request for.eml,117,5267cf17740803d2043b4fc7901ea4d8fe21c86a102170edbdb79851ff1e8753,,,,,, -819,2025-11-02 22:58:53-0600,Nick shared 2019 Real Clean LLC AO with you.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Nick shared 2019 Real Clean LLC AO with you.eml,131,369ebd21acdf576746374723935344a95ee845838b920380c091011d541e5c93,,,,,, -820,2025-11-02 22:58:53-0600,Nick shared 2020 Real Clean LLC Involuntary Dissolution.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Nick shared 2020 Real Clean LLC Involuntary Dissolution.eml,152,793d2d4eab6d1e23929eb19b795ba36db272f5e7e42d65644d1c9541eaf7bb0a,,,,,, -824,2025-11-02 22:58:53-0600,Nick shared the folder Operating Documents ARIBIA LLC with.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Nick shared the folder Operating Documents ARIBIA LLC with.eml,152,08a3fe7db6a683fc642267e8fa0b98f1273a5fd7bf1652118c558cdde5af87d0,,,,,, -874,2025-11-02 22:58:53-0600,Re Brokerage account LLC 2.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Re Brokerage account LLC 2.eml,115,fa3db7c179bec970ac55fa1a3ffa7e63d5f8ce6f7b890590b43f5dd48b2471e9,,,,,, -875,2025-11-02 22:58:53-0600,Re Brokerage account LLC 3.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Re Brokerage account LLC 3.eml,115,6ddbc458625087cba46d9cf45bee8d5eda45778cd04a366fc11e2de623230922,,,,,, -876,2025-11-02 22:58:53-0600,Re Brokerage account LLC.eml,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Re Brokerage account LLC.eml,113,a41b1f2e69b007a308d77208760ae6d437fefd5abe49d1d0f4d50c2315fd7018,,,,,, -903,2025-11-02 22:59:11-0600,2022 Commodore Green Brian Landmark Association Ledger (504).pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2022 Commodore Green Brian Landmark Association Ledger (504).pdf,27957,c8e84d5ca27829ca6861af503eac8ccc8a4bef4602ec273d36871e3ac3e8ad6f,,,,,, -906,2025-11-02 22:59:11-0600,2022-04-26 - Receipt - USAA Wire $20000 BIANCHI PREMARITAL (504).pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2022-04-26 - Receipt - USAA Wire $20000 BIANCHI PREMARITAL (504).pdf,46265,712f052949339cbe8a88c732c75f7aa769e4276028a1fb1f7ec0b0afa27b5a0c,,,,,, -907,2025-11-02 22:59:11-0600,2022-05-05 - USAA Chk Stmt 940229 $20000 Down Payment (504).pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2022-05-05 - USAA Chk Stmt 940229 $20000 Down Payment (504).pdf,724999,d0d5daaeb09af683b2c55284915896ebffc43cc74dcd3ff3b17dec4a47aed544,,,,,, -909,2025-11-02 22:59:11-0600,2024-10-03 - Cook County Surf 504.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/2024-10-03 - Cook County Surf 504.pdf,21377,3fe6810b6b9f89fd5d1e5ccd8b9f25f02ce3ae7b0750e6b6ee34535275ea5227,,,,,, -911,2025-11-02 22:59:11-0600,C504 Key Fob Request Form.pdf,ARIBIA LLC Evidence Flat,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/C504 Key Fob Request Form.pdf,32362,eaaff986be9091226971416555b00eca0b85c612b7133adf44013fd0c8915809,,,,,, -915,2025-11-03 00:00:31-0600,2024 09 05 RLuisa e_ Final Notice_ Phone Payment Due Tomorrow ΓÇô Action Required.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/2024 09 05 RLuisa e_ Final Notice_ Phone Payment Due Tomorrow ΓÇô Action Required.pdf,5289,a133a2f3f9f166201db1166b0b840f6882f0d2ec54338fc8bd8480d29bce5573,,,,,, -930,2025-11-03 00:00:31-0600,Engagement Agreement.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Engagement Agreement.pdf,1908,59a607f10be7f76c6d4066c2acc0f6d25f5aec29fdc6e06a5c485663eb890f11,,,,,, -954,2025-11-03 00:00:31-0600,Fw_ Updated ARIBIA LLC Valuation Statement & Acknowledgment Request.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Fw_ Updated ARIBIA LLC Valuation Statement & Acknowledgment Request.pdf,14752,18cdbc83ffcfa26db97a19bedaf125563b5550c124c698e621e4a2e01e9bcc75,,,,,, -955,2025-11-03 00:00:31-0600,FW- Arias - Bianchi - access to Aribia LLC & appraisers.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/FW- Arias - Bianchi - access to Aribia LLC & appraisers.pdf,1950,da8c0656e8f10ab763ef1b14bc03bbd1d280c0c677b277d36573e9be2ee79975,,,,,, -961,2025-11-03 00:00:31-0600,FW- Brokerage account - LLC.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/FW- Brokerage account - LLC.pdf,1920,7416b690902d5bf93b43d79680820e5c22ccd9669f905b0c1cabf2d4e851af6d,,,,,, -976,2025-11-03 00:00:31-0600,Fw- Request for Lease Agreement.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Fw- Request for Lease Agreement.pdf,1921,0c55ed95ee44e57c158f9d46b935126978dff90a3d69c9e6d1aff48b38efc36f,,,,,, -983,2025-11-03 00:00:31-0600,Nick shared -2019 Real Clean LLC AO- with you.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Nick shared -2019 Real Clean LLC AO- with you.pdf,1938,6e3317eacea63ede2efd1e723b0feaa20c75cd520ef9917e03585eda15bfb4bf,,,,,, -984,2025-11-03 00:00:31-0600,Nick shared -2020 Real Clean LLC Involuntary Dissolution- with you.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Nick shared -2020 Real Clean LLC Involuntary Dissolution- with you.pdf,1958,ac72dc5b7d16be313b6bf15c2604bf028c8b88c57c1d7b7a24309ebbaa293348,,,,,, -985,2025-11-03 00:00:31-0600,Nick shared -2024 05 31 Cozy Castle Luisa Arias Final Statement- with you.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Nick shared -2024 05 31 Cozy Castle Luisa Arias Final Statement- with you.pdf,1962,ce76fefa9e9803b1ed6c058c383377d46b44d6427b9bb1b48e12b9cc53dc2850,,,,,, -991,2025-11-03 00:00:31-0600,Nick shared the folder -Operating Documents - ARIBIA LLC- with you.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Nick shared the folder -Operating Documents - ARIBIA LLC- with you.pdf,1962,7572a32d2cd6dae85855520282286a2fab08fa77c2b0a951afcc65585b1ddbe2,,,,,, -1028,2025-11-03 00:00:31-0600,Re- Brokerage account - LLC 2.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Brokerage account - LLC 2.pdf,1920,9f5bac0d80b3b4d7470d62bd6e78b17ec6d00cca3e5ad039be3f1d3ca4310563,,,,,, -1029,2025-11-03 00:00:31-0600,Re- Brokerage account - LLC 3.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Brokerage account - LLC 3.pdf,1920,77a16f767ca661b55db7477081c413bcd73f199ca72d42e9cb15259db68938d9,,,,,, -1030,2025-11-03 00:00:31-0600,Re- Brokerage account - LLC.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Brokerage account - LLC.pdf,1918,5dbc003a2ca183317daa00c566ecf1b427541121cdf65a531a57734a89c33b8e,,,,,, -1036,2025-11-03 00:00:31-0600,RE- Engagement Agreement 2.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/RE- Engagement Agreement 2.pdf,1913,ee0d7f05290125f4fd137616b3f3270a582deb822c70eac1949e8c98e461c184,,,,,, -1037,2025-11-03 00:00:31-0600,RE- Engagement Agreement 3.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/RE- Engagement Agreement 3.pdf,1913,343f361a991bbde7ddc40cea3a2207b9fa740dc68ddf3fb2acd7dfb2df54b591,,,,,, -1038,2025-11-03 00:00:31-0600,Re- Engagement Agreement.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Engagement Agreement.pdf,1911,6e73f8be61bfe80dcda63d0b993811966d9435ef5d7f635a2a24c4082a4472e5,,,,,, -1048,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 10.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 10.pdf,1922,0dcb59f6edf38ec80ed1dc77d65aa8816e76fef4e9896c631b0e1e0157897f75,,,,,, -1049,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 11.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 11.pdf,1922,ee66fd59664e91626b9d06e971d3d36a47e730e4bc296ad0828d23548bc1517c,,,,,, -1050,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 12.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 12.pdf,1922,04549b29554b6b215fc2f98e9e9a72197ddd65441fdb5938eea6f4bfbf957209,,,,,, -1051,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 13.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 13.pdf,1923,d8124a195ff02693c36144850e2952e768beb300a880d3b9e5fcbced3a8d1021,,,,,, -1052,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 14.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 14.pdf,1923,2ff904f8eb2ec4fdeb9567257739252f1e7e4ab6cd69842c6c84a38edcf10c98,,,,,, -1053,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 15.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 15.pdf,1923,be9d864bea133313124bbffd59a29dbaee6d8bfeb3c31ea144a316881e80895e,,,,,, -1054,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 16.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 16.pdf,1923,3817d9915b8c1ae3ebdf45a24ef2e895da2251cc0d5526caebe379e6719a1ad2,,,,,, -1055,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 17.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 17.pdf,1923,5f9efbf3ba02f552f89471bf8a81e5059132d060186c5401d7e6a259e630f814,,,,,, -1056,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 18.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 18.pdf,1922,2e10bd262ae3290cafe4251544cfa46d83b2b41feac4b161b520cddc4bffaa0f,,,,,, -1057,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 19.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 19.pdf,1923,d8d66eba028505859b75d6c85922d5ee2e0a24e1a5fc4d44a35609afc2d9b76c,,,,,, -1058,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 2.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 2.pdf,1922,ad9db5fba16419fe8323bace97583b1e9c571af5c849888fbc94fa239bd85549,,,,,, -1059,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 20.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 20.pdf,1923,f799cd5809b0b54a09c4a4adfc9f9fbc93174ca3868fea857b0be77dea9ff9e2,,,,,, -1060,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 21.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 21.pdf,1923,844ec2dec0242dbb3cc8eecb8d457af7ff092547503fb09ff056c4626e2b41a0,,,,,, -1061,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 22.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 22.pdf,1923,3504bf353acb02b06279ac44c2585a412cba750fc79cc76072df25c122d2a844,,,,,, -1062,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 23.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 23.pdf,1922,4eb614a56c618dced690c52c648e2f163170b249caf46974b3e9320d87759076,,,,,, -1063,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 24.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 24.pdf,1923,15a4b91a03e7743d2c9d8a61dd2e723814a1996da02bd7386e732281af49cad7,,,,,, -1064,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 25.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 25.pdf,1923,7e90aff202c219ed36c49fd3af58c7dcb5e57ca5959dd76b7fe655c85a136194,,,,,, -1065,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 26.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 26.pdf,1922,a4e94ff79b7eb7501af5d86c433d0792dc939e60a146604618b9bbfc9e07d877,,,,,, -1066,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 27.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 27.pdf,1923,9b27ab15e971ce77ca23da89e26c3d99ede0675bc6128cbac1d61abe2cc8c97b,,,,,, -1067,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 3.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 3.pdf,1922,db2c2218e9069adfce7eede764fc7d3ba918e90bec19617b8c5384f5b29fafe6,,,,,, -1068,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 4.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 4.pdf,1922,0b25c8fb165e2cbe573db0e4888ba69ac1734e750e606e57e9f74c3bd1a867db,,,,,, -1069,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 5.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 5.pdf,1922,57a946ae2ecba7cdee42519186d60061911b019baa945efbd69b2f9838a67574,,,,,, -1070,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 6.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 6.pdf,1922,4727d91182f63b053e8663a3f289cd7ca9fb3f14ab837945227df3ff100bf1de,,,,,, -1071,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 7.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 7.pdf,1922,5e5d60b13892ba46975525aafa52e05b217d787322d3aa35135078e050d00170,,,,,, -1072,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 8.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 8.pdf,1922,4a5a2f841b2cae279953110b107fcc9226062160c4c2a6d34ede8bb4db13ffa2,,,,,, -1073,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement 9.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement 9.pdf,1922,2ab993be9a2b36c0547d4296c2847801c4af91bbec8b0cba263edb5f397b09be,,,,,, -1074,2025-11-03 00:00:31-0600,Re- Request for Lease Agreement.pdf,Emails as PDF,/Users/nb/Library/Mobile Documents/com~apple~CloudDocs/ARIBIA LLC Evidence Flat/Emails as PDF/Re- Request for Lease Agreement.pdf,1920,d4b0ca5871c4c5249a59d7f35dba589638610f354a7a3431f0d3f4cff2d4cc64,,,,,, diff --git a/alexis-rent-notice.html b/alexis-rent-notice.html deleted file mode 100755 index cc2c4be..0000000 --- a/alexis-rent-notice.html +++ /dev/null @@ -1,476 +0,0 @@ - - - - - - Rent Payment Notice - Alexis Pheng - - - -
- -
-
Chicago Furnished Condos by ARIBIA
-
Premium Short-Term & Furnished Rentals
-
- ARIBIA LLC - MGMT | 550 W Surf St, Chicago, IL 60657
- Email: [property.manager@aribia.com] | Phone: [312-XXX-XXXX] -
-
- - -
-

RENT PAYMENT NOTICE

-
- Tenant Name: - Alexis Pheng -
-
- Property: - City Studio at The Commodore - Unit C211 -
-
- Address: - 550 W Surf St C211, Chicago, IL 60657 -
-
- Lease ID: - 690e47b7d84b610e20287ca2 -
-
- Notice Date: - December 9, 2025 -
-
- - -
-
⚠️ Amount Due Immediately
-
$1,282.26
-
December 1-15, 2025 Prorated Rent | 8 Days Overdue
-
- - -
-
⚠️Action Required: Outstanding Rent Payment
-
- Your December rent payment is 8 days past due. Please submit payment immediately to avoid additional late fees and maintain your good tenant standing. -
-
- - -
-

Dear Alexis,

- -

I hope this message finds you well. I'm reaching out regarding your December rent payment for City Studio at The Commodore. Our records indicate that the prorated rent payment of $1,282.26 for December 1-15, 2025 has not yet been received and is now 8 days past due as of December 9, 2025.

- -

Account Summary

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
DateDescriptionAmountBalanceStatus
Nov 6, 2025Pro-Rated Rent (Nov 8-30)$2,031.67$0.00PAID ✓
Nov 6, 2025Move-In Fees$750.00$0.00PAID ✓
Nov 6, 2025Management Fee (Waived)-$250.00$0.00CREDIT
Dec 1, 2025Prorated Rent (Dec 1-15)$1,282.26$1,282.26OVERDUE ✗
- -

Acknowledgment of Previous Payment

-

We want to acknowledge that your November payment was received on time and in full ($2,781.67 paid on November 6, 2025). We appreciate your prompt payment, which is why we're reaching out personally to address this month's outstanding balance.

- -

Payment Methods

- -
-
-
Option 1: Tenant Portal (Recommended)
-
    -
  • Instant processing via EPAY
  • -
  • Log in at: [Portal URL]
  • -
  • Reference Lease ID: 690e47b7d84b610e20287ca2
  • -
-
- -
-
Option 2: Bank Transfer
-
    -
  • [Bank transfer details]
  • -
  • [Account information]
  • -
-
-
- -

Important Late Fee Information

-

Per your lease agreement and the Chicago Residential Landlord and Tenant Ordinance (RLTO), late fees may apply as follows:

-
    -
  • Late Fee Calculation: $10 for the first $500 + 5% of the remaining balance
  • -
  • Applicable Late Fee: $49.11 ($10 + 5% of $782.26)
  • -
  • To Avoid Late Fees: Payment must be received by December 12, 2025
  • -
- -

Additional Compliance Matter

-

We've also noticed that proof of renters insurance has not been provided as required by your lease agreement. Please submit documentation of active coverage to avoid monthly compliance charges.

- -

Upcoming Rent Schedule

-

Please note that your full monthly rent schedule is as follows:

-
    -
  • December 16, 2025: Full monthly rent begins ($2,650/month)
  • -
  • January 1, 2026: Regular monthly billing ($2,650/month)
  • -
- -

Next Steps

-

Please remit payment of $1,282.26 by December 12, 2025 to maintain your account in good standing.

- -

If you're experiencing financial difficulty or have questions about your account, please contact me directly. We're here to work with you and discuss payment plan options if needed.

- -

Contact Information

-
    -
  • Phone: [Property Manager Phone]
  • -
  • Email: [Property Manager Email]
  • -
  • Office Hours: Monday - Friday, 9:00 AM - 5:00 PM CST
  • -
- -

We value you as a tenant and look forward to resolving this matter promptly. Thank you for your immediate attention.

- - -
-

Best regards,

-
-
[Property Manager Name]
-
Property Manager
-
Chicago Furnished Condos by ARIBIA
-
[Phone] | [Email]
-
-
- - - -
- - - - diff --git a/apply-schema-refactor.patch b/apply-schema-refactor.patch deleted file mode 100755 index b718c29..0000000 --- a/apply-schema-refactor.patch +++ /dev/null @@ -1,37 +0,0 @@ -diff --git a/shared/schema.ts b/shared/schema.ts -index 0000000..1111111 100644 ---- a/shared/schema.ts -+++ b/shared/schema.ts -@@ -1,200 +1,60 @@ --// REMOVE ALL TABLE DEFINITIONS FROM THIS FILE. --// shared/schema.ts now only exports shared types used by both schemas. -- --export type IntegrationStatus = "connected" | "disconnected" | "error"; --export type TenantRole = "owner" | "admin" | "manager" | "viewer"; -- --export interface FinancialSummary { -- id: string; -- userId: string; -- cashOnHand: number; -- revenue: number; -- expenses: number; -- outstandingInvoices: number; -- createdAt: string; --} -+// Shared types ONLY — no Drizzle table definitions. -+// Actual tables now live in: -+// database/system.schema.ts (Postgres) -+// database/standalone.schema.ts (SQLite) - -+export type IntegrationStatus = "connected" | "disconnected" | "error"; -+export type TenantRole = "owner" | "admin" | "manager" | "viewer"; - -+export interface FinancialSummary { -+ id: string; -+ userId: string; -+ cashOnHand: number; -+ revenue: number; -+ expenses: number; -+ outstandingInvoices: number; -+ createdAt: string; -+} diff --git a/attached_assets/Pasted-AI-CFO-To-create-a-sustainable-cost-reduction-plan-we-aim-to-identify-and-eliminate-inefficiencies-1747722728667.txt b/attached_assets/Pasted-AI-CFO-To-create-a-sustainable-cost-reduction-plan-we-aim-to-identify-and-eliminate-inefficiencies-1747722728667.txt deleted file mode 100755 index 8d773dc..0000000 --- a/attached_assets/Pasted-AI-CFO-To-create-a-sustainable-cost-reduction-plan-we-aim-to-identify-and-eliminate-inefficiencies-1747722728667.txt +++ /dev/null @@ -1,84 +0,0 @@ -AI CFO: -To create a sustainable cost reduction plan, we aim to identify and eliminate inefficiencies, negotiate better terms, and optimize resource allocation. Here is the proposed plan: - -1. **Conduct a Comprehensive Expense Audit** - -• **Action**: Perform a detailed review of all expense categories to identify any redundant or non-essential spending. - -• **Timeline**: 1-2 weeks - -• **Goal**: Identify at least 5% of expenses that can be reduced or eliminated. - -2. **Negotiate Supplier Contracts** - -• **Action**: Contact vendors to negotiate discounts or more favorable terms on current agreements (e.g., bulk discounts, payment terms). - -• **Timeline**: 2-4 weeks - -• **Goal**: Achieve an average of 10% cost reduction on supplies and materials. - -3. **Optimize Utilities and Rent** - -• **Action**: Analyze energy usage and implement energy-saving initiatives (e.g., LED lighting, programmable thermostats). Re-evaluate lease agreements and negotiate rent reductions or renewals at lower rates. - -• **Timeline**: 1-2 weeks for analysis; implementation may vary. - -• **Goal**: Reduce utility costs by 10% and rent by renegotiation wherever possible. - -4. **Implement Technology Solutions** - -• **Action**: Invest in or improve technology such as automation tools or project management software to increase operational efficiency and reduce labor costs. - -• **Timeline**: 2-3 weeks for implementation. - -• **Goal**: Improve productivity to achieve a 5% reduction in labor-related expenses. - -5. **Evaluate Workforce Efficiency** - -• **Action**: Review staffing schedules and optimize workforce deployment to match demand, reducing overtime and considering role consolidation where feasible. - -• **Timeline**: 2-3 weeks - -• **Goal**: Reduce payroll expenses by 5-7% without layoffs. - -6. **Reduce Marketing Expenses** - -• **Action**: Shift towards cost-effective digital marketing strategies and review current marketing campaigns for effectiveness. - -• **Timeline**: 2-3 weeks to assess and reallocate funds. - -• **Goal**: Achieve a 10% reduction in marketing expenses while maintaining or increasing ROI through more targeted strategies. - -7. **Control Travel and Entertainment Costs** - -• **Action**: Limit non-essential travel and switch to virtual meetings. Set stricter approval processes for travel and entertainment expenses. - -• **Timeline**: Immediate implementation. - -• **Goal**: Reduce these costs by 15%. - -8. **Enhance Inventory Management** - -• **Action**: Implement just-in-time inventory practices to reduce carrying costs and minimize waste and obsolescence. - -• **Timeline**: 3-4 weeks for setting up processes and systems. - -• **Goal**: Reduce inventory holding costs by 10%. - -9. **Outsource Non-Core Functions** - -• **Action**: Explore options for outsourcing non-critical operations such as IT support, HR, accounting, or janitorial services at a lower cost. - -• **Timeline**: 4-6 weeks to assess and initiate contracts. - -• **Goal**: Achieve a cost reduction of 15% on outsourced services. - -10. **Employee Engagement for Cost Savings** - -• **Action**: Engage employees in identifying cost-saving opportunities through incentives for practical ideas that save money. - -• **Timeline**: Ongoing - -• **Goal**: Foster a culture of cost-consciousness and gather innovative ideas for savings. - -Regular reviews and adjustments to these initiatives will ensure long-term sustainability and operational efficiency. Implement monitoring measures to track progress and adjust strategie \ No newline at end of file diff --git a/attached_assets/SERVICES.png b/attached_assets/SERVICES.png deleted file mode 100755 index 2556bf0..0000000 Binary files a/attached_assets/SERVICES.png and /dev/null differ diff --git "a/attached_assets/Screenshot 2025-05-20 at 1.29.06\342\200\257AM.png" "b/attached_assets/Screenshot 2025-05-20 at 1.29.06\342\200\257AM.png" deleted file mode 100755 index a47e183..0000000 Binary files "a/attached_assets/Screenshot 2025-05-20 at 1.29.06\342\200\257AM.png" and /dev/null differ diff --git "a/attached_assets/Screenshot 2025-05-20 at 1.29.26\342\200\257AM.png" "b/attached_assets/Screenshot 2025-05-20 at 1.29.26\342\200\257AM.png" deleted file mode 100755 index 0685c58..0000000 Binary files "a/attached_assets/Screenshot 2025-05-20 at 1.29.26\342\200\257AM.png" and /dev/null differ diff --git "a/attached_assets/Screenshot 2025-05-20 at 1.30.01\342\200\257AM.png" "b/attached_assets/Screenshot 2025-05-20 at 1.30.01\342\200\257AM.png" deleted file mode 100755 index 33025b1..0000000 Binary files "a/attached_assets/Screenshot 2025-05-20 at 1.30.01\342\200\257AM.png" and /dev/null differ diff --git "a/attached_assets/Screenshot 2025-05-20 at 1.31.33\342\200\257AM.png" "b/attached_assets/Screenshot 2025-05-20 at 1.31.33\342\200\257AM.png" deleted file mode 100755 index e9dc779..0000000 Binary files "a/attached_assets/Screenshot 2025-05-20 at 1.31.33\342\200\257AM.png" and /dev/null differ diff --git a/check_system_operations_duplicates.js b/check_system_operations_duplicates.js deleted file mode 100755 index 9f89acb..0000000 --- a/check_system_operations_duplicates.js +++ /dev/null @@ -1,287 +0,0 @@ -#!/usr/bin/env node - -/** - * System Operations Database Duplicate Checker - * Queries Neon database to check for duplicates and inconsistencies - */ - -import { neon } from '@neondatabase/serverless'; -import { config } from 'dotenv'; -import { fileURLToPath } from 'url'; -import { dirname, join } from 'path'; - -// Load environment variables -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); -config({ path: join(__dirname, '../.env') }); - -async function checkSystemOperationsDuplicates() { - console.log('🔍 Checking Neon database for system_operations duplicates and inconsistencies...\n'); - - const sql = neon(process.env.NEON_DATABASE_URL); - - if (!process.env.NEON_DATABASE_URL) { - console.error('❌ NEON_DATABASE_URL environment variable not set'); - console.log('Please ensure your .env file contains the NEON_DATABASE_URL'); - return; - } - - try { - // Test connection - await sql`SELECT 1 as test`; - console.log('✅ Successfully connected to Neon database\n'); - - // Check if system_operations table exists - const tableExists = await sql` - SELECT EXISTS ( - SELECT FROM information_schema.tables - WHERE table_name = 'system_operations' - ); - `; - - if (!tableExists[0].exists) { - console.log('❌ system_operations table does not exist'); - console.log('Creating table...\n'); - - // Create the table - await sql` - CREATE TABLE IF NOT EXISTS system_operations ( - id SERIAL PRIMARY KEY, - timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - operation TEXT NOT NULL, - system TEXT NOT NULL, - status TEXT NOT NULL, - details TEXT, - user_email TEXT, - environment TEXT DEFAULT 'development', - metadata JSONB DEFAULT '{}', - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP - ); - `; - - // Create indexes - await sql`CREATE INDEX IF NOT EXISTS idx_system_operations_timestamp ON system_operations(timestamp);`; - await sql`CREATE INDEX IF NOT EXISTS idx_system_operations_operation ON system_operations(operation);`; - await sql`CREATE INDEX IF NOT EXISTS idx_system_operations_system ON system_operations(system);`; - await sql`CREATE INDEX IF NOT EXISTS idx_system_operations_status ON system_operations(status);`; - - console.log('✅ system_operations table created with indexes\n'); - } else { - console.log('✅ system_operations table exists\n'); - } - - // Get total entries - const totalCount = await sql`SELECT COUNT(*) as count FROM system_operations`; - console.log(`📊 Total entries in system_operations: ${totalCount[0].count}\n`); - - if (totalCount[0].count === 0) { - console.log('ℹ️ No entries found in system_operations table'); - console.log('This could mean:'); - console.log(' - Table is new and no operations have been logged yet'); - console.log(' - Operations are being logged to files only'); - console.log(' - Database logging is not yet configured'); - return; - } - - // Check for exact duplicates (same operation + timestamp + system) - console.log('🔍 Checking for exact duplicates...'); - const exactDuplicates = await sql` - SELECT - operation, - timestamp, - system, - COUNT(*) as duplicate_count, - ARRAY_AGG(id) as duplicate_ids - FROM system_operations - GROUP BY operation, timestamp, system - HAVING COUNT(*) > 1 - ORDER BY duplicate_count DESC - `; - - if (exactDuplicates.length > 0) { - console.log(`❌ Found ${exactDuplicates.length} sets of exact duplicates:`); - exactDuplicates.forEach(dup => { - console.log(` - ${dup.operation} (${dup.system}) at ${dup.timestamp}: ${dup.duplicate_count} copies`); - console.log(` IDs: ${dup.duplicate_ids.join(', ')}`); - }); - console.log(''); - } else { - console.log('✅ No exact duplicates found\n'); - } - - // Check for near duplicates (same operation + system, different timestamps) - console.log('🔍 Checking for near duplicates (same operation/system)...'); - const nearDuplicates = await sql` - SELECT - operation, - system, - COUNT(*) as count, - MIN(timestamp) as first_occurrence, - MAX(timestamp) as last_occurrence, - ARRAY_AGG(DISTINCT status) as statuses - FROM system_operations - GROUP BY operation, system - HAVING COUNT(*) > 1 - ORDER BY count DESC - `; - - if (nearDuplicates.length > 0) { - console.log(`⚠️ Found ${nearDuplicates.length} operations with multiple entries:`); - nearDuplicates.forEach(dup => { - const timeDiff = new Date(dup.last_occurrence) - new Date(dup.first_occurrence); - const hours = Math.round(timeDiff / (1000 * 60 * 60)); - console.log(` - ${dup.operation} (${dup.system}): ${dup.count} entries over ${hours} hours`); - console.log(` Statuses: ${dup.statuses.join(', ')}`); - console.log(` First: ${dup.first_occurrence}, Last: ${dup.last_occurrence}`); - }); - console.log(''); - } else { - console.log('✅ No near duplicates found\n'); - } - - // Check for operations by status - console.log('📊 Operations by status:'); - const statusBreakdown = await sql` - SELECT status, COUNT(*) as count - FROM system_operations - GROUP BY status - ORDER BY count DESC - `; - statusBreakdown.forEach(row => { - console.log(` - ${row.status}: ${row.count}`); - }); - console.log(''); - - // Check for operations by system - console.log('📊 Operations by system:'); - const systemBreakdown = await sql` - SELECT system, COUNT(*) as count - FROM system_operations - GROUP BY system - ORDER BY count DESC - `; - systemBreakdown.forEach(row => { - console.log(` - ${row.system}: ${row.count}`); - }); - console.log(''); - - // Check for operations by type - console.log('📊 Operations by type:'); - const operationBreakdown = await sql` - SELECT operation, COUNT(*) as count - FROM system_operations - GROUP BY operation - ORDER BY count DESC - `; - operationBreakdown.forEach(row => { - console.log(` - ${row.operation}: ${row.count}`); - }); - console.log(''); - - // Check for recent operations - console.log('📅 Recent operations (last 10):'); - const recentOps = await sql` - SELECT - id, - timestamp, - operation, - system, - status, - CASE - WHEN LENGTH(details) > 100 THEN LEFT(details, 100) || '...' - ELSE details - END as short_details - FROM system_operations - ORDER BY timestamp DESC - LIMIT 10 - `; - recentOps.forEach(op => { - console.log(` - [${op.id}] ${op.timestamp}: ${op.operation} (${op.system}) - ${op.status}`); - if (op.short_details) { - console.log(` ${op.short_details}`); - } - }); - console.log(''); - - // Check for orphaned or inconsistent data - console.log('🔍 Checking for data inconsistencies...'); - - const inconsistencies = []; - - // Check for operations without user_email - const noUserEmail = await sql` - SELECT COUNT(*) as count FROM system_operations WHERE user_email IS NULL - `; - if (noUserEmail[0].count > 0) { - inconsistencies.push(`${noUserEmail[0].count} operations without user_email`); - } - - // Check for operations without environment - const noEnvironment = await sql` - SELECT COUNT(*) as count FROM system_operations WHERE environment IS NULL - `; - if (noEnvironment[0].count > 0) { - inconsistencies.push(`${noEnvironment[0].count} operations without environment`); - } - - // Check for invalid JSON in metadata - const invalidMetadata = await sql` - SELECT COUNT(*) as count - FROM system_operations - WHERE metadata IS NULL OR metadata = '' - `; - if (invalidMetadata[0].count > 0) { - inconsistencies.push(`${invalidMetadata[0].count} operations with empty/null metadata`); - } - - if (inconsistencies.length > 0) { - console.log('⚠️ Data inconsistencies found:'); - inconsistencies.forEach(issue => { - console.log(` - ${issue}`); - }); - console.log(''); - } else { - console.log('✅ No data inconsistencies found\n'); - } - - // Generate summary and recommendations - console.log('📋 SUMMARY AND RECOMMENDATIONS:\n'); - - if (exactDuplicates.length > 0) { - console.log('🔧 CLEANUP NEEDED: Exact duplicates detected'); - console.log(' Recommendation: Remove duplicate entries, keeping the earliest one'); - console.log(' SQL to remove duplicates:'); - console.log(' DELETE FROM system_operations WHERE id NOT IN ('); - console.log(' SELECT MIN(id) FROM system_operations'); - console.log(' GROUP BY operation, timestamp, system'); - console.log(' );\n'); - } - - if (nearDuplicates.length > 0) { - console.log('⚠️ REVIEW NEEDED: Multiple entries for same operations'); - console.log(' These might be legitimate (retries, updates) or duplicate logging'); - console.log(' Review each case to determine if consolidation is needed\n'); - } - - if (inconsistencies.length > 0) { - console.log('🔧 DATA QUALITY: Inconsistencies need attention'); - console.log(' Consider adding validation and default values\n'); - } - - console.log('✅ Database health check complete!'); - - } catch (error) { - console.error('❌ Error checking database:', error); - console.error('Error details:', error.message); - - if (error.message.includes('connection')) { - console.log('\n💡 Troubleshooting:'); - console.log(' - Check NEON_DATABASE_URL is correct'); - console.log(' - Verify database is accessible'); - console.log(' - Ensure SSL is configured properly'); - } - } -} - -// Run the check -checkSystemOperationsDuplicates().catch(console.error); \ No newline at end of file diff --git a/client/src/App.tsx b/client/src/App.tsx index de9da4c..1883332 100755 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -13,6 +13,7 @@ import Properties from "@/pages/Properties"; import Sidebar from "@/components/layout/Sidebar"; import Header from "@/components/layout/Header"; import Connections from "@/pages/Connections"; +import Dashboard from "@/pages/Dashboard"; import { User } from "@shared/schema"; import { ThemeProvider } from "@/contexts/ThemeContext"; import { TenantProvider } from "@/contexts/TenantContext"; @@ -31,6 +32,7 @@ function Router() {
+ diff --git a/client/src/components/layout/Header.tsx b/client/src/components/layout/Header.tsx index b368ba7..b9524e8 100755 --- a/client/src/components/layout/Header.tsx +++ b/client/src/components/layout/Header.tsx @@ -1,9 +1,21 @@ import { Bell, Search, Command } from "lucide-react"; import { useRole } from "@/contexts/RoleContext"; +import { useLocation } from "wouter"; import { TenantSwitcher } from "./TenantSwitcher"; +const PAGE_LABELS: Record = { + '/': 'Portfolio', + '/dashboard': 'Dashboard', + '/connections': 'Connections', + '/admin': 'Admin', + '/settings': 'Settings', +}; + export default function Header() { const { currentRole, roleConfig } = useRole(); + const [location] = useLocation(); + const pageLabel = PAGE_LABELS[location] || (location.startsWith('/properties/') ? 'Property Detail' : 'Overview'); + return (
{/* Tenant Switcher / Breadcrumb */} @@ -11,7 +23,7 @@ export default function Header() { / - Overview + {pageLabel} diff --git a/client/src/components/layout/Sidebar.tsx b/client/src/components/layout/Sidebar.tsx index fa88d49..76d0a26 100755 --- a/client/src/components/layout/Sidebar.tsx +++ b/client/src/components/layout/Sidebar.tsx @@ -1,10 +1,9 @@ import { Link, useLocation } from "wouter"; import { cn } from "@/lib/utils"; import { - BarChart3, ArrowLeftRight, FileText, Receipt, - Settings, Plug, Building2, Users, BookOpen, Calculator, Shield, - ChevronDown, ChevronRight, ChevronsUpDown, Wallet, - Menu, X, Activity + Settings, Plug, Building2, Shield, + ChevronDown, ChevronRight, ChevronsUpDown, + Menu, X, Activity, LayoutDashboard } from "lucide-react"; import { useState, useMemo } from "react"; import { useRole, type UserRole } from "@/contexts/RoleContext"; @@ -21,14 +20,7 @@ interface NavItem { const NAV_ITEMS: NavItem[] = [ { href: "/", label: "Portfolio", icon: Building2, roles: ["cfo", "accountant", "bookkeeper", "user"] }, - { href: "/accounts", label: "Accounts", icon: Wallet, roles: ["cfo", "accountant", "bookkeeper"] }, - { href: "/transactions", label: "Transactions", icon: ArrowLeftRight, roles: ["cfo", "accountant", "bookkeeper", "user"] }, - { href: "/reports", label: "Reports", icon: BarChart3, roles: ["cfo", "accountant"] }, - { href: "/reconciliation", label: "Reconciliation", icon: Calculator, roles: ["accountant", "bookkeeper"] }, - { href: "/invoices", label: "Invoices", icon: FileText, roles: ["cfo", "accountant", "bookkeeper"] }, - { href: "/expenses", label: "Expenses", icon: Receipt, roles: ["user"] }, - { href: "/journal", label: "Journal", icon: BookOpen, roles: ["accountant"] }, - { href: "/team", label: "Team", icon: Users, roles: ["cfo"] }, + { href: "/dashboard", label: "Dashboard", icon: LayoutDashboard, roles: ["cfo", "accountant", "bookkeeper", "user"] }, { href: "/connections", label: "Connections", icon: Plug, roles: ["cfo", "accountant"] }, { href: "/admin", label: "Admin", icon: Shield, roles: ["cfo"] }, { href: "/settings", label: "Settings", icon: Settings, roles: ["cfo", "accountant", "bookkeeper", "user"] }, @@ -196,7 +188,7 @@ export default function Sidebar() { const [location] = useLocation(); const [mobileOpen, setMobileOpen] = useState(false); const { currentRole } = useRole(); - const { currentTenant, tenants, switchTenant, isSystemMode } = useTenant(); + const { currentTenant, tenants, switchTenant } = useTenant(); const [entityExpanded, setEntityExpanded] = useState(true); const entityTree = useMemo(() => buildEntityTree(tenants), [tenants]); diff --git a/client/src/lib/utils.ts b/client/src/lib/utils.ts index d9afb6e..1dd3420 100755 --- a/client/src/lib/utils.ts +++ b/client/src/lib/utils.ts @@ -70,7 +70,6 @@ export function getServiceIcon(serviceType: string): React.ReactNode { const iconMap: Record = { 'mercury_bank': 'M', 'wavapps': 'W', - 'doorloop': 'D', 'stripe': 'S', 'quickbooks': 'Q', 'xero': 'X', @@ -87,7 +86,6 @@ export function getServiceColor(serviceType: string): string { const colorMap: Record = { 'mercury_bank': 'bg-blue-500', 'wavapps': 'bg-teal-500', - 'doorloop': 'bg-orange-500', 'stripe': 'bg-purple-500', 'quickbooks': 'bg-green-500', 'xero': 'bg-blue-400', diff --git a/client/src/pages/Admin.tsx b/client/src/pages/Admin.tsx index 6f4dc0a..4f05f83 100644 --- a/client/src/pages/Admin.tsx +++ b/client/src/pages/Admin.tsx @@ -33,7 +33,6 @@ const SERVICES: ServiceHealth[] = [ { name: "ChittyCommand", url: "command.chitty.cc", status: "healthy", latency: 67, lastCheck: "1m ago", version: "3.1.0" }, { name: "ChittyRegister", url: "register.chitty.cc", status: "healthy", latency: 31, lastCheck: "1m ago", version: "1.0.5" }, { name: "ChittyRouter", url: "router.chitty.cc", status: "degraded", latency: 234, lastCheck: "2m ago", version: "1.1.0" }, - { name: "DoorLoop", url: "api.doorloop.com", status: "unknown", lastCheck: "—" }, { name: "Wave Accounting", url: "api.waveapps.com", status: "healthy", latency: 156, lastCheck: "5m ago" }, ]; @@ -51,7 +50,6 @@ const INTEGRATIONS: IntegrationConfig[] = [ { name: "Wave Accounting", configured: true, envVars: ["WAVE_CLIENT_ID", "WAVE_CLIENT_SECRET"], status: "active", lastSync: "1h ago" }, { name: "Stripe Payments", configured: true, envVars: ["STRIPE_SECRET_KEY", "STRIPE_WEBHOOK_SECRET"], status: "active", lastSync: "5m ago" }, { name: "OpenAI (GPT-4o)", configured: true, envVars: ["OPENAI_API_KEY"], status: "active" }, - { name: "DoorLoop", configured: false, envVars: ["DOORLOOP_API_KEY"], status: "inactive" }, { name: "GitHub", configured: true, envVars: ["GITHUB_TOKEN"], status: "active" }, ]; diff --git a/client/src/pages/ConnectAccounts.tsx b/client/src/pages/ConnectAccounts.tsx index eb5ba99..2a376eb 100755 --- a/client/src/pages/ConnectAccounts.tsx +++ b/client/src/pages/ConnectAccounts.tsx @@ -7,7 +7,7 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { useToast } from "@/hooks/use-toast"; import { useLocation } from "wouter"; import { apiRequest } from "@/lib/queryClient"; -import { Building, CreditCard, DollarSign, BarChart4, Home, CreditCard as CreditCardIcon } from "lucide-react"; +import { Building, CreditCard, DollarSign, BarChart4, CreditCard as CreditCardIcon } from "lucide-react"; import { AuthContext } from "../App"; // Service connection card component @@ -54,7 +54,7 @@ export default function ConnectAccounts() { const [loading, setLoading] = useState(false); const [apiKey, setApiKey] = useState(""); const [connectedServices, setConnectedServices] = useState([ - "mercury_bank", "doorloop" // Default connected services + "mercury_bank" // Default connected services ]); // Redirect to login if not authenticated @@ -124,7 +124,6 @@ export default function ConnectAccounts() { "quickbooks": "QuickBooks", "xero": "Xero Accounting", "wavapps": "WavApps", - "doorloop": "DoorLoop", "brex": "Brex", "gusto": "Gusto Payroll" }; @@ -138,7 +137,6 @@ export default function ConnectAccounts() { "quickbooks": "Accounting Software", "xero": "Global Accounting Platform", "wavapps": "Financial Software", - "doorloop": "Property Management", "brex": "Business Credit & Expenses", "gusto": "Payroll & HR" }; @@ -157,8 +155,6 @@ export default function ConnectAccounts() { return ; case "brex": return ; - case "doorloop": - return ; case "xero": return ; case "gusto": @@ -239,13 +235,6 @@ export default function ConnectAccounts() { connected={connectedServices.includes("wavapps")} onConnect={() => handleConnect("wavapps")} /> - handleConnect("doorloop")} - /> {/* Payments & Payroll Integrations */} diff --git a/client/src/pages/Connections.tsx b/client/src/pages/Connections.tsx index 16d7273..0484a24 100755 --- a/client/src/pages/Connections.tsx +++ b/client/src/pages/Connections.tsx @@ -42,15 +42,6 @@ const integrationConfigs = [ requiresApproval: false, features: ['Payment processing', 'Subscription management', 'Customer portal'], }, - { - type: 'doorloop', - name: 'DoorLoop', - description: 'Property management integration for rent collection and maintenance tracking', - icon: '🏠', - docsUrl: 'https://www.doorloop.com', - requiresApproval: false, - features: ['Rent roll', 'Maintenance requests', 'Lease management'], - }, ]; export default function Connections() { diff --git a/client/src/pages/Dashboard.tsx b/client/src/pages/Dashboard.tsx new file mode 100644 index 0000000..76291fe --- /dev/null +++ b/client/src/pages/Dashboard.tsx @@ -0,0 +1,342 @@ +import { useState } from 'react'; +import { Link } from 'wouter'; +import { + DollarSign, TrendingUp, TrendingDown, BarChart3, Users, + ArrowUpRight, ArrowDownRight, Send, Loader2, + Plug, ChevronRight, Sparkles, Building2 +} from 'lucide-react'; +import { usePortfolioSummary } from '@/hooks/use-property'; +import { useTenantId, useTenant } from '@/contexts/TenantContext'; +import { useQuery, useMutation } from '@tanstack/react-query'; +import { formatCurrency } from '@/lib/utils'; +import type { Transaction } from '@shared/schema'; + +/* ─── KPI Metric Card ─── */ +function MetricCard({ + label, value, sub, icon: Icon, delta, delay, +}: { + label: string; + value: string; + sub: string; + icon: React.ElementType; + delta?: { value: string; positive: boolean }; + delay: number; +}) { + return ( +
+
+ {label} +
+ +
+
+
{value}
+
+ {sub} + {delta && ( + + {delta.positive ? : } + {delta.value} + + )} +
+
+ ); +} + +/* ─── Transaction Row ─── */ +function TxnRow({ title, description, amount, date }: { + title: string; description?: string; amount: number; date?: string; +}) { + const positive = amount >= 0; + return ( +
+
+ {positive + ? + : + } +
+
+

{title}

+ {description &&

{description}

} +
+ {date && {date}} + + {positive ? '+' : ''}{formatCurrency(amount)} + +
+ ); +} + +/* ─── AI Chat Inline ─── */ +function AIQuickChat() { + const [input, setInput] = useState(''); + const [messages, setMessages] = useState>([ + { role: 'assistant', content: 'Ready. Ask about cash flow, optimization, or property performance.' }, + ]); + + const ask = useMutation({ + mutationFn: async (q: string) => { + const r = await fetch('/api/ai/property-advice', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ message: q }), + }); + if (!r.ok) return { content: 'Unable to reach AI advisor.' }; + return r.json() as Promise<{ content: string }>; + }, + onSuccess: (data) => setMessages(prev => [...prev, { role: 'assistant', content: data.content }]), + }); + + const send = (e: React.FormEvent) => { + e.preventDefault(); + if (!input.trim() || ask.isPending) return; + setMessages(prev => [...prev, { role: 'user', content: input }]); + ask.mutate(input); + setInput(''); + }; + + return ( +
+ {/* Header */} +
+ + AI CFO + GPT-4o +
+ + {/* Messages */} +
+ {messages.map((m, i) => ( +
+
+ {m.content} +
+
+ ))} + {ask.isPending && ( +
+
+ +
+
+ )} +
+ + {/* Input */} +
+ setInput(e.target.value)} + placeholder="Ask about your finances..." + disabled={ask.isPending} + className="flex-1 bg-[hsl(var(--cf-raised))] text-sm text-[hsl(var(--cf-text))] placeholder:text-[hsl(var(--cf-text-muted))] rounded-md px-3 py-2 border border-[hsl(var(--cf-border-subtle))] focus:border-[hsl(var(--cf-lime)/0.4)] focus:outline-none transition-colors" + /> + +
+
+ ); +} + +/* ─── Integration Status Strip ─── */ +function IntegrationStrip() { + const { data } = useQuery>({ + queryKey: ['/api/integrations/status'], + staleTime: 60_000, + }); + + const services = [ + { key: 'mercury', label: 'Mercury', color: '--cf-cyan' }, + { key: 'wave', label: 'Wave', color: '--cf-violet' }, + { key: 'stripe', label: 'Stripe', color: '--cf-amber' }, + { key: 'openai', label: 'OpenAI', color: '--cf-lime' }, + ]; + + return ( +
+
+
+ + Integrations +
+ + + Manage + + +
+
+ {services.map(s => { + const configured = data?.[s.key]?.configured ?? false; + return ( +
+ + {s.label} + + {configured ? 'live' : 'off'} + +
+ ); + })} +
+
+ ); +} + +/* ─── Main Dashboard ─── */ +export default function Dashboard() { + const tenantId = useTenantId(); + const { currentTenant } = useTenant(); + const { data: portfolio, isLoading: portfolioLoading } = usePortfolioSummary(); + const { data: transactions = [] } = useQuery({ + queryKey: ['/api/transactions', tenantId, { limit: 6 }], + enabled: !!tenantId, + }); + + if (!tenantId) { + return ( +
+

Select a tenant to view the dashboard.

+
+ ); + } + + const recent = transactions.slice(0, 6); + + return ( +
+ {/* Page Header */} +
+

+ Financial Overview +

+

+ {currentTenant?.name || 'All entities'} — {new Date().toLocaleDateString('en-US', { month: 'long', year: 'numeric' })} +

+
+ + {/* KPI Strip */} +
+ + + + +
+ + {/* Two Column: Activity + AI */} +
+ {/* Left: Recent Activity (3 cols) */} +
+ {/* Recent Transactions */} +
+
+ Recent Activity + + + View all + + +
+ {recent.length === 0 ? ( +
+ No recent transactions +
+ ) : ( +
+ {recent.map((tx, i) => ( + + ))} +
+ )} +
+ + {/* Quick Property Summary */} + {portfolio && portfolio.properties.length > 0 && ( +
+
+ Properties + + + Portfolio + + +
+
+ {portfolio.properties.slice(0, 4).map(p => ( + +
+
+ +
+
+

{p.name}

+

{p.city}, {p.state}

+
+
+

{formatCurrency(p.currentValue)}

+

{p.capRate.toFixed(1)}% cap

+
+
+ + ))} +
+
+ )} +
+ + {/* Right: AI + Integrations (2 cols) */} +
+ + +
+
+
+ ); +} diff --git a/doorloop-archive-2025-12-09-summary.txt b/data/doorloop/doorloop-archive-2025-12-09-summary.txt similarity index 100% rename from doorloop-archive-2025-12-09-summary.txt rename to data/doorloop/doorloop-archive-2025-12-09-summary.txt diff --git a/doorloop-archive-2025-12-09.json b/data/doorloop/doorloop-archive-2025-12-09.json similarity index 100% rename from doorloop-archive-2025-12-09.json rename to data/doorloop/doorloop-archive-2025-12-09.json diff --git a/doorloop-backup-20251209.txt b/data/doorloop/doorloop-backup-20251209.txt similarity index 100% rename from doorloop-backup-20251209.txt rename to data/doorloop/doorloop-backup-20251209.txt diff --git a/doorloop-communications-2025-12-09.json b/data/doorloop/doorloop-communications-2025-12-09.json similarity index 100% rename from doorloop-communications-2025-12-09.json rename to data/doorloop/doorloop-communications-2025-12-09.json diff --git a/doorloop-complete-archive-2025-12-09.json b/data/doorloop/doorloop-complete-archive-2025-12-09.json similarity index 100% rename from doorloop-complete-archive-2025-12-09.json rename to data/doorloop/doorloop-complete-archive-2025-12-09.json diff --git a/doorloop-complete-archive-summary.txt b/data/doorloop/doorloop-complete-archive-summary.txt similarity index 100% rename from doorloop-complete-archive-summary.txt rename to data/doorloop/doorloop-complete-archive-summary.txt diff --git a/doorloop-final-archive-2025-12-09-summary.txt b/data/doorloop/doorloop-final-archive-2025-12-09-summary.txt similarity index 100% rename from doorloop-final-archive-2025-12-09-summary.txt rename to data/doorloop/doorloop-final-archive-2025-12-09-summary.txt diff --git a/doorloop-final-archive-2025-12-09.json b/data/doorloop/doorloop-final-archive-2025-12-09.json similarity index 100% rename from doorloop-final-archive-2025-12-09.json rename to data/doorloop/doorloop-final-archive-2025-12-09.json diff --git a/doorloop-payment-data-2025-12-09-summary.txt b/data/doorloop/doorloop-payment-data-2025-12-09-summary.txt similarity index 100% rename from doorloop-payment-data-2025-12-09-summary.txt rename to data/doorloop/doorloop-payment-data-2025-12-09-summary.txt diff --git a/doorloop-payment-data-2025-12-09.json b/data/doorloop/doorloop-payment-data-2025-12-09.json similarity index 100% rename from doorloop-payment-data-2025-12-09.json rename to data/doorloop/doorloop-payment-data-2025-12-09.json diff --git a/doorloop-reports-2025-12-09.json b/data/doorloop/doorloop-reports-2025-12-09.json similarity index 100% rename from doorloop-reports-2025-12-09.json rename to data/doorloop/doorloop-reports-2025-12-09.json diff --git a/docs/plans/2026-03-03-central-sot-v1-hardening.md b/docs/plans/2026-03-03-central-sot-v1-hardening.md new file mode 100644 index 0000000..0809aba --- /dev/null +++ b/docs/plans/2026-03-03-central-sot-v1-hardening.md @@ -0,0 +1,175 @@ +> Authoritative Source: /Users/nb/Desktop/Projects/github.com/CHITTYOS/chittyops/compliance/plans/2026-03-03-central-sot-v1-hardening.md +> Mirror Copy: /Users/nb/Desktop/Projects/github.com/CHITTYFOUNDATION/chittyops/docs/plans/2026-03-03-central-sot-v1-hardening.md + +# Central SoT v1 Hardening Plan (Model/Channel/Agent Agnostic) + +Date: 2026-03-03 +Scope: ChittyOS/ChittyApps multi-channel, multi-model coordination + +## 1) Executive Verdict + +Current setup is **partially viable**: +- Good local continuity exists in `~/.claude/chittycontext` (session binding, checkpoints, queue). +- Not yet a true central write authority across Claude + Codex + agents. + +Recommended direction is viable and should be implemented as a **single authoritative write path** with local caches only as mirrors. + +## 2) What Exists Today + +Observed implementation: +- Local context store: `~/.claude/chittycontext/` +- Lifecycle hooks: + - `~/.claude/hooks/chittycontext-session-start.sh` + - `~/.claude/hooks/chittycontext-session-end.sh` +- Session queueing: `sync_queue.json` with deferred drain +- Canon/entity metadata: `manifest.json`, `canon/ontology.json` + +Observed gap: +- Codex has skills that reference this store, but no equivalent automatic lifecycle hook wiring in Codex config. +- This creates divergence risk between local stores and channel-specific session logs. + +## 3) v1 Architecture (Recommended) + +## Option Chosen: Central Write Gateway + Event Ledger + +Single write authority: +- `context.chitty.cc` (or `connect.chitty.cc/context`) as the only write API +- Backing store: Neon/Postgres event ledger + materialized views +- Local files (`~/.claude/chittycontext`, Codex local state) become read-through/write-back caches, never authoritative + +Core principle: +- Every mutation is an append-only event with idempotency keys. +- Read models are projections; they can be rebuilt at any time. + +## 4) Data and Auth Flow (Text Diagram) + +1. Session start +- Client (Claude hook, Codex skill, agent runtime) resolves context anchors. +- Client sends `POST /v1/sessions/start` with `channel`, `model`, `agent_id`, `project`, `workspace`, `anchor_hash`. +- Gateway validates token/scopes with ChittyAuth and resolves/mints ChittyID via ChittyID/ChittyConnect policy. +- Gateway appends event and returns canonical `context_id`, `session_id`, `ledger_head`. + +2. During session +- Client sends events to `POST /v1/events` (`checkpoint`, `decision`, `todo`, `task`, `artifact_ref`, `state_update`). +- Each event includes: + - `idempotency_key` + - `causation_id` + - `correlation_id` + - `occurred_at` + - `actor_chitty_id` (natural or synthetic) +- Gateway appends; projectors update task/state read models. + +3. Session end +- Client sends `POST /v1/sessions/end`. +- Gateway computes summary/projection deltas and emits sync markers. +- Local mirrors pull from `GET /v1/contexts/{id}/state?since=...`. + +4. Audit and trust +- All events are attributable to ChittyID. +- Trust/DNA calculators consume event stream asynchronously. +- Chronicle/ledger links are recorded as event metadata. + +## 5) Minimal v1 Contracts + +Required endpoints: +- `POST /v1/sessions/start` +- `POST /v1/sessions/end` +- `POST /v1/events` +- `GET /v1/contexts/{context_id}/state` +- `GET /v1/contexts/{context_id}/timeline` +- `POST /v1/sync/pull` (for local mirror reconciliation) + +Required event classes: +- `session_started`, `session_ended` +- `checkpoint_saved`, `state_compacted` +- `task_created`, `task_updated`, `todo_updated` +- `decision_recorded`, `artifact_linked` +- `sync_conflict_detected`, `sync_conflict_resolved` + +Idempotency and ordering: +- Unique constraint on `(source_system, idempotency_key)` +- Logical ordering field: `context_seq` assigned server-side +- Accept out-of-order ingress; replay ordered by `context_seq` + +## 6) Security and Governance Baseline + +AuthN/AuthZ: +- Service and user tokens from ChittyAuth +- Scope examples: + - `context:write` + - `context:read` + - `context:admin` + - `context:trust:compute` + +Governance: +- ChittyID remains sole identity mint authority. +- Synthetic vs natural actors must both map to auditable ChittyIDs. +- All write calls require actor identity + channel identity. + +Compliance controls: +- Immutable append ledger for events +- Redaction policy only via compensating events, never destructive overwrite +- Signed export bundles for legal/audit use + +## 7) Rollout Plan + +Phase 0: Stabilize contracts (1-2 days) +- Freeze v1 event schema and endpoint contracts. +- Define scope matrix and token requirements. + +Phase 1: Central write path (3-5 days) +- Implement gateway + Neon tables. +- Add idempotency and server-side sequencing. + +Phase 2: Channel adapters (3-4 days) +- Update Claude start/end hooks to call gateway. +- Add Codex command wrappers/skill helpers for start/end/checkpoint writes. +- Keep local files as mirror cache. + +Phase 3: Projection and sync (2-3 days) +- Build `state` and `timeline` projections. +- Add pull-based mirror reconciliation. + +Phase 4: Hardening (2-4 days) +- Conflict tests, replay tests, outage tests. +- Observability and SLOs. + +## 8) Validation Plan + +Reliability tests: +- At-least-once delivery with duplicate ingestion +- Out-of-order event handling +- Replay from event 0 to rebuild read models + +Security tests: +- Token scope rejection matrix +- Impersonation attempt rejection (wrong actor/channel binding) +- Secret leakage guard verification at adapter boundaries + +Consistency tests: +- Claude + Codex parallel sessions on same project/context +- Conflict creation + deterministic resolution +- Read model convergence within defined lag SLO + +Operational SLOs (initial): +- Write p95 < 300ms +- Projection lag p95 < 5s +- Reconciliation catch-up < 60s for normal load + +## 9) Why This Is Viable + +It preserves what already works: +- Existing local chittycontext semantics and workflows +- Existing ChittyID/ChittyAuth trust model + +It fixes what currently breaks: +- Eliminates split authority between `~/.claude` and Codex-local/session-local state +- Adds deterministic merge/replay and formal idempotency +- Makes channel/model/agent differences adapter concerns, not data-model concerns + +## 10) Immediate Next Step + +Implement a small proof in one repo: +- Add `context event` table + `sessions` table +- Wire one Claude hook and one Codex command to `POST /v1/sessions/start|end` and `POST /v1/events` +- Verify convergence by running parallel sessions against same context for 24 hours diff --git a/drizzle.standalone.config.ts b/drizzle.standalone.config.ts deleted file mode 100755 index 6f4ef4e..0000000 --- a/drizzle.standalone.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { defineConfig } from 'drizzle-kit'; - -const sqliteFile = process.env.SQLITE_FILE || './chittyfinance.db'; - -export default defineConfig({ - out: './migrations/standalone', - schema: './database/standalone.schema.ts', - dialect: 'sqlite', - dbCredentials: { - url: sqliteFile, - }, -}); diff --git a/drizzle.system.config.ts b/drizzle.system.config.ts deleted file mode 100755 index b12e478..0000000 --- a/drizzle.system.config.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { defineConfig } from 'drizzle-kit'; - -if (!process.env.DATABASE_URL) { - throw new Error('DATABASE_URL must be set for system mode'); -} - -export default defineConfig({ - out: './migrations/system', - schema: './database/system.schema.ts', - dialect: 'postgresql', - dbCredentials: { - url: process.env.DATABASE_URL, - }, -}); diff --git a/generated-icon.png b/generated-icon.png deleted file mode 100755 index 432378f..0000000 Binary files a/generated-icon.png and /dev/null differ diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 34819ed..0000000 --- a/package-lock.json +++ /dev/null @@ -1,11011 +0,0 @@ -{ - "name": "chittyfinance", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "chittyfinance", - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@chittyos/chittyconnect": "file:../chittyconnect", - "@hookform/resolvers": "^3.9.1", - "@jridgewell/trace-mapping": "^0.3.25", - "@modelcontextprotocol/sdk": "^1.27.1", - "@neondatabase/serverless": "^0.10.4", - "@paypal/paypal-server-sdk": "^1.0.0", - "@radix-ui/react-accordion": "^1.2.1", - "@radix-ui/react-alert-dialog": "^1.1.2", - "@radix-ui/react-aspect-ratio": "^1.1.0", - "@radix-ui/react-avatar": "^1.1.1", - "@radix-ui/react-checkbox": "^1.1.2", - "@radix-ui/react-collapsible": "^1.1.1", - "@radix-ui/react-context-menu": "^2.2.2", - "@radix-ui/react-dialog": "^1.1.2", - "@radix-ui/react-dropdown-menu": "^2.1.2", - "@radix-ui/react-hover-card": "^1.1.2", - "@radix-ui/react-label": "^2.1.0", - "@radix-ui/react-menubar": "^1.1.2", - "@radix-ui/react-navigation-menu": "^1.2.1", - "@radix-ui/react-popover": "^1.1.2", - "@radix-ui/react-progress": "^1.1.0", - "@radix-ui/react-radio-group": "^1.2.1", - "@radix-ui/react-scroll-area": "^1.2.0", - "@radix-ui/react-select": "^2.1.2", - "@radix-ui/react-separator": "^1.1.0", - "@radix-ui/react-slider": "^1.2.1", - "@radix-ui/react-slot": "^1.1.0", - "@radix-ui/react-switch": "^1.1.1", - "@radix-ui/react-tabs": "^1.1.1", - "@radix-ui/react-toast": "^1.2.2", - "@radix-ui/react-toggle": "^1.1.0", - "@radix-ui/react-toggle-group": "^1.1.0", - "@radix-ui/react-tooltip": "^1.1.3", - "@replit/vite-plugin-shadcn-theme-json": "^0.0.4", - "@stripe/react-stripe-js": "^3.6.0", - "@stripe/stripe-js": "^7.1.0", - "@tanstack/react-query": "^5.60.5", - "@types/jsonwebtoken": "^9.0.10", - "@types/multer": "^2.0.0", - "bcryptjs": "^2.4.3", - "better-sqlite3": "^11.0.0", - "canvas-confetti": "^1.9.3", - "class-variance-authority": "^0.7.0", - "clsx": "^2.1.1", - "cmdk": "^1.0.0", - "connect-pg-simple": "^10.0.0", - "csv-parse": "^6.1.0", - "date-fns": "^3.6.0", - "dotenv": "^17.2.3", - "drizzle-orm": "^0.39.1", - "drizzle-zod": "^0.7.0", - "embla-carousel-react": "^8.3.0", - "express": "^4.21.2", - "express-session": "^1.18.1", - "framer-motion": "^11.18.2", - "hono": "^4.12.2", - "input-otp": "^1.2.4", - "jose": "^6.1.3", - "jsonwebtoken": "^9.0.3", - "lucide-react": "^0.453.0", - "memoizee": "^0.4.17", - "memorystore": "^1.6.7", - "multer": "^2.0.2", - "openai": "^4.95.0", - "openid-client": "^6.8.1", - "passport": "^0.7.0", - "passport-local": "^1.0.0", - "react": "^18.3.1", - "react-day-picker": "^8.10.1", - "react-dom": "^18.3.1", - "react-hook-form": "^7.53.1", - "react-icons": "^5.4.0", - "react-resizable-panels": "^2.1.4", - "recharts": "^2.13.0", - "stripe": "^18.0.0", - "tailwind-merge": "^2.5.4", - "tailwindcss-animate": "^1.0.7", - "vaul": "^1.1.0", - "wouter": "^3.3.5", - "ws": "^8.18.0", - "xlsx": "^0.18.5", - "zod": "^3.23.8", - "zod-validation-error": "^3.4.0" - }, - "devDependencies": { - "@cloudflare/workers-types": "^4.20260302.0", - "@replit/vite-plugin-cartographer": "^0.0.11", - "@replit/vite-plugin-runtime-error-modal": "^0.0.3", - "@tailwindcss/typography": "^0.5.15", - "@types/better-sqlite3": "^7.6.13", - "@types/connect-pg-simple": "^7.0.3", - "@types/express": "^5.0.6", - "@types/express-session": "^1.18.0", - "@types/memoizee": "^0.4.12", - "@types/node": "^20.16.11", - "@types/passport": "^1.0.16", - "@types/passport-local": "^1.0.38", - "@types/pg": "^8.16.0", - "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.1", - "@types/ws": "^8.5.13", - "@vitejs/plugin-react": "^4.3.2", - "autoprefixer": "^10.4.20", - "drizzle-kit": "^0.31.9", - "esbuild": "^0.25.0", - "nanoid": "^5.1.6", - "pg": "^8.16.3", - "postcss": "^8.4.47", - "tailwindcss": "^3.4.14", - "tsx": "^4.19.1", - "typescript": "5.6.3", - "vite": "^7.2.7", - "vitest": "^4.0.18" - }, - "optionalDependencies": { - "bufferutil": "^4.0.8" - } - }, - "../chittyconnect": {}, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@apimatic/authentication-adapters": { - "version": "0.5.14", - "resolved": "https://registry.npmjs.org/@apimatic/authentication-adapters/-/authentication-adapters-0.5.14.tgz", - "integrity": "sha512-V7nhHShPrU8LfjKKHoVJNS50SveSL77CexVuS4aeQyXx99HwdQVJwl2MK0KAYM6/b2ufQbJ7Eee2fzQT0TVXSQ==", - "license": "MIT", - "dependencies": { - "@apimatic/core-interfaces": "^0.2.14", - "@apimatic/http-headers": "^0.3.8", - "@apimatic/http-query": "^0.3.9", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=14.15.0 || >=16.0.0" - } - }, - "node_modules/@apimatic/axios-client-adapter": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/@apimatic/axios-client-adapter/-/axios-client-adapter-0.3.21.tgz", - "integrity": "sha512-pr/XvAvH9FjbpwM+B7vHQxM7alocOX1kLNtSpXKW3yxTYxksF3ydnUuQ85rRbCoNpyfMOIjnRBCNUBzX5p2Hnw==", - "license": "MIT", - "dependencies": { - "@apimatic/convert-to-stream": "^0.1.9", - "@apimatic/core-interfaces": "^0.2.14", - "@apimatic/file-wrapper": "^0.3.9", - "@apimatic/http-headers": "^0.3.8", - "@apimatic/http-query": "^0.3.9", - "@apimatic/json-bigint": "^1.2.0", - "@apimatic/proxy": "^0.1.4", - "axios": "^1.8.4", - "detect-browser": "^5.3.0", - "detect-node": "^2.1.0", - "form-data": "^4.0.1", - "lodash.flatmap": "^4.5.0", - "tiny-warning": "^1.0.3", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=14.15.0 || >=16.0.0" - } - }, - "node_modules/@apimatic/convert-to-stream": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@apimatic/convert-to-stream/-/convert-to-stream-0.1.9.tgz", - "integrity": "sha512-C9NEKnDZoTRBRVeUGXVyAEmy6P5o+8oLwEckTKj0iBlExJLEXNt14nf4wxfzRO1KR8j5Bw8S6yStKCrQzcVERA==", - "license": "MIT", - "dependencies": { - "tslib": "2.8.1" - }, - "engines": { - "node": ">=14.15.0 || >=16.0.0" - } - }, - "node_modules/@apimatic/core": { - "version": "0.10.29", - "resolved": "https://registry.npmjs.org/@apimatic/core/-/core-0.10.29.tgz", - "integrity": "sha512-QhORiq0QbjlDMrw8ZZsAeG2DzE6QgGz5ukD5w2MOWE/3iIWnUDEROjmc2SfhyiGsE3GoEJ8cyhMMdjlOioP6ww==", - "license": "MIT", - "dependencies": { - "@apimatic/convert-to-stream": "^0.1.9", - "@apimatic/core-interfaces": "^0.2.14", - "@apimatic/file-wrapper": "^0.3.9", - "@apimatic/http-headers": "^0.3.8", - "@apimatic/http-query": "^0.3.9", - "@apimatic/json-bigint": "^1.2.0", - "@apimatic/schema": "^0.7.21", - "detect-browser": "^5.3.0", - "detect-node": "^2.1.0", - "form-data": "^4.0.1", - "lodash.defaultsdeep": "^4.6.1", - "lodash.flatmap": "^4.5.0", - "tiny-warning": "^1.0.3", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=14.15.0 || >=16.0.0" - } - }, - "node_modules/@apimatic/core-interfaces": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/@apimatic/core-interfaces/-/core-interfaces-0.2.14.tgz", - "integrity": "sha512-PQmSU32ndxtDddMCjbkNY/sVvDwQAsHUGKrdG5aGVE7iw/qvB2Tm2zyCarOB5TlDr4OB+/tuLCVhji0icx6MHg==", - "license": "MIT", - "dependencies": { - "@apimatic/file-wrapper": "^0.3.9", - "@apimatic/json-bigint": "^1.2.0", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=14.15.0 || >=16.0.0" - } - }, - "node_modules/@apimatic/file-wrapper": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@apimatic/file-wrapper/-/file-wrapper-0.3.9.tgz", - "integrity": "sha512-Fh3UE7UPs2v4wkJdsD+uJFF147+7X0qkQfKBdeLZx6mZ5RmBJOBbS6ApvstQTV279YsHiiedKUZGJ6XLoVU+pQ==", - "license": "MIT", - "dependencies": { - "tslib": "2.8.1" - }, - "engines": { - "node": ">=14.15.0 || >=16.0.0" - } - }, - "node_modules/@apimatic/http-headers": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@apimatic/http-headers/-/http-headers-0.3.8.tgz", - "integrity": "sha512-ShvCuT39hYfBTI+H1I16m5i6XZCyUy2kQJ6Jhfj78TwsW5r6AyCbzW7DEro8GN2nNYRU1+E/hrgH6J85YmriOA==", - "license": "MIT", - "dependencies": { - "tslib": "2.8.1" - }, - "engines": { - "node": ">=14.15.0 || >=16.0.0" - } - }, - "node_modules/@apimatic/http-query": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@apimatic/http-query/-/http-query-0.3.9.tgz", - "integrity": "sha512-D6nqXcCR3P6iWbJ9uFXyyF2z1PEhTbGFbHNNuwF1NQ4tnThQk67DW9ou7/XcWi21zLh9MUchDWw9I0iE+5F2xA==", - "license": "MIT", - "dependencies": { - "@apimatic/core-interfaces": "^0.2.14", - "@apimatic/file-wrapper": "^0.3.9", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=14.15.0 || >=16.0.0" - } - }, - "node_modules/@apimatic/json-bigint": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@apimatic/json-bigint/-/json-bigint-1.2.0.tgz", - "integrity": "sha512-+bmVzYMdZu0Ya5L+my4FXFUih54OvQA/qlZsFOYdOoostyUuB27UDrVWQs/WVCmS0ADdo5vTU0eeTrrBkHoySw==", - "license": "MIT" - }, - "node_modules/@apimatic/oauth-adapters": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/@apimatic/oauth-adapters/-/oauth-adapters-0.4.18.tgz", - "integrity": "sha512-MpRyBgKWg3yINQR85tBPmtU/596P0gdj4RmQ3s4D1LRuwDzqRO8GpRq74J8hxQ7vLQvH0OfGh6zzhr1KI4dQRQ==", - "license": "MIT", - "dependencies": { - "@apimatic/core-interfaces": "^0.2.14", - "@apimatic/file-wrapper": "^0.3.9", - "@apimatic/http-headers": "^0.3.8", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=14.15.0 || >=16.0.0" - } - }, - "node_modules/@apimatic/proxy": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@apimatic/proxy/-/proxy-0.1.4.tgz", - "integrity": "sha512-Vzgfu7wcA5aEJyj2SjQ00Tb06fhBof8gDo1kSsF6sZBm4QjdFywN5AMbQwhfFOKjHqcsNmJspdeqcdymUQ77jA==", - "license": "MIT", - "dependencies": { - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.6" - }, - "engines": { - "node": ">=14.15.0 || >=16.0.0" - } - }, - "node_modules/@apimatic/schema": { - "version": "0.7.21", - "resolved": "https://registry.npmjs.org/@apimatic/schema/-/schema-0.7.21.tgz", - "integrity": "sha512-RCke4toXjA7fBRxQVa1GR+Lj9utVOEJ3voDI26dhk+bZuAac4UXPzkTEaIO3AIe/o8pcKCOkpNIzhzm57Cv2Qg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=14.15.0 || >=16.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", - "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", - "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@chittyos/chittyconnect": { - "resolved": "../chittyconnect", - "link": true - }, - "node_modules/@cloudflare/workers-types": { - "version": "4.20260302.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20260302.0.tgz", - "integrity": "sha512-mbFRnlu1lNCScMpXZk/X/uBPufYx5OSbq+euGonGRcY+DgOwm2kczGdK401rUh52NB0fFMEcOy/zqwxv7CdDNA==", - "devOptional": true, - "license": "MIT OR Apache-2.0" - }, - "node_modules/@drizzle-team/brocli": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@drizzle-team/brocli/-/brocli-0.10.2.tgz", - "integrity": "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@esbuild-kit/core-utils": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz", - "integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==", - "deprecated": "Merged into tsx: https://tsx.is", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "~0.18.20", - "source-map-support": "^0.5.21" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/@esbuild-kit/esm-loader": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz", - "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==", - "deprecated": "Merged into tsx: https://tsx.is", - "dev": true, - "license": "MIT", - "dependencies": { - "@esbuild-kit/core-utils": "^3.3.2", - "get-tsconfig": "^4.7.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.4.tgz", - "integrity": "sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.5.tgz", - "integrity": "sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.7.4", - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.7.tgz", - "integrity": "sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.7.5" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", - "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", - "license": "MIT" - }, - "node_modules/@hono/node-server": { - "version": "1.19.9", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", - "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", - "license": "MIT", - "engines": { - "node": ">=18.14.1" - }, - "peerDependencies": { - "hono": "^4" - } - }, - "node_modules/@hookform/resolvers": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.10.0.tgz", - "integrity": "sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag==", - "license": "MIT", - "peerDependencies": { - "react-hook-form": "^7.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@modelcontextprotocol/sdk": { - "version": "1.27.1", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.27.1.tgz", - "integrity": "sha512-sr6GbP+4edBwFndLbM60gf07z0FQ79gaExpnsjMGePXqFcSSb7t6iscpjk9DhFhwd+mTEQrzNafGP8/iGGFYaA==", - "license": "MIT", - "dependencies": { - "@hono/node-server": "^1.19.9", - "ajv": "^8.17.1", - "ajv-formats": "^3.0.1", - "content-type": "^1.0.5", - "cors": "^2.8.5", - "cross-spawn": "^7.0.5", - "eventsource": "^3.0.2", - "eventsource-parser": "^3.0.0", - "express": "^5.2.1", - "express-rate-limit": "^8.2.1", - "hono": "^4.11.4", - "jose": "^6.1.3", - "json-schema-typed": "^8.0.2", - "pkce-challenge": "^5.0.0", - "raw-body": "^3.0.0", - "zod": "^3.25 || ^4.0", - "zod-to-json-schema": "^3.25.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@cfworker/json-schema": "^4.1.1", - "zod": "^3.25 || ^4.0" - }, - "peerDependenciesMeta": { - "@cfworker/json-schema": { - "optional": true - }, - "zod": { - "optional": false - } - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/body-parser": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", - "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.1", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/content-disposition": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "depd": "^2.0.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/finalhandler": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.3", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.1", - "mime-types": "^3.0.2", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/serve-static": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@neondatabase/serverless": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@neondatabase/serverless/-/serverless-0.10.4.tgz", - "integrity": "sha512-2nZuh3VUO9voBauuh+IGYRhGU/MskWHt1IuZvHcJw6GLjDgtqj/KViKo7SIrLdGLdot7vFbiRRw+BgEy3wT9HA==", - "license": "MIT", - "dependencies": { - "@types/pg": "8.11.6" - } - }, - "node_modules/@neondatabase/serverless/node_modules/@types/pg": { - "version": "8.11.6", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.6.tgz", - "integrity": "sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "pg-protocol": "*", - "pg-types": "^4.0.1" - } - }, - "node_modules/@neondatabase/serverless/node_modules/pg-types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-4.1.0.tgz", - "integrity": "sha512-o2XFanIMy/3+mThw69O8d4n1E5zsLhdO+OPqswezu7Z5ekP4hYDqlDjlmOpYMbzY2Br0ufCwJLdDIXeNVwcWFg==", - "license": "MIT", - "dependencies": { - "pg-int8": "1.0.1", - "pg-numeric": "1.0.2", - "postgres-array": "~3.0.1", - "postgres-bytea": "~3.0.0", - "postgres-date": "~2.1.0", - "postgres-interval": "^3.0.0", - "postgres-range": "^1.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@neondatabase/serverless/node_modules/postgres-array": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.4.tgz", - "integrity": "sha512-nAUSGfSDGOaOAEGwqsRY27GPOea7CNipJPOA7lPbdEpx5Kg3qzdP0AaWC5MlhTWV9s4hFX39nomVZ+C4tnGOJQ==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/@neondatabase/serverless/node_modules/postgres-bytea": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-3.0.0.tgz", - "integrity": "sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==", - "license": "MIT", - "dependencies": { - "obuf": "~1.1.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@neondatabase/serverless/node_modules/postgres-date": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz", - "integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/@neondatabase/serverless/node_modules/postgres-interval": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-3.0.0.tgz", - "integrity": "sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@paypal/paypal-server-sdk": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@paypal/paypal-server-sdk/-/paypal-server-sdk-1.1.0.tgz", - "integrity": "sha512-MaJQmSVpQb5nEeZWZDTtGRxeaHj6O51G9Olmm3zQ5E4XNgR4emAI08CKC2ZPhBldVoxAoBVjLyvKjGV5lC1n2Q==", - "license": "MIT", - "dependencies": { - "@apimatic/authentication-adapters": "^0.5.4", - "@apimatic/axios-client-adapter": "^0.3.7", - "@apimatic/core": "^0.10.16", - "@apimatic/oauth-adapters": "^0.4.8", - "@apimatic/schema": "^0.7.14" - }, - "engines": { - "node": ">=14.17.0" - } - }, - "node_modules/@radix-ui/number": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", - "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", - "license": "MIT" - }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", - "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-accordion": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", - "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collapsible": "1.1.12", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-alert-dialog": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz", - "integrity": "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dialog": "1.1.15", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-aspect-ratio": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.8.tgz", - "integrity": "sha512-5nZrJTF7gH+e0nZS7/QxFz6tJV4VimhQb1avEgtsJxvvIp5JilL+c58HICsKzPxghdwaDt48hEfPM1au4zGy+w==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-aspect-ratio/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-avatar": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.11.tgz", - "integrity": "sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-context": "1.1.3", - "@radix-ui/react-primitive": "2.1.4", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-is-hydrated": "0.1.0", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-context": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", - "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-checkbox": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", - "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collapsible": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", - "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collection": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", - "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context-menu": { - "version": "2.2.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.16.tgz", - "integrity": "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-menu": "2.1.16", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", - "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-direction": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", - "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", - "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", - "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.16", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", - "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", - "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-hover-card": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.15.tgz", - "integrity": "sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-label": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.8.tgz", - "integrity": "sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-label/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", - "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menubar": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.16.tgz", - "integrity": "sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.16", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-navigation-menu": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz", - "integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", - "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popper": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", - "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-rect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-portal": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-presence": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", - "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.8.tgz", - "integrity": "sha512-+gISHcSPUJ7ktBy9RnTqbdKW78bcGke3t6taawyZ71pio1JewwGSJizycs7rLhGTvMJYCQB1DBK4KQsxs7U8dA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-context": "1.1.3", - "@radix-ui/react-primitive": "2.1.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-context": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", - "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-radio-group": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.8.tgz", - "integrity": "sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", - "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-scroll-area": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz", - "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-select": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", - "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-separator": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.8.tgz", - "integrity": "sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slider": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.6.tgz", - "integrity": "sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", - "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-switch": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz", - "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", - "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toast": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.15.tgz", - "integrity": "sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toggle": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz", - "integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toggle-group": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.11.tgz", - "integrity": "sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-toggle": "1.1.10", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", - "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", - "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", - "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", - "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-is-hydrated": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz", - "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==", - "license": "MIT", - "dependencies": { - "use-sync-external-store": "^1.5.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-previous": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", - "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", - "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", - "license": "MIT", - "dependencies": { - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", - "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", - "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", - "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", - "license": "MIT" - }, - "node_modules/@replit/vite-plugin-cartographer": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@replit/vite-plugin-cartographer/-/vite-plugin-cartographer-0.0.11.tgz", - "integrity": "sha512-C1RRIDqaFtfP6BSztgCJBPA+hSH3bUNc3xbr/zzVOwOdZLJy0VaM6ypN9bwWbzksGmEZpdLQVvCAG0LLwCwCpQ==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.26.9", - "@babel/traverse": "^7.26.9", - "@babel/types": "^7.26.9", - "magic-string": "^0.30.12", - "modern-screenshot": "^4.6.0" - } - }, - "node_modules/@replit/vite-plugin-runtime-error-modal": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@replit/vite-plugin-runtime-error-modal/-/vite-plugin-runtime-error-modal-0.0.3.tgz", - "integrity": "sha512-4wZHGuI9W4o9p8g4Ma/qj++7SP015+FMDGYobj7iap5oEsxXMm0B02TO5Y5PW8eqBPd4wX5l3UGco/hlC0qapw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@replit/vite-plugin-shadcn-theme-json": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@replit/vite-plugin-shadcn-theme-json/-/vite-plugin-shadcn-theme-json-0.0.4.tgz", - "integrity": "sha512-XsDzFUQ9E118LW5m/YNpIiIox92Uph20PZV/D51tGW3cX9LDAa3fAwjU0AKxLKZHMONXiy/PYakqf2FT9nQylg==", - "dependencies": { - "@sinclair/typebox": "^0.33.17", - "colorjs.io": "^0.5.2", - "dedent": "^1.5.3" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", - "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", - "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", - "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", - "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", - "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", - "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", - "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", - "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", - "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", - "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", - "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", - "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", - "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", - "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", - "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", - "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", - "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", - "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", - "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", - "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", - "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", - "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", - "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", - "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", - "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sinclair/typebox": { - "version": "0.33.22", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.33.22.tgz", - "integrity": "sha512-auUj4k+f4pyrIVf4GW5UKquSZFHJWri06QgARy9C0t9ZTjJLIuNIrr1yl9bWcJWJ1Gz1vOvYN1D+QPaIlNMVkQ==", - "license": "MIT" - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@stripe/react-stripe-js": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@stripe/react-stripe-js/-/react-stripe-js-3.10.0.tgz", - "integrity": "sha512-UPqHZwMwDzGSax0ZI7XlxR3tZSpgIiZdk3CiwjbTK978phwR/fFXeAXQcN/h8wTAjR4ZIAzdlI9DbOqJhuJdeg==", - "license": "MIT", - "dependencies": { - "prop-types": "^15.7.2" - }, - "peerDependencies": { - "@stripe/stripe-js": ">=1.44.1 <8.0.0", - "react": ">=16.8.0 <20.0.0", - "react-dom": ">=16.8.0 <20.0.0" - } - }, - "node_modules/@stripe/stripe-js": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-7.9.0.tgz", - "integrity": "sha512-ggs5k+/0FUJcIgNY08aZTqpBTtbExkJMYMLSMwyucrhtWexVOEY1KJmhBsxf+E/Q15f5rbwBpj+t0t2AW2oCsQ==", - "license": "MIT", - "engines": { - "node": ">=12.16" - } - }, - "node_modules/@tailwindcss/typography": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz", - "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "6.0.10" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" - } - }, - "node_modules/@tanstack/query-core": { - "version": "5.90.20", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.20.tgz", - "integrity": "sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/react-query": { - "version": "5.90.21", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.21.tgz", - "integrity": "sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg==", - "license": "MIT", - "dependencies": { - "@tanstack/query-core": "5.90.20" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^18 || ^19" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/better-sqlite3": { - "version": "7.6.13", - "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz", - "integrity": "sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-pg-simple": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/connect-pg-simple/-/connect-pg-simple-7.0.3.tgz", - "integrity": "sha512-NGCy9WBlW2bw+J/QlLnFZ9WjoGs6tMo3LAut6mY4kK+XHzue//lpNVpAvYRpIwM969vBRAM2Re0izUvV6kt+NA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*", - "@types/express-session": "*", - "@types/pg": "*" - } - }, - "node_modules/@types/d3-array": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", - "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", - "license": "MIT" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "license": "MIT" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "license": "MIT" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "license": "MIT", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", - "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", - "license": "MIT" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", - "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", - "license": "MIT", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-shape": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", - "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", - "license": "MIT", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", - "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", - "license": "MIT" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", - "license": "MIT" - }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/express": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", - "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^5.0.0", - "@types/serve-static": "^2" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", - "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/express-session": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.18.2.tgz", - "integrity": "sha512-k+I0BxwVXsnEU2hV77cCobC08kIsn4y44C3gC0b46uxZVMaXA04lSPgRLR/bSL2w0t0ShJiG8o4jPzRG/nscFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "license": "MIT" - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.10", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", - "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", - "license": "MIT", - "dependencies": { - "@types/ms": "*", - "@types/node": "*" - } - }, - "node_modules/@types/memoizee": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/@types/memoizee/-/memoizee-0.4.12.tgz", - "integrity": "sha512-EdtpwNYNhe3kZ+4TlXj/++pvBoU0KdrAICMzgI7vjWgu9sIvvUhu9XR8Ks4L6Wh3sxpZ22wkZR7yCLAqUjnZuQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "license": "MIT" - }, - "node_modules/@types/multer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/multer/-/multer-2.0.0.tgz", - "integrity": "sha512-C3Z9v9Evij2yST3RSBktxP9STm6OdMc5uR1xF1SGr98uv8dUlAL2hqwrZ3GVB3uyMyiegnscEK6PGtYvNrjTjw==", - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/node": { - "version": "20.19.33", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz", - "integrity": "sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/node-fetch": { - "version": "2.6.13", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz", - "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "form-data": "^4.0.4" - } - }, - "node_modules/@types/passport": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.17.tgz", - "integrity": "sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/passport-local": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@types/passport-local/-/passport-local-1.0.38.tgz", - "integrity": "sha512-nsrW4A963lYE7lNTv9cr5WmiUD1ibYJvWrpE13oxApFsRt77b0RdtZvKbCdNIY4v/QZ6TRQWaDDEwV1kCTmcXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*", - "@types/passport": "*", - "@types/passport-strategy": "*" - } - }, - "node_modules/@types/passport-strategy": { - "version": "0.2.38", - "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.38.tgz", - "integrity": "sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*", - "@types/passport": "*" - } - }, - "node_modules/@types/pg": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.16.0.tgz", - "integrity": "sha512-RmhMd/wD+CF8Dfo+cVIy3RR5cl8CyfXQ0tGgW6XBL8L4LM/UTEbNXYRbLwU6w+CgrKBNbrQWt4FUtTfaU5jSYQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "pg-protocol": "*", - "pg-types": "^2.2.0" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", - "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "devOptional": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^18.0.0" - } - }, - "node_modules/@types/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*" - } - }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/@vitest/expect": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.18.tgz", - "integrity": "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.18", - "@vitest/utils": "4.0.18", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz", - "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.18", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", - "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.18.tgz", - "integrity": "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.18", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.18.tgz", - "integrity": "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.18", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz", - "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz", - "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.18", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/adler-32": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", - "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/agentkeepalive": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", - "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", - "license": "MIT", - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", - "license": "MIT" - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" - }, - "node_modules/aria-hidden": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", - "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/autoprefixer": { - "version": "10.4.24", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.24.tgz", - "integrity": "sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.1", - "caniuse-lite": "^1.0.30001766", - "fraction.js": "^5.3.4", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/axios": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", - "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.11", - "form-data": "^4.0.5", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", - "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", - "license": "MIT" - }, - "node_modules/better-sqlite3": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.10.0.tgz", - "integrity": "sha512-EwhOpyXiOEL/lKzHz9AW1msWFNzGc/z+LzeB3/jnFJpxu+th2yqvzsSWas1v9jgs9+xiXJcD5A8CJxAG2TaghQ==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "bindings": "^1.5.0", - "prebuild-install": "^7.1.1" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "license": "MIT", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/body-parser": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "~1.2.0", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "on-finished": "~2.4.1", - "qs": "~6.14.0", - "raw-body": "~2.5.3", - "type-is": "~1.6.18", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/bufferutil": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.1.0.tgz", - "integrity": "sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001774", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001774.tgz", - "integrity": "sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/canvas-confetti": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/canvas-confetti/-/canvas-confetti-1.9.4.tgz", - "integrity": "sha512-yxQbJkAVrFXWNbTUjPqjF7G+g6pDotOUHGbkZq2NELZUMDpiJ85rIEazVb8GTaAptNW2miJAXbs1BtioA251Pw==", - "license": "ISC", - "funding": { - "type": "donate", - "url": "https://www.paypal.me/kirilvatev" - } - }, - "node_modules/cfb": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz", - "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", - "license": "Apache-2.0", - "dependencies": { - "adler-32": "~1.3.0", - "crc-32": "~1.2.0" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC" - }, - "node_modules/class-variance-authority": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", - "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", - "license": "Apache-2.0", - "dependencies": { - "clsx": "^2.1.1" - }, - "funding": { - "url": "https://polar.sh/cva" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cmdk": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz", - "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "^1.1.1", - "@radix-ui/react-dialog": "^1.1.6", - "@radix-ui/react-id": "^1.1.0", - "@radix-ui/react-primitive": "^2.0.2" - }, - "peerDependencies": { - "react": "^18 || ^19 || ^19.0.0-rc", - "react-dom": "^18 || ^19 || ^19.0.0-rc" - } - }, - "node_modules/codepage": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", - "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/colorjs.io": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", - "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "engines": [ - "node >= 6.0" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/connect-pg-simple": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/connect-pg-simple/-/connect-pg-simple-10.0.0.tgz", - "integrity": "sha512-pBGVazlqiMrackzCr0eKhn4LO5trJXsOX0nQoey9wCOayh80MYtThCbq8eoLsjpiWgiok/h+1/uti9/2/Una8A==", - "license": "MIT", - "dependencies": { - "pg": "^8.12.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=22.0.0" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", - "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", - "license": "MIT" - }, - "node_modules/cors": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", - "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "node_modules/csv-parse": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-6.1.0.tgz", - "integrity": "sha512-CEE+jwpgLn+MmtCpVcPtiCZpVtB6Z2OKPTr34pycYYoL7sxdOkXDdQ4lRiw6ioC0q6BLqhc6cKweCVvral8yhw==", - "license": "MIT" - }, - "node_modules/d": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", - "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", - "license": "ISC", - "dependencies": { - "es5-ext": "^0.10.64", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "license": "ISC", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", - "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "license": "ISC", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "license": "ISC", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "license": "ISC", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/date-fns": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", - "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js-light": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", - "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", - "license": "MIT" - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dedent": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", - "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-browser": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz", - "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==", - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT" - }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", - "license": "MIT" - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "license": "Apache-2.0" - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "license": "MIT" - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dotenv": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", - "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/drizzle-kit": { - "version": "0.31.9", - "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.9.tgz", - "integrity": "sha512-GViD3IgsXn7trFyBUUHyTFBpH/FsHTxYJ66qdbVggxef4UBPHRYxQaRzYLTuekYnk9i5FIEL9pbBIwMqX/Uwrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@drizzle-team/brocli": "^0.10.2", - "@esbuild-kit/esm-loader": "^2.5.5", - "esbuild": "^0.25.4", - "esbuild-register": "^3.5.0" - }, - "bin": { - "drizzle-kit": "bin.cjs" - } - }, - "node_modules/drizzle-orm": { - "version": "0.39.3", - "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.39.3.tgz", - "integrity": "sha512-EZ8ZpYvDIvKU9C56JYLOmUskazhad+uXZCTCRN4OnRMsL+xAJ05dv1eCpAG5xzhsm1hqiuC5kAZUCS924u2DTw==", - "license": "Apache-2.0", - "peerDependencies": { - "@aws-sdk/client-rds-data": ">=3", - "@cloudflare/workers-types": ">=4", - "@electric-sql/pglite": ">=0.2.0", - "@libsql/client": ">=0.10.0", - "@libsql/client-wasm": ">=0.10.0", - "@neondatabase/serverless": ">=0.10.0", - "@op-engineering/op-sqlite": ">=2", - "@opentelemetry/api": "^1.4.1", - "@planetscale/database": ">=1", - "@prisma/client": "*", - "@tidbcloud/serverless": "*", - "@types/better-sqlite3": "*", - "@types/pg": "*", - "@types/sql.js": "*", - "@vercel/postgres": ">=0.8.0", - "@xata.io/client": "*", - "better-sqlite3": ">=7", - "bun-types": "*", - "expo-sqlite": ">=14.0.0", - "knex": "*", - "kysely": "*", - "mysql2": ">=2", - "pg": ">=8", - "postgres": ">=3", - "sql.js": ">=1", - "sqlite3": ">=5" - }, - "peerDependenciesMeta": { - "@aws-sdk/client-rds-data": { - "optional": true - }, - "@cloudflare/workers-types": { - "optional": true - }, - "@electric-sql/pglite": { - "optional": true - }, - "@libsql/client": { - "optional": true - }, - "@libsql/client-wasm": { - "optional": true - }, - "@neondatabase/serverless": { - "optional": true - }, - "@op-engineering/op-sqlite": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@planetscale/database": { - "optional": true - }, - "@prisma/client": { - "optional": true - }, - "@tidbcloud/serverless": { - "optional": true - }, - "@types/better-sqlite3": { - "optional": true - }, - "@types/pg": { - "optional": true - }, - "@types/sql.js": { - "optional": true - }, - "@vercel/postgres": { - "optional": true - }, - "@xata.io/client": { - "optional": true - }, - "better-sqlite3": { - "optional": true - }, - "bun-types": { - "optional": true - }, - "expo-sqlite": { - "optional": true - }, - "knex": { - "optional": true - }, - "kysely": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "pg": { - "optional": true - }, - "postgres": { - "optional": true - }, - "prisma": { - "optional": true - }, - "sql.js": { - "optional": true - }, - "sqlite3": { - "optional": true - } - } - }, - "node_modules/drizzle-zod": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/drizzle-zod/-/drizzle-zod-0.7.1.tgz", - "integrity": "sha512-nZzALOdz44/AL2U005UlmMqaQ1qe5JfanvLujiTHiiT8+vZJTBFhj3pY4Vk+L6UWyKFfNmLhk602Hn4kCTynKQ==", - "license": "Apache-2.0", - "peerDependencies": { - "drizzle-orm": ">=0.36.0", - "zod": ">=3.0.0" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.302", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz", - "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/embla-carousel": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz", - "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==", - "license": "MIT" - }, - "node_modules/embla-carousel-react": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/embla-carousel-react/-/embla-carousel-react-8.6.0.tgz", - "integrity": "sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==", - "license": "MIT", - "dependencies": { - "embla-carousel": "8.6.0", - "embla-carousel-reactive-utils": "8.6.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/embla-carousel-reactive-utils": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.6.0.tgz", - "integrity": "sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==", - "license": "MIT", - "peerDependencies": { - "embla-carousel": "8.6.0" - } - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es5-ext": { - "version": "0.10.64", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", - "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", - "hasInstallScript": true, - "license": "ISC", - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "esniff": "^2.0.1", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", - "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", - "license": "ISC", - "dependencies": { - "d": "^1.0.2", - "ext": "^1.7.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "license": "ISC", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, - "node_modules/esbuild-register": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", - "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "peerDependencies": { - "esbuild": ">=0.12 <1" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/esniff": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", - "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.62", - "event-emitter": "^0.3.5", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT" - }, - "node_modules/eventsource": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", - "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", - "license": "MIT", - "dependencies": { - "eventsource-parser": "^3.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/eventsource-parser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", - "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "license": "(MIT OR WTFPL)", - "engines": { - "node": ">=6" - } - }, - "node_modules/expect-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "~1.20.3", - "content-disposition": "~0.5.4", - "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.12", - "proxy-addr": "~2.0.7", - "qs": "~6.14.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "~0.19.0", - "serve-static": "~1.16.2", - "setprototypeof": "1.2.0", - "statuses": "~2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express-rate-limit": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.2.1.tgz", - "integrity": "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==", - "license": "MIT", - "dependencies": { - "ip-address": "10.0.1" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/express-rate-limit" - }, - "peerDependencies": { - "express": ">= 4.11" - } - }, - "node_modules/express-session": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.19.0.tgz", - "integrity": "sha512-0csaMkGq+vaiZTmSMMGkfdCOabYv192VbytFypcvI0MANrp+4i/7yEkJ0sbAEhycQjntaKGzYfjfXQyVb7BHMA==", - "license": "MIT", - "dependencies": { - "cookie": "~0.7.2", - "cookie-signature": "~1.0.7", - "debug": "~2.6.9", - "depd": "~2.0.0", - "on-headers": "~1.1.0", - "parseurl": "~1.3.3", - "safe-buffer": "~5.2.1", - "uid-safe": "~2.1.5" - }, - "engines": { - "node": ">= 0.8.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express-session/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express-session/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "license": "ISC", - "dependencies": { - "type": "^2.7.2" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "node_modules/fast-equals": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.0.tgz", - "integrity": "sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "license": "MIT" - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", - "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "statuses": "~2.0.2", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data-encoder": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", - "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", - "license": "MIT" - }, - "node_modules/formdata-node": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", - "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", - "license": "MIT", - "dependencies": { - "node-domexception": "1.0.0", - "web-streams-polyfill": "4.0.0-beta.3" - }, - "engines": { - "node": ">= 12.20" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/frac": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", - "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/fraction.js": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/framer-motion": { - "version": "11.18.2", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.18.2.tgz", - "integrity": "sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w==", - "license": "MIT", - "dependencies": { - "motion-dom": "^11.18.1", - "motion-utils": "^11.18.1", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-tsconfig": { - "version": "4.13.6", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", - "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "license": "MIT" - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hono": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.2.tgz", - "integrity": "sha512-gJnaDHXKDayjt8ue0n8Gs0A007yKXj4Xzb8+cNjZeYsSzzwKc0Lr+OZgYwVfB0pHfUs17EPoLvrOsEaJ9mj+Tg==", - "license": "MIT", - "engines": { - "node": ">=16.9.0" - } - }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/input-otp": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/input-otp/-/input-otp-1.4.2.tgz", - "integrity": "sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/ip-address": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", - "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/jose": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", - "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/json-schema-typed": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", - "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", - "license": "BSD-2-Clause" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", - "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", - "license": "MIT", - "dependencies": { - "jws": "^4.0.1", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jsonwebtoken/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jwa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", - "license": "MIT", - "dependencies": { - "jwa": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", - "license": "MIT" - }, - "node_modules/lodash.defaultsdeep": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", - "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", - "license": "MIT" - }, - "node_modules/lodash.flatmap": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.flatmap/-/lodash.flatmap-4.5.0.tgz", - "integrity": "sha512-/OcpcAGWlrZyoHGeHh3cAoa6nGdX6QYtmzNP84Jqol6UEQQ2gIaU3H+0eICcjcKGl0/XF8LWOujNn9lffsnaOg==", - "license": "MIT" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "license": "MIT" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "license": "MIT" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "license": "MIT" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "license": "MIT" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "license": "MIT" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "license": "MIT" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", - "license": "MIT", - "dependencies": { - "es5-ext": "~0.10.2" - } - }, - "node_modules/lucide-react": { - "version": "0.453.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.453.0.tgz", - "integrity": "sha512-kL+RGZCcJi9BvJtzg2kshO192Ddy9hv3ij+cPrVPWSRzgCWCVazoQJxOjAwgK53NomL07HB7GPHW120FimjNhQ==", - "license": "ISC", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memoizee": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz", - "integrity": "sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==", - "license": "ISC", - "dependencies": { - "d": "^1.0.2", - "es5-ext": "^0.10.64", - "es6-weak-map": "^2.0.3", - "event-emitter": "^0.3.5", - "is-promise": "^2.2.2", - "lru-queue": "^0.1.0", - "next-tick": "^1.1.0", - "timers-ext": "^0.1.7" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/memorystore": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/memorystore/-/memorystore-1.6.7.tgz", - "integrity": "sha512-OZnmNY/NDrKohPQ+hxp0muBcBKrzKNtHr55DbqSx9hLsYVNnomSAMRAtI7R64t3gf3ID7tHQA7mG4oL3Hu9hdw==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.0", - "lru-cache": "^4.0.3" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/memorystore/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "license": "ISC", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/memorystore/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "license": "ISC" - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "license": "MIT" - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT" - }, - "node_modules/modern-screenshot": { - "version": "4.6.8", - "resolved": "https://registry.npmjs.org/modern-screenshot/-/modern-screenshot-4.6.8.tgz", - "integrity": "sha512-GJkv/yWPOJTlxj1LZDU2k474cDyOWL+LVaqTdDWQwQ5d8zIuTz1892+1cV9V0ZpK6HYZFo/+BNLBbierO9d2TA==", - "dev": true, - "license": "MIT" - }, - "node_modules/motion-dom": { - "version": "11.18.1", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.18.1.tgz", - "integrity": "sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==", - "license": "MIT", - "dependencies": { - "motion-utils": "^11.18.1" - } - }, - "node_modules/motion-utils": { - "version": "11.18.1", - "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-11.18.1.tgz", - "integrity": "sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==", - "license": "MIT" - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/multer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", - "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", - "license": "MIT", - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.6.0", - "concat-stream": "^2.0.0", - "mkdirp": "^0.5.6", - "object-assign": "^4.1.1", - "type-is": "^1.6.18", - "xtend": "^4.0.2" - }, - "engines": { - "node": ">= 10.16.0" - } - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz", - "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "license": "ISC" - }, - "node_modules/node-abi": { - "version": "3.87.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.87.0.tgz", - "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==", - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "deprecated": "Use your platform's native DOMException instead", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "license": "MIT", - "optional": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/oauth4webapi": { - "version": "3.8.5", - "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.8.5.tgz", - "integrity": "sha512-A8jmyUckVhRJj5lspguklcl90Ydqk61H3dcU0oLhH3Yv13KpAliKTt5hknpGGPZSSfOwGyraNEFmofDYH+1kSg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "license": "MIT" - }, - "node_modules/obug": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" - ], - "license": "MIT" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/openai": { - "version": "4.104.0", - "resolved": "https://registry.npmjs.org/openai/-/openai-4.104.0.tgz", - "integrity": "sha512-p99EFNsA/yX6UhVO93f5kJsDRLAg+CTA2RBqdHK4RtK8u5IJw32Hyb2dTGKbnnFmnuoBv5r7Z2CURI9sGZpSuA==", - "license": "Apache-2.0", - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7" - }, - "bin": { - "openai": "bin/cli" - }, - "peerDependencies": { - "ws": "^8.18.0", - "zod": "^3.23.8" - }, - "peerDependenciesMeta": { - "ws": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, - "node_modules/openai/node_modules/@types/node": { - "version": "18.19.130", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", - "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/openai/node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "license": "MIT" - }, - "node_modules/openid-client": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-6.8.2.tgz", - "integrity": "sha512-uOvTCndr4udZsKihJ68H9bUICrriHdUVJ6Az+4Ns6cW55rwM5h0bjVIzDz2SxgOI84LKjFyjOFvERLzdTUROGA==", - "license": "MIT", - "dependencies": { - "jose": "^6.1.3", - "oauth4webapi": "^3.8.4" - }, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/passport": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz", - "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==", - "license": "MIT", - "dependencies": { - "passport-strategy": "1.x.x", - "pause": "0.0.1", - "utils-merge": "^1.0.1" - }, - "engines": { - "node": ">= 0.4.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jaredhanson" - } - }, - "node_modules/passport-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", - "integrity": "sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==", - "dependencies": { - "passport-strategy": "1.x.x" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/passport-strategy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", - "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/pause": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", - "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" - }, - "node_modules/pg": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.18.0.tgz", - "integrity": "sha512-xqrUDL1b9MbkydY/s+VZ6v+xiMUmOUk7SS9d/1kpyQxoJ6U9AO1oIJyUWVZojbfe5Cc/oluutcgFG4L9RDP1iQ==", - "license": "MIT", - "dependencies": { - "pg-connection-string": "^2.11.0", - "pg-pool": "^3.11.0", - "pg-protocol": "^1.11.0", - "pg-types": "2.2.0", - "pgpass": "1.0.5" - }, - "engines": { - "node": ">= 16.0.0" - }, - "optionalDependencies": { - "pg-cloudflare": "^1.3.0" - }, - "peerDependencies": { - "pg-native": ">=3.0.1" - }, - "peerDependenciesMeta": { - "pg-native": { - "optional": true - } - } - }, - "node_modules/pg-cloudflare": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.3.0.tgz", - "integrity": "sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==", - "license": "MIT", - "optional": true - }, - "node_modules/pg-connection-string": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.11.0.tgz", - "integrity": "sha512-kecgoJwhOpxYU21rZjULrmrBJ698U2RxXofKVzOn5UDj61BPj/qMb7diYUR1nLScCDbrztQFl1TaQZT0t1EtzQ==", - "license": "MIT" - }, - "node_modules/pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "license": "ISC", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/pg-numeric": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pg-numeric/-/pg-numeric-1.0.2.tgz", - "integrity": "sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==", - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/pg-pool": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.11.0.tgz", - "integrity": "sha512-MJYfvHwtGp870aeusDh+hg9apvOe2zmpZJpyt+BMtzUWlVqbhFmMK6bOBXLBUPd7iRtIF9fZplDc7KrPN3PN7w==", - "license": "MIT", - "peerDependencies": { - "pg": ">=8.0" - } - }, - "node_modules/pg-protocol": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.11.0.tgz", - "integrity": "sha512-pfsxk2M9M3BuGgDOfuy37VNRRX3jmKgMjcvAcWqNDpZSf4cUmv8HSOl5ViRQFsfARFn0KuUQTgLxVMbNq5NW3g==", - "license": "MIT" - }, - "node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "license": "MIT", - "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", - "license": "MIT", - "dependencies": { - "split2": "^4.1.0" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkce-challenge": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", - "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", - "license": "MIT", - "engines": { - "node": ">=16.20.0" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", - "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.1.1" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-nested/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" - }, - "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/postgres-bytea": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", - "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "license": "MIT", - "dependencies": { - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-range": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/postgres-range/-/postgres-range-1.1.4.tgz", - "integrity": "sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==", - "license": "MIT" - }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", - "license": "MIT", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "license": "ISC" - }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/qs": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", - "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/random-bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", - "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-day-picker": { - "version": "8.10.1", - "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.1.tgz", - "integrity": "sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==", - "license": "MIT", - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/gpbl" - }, - "peerDependencies": { - "date-fns": "^2.28.0 || ^3.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-hook-form": { - "version": "7.71.2", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.71.2.tgz", - "integrity": "sha512-1CHvcDYzuRUNOflt4MOq3ZM46AronNJtQ1S7tnX6YN4y72qhgiUItpacZUAQ0TyWYci3yz1X+rXaSxiuEm86PA==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-hook-form" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18 || ^19" - } - }, - "node_modules/react-icons": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz", - "integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==", - "license": "MIT", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/react-refresh": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-remove-scroll": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", - "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", - "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.7", - "react-style-singleton": "^2.2.3", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.3", - "use-sidecar": "^1.1.3" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", - "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", - "license": "MIT", - "dependencies": { - "react-style-singleton": "^2.2.2", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-resizable-panels": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-2.1.9.tgz", - "integrity": "sha512-z77+X08YDIrgAes4jl8xhnUu1LNIRp4+E7cv4xHmLOxxUPO/ML7PSrE813b90vj7xvQ1lcf7g2uA9GeMZonjhQ==", - "license": "MIT", - "peerDependencies": { - "react": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", - "react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/react-smooth": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", - "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==", - "license": "MIT", - "dependencies": { - "fast-equals": "^5.0.1", - "prop-types": "^15.8.1", - "react-transition-group": "^4.4.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-style-singleton": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", - "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", - "license": "MIT", - "dependencies": { - "get-nonce": "^1.0.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/recharts": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.4.tgz", - "integrity": "sha512-UT/q6fwS3c1dHbXv2uFgYJ9BMFHu3fwnd7AYZaEQhXuYQ4hgsxLvsUXzGdKeZrW5xopzDCvuA2N41WJ88I7zIw==", - "license": "MIT", - "dependencies": { - "clsx": "^2.0.0", - "eventemitter3": "^4.0.1", - "lodash": "^4.17.21", - "react-is": "^18.3.1", - "react-smooth": "^4.0.4", - "recharts-scale": "^0.4.4", - "tiny-invariant": "^1.3.1", - "victory-vendor": "^36.6.8" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/recharts-scale": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", - "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", - "license": "MIT", - "dependencies": { - "decimal.js-light": "^2.4.1" - } - }, - "node_modules/recharts/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" - }, - "node_modules/regexparam": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-3.0.0.tgz", - "integrity": "sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "devOptional": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", - "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.59.0", - "@rollup/rollup-android-arm64": "4.59.0", - "@rollup/rollup-darwin-arm64": "4.59.0", - "@rollup/rollup-darwin-x64": "4.59.0", - "@rollup/rollup-freebsd-arm64": "4.59.0", - "@rollup/rollup-freebsd-x64": "4.59.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", - "@rollup/rollup-linux-arm-musleabihf": "4.59.0", - "@rollup/rollup-linux-arm64-gnu": "4.59.0", - "@rollup/rollup-linux-arm64-musl": "4.59.0", - "@rollup/rollup-linux-loong64-gnu": "4.59.0", - "@rollup/rollup-linux-loong64-musl": "4.59.0", - "@rollup/rollup-linux-ppc64-gnu": "4.59.0", - "@rollup/rollup-linux-ppc64-musl": "4.59.0", - "@rollup/rollup-linux-riscv64-gnu": "4.59.0", - "@rollup/rollup-linux-riscv64-musl": "4.59.0", - "@rollup/rollup-linux-s390x-gnu": "4.59.0", - "@rollup/rollup-linux-x64-gnu": "4.59.0", - "@rollup/rollup-linux-x64-musl": "4.59.0", - "@rollup/rollup-openbsd-x64": "4.59.0", - "@rollup/rollup-openharmony-arm64": "4.59.0", - "@rollup/rollup-win32-arm64-msvc": "4.59.0", - "@rollup/rollup-win32-ia32-msvc": "4.59.0", - "@rollup/rollup-win32-x64-gnu": "4.59.0", - "@rollup/rollup-win32-x64-msvc": "4.59.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/router/node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/router/node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/send": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.4.1", - "range-parser": "~1.2.1", - "statuses": "~2.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/serve-static": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", - "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "~0.19.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "license": "ISC", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/ssf": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", - "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", - "license": "Apache-2.0", - "dependencies": { - "frac": "~1.1.2" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", - "dev": true, - "license": "MIT" - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stripe": { - "version": "18.5.0", - "resolved": "https://registry.npmjs.org/stripe/-/stripe-18.5.0.tgz", - "integrity": "sha512-Hp+wFiEQtCB0LlNgcFh5uVyKznpDjzyUZ+CNVEf+I3fhlYvh7rZruIg+jOwzJRCpy0ZTPMjlzm7J2/M2N6d+DA==", - "license": "MIT", - "dependencies": { - "qs": "^6.11.0" - }, - "engines": { - "node": ">=12.*" - }, - "peerDependencies": { - "@types/node": ">=12.x.x" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/sucrase": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", - "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "tinyglobby": "^0.2.11", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwind-merge": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.1.tgz", - "integrity": "sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.19", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", - "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.7", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss-animate": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", - "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", - "license": "MIT", - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders" - } - }, - "node_modules/tailwindcss/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/timers-ext": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.8.tgz", - "integrity": "sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==", - "license": "ISC", - "dependencies": { - "es5-ext": "^0.10.64", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "license": "MIT" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", - "license": "MIT" - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "license": "Apache-2.0" - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/tsx": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "esbuild": "~0.27.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/darwin-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-loong64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-s390x": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/sunos-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/esbuild": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", - "devOptional": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.3", - "@esbuild/android-arm": "0.27.3", - "@esbuild/android-arm64": "0.27.3", - "@esbuild/android-x64": "0.27.3", - "@esbuild/darwin-arm64": "0.27.3", - "@esbuild/darwin-x64": "0.27.3", - "@esbuild/freebsd-arm64": "0.27.3", - "@esbuild/freebsd-x64": "0.27.3", - "@esbuild/linux-arm": "0.27.3", - "@esbuild/linux-arm64": "0.27.3", - "@esbuild/linux-ia32": "0.27.3", - "@esbuild/linux-loong64": "0.27.3", - "@esbuild/linux-mips64el": "0.27.3", - "@esbuild/linux-ppc64": "0.27.3", - "@esbuild/linux-riscv64": "0.27.3", - "@esbuild/linux-s390x": "0.27.3", - "@esbuild/linux-x64": "0.27.3", - "@esbuild/netbsd-arm64": "0.27.3", - "@esbuild/netbsd-x64": "0.27.3", - "@esbuild/openbsd-arm64": "0.27.3", - "@esbuild/openbsd-x64": "0.27.3", - "@esbuild/openharmony-arm64": "0.27.3", - "@esbuild/sunos-x64": "0.27.3", - "@esbuild/win32-arm64": "0.27.3", - "@esbuild/win32-ia32": "0.27.3", - "@esbuild/win32-x64": "0.27.3" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/type": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", - "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", - "license": "ISC" - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "license": "MIT" - }, - "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uid-safe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", - "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", - "license": "MIT", - "dependencies": { - "random-bytes": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "license": "MIT" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/use-callback-ref": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", - "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sidecar": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", - "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", - "license": "MIT", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sync-external-store": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vaul": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vaul/-/vaul-1.1.2.tgz", - "integrity": "sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-dialog": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/victory-vendor": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", - "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", - "license": "MIT AND ISC", - "dependencies": { - "@types/d3-array": "^3.0.3", - "@types/d3-ease": "^3.0.0", - "@types/d3-interpolate": "^3.0.1", - "@types/d3-scale": "^4.0.2", - "@types/d3-shape": "^3.1.0", - "@types/d3-time": "^3.0.0", - "@types/d3-timer": "^3.0.0", - "d3-array": "^3.1.6", - "d3-ease": "^3.0.1", - "d3-interpolate": "^3.0.1", - "d3-scale": "^4.0.2", - "d3-shape": "^3.1.0", - "d3-time": "^3.0.0", - "d3-timer": "^3.0.1" - } - }, - "node_modules/vite": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", - "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.27.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.3", - "@esbuild/android-arm": "0.27.3", - "@esbuild/android-arm64": "0.27.3", - "@esbuild/android-x64": "0.27.3", - "@esbuild/darwin-arm64": "0.27.3", - "@esbuild/darwin-x64": "0.27.3", - "@esbuild/freebsd-arm64": "0.27.3", - "@esbuild/freebsd-x64": "0.27.3", - "@esbuild/linux-arm": "0.27.3", - "@esbuild/linux-arm64": "0.27.3", - "@esbuild/linux-ia32": "0.27.3", - "@esbuild/linux-loong64": "0.27.3", - "@esbuild/linux-mips64el": "0.27.3", - "@esbuild/linux-ppc64": "0.27.3", - "@esbuild/linux-riscv64": "0.27.3", - "@esbuild/linux-s390x": "0.27.3", - "@esbuild/linux-x64": "0.27.3", - "@esbuild/netbsd-arm64": "0.27.3", - "@esbuild/netbsd-x64": "0.27.3", - "@esbuild/openbsd-arm64": "0.27.3", - "@esbuild/openbsd-x64": "0.27.3", - "@esbuild/openharmony-arm64": "0.27.3", - "@esbuild/sunos-x64": "0.27.3", - "@esbuild/win32-arm64": "0.27.3", - "@esbuild/win32-ia32": "0.27.3", - "@esbuild/win32-x64": "0.27.3" - } - }, - "node_modules/vite/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/vitest": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz", - "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.18", - "@vitest/mocker": "4.0.18", - "@vitest/pretty-format": "4.0.18", - "@vitest/runner": "4.0.18", - "@vitest/snapshot": "4.0.18", - "@vitest/spy": "4.0.18", - "@vitest/utils": "4.0.18", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.18", - "@vitest/browser-preview": "4.0.18", - "@vitest/browser-webdriverio": "4.0.18", - "@vitest/ui": "4.0.18", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/web-streams-polyfill": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", - "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wmf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", - "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/word": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", - "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/wouter": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/wouter/-/wouter-3.9.0.tgz", - "integrity": "sha512-sF/od/PIgqEQBQcrN7a2x3MX6MQE6nW0ygCfy9hQuUkuB28wEZuu/6M5GyqkrrEu9M6jxdkgE12yDFsQMKos4Q==", - "license": "Unlicense", - "dependencies": { - "mitt": "^3.0.1", - "regexparam": "^3.0.0", - "use-sync-external-store": "^1.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xlsx": { - "version": "0.18.5", - "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz", - "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", - "license": "Apache-2.0", - "dependencies": { - "adler-32": "~1.3.0", - "cfb": "~1.2.1", - "codepage": "~1.15.0", - "crc-32": "~1.2.1", - "ssf": "~0.11.2", - "wmf": "~1.0.1", - "word": "~0.3.0" - }, - "bin": { - "xlsx": "bin/xlsx.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-to-json-schema": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", - "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", - "license": "ISC", - "peerDependencies": { - "zod": "^3.25 || ^4" - } - }, - "node_modules/zod-validation-error": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-3.5.4.tgz", - "integrity": "sha512-+hEiRIiPobgyuFlEojnqjJnhFvg4r/i3cqgcm67eehZf/WBaK3g6cD02YU9mtdVxZjv8CzCA9n/Rhrs3yAAvAw==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "zod": "^3.24.4" - } - } - } -} diff --git a/package.json b/package.json index 5ac420d..70afb73 100755 --- a/package.json +++ b/package.json @@ -14,7 +14,6 @@ "test:run": "vitest run" }, "dependencies": { - "@chittyos/chittyconnect": "file:../chittyconnect", "@hookform/resolvers": "^3.9.1", "@jridgewell/trace-mapping": "^0.3.25", "@modelcontextprotocol/sdk": "^1.27.1", @@ -47,7 +46,6 @@ "@radix-ui/react-toggle": "^1.1.0", "@radix-ui/react-toggle-group": "^1.1.0", "@radix-ui/react-tooltip": "^1.1.3", - "@replit/vite-plugin-shadcn-theme-json": "^0.0.4", "@stripe/react-stripe-js": "^3.6.0", "@stripe/stripe-js": "^7.1.0", "@tanstack/react-query": "^5.60.5", @@ -76,7 +74,6 @@ "lucide-react": "^0.453.0", "memoizee": "^0.4.17", "memorystore": "^1.6.7", - "multer": "^2.0.2", "openai": "^4.95.0", "openid-client": "^6.8.1", "passport": "^0.7.0", @@ -94,14 +91,11 @@ "vaul": "^1.1.0", "wouter": "^3.3.5", "ws": "^8.18.0", - "xlsx": "^0.18.5", "zod": "^3.23.8", "zod-validation-error": "^3.4.0" }, "devDependencies": { "@cloudflare/workers-types": "^4.20260302.0", - "@replit/vite-plugin-cartographer": "^0.0.11", - "@replit/vite-plugin-runtime-error-modal": "^0.0.3", "@tailwindcss/typography": "^0.5.15", "@types/better-sqlite3": "^7.6.13", "@types/connect-pg-simple": "^7.0.3", @@ -130,5 +124,19 @@ }, "optionalDependencies": { "bufferutil": "^4.0.8" + }, + "pnpm": { + "onlyBuiltDependencies": [ + "better-sqlite3", + "bufferutil", + "es5-ext", + "esbuild" + ], + "overrides": { + "express-rate-limit": ">=8.2.2", + "@hono/node-server": ">=1.19.10", + "axios": ">=1.13.5", + "rollup": ">=4.59.0" + } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1c5e26d..e451c6b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,19 +4,25 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + express-rate-limit: '>=8.2.2' + '@hono/node-server': '>=1.19.10' + axios: '>=1.13.5' + rollup: '>=4.59.0' + importers: .: dependencies: - '@chittyos/chittyconnect': - specifier: file:../chittyconnect - version: file:../chittyconnect '@hookform/resolvers': specifier: ^3.9.1 version: 3.10.0(react-hook-form@7.71.1(react@18.3.1)) '@jridgewell/trace-mapping': specifier: ^0.3.25 version: 0.3.31 + '@modelcontextprotocol/sdk': + specifier: ^1.27.1 + version: 1.27.1(zod@3.25.76) '@neondatabase/serverless': specifier: ^0.10.4 version: 0.10.4 @@ -104,9 +110,6 @@ importers: '@radix-ui/react-tooltip': specifier: ^1.1.3 version: 1.2.8(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@replit/vite-plugin-shadcn-theme-json': - specifier: ^0.0.4 - version: 0.0.4 '@stripe/react-stripe-js': specifier: ^3.6.0 version: 3.10.0(@stripe/stripe-js@7.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -154,10 +157,10 @@ importers: version: 17.2.3 drizzle-orm: specifier: ^0.39.1 - version: 0.39.3(@neondatabase/serverless@0.10.4)(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(pg@8.16.3) + version: 0.39.3(@cloudflare/workers-types@4.20260305.0)(@neondatabase/serverless@0.10.4)(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(pg@8.16.3) drizzle-zod: specifier: ^0.7.0 - version: 0.7.1(drizzle-orm@0.39.3(@neondatabase/serverless@0.10.4)(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(pg@8.16.3))(zod@3.25.76) + version: 0.7.1(drizzle-orm@0.39.3(@cloudflare/workers-types@4.20260305.0)(@neondatabase/serverless@0.10.4)(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(pg@8.16.3))(zod@3.25.76) embla-carousel-react: specifier: ^8.3.0 version: 8.6.0(react@18.3.1) @@ -170,9 +173,15 @@ importers: framer-motion: specifier: ^11.18.2 version: 11.18.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + hono: + specifier: ^4.12.2 + version: 4.12.4 input-otp: specifier: ^1.2.4 version: 1.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + jose: + specifier: ^6.1.3 + version: 6.1.3 jsonwebtoken: specifier: ^9.0.3 version: 9.0.3 @@ -185,9 +194,6 @@ importers: memorystore: specifier: ^1.6.7 version: 1.6.7 - multer: - specifier: ^2.0.2 - version: 2.0.2 openai: specifier: ^4.95.0 version: 4.104.0(ws@8.19.0(bufferutil@4.1.0))(zod@3.25.76) @@ -239,9 +245,6 @@ importers: ws: specifier: ^8.18.0 version: 8.19.0(bufferutil@4.1.0) - xlsx: - specifier: ^0.18.5 - version: 0.18.5 zod: specifier: ^3.23.8 version: 3.25.76 @@ -249,12 +252,9 @@ importers: specifier: ^3.4.0 version: 3.5.4(zod@3.25.76) devDependencies: - '@replit/vite-plugin-cartographer': - specifier: ^0.0.11 - version: 0.0.11 - '@replit/vite-plugin-runtime-error-modal': - specifier: ^0.0.3 - version: 0.0.3 + '@cloudflare/workers-types': + specifier: ^4.20260302.0 + version: 4.20260305.0 '@tailwindcss/typography': specifier: ^0.5.15 version: 0.5.19(tailwindcss@3.4.19(tsx@4.21.0)) @@ -301,8 +301,8 @@ importers: specifier: ^10.4.20 version: 10.4.23(postcss@8.5.6) drizzle-kit: - specifier: ^0.18.1 - version: 0.18.1 + specifier: ^0.31.9 + version: 0.31.9 esbuild: specifier: ^0.25.0 version: 0.25.12 @@ -327,6 +327,9 @@ importers: vite: specifier: ^7.2.7 version: 7.3.1(@types/node@20.19.29)(jiti@1.21.7)(tsx@4.21.0) + vitest: + specifier: ^4.0.18 + version: 4.0.18(@types/node@20.19.29)(jiti@1.21.7)(tsx@4.21.0) optionalDependencies: bufferutil: specifier: ^4.0.8 @@ -472,10 +475,19 @@ packages: resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} engines: {node: '>=6.9.0'} - '@chittyos/chittyconnect@file:../chittyconnect': - resolution: {directory: ../chittyconnect, type: directory} - engines: {node: '>=18.0.0'} - hasBin: true + '@cloudflare/workers-types@4.20260305.0': + resolution: {integrity: sha512-sCgPFnQ03SVpC2OVW8wysONLZW/A8hlp9Mq2ckG/h1oId4kr9NawA6vUiOmOjCWRn2hIohejBYVQ+Vu20rCdKA==} + + '@drizzle-team/brocli@0.10.2': + resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} + + '@esbuild-kit/core-utils@3.3.2': + resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} + deprecated: 'Merged into tsx: https://tsx.is' + + '@esbuild-kit/esm-loader@2.6.5': + resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} + deprecated: 'Merged into tsx: https://tsx.is' '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} @@ -489,6 +501,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.25.12': resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} @@ -501,8 +519,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm@0.15.18': - resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==} + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -519,6 +537,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.25.12': resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} @@ -531,6 +555,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.25.12': resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} @@ -543,6 +573,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.25.12': resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} @@ -555,6 +591,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.25.12': resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} @@ -567,6 +609,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.12': resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} @@ -579,6 +627,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.25.12': resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} @@ -591,6 +645,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.25.12': resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} @@ -603,6 +663,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.25.12': resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} @@ -615,8 +681,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.15.18': - resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==} + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -633,6 +699,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.25.12': resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} @@ -645,6 +717,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.25.12': resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} @@ -657,6 +735,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.25.12': resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} @@ -669,6 +753,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.25.12': resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} @@ -681,6 +771,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.25.12': resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} @@ -705,6 +801,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.12': resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} @@ -729,6 +831,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.12': resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} @@ -753,6 +861,12 @@ packages: cpu: [arm64] os: [openharmony] + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.25.12': resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} @@ -765,6 +879,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.25.12': resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} @@ -777,6 +897,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.25.12': resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} @@ -789,6 +915,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.25.12': resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} @@ -816,8 +948,8 @@ packages: '@floating-ui/utils@0.2.10': resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} - '@hono/node-server@1.19.9': - resolution: {integrity: sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==} + '@hono/node-server@1.19.11': + resolution: {integrity: sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==} engines: {node: '>=18.14.1'} peerDependencies: hono: ^4 @@ -843,8 +975,8 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@modelcontextprotocol/sdk@1.25.2': - resolution: {integrity: sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww==} + '@modelcontextprotocol/sdk@1.27.1': + resolution: {integrity: sha512-sr6GbP+4edBwFndLbM60gf07z0FQ79gaExpnsjMGePXqFcSSb7t6iscpjk9DhFhwd+mTEQrzNafGP8/iGGFYaA==} engines: {node: '>=18'} peerDependencies: '@cfworker/json-schema': ^4.1.1 @@ -1528,145 +1660,149 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@replit/vite-plugin-cartographer@0.0.11': - resolution: {integrity: sha512-C1RRIDqaFtfP6BSztgCJBPA+hSH3bUNc3xbr/zzVOwOdZLJy0VaM6ypN9bwWbzksGmEZpdLQVvCAG0LLwCwCpQ==} - - '@replit/vite-plugin-runtime-error-modal@0.0.3': - resolution: {integrity: sha512-4wZHGuI9W4o9p8g4Ma/qj++7SP015+FMDGYobj7iap5oEsxXMm0B02TO5Y5PW8eqBPd4wX5l3UGco/hlC0qapw==} - - '@replit/vite-plugin-shadcn-theme-json@0.0.4': - resolution: {integrity: sha512-XsDzFUQ9E118LW5m/YNpIiIox92Uph20PZV/D51tGW3cX9LDAa3fAwjU0AKxLKZHMONXiy/PYakqf2FT9nQylg==} - '@rolldown/pluginutils@1.0.0-beta.27': resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} - '@rollup/rollup-android-arm-eabi@4.55.1': - resolution: {integrity: sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==} + '@rollup/rollup-android-arm-eabi@4.59.0': + resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.55.1': - resolution: {integrity: sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==} + '@rollup/rollup-android-arm64@4.59.0': + resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.55.1': - resolution: {integrity: sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==} + '@rollup/rollup-darwin-arm64@4.59.0': + resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.55.1': - resolution: {integrity: sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==} + '@rollup/rollup-darwin-x64@4.59.0': + resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.55.1': - resolution: {integrity: sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==} + '@rollup/rollup-freebsd-arm64@4.59.0': + resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.55.1': - resolution: {integrity: sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==} + '@rollup/rollup-freebsd-x64@4.59.0': + resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.55.1': - resolution: {integrity: sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': + resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} cpu: [arm] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.55.1': - resolution: {integrity: sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==} + '@rollup/rollup-linux-arm-musleabihf@4.59.0': + resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} cpu: [arm] os: [linux] + libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.55.1': - resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==} + '@rollup/rollup-linux-arm64-gnu@4.59.0': + resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} cpu: [arm64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.55.1': - resolution: {integrity: sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==} + '@rollup/rollup-linux-arm64-musl@4.59.0': + resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} cpu: [arm64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.55.1': - resolution: {integrity: sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==} + '@rollup/rollup-linux-loong64-gnu@4.59.0': + resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} cpu: [loong64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.55.1': - resolution: {integrity: sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==} + '@rollup/rollup-linux-loong64-musl@4.59.0': + resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} cpu: [loong64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.55.1': - resolution: {integrity: sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==} + '@rollup/rollup-linux-ppc64-gnu@4.59.0': + resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} cpu: [ppc64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.55.1': - resolution: {integrity: sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==} + '@rollup/rollup-linux-ppc64-musl@4.59.0': + resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} cpu: [ppc64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.55.1': - resolution: {integrity: sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==} + '@rollup/rollup-linux-riscv64-gnu@4.59.0': + resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} cpu: [riscv64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.55.1': - resolution: {integrity: sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==} + '@rollup/rollup-linux-riscv64-musl@4.59.0': + resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} cpu: [riscv64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.55.1': - resolution: {integrity: sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==} + '@rollup/rollup-linux-s390x-gnu@4.59.0': + resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} cpu: [s390x] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.55.1': - resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==} + '@rollup/rollup-linux-x64-gnu@4.59.0': + resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} cpu: [x64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.55.1': - resolution: {integrity: sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==} + '@rollup/rollup-linux-x64-musl@4.59.0': + resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} cpu: [x64] os: [linux] + libc: [musl] - '@rollup/rollup-openbsd-x64@4.55.1': - resolution: {integrity: sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==} + '@rollup/rollup-openbsd-x64@4.59.0': + resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.55.1': - resolution: {integrity: sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==} + '@rollup/rollup-openharmony-arm64@4.59.0': + resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.55.1': - resolution: {integrity: sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==} + '@rollup/rollup-win32-arm64-msvc@4.59.0': + resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.55.1': - resolution: {integrity: sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==} + '@rollup/rollup-win32-ia32-msvc@4.59.0': + resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.55.1': - resolution: {integrity: sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==} + '@rollup/rollup-win32-x64-gnu@4.59.0': + resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.55.1': - resolution: {integrity: sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==} + '@rollup/rollup-win32-x64-msvc@4.59.0': + resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} cpu: [x64] os: [win32] - '@sinclair/typebox@0.33.22': - resolution: {integrity: sha512-auUj4k+f4pyrIVf4GW5UKquSZFHJWri06QgARy9C0t9ZTjJLIuNIrr1yl9bWcJWJ1Gz1vOvYN1D+QPaIlNMVkQ==} + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} '@stripe/react-stripe-js@3.10.0': resolution: {integrity: sha512-UPqHZwMwDzGSax0ZI7XlxR3tZSpgIiZdk3CiwjbTK978phwR/fFXeAXQcN/h8wTAjR4ZIAzdlI9DbOqJhuJdeg==} @@ -1710,6 +1846,9 @@ packages: '@types/body-parser@1.19.6': resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/connect-pg-simple@7.0.3': resolution: {integrity: sha512-NGCy9WBlW2bw+J/QlLnFZ9WjoGs6tMo3LAut6mY4kK+XHzue//lpNVpAvYRpIwM969vBRAM2Re0izUvV6kt+NA==} @@ -1743,6 +1882,9 @@ packages: '@types/d3-timer@3.0.2': resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -1826,6 +1968,35 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@vitest/expect@4.0.18': + resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} + + '@vitest/mocker@4.0.18': + resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@4.0.18': + resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} + + '@vitest/runner@4.0.18': + resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} + + '@vitest/snapshot@4.0.18': + resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} + + '@vitest/spy@4.0.18': + resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} + + '@vitest/utils@4.0.18': + resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -1838,10 +2009,6 @@ packages: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} - adler-32@1.3.1: - resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==} - engines: {node: '>=0.8'} - agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} @@ -1868,9 +2035,6 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - append-field@1.0.0: - resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} - arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -1881,6 +2045,10 @@ packages: array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -1891,11 +2059,8 @@ packages: peerDependencies: postcss: ^8.1.0 - axios@1.13.2: - resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + axios@1.13.6: + resolution: {integrity: sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -1928,9 +2093,6 @@ packages: resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} engines: {node: '>=18'} - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -1953,10 +2115,6 @@ packages: resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==} engines: {node: '>=6.14.2'} - busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -1973,23 +2131,15 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - caniuse-lite@1.0.30001764: resolution: {integrity: sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==} canvas-confetti@1.9.4: resolution: {integrity: sha512-yxQbJkAVrFXWNbTUjPqjF7G+g6pDotOUHGbkZq2NELZUMDpiJ85rIEazVb8GTaAptNW2miJAXbs1BtioA251Pw==} - cfb@1.2.2: - resolution: {integrity: sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==} - engines: {node: '>=0.8'} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} @@ -2001,10 +2151,6 @@ packages: class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} - cli-color@2.0.4: - resolution: {integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==} - engines: {node: '>=0.10'} - clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -2015,13 +2161,6 @@ packages: react: ^18 || ^19 || ^19.0.0-rc react-dom: ^18 || ^19 || ^19.0.0-rc - codepage@1.15.0: - resolution: {integrity: sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==} - engines: {node: '>=0.8'} - - colorjs.io@0.5.2: - resolution: {integrity: sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==} - combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -2030,14 +2169,6 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - - concat-stream@2.0.0: - resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} - engines: {'0': node >= 6.0} - connect-pg-simple@10.0.0: resolution: {integrity: sha512-pBGVazlqiMrackzCr0eKhn4LO5trJXsOX0nQoey9wCOayh80MYtThCbq8eoLsjpiWgiok/h+1/uti9/2/Una8A==} engines: {node: ^18.18.0 || ^20.9.0 || >=22.0.0} @@ -2072,11 +2203,6 @@ packages: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} - crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -2140,10 +2266,6 @@ packages: resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} engines: {node: '>=0.12'} - data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - date-fns@3.6.0: resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} @@ -2171,14 +2293,6 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - dedent@1.7.1: - resolution: {integrity: sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -2211,9 +2325,6 @@ packages: didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - difflib@0.2.4: - resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} - dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} @@ -2224,12 +2335,8 @@ packages: resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} engines: {node: '>=12'} - dreamopt@0.8.0: - resolution: {integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==} - engines: {node: '>=0.4.0'} - - drizzle-kit@0.18.1: - resolution: {integrity: sha512-Oqie227W2Dd7FuqX4pvQWeClSvnoPCIn2cO9JueeLWZqj3tpdBhnbgt4nLHhBbOdWRlTLYwXnkTDW3hYym/gGQ==} + drizzle-kit@0.31.9: + resolution: {integrity: sha512-GViD3IgsXn7trFyBUUHyTFBpH/FsHTxYJ66qdbVggxef4UBPHRYxQaRzYLTuekYnk9i5FIEL9pbBIwMqX/Uwrg==} hasBin: true drizzle-orm@0.39.3: @@ -2365,6 +2472,9 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -2387,133 +2497,13 @@ packages: es6-weak-map@2.0.3: resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} - esbuild-android-64@0.15.18: - resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - esbuild-android-arm64@0.15.18: - resolution: {integrity: sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - esbuild-darwin-64@0.15.18: - resolution: {integrity: sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - esbuild-darwin-arm64@0.15.18: - resolution: {integrity: sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - esbuild-freebsd-64@0.15.18: - resolution: {integrity: sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - esbuild-freebsd-arm64@0.15.18: - resolution: {integrity: sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - esbuild-linux-32@0.15.18: - resolution: {integrity: sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - esbuild-linux-64@0.15.18: - resolution: {integrity: sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - - esbuild-linux-arm64@0.15.18: - resolution: {integrity: sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - esbuild-linux-arm@0.15.18: - resolution: {integrity: sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - esbuild-linux-mips64le@0.15.18: - resolution: {integrity: sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - esbuild-linux-ppc64le@0.15.18: - resolution: {integrity: sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - esbuild-linux-riscv64@0.15.18: - resolution: {integrity: sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - esbuild-linux-s390x@0.15.18: - resolution: {integrity: sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - esbuild-netbsd-64@0.15.18: - resolution: {integrity: sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - - esbuild-openbsd-64@0.15.18: - resolution: {integrity: sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - esbuild-register@3.6.0: resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} peerDependencies: esbuild: '>=0.12 <1' - esbuild-sunos-64@0.15.18: - resolution: {integrity: sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - esbuild-windows-32@0.15.18: - resolution: {integrity: sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - esbuild-windows-64@0.15.18: - resolution: {integrity: sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - esbuild-windows-arm64@0.15.18: - resolution: {integrity: sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - esbuild@0.15.18: - resolution: {integrity: sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==} + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} engines: {node: '>=12'} hasBin: true @@ -2538,6 +2528,9 @@ packages: resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} engines: {node: '>=0.10'} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -2564,8 +2557,12 @@ packages: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} - express-rate-limit@7.5.1: - resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} + + express-rate-limit@8.3.0: + resolution: {integrity: sha512-KJzBawY6fB9FiZGdE/0aftepZ91YlaGIrV8vgblRM3J8X+dHx/aiowJWwkx6LIGyuqGiANsjSwwrbb8mifOJ4Q==} engines: {node: '>= 16'} peerDependencies: express: '>= 4.11' @@ -2611,10 +2608,6 @@ packages: picomatch: optional: true - fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} @@ -2650,18 +2643,10 @@ packages: resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} engines: {node: '>= 12.20'} - formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - frac@1.1.2: - resolution: {integrity: sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==} - engines: {node: '>=0.8'} - fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} @@ -2690,9 +2675,6 @@ packages: fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -2731,18 +2713,10 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} - hanji@0.0.5: - resolution: {integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==} - has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -2755,11 +2729,8 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - heap@0.2.7: - resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} - - hono@4.11.4: - resolution: {integrity: sha512-U7tt8JsyrxSRKspfhtLET79pU8K+tInj5QZXs1jSugO1Vq5dFj3kmZsRldo29mTBfcjDRVRXrEZ6LS63Cog9ZA==} + hono@4.12.4: + resolution: {integrity: sha512-ooiZW1Xy8rQ4oELQ++otI2T9DsKpV0M6c6cO6JGx4RTfav9poFFLlet9UMXHZnoM1yG0HWGlQLswBGX3RZmHtg==} engines: {node: '>=16.9.0'} http-errors@2.0.1: @@ -2788,10 +2759,6 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -2808,6 +2775,10 @@ packages: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} + ip-address@10.1.0: + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + engines: {node: '>= 12'} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -2845,9 +2816,6 @@ packages: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true - jose@5.10.0: - resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} - jose@6.1.3: resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} @@ -2859,10 +2827,6 @@ packages: engines: {node: '>=6'} hasBin: true - json-diff@0.9.0: - resolution: {integrity: sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==} - hasBin: true - json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} @@ -2918,9 +2882,6 @@ packages: lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - lodash.throttle@4.1.1: - resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} - lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -3009,14 +2970,6 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - - minimatch@7.4.6: - resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} - engines: {node: '>=10'} - minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -3026,13 +2979,6 @@ packages: mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - modern-screenshot@4.6.7: - resolution: {integrity: sha512-0GhgI6i6le4AhKzCvLYjwEmsP47kTsX45iT5yuAzsLTi/7i3Rjxe8fbH2VjGJLuyOThwsa0CdQAPd4auoEtsZg==} - motion-dom@11.18.1: resolution: {integrity: sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==} @@ -3045,10 +2991,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - multer@2.0.2: - resolution: {integrity: sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==} - engines: {node: '>= 10.16.0'} - mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -3094,10 +3036,6 @@ packages: encoding: optional: true - node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-gyp-build@4.8.4: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true @@ -3127,6 +3065,9 @@ packages: obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -3182,6 +3123,9 @@ packages: path-to-regexp@8.3.0: resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pause@0.0.1: resolution: {integrity: sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==} @@ -3509,8 +3453,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.55.1: - resolution: {integrity: sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==} + rollup@4.59.0: + resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3582,34 +3526,39 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} - ssf@0.11.2: - resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==} - engines: {node: '>=0.8'} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} statuses@2.0.2: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} - streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -3673,10 +3622,21 @@ packages: tiny-warning@1.0.3: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -3713,9 +3673,6 @@ packages: type@2.7.3: resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} - typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript@5.6.3: resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} engines: {node: '>=14.17'} @@ -3826,9 +3783,39 @@ packages: yaml: optional: true - web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} + vitest@4.0.18: + resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.18 + '@vitest/browser-preview': 4.0.18 + '@vitest/browser-webdriverio': 4.0.18 + '@vitest/ui': 4.0.18 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true web-streams-polyfill@4.0.0-beta.3: resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} @@ -3845,16 +3832,10 @@ packages: engines: {node: '>= 8'} hasBin: true - wmf@1.0.2: - resolution: {integrity: sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==} - engines: {node: '>=0.8'} - - word@0.3.0: - resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==} - engines: {node: '>=0.8'} - - wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true wouter@3.9.0: resolution: {integrity: sha512-sF/od/PIgqEQBQcrN7a2x3MX6MQE6nW0ygCfy9hQuUkuB28wEZuu/6M5GyqkrrEu9M6jxdkgE12yDFsQMKos4Q==} @@ -3876,11 +3857,6 @@ packages: utf-8-validate: optional: true - xlsx@0.18.5: - resolution: {integrity: sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==} - engines: {node: '>=0.8'} - hasBin: true - xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -3925,7 +3901,7 @@ snapshots: '@apimatic/http-query': 0.3.9 '@apimatic/json-bigint': 1.2.0 '@apimatic/proxy': 0.1.4 - axios: 1.13.2 + axios: 1.13.6 detect-browser: 5.3.0 detect-node: 2.1.0 form-data: 4.0.5 @@ -4111,17 +4087,19 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@chittyos/chittyconnect@file:../chittyconnect': + '@cloudflare/workers-types@4.20260305.0': {} + + '@drizzle-team/brocli@0.10.2': {} + + '@esbuild-kit/core-utils@3.3.2': dependencies: - '@modelcontextprotocol/sdk': 1.25.2(hono@4.11.4)(zod@3.25.76) - '@neondatabase/serverless': 0.10.4 - hono: 4.11.4 - jose: 5.10.0 - node-fetch: 3.3.2 - zod: 3.25.76 - transitivePeerDependencies: - - '@cfworker/json-schema' - - supports-color + esbuild: 0.18.20 + source-map-support: 0.5.21 + + '@esbuild-kit/esm-loader@2.6.5': + dependencies: + '@esbuild-kit/core-utils': 3.3.2 + get-tsconfig: 4.13.0 '@esbuild/aix-ppc64@0.25.12': optional: true @@ -4129,13 +4107,16 @@ snapshots: '@esbuild/aix-ppc64@0.27.2': optional: true + '@esbuild/android-arm64@0.18.20': + optional: true + '@esbuild/android-arm64@0.25.12': optional: true '@esbuild/android-arm64@0.27.2': optional: true - '@esbuild/android-arm@0.15.18': + '@esbuild/android-arm@0.18.20': optional: true '@esbuild/android-arm@0.25.12': @@ -4144,55 +4125,79 @@ snapshots: '@esbuild/android-arm@0.27.2': optional: true + '@esbuild/android-x64@0.18.20': + optional: true + '@esbuild/android-x64@0.25.12': optional: true '@esbuild/android-x64@0.27.2': optional: true + '@esbuild/darwin-arm64@0.18.20': + optional: true + '@esbuild/darwin-arm64@0.25.12': optional: true '@esbuild/darwin-arm64@0.27.2': optional: true + '@esbuild/darwin-x64@0.18.20': + optional: true + '@esbuild/darwin-x64@0.25.12': optional: true '@esbuild/darwin-x64@0.27.2': optional: true + '@esbuild/freebsd-arm64@0.18.20': + optional: true + '@esbuild/freebsd-arm64@0.25.12': optional: true '@esbuild/freebsd-arm64@0.27.2': optional: true + '@esbuild/freebsd-x64@0.18.20': + optional: true + '@esbuild/freebsd-x64@0.25.12': optional: true '@esbuild/freebsd-x64@0.27.2': optional: true + '@esbuild/linux-arm64@0.18.20': + optional: true + '@esbuild/linux-arm64@0.25.12': optional: true '@esbuild/linux-arm64@0.27.2': optional: true + '@esbuild/linux-arm@0.18.20': + optional: true + '@esbuild/linux-arm@0.25.12': optional: true '@esbuild/linux-arm@0.27.2': optional: true + '@esbuild/linux-ia32@0.18.20': + optional: true + '@esbuild/linux-ia32@0.25.12': optional: true '@esbuild/linux-ia32@0.27.2': optional: true - '@esbuild/linux-loong64@0.15.18': + '@esbuild/linux-loong64@0.18.20': optional: true '@esbuild/linux-loong64@0.25.12': @@ -4201,30 +4206,45 @@ snapshots: '@esbuild/linux-loong64@0.27.2': optional: true + '@esbuild/linux-mips64el@0.18.20': + optional: true + '@esbuild/linux-mips64el@0.25.12': optional: true '@esbuild/linux-mips64el@0.27.2': optional: true + '@esbuild/linux-ppc64@0.18.20': + optional: true + '@esbuild/linux-ppc64@0.25.12': optional: true '@esbuild/linux-ppc64@0.27.2': optional: true + '@esbuild/linux-riscv64@0.18.20': + optional: true + '@esbuild/linux-riscv64@0.25.12': optional: true '@esbuild/linux-riscv64@0.27.2': optional: true + '@esbuild/linux-s390x@0.18.20': + optional: true + '@esbuild/linux-s390x@0.25.12': optional: true '@esbuild/linux-s390x@0.27.2': optional: true + '@esbuild/linux-x64@0.18.20': + optional: true + '@esbuild/linux-x64@0.25.12': optional: true @@ -4237,6 +4257,9 @@ snapshots: '@esbuild/netbsd-arm64@0.27.2': optional: true + '@esbuild/netbsd-x64@0.18.20': + optional: true + '@esbuild/netbsd-x64@0.25.12': optional: true @@ -4249,6 +4272,9 @@ snapshots: '@esbuild/openbsd-arm64@0.27.2': optional: true + '@esbuild/openbsd-x64@0.18.20': + optional: true + '@esbuild/openbsd-x64@0.25.12': optional: true @@ -4261,24 +4287,36 @@ snapshots: '@esbuild/openharmony-arm64@0.27.2': optional: true + '@esbuild/sunos-x64@0.18.20': + optional: true + '@esbuild/sunos-x64@0.25.12': optional: true '@esbuild/sunos-x64@0.27.2': optional: true + '@esbuild/win32-arm64@0.18.20': + optional: true + '@esbuild/win32-arm64@0.25.12': optional: true '@esbuild/win32-arm64@0.27.2': optional: true + '@esbuild/win32-ia32@0.18.20': + optional: true + '@esbuild/win32-ia32@0.25.12': optional: true '@esbuild/win32-ia32@0.27.2': optional: true + '@esbuild/win32-x64@0.18.20': + optional: true + '@esbuild/win32-x64@0.25.12': optional: true @@ -4302,9 +4340,9 @@ snapshots: '@floating-ui/utils@0.2.10': {} - '@hono/node-server@1.19.9(hono@4.11.4)': + '@hono/node-server@1.19.11(hono@4.12.4)': dependencies: - hono: 4.11.4 + hono: 4.12.4 '@hookform/resolvers@3.10.0(react-hook-form@7.71.1(react@18.3.1))': dependencies: @@ -4329,9 +4367,9 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@modelcontextprotocol/sdk@1.25.2(hono@4.11.4)(zod@3.25.76)': + '@modelcontextprotocol/sdk@1.27.1(zod@3.25.76)': dependencies: - '@hono/node-server': 1.19.9(hono@4.11.4) + '@hono/node-server': 1.19.11(hono@4.12.4) ajv: 8.17.1 ajv-formats: 3.0.1(ajv@8.17.1) content-type: 1.0.5 @@ -4340,7 +4378,8 @@ snapshots: eventsource: 3.0.7 eventsource-parser: 3.0.6 express: 5.2.1 - express-rate-limit: 7.5.1(express@5.2.1) + express-rate-limit: 8.3.0(express@5.2.1) + hono: 4.12.4 jose: 6.1.3 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 @@ -4348,7 +4387,6 @@ snapshots: zod: 3.25.76 zod-to-json-schema: 3.25.1(zod@3.25.76) transitivePeerDependencies: - - hono - supports-color '@neondatabase/serverless@0.10.4': @@ -5073,106 +5111,84 @@ snapshots: '@radix-ui/rect@1.1.1': {} - '@replit/vite-plugin-cartographer@0.0.11': - dependencies: - '@babel/parser': 7.28.6 - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 - magic-string: 0.30.21 - modern-screenshot: 4.6.7 - transitivePeerDependencies: - - supports-color - - '@replit/vite-plugin-runtime-error-modal@0.0.3': - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - - '@replit/vite-plugin-shadcn-theme-json@0.0.4': - dependencies: - '@sinclair/typebox': 0.33.22 - colorjs.io: 0.5.2 - dedent: 1.7.1 - transitivePeerDependencies: - - babel-plugin-macros - '@rolldown/pluginutils@1.0.0-beta.27': {} - '@rollup/rollup-android-arm-eabi@4.55.1': + '@rollup/rollup-android-arm-eabi@4.59.0': optional: true - '@rollup/rollup-android-arm64@4.55.1': + '@rollup/rollup-android-arm64@4.59.0': optional: true - '@rollup/rollup-darwin-arm64@4.55.1': + '@rollup/rollup-darwin-arm64@4.59.0': optional: true - '@rollup/rollup-darwin-x64@4.55.1': + '@rollup/rollup-darwin-x64@4.59.0': optional: true - '@rollup/rollup-freebsd-arm64@4.55.1': + '@rollup/rollup-freebsd-arm64@4.59.0': optional: true - '@rollup/rollup-freebsd-x64@4.55.1': + '@rollup/rollup-freebsd-x64@4.59.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.55.1': + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.55.1': + '@rollup/rollup-linux-arm-musleabihf@4.59.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.55.1': + '@rollup/rollup-linux-arm64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.55.1': + '@rollup/rollup-linux-arm64-musl@4.59.0': optional: true - '@rollup/rollup-linux-loong64-gnu@4.55.1': + '@rollup/rollup-linux-loong64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-loong64-musl@4.55.1': + '@rollup/rollup-linux-loong64-musl@4.59.0': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.55.1': + '@rollup/rollup-linux-ppc64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-ppc64-musl@4.55.1': + '@rollup/rollup-linux-ppc64-musl@4.59.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.55.1': + '@rollup/rollup-linux-riscv64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.55.1': + '@rollup/rollup-linux-riscv64-musl@4.59.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.55.1': + '@rollup/rollup-linux-s390x-gnu@4.59.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.55.1': + '@rollup/rollup-linux-x64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-x64-musl@4.55.1': + '@rollup/rollup-linux-x64-musl@4.59.0': optional: true - '@rollup/rollup-openbsd-x64@4.55.1': + '@rollup/rollup-openbsd-x64@4.59.0': optional: true - '@rollup/rollup-openharmony-arm64@4.55.1': + '@rollup/rollup-openharmony-arm64@4.59.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.55.1': + '@rollup/rollup-win32-arm64-msvc@4.59.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.55.1': + '@rollup/rollup-win32-ia32-msvc@4.59.0': optional: true - '@rollup/rollup-win32-x64-gnu@4.55.1': + '@rollup/rollup-win32-x64-gnu@4.59.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.55.1': + '@rollup/rollup-win32-x64-msvc@4.59.0': optional: true - '@sinclair/typebox@0.33.22': {} + '@standard-schema/spec@1.1.0': {} '@stripe/react-stripe-js@3.10.0(@stripe/stripe-js@7.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -5225,6 +5241,11 @@ snapshots: '@types/connect': 3.4.38 '@types/node': 20.19.29 + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + '@types/connect-pg-simple@7.0.3': dependencies: '@types/express': 5.0.6 @@ -5259,6 +5280,8 @@ snapshots: '@types/d3-timer@3.0.2': {} + '@types/deep-eql@4.0.2': {} + '@types/estree@1.0.8': {} '@types/express-serve-static-core@5.1.1': @@ -5373,6 +5396,45 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitest/expect@4.0.18': + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + chai: 6.2.2 + tinyrainbow: 3.0.3 + + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@20.19.29)(jiti@1.21.7)(tsx@4.21.0))': + dependencies: + '@vitest/spy': 4.0.18 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.1(@types/node@20.19.29)(jiti@1.21.7)(tsx@4.21.0) + + '@vitest/pretty-format@4.0.18': + dependencies: + tinyrainbow: 3.0.3 + + '@vitest/runner@4.0.18': + dependencies: + '@vitest/utils': 4.0.18 + pathe: 2.0.3 + + '@vitest/snapshot@4.0.18': + dependencies: + '@vitest/pretty-format': 4.0.18 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.0.18': {} + + '@vitest/utils@4.0.18': + dependencies: + '@vitest/pretty-format': 4.0.18 + tinyrainbow: 3.0.3 + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -5387,8 +5449,6 @@ snapshots: mime-types: 3.0.2 negotiator: 1.0.0 - adler-32@1.3.1: {} - agent-base@7.1.4: {} agentkeepalive@4.6.0: @@ -5413,8 +5473,6 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 - append-field@1.0.0: {} - arg@5.0.2: {} aria-hidden@1.2.6: @@ -5423,6 +5481,8 @@ snapshots: array-flatten@1.1.1: {} + assertion-error@2.0.1: {} + asynckit@0.4.0: {} autoprefixer@10.4.23(postcss@8.5.6): @@ -5434,7 +5494,7 @@ snapshots: postcss: 8.5.6 postcss-value-parser: 4.2.0 - axios@1.13.2: + axios@1.13.6: dependencies: follow-redirects: 1.15.11 form-data: 4.0.5 @@ -5442,8 +5502,6 @@ snapshots: transitivePeerDependencies: - debug - balanced-match@1.0.2: {} - base64-js@1.5.1: {} baseline-browser-mapping@2.9.14: {} @@ -5498,10 +5556,6 @@ snapshots: transitivePeerDependencies: - supports-color - brace-expansion@2.0.2: - dependencies: - balanced-match: 1.0.2 - braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -5528,10 +5582,6 @@ snapshots: node-gyp-build: 4.8.4 optional: true - busboy@1.6.0: - dependencies: - streamsearch: 1.1.0 - bytes@3.1.2: {} call-bind-apply-helpers@1.0.2: @@ -5546,18 +5596,11 @@ snapshots: camelcase-css@2.0.1: {} - camelcase@7.0.1: {} - caniuse-lite@1.0.30001764: {} canvas-confetti@1.9.4: {} - cfb@1.2.2: - dependencies: - adler-32: 1.3.1 - crc-32: 1.2.2 - - chalk@5.6.2: {} + chai@6.2.2: {} chokidar@3.6.0: dependencies: @@ -5577,14 +5620,6 @@ snapshots: dependencies: clsx: 2.1.1 - cli-color@2.0.4: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-iterator: 2.0.3 - memoizee: 0.4.17 - timers-ext: 0.1.8 - clsx@2.1.1: {} cmdk@1.1.1(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): @@ -5599,25 +5634,12 @@ snapshots: - '@types/react' - '@types/react-dom' - codepage@1.15.0: {} - - colorjs.io@0.5.2: {} - combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 commander@4.1.1: {} - commander@9.5.0: {} - - concat-stream@2.0.0: - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 3.6.2 - typedarray: 0.0.6 - connect-pg-simple@10.0.0: dependencies: pg: 8.16.3 @@ -5645,8 +5667,6 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - crc-32@1.2.2: {} - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -5702,8 +5722,6 @@ snapshots: es5-ext: 0.10.64 type: 2.7.3 - data-uri-to-buffer@4.0.1: {} - date-fns@3.6.0: {} debug@2.6.9: @@ -5720,8 +5738,6 @@ snapshots: dependencies: mimic-response: 3.1.0 - dedent@1.7.1: {} - deep-extend@0.6.0: {} delayed-stream@1.0.0: {} @@ -5740,10 +5756,6 @@ snapshots: didyoumean@1.2.2: {} - difflib@0.2.4: - dependencies: - heap: 0.2.7 - dlv@1.1.3: {} dom-helpers@5.2.1: @@ -5753,36 +5765,27 @@ snapshots: dotenv@17.2.3: {} - dreamopt@0.8.0: - dependencies: - wordwrap: 1.0.0 - - drizzle-kit@0.18.1: + drizzle-kit@0.31.9: dependencies: - camelcase: 7.0.1 - chalk: 5.6.2 - commander: 9.5.0 - esbuild: 0.15.18 - esbuild-register: 3.6.0(esbuild@0.15.18) - glob: 8.1.0 - hanji: 0.0.5 - json-diff: 0.9.0 - minimatch: 7.4.6 - zod: 3.25.76 + '@drizzle-team/brocli': 0.10.2 + '@esbuild-kit/esm-loader': 2.6.5 + esbuild: 0.25.12 + esbuild-register: 3.6.0(esbuild@0.25.12) transitivePeerDependencies: - supports-color - drizzle-orm@0.39.3(@neondatabase/serverless@0.10.4)(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(pg@8.16.3): + drizzle-orm@0.39.3(@cloudflare/workers-types@4.20260305.0)(@neondatabase/serverless@0.10.4)(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(pg@8.16.3): optionalDependencies: + '@cloudflare/workers-types': 4.20260305.0 '@neondatabase/serverless': 0.10.4 '@types/better-sqlite3': 7.6.13 '@types/pg': 8.16.0 better-sqlite3: 11.10.0 pg: 8.16.3 - drizzle-zod@0.7.1(drizzle-orm@0.39.3(@neondatabase/serverless@0.10.4)(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(pg@8.16.3))(zod@3.25.76): + drizzle-zod@0.7.1(drizzle-orm@0.39.3(@cloudflare/workers-types@4.20260305.0)(@neondatabase/serverless@0.10.4)(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(pg@8.16.3))(zod@3.25.76): dependencies: - drizzle-orm: 0.39.3(@neondatabase/serverless@0.10.4)(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(pg@8.16.3) + drizzle-orm: 0.39.3(@cloudflare/workers-types@4.20260305.0)(@neondatabase/serverless@0.10.4)(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(pg@8.16.3) zod: 3.25.76 dunder-proto@1.0.1: @@ -5821,6 +5824,8 @@ snapshots: es-errors@1.3.0: {} + es-module-lexer@1.7.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -5857,97 +5862,37 @@ snapshots: es6-iterator: 2.0.3 es6-symbol: 3.1.4 - esbuild-android-64@0.15.18: - optional: true - - esbuild-android-arm64@0.15.18: - optional: true - - esbuild-darwin-64@0.15.18: - optional: true - - esbuild-darwin-arm64@0.15.18: - optional: true - - esbuild-freebsd-64@0.15.18: - optional: true - - esbuild-freebsd-arm64@0.15.18: - optional: true - - esbuild-linux-32@0.15.18: - optional: true - - esbuild-linux-64@0.15.18: - optional: true - - esbuild-linux-arm64@0.15.18: - optional: true - - esbuild-linux-arm@0.15.18: - optional: true - - esbuild-linux-mips64le@0.15.18: - optional: true - - esbuild-linux-ppc64le@0.15.18: - optional: true - - esbuild-linux-riscv64@0.15.18: - optional: true - - esbuild-linux-s390x@0.15.18: - optional: true - - esbuild-netbsd-64@0.15.18: - optional: true - - esbuild-openbsd-64@0.15.18: - optional: true - - esbuild-register@3.6.0(esbuild@0.15.18): + esbuild-register@3.6.0(esbuild@0.25.12): dependencies: debug: 4.4.3 - esbuild: 0.15.18 + esbuild: 0.25.12 transitivePeerDependencies: - supports-color - esbuild-sunos-64@0.15.18: - optional: true - - esbuild-windows-32@0.15.18: - optional: true - - esbuild-windows-64@0.15.18: - optional: true - - esbuild-windows-arm64@0.15.18: - optional: true - - esbuild@0.15.18: + esbuild@0.18.20: optionalDependencies: - '@esbuild/android-arm': 0.15.18 - '@esbuild/linux-loong64': 0.15.18 - esbuild-android-64: 0.15.18 - esbuild-android-arm64: 0.15.18 - esbuild-darwin-64: 0.15.18 - esbuild-darwin-arm64: 0.15.18 - esbuild-freebsd-64: 0.15.18 - esbuild-freebsd-arm64: 0.15.18 - esbuild-linux-32: 0.15.18 - esbuild-linux-64: 0.15.18 - esbuild-linux-arm: 0.15.18 - esbuild-linux-arm64: 0.15.18 - esbuild-linux-mips64le: 0.15.18 - esbuild-linux-ppc64le: 0.15.18 - esbuild-linux-riscv64: 0.15.18 - esbuild-linux-s390x: 0.15.18 - esbuild-netbsd-64: 0.15.18 - esbuild-openbsd-64: 0.15.18 - esbuild-sunos-64: 0.15.18 - esbuild-windows-32: 0.15.18 - esbuild-windows-64: 0.15.18 - esbuild-windows-arm64: 0.15.18 + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 esbuild@0.25.12: optionalDependencies: @@ -6018,6 +5963,10 @@ snapshots: event-emitter: 0.3.5 type: 2.7.3 + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + etag@1.8.1: {} event-emitter@0.3.5: @@ -6037,9 +5986,12 @@ snapshots: expand-template@2.0.3: {} - express-rate-limit@7.5.1(express@5.2.1): + expect-type@1.3.0: {} + + express-rate-limit@8.3.0(express@5.2.1): dependencies: express: 5.2.1 + ip-address: 10.1.0 express-session@1.18.2: dependencies: @@ -6149,11 +6101,6 @@ snapshots: optionalDependencies: picomatch: 4.0.3 - fetch-blob@3.2.0: - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.3 - file-uri-to-path@1.0.0: {} fill-range@7.1.1: @@ -6200,14 +6147,8 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 4.0.0-beta.3 - formdata-polyfill@4.0.10: - dependencies: - fetch-blob: 3.2.0 - forwarded@0.2.0: {} - frac@1.1.2: {} - fraction.js@5.3.4: {} framer-motion@11.18.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): @@ -6225,8 +6166,6 @@ snapshots: fs-constants@1.0.0: {} - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true @@ -6268,21 +6207,8 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@8.1.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - gopd@1.2.0: {} - hanji@0.0.5: - dependencies: - lodash.throttle: 4.1.1 - sisteransi: 1.0.5 - has-symbols@1.1.0: {} has-tostringtag@1.0.2: @@ -6293,9 +6219,7 @@ snapshots: dependencies: function-bind: 1.1.2 - heap@0.2.7: {} - - hono@4.11.4: {} + hono@4.12.4: {} http-errors@2.0.1: dependencies: @@ -6333,11 +6257,6 @@ snapshots: ieee754@1.2.1: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - inherits@2.0.4: {} ini@1.3.8: {} @@ -6349,6 +6268,8 @@ snapshots: internmap@2.0.3: {} + ip-address@10.1.0: {} + ipaddr.js@1.9.1: {} is-binary-path@2.1.0: @@ -6375,20 +6296,12 @@ snapshots: jiti@1.21.7: {} - jose@5.10.0: {} - jose@6.1.3: {} js-tokens@4.0.0: {} jsesc@3.1.0: {} - json-diff@0.9.0: - dependencies: - cli-color: 2.0.4 - difflib: 0.2.4 - dreamopt: 0.8.0 - json-schema-traverse@1.0.0: {} json-schema-typed@8.0.2: {} @@ -6441,8 +6354,6 @@ snapshots: lodash.once@4.1.1: {} - lodash.throttle@4.1.1: {} - lodash@4.17.21: {} loose-envify@1.4.0: @@ -6523,26 +6434,12 @@ snapshots: mimic-response@3.1.0: {} - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.2 - - minimatch@7.4.6: - dependencies: - brace-expansion: 2.0.2 - minimist@1.2.8: {} mitt@3.0.1: {} mkdirp-classic@0.5.3: {} - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - modern-screenshot@4.6.7: {} - motion-dom@11.18.1: dependencies: motion-utils: 11.18.1 @@ -6553,16 +6450,6 @@ snapshots: ms@2.1.3: {} - multer@2.0.2: - dependencies: - append-field: 1.0.0 - busboy: 1.6.0 - concat-stream: 2.0.0 - mkdirp: 0.5.6 - object-assign: 4.1.1 - type-is: 1.6.18 - xtend: 4.0.2 - mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -6591,12 +6478,6 @@ snapshots: dependencies: whatwg-url: 5.0.0 - node-fetch@3.3.2: - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - node-gyp-build@4.8.4: optional: true @@ -6614,6 +6495,8 @@ snapshots: obuf@1.1.2: {} + obug@2.1.1: {} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 @@ -6666,6 +6549,8 @@ snapshots: path-to-regexp@8.3.0: {} + pathe@2.0.3: {} + pause@0.0.1: {} pg-cloudflare@1.2.7: @@ -6981,35 +6866,35 @@ snapshots: reusify@1.1.0: {} - rollup@4.55.1: + rollup@4.59.0: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.55.1 - '@rollup/rollup-android-arm64': 4.55.1 - '@rollup/rollup-darwin-arm64': 4.55.1 - '@rollup/rollup-darwin-x64': 4.55.1 - '@rollup/rollup-freebsd-arm64': 4.55.1 - '@rollup/rollup-freebsd-x64': 4.55.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.55.1 - '@rollup/rollup-linux-arm-musleabihf': 4.55.1 - '@rollup/rollup-linux-arm64-gnu': 4.55.1 - '@rollup/rollup-linux-arm64-musl': 4.55.1 - '@rollup/rollup-linux-loong64-gnu': 4.55.1 - '@rollup/rollup-linux-loong64-musl': 4.55.1 - '@rollup/rollup-linux-ppc64-gnu': 4.55.1 - '@rollup/rollup-linux-ppc64-musl': 4.55.1 - '@rollup/rollup-linux-riscv64-gnu': 4.55.1 - '@rollup/rollup-linux-riscv64-musl': 4.55.1 - '@rollup/rollup-linux-s390x-gnu': 4.55.1 - '@rollup/rollup-linux-x64-gnu': 4.55.1 - '@rollup/rollup-linux-x64-musl': 4.55.1 - '@rollup/rollup-openbsd-x64': 4.55.1 - '@rollup/rollup-openharmony-arm64': 4.55.1 - '@rollup/rollup-win32-arm64-msvc': 4.55.1 - '@rollup/rollup-win32-ia32-msvc': 4.55.1 - '@rollup/rollup-win32-x64-gnu': 4.55.1 - '@rollup/rollup-win32-x64-msvc': 4.55.1 + '@rollup/rollup-android-arm-eabi': 4.59.0 + '@rollup/rollup-android-arm64': 4.59.0 + '@rollup/rollup-darwin-arm64': 4.59.0 + '@rollup/rollup-darwin-x64': 4.59.0 + '@rollup/rollup-freebsd-arm64': 4.59.0 + '@rollup/rollup-freebsd-x64': 4.59.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.59.0 + '@rollup/rollup-linux-arm-musleabihf': 4.59.0 + '@rollup/rollup-linux-arm64-gnu': 4.59.0 + '@rollup/rollup-linux-arm64-musl': 4.59.0 + '@rollup/rollup-linux-loong64-gnu': 4.59.0 + '@rollup/rollup-linux-loong64-musl': 4.59.0 + '@rollup/rollup-linux-ppc64-gnu': 4.59.0 + '@rollup/rollup-linux-ppc64-musl': 4.59.0 + '@rollup/rollup-linux-riscv64-gnu': 4.59.0 + '@rollup/rollup-linux-riscv64-musl': 4.59.0 + '@rollup/rollup-linux-s390x-gnu': 4.59.0 + '@rollup/rollup-linux-x64-gnu': 4.59.0 + '@rollup/rollup-linux-x64-musl': 4.59.0 + '@rollup/rollup-openbsd-x64': 4.59.0 + '@rollup/rollup-openharmony-arm64': 4.59.0 + '@rollup/rollup-win32-arm64-msvc': 4.59.0 + '@rollup/rollup-win32-ia32-msvc': 4.59.0 + '@rollup/rollup-win32-x64-gnu': 4.59.0 + '@rollup/rollup-win32-x64-msvc': 4.59.0 fsevents: 2.3.3 router@2.2.0: @@ -7126,6 +7011,8 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} + simple-concat@1.0.1: {} simple-get@4.0.1: @@ -7134,19 +7021,22 @@ snapshots: once: 1.4.0 simple-concat: 1.0.1 - sisteransi@1.0.5: {} - source-map-js@1.2.1: {} + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + split2@4.2.0: {} - ssf@0.11.2: - dependencies: - frac: 1.1.2 + stackback@0.0.2: {} statuses@2.0.2: {} - streamsearch@1.1.0: {} + std-env@3.10.0: {} string_decoder@1.3.0: dependencies: @@ -7238,11 +7128,17 @@ snapshots: tiny-warning@1.0.3: {} + tinybench@2.9.0: {} + + tinyexec@1.0.2: {} + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tinyrainbow@3.0.3: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -7279,8 +7175,6 @@ snapshots: type@2.7.3: {} - typedarray@0.0.6: {} - typescript@5.6.3: {} uid-safe@2.1.5: @@ -7356,7 +7250,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.55.1 + rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 20.19.29 @@ -7364,7 +7258,42 @@ snapshots: jiti: 1.21.7 tsx: 4.21.0 - web-streams-polyfill@3.3.3: {} + vitest@4.0.18(@types/node@20.19.29)(jiti@1.21.7)(tsx@4.21.0): + dependencies: + '@vitest/expect': 4.0.18 + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@20.19.29)(jiti@1.21.7)(tsx@4.21.0)) + '@vitest/pretty-format': 4.0.18 + '@vitest/runner': 4.0.18 + '@vitest/snapshot': 4.0.18 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + es-module-lexer: 1.7.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.3.1(@types/node@20.19.29)(jiti@1.21.7)(tsx@4.21.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.19.29 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml web-streams-polyfill@4.0.0-beta.3: {} @@ -7379,11 +7308,10 @@ snapshots: dependencies: isexe: 2.0.0 - wmf@1.0.2: {} - - word@0.3.0: {} - - wordwrap@1.0.0: {} + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 wouter@3.9.0(react@18.3.1): dependencies: @@ -7398,16 +7326,6 @@ snapshots: optionalDependencies: bufferutil: 4.1.0 - xlsx@0.18.5: - dependencies: - adler-32: 1.3.1 - cfb: 1.2.2 - codepage: 1.15.0 - crc-32: 1.2.2 - ssf: 0.11.2 - wmf: 1.0.2 - word: 0.3.0 - xtend@4.0.2: {} yallist@2.1.2: {} diff --git a/replit.md b/replit.md deleted file mode 100755 index 16869a1..0000000 --- a/replit.md +++ /dev/null @@ -1,109 +0,0 @@ -# Chitty Services CFO Platform - -## Overview - -The Chitty Services CFO Platform is an AI-powered financial management dashboard that aggregates data from multiple financial service integrations (Mercury Bank, Wave Apps, Stripe, QuickBooks, etc.) and provides intelligent insights through an AI CFO assistant. The platform offers a comprehensive view of financial health, automated charge management, and data-driven recommendations for business optimization. - -## System Architecture - -### Frontend Architecture -- **Framework**: React 18 with TypeScript -- **Styling**: Tailwind CSS with shadcn/ui component library -- **State Management**: TanStack Query for server state management -- **Routing**: Wouter for client-side routing -- **Authentication**: Replit Auth integration with session management -- **Build Tool**: Vite with custom plugins for theme management and error overlay - -### Backend Architecture -- **Runtime**: Node.js 20 with Express.js -- **Language**: TypeScript with ES modules -- **API Design**: RESTful endpoints with structured error handling -- **Session Management**: express-session with PostgreSQL store -- **Authentication**: OpenID Connect (OIDC) with Replit Auth strategy - -### Database Architecture -- **Primary Database**: PostgreSQL 16 with Neon serverless connection -- **ORM**: Drizzle ORM with schema-first approach -- **Migration Strategy**: Drizzle Kit for schema management -- **Connection Pooling**: Neon serverless with WebSocket support - -## Key Components - -### Authentication System -- **Provider**: Replit Auth using OpenID Connect -- **Session Storage**: PostgreSQL-backed sessions with 7-day TTL -- **User Management**: Custom user model with Replit auth data integration -- **Security**: Secure cookies with httpOnly and secure flags - -### Financial Data Integration -- **Universal Connector**: Standardized API endpoint for financial data aggregation -- **Service Integrations**: Mercury Bank, Wave Apps, Stripe, QuickBooks, Xero, Brex, Gusto -- **Data Normalization**: Consistent format across all financial service providers -- **Real-time Sync**: Automated data synchronization with connected services - -### AI Assistant -- **Provider**: OpenAI GPT-4o for financial analysis and recommendations -- **Capabilities**: Cash flow analysis, cost reduction planning, financial advisory -- **Context-aware**: Personalized recommendations based on company financial data -- **Interactive**: Chat-based interface for financial queries and insights - -### Charge Automation -- **Recurring Charge Detection**: Automatic identification of subscription and recurring payments -- **Optimization Engine**: AI-powered recommendations for cost reduction -- **Management Actions**: Cancel, downgrade, consolidate, or negotiate charge options -- **Savings Tracking**: Potential and realized savings monitoring - -## Data Flow - -1. **Authentication Flow**: User authenticates via Replit Auth → Session created in PostgreSQL → User data stored/retrieved -2. **Financial Data Flow**: External APIs → Service-specific adapters → Universal Connector format → Database storage → Frontend display -3. **AI Analysis Flow**: Financial data → OpenAI API → AI insights → Database storage → Real-time updates to frontend -4. **Charge Management Flow**: Transaction data → Pattern recognition → Optimization recommendations → User actions → Service API calls - -## External Dependencies - -### Core Services -- **Database**: Neon PostgreSQL for primary data storage -- **Authentication**: Replit Auth for user authentication -- **AI Processing**: OpenAI API for financial analysis and recommendations - -### Financial Service APIs -- **Mercury Bank**: Banking and transaction data -- **Wave Apps**: Accounting and invoice management -- **Stripe**: Payment processing data -- **QuickBooks**: Comprehensive accounting data -- **Xero**: International accounting platform -- **Brex**: Business credit and expense management -- **Gusto**: Payroll and HR data - -### Development Tools -- **Build**: Vite for frontend bundling, esbuild for server bundling -- **Deployment**: Replit autoscale deployment target -- **Monitoring**: Built-in request logging and error tracking - -## Deployment Strategy - -### Production Environment -- **Platform**: Replit with autoscale deployment -- **Build Process**: Multi-stage build (frontend Vite build + server esbuild bundle) -- **Runtime**: Node.js production mode with optimized builds -- **Port Configuration**: Internal port 5000 mapped to external port 80 - -### Development Environment -- **Hot Reload**: Vite HMR for frontend, tsx for server development -- **Database**: Shared PostgreSQL instance with development schema -- **Environment Variables**: Comprehensive configuration for all service integrations -- **Static IP**: Configured for Mercury API whitelisting requirements - -### Environment Configuration -- **Static IPs**: Pre-configured for Mercury Bank API access requirements -- **API Keys**: Secure storage of all financial service API credentials -- **Session Management**: Secure session configuration with appropriate timeouts -- **CORS**: Configured for Replit domain access patterns - -## Changelog -- June 26, 2025. Initial setup - -## User Preferences - -Preferred communication style: Simple, everyday language. \ No newline at end of file diff --git a/scripts/security/check-workflow-secrets.sh b/scripts/security/check-workflow-secrets.sh new file mode 100755 index 0000000..8c9659c --- /dev/null +++ b/scripts/security/check-workflow-secrets.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +set -euo pipefail + +WORKFLOW_DIR=".github/workflows" + +if [[ ! -d "$WORKFLOW_DIR" ]]; then + echo "No workflow directory found; skipping workflow secret checks." + exit 0 +fi + +fail=0 + +# 1) Explicitly blocked historical literals +blocked_literals=( + "test-secret-key-for-github-actions-testing" + "test-secret-for-security-headers-check" + "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" +) + +for literal in "${blocked_literals[@]}"; do + if grep -RIn --include='*.yml' --include='*.yaml' "$literal" "$WORKFLOW_DIR" >/dev/null 2>&1; then + echo "Blocked literal found in workflow files: $literal" + grep -RIn --include='*.yml' --include='*.yaml' "$literal" "$WORKFLOW_DIR" || true + fail=1 + fi +done + +# 2) Hardcoded secret-style env assignments in workflows. +# Allow GitHub Secrets interpolation only. +while IFS= read -r line; do + # line format: file:line:text + value="${line#*:*:}" + if [[ "$value" != *'${{ secrets.'* ]]; then + echo "Hardcoded secret-like workflow assignment found: $line" + fail=1 + fi +done < <(grep -RInE --include='*.yml' --include='*.yaml' 'SESSION_SECRET\s*:\s*".+"|ENCRYPTION_KEY\s*:\s*".+"' "$WORKFLOW_DIR" || true) + +if [[ "$fail" -ne 0 ]]; then + echo "Workflow secret policy check failed." + exit 1 +fi + +echo "Workflow secret policy check passed." diff --git a/security/remediation/2026-03-01/README.md b/security/remediation/2026-03-01/README.md new file mode 100644 index 0000000..4f09b1a --- /dev/null +++ b/security/remediation/2026-03-01/README.md @@ -0,0 +1,43 @@ +# Multi-Repo Remediation Kit (2026-03-01) + +This directory contains both deliverables requested: +- (A) runnable history-scan + purge + rotation assets +- (B) ready PR patch files for security hardening + +## A) Scan + Purge + Rotation +- `multi-repo-history-scan-and-purge.sh` + - `--scan-only` (default): scans all target repos and writes outputs to `output/` + - `--purge`: runs `git-filter-repo --replace-text` per repo using `replacements/*.txt` +- `replacements/*.txt` + - one file per repo id (`/` replaced by `__`) + - fill these with exact literals discovered by scans +- `rotation-checklist.md` +- `command-bundle.md` +- `history-scan-findings.md` + +## B) PR Patches +- `pr-patches/chittyfinance-security-gates.patch` +- `pr-patches/chittyapi-security-gates.patch` +- `pr-patches/chittyOS-data-security-gates.patch` +- `pr-patches/chittychat-data-security-gates.patch` +- `pr-patches/chittyschema-security-gates.patch` + +All patch files add: +- `scripts/security/check-workflow-secrets.sh` +- `.github/workflows/security-gates.yml` + +## Apply Patches +Use: +- `apply-pr-patches.sh` + +This script maps target repo ids to local paths and skips missing clones. + +## Local Path Notes (this workstation) +- Present git repos: + - `CHITTYAPPS/chittyfinance` + - `CHITTYFOUNDATION/chittyschema` + - fallback mirrors under `CHITTYOS/chittycommand/_ext/*` +- Missing as git clones here: + - `CHITTYOS/chittyapi` (working tree only, no `.git`) + - `CHITCOMMIT/chittyOS-data` + - `CHITCOMMIT/chittychat-data` (used fallback `_ext/chittychat-data`) diff --git a/security/remediation/2026-03-01/apply-pr-patches.sh b/security/remediation/2026-03-01/apply-pr-patches.sh new file mode 100755 index 0000000..f11186e --- /dev/null +++ b/security/remediation/2026-03-01/apply-pr-patches.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="${ROOT_DIR:-/Users/nb/Desktop/Projects/github.com}" +PATCH_DIR="${PATCH_DIR:-$(pwd)/security/remediation/2026-03-01/pr-patches}" + +# repo_id|primary_path|fallback_path|patch_file +TARGETS=( + "chittyapps/chittyfinance|$ROOT_DIR/CHITTYAPPS/chittyfinance||chittyfinance-security-gates.patch" + "chittyos/chittyapi|$ROOT_DIR/CHITTYOS/chittyapi||chittyapi-security-gates.patch" + "chitcommit/chittyOS-data|$ROOT_DIR/CHITCOMMIT/chittyOS-data||chittyOS-data-security-gates.patch" + "chitcommit/chittychat-data|$ROOT_DIR/CHITCOMMIT/chittychat-data|$ROOT_DIR/CHITTYOS/chittycommand/_ext/chittychat-data|chittychat-data-security-gates.patch" + "chittyfoundation/chittyschema|$ROOT_DIR/CHITTYFOUNDATION/chittyschema|$ROOT_DIR/CHITTYOS/chittycommand/_ext/chittyschema|chittyschema-security-gates.patch" +) + +for row in "${TARGETS[@]}"; do + IFS='|' read -r repo_id primary fallback patch_file <<< "$row" + repo_path="$primary" + + if [[ ! -d "$repo_path/.git" && -n "$fallback" && -d "$fallback/.git" ]]; then + repo_path="$fallback" + fi + + echo "== $repo_id ==" + if [[ ! -d "$repo_path/.git" ]]; then + echo "skip: no git repo at $primary${fallback:+ or $fallback}" + echo + continue + fi + + patch_path="$PATCH_DIR/$patch_file" + if [[ ! -f "$patch_path" ]]; then + echo "skip: patch not found: $patch_path" + echo + continue + fi + + echo "applying $patch_file to $repo_path" + git -C "$repo_path" apply "$patch_path" + echo "applied" + echo + +done diff --git a/security/remediation/2026-03-01/cicd-pr-runbook.md b/security/remediation/2026-03-01/cicd-pr-runbook.md new file mode 100644 index 0000000..b449195 --- /dev/null +++ b/security/remediation/2026-03-01/cicd-pr-runbook.md @@ -0,0 +1,113 @@ +# CI/CD PR Runbook (2026-03-01) + +This runbook gives exact branch/commit/PR commands for the repos patched with security gates. + +## 1) chittyfinance (`CHITTYAPPS/chittyfinance`) + +### Commit A: CI/CD security gates +```bash +cd /Users/nb/Desktop/Projects/github.com/CHITTYAPPS/chittyfinance + +git checkout -b sec/cicd-security-gates-2026-03-01 + +git add .github/workflows/security-gates.yml scripts/security/check-workflow-secrets.sh + +git commit -m "ci(security): add workflow secret policy and dependency audit gates" + +git push -u origin sec/cicd-security-gates-2026-03-01 +``` + +### Commit B: remediation kit (optional but recommended) +```bash +cd /Users/nb/Desktop/Projects/github.com/CHITTYAPPS/chittyfinance + +git add security/remediation/2026-03-01 + +git commit -m "docs(security): add multi-repo history purge and rotation toolkit" + +git push +``` + +### Open PR +```bash +cd /Users/nb/Desktop/Projects/github.com/CHITTYAPPS/chittyfinance + +gh pr create \ + --title "ci(security): enforce secret + dependency gates" \ + --body-file security/remediation/2026-03-01/pr-templates/chittyfinance-pr-body.md \ + --base main \ + --head sec/cicd-security-gates-2026-03-01 +``` + +Notes: +- There is an unrelated local modification in `.claude/mcp.json`. Do not stage it with this PR. + +## 2) chittyschema (`CHITTYFOUNDATION/chittyschema`) + +```bash +cd /Users/nb/Desktop/Projects/github.com/CHITTYFOUNDATION/chittyschema + +git checkout -b sec/cicd-security-gates-2026-03-01 + +git add .github/workflows/security-gates.yml scripts/security/check-workflow-secrets.sh + +git commit -m "ci(security): add workflow secret policy and dependency audit gates" + +git push -u origin sec/cicd-security-gates-2026-03-01 + +gh pr create \ + --title "ci(security): enforce secret + dependency gates" \ + --body-file /Users/nb/Desktop/Projects/github.com/CHITTYAPPS/chittyfinance/security/remediation/2026-03-01/pr-templates/chittyschema-pr-body.md \ + --base main \ + --head sec/cicd-security-gates-2026-03-01 +``` + +## 3) chittychat-data fallback clone (`CHITTYOS/chittycommand/_ext/chittychat-data`) + +```bash +cd /Users/nb/Desktop/Projects/github.com/CHITTYOS/chittycommand/_ext/chittychat-data + +git checkout -b sec/cicd-security-gates-2026-03-01 + +git add .github/workflows/security-gates.yml scripts/security/check-workflow-secrets.sh + +git commit -m "ci(security): add workflow secret policy and dependency audit gates" + +git push -u origin sec/cicd-security-gates-2026-03-01 + +gh pr create \ + --title "ci(security): enforce secret + dependency gates" \ + --body-file /Users/nb/Desktop/Projects/github.com/CHITTYAPPS/chittyfinance/security/remediation/2026-03-01/pr-templates/chittychat-data-pr-body.md \ + --base main \ + --head sec/cicd-security-gates-2026-03-01 +``` + +## 4) chittyschema fallback clone (`CHITTYOS/chittycommand/_ext/chittyschema`) + +```bash +cd /Users/nb/Desktop/Projects/github.com/CHITTYOS/chittycommand/_ext/chittyschema + +git checkout -b sec/cicd-security-gates-2026-03-01 + +git add .github/workflows/security-gates.yml scripts/security/check-workflow-secrets.sh + +git commit -m "ci(security): add workflow secret policy and dependency audit gates" + +git push -u origin sec/cicd-security-gates-2026-03-01 + +gh pr create \ + --title "ci(security): enforce secret + dependency gates" \ + --body-file /Users/nb/Desktop/Projects/github.com/CHITTYAPPS/chittyfinance/security/remediation/2026-03-01/pr-templates/chittyschema-pr-body.md \ + --base main \ + --head sec/cicd-security-gates-2026-03-01 +``` + +## 5) Missing local git clones +- `CHITTYOS/chittyapi` has no `.git` directory in this workspace. +- `CHITCOMMIT/chittyOS-data` and canonical `CHITCOMMIT/chittychat-data` clones are missing. + +To patch those canonical repos, clone them first and apply: +```bash +cd /Users/nb/Desktop/Projects/github.com/CHITTYAPPS/chittyfinance +./security/remediation/2026-03-01/apply-pr-patches.sh +``` diff --git a/security/remediation/2026-03-01/command-bundle.md b/security/remediation/2026-03-01/command-bundle.md new file mode 100644 index 0000000..0ee99e1 --- /dev/null +++ b/security/remediation/2026-03-01/command-bundle.md @@ -0,0 +1,52 @@ +# Command Bundle: History Scan + Purge + +## 1) Verify exposed literals in history (chittyfinance) +```bash +cd /Users/nb/Desktop/Projects/github.com/CHITTYAPPS/chittyfinance + +git show a683bbb:.github/workflows/ci.yml | nl -ba | sed -n '112,121p' +git show a683bbb:.github/workflows/security.yml | nl -ba | sed -n '159,163p' +``` + +## 2) Full-history checks for known literals (post-purge should return nothing) +```bash +cd /path/to/mirror/or/clone + +git grep -n "test-secret-key-for-github-actions-testing" $(git rev-list --all) +git grep -n "test-secret-for-security-headers-check" $(git rev-list --all) +git grep -n "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" $(git rev-list --all) +``` + +## 3) Purge workflow literals from history +```bash +cd /Users/nb/Desktop/Projects/github.com/CHITTYAPPS/chittyfinance +bash security/remediation/2026-03-01/purge-history-and-rotate.sh +``` + +## 4) Re-clone/reset guidance for collaborators after force-push +```bash +# safest +git clone + +# or hard reset existing clone (destructive) +git fetch --all --prune +git checkout main +git reset --hard origin/main +git gc --prune=now +``` + +## 5) Re-scan available local repos +```bash +for repo in \ + /Users/nb/Desktop/Projects/github.com/CHITTYAPPS/chittyfinance \ + /Users/nb/Desktop/Projects/github.com/CHITTYFOUNDATION/chittyschema \ + /Users/nb/Desktop/Projects/github.com/CHITTYOS/chittycommand/_ext/chittychat-data; do + echo "== $repo ==" + cd "$repo" + git grep -n "test-secret-key-for-github-actions-testing" $(git rev-list --all) || true + git grep -n "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" $(git rev-list --all) || true +done +``` + +## Note on missing git clone +- Local path `/Users/nb/Desktop/Projects/github.com/CHITTYOS/chittyapi` is not a git repo clone in this workspace, so history-level commands were not runnable there. diff --git a/security/remediation/2026-03-01/git-filter-repo-replacements.txt b/security/remediation/2026-03-01/git-filter-repo-replacements.txt new file mode 100644 index 0000000..e0c4ed5 --- /dev/null +++ b/security/remediation/2026-03-01/git-filter-repo-replacements.txt @@ -0,0 +1,8 @@ +# Literal replacements for git-filter-repo --replace-text +# Format: old==>new + +test-secret-key-for-github-actions-testing==>REMOVED_ROTATED_SESSION_SECRET + +test-secret-for-security-headers-check==>REMOVED_ROTATED_SESSION_SECRET + +0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef==>REMOVED_ROTATED_ENCRYPTION_KEY diff --git a/security/remediation/2026-03-01/history-scan-findings.md b/security/remediation/2026-03-01/history-scan-findings.md new file mode 100644 index 0000000..4d0f2cf --- /dev/null +++ b/security/remediation/2026-03-01/history-scan-findings.md @@ -0,0 +1,43 @@ +# History Secret Scan Findings (2026-03-01) + +## Scope +- `/Users/nb/Desktop/Projects/github.com/CHITTYAPPS/chittyfinance` +- `/Users/nb/Desktop/Projects/github.com/CHITTYFOUNDATION/chittyschema` +- `/Users/nb/Desktop/Projects/github.com/CHITTYOS/chittycommand/_ext/chittychat-data` + +Notes: +- `chittyapi` path exists locally at `CHITTYOS/chittyapi` but is not a git repo clone in this workspace, so full git-history scanning could not be run there. + +## Confirmed Exposures +### 1) Hardcoded `SESSION_SECRET` in workflow history +- Repo: `CHITTYAPPS/chittyfinance` +- Commit: `a683bbb` (`2025-06-23`) +- File at commit: `.github/workflows/ci.yml` +- Evidence line in historical blob: + - `-e SESSION_SECRET="test-secret-key-for-github-actions-testing"` + +### 2) Hardcoded `ENCRYPTION_KEY` in workflow history +- Repo: `CHITTYAPPS/chittyfinance` +- Commit: `a683bbb` (`2025-06-23`) +- File at commit: `.github/workflows/ci.yml` +- Evidence line in historical blob: + - `-e ENCRYPTION_KEY="0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"` + +### 3) Additional hardcoded test secrets in historical security workflow +- Repo: `CHITTYAPPS/chittyfinance` +- Commit: `a683bbb` (`2025-06-23`) +- File at commit: `.github/workflows/security.yml` +- Evidence lines in historical blob: + - `SESSION_SECRET: "test-secret-for-security-headers-check"` + - `ENCRYPTION_KEY: "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"` + +## Current-Tree Checks +- No live `ghp_`, `sk_live_`, `AKIA`, or private key blocks were found in the current checked-out trees for the scanned git repos. +- `chittyfinance` currently still has policy risks: + - Local dependency: `@chittyos/chittyconnect": "file:../chittyconnect"` in `package.json` + - `npm audit --omit=dev` currently reports high vulnerabilities in this environment. + +## Immediate Handling +1. Rotate any secrets potentially derived from or reused from these historical values. +2. Purge exposed literals from git history (command bundle in this folder). +3. Enforce CI gates to prevent recurrence (workflow added separately). diff --git a/security/remediation/2026-03-01/multi-repo-history-scan-and-purge.sh b/security/remediation/2026-03-01/multi-repo-history-scan-and-purge.sh new file mode 100755 index 0000000..8131dce --- /dev/null +++ b/security/remediation/2026-03-01/multi-repo-history-scan-and-purge.sh @@ -0,0 +1,200 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Multi-repo secret history scan + optional purge orchestrator. +# Usage: +# ./multi-repo-history-scan-and-purge.sh --scan-only +# ./multi-repo-history-scan-and-purge.sh --purge --replacements-dir ./replacements +# +# Notes: +# - Non-destructive by default (--scan-only). +# - Purge mode uses git-filter-repo and requires per-repo replacement file. + +ROOT_DIR="${ROOT_DIR:-/Users/nb/Desktop/Projects/github.com}" +OUT_DIR="${OUT_DIR:-$(pwd)/security/remediation/2026-03-01/output}" +REPLACEMENTS_DIR="${REPLACEMENTS_DIR:-$(pwd)/security/remediation/2026-03-01/replacements}" +MODE="scan" + +while [[ $# -gt 0 ]]; do + case "$1" in + --scan-only) + MODE="scan" + shift + ;; + --purge) + MODE="purge" + shift + ;; + --root-dir) + ROOT_DIR="$2" + shift 2 + ;; + --out-dir) + OUT_DIR="$2" + shift 2 + ;; + --replacements-dir) + REPLACEMENTS_DIR="$2" + shift 2 + ;; + *) + echo "Unknown argument: $1" >&2 + exit 1 + ;; + esac +done + +mkdir -p "$OUT_DIR" + +REPO_IDS=( + "chittyapps/chittyfinance" + "chittyos/chittyapi" + "chitcommit/chittyOS-data" + "chitcommit/chittychat-data" + "chittyfoundation/chittyschema" +) + +# Local fallback paths in current workstation layout. +resolve_local_path() { + local repo_id="$1" + case "$repo_id" in + chittyapps/chittyfinance) + echo "$ROOT_DIR/CHITTYAPPS/chittyfinance" + ;; + chittyos/chittyapi) + echo "$ROOT_DIR/CHITTYOS/chittyapi" + ;; + chitcommit/chittyOS-data) + echo "$ROOT_DIR/CHITCOMMIT/chittyOS-data" + ;; + chitcommit/chittychat-data) + echo "$ROOT_DIR/CHITCOMMIT/chittychat-data" + ;; + chittyfoundation/chittyschema) + echo "$ROOT_DIR/CHITTYFOUNDATION/chittyschema" + ;; + *) + echo "" + ;; + esac +} + +# Alternative known local paths. +resolve_alt_path() { + local repo_id="$1" + case "$repo_id" in + chitcommit/chittychat-data) + echo "$ROOT_DIR/CHITTYOS/chittycommand/_ext/chittychat-data" + ;; + chitcommit/chittyOS-data) + echo "" + ;; + chittyfoundation/chittyschema) + echo "$ROOT_DIR/CHITTYOS/chittycommand/_ext/chittyschema" + ;; + *) + echo "" + ;; + esac +} + +sanitize() { + echo "$1" | tr '/:' '__' +} + +scan_repo() { + local repo_id="$1" + local repo_path="$2" + local out_file="$OUT_DIR/$(sanitize "$repo_id")-scan.txt" + + { + echo "repo_id=$repo_id" + echo "repo_path=$repo_path" + echo "timestamp=$(date -u +%Y-%m-%dT%H:%M:%SZ)" + echo + + if [[ ! -d "$repo_path/.git" ]]; then + echo "status=missing_git" + return 0 + fi + + echo "status=ok" + echo "head=$(git -C "$repo_path" rev-parse --short HEAD 2>/dev/null || echo unknown)" + echo + + echo "[working-tree-pattern-scan]" + rg -n --hidden --glob '!.git/**' --glob '!node_modules/**' --glob '!dist/**' --glob '!security/remediation/**' \ + 'ghp_[A-Za-z0-9]{20,}|sk_live_[A-Za-z0-9]{20,}|AKIA[0-9A-Z]{16}|BEGIN (RSA|EC|OPENSSH|PGP)? ?PRIVATE KEY|SESSION_SECRET\s*[:=]\s*"|ENCRYPTION_KEY\s*[:=]\s*"' \ + "$repo_path" || true + echo + + echo "[history-grep-known-literals]" + local literals=( + "test-secret-key-for-github-actions-testing" + "test-secret-for-security-headers-check" + "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" + ) + for lit in "${literals[@]}"; do + echo "-- literal: $lit" + git -C "$repo_path" --no-pager log --all -G"$lit" --oneline | head -n 20 || true + done + echo + + if command -v trufflehog >/dev/null 2>&1; then + echo "[trufflehog]" + trufflehog git --repo="file://$repo_path" --json | head -n 200 || true + else + echo "[trufflehog] skipped (not installed)" + fi + } > "$out_file" + + echo "wrote $out_file" +} + +purge_repo() { + local repo_id="$1" + local repo_path="$2" + local repl_file="$REPLACEMENTS_DIR/$(sanitize "$repo_id").txt" + + if [[ ! -d "$repo_path/.git" ]]; then + echo "[purge] skip $repo_id (missing git repo)" + return 0 + fi + + if [[ ! -f "$repl_file" ]]; then + echo "[purge] skip $repo_id (missing replacements file: $repl_file)" + return 0 + fi + + if ! command -v git-filter-repo >/dev/null 2>&1; then + echo "[purge] git-filter-repo not installed; cannot purge $repo_id" + return 1 + fi + + echo "[purge] rewriting $repo_id using $repl_file" + git -C "$repo_path" filter-repo --replace-text "$repl_file" --force + echo "[purge] complete for $repo_id" + echo "[purge] next manual step: force-push all refs and tags for $repo_id" +} + +for repo_id in "${REPO_IDS[@]}"; do + primary="$(resolve_local_path "$repo_id")" + alt="$(resolve_alt_path "$repo_id")" + repo_path="$primary" + + if [[ ! -d "$repo_path/.git" && -n "$alt" && -d "$alt/.git" ]]; then + repo_path="$alt" + fi + + echo "== $repo_id ==" + scan_repo "$repo_id" "$repo_path" + + if [[ "$MODE" == "purge" ]]; then + purge_repo "$repo_id" "$repo_path" + fi + + echo + +done + +echo "Done. Findings in: $OUT_DIR" diff --git a/security/remediation/2026-03-01/org-cicd/ORG-GATING-RUNBOOK.md b/security/remediation/2026-03-01/org-cicd/ORG-GATING-RUNBOOK.md new file mode 100644 index 0000000..3804591 --- /dev/null +++ b/security/remediation/2026-03-01/org-cicd/ORG-GATING-RUNBOOK.md @@ -0,0 +1,47 @@ +# Org Gating Runbook + +## Preconditions +- GitHub CLI authenticated (`gh auth status`) +- For org-level rulesets, token must include `admin:org` scope. + - Refresh once: + - `gh auth refresh -h github.com -s admin:org` + +## Script +- `security/remediation/2026-03-01/org-cicd/enforce-github-gating.sh` + +## 1) Repo-level branch protection rollout (automated) +Dry-run all owners: +```bash +cd /Users/nb/Desktop/Projects/github.com/CHITTYAPPS/chittyfinance +./security/remediation/2026-03-01/org-cicd/enforce-github-gating.sh --mode repo-protection +``` + +Apply to all owners: +```bash +./security/remediation/2026-03-01/org-cicd/enforce-github-gating.sh --mode repo-protection --apply +``` + +Apply to one owner only: +```bash +./security/remediation/2026-03-01/org-cicd/enforce-github-gating.sh --mode repo-protection --owner furnished-condos --apply +``` + +## 2) Org-level rulesets (preferred, requires admin:org) +Dry-run: +```bash +./security/remediation/2026-03-01/org-cicd/enforce-github-gating.sh --mode org-ruleset +``` + +Apply: +```bash +./security/remediation/2026-03-01/org-cicd/enforce-github-gating.sh --mode org-ruleset --apply +``` + +## Output +Each run writes: +- `security/remediation/2026-03-01/org-cicd/output-/report.tsv` +- `security/remediation/2026-03-01/org-cicd/output-/summary.txt` + +## Current Access Constraint +- With current token scopes (`repo`, `workflow`, `read:org`), org ruleset API returns scope error. +- Repo-level mode can still apply wherever repo admin access exists. diff --git a/security/remediation/2026-03-01/org-cicd/enforce-github-gating.sh b/security/remediation/2026-03-01/org-cicd/enforce-github-gating.sh new file mode 100755 index 0000000..e3c1326 --- /dev/null +++ b/security/remediation/2026-03-01/org-cicd/enforce-github-gating.sh @@ -0,0 +1,204 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Enforce required CI/CD gating across owners/repos. +# Modes: +# --mode repo-protection (default) : apply branch protection per repo +# --mode org-ruleset : create org-level rulesets (requires admin:org) +# +# Defaults are non-destructive dry run unless --apply is set. + +MODE="repo-protection" +APPLY="false" +LIMIT="0" + +OWNERS=(chittyapps chittyfoundation chittyos chitcommit furnished-condos chittycorp) +CHECK_CONTEXTS=( + "Security Gates / Workflow Secret Policy" + "Security Gates / Working Tree Secret Scan" + "Security Gates / Dependency Audit (High+)" +) + +while [[ $# -gt 0 ]]; do + case "$1" in + --mode) + MODE="$2"; shift 2 ;; + --apply) + APPLY="true"; shift ;; + --limit) + LIMIT="$2"; shift 2 ;; + --owner) + OWNERS=("$2"); shift 2 ;; + *) + echo "Unknown arg: $1" >&2; exit 1 ;; + esac +done + +TS="$(date -u +%Y%m%dT%H%M%SZ)" +OUT_DIR="./security/remediation/2026-03-01/org-cicd/output-$TS" +mkdir -p "$OUT_DIR" +REPORT="$OUT_DIR/report.tsv" + +echo -e "owner\trepo\tdefault_branch\taction\tresult\tmessage" > "$REPORT" + +json_contexts() { + local first=true + printf '[' + for c in "${CHECK_CONTEXTS[@]}"; do + if [[ "$first" == true ]]; then first=false; else printf ','; fi + printf '{"context":"%s"}' "$c" + done + printf ']' +} + +apply_repo_protection() { + local owner="$1" + local repo="$2" + local branch="$3" + + local has_gate="false" + if gh api "repos/$owner/$repo/contents/.github/workflows/security-gates.yml" >/dev/null 2>&1; then + has_gate="true" + fi + + if [[ "$has_gate" != "true" ]]; then + echo -e "$owner\t$repo\t$branch\trepo-protection\tskipped\tsecurity-gates.yml missing" >> "$REPORT" + return 0 + fi + + local payload + payload=$(cat <> "$REPORT" + return 0 + fi + + if gh api --method PUT "repos/$owner/$repo/branches/$branch/protection" --input - <<<"$payload" >/dev/null 2>&1; then + echo -e "$owner\t$repo\t$branch\trepo-protection\tapplied\tbranch protection updated" >> "$REPORT" + else + local err + err=$(gh api --method PUT "repos/$owner/$repo/branches/$branch/protection" --input - <<<"$payload" 2>&1 || true) + echo -e "$owner\t$repo\t$branch\trepo-protection\tfailed\t${err//$'\n'/ }" >> "$REPORT" + fi +} + +create_org_ruleset() { + local org="$1" + + if ! gh api "orgs/$org" >/dev/null 2>&1; then + echo -e "$org\\t\\t\\torg-ruleset\\tskipped\\towner is not an org or inaccessible" >> "$REPORT" + return 0 + fi + + local ruleset_payload + ruleset_payload=$(cat <<'JSON' +{ + "name": "Org Security Gates", + "target": "branch", + "enforcement": "active", + "conditions": { + "ref_name": { + "include": ["~DEFAULT_BRANCH"], + "exclude": [] + }, + "repository_name": { + "include": ["~ALL"], + "exclude": [] + } + }, + "rules": [ + { "type": "deletion" }, + { "type": "non_fast_forward" }, + { "type": "required_linear_history" }, + { + "type": "pull_request", + "parameters": { + "required_approving_review_count": 1, + "dismiss_stale_reviews_on_push": true, + "require_code_owner_review": false, + "require_last_push_approval": false, + "required_review_thread_resolution": true + } + }, + { + "type": "required_status_checks", + "parameters": { + "strict_required_status_checks_policy": true, + "required_status_checks": [ + { "context": "Security Gates / Workflow Secret Policy" }, + { "context": "Security Gates / Working Tree Secret Scan" }, + { "context": "Security Gates / Dependency Audit (High+)" } + ] + } + } + ] +} +JSON +) + + if [[ "$APPLY" != "true" ]]; then + echo -e "$org\t\t\torg-ruleset\tdry-run\twould create/update org ruleset" >> "$REPORT" + return 0 + fi + + if gh api --method POST "orgs/$org/rulesets" --input - <<<"$ruleset_payload" >/dev/null 2>&1; then + echo -e "$org\t\t\torg-ruleset\tapplied\torg ruleset created" >> "$REPORT" + else + local err + err=$(gh api --method POST "orgs/$org/rulesets" --input - <<<"$ruleset_payload" 2>&1 || true) + echo -e "$org\t\t\torg-ruleset\tfailed\t${err//$'\n'/ }" >> "$REPORT" + fi +} + +count=0 +for owner in "${OWNERS[@]}"; do + if [[ "$MODE" == "org-ruleset" ]]; then + create_org_ruleset "$owner" + continue + fi + + repos=$(gh repo list "$owner" --limit 300 --json name,isArchived,defaultBranchRef --jq '.[] | select(.isArchived==false) | [.name, (.defaultBranchRef.name // "")] | @tsv' 2>/dev/null || true) + if [[ -z "$repos" ]]; then + echo -e "$owner\t\t\trepo-protection\tskipped\tno repos or no access" >> "$REPORT" + continue + fi + + while IFS=$'\t' read -r repo branch; do + [[ -z "$repo" ]] && continue + [[ -z "$branch" ]] && { echo -e "$owner\t$repo\t\trepo-protection\tskipped\tno default branch" >> "$REPORT"; continue; } + apply_repo_protection "$owner" "$repo" "$branch" + + count=$((count+1)) + if [[ "$LIMIT" != "0" && "$count" -ge "$LIMIT" ]]; then + break 2 + fi + done <<< "$repos" +done + +echo "Wrote report: $REPORT" +awk -F'\t' 'NR==1{next}{k=$5; c[k]++} END{for (i in c) printf "%s\t%d\n", i, c[i] }' "$REPORT" | sort > "$OUT_DIR/summary.txt" +cat "$OUT_DIR/summary.txt" diff --git a/security/remediation/2026-03-01/org-cicd/output-20260302T002941Z/report.tsv b/security/remediation/2026-03-01/org-cicd/output-20260302T002941Z/report.tsv new file mode 100644 index 0000000..7ef2788 --- /dev/null +++ b/security/remediation/2026-03-01/org-cicd/output-20260302T002941Z/report.tsv @@ -0,0 +1,139 @@ +owner repo default_branch action result message +chittyapps chittyagent-studio repo-protection skipped no default branch +chittyapps chittyfinance main repo-protection skipped security-gates.yml missing +chittyapps chittyresolution main repo-protection skipped security-gates.yml missing +chittyapps chittydlvr main repo-protection skipped security-gates.yml missing +chittyapps documint main repo-protection skipped security-gates.yml missing +chittyapps chittycontextual main repo-protection skipped security-gates.yml missing +chittyapps chittydocumint main repo-protection skipped security-gates.yml missing +chittyapps chittyevidence main repo-protection skipped security-gates.yml missing +chittyapps chittyauth-app main repo-protection skipped security-gates.yml missing +chittyapps .github main repo-protection skipped security-gates.yml missing +chittyapps chittyxl claude/deploy-chittyxl-v2-01H7F5Di7gL9VeeZjtf3ykyZ repo-protection skipped security-gates.yml missing +chittyapps chittytrace main repo-protection skipped security-gates.yml missing +chittyapps chittysync main repo-protection skipped security-gates.yml missing +chittyapps chittyreception main repo-protection skipped security-gates.yml missing +chittyapps chittylanding main repo-protection skipped security-gates.yml missing +chittyapps chittyinsight main repo-protection skipped security-gates.yml missing +chittyapps chittyformfill main repo-protection skipped security-gates.yml missing +chittyapps chittyforge main repo-protection skipped security-gates.yml missing +chittyapps chittyflow main repo-protection skipped security-gates.yml missing +chittyapps chittydashboard main repo-protection skipped security-gates.yml missing +chittyapps chittycloude-mcp main repo-protection skipped security-gates.yml missing +chittyapps chittycleaner main repo-protection skipped security-gates.yml missing +chittyapps chittychat main repo-protection skipped security-gates.yml missing +chittyapps chittycharge main repo-protection skipped security-gates.yml missing +chittyapps chittycan-worker main repo-protection skipped security-gates.yml missing +chittyapps chittycan main repo-protection skipped security-gates.yml missing +chittyapps chittybooks main repo-protection skipped security-gates.yml missing +chittyapps ChittyAutomate-Google main repo-protection skipped security-gates.yml missing +chittyapps chitty-imessage main repo-protection skipped security-gates.yml missing +chittyapps ch1tty main repo-protection skipped security-gates.yml missing +chittyapps chittyproof repo-protection skipped no default branch +chittyapps ecosystem claude/github-mcp-server-01GMRhD5EaYCAh4ieWcd1TwF repo-protection skipped security-gates.yml missing +chittyapps chittybrand repo-protection skipped no default branch +chittyapps chittypm repo-protection skipped no default branch +chittyapps bane repo-protection skipped no default branch +chittyapps chitty repo-protection skipped no default branch +chittyapps chittyportal repo-protection skipped no default branch +chittyapps chittychat-sessions main repo-protection skipped security-gates.yml missing +chittyapps integrateit repo-protection skipped no default branch +chittyfoundation .github main repo-protection skipped security-gates.yml missing +chittyfoundation chittygov main repo-protection skipped security-gates.yml missing +chittyfoundation chittyid main repo-protection skipped security-gates.yml missing +chittyfoundation chittyops main repo-protection skipped security-gates.yml missing +chittyfoundation chittycert main repo-protection skipped security-gates.yml missing +chittyfoundation chittyschema main repo-protection skipped security-gates.yml missing +chittyfoundation chittycertify main repo-protection skipped security-gates.yml missing +chittyfoundation chittychain main repo-protection skipped security-gates.yml missing +chittyfoundation chittychronicle main repo-protection skipped security-gates.yml missing +chittyfoundation chittyledger main repo-protection skipped security-gates.yml missing +chittyfoundation chittyauth main repo-protection skipped security-gates.yml missing +chittyfoundation chittyregister main repo-protection skipped security-gates.yml missing +chittyfoundation chittycanon main repo-protection skipped security-gates.yml missing +chittyfoundation chittydna main repo-protection skipped security-gates.yml missing +chittyfoundation chitty-ops-foundation repo-protection skipped no default branch +chittyfoundation .chittychain main repo-protection skipped security-gates.yml missing +chittyos chittycan main repo-protection skipped security-gates.yml missing +chittyos chittyops main repo-protection skipped security-gates.yml missing +chittyos chittycommand main repo-protection skipped security-gates.yml missing +chittyos chittyconnect main repo-protection skipped security-gates.yml missing +chittyos chittyscrape main repo-protection skipped security-gates.yml missing +chittyos chittymac main repo-protection skipped security-gates.yml missing +chittyos chittyrouter main repo-protection skipped security-gates.yml missing +chittyos chittyevidence-db main repo-protection skipped security-gates.yml missing +chittyos chittystorage main repo-protection skipped security-gates.yml missing +chittyos chittyapi main repo-protection skipped security-gates.yml missing +chittyos chittygateway main repo-protection skipped security-gates.yml missing +chittyos chittyagent main repo-protection skipped security-gates.yml missing +chittyos get-chitty main repo-protection skipped security-gates.yml missing +chittyos chittyintel main repo-protection skipped security-gates.yml missing +chittyos chittymcp-github main repo-protection skipped security-gates.yml missing +chittyos chittycontext main repo-protection skipped security-gates.yml missing +chittyos chittyconcierge main repo-protection skipped security-gates.yml missing +chittyos chittytrack main repo-protection skipped security-gates.yml missing +chittyos chittydisputes main repo-protection skipped security-gates.yml missing +chittyos .github main repo-protection skipped security-gates.yml missing +chittyos chittyverify main repo-protection skipped security-gates.yml missing +chittyos chittysync main repo-protection skipped security-gates.yml missing +chittyos chittyscore main repo-protection skipped security-gates.yml missing +chittyos chittyregistry main repo-protection skipped security-gates.yml missing +chittyos chittymcp main repo-protection skipped security-gates.yml missing +chittyos chittyledger main repo-protection skipped security-gates.yml missing +chittyos chittychronicle main repo-protection skipped security-gates.yml missing +chittyos mcp-cloudflare-authless main repo-protection skipped security-gates.yml missing +chittyos shared main repo-protection skipped security-gates.yml missing +chittyos chittycore main repo-protection skipped security-gates.yml missing +chittyos shell-plugins main repo-protection skipped security-gates.yml missing +chittyos sessionsync main repo-protection skipped security-gates.yml missing +chittyos chittymonitor main repo-protection skipped security-gates.yml missing +chittyos op-shell-plugins main repo-protection skipped security-gates.yml missing +chittyos legal-cases main repo-protection skipped security-gates.yml missing +chittyos docs main repo-protection skipped security-gates.yml missing +chittyos chittyswarm main repo-protection skipped security-gates.yml missing +chittyos chittystandard main repo-protection skipped security-gates.yml missing +chittyos chittyserv claude/homelab-budget-guide-011CUPz881ZEdRYfyiXkbWEq repo-protection skipped security-gates.yml missing +chittyos chittyassets main repo-protection skipped security-gates.yml missing +chittyos chittyos-workspace session-8c21b5bf repo-protection skipped security-gates.yml missing +chittyos chittyos-cli main repo-protection skipped security-gates.yml missing +chittyos chittyhelper main repo-protection skipped security-gates.yml missing +chittyos chittydiscovery main repo-protection skipped security-gates.yml missing +chittyos chittyconnect-finance main repo-protection skipped security-gates.yml missing +chittyos chittycli main repo-protection skipped security-gates.yml missing +chittyos chittybeacon main repo-protection skipped security-gates.yml missing +chittyos chittyagent-local main repo-protection skipped security-gates.yml missing +chittyos chitty-mobile-connector main repo-protection skipped security-gates.yml missing +chittyos chitty-issue-resolver main repo-protection skipped security-gates.yml missing +chittyos chitty-desktop-connector main repo-protection skipped security-gates.yml missing +chittyos .claude main repo-protection skipped security-gates.yml missing +chitcommit arias-v-bianchi-mcp main repo-protection skipped security-gates.yml missing +chitcommit billy-bullshit main repo-protection skipped security-gates.yml missing +chitcommit demo-repository main repo-protection skipped security-gates.yml missing +chitcommit corporate-strategy main repo-protection skipped security-gates.yml missing +chitcommit shitcommit repo-protection skipped no default branch +chitcommit chittychat-data main repo-protection skipped security-gates.yml missing +chitcommit chittypro-streamlink main repo-protection skipped security-gates.yml missing +chitcommit chittyOS-data main repo-protection skipped security-gates.yml missing +chitcommit chittyguardian main repo-protection skipped security-gates.yml missing +furnished-condos chicago main repo-protection skipped security-gates.yml missing +furnished-condos .github main repo-protection skipped security-gates.yml missing +furnished-condos chittyrental main repo-protection skipped security-gates.yml missing +furnished-condos chico main repo-protection skipped security-gates.yml missing +furnished-condos react-router-starter-template main repo-protection skipped security-gates.yml missing +furnished-condos llm-chat-app-template main repo-protection skipped security-gates.yml missing +furnished-condos rental-manager main repo-protection skipped security-gates.yml missing +furnished-condos demo-repository main repo-protection skipped security-gates.yml missing +furnished-condos remote-mcp-server main repo-protection skipped security-gates.yml missing +furnished-condos chicobuzzer main repo-protection skipped security-gates.yml missing +furnished-condos evict-assist main repo-protection skipped security-gates.yml missing +furnished-condos lease-agent replit-agent repo-protection skipped security-gates.yml missing +furnished-condos dynamic-data main repo-protection skipped security-gates.yml missing +furnished-condos property-page main repo-protection skipped security-gates.yml missing +furnished-condos chittyentry main repo-protection skipped security-gates.yml missing +furnished-condos lease-wiz main repo-protection skipped security-gates.yml missing +chittycorp CHITTYCOUNSEL main repo-protection skipped security-gates.yml missing +chittycorp chittyreception main repo-protection skipped security-gates.yml missing +chittycorp .github main repo-protection skipped security-gates.yml missing +chittycorp chittychronicle main repo-protection skipped security-gates.yml missing +chittycorp chittyentry main repo-protection skipped security-gates.yml missing +chittycorp chittyforce main repo-protection skipped security-gates.yml missing diff --git a/security/remediation/2026-03-01/org-cicd/output-20260302T002941Z/summary.txt b/security/remediation/2026-03-01/org-cicd/output-20260302T002941Z/summary.txt new file mode 100644 index 0000000..84c355b --- /dev/null +++ b/security/remediation/2026-03-01/org-cicd/output-20260302T002941Z/summary.txt @@ -0,0 +1 @@ +skipped 138 diff --git a/security/remediation/2026-03-01/org-cicd/output-20260302T003036Z/report.tsv b/security/remediation/2026-03-01/org-cicd/output-20260302T003036Z/report.tsv new file mode 100644 index 0000000..ea15f52 --- /dev/null +++ b/security/remediation/2026-03-01/org-cicd/output-20260302T003036Z/report.tsv @@ -0,0 +1,7 @@ +owner repo default_branch action result message +chittyapps org-ruleset dry-run would create/update org ruleset +chittyfoundation org-ruleset dry-run would create/update org ruleset +chittyos org-ruleset dry-run would create/update org ruleset +chitcommit org-ruleset dry-run would create/update org ruleset +furnished-condos org-ruleset dry-run would create/update org ruleset +chittycorp org-ruleset dry-run would create/update org ruleset diff --git a/security/remediation/2026-03-01/org-cicd/output-20260302T003036Z/summary.txt b/security/remediation/2026-03-01/org-cicd/output-20260302T003036Z/summary.txt new file mode 100644 index 0000000..873a9cd --- /dev/null +++ b/security/remediation/2026-03-01/org-cicd/output-20260302T003036Z/summary.txt @@ -0,0 +1 @@ +dry-run 6 diff --git a/security/remediation/2026-03-01/org-cicd/output-20260302T003045Z/report.tsv b/security/remediation/2026-03-01/org-cicd/output-20260302T003045Z/report.tsv new file mode 100644 index 0000000..227bf3e --- /dev/null +++ b/security/remediation/2026-03-01/org-cicd/output-20260302T003045Z/report.tsv @@ -0,0 +1,7 @@ +owner repo default_branch action result message +chittyapps org-ruleset failed {"message":"Not Found","documentation_url":"https://docs.github.com/rest/orgs/rules#create-an-organization-repository-ruleset","status":"404"}gh: Not Found (HTTP 404) gh: This API operation needs the "admin:org" scope. To request it, run: gh auth refresh -h github.com -s admin:org +chittyfoundation org-ruleset failed {"message":"Not Found","documentation_url":"https://docs.github.com/rest/orgs/rules#create-an-organization-repository-ruleset","status":"404"}gh: Not Found (HTTP 404) gh: This API operation needs the "admin:org" scope. To request it, run: gh auth refresh -h github.com -s admin:org +chittyos org-ruleset failed {"message":"Not Found","documentation_url":"https://docs.github.com/rest/orgs/rules#create-an-organization-repository-ruleset","status":"404"}gh: Not Found (HTTP 404) gh: This API operation needs the "admin:org" scope. To request it, run: gh auth refresh -h github.com -s admin:org +chitcommit org-ruleset failed {"message":"Not Found","documentation_url":"https://docs.github.com/rest/orgs/rules#create-an-organization-repository-ruleset","status":"404"}gh: Not Found (HTTP 404) +furnished-condos org-ruleset failed {"message":"Not Found","documentation_url":"https://docs.github.com/rest/orgs/rules#create-an-organization-repository-ruleset","status":"404"}gh: Not Found (HTTP 404) gh: This API operation needs the "admin:org" scope. To request it, run: gh auth refresh -h github.com -s admin:org +chittycorp org-ruleset failed {"message":"Not Found","documentation_url":"https://docs.github.com/rest/orgs/rules#create-an-organization-repository-ruleset","status":"404"}gh: Not Found (HTTP 404) gh: This API operation needs the "admin:org" scope. To request it, run: gh auth refresh -h github.com -s admin:org diff --git a/security/remediation/2026-03-01/org-cicd/output-20260302T003045Z/summary.txt b/security/remediation/2026-03-01/org-cicd/output-20260302T003045Z/summary.txt new file mode 100644 index 0000000..a4cb1c9 --- /dev/null +++ b/security/remediation/2026-03-01/org-cicd/output-20260302T003045Z/summary.txt @@ -0,0 +1 @@ +failed 6 diff --git a/security/remediation/2026-03-01/org-cicd/output-20260302T003110Z/report.tsv b/security/remediation/2026-03-01/org-cicd/output-20260302T003110Z/report.tsv new file mode 100644 index 0000000..2d4e679 --- /dev/null +++ b/security/remediation/2026-03-01/org-cicd/output-20260302T003110Z/report.tsv @@ -0,0 +1,7 @@ +owner repo default_branch action result message +chittyapps org-ruleset failed {"message":"Not Found","documentation_url":"https://docs.github.com/rest/orgs/rules#create-an-organization-repository-ruleset","status":"404"}gh: Not Found (HTTP 404) gh: This API operation needs the "admin:org" scope. To request it, run: gh auth refresh -h github.com -s admin:org +chittyfoundation org-ruleset failed {"message":"Not Found","documentation_url":"https://docs.github.com/rest/orgs/rules#create-an-organization-repository-ruleset","status":"404"}gh: Not Found (HTTP 404) gh: This API operation needs the "admin:org" scope. To request it, run: gh auth refresh -h github.com -s admin:org +chittyos org-ruleset failed {"message":"Not Found","documentation_url":"https://docs.github.com/rest/orgs/rules#create-an-organization-repository-ruleset","status":"404"}gh: Not Found (HTTP 404) gh: This API operation needs the "admin:org" scope. To request it, run: gh auth refresh -h github.com -s admin:org +chitcommit org-ruleset skipped owner is not an org or inaccessible +furnished-condos org-ruleset failed {"message":"Not Found","documentation_url":"https://docs.github.com/rest/orgs/rules#create-an-organization-repository-ruleset","status":"404"}gh: Not Found (HTTP 404) gh: This API operation needs the "admin:org" scope. To request it, run: gh auth refresh -h github.com -s admin:org +chittycorp org-ruleset failed {"message":"Not Found","documentation_url":"https://docs.github.com/rest/orgs/rules#create-an-organization-repository-ruleset","status":"404"}gh: Not Found (HTTP 404) gh: This API operation needs the "admin:org" scope. To request it, run: gh auth refresh -h github.com -s admin:org diff --git a/security/remediation/2026-03-01/org-cicd/output-20260302T003110Z/summary.txt b/security/remediation/2026-03-01/org-cicd/output-20260302T003110Z/summary.txt new file mode 100644 index 0000000..b28af2b --- /dev/null +++ b/security/remediation/2026-03-01/org-cicd/output-20260302T003110Z/summary.txt @@ -0,0 +1,2 @@ +failed 5 +skipped 1 diff --git a/security/remediation/2026-03-01/output/chitcommit_chittyOS-data-scan.txt b/security/remediation/2026-03-01/output/chitcommit_chittyOS-data-scan.txt new file mode 100644 index 0000000..f0e871a --- /dev/null +++ b/security/remediation/2026-03-01/output/chitcommit_chittyOS-data-scan.txt @@ -0,0 +1,5 @@ +repo_id=chitcommit/chittyOS-data +repo_path=/Users/nb/Desktop/Projects/github.com/CHITCOMMIT/chittyOS-data +timestamp=2026-03-01T23:44:36Z + +status=missing_git diff --git a/security/remediation/2026-03-01/output/chitcommit_chittychat-data-scan.txt b/security/remediation/2026-03-01/output/chitcommit_chittychat-data-scan.txt new file mode 100644 index 0000000..b126695 --- /dev/null +++ b/security/remediation/2026-03-01/output/chitcommit_chittychat-data-scan.txt @@ -0,0 +1,15 @@ +repo_id=chitcommit/chittychat-data +repo_path=/Users/nb/Desktop/Projects/github.com/CHITTYOS/chittycommand/_ext/chittychat-data +timestamp=2026-03-01T23:44:36Z + +status=ok +head=91a93f3 + +[working-tree-pattern-scan] + +[history-grep-known-literals] +-- literal: test-secret-key-for-github-actions-testing +-- literal: test-secret-for-security-headers-check +-- literal: 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef + +[trufflehog] skipped (not installed) diff --git a/security/remediation/2026-03-01/output/chittyapps_chittyfinance-scan.txt b/security/remediation/2026-03-01/output/chittyapps_chittyfinance-scan.txt new file mode 100644 index 0000000..2aa2f8d --- /dev/null +++ b/security/remediation/2026-03-01/output/chittyapps_chittyfinance-scan.txt @@ -0,0 +1,21 @@ +repo_id=chittyapps/chittyfinance +repo_path=/Users/nb/Desktop/Projects/github.com/CHITTYAPPS/chittyfinance +timestamp=2026-03-01T23:44:35Z + +status=ok +head=484fde5 + +[working-tree-pattern-scan] + +[history-grep-known-literals] +-- literal: test-secret-key-for-github-actions-testing +5de6d24 Fix package.json: add missing dependencies and update project name +a683bbb Add enhanced features: integrations, AI assistants, security improvements, and deployment workflows +-- literal: test-secret-for-security-headers-check +5de6d24 Fix package.json: add missing dependencies and update project name +a683bbb Add enhanced features: integrations, AI assistants, security improvements, and deployment workflows +-- literal: 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef +5de6d24 Fix package.json: add missing dependencies and update project name +a683bbb Add enhanced features: integrations, AI assistants, security improvements, and deployment workflows + +[trufflehog] skipped (not installed) diff --git a/security/remediation/2026-03-01/output/chittyfoundation_chittyschema-scan.txt b/security/remediation/2026-03-01/output/chittyfoundation_chittyschema-scan.txt new file mode 100644 index 0000000..68e3b99 --- /dev/null +++ b/security/remediation/2026-03-01/output/chittyfoundation_chittyschema-scan.txt @@ -0,0 +1,15 @@ +repo_id=chittyfoundation/chittyschema +repo_path=/Users/nb/Desktop/Projects/github.com/CHITTYFOUNDATION/chittyschema +timestamp=2026-03-01T23:44:36Z + +status=ok +head=881815d + +[working-tree-pattern-scan] + +[history-grep-known-literals] +-- literal: test-secret-key-for-github-actions-testing +-- literal: test-secret-for-security-headers-check +-- literal: 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef + +[trufflehog] skipped (not installed) diff --git a/security/remediation/2026-03-01/output/chittyos_chittyapi-scan.txt b/security/remediation/2026-03-01/output/chittyos_chittyapi-scan.txt new file mode 100644 index 0000000..af3c79c --- /dev/null +++ b/security/remediation/2026-03-01/output/chittyos_chittyapi-scan.txt @@ -0,0 +1,5 @@ +repo_id=chittyos/chittyapi +repo_path=/Users/nb/Desktop/Projects/github.com/CHITTYOS/chittyapi +timestamp=2026-03-01T23:44:36Z + +status=missing_git diff --git a/security/remediation/2026-03-01/pr-patches/chittyOS-data-security-gates.patch b/security/remediation/2026-03-01/pr-patches/chittyOS-data-security-gates.patch new file mode 100644 index 0000000..2b0d349 --- /dev/null +++ b/security/remediation/2026-03-01/pr-patches/chittyOS-data-security-gates.patch @@ -0,0 +1,161 @@ +diff --git a/scripts/security/check-workflow-secrets.sh b/scripts/security/check-workflow-secrets.sh +new file mode 100755 +index 0000000..8c9659c +--- /dev/null ++++ b/scripts/security/check-workflow-secrets.sh +@@ -0,0 +1,44 @@ ++#!/usr/bin/env bash ++set -euo pipefail ++ ++WORKFLOW_DIR=".github/workflows" ++ ++if [[ ! -d "$WORKFLOW_DIR" ]]; then ++ echo "No workflow directory found; skipping workflow secret checks." ++ exit 0 ++fi ++ ++fail=0 ++ ++# 1) Explicitly blocked historical literals ++blocked_literals=( ++ "test-secret-key-for-github-actions-testing" ++ "test-secret-for-security-headers-check" ++ "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" ++) ++ ++for literal in "${blocked_literals[@]}"; do ++ if grep -RIn --include='*.yml' --include='*.yaml' "$literal" "$WORKFLOW_DIR" >/dev/null 2>&1; then ++ echo "Blocked literal found in workflow files: $literal" ++ grep -RIn --include='*.yml' --include='*.yaml' "$literal" "$WORKFLOW_DIR" || true ++ fail=1 ++ fi ++done ++ ++# 2) Hardcoded secret-style env assignments in workflows. ++# Allow GitHub Secrets interpolation only. ++while IFS= read -r line; do ++ # line format: file:line:text ++ value="${line#*:*:}" ++ if [[ "$value" != *'${{ secrets.'* ]]; then ++ echo "Hardcoded secret-like workflow assignment found: $line" ++ fail=1 ++ fi ++done < <(grep -RInE --include='*.yml' --include='*.yaml' 'SESSION_SECRET\s*:\s*".+"|ENCRYPTION_KEY\s*:\s*".+"' "$WORKFLOW_DIR" || true) ++ ++if [[ "$fail" -ne 0 ]]; then ++ echo "Workflow secret policy check failed." ++ exit 1 ++fi ++ ++echo "Workflow secret policy check passed." +diff --git a/.github/workflows/security-gates.yml b/.github/workflows/security-gates.yml +new file mode 100644 +index 0000000..2d95f7a +--- /dev/null ++++ b/.github/workflows/security-gates.yml +@@ -0,0 +1,105 @@ ++name: Security Gates ++ ++on: ++ pull_request: ++ branches: [main] ++ push: ++ branches: [main, develop] ++ workflow_dispatch: ++ ++concurrency: ++ group: security-gates-${{ github.ref }} ++ cancel-in-progress: true ++ ++jobs: ++ workflow-secret-policy: ++ name: Workflow Secret Policy ++ runs-on: ubuntu-latest ++ steps: ++ - name: Checkout ++ uses: actions/checkout@v4 ++ ++ - name: Enforce workflow secret policy ++ run: ./scripts/security/check-workflow-secrets.sh ++ ++ working-tree-secret-scan: ++ name: Working Tree Secret Scan ++ runs-on: ubuntu-latest ++ steps: ++ - name: Checkout ++ uses: actions/checkout@v4 ++ ++ - name: Scan for high-risk secret patterns ++ shell: bash ++ run: | ++ set -euo pipefail ++ ++ if grep -RInE \ ++ --exclude-dir=.git \ ++ --exclude-dir=node_modules \ ++ --exclude-dir=dist \ ++ --exclude-dir=.wrangler \ ++ --exclude='*.png' \ ++ --exclude='*.jpg' \ ++ --exclude='*.jpeg' \ ++ --exclude='*.gif' \ ++ 'ghp_[A-Za-z0-9]{20,}|sk_live_[A-Za-z0-9]{20,}|AKIA[0-9A-Z]{16}|BEGIN (RSA|EC|OPENSSH|PGP)? ?PRIVATE KEY' .; then ++ echo "Secret-like pattern detected in working tree." ++ exit 1 ++ fi ++ ++ echo "Working tree secret scan passed." ++ ++ dependency-audit: ++ name: Dependency Audit (High+) ++ runs-on: ubuntu-latest ++ steps: ++ - name: Checkout ++ uses: actions/checkout@v4 ++ ++ - name: Setup Node ++ uses: actions/setup-node@v4 ++ with: ++ node-version: '20' ++ cache: 'npm' ++ ++ - name: Resolve package root ++ id: pkg ++ run: | ++ set -euo pipefail ++ if [ -f package.json ]; then ++ echo "dir=." >> "$GITHUB_OUTPUT" ++ exit 0 ++ fi ++ if [ -f development/chittyschema/package.json ]; then ++ echo "dir=development/chittyschema" >> "$GITHUB_OUTPUT" ++ exit 0 ++ fi ++ echo "dir=" >> "$GITHUB_OUTPUT" ++ echo "No Node package root detected; skipping dependency audit." ++ ++ - name: Install dependencies ++ if: steps.pkg.outputs.dir != '' ++ run: | ++ set -euo pipefail ++ cd "${{ steps.pkg.outputs.dir }}" ++ if [ -f package-lock.json ]; then ++ npm ci ++ elif [ -f pnpm-lock.yaml ]; then ++ npm i -g pnpm ++ pnpm i --frozen-lockfile ++ else ++ echo "No lockfile found in $PWD" ++ exit 1 ++ fi ++ ++ - name: Enforce npm audit high threshold ++ if: steps.pkg.outputs.dir != '' ++ run: | ++ set -euo pipefail ++ cd "${{ steps.pkg.outputs.dir }}" ++ if command -v pnpm >/dev/null 2>&1 && [ -f pnpm-lock.yaml ]; then ++ pnpm audit --prod --audit-level high ++ else ++ npm audit --audit-level=high --omit=dev ++ fi diff --git a/security/remediation/2026-03-01/pr-patches/chittyapi-security-gates.patch b/security/remediation/2026-03-01/pr-patches/chittyapi-security-gates.patch new file mode 100644 index 0000000..2b0d349 --- /dev/null +++ b/security/remediation/2026-03-01/pr-patches/chittyapi-security-gates.patch @@ -0,0 +1,161 @@ +diff --git a/scripts/security/check-workflow-secrets.sh b/scripts/security/check-workflow-secrets.sh +new file mode 100755 +index 0000000..8c9659c +--- /dev/null ++++ b/scripts/security/check-workflow-secrets.sh +@@ -0,0 +1,44 @@ ++#!/usr/bin/env bash ++set -euo pipefail ++ ++WORKFLOW_DIR=".github/workflows" ++ ++if [[ ! -d "$WORKFLOW_DIR" ]]; then ++ echo "No workflow directory found; skipping workflow secret checks." ++ exit 0 ++fi ++ ++fail=0 ++ ++# 1) Explicitly blocked historical literals ++blocked_literals=( ++ "test-secret-key-for-github-actions-testing" ++ "test-secret-for-security-headers-check" ++ "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" ++) ++ ++for literal in "${blocked_literals[@]}"; do ++ if grep -RIn --include='*.yml' --include='*.yaml' "$literal" "$WORKFLOW_DIR" >/dev/null 2>&1; then ++ echo "Blocked literal found in workflow files: $literal" ++ grep -RIn --include='*.yml' --include='*.yaml' "$literal" "$WORKFLOW_DIR" || true ++ fail=1 ++ fi ++done ++ ++# 2) Hardcoded secret-style env assignments in workflows. ++# Allow GitHub Secrets interpolation only. ++while IFS= read -r line; do ++ # line format: file:line:text ++ value="${line#*:*:}" ++ if [[ "$value" != *'${{ secrets.'* ]]; then ++ echo "Hardcoded secret-like workflow assignment found: $line" ++ fail=1 ++ fi ++done < <(grep -RInE --include='*.yml' --include='*.yaml' 'SESSION_SECRET\s*:\s*".+"|ENCRYPTION_KEY\s*:\s*".+"' "$WORKFLOW_DIR" || true) ++ ++if [[ "$fail" -ne 0 ]]; then ++ echo "Workflow secret policy check failed." ++ exit 1 ++fi ++ ++echo "Workflow secret policy check passed." +diff --git a/.github/workflows/security-gates.yml b/.github/workflows/security-gates.yml +new file mode 100644 +index 0000000..2d95f7a +--- /dev/null ++++ b/.github/workflows/security-gates.yml +@@ -0,0 +1,105 @@ ++name: Security Gates ++ ++on: ++ pull_request: ++ branches: [main] ++ push: ++ branches: [main, develop] ++ workflow_dispatch: ++ ++concurrency: ++ group: security-gates-${{ github.ref }} ++ cancel-in-progress: true ++ ++jobs: ++ workflow-secret-policy: ++ name: Workflow Secret Policy ++ runs-on: ubuntu-latest ++ steps: ++ - name: Checkout ++ uses: actions/checkout@v4 ++ ++ - name: Enforce workflow secret policy ++ run: ./scripts/security/check-workflow-secrets.sh ++ ++ working-tree-secret-scan: ++ name: Working Tree Secret Scan ++ runs-on: ubuntu-latest ++ steps: ++ - name: Checkout ++ uses: actions/checkout@v4 ++ ++ - name: Scan for high-risk secret patterns ++ shell: bash ++ run: | ++ set -euo pipefail ++ ++ if grep -RInE \ ++ --exclude-dir=.git \ ++ --exclude-dir=node_modules \ ++ --exclude-dir=dist \ ++ --exclude-dir=.wrangler \ ++ --exclude='*.png' \ ++ --exclude='*.jpg' \ ++ --exclude='*.jpeg' \ ++ --exclude='*.gif' \ ++ 'ghp_[A-Za-z0-9]{20,}|sk_live_[A-Za-z0-9]{20,}|AKIA[0-9A-Z]{16}|BEGIN (RSA|EC|OPENSSH|PGP)? ?PRIVATE KEY' .; then ++ echo "Secret-like pattern detected in working tree." ++ exit 1 ++ fi ++ ++ echo "Working tree secret scan passed." ++ ++ dependency-audit: ++ name: Dependency Audit (High+) ++ runs-on: ubuntu-latest ++ steps: ++ - name: Checkout ++ uses: actions/checkout@v4 ++ ++ - name: Setup Node ++ uses: actions/setup-node@v4 ++ with: ++ node-version: '20' ++ cache: 'npm' ++ ++ - name: Resolve package root ++ id: pkg ++ run: | ++ set -euo pipefail ++ if [ -f package.json ]; then ++ echo "dir=." >> "$GITHUB_OUTPUT" ++ exit 0 ++ fi ++ if [ -f development/chittyschema/package.json ]; then ++ echo "dir=development/chittyschema" >> "$GITHUB_OUTPUT" ++ exit 0 ++ fi ++ echo "dir=" >> "$GITHUB_OUTPUT" ++ echo "No Node package root detected; skipping dependency audit." ++ ++ - name: Install dependencies ++ if: steps.pkg.outputs.dir != '' ++ run: | ++ set -euo pipefail ++ cd "${{ steps.pkg.outputs.dir }}" ++ if [ -f package-lock.json ]; then ++ npm ci ++ elif [ -f pnpm-lock.yaml ]; then ++ npm i -g pnpm ++ pnpm i --frozen-lockfile ++ else ++ echo "No lockfile found in $PWD" ++ exit 1 ++ fi ++ ++ - name: Enforce npm audit high threshold ++ if: steps.pkg.outputs.dir != '' ++ run: | ++ set -euo pipefail ++ cd "${{ steps.pkg.outputs.dir }}" ++ if command -v pnpm >/dev/null 2>&1 && [ -f pnpm-lock.yaml ]; then ++ pnpm audit --prod --audit-level high ++ else ++ npm audit --audit-level=high --omit=dev ++ fi diff --git a/security/remediation/2026-03-01/pr-patches/chittychat-data-security-gates.patch b/security/remediation/2026-03-01/pr-patches/chittychat-data-security-gates.patch new file mode 100644 index 0000000..2b0d349 --- /dev/null +++ b/security/remediation/2026-03-01/pr-patches/chittychat-data-security-gates.patch @@ -0,0 +1,161 @@ +diff --git a/scripts/security/check-workflow-secrets.sh b/scripts/security/check-workflow-secrets.sh +new file mode 100755 +index 0000000..8c9659c +--- /dev/null ++++ b/scripts/security/check-workflow-secrets.sh +@@ -0,0 +1,44 @@ ++#!/usr/bin/env bash ++set -euo pipefail ++ ++WORKFLOW_DIR=".github/workflows" ++ ++if [[ ! -d "$WORKFLOW_DIR" ]]; then ++ echo "No workflow directory found; skipping workflow secret checks." ++ exit 0 ++fi ++ ++fail=0 ++ ++# 1) Explicitly blocked historical literals ++blocked_literals=( ++ "test-secret-key-for-github-actions-testing" ++ "test-secret-for-security-headers-check" ++ "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" ++) ++ ++for literal in "${blocked_literals[@]}"; do ++ if grep -RIn --include='*.yml' --include='*.yaml' "$literal" "$WORKFLOW_DIR" >/dev/null 2>&1; then ++ echo "Blocked literal found in workflow files: $literal" ++ grep -RIn --include='*.yml' --include='*.yaml' "$literal" "$WORKFLOW_DIR" || true ++ fail=1 ++ fi ++done ++ ++# 2) Hardcoded secret-style env assignments in workflows. ++# Allow GitHub Secrets interpolation only. ++while IFS= read -r line; do ++ # line format: file:line:text ++ value="${line#*:*:}" ++ if [[ "$value" != *'${{ secrets.'* ]]; then ++ echo "Hardcoded secret-like workflow assignment found: $line" ++ fail=1 ++ fi ++done < <(grep -RInE --include='*.yml' --include='*.yaml' 'SESSION_SECRET\s*:\s*".+"|ENCRYPTION_KEY\s*:\s*".+"' "$WORKFLOW_DIR" || true) ++ ++if [[ "$fail" -ne 0 ]]; then ++ echo "Workflow secret policy check failed." ++ exit 1 ++fi ++ ++echo "Workflow secret policy check passed." +diff --git a/.github/workflows/security-gates.yml b/.github/workflows/security-gates.yml +new file mode 100644 +index 0000000..2d95f7a +--- /dev/null ++++ b/.github/workflows/security-gates.yml +@@ -0,0 +1,105 @@ ++name: Security Gates ++ ++on: ++ pull_request: ++ branches: [main] ++ push: ++ branches: [main, develop] ++ workflow_dispatch: ++ ++concurrency: ++ group: security-gates-${{ github.ref }} ++ cancel-in-progress: true ++ ++jobs: ++ workflow-secret-policy: ++ name: Workflow Secret Policy ++ runs-on: ubuntu-latest ++ steps: ++ - name: Checkout ++ uses: actions/checkout@v4 ++ ++ - name: Enforce workflow secret policy ++ run: ./scripts/security/check-workflow-secrets.sh ++ ++ working-tree-secret-scan: ++ name: Working Tree Secret Scan ++ runs-on: ubuntu-latest ++ steps: ++ - name: Checkout ++ uses: actions/checkout@v4 ++ ++ - name: Scan for high-risk secret patterns ++ shell: bash ++ run: | ++ set -euo pipefail ++ ++ if grep -RInE \ ++ --exclude-dir=.git \ ++ --exclude-dir=node_modules \ ++ --exclude-dir=dist \ ++ --exclude-dir=.wrangler \ ++ --exclude='*.png' \ ++ --exclude='*.jpg' \ ++ --exclude='*.jpeg' \ ++ --exclude='*.gif' \ ++ 'ghp_[A-Za-z0-9]{20,}|sk_live_[A-Za-z0-9]{20,}|AKIA[0-9A-Z]{16}|BEGIN (RSA|EC|OPENSSH|PGP)? ?PRIVATE KEY' .; then ++ echo "Secret-like pattern detected in working tree." ++ exit 1 ++ fi ++ ++ echo "Working tree secret scan passed." ++ ++ dependency-audit: ++ name: Dependency Audit (High+) ++ runs-on: ubuntu-latest ++ steps: ++ - name: Checkout ++ uses: actions/checkout@v4 ++ ++ - name: Setup Node ++ uses: actions/setup-node@v4 ++ with: ++ node-version: '20' ++ cache: 'npm' ++ ++ - name: Resolve package root ++ id: pkg ++ run: | ++ set -euo pipefail ++ if [ -f package.json ]; then ++ echo "dir=." >> "$GITHUB_OUTPUT" ++ exit 0 ++ fi ++ if [ -f development/chittyschema/package.json ]; then ++ echo "dir=development/chittyschema" >> "$GITHUB_OUTPUT" ++ exit 0 ++ fi ++ echo "dir=" >> "$GITHUB_OUTPUT" ++ echo "No Node package root detected; skipping dependency audit." ++ ++ - name: Install dependencies ++ if: steps.pkg.outputs.dir != '' ++ run: | ++ set -euo pipefail ++ cd "${{ steps.pkg.outputs.dir }}" ++ if [ -f package-lock.json ]; then ++ npm ci ++ elif [ -f pnpm-lock.yaml ]; then ++ npm i -g pnpm ++ pnpm i --frozen-lockfile ++ else ++ echo "No lockfile found in $PWD" ++ exit 1 ++ fi ++ ++ - name: Enforce npm audit high threshold ++ if: steps.pkg.outputs.dir != '' ++ run: | ++ set -euo pipefail ++ cd "${{ steps.pkg.outputs.dir }}" ++ if command -v pnpm >/dev/null 2>&1 && [ -f pnpm-lock.yaml ]; then ++ pnpm audit --prod --audit-level high ++ else ++ npm audit --audit-level=high --omit=dev ++ fi diff --git a/security/remediation/2026-03-01/pr-patches/chittyfinance-security-gates.patch b/security/remediation/2026-03-01/pr-patches/chittyfinance-security-gates.patch new file mode 100644 index 0000000..2b0d349 --- /dev/null +++ b/security/remediation/2026-03-01/pr-patches/chittyfinance-security-gates.patch @@ -0,0 +1,161 @@ +diff --git a/scripts/security/check-workflow-secrets.sh b/scripts/security/check-workflow-secrets.sh +new file mode 100755 +index 0000000..8c9659c +--- /dev/null ++++ b/scripts/security/check-workflow-secrets.sh +@@ -0,0 +1,44 @@ ++#!/usr/bin/env bash ++set -euo pipefail ++ ++WORKFLOW_DIR=".github/workflows" ++ ++if [[ ! -d "$WORKFLOW_DIR" ]]; then ++ echo "No workflow directory found; skipping workflow secret checks." ++ exit 0 ++fi ++ ++fail=0 ++ ++# 1) Explicitly blocked historical literals ++blocked_literals=( ++ "test-secret-key-for-github-actions-testing" ++ "test-secret-for-security-headers-check" ++ "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" ++) ++ ++for literal in "${blocked_literals[@]}"; do ++ if grep -RIn --include='*.yml' --include='*.yaml' "$literal" "$WORKFLOW_DIR" >/dev/null 2>&1; then ++ echo "Blocked literal found in workflow files: $literal" ++ grep -RIn --include='*.yml' --include='*.yaml' "$literal" "$WORKFLOW_DIR" || true ++ fail=1 ++ fi ++done ++ ++# 2) Hardcoded secret-style env assignments in workflows. ++# Allow GitHub Secrets interpolation only. ++while IFS= read -r line; do ++ # line format: file:line:text ++ value="${line#*:*:}" ++ if [[ "$value" != *'${{ secrets.'* ]]; then ++ echo "Hardcoded secret-like workflow assignment found: $line" ++ fail=1 ++ fi ++done < <(grep -RInE --include='*.yml' --include='*.yaml' 'SESSION_SECRET\s*:\s*".+"|ENCRYPTION_KEY\s*:\s*".+"' "$WORKFLOW_DIR" || true) ++ ++if [[ "$fail" -ne 0 ]]; then ++ echo "Workflow secret policy check failed." ++ exit 1 ++fi ++ ++echo "Workflow secret policy check passed." +diff --git a/.github/workflows/security-gates.yml b/.github/workflows/security-gates.yml +new file mode 100644 +index 0000000..2d95f7a +--- /dev/null ++++ b/.github/workflows/security-gates.yml +@@ -0,0 +1,105 @@ ++name: Security Gates ++ ++on: ++ pull_request: ++ branches: [main] ++ push: ++ branches: [main, develop] ++ workflow_dispatch: ++ ++concurrency: ++ group: security-gates-${{ github.ref }} ++ cancel-in-progress: true ++ ++jobs: ++ workflow-secret-policy: ++ name: Workflow Secret Policy ++ runs-on: ubuntu-latest ++ steps: ++ - name: Checkout ++ uses: actions/checkout@v4 ++ ++ - name: Enforce workflow secret policy ++ run: ./scripts/security/check-workflow-secrets.sh ++ ++ working-tree-secret-scan: ++ name: Working Tree Secret Scan ++ runs-on: ubuntu-latest ++ steps: ++ - name: Checkout ++ uses: actions/checkout@v4 ++ ++ - name: Scan for high-risk secret patterns ++ shell: bash ++ run: | ++ set -euo pipefail ++ ++ if grep -RInE \ ++ --exclude-dir=.git \ ++ --exclude-dir=node_modules \ ++ --exclude-dir=dist \ ++ --exclude-dir=.wrangler \ ++ --exclude='*.png' \ ++ --exclude='*.jpg' \ ++ --exclude='*.jpeg' \ ++ --exclude='*.gif' \ ++ 'ghp_[A-Za-z0-9]{20,}|sk_live_[A-Za-z0-9]{20,}|AKIA[0-9A-Z]{16}|BEGIN (RSA|EC|OPENSSH|PGP)? ?PRIVATE KEY' .; then ++ echo "Secret-like pattern detected in working tree." ++ exit 1 ++ fi ++ ++ echo "Working tree secret scan passed." ++ ++ dependency-audit: ++ name: Dependency Audit (High+) ++ runs-on: ubuntu-latest ++ steps: ++ - name: Checkout ++ uses: actions/checkout@v4 ++ ++ - name: Setup Node ++ uses: actions/setup-node@v4 ++ with: ++ node-version: '20' ++ cache: 'npm' ++ ++ - name: Resolve package root ++ id: pkg ++ run: | ++ set -euo pipefail ++ if [ -f package.json ]; then ++ echo "dir=." >> "$GITHUB_OUTPUT" ++ exit 0 ++ fi ++ if [ -f development/chittyschema/package.json ]; then ++ echo "dir=development/chittyschema" >> "$GITHUB_OUTPUT" ++ exit 0 ++ fi ++ echo "dir=" >> "$GITHUB_OUTPUT" ++ echo "No Node package root detected; skipping dependency audit." ++ ++ - name: Install dependencies ++ if: steps.pkg.outputs.dir != '' ++ run: | ++ set -euo pipefail ++ cd "${{ steps.pkg.outputs.dir }}" ++ if [ -f package-lock.json ]; then ++ npm ci ++ elif [ -f pnpm-lock.yaml ]; then ++ npm i -g pnpm ++ pnpm i --frozen-lockfile ++ else ++ echo "No lockfile found in $PWD" ++ exit 1 ++ fi ++ ++ - name: Enforce npm audit high threshold ++ if: steps.pkg.outputs.dir != '' ++ run: | ++ set -euo pipefail ++ cd "${{ steps.pkg.outputs.dir }}" ++ if command -v pnpm >/dev/null 2>&1 && [ -f pnpm-lock.yaml ]; then ++ pnpm audit --prod --audit-level high ++ else ++ npm audit --audit-level=high --omit=dev ++ fi diff --git a/security/remediation/2026-03-01/pr-patches/chittyschema-security-gates.patch b/security/remediation/2026-03-01/pr-patches/chittyschema-security-gates.patch new file mode 100644 index 0000000..2b0d349 --- /dev/null +++ b/security/remediation/2026-03-01/pr-patches/chittyschema-security-gates.patch @@ -0,0 +1,161 @@ +diff --git a/scripts/security/check-workflow-secrets.sh b/scripts/security/check-workflow-secrets.sh +new file mode 100755 +index 0000000..8c9659c +--- /dev/null ++++ b/scripts/security/check-workflow-secrets.sh +@@ -0,0 +1,44 @@ ++#!/usr/bin/env bash ++set -euo pipefail ++ ++WORKFLOW_DIR=".github/workflows" ++ ++if [[ ! -d "$WORKFLOW_DIR" ]]; then ++ echo "No workflow directory found; skipping workflow secret checks." ++ exit 0 ++fi ++ ++fail=0 ++ ++# 1) Explicitly blocked historical literals ++blocked_literals=( ++ "test-secret-key-for-github-actions-testing" ++ "test-secret-for-security-headers-check" ++ "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" ++) ++ ++for literal in "${blocked_literals[@]}"; do ++ if grep -RIn --include='*.yml' --include='*.yaml' "$literal" "$WORKFLOW_DIR" >/dev/null 2>&1; then ++ echo "Blocked literal found in workflow files: $literal" ++ grep -RIn --include='*.yml' --include='*.yaml' "$literal" "$WORKFLOW_DIR" || true ++ fail=1 ++ fi ++done ++ ++# 2) Hardcoded secret-style env assignments in workflows. ++# Allow GitHub Secrets interpolation only. ++while IFS= read -r line; do ++ # line format: file:line:text ++ value="${line#*:*:}" ++ if [[ "$value" != *'${{ secrets.'* ]]; then ++ echo "Hardcoded secret-like workflow assignment found: $line" ++ fail=1 ++ fi ++done < <(grep -RInE --include='*.yml' --include='*.yaml' 'SESSION_SECRET\s*:\s*".+"|ENCRYPTION_KEY\s*:\s*".+"' "$WORKFLOW_DIR" || true) ++ ++if [[ "$fail" -ne 0 ]]; then ++ echo "Workflow secret policy check failed." ++ exit 1 ++fi ++ ++echo "Workflow secret policy check passed." +diff --git a/.github/workflows/security-gates.yml b/.github/workflows/security-gates.yml +new file mode 100644 +index 0000000..2d95f7a +--- /dev/null ++++ b/.github/workflows/security-gates.yml +@@ -0,0 +1,105 @@ ++name: Security Gates ++ ++on: ++ pull_request: ++ branches: [main] ++ push: ++ branches: [main, develop] ++ workflow_dispatch: ++ ++concurrency: ++ group: security-gates-${{ github.ref }} ++ cancel-in-progress: true ++ ++jobs: ++ workflow-secret-policy: ++ name: Workflow Secret Policy ++ runs-on: ubuntu-latest ++ steps: ++ - name: Checkout ++ uses: actions/checkout@v4 ++ ++ - name: Enforce workflow secret policy ++ run: ./scripts/security/check-workflow-secrets.sh ++ ++ working-tree-secret-scan: ++ name: Working Tree Secret Scan ++ runs-on: ubuntu-latest ++ steps: ++ - name: Checkout ++ uses: actions/checkout@v4 ++ ++ - name: Scan for high-risk secret patterns ++ shell: bash ++ run: | ++ set -euo pipefail ++ ++ if grep -RInE \ ++ --exclude-dir=.git \ ++ --exclude-dir=node_modules \ ++ --exclude-dir=dist \ ++ --exclude-dir=.wrangler \ ++ --exclude='*.png' \ ++ --exclude='*.jpg' \ ++ --exclude='*.jpeg' \ ++ --exclude='*.gif' \ ++ 'ghp_[A-Za-z0-9]{20,}|sk_live_[A-Za-z0-9]{20,}|AKIA[0-9A-Z]{16}|BEGIN (RSA|EC|OPENSSH|PGP)? ?PRIVATE KEY' .; then ++ echo "Secret-like pattern detected in working tree." ++ exit 1 ++ fi ++ ++ echo "Working tree secret scan passed." ++ ++ dependency-audit: ++ name: Dependency Audit (High+) ++ runs-on: ubuntu-latest ++ steps: ++ - name: Checkout ++ uses: actions/checkout@v4 ++ ++ - name: Setup Node ++ uses: actions/setup-node@v4 ++ with: ++ node-version: '20' ++ cache: 'npm' ++ ++ - name: Resolve package root ++ id: pkg ++ run: | ++ set -euo pipefail ++ if [ -f package.json ]; then ++ echo "dir=." >> "$GITHUB_OUTPUT" ++ exit 0 ++ fi ++ if [ -f development/chittyschema/package.json ]; then ++ echo "dir=development/chittyschema" >> "$GITHUB_OUTPUT" ++ exit 0 ++ fi ++ echo "dir=" >> "$GITHUB_OUTPUT" ++ echo "No Node package root detected; skipping dependency audit." ++ ++ - name: Install dependencies ++ if: steps.pkg.outputs.dir != '' ++ run: | ++ set -euo pipefail ++ cd "${{ steps.pkg.outputs.dir }}" ++ if [ -f package-lock.json ]; then ++ npm ci ++ elif [ -f pnpm-lock.yaml ]; then ++ npm i -g pnpm ++ pnpm i --frozen-lockfile ++ else ++ echo "No lockfile found in $PWD" ++ exit 1 ++ fi ++ ++ - name: Enforce npm audit high threshold ++ if: steps.pkg.outputs.dir != '' ++ run: | ++ set -euo pipefail ++ cd "${{ steps.pkg.outputs.dir }}" ++ if command -v pnpm >/dev/null 2>&1 && [ -f pnpm-lock.yaml ]; then ++ pnpm audit --prod --audit-level high ++ else ++ npm audit --audit-level=high --omit=dev ++ fi diff --git a/security/remediation/2026-03-01/pr-templates/chittychat-data-pr-body.md b/security/remediation/2026-03-01/pr-templates/chittychat-data-pr-body.md new file mode 100644 index 0000000..2ff016d --- /dev/null +++ b/security/remediation/2026-03-01/pr-templates/chittychat-data-pr-body.md @@ -0,0 +1,14 @@ +## Summary +Introduces CI/CD security gates for workflow secret hygiene and dependency/security checks. + +## Changes +- Adds `.github/workflows/security-gates.yml` +- Adds `scripts/security/check-workflow-secrets.sh` + +## Why +- Reduce risk of committing workflow literals and other secret-like patterns. +- Add baseline dependency security guardrails in CI. + +## Validation +- `./scripts/security/check-workflow-secrets.sh` passes. +- `security-gates.yml` parsed successfully. diff --git a/security/remediation/2026-03-01/pr-templates/chittyfinance-pr-body.md b/security/remediation/2026-03-01/pr-templates/chittyfinance-pr-body.md new file mode 100644 index 0000000..8244ad6 --- /dev/null +++ b/security/remediation/2026-03-01/pr-templates/chittyfinance-pr-body.md @@ -0,0 +1,23 @@ +## Summary +This PR adds enforceable CI/CD security gates to prevent secret reintroduction and catch high-risk dependency issues early. + +## Changes +- Adds `.github/workflows/security-gates.yml` + - workflow secret policy enforcement + - working-tree secret pattern scan + - dependency audit gate (high severity) +- Adds `scripts/security/check-workflow-secrets.sh` + - blocks known leaked literals + - rejects hardcoded `SESSION_SECRET` / `ENCRYPTION_KEY` workflow values unless sourced from `${{ secrets.* }}` + +## Why +- Historical workflow literals were found in repo history and require long-term prevention controls. +- This gate ensures PRs fail before secrets or high-risk dependency issues are merged. + +## Validation +- `./scripts/security/check-workflow-secrets.sh` (pass) +- workflow YAML parses successfully. + +## Follow-ups +- enforce required status checks in branch protection for `Security Gates` +- complete secret rotation + history purge using the remediation kit (`security/remediation/2026-03-01/`) diff --git a/security/remediation/2026-03-01/pr-templates/chittyschema-pr-body.md b/security/remediation/2026-03-01/pr-templates/chittyschema-pr-body.md new file mode 100644 index 0000000..f3d79a1 --- /dev/null +++ b/security/remediation/2026-03-01/pr-templates/chittyschema-pr-body.md @@ -0,0 +1,14 @@ +## Summary +Adds CI/CD security gates for secret policy enforcement and dependency audit. + +## Changes +- Adds `.github/workflows/security-gates.yml` +- Adds `scripts/security/check-workflow-secrets.sh` + +## Why +- Prevent hardcoded secret patterns from entering workflows. +- Enforce high-severity dependency audit checks in CI. + +## Validation +- `./scripts/security/check-workflow-secrets.sh` passes. +- `security-gates.yml` parsed successfully. diff --git a/security/remediation/2026-03-01/purge-history-and-rotate.sh b/security/remediation/2026-03-01/purge-history-and-rotate.sh new file mode 100755 index 0000000..e24143c --- /dev/null +++ b/security/remediation/2026-03-01/purge-history-and-rotate.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +set -euo pipefail + +# PURPOSE +# - Purge confirmed exposed secret literals from git history. +# - Force-push rewritten history. +# - Provide a deterministic command bundle for incident response. +# +# IMPORTANT +# - Run from a fresh mirror clone (recommended), not a developer working clone. +# - Coordinate with all collaborators before force-pushing. + +REPO_URL="git@github.com:chittyapps/chittyfinance.git" +WORK_DIR="${WORK_DIR:-/tmp/chittyfinance-history-rewrite}" +REPLACEMENTS_FILE="security/remediation/2026-03-01/git-filter-repo-replacements.txt" + +rm -rf "$WORK_DIR" +git clone --mirror "$REPO_URL" "$WORK_DIR" +cd "$WORK_DIR" + +# Safety snapshot before rewrite +git bundle create ../chittyfinance-prepurge-$(date +%Y%m%d%H%M%S).bundle --all + +# Rewrite history +# Requires git-filter-repo installed (https://github.com/newren/git-filter-repo) +git filter-repo --replace-text "$REPLACEMENTS_FILE" --force + +# Optional verification (no expected matches after purge) +if git grep -n "test-secret-key-for-github-actions-testing" $(git rev-list --all) >/dev/null 2>&1; then + echo "ERROR: session test secret still present after rewrite" + exit 1 +fi + +if git grep -n "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" $(git rev-list --all) >/dev/null 2>&1; then + echo "ERROR: encryption key literal still present after rewrite" + exit 1 +fi + +# Force-push all refs +# Coordinate this step with maintainers and branch protection settings. +git push --force --all +git push --force --tags + +echo "History rewrite complete. Proceed with collaborator re-clone/reset instructions." diff --git a/security/remediation/2026-03-01/replacements/chitcommit__chittyOS-data.txt b/security/remediation/2026-03-01/replacements/chitcommit__chittyOS-data.txt new file mode 100644 index 0000000..3409c8e --- /dev/null +++ b/security/remediation/2026-03-01/replacements/chitcommit__chittyOS-data.txt @@ -0,0 +1,3 @@ +# Add repo-specific literal secrets here (old==>new) +# Example: +# ghp_OLDTOKEN==>REMOVED_ROTATED_GH_PAT diff --git a/security/remediation/2026-03-01/replacements/chitcommit__chittychat-data.txt b/security/remediation/2026-03-01/replacements/chitcommit__chittychat-data.txt new file mode 100644 index 0000000..3409c8e --- /dev/null +++ b/security/remediation/2026-03-01/replacements/chitcommit__chittychat-data.txt @@ -0,0 +1,3 @@ +# Add repo-specific literal secrets here (old==>new) +# Example: +# ghp_OLDTOKEN==>REMOVED_ROTATED_GH_PAT diff --git a/security/remediation/2026-03-01/replacements/chittyapps__chittyfinance.txt b/security/remediation/2026-03-01/replacements/chittyapps__chittyfinance.txt new file mode 100644 index 0000000..7aaa59d --- /dev/null +++ b/security/remediation/2026-03-01/replacements/chittyapps__chittyfinance.txt @@ -0,0 +1,8 @@ +# chittyapps/chittyfinance replacements +# Format: old==>new + +test-secret-key-for-github-actions-testing==>REMOVED_ROTATED_SESSION_SECRET + +test-secret-for-security-headers-check==>REMOVED_ROTATED_SESSION_SECRET + +0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef==>REMOVED_ROTATED_ENCRYPTION_KEY diff --git a/security/remediation/2026-03-01/replacements/chittyfoundation__chittyschema.txt b/security/remediation/2026-03-01/replacements/chittyfoundation__chittyschema.txt new file mode 100644 index 0000000..3409c8e --- /dev/null +++ b/security/remediation/2026-03-01/replacements/chittyfoundation__chittyschema.txt @@ -0,0 +1,3 @@ +# Add repo-specific literal secrets here (old==>new) +# Example: +# ghp_OLDTOKEN==>REMOVED_ROTATED_GH_PAT diff --git a/security/remediation/2026-03-01/replacements/chittyos__chittyapi.txt b/security/remediation/2026-03-01/replacements/chittyos__chittyapi.txt new file mode 100644 index 0000000..3409c8e --- /dev/null +++ b/security/remediation/2026-03-01/replacements/chittyos__chittyapi.txt @@ -0,0 +1,3 @@ +# Add repo-specific literal secrets here (old==>new) +# Example: +# ghp_OLDTOKEN==>REMOVED_ROTATED_GH_PAT diff --git a/security/remediation/2026-03-01/rotation-checklist.md b/security/remediation/2026-03-01/rotation-checklist.md new file mode 100644 index 0000000..e83daed --- /dev/null +++ b/security/remediation/2026-03-01/rotation-checklist.md @@ -0,0 +1,42 @@ +# Secret Rotation Checklist (2026-03-01) + +## Incident Scope +- Historical exposure of hardcoded workflow secrets in `chittyfinance` commit `a683bbb`. +- Potentially affected classes: + - Session signing secrets + - Encryption keys used by test/staging/prod where values may have been reused + +## Rotation Steps +1. Inventory impacted secrets and stores. + - GitHub Actions repository secrets + - Cloudflare/Runtime env secrets + - 1Password vault entries + - Any app/runtime `.env` sources + +2. Rotate secrets immediately. + - `SESSION_SECRET` + - `ENCRYPTION_KEY` + - Any derived or copied variants used in staging/production + +3. Update CI and runtime bindings. + - Ensure workflows use `${{ secrets.* }}` only + - Ensure no static secret literals in YAML/scripts/docs + +4. Purge history. + - Run `security/remediation/2026-03-01/purge-history-and-rotate.sh` from a mirror clone + - Force-push rewritten refs and tags + +5. Invalidate stale sessions/tokens. + - Revoke active sessions signed with old secrets + - Trigger user re-authentication if applicable + +6. Verify and monitor. + - Re-scan full history for old literals + - Confirm CI gates enforce no literal secret patterns + - Monitor auth/session anomalies for 7 days + +## Post-rotation Validation +- [ ] Old literals absent from `git rev-list --all` history scans +- [ ] New secrets stored in vault + GitHub Secrets only +- [ ] CI green with security gates enabled +- [ ] Incident ticket includes timeline, blast radius, and closure notes diff --git a/server/__tests__/reports-and-cloudflare-integration.test.ts b/server/__tests__/reports-and-cloudflare-integration.test.ts new file mode 100644 index 0000000..2a64f03 --- /dev/null +++ b/server/__tests__/reports-and-cloudflare-integration.test.ts @@ -0,0 +1,162 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import { Hono } from 'hono'; +import type { HonoEnv } from '../env'; +import { reportRoutes } from '../routes/reports'; +import { integrationRoutes } from '../routes/integrations'; + +const env = { + CHITTY_AUTH_SERVICE_TOKEN: 'svc-token', + DATABASE_URL: 'fake', + FINANCE_KV: {} as any, + FINANCE_R2: {} as any, + ASSETS: {} as any, +}; + +function withStorage(app: Hono, storage: any) { + app.use('*', async (c, next) => { + c.set('tenantId', 't-root'); + c.set('storage', storage); + await next(); + }); + return app; +} + +describe('reportRoutes', () => { + it('GET /api/reports/consolidated returns consolidated totals and preflight checks', async () => { + const storage = { + getTenantDescendantIds: vi.fn().mockResolvedValue(['t-root', 't-child']), + getTenantsByIds: vi.fn().mockResolvedValue([ + { id: 't-root', type: 'holding' }, + { id: 't-child', type: 'property' }, + ]), + getTransactionsForTenantScope: vi.fn().mockResolvedValue([ + { + id: 'tx-1', + tenantId: 't-root', + tenantName: 'Root Entity', + tenantType: 'holding', + tenantMetadata: { state: 'IL' }, + amount: '1000.00', + type: 'income', + category: 'rent', + description: 'Rent income', + date: '2026-01-15T00:00:00.000Z', + reconciled: true, + metadata: {}, + propertyState: 'IL', + }, + { + id: 'tx-2', + tenantId: 't-child', + tenantName: 'Child Entity', + tenantType: 'property', + tenantMetadata: {}, + amount: '-400.00', + type: 'expense', + category: 'maintenance', + description: 'Maintenance expense', + date: '2026-01-16T00:00:00.000Z', + reconciled: false, + metadata: {}, + propertyState: 'IL', + }, + ]), + getInternalIntercompanyLinkedTransactionIds: vi.fn().mockResolvedValue(new Set()), + getAccountsForTenantScope: vi.fn().mockResolvedValue([ + { + id: 'a-1', + tenantId: 't-root', + tenantName: 'Root Entity', + tenantType: 'holding', + type: 'checking', + balance: '5000.00', + currency: 'USD', + }, + ]), + }; + + const app = withStorage(new Hono(), storage); + app.route('/', reportRoutes); + + const res = await app.request( + '/api/reports/consolidated?startDate=2026-01-01&endDate=2026-01-31&federalTaxRate=0.21', + {}, + env as any, + ); + + expect(res.status).toBe(200); + const body = await res.json(); + expect(body.report.totals.income).toBe(1000); + expect(body.report.totals.expenses).toBe(400); + expect(body.report.totals.taxableIncome).toBe(600); + expect(body.preflight.checks.length).toBeGreaterThan(0); + expect(Array.isArray(body.remediationPrompts)).toBe(true); + }); +}); + +describe('integrationRoutes cloudflare proxy', () => { + beforeEach(() => { + vi.restoreAllMocks(); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + it('GET /api/integrations/chittyagent/cloudflare/capabilities returns capability status', async () => { + const app = withStorage(new Hono(), {}); + app.route('/', integrationRoutes); + + const res = await app.request('/api/integrations/chittyagent/cloudflare/capabilities', {}, env as any); + expect(res.status).toBe(200); + const body = await res.json(); + expect(Array.isArray(body.operations)).toBe(true); + expect(body.operations).toContain('workers'); + }); + + it('POST /api/integrations/chittyagent/cloudflare/execute validates intent and rollbackNotes', async () => { + const app = withStorage(new Hono(), {}); + app.route('/', integrationRoutes); + + const res = await app.request('/api/integrations/chittyagent/cloudflare/execute', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ operation: 'workers', action: 'query' }), + }, env as any); + + expect(res.status).toBe(400); + const body = await res.json(); + expect(body.error).toContain('intent and rollbackNotes'); + }); + + it('POST /api/integrations/chittyagent/cloudflare/execute forwards to proxy', async () => { + const fetchMock = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ ok: true, result: 'done' }), { status: 200 }), + ); + vi.stubGlobal('fetch', fetchMock); + + const app = withStorage(new Hono(), {}); + app.route('/', integrationRoutes); + + const res = await app.request('/api/integrations/chittyagent/cloudflare/execute', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + operation: 'workers', + action: 'query', + payload: { script: 'finance-worker' }, + intent: 'Check worker deployment status before cutover.', + rollbackNotes: 'No changes applied; query-only operation.', + }), + }, { + ...env, + CHITTYAGENT_API_TOKEN: 'agent-token', + CHITTYAGENT_API_BASE: 'https://agent.chitty.cc', + } as any); + + expect(res.status).toBe(200); + const body = await res.json(); + expect(body.ok).toBe(true); + expect(fetchMock).toHaveBeenCalledTimes(1); + }); +}); diff --git a/server/app.ts b/server/app.ts index 36685b4..cb95a47 100644 --- a/server/app.ts +++ b/server/app.ts @@ -27,6 +27,7 @@ import { valuationRoutes } from './routes/valuation'; import { portfolioRoutes } from './routes/portfolio'; import { importRoutes } from './routes/import'; import { mcpRoutes } from './routes/mcp'; +import { reportRoutes } from './routes/reports'; import { createDb } from './db/connection'; import { SystemStorage } from './storage/system'; @@ -83,7 +84,7 @@ export function createApp() { const protectedPrefixes = [ '/api/accounts', '/api/transactions', '/api/tenants', '/api/properties', '/api/integrations', '/api/tasks', '/api/ai-messages', '/api/ai', '/api/summary', - '/api/mercury', '/api/github', '/api/charges', '/api/forensics', '/api/portfolio', '/api/import', '/mcp', + '/api/mercury', '/api/github', '/api/charges', '/api/forensics', '/api/portfolio', '/api/import', '/api/reports', '/api/workflows', '/mcp', ]; for (const prefix of protectedPrefixes) { app.use(prefix, ...protectedRoute); @@ -108,6 +109,7 @@ export function createApp() { app.route('/', valuationRoutes); app.route('/', portfolioRoutes); app.route('/', importRoutes); + app.route('/', reportRoutes); app.route('/', mcpRoutes); // ── Fallback: try static assets, then 404 ── diff --git a/server/integrations/doorloopClient.ts b/server/integrations/doorloopClient.ts deleted file mode 100755 index 2733d06..0000000 --- a/server/integrations/doorloopClient.ts +++ /dev/null @@ -1,54 +0,0 @@ -// server/integrations/doorloopClient.ts - -const BASE = "https://app.doorloop.com/api"; - -// Generic fetch helper -export async function dlFetch(path: string, apiKey: string) { - const res = await fetch(`${BASE}${path}`, { - headers: { - Authorization: `bearer ${apiKey}`, - accept: "application/json", - }, - }); - - const text = await res.text(); - const trimmed = text.trim(); - - // Error responses - if (!res.ok) { - throw new Error(`DoorLoop error ${res.status}: ${trimmed}`); - } - - // If HTML is returned instead of JSON - if (trimmed.startsWith("<")) { - // Payments endpoint frequently returns HTML for non-premium accounts - if (path.startsWith("/payments")) { - return { data: [], html: trimmed }; - } - throw new Error("DoorLoop returned HTML instead of JSON."); - } - - // Parse JSON content - try { - return JSON.parse(trimmed); - } catch { - throw new Error(`Invalid JSON from DoorLoop: ${trimmed.slice(0, 200)}`); - } -} - -// ----------------------------- -// API Wrapper Methods -// ----------------------------- - -export async function listProperties(apiKey: string) { - return dlFetch("/properties?limit=200&offset=0", apiKey); -} - -export async function listLeases(apiKey: string) { - return dlFetch("/leases?limit=200&offset=0", apiKey); -} - -export async function listPayments(apiKey: string) { - // Payments endpoint: HTML fallback is handled by dlFetch - return dlFetch("/payments?limit=200&offset=0", apiKey); -} diff --git a/server/lib/batch-import.ts b/server/lib/batch-import.ts index c3a9415..e91d7c3 100644 --- a/server/lib/batch-import.ts +++ b/server/lib/batch-import.ts @@ -5,7 +5,6 @@ */ import { parse } from 'csv-parse/sync'; -import * as XLSX from 'xlsx'; import { z } from 'zod'; import { storage } from '../storage'; import type { InsertTransaction } from '../../database/system.schema'; @@ -72,27 +71,14 @@ export function parseCSV(fileContent: string): TransactionImportRow[] { /** * Parse Excel file to transaction rows + * xlsx package removed due to unpatched high vulnerabilities (GHSA-4r6h-8v6p-xvw6, GHSA-5pgg-2g8v-p4x9). + * Convert .xlsx/.xls to CSV before importing. */ -export function parseExcel(fileBuffer: Buffer): TransactionImportRow[] { - const workbook = XLSX.read(fileBuffer, { type: 'buffer' }); - const sheetName = workbook.SheetNames[0]; - const worksheet = workbook.Sheets[sheetName]; - const records = XLSX.utils.sheet_to_json(worksheet); - - return records.map((record: any) => ({ - date: record.date || record.Date || record.DATE, - amount: record.amount || record.Amount || record.AMOUNT, - type: record.type || record.Type || record.TYPE, - description: record.description || record.Description || record.DESCRIPTION, - category: record.category || record.Category || record.CATEGORY, - accountId: record.accountId || record.account_id, - payee: record.payee || record.Payee || record.PAYEE, - externalId: record.externalId || record.external_id || record.id, - propertyId: record.propertyId || record.property_id, - unitId: record.unitId || record.unit_id, - reconciled: record.reconciled === true || record.reconciled === 'true' || record.reconciled === 1, - metadata: typeof record.metadata === 'object' ? record.metadata : undefined, - })); +export function parseExcel(_fileBuffer: Buffer): TransactionImportRow[] { + throw new Error( + 'Excel import is disabled due to a security vulnerability in the xlsx library. ' + + 'Please convert your file to CSV and import that instead.' + ); } /** diff --git a/server/lib/bookkeeping-workflows.ts b/server/lib/bookkeeping-workflows.ts index 9571765..1d1a3c3 100644 --- a/server/lib/bookkeeping-workflows.ts +++ b/server/lib/bookkeeping-workflows.ts @@ -6,7 +6,6 @@ import { WaveBookkeepingClient } from './wave-bookkeeping'; import { ChittyRentalClient } from './chittyrental-integration'; -import { DoorLoopClient } from './doorloop-integration'; import { StripeConnectClient } from './stripe-connect'; import { storage } from '../storage'; import { logToChronicle } from './chittychronicle-logging'; @@ -34,7 +33,6 @@ export async function runDailyBookkeeping(tenantId: string): Promise<{ synced: { wave: number; rental: number; - doorloop: number; stripe: number; }; categorized: number; @@ -43,7 +41,7 @@ export async function runDailyBookkeeping(tenantId: string): Promise<{ console.log(`Running daily bookkeeping for tenant ${tenantId}`); const result = { - synced: { wave: 0, rental: 0, doorloop: 0, stripe: 0 }, + synced: { wave: 0, rental: 0, stripe: 0 }, categorized: 0, anomalies: 0, }; @@ -69,35 +67,7 @@ export async function runDailyBookkeeping(tenantId: string): Promise<{ } } - // 2. Sync DoorLoop data (real property management system) - const doorloopIntegrations = await storage.listIntegrationsByService('doorloop'); - for (const integration of doorloopIntegrations) { - if (integration.tenantId === tenantId && integration.connected) { - try { - const credentials = integration.credentials as any; - const doorloopClient = new DoorLoopClient(credentials.api_key); - - // Get all DoorLoop properties - const doorloopProperties = await doorloopClient.getProperties(); - - // Sync each property - for (const dlProperty of doorloopProperties) { - const syncResult = await doorloopClient.syncProperty( - dlProperty.id, - tenantId, - new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString() // Last 7 days - ); - - result.synced.doorloop += syncResult.rentPayments + syncResult.expenses; - } - - console.log(`✅ Synced ${doorloopProperties.length} DoorLoop properties`); - } catch (error) { - console.error('DoorLoop sync error:', error); - // Continue with other integrations even if DoorLoop fails - } - } - } + // 2. (DoorLoop removed — property management now handled via TurboTenant CSV import) // 3. Sync ChittyRental data (if using ChittyOS rental service) const properties = await storage.getProperties?.(tenantId); diff --git a/server/lib/chargeAutomation.ts b/server/lib/chargeAutomation.ts index 8dc129c..99e5a0f 100755 --- a/server/lib/chargeAutomation.ts +++ b/server/lib/chargeAutomation.ts @@ -42,10 +42,6 @@ export async function getRecurringCharges(userId: number | string): Promise { - console.warn('DoorLoop recurring charge detection not yet implemented'); - return []; -} - // TODO: Wire to Stripe API (real integration exists in stripe.ts) async function fetchStripeCharges(_integration: Integration): Promise { console.warn('Stripe recurring charge detection not yet implemented'); diff --git a/server/lib/chittyagent-cloudflare.ts b/server/lib/chittyagent-cloudflare.ts new file mode 100644 index 0000000..1b368d3 --- /dev/null +++ b/server/lib/chittyagent-cloudflare.ts @@ -0,0 +1,84 @@ +export interface CloudflareProxyEnv { + CHITTYAGENT_API_BASE?: string; + CHITTYAGENT_API_TOKEN?: string; + CHITTY_AUTH_SERVICE_TOKEN?: string; +} + +export interface CloudflareProxyRequest { + operation: string; + action: string; + payload?: Record; + intent?: string; + rollbackNotes?: string; +} + +const ALLOWED_OPERATIONS = new Set(['workers', 'pages', 'r2', 'd1', 'kv', 'dns']); + +function normalizeBase(base?: string): string { + return (base || 'https://agent.chitty.cc').replace(/\/$/, ''); +} + +export function getCloudflareProxyCapabilities(env: CloudflareProxyEnv) { + return { + enabled: Boolean(env.CHITTYAGENT_API_TOKEN || env.CHITTY_AUTH_SERVICE_TOKEN), + endpoint: `${normalizeBase(env.CHITTYAGENT_API_BASE)}/api/cloudflare`, + operations: Array.from(ALLOWED_OPERATIONS), + actions: ['query', 'configure', 'deploy'], + checks: { + hasBaseUrl: Boolean(normalizeBase(env.CHITTYAGENT_API_BASE)), + hasAuthToken: Boolean(env.CHITTYAGENT_API_TOKEN || env.CHITTY_AUTH_SERVICE_TOKEN), + }, + }; +} + +export async function invokeCloudflareProxy( + env: CloudflareProxyEnv, + request: CloudflareProxyRequest, +) { + const token = env.CHITTYAGENT_API_TOKEN || env.CHITTY_AUTH_SERVICE_TOKEN; + if (!token) { + throw new Error('Cloudflare proxy token missing (CHITTYAGENT_API_TOKEN or CHITTY_AUTH_SERVICE_TOKEN).'); + } + if (!request.operation || !ALLOWED_OPERATIONS.has(request.operation)) { + throw new Error(`Unsupported operation "${request.operation}". Allowed: ${Array.from(ALLOWED_OPERATIONS).join(', ')}`); + } + if (!request.action) { + throw new Error('action is required'); + } + if (!request.intent) { + throw new Error('intent is required for auditability'); + } + if (!request.rollbackNotes) { + throw new Error('rollbackNotes is required'); + } + + const endpoint = `${normalizeBase(env.CHITTYAGENT_API_BASE)}/api/cloudflare`; + const response = await fetch(endpoint, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${token}`, + }, + body: JSON.stringify({ + operation: request.operation, + action: request.action, + payload: request.payload || {}, + intent: request.intent, + rollbackNotes: request.rollbackNotes, + }), + signal: AbortSignal.timeout(15_000), + }); + + let body: unknown = null; + try { + body = await response.json(); + } catch { + body = await response.text(); + } + + return { + ok: response.ok, + status: response.status, + data: body, + }; +} diff --git a/server/lib/consolidated-reporting.ts b/server/lib/consolidated-reporting.ts new file mode 100644 index 0000000..9bcdf91 --- /dev/null +++ b/server/lib/consolidated-reporting.ts @@ -0,0 +1,530 @@ +type NumberLike = string | number | null | undefined; + +const NON_DEDUCTIBLE_EXPENSE_CATEGORIES = new Set([ + 'personal', + 'owner_draw', + 'owner_distribution', + 'distribution', + 'income_tax', + 'federal_tax', + 'state_tax', + 'estimated_tax', + 'penalty', + 'fine', +]); + +const LIABILITY_ACCOUNT_TYPES = new Set(['credit', 'mortgage', 'loan', 'tax_liability']); + +export interface ReportingTransactionRow { + id: string; + tenantId: string; + tenantName: string; + tenantType: string; + tenantMetadata: unknown; + amount: string; + type: string; + category: string | null; + date: Date | string; + reconciled: boolean; + metadata: unknown; + propertyState: string | null; +} + +export interface ReportingAccountRow { + id: string; + tenantId: string; + tenantName: string; + tenantType: string; + type: string; + balance: string; + currency: string; +} + +export interface TaxRateConfig { + federalTaxRate?: number; + defaultStateTaxRate?: number; + stateTaxRates?: Record; +} + +export interface ConsolidatedReportOptions extends TaxRateConfig { + includeDescendants: boolean; + includeIntercompany: boolean; + strictReadiness: boolean; + stateFilter?: string[]; + entityTypes?: string[]; +} + +export interface ReportQuality { + totalTransactions: number; + uncategorizedTransactions: number; + unreconciledTransactions: number; + unassignedStateTransactions: number; + futureDatedTransactions: number; + internalIntercompanyEliminated: number; +} + +export interface PreflightCheck { + id: string; + status: 'pass' | 'warn' | 'fail'; + message: string; + metric: number; + threshold?: string; +} + +function round2(value: number): number { + return Math.round(value * 100) / 100; +} + +function amount(value: NumberLike): number { + if (typeof value === 'number') return Number.isFinite(value) ? value : 0; + if (typeof value === 'string') { + const parsed = parseFloat(value); + return Number.isFinite(parsed) ? parsed : 0; + } + return 0; +} + +function asObject(input: unknown): Record { + if (!input || typeof input !== 'object' || Array.isArray(input)) return {}; + return input as Record; +} + +function normalizeState(raw: unknown): string { + if (!raw || typeof raw !== 'string') return 'UNASSIGNED'; + const clean = raw.trim().toUpperCase(); + return clean || 'UNASSIGNED'; +} + +export function detectTransactionState(tx: ReportingTransactionRow): string { + if (tx.propertyState) return normalizeState(tx.propertyState); + + const txMetadata = asObject(tx.metadata); + if (typeof txMetadata.state === 'string') { + return normalizeState(txMetadata.state); + } + + const tenantMetadata = asObject(tx.tenantMetadata); + if (typeof tenantMetadata.state === 'string') { + return normalizeState(tenantMetadata.state); + } + + return 'UNASSIGNED'; +} + +function isUncategorized(category: string | null): boolean { + if (!category) return true; + const normalized = category.trim().toLowerCase(); + return normalized === '' || normalized === 'uncategorized' || normalized === 'other_expense' || normalized === 'other_income'; +} + +function isDeductibleExpense(category: string | null, metadata: unknown): boolean { + const meta = asObject(metadata); + if (typeof meta.deductible === 'boolean') return meta.deductible; + if (typeof meta.nonDeductible === 'boolean') return !meta.nonDeductible; + + const normalizedCategory = (category || '').trim().toLowerCase(); + if (!normalizedCategory) return true; + return !NON_DEDUCTIBLE_EXPENSE_CATEGORIES.has(normalizedCategory); +} + +function parseDate(input: Date | string): Date | null { + const parsed = input instanceof Date ? input : new Date(input); + return Number.isNaN(parsed.getTime()) ? null : parsed; +} + +function stateRateFor(state: string, config: TaxRateConfig): number | null { + const mapRate = config.stateTaxRates?.[state]; + if (typeof mapRate === 'number' && Number.isFinite(mapRate)) return mapRate; + if (typeof config.defaultStateTaxRate === 'number' && Number.isFinite(config.defaultStateTaxRate)) { + return config.defaultStateTaxRate; + } + return null; +} + +export function parseStateTaxRates(raw: string | undefined): Record | undefined { + if (!raw) return undefined; + const parsed = JSON.parse(raw); + if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) { + throw new Error('stateTaxRates must be a JSON object like {"IL":0.0495}'); + } + const out: Record = {}; + for (const [key, value] of Object.entries(parsed)) { + if (typeof value !== 'number' || !Number.isFinite(value)) { + throw new Error(`stateTaxRates.${key} must be a finite number`); + } + out[normalizeState(key)] = value; + } + return out; +} + +export function buildConsolidatedReport(params: { + startDate: string; + endDate: string; + tenantIds: string[]; + transactions: ReportingTransactionRow[]; + accounts: ReportingAccountRow[]; + options: ConsolidatedReportOptions; + internalIntercompanyEliminated: number; +}) { + const quality: ReportQuality = { + totalTransactions: 0, + uncategorizedTransactions: 0, + unreconciledTransactions: 0, + unassignedStateTransactions: 0, + futureDatedTransactions: 0, + internalIntercompanyEliminated: params.internalIntercompanyEliminated, + }; + + const entityMap = new Map(); + const stateMap = new Map(); + + let totalIncome = 0; + let totalExpenses = 0; + let totalDeductibleExpenses = 0; + let totalNonDeductibleExpenses = 0; + + const now = Date.now(); + + for (const tx of params.transactions) { + quality.totalTransactions += 1; + + const txDate = parseDate(tx.date); + if (!txDate || txDate.getTime() > now) quality.futureDatedTransactions += 1; + if (!tx.reconciled) quality.unreconciledTransactions += 1; + if (isUncategorized(tx.category)) quality.uncategorizedTransactions += 1; + + const state = detectTransactionState(tx); + if (state === 'UNASSIGNED') quality.unassignedStateTransactions += 1; + + const rawAmount = amount(tx.amount); + const absAmount = Math.abs(rawAmount); + + if (!entityMap.has(tx.tenantId)) { + entityMap.set(tx.tenantId, { + tenantId: tx.tenantId, + tenantName: tx.tenantName, + tenantType: tx.tenantType, + income: 0, + expenses: 0, + deductibleExpenses: 0, + nonDeductibleExpenses: 0, + netIncome: 0, + taxableIncome: 0, + estimatedFederalTax: null as number | null, + estimatedStateTax: null as number | null, + estimatedTotalTax: null as number | null, + transactionCount: 0, + unreconciledTransactions: 0, + byState: new Map(), + assets: 0, + liabilities: 0, + equity: 0, + }); + } + + if (!stateMap.has(state)) { + stateMap.set(state, { + state, + income: 0, + expenses: 0, + deductibleExpenses: 0, + nonDeductibleExpenses: 0, + taxableIncome: 0, + netIncome: 0, + estimatedStateTax: null as number | null, + }); + } + + const entity = entityMap.get(tx.tenantId); + const stateTotals = stateMap.get(state); + + if (!entity.byState.has(state)) { + entity.byState.set(state, { + state, + income: 0, + expenses: 0, + deductibleExpenses: 0, + nonDeductibleExpenses: 0, + taxableIncome: 0, + netIncome: 0, + estimatedStateTax: null as number | null, + }); + } + + const entityState = entity.byState.get(state); + entity.transactionCount += 1; + if (!tx.reconciled) entity.unreconciledTransactions += 1; + + if (tx.type === 'income') { + entity.income += rawAmount; + stateTotals.income += rawAmount; + entityState.income += rawAmount; + totalIncome += rawAmount; + } else if (tx.type === 'expense') { + const deductible = isDeductibleExpense(tx.category, tx.metadata); + + entity.expenses += absAmount; + stateTotals.expenses += absAmount; + entityState.expenses += absAmount; + totalExpenses += absAmount; + + if (deductible) { + entity.deductibleExpenses += absAmount; + stateTotals.deductibleExpenses += absAmount; + entityState.deductibleExpenses += absAmount; + totalDeductibleExpenses += absAmount; + } else { + entity.nonDeductibleExpenses += absAmount; + stateTotals.nonDeductibleExpenses += absAmount; + entityState.nonDeductibleExpenses += absAmount; + totalNonDeductibleExpenses += absAmount; + } + } + } + + for (const account of params.accounts) { + if (!entityMap.has(account.tenantId)) { + entityMap.set(account.tenantId, { + tenantId: account.tenantId, + tenantName: account.tenantName, + tenantType: account.tenantType, + income: 0, + expenses: 0, + deductibleExpenses: 0, + nonDeductibleExpenses: 0, + netIncome: 0, + taxableIncome: 0, + estimatedFederalTax: null as number | null, + estimatedStateTax: null as number | null, + estimatedTotalTax: null as number | null, + transactionCount: 0, + unreconciledTransactions: 0, + byState: new Map(), + assets: 0, + liabilities: 0, + equity: 0, + }); + } + + const row = entityMap.get(account.tenantId); + + const bal = amount(account.balance); + if (LIABILITY_ACCOUNT_TYPES.has(account.type)) { + row.liabilities += Math.abs(bal); + } else { + row.assets += bal; + } + row.equity = row.assets - row.liabilities; + } + + const federalRate = params.options.federalTaxRate; + let estimatedStateTaxTotal = 0; + let estimatedFederalTaxTotal = 0; + + const byEntity = Array.from(entityMap.values()).map((entity) => { + entity.netIncome = entity.income - entity.expenses; + entity.taxableIncome = Math.max(0, entity.income - entity.deductibleExpenses); + + if (typeof federalRate === 'number' && Number.isFinite(federalRate)) { + entity.estimatedFederalTax = round2(entity.taxableIncome * federalRate); + estimatedFederalTaxTotal += entity.estimatedFederalTax; + } + + let entityStateTax = 0; + const entityStates = Array.from(entity.byState.values()).map((stateRow: any) => { + stateRow.netIncome = stateRow.income - stateRow.expenses; + stateRow.taxableIncome = Math.max(0, stateRow.income - stateRow.deductibleExpenses); + + const stateRate = stateRateFor(stateRow.state, params.options); + if (stateRate !== null) { + stateRow.estimatedStateTax = round2(stateRow.taxableIncome * stateRate); + entityStateTax += stateRow.estimatedStateTax; + } + + return { + ...stateRow, + income: round2(stateRow.income), + expenses: round2(stateRow.expenses), + deductibleExpenses: round2(stateRow.deductibleExpenses), + nonDeductibleExpenses: round2(stateRow.nonDeductibleExpenses), + taxableIncome: round2(stateRow.taxableIncome), + netIncome: round2(stateRow.netIncome), + }; + }).sort((a: any, b: any) => b.income - a.income); + + if (entityStates.some((s: any) => s.estimatedStateTax !== null)) { + entity.estimatedStateTax = round2(entityStateTax); + estimatedStateTaxTotal += entity.estimatedStateTax; + } + + if (entity.estimatedFederalTax !== null || entity.estimatedStateTax !== null) { + entity.estimatedTotalTax = round2((entity.estimatedFederalTax || 0) + (entity.estimatedStateTax || 0)); + } + + return { + ...entity, + income: round2(entity.income), + expenses: round2(entity.expenses), + deductibleExpenses: round2(entity.deductibleExpenses), + nonDeductibleExpenses: round2(entity.nonDeductibleExpenses), + netIncome: round2(entity.netIncome), + taxableIncome: round2(entity.taxableIncome), + assets: round2(entity.assets), + liabilities: round2(entity.liabilities), + equity: round2(entity.equity), + byState: entityStates, + }; + }).sort((a, b) => b.taxableIncome - a.taxableIncome); + + const byState = Array.from(stateMap.values()).map((stateRow) => { + stateRow.netIncome = stateRow.income - stateRow.expenses; + stateRow.taxableIncome = Math.max(0, stateRow.income - stateRow.deductibleExpenses); + + const stateRate = stateRateFor(stateRow.state, params.options); + if (stateRate !== null) { + stateRow.estimatedStateTax = round2(stateRow.taxableIncome * stateRate); + } + + return { + ...stateRow, + income: round2(stateRow.income), + expenses: round2(stateRow.expenses), + deductibleExpenses: round2(stateRow.deductibleExpenses), + nonDeductibleExpenses: round2(stateRow.nonDeductibleExpenses), + taxableIncome: round2(stateRow.taxableIncome), + netIncome: round2(stateRow.netIncome), + }; + }).sort((a, b) => b.taxableIncome - a.taxableIncome); + + const assets = byEntity.reduce((sum, row) => sum + row.assets, 0); + const liabilities = byEntity.reduce((sum, row) => sum + row.liabilities, 0); + + const taxableIncome = Math.max(0, totalIncome - totalDeductibleExpenses); + const totalNet = totalIncome - totalExpenses; + const estimatedTotalTax = + (typeof federalRate === 'number' ? estimatedFederalTaxTotal : 0) + + (estimatedStateTaxTotal > 0 ? estimatedStateTaxTotal : 0); + + return { + period: { startDate: params.startDate, endDate: params.endDate }, + scope: { + tenantIds: params.tenantIds, + includeDescendants: params.options.includeDescendants, + includeIntercompany: params.options.includeIntercompany, + stateFilter: params.options.stateFilter || null, + entityTypes: params.options.entityTypes || null, + }, + totals: { + income: round2(totalIncome), + expenses: round2(totalExpenses), + deductibleExpenses: round2(totalDeductibleExpenses), + nonDeductibleExpenses: round2(totalNonDeductibleExpenses), + netIncome: round2(totalNet), + taxableIncome: round2(taxableIncome), + estimatedFederalTax: typeof federalRate === 'number' ? round2(estimatedFederalTaxTotal) : null, + estimatedStateTax: estimatedStateTaxTotal > 0 ? round2(estimatedStateTaxTotal) : null, + estimatedTotalTax: estimatedTotalTax > 0 ? round2(estimatedTotalTax) : null, + assets: round2(assets), + liabilities: round2(liabilities), + equity: round2(assets - liabilities), + }, + byEntity, + byState, + quality, + }; +} + +export function buildPreflightChecks( + report: ReturnType, + strictReadiness: boolean, +) { + const checks: PreflightCheck[] = []; + const quality = report.quality; + const total = Math.max(1, quality.totalTransactions); + + checks.push({ + id: 'future-dated-transactions', + status: quality.futureDatedTransactions > 0 ? 'fail' : 'pass', + message: quality.futureDatedTransactions > 0 + ? 'Future-dated transactions detected; close/tax report is not filing-ready.' + : 'No future-dated transactions detected.', + metric: quality.futureDatedTransactions, + threshold: '0', + }); + + checks.push({ + id: 'state-attribution', + status: quality.unassignedStateTransactions > 0 ? 'warn' : 'pass', + message: quality.unassignedStateTransactions > 0 + ? 'Some transactions have no state attribution; multi-state tax allocations may be incomplete.' + : 'All transactions are state-attributed.', + metric: quality.unassignedStateTransactions, + threshold: '0', + }); + + checks.push({ + id: 'categorization-quality', + status: quality.uncategorizedTransactions / total > 0.05 ? 'warn' : 'pass', + message: quality.uncategorizedTransactions / total > 0.05 + ? 'More than 5% of transactions are uncategorized.' + : 'Transaction categorization is within threshold.', + metric: quality.uncategorizedTransactions, + threshold: '<= 5%', + }); + + checks.push({ + id: 'reconciliation-coverage', + status: quality.unreconciledTransactions / total > 0.1 ? 'warn' : 'pass', + message: quality.unreconciledTransactions / total > 0.1 + ? 'More than 10% of transactions are unreconciled.' + : 'Reconciliation coverage is within threshold.', + metric: quality.unreconciledTransactions, + threshold: '<= 10%', + }); + + checks.push({ + id: 'intercompany-elimination', + status: quality.internalIntercompanyEliminated > 0 ? 'pass' : 'warn', + message: quality.internalIntercompanyEliminated > 0 + ? 'Internal intercompany entries were eliminated from consolidated totals.' + : 'No internal intercompany eliminations were applied in this run.', + metric: quality.internalIntercompanyEliminated, + threshold: '>= 1 when intercompany activity exists', + }); + + const hasFail = checks.some((check) => check.status === 'fail'); + const hasWarn = checks.some((check) => check.status === 'warn'); + const readyToFileTaxes = !hasFail && (!strictReadiness || !hasWarn); + + return { + checks, + readyToFileTaxes, + strictReadiness, + }; +} + +export function buildRemediationPrompts(checks: PreflightCheck[]) { + const prompts: string[] = []; + + for (const check of checks) { + if (check.status === 'pass') continue; + + if (check.id === 'future-dated-transactions') { + prompts.push('Review and correct future-dated transactions before generating tax filing schedules.'); + } + if (check.id === 'state-attribution') { + prompts.push('Assign state codes to UNASSIGNED transactions using property/state metadata before state tax allocation.'); + } + if (check.id === 'categorization-quality') { + prompts.push('Classify uncategorized transactions into chart-of-accounts categories and set deductible/non-deductible flags.'); + } + if (check.id === 'reconciliation-coverage') { + prompts.push('Reconcile unreconciled transactions against source statements to validate report accuracy.'); + } + if (check.id === 'intercompany-elimination') { + prompts.push('Verify intercompany mappings so internal transfers are eliminated in consolidated reporting.'); + } + } + + return prompts; +} diff --git a/server/lib/doorloop-integration.ts b/server/lib/doorloop-integration.ts deleted file mode 100644 index 8bf9c99..0000000 --- a/server/lib/doorloop-integration.ts +++ /dev/null @@ -1,545 +0,0 @@ -// @ts-nocheck - TODO: Add proper types -/** - * Enhanced DoorLoop Property Management Integration - * Real-time property management, rent collection, and financial tracking - */ - -import { fetchWithRetry, IntegrationError } from './error-handling'; -import { storage } from '../storage'; -import { logToChronicle } from './chittychronicle-logging'; -import { validateTransaction } from './chittyschema-validation'; - -const DOORLOOP_BASE_URL = 'https://app.doorloop.com/api'; -const DOORLOOP_API_KEY = process.env.DOORLOOP_API_KEY; - -export interface DoorLoopProperty { - id: number; - name: string; - address: { - line1: string; - line2?: string; - city: string; - state: string; - zip: string; - country: string; - full?: string; - }; - type: string; - units: number; - status: string; - portfolio?: { - id: number; - name: string; - }; - createdAt: string; - updatedAt: string; -} - -export interface DoorLoopUnit { - id: number; - propertyId: number; - name: string; - bedrooms: number; - bathrooms: number; - sqft?: number; - marketRent?: number; - status: string; - createdAt: string; -} - -export interface DoorLoopLease { - id: number; - propertyId: number; - unitId?: number; - tenant: { - id: number; - name: string; - email?: string; - phone?: string; - }; - startDate: string; - endDate: string; - monthlyRent: number; - securityDeposit: number; - status: 'active' | 'past' | 'future' | 'terminated'; - leaseType: string; - createdAt: string; - updatedAt: string; -} - -export interface DoorLoopPayment { - id: number; - leaseId: number; - tenantId: number; - amount: number; - date: string; - status: 'pending' | 'cleared' | 'void' | 'bounced'; - paymentMethod: string; - memo?: string; - reference?: string; - createdAt: string; -} - -export interface DoorLoopExpense { - id: number; - propertyId: number; - amount: number; - date: string; - category: string; - vendor?: string; - description: string; - status: string; - createdAt: string; -} - -export interface DoorLoopMaintenanceRequest { - id: number; - propertyId: number; - unitId?: number; - title: string; - description: string; - priority: 'low' | 'medium' | 'high' | 'emergency'; - status: 'open' | 'in_progress' | 'completed' | 'cancelled'; - assignedTo?: string; - createdAt: string; - updatedAt: string; -} - -/** - * DoorLoop API Client - */ -export class DoorLoopClient { - private apiKey: string; - private baseUrl: string; - - constructor(apiKey?: string, baseUrl: string = DOORLOOP_BASE_URL) { - this.apiKey = apiKey || DOORLOOP_API_KEY || ''; - this.baseUrl = baseUrl; - - if (!this.apiKey) { - throw new Error('DoorLoop API key is required. Set DOORLOOP_API_KEY environment variable.'); - } - } - - private async request(endpoint: string, options?: RequestInit): Promise { - const url = `${this.baseUrl}${endpoint}`; - - const response = await fetchWithRetry( - url, - { - ...options, - headers: { - 'Authorization': `Bearer ${this.apiKey}`, - 'Accept': 'application/json', - 'Content-Type': 'application/json', - ...options?.headers, - }, - }, - { - maxRetries: 2, - baseDelay: 1000, - } - ); - - const text = await response.text(); - const trimmed = text.trim(); - - // Error responses - if (!response.ok) { - throw new IntegrationError( - `DoorLoop API error ${response.status}: ${trimmed}`, - 'doorloop', - response.status >= 500 - ); - } - - // If HTML is returned instead of JSON (non-premium account) - if (trimmed.startsWith('<')) { - // Payments endpoint frequently returns HTML for non-premium accounts - if (endpoint.startsWith('/payments')) { - console.warn('⚠️ DoorLoop payments endpoint returned HTML (likely requires premium account)'); - return { data: [], html: trimmed, isPremiumRequired: true } as unknown as T; - } - throw new IntegrationError( - 'DoorLoop returned HTML instead of JSON. This may require a premium account.', - 'doorloop', - false - ); - } - - // Parse JSON content - try { - return JSON.parse(trimmed); - } catch (error) { - throw new IntegrationError( - `Invalid JSON from DoorLoop: ${trimmed.slice(0, 200)}`, - 'doorloop', - false - ); - } - } - - /** - * Get all properties - */ - async getProperties(limit: number = 200, offset: number = 0): Promise { - const response = await this.request<{ data: DoorLoopProperty[] }>( - `/properties?limit=${limit}&offset=${offset}` - ); - return response.data || []; - } - - /** - * Get property by ID - */ - async getProperty(propertyId: number): Promise { - const response = await this.request(`/properties/${propertyId}`); - return response; - } - - /** - * Get units for a property - */ - async getUnits(propertyId: number): Promise { - const response = await this.request<{ data: DoorLoopUnit[] }>( - `/properties/${propertyId}/units` - ); - return response.data || []; - } - - /** - * Get all leases - */ - async getLeases(limit: number = 200, offset: number = 0): Promise { - const response = await this.request<{ data: DoorLoopLease[] }>( - `/leases?limit=${limit}&offset=${offset}` - ); - return response.data || []; - } - - /** - * Get leases for a specific property - */ - async getPropertyLeases(propertyId: number): Promise { - const allLeases = await this.getLeases(); - return allLeases.filter(lease => lease.propertyId === propertyId); - } - - /** - * Get lease by ID - */ - async getLease(leaseId: number): Promise { - const response = await this.request(`/leases/${leaseId}`); - return response; - } - - /** - * Get payments (may require premium account) - */ - async getPayments(limit: number = 200, offset: number = 0): Promise { - const response = await this.request<{ data: DoorLoopPayment[]; isPremiumRequired?: boolean }>( - `/payments?limit=${limit}&offset=${offset}` - ); - - if (response.isPremiumRequired) { - console.warn('⚠️ DoorLoop payments require premium account - returning empty array'); - return []; - } - - return response.data || []; - } - - /** - * Get payments for a specific lease - */ - async getLeasePayments(leaseId: number): Promise { - try { - const allPayments = await this.getPayments(); - return allPayments.filter(payment => payment.leaseId === leaseId); - } catch (error) { - console.warn(`Failed to fetch payments for lease ${leaseId}:`, error); - return []; - } - } - - /** - * Get expenses - */ - async getExpenses(limit: number = 200, offset: number = 0): Promise { - const response = await this.request<{ data: DoorLoopExpense[] }>( - `/expenses?limit=${limit}&offset=${offset}` - ); - return response.data || []; - } - - /** - * Get maintenance requests - */ - async getMaintenanceRequests(propertyId?: number): Promise { - const endpoint = propertyId - ? `/maintenance?propertyId=${propertyId}` - : '/maintenance'; - - const response = await this.request<{ data: DoorLoopMaintenanceRequest[] }>(endpoint); - return response.data || []; - } - - /** - * Find property by address - */ - async findPropertyByAddress(searchAddress: string): Promise { - const properties = await this.getProperties(); - return properties.find(p => - p.address?.line1?.toLowerCase().includes(searchAddress.toLowerCase()) || - p.address?.full?.toLowerCase().includes(searchAddress.toLowerCase()) || - p.name?.toLowerCase().includes(searchAddress.toLowerCase()) - ); - } - - /** - * Sync rent payments to ChittyFinance - */ - async syncRentPayments(propertyId: number, tenantId: string, startDate?: string): Promise<{ - synced: number; - errors: string[]; - }> { - let synced = 0; - const errors: string[] = []; - - try { - const leases = await this.getPropertyLeases(propertyId); - - for (const lease of leases) { - try { - const payments = await this.getLeasePayments(lease.id); - - for (const payment of payments) { - // Filter by start date if provided - if (startDate && new Date(payment.date) < new Date(startDate)) { - continue; - } - - // Only sync cleared payments - if (payment.status !== 'cleared') { - continue; - } - - // Check if already synced - const existing = await storage.getTransactions(tenantId); - const alreadySynced = existing.some(t => t.externalId === `doorloop-payment-${payment.id}`); - - if (!alreadySynced) { - const transactionData = { - tenantId, - accountId: 'doorloop-rent-income', // Would map to correct account - amount: payment.amount.toString(), - type: 'income', - description: `Rent payment - ${lease.tenant.name}`, - date: new Date(payment.date), - category: 'rent_income', - payee: lease.tenant.name, - externalId: `doorloop-payment-${payment.id}`, - propertyId: propertyId.toString(), - reconciled: true, - metadata: { - source: 'doorloop', - leaseId: lease.id, - paymentMethod: payment.paymentMethod, - reference: payment.reference, - }, - }; - - // Validate with ChittySchema - try { - const validation = await validateTransaction(transactionData); - if (!validation.valid) { - errors.push(`Validation failed for payment ${payment.id}: ${validation.errors?.map(e => e.message).join(', ')}`); - continue; - } - } catch (error) { - // Log validation error but continue (schema service may be unavailable) - console.warn(`ChittySchema validation unavailable for payment ${payment.id}:`, error); - } - - await storage.createTransaction(transactionData); - synced++; - } - } - } catch (error) { - errors.push(`Failed to sync lease ${lease.id}: ${error}`); - } - } - - // Log sync - await logToChronicle({ - eventType: 'integration_sync', - entityId: tenantId, - entityType: 'tenant', - action: 'doorloop_rent_sync', - metadata: { - propertyId, - synced, - errors: errors.length, - timestamp: new Date().toISOString(), - }, - }); - - } catch (error) { - errors.push(`Sync failed: ${error}`); - } - - return { synced, errors }; - } - - /** - * Sync property expenses to ChittyFinance - */ - async syncExpenses(propertyId: number, tenantId: string, startDate?: string): Promise<{ - synced: number; - errors: string[]; - }> { - let synced = 0; - const errors: string[] = []; - - try { - const allExpenses = await this.getExpenses(); - const propertyExpenses = allExpenses.filter(e => e.propertyId === propertyId); - - for (const expense of propertyExpenses) { - // Filter by start date if provided - if (startDate && new Date(expense.date) < new Date(startDate)) { - continue; - } - - try { - // Check if already synced - const existing = await storage.getTransactions(tenantId); - const alreadySynced = existing.some(t => t.externalId === `doorloop-expense-${expense.id}`); - - if (!alreadySynced) { - const transactionData = { - tenantId, - accountId: 'doorloop-expense-account', - amount: (-expense.amount).toString(), - type: 'expense', - description: expense.description, - date: new Date(expense.date), - category: expense.category || 'other_expense', - payee: expense.vendor, - externalId: `doorloop-expense-${expense.id}`, - propertyId: propertyId.toString(), - reconciled: true, - metadata: { - source: 'doorloop', - expenseStatus: expense.status, - }, - }; - - // Validate with ChittySchema - try { - const validation = await validateTransaction(transactionData); - if (!validation.valid) { - errors.push(`Validation failed for expense ${expense.id}: ${validation.errors?.map(e => e.message).join(', ')}`); - continue; - } - } catch (error) { - // Log validation error but continue (schema service may be unavailable) - console.warn(`ChittySchema validation unavailable for expense ${expense.id}:`, error); - } - - await storage.createTransaction(transactionData); - synced++; - } - } catch (error) { - errors.push(`Failed to sync expense ${expense.id}: ${error}`); - } - } - - // Log sync - await logToChronicle({ - eventType: 'integration_sync', - entityId: tenantId, - entityType: 'tenant', - action: 'doorloop_expense_sync', - metadata: { - propertyId, - synced, - errors: errors.length, - timestamp: new Date().toISOString(), - }, - }); - - } catch (error) { - errors.push(`Expense sync failed: ${error}`); - } - - return { synced, errors }; - } - - /** - * Full sync for a property - */ - async syncProperty(propertyId: number, tenantId: string, startDate?: string): Promise<{ - rentPayments: number; - expenses: number; - errors: string[]; - }> { - const [rentResult, expenseResult] = await Promise.all([ - this.syncRentPayments(propertyId, tenantId, startDate), - this.syncExpenses(propertyId, tenantId, startDate), - ]); - - return { - rentPayments: rentResult.synced, - expenses: expenseResult.synced, - errors: [...rentResult.errors, ...expenseResult.errors], - }; - } - - /** - * Debug: Test API connection - */ - async testConnection(): Promise<{ - connected: boolean; - properties: number; - leases: number; - paymentsAvailable: boolean; - error?: string; - }> { - try { - const properties = await this.getProperties(1, 0); - const leases = await this.getLeases(1, 0); - - let paymentsAvailable = false; - try { - const payments = await this.getPayments(1, 0); - paymentsAvailable = payments.length >= 0; - } catch (error) { - // Payments may not be available on free tier - paymentsAvailable = false; - } - - return { - connected: true, - properties: properties.length, - leases: leases.length, - paymentsAvailable, - }; - } catch (error) { - return { - connected: false, - properties: 0, - leases: 0, - paymentsAvailable: false, - error: error instanceof Error ? error.message : 'Unknown error', - }; - } - } -} - -/** - * Create DoorLoop client instance - */ -export function createDoorLoopClient(apiKey?: string): DoorLoopClient { - return new DoorLoopClient(apiKey); -} diff --git a/server/lib/doorloop-sync.ts b/server/lib/doorloop-sync.ts deleted file mode 100755 index 4e9aa24..0000000 --- a/server/lib/doorloop-sync.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { DoorLoop } from "./doorloop.js"; -import { storage } from "../storage.js"; - -export async function syncDoorLoopFull(userId: string, tenantId?: string) { - const [props, leases, payments] = await Promise.all([ - DoorLoop.properties() as Promise<{ data?: any[] }>, - DoorLoop.leases() as Promise<{ data?: any[] }>, - DoorLoop.payments() as Promise<{ data?: any[] }>, - ]); - - for (const lease of leases?.data ?? []) { - const ledger = await DoorLoop.ledger(lease.id) as { data?: any[] }; - - for (const e of ledger?.data ?? []) { - const amount = e.amount ?? e.debit ?? e.credit ?? 0; - - await (storage as any).createTransaction({ - userId, - tenantId, - source: "doorloop", - externalId: e.id?.toString?.() ?? undefined, - amount, - date: e.date ?? e.createdAt ?? null, - type: e.type ?? "doorloop_ledger", - description: e.description ?? e.memo ?? null, - }); - } - } - - return { - properties: props?.data ?? [], - leases: leases?.data ?? [], - payments: payments?.data ?? [], - }; -} diff --git a/server/lib/doorloop.ts b/server/lib/doorloop.ts deleted file mode 100755 index 26e7d13..0000000 --- a/server/lib/doorloop.ts +++ /dev/null @@ -1,38 +0,0 @@ -const BASE = process.env.DOORLOOP_BASE_URL || "https://api.doorloop.com/v1"; - -function auth() { - const key = process.env.DOORLOOP_API_KEY; - if (!key) { - throw new Error("DOORLOOP_API_KEY not set"); - } - return { - headers: { - Authorization: `Bearer ${key}`, - "Content-Type": "application/json", - }, - }; -} - -async function get(path: string) { - const res = await fetch(`${BASE}${path}`, auth() as any); - if (!res.ok) { - const text = await res.text(); - throw new Error(`DoorLoop GET ${path} → ${res.status} ${text}`); - } - return res.json(); -} - -export const DoorLoop = { - properties() { - return get("/properties"); - }, - leases() { - return get("/leases"); - }, - payments() { - return get("/payments"); - }, - ledger(leaseId: string) { - return get(`/leases/${leaseId}/ledger`); - }, -}; diff --git a/server/lib/doorloop/index.ts b/server/lib/doorloop/index.ts deleted file mode 100755 index ff7955c..0000000 --- a/server/lib/doorloop/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { - listProperties, - listLeases, - listPayments -} from "../../integrations/doorloopClient.js"; - -const key = process.env.DOORLOOP_API_KEY!; - -export async function dlGetProperties() { - return listProperties(key); -} -export async function dlGetLeases() { - return listLeases(key); -} -export async function dlGetPayments() { - return listPayments(key); -} diff --git a/server/lib/doorloop/normalize.ts b/server/lib/doorloop/normalize.ts deleted file mode 100755 index dd1da8b..0000000 --- a/server/lib/doorloop/normalize.ts +++ /dev/null @@ -1,10 +0,0 @@ -export function normalizeDoorloopTransaction(p: any) { - return { - // ChittyFinance transaction fields - amount: p.amount || p.total || 0, - date: p.date || p.createdAt, - description: p.memo || p.type || "DoorLoop Transaction", - category: "rent", - source: "doorloop", - }; -} diff --git a/server/lib/doorloop/sync.ts b/server/lib/doorloop/sync.ts deleted file mode 100644 index 4083142..0000000 --- a/server/lib/doorloop/sync.ts +++ /dev/null @@ -1,49 +0,0 @@ -// @ts-nocheck - TODO: Add proper types -import { storage } from "../../storage.js"; -import { listProperties, listLeases, listPayments } from "../../integrations/doorloopClient.js"; -import { normalizeDoorloopTransaction } from "./normalize.js"; - -export async function syncDoorloop() { - const apiKey = process.env.DOORLOOP_API_KEY!; - - // Fetch all DoorLoop data - const [properties, leases, payments] = await Promise.all([ - listProperties(apiKey), - listLeases(apiKey), - listPayments(apiKey), - ]); - - // Normalize payments → ChittyFinance transactions - const normalized = []; - for (const p of payments.data || []) { - normalized.push(normalizeDoorloopTransaction(p)); - } - - // Insert into ChittyFinance DB - for (const tx of normalized) { - await storage.createTransaction({ - userId: 1, // demo user - ...tx, - }); - } - - // Log sync event - const payload = { properties, leases, payments }; - const eventId = `doorloop-sync-${new Date().toISOString()}`; - - await storage.recordWebhookEvent({ - source: "doorloop", - eventId, - payload: payload as any, - }); - - return { - eventId, - counts: { - properties: properties?.data?.length ?? 0, - leases: leases?.data?.length ?? 0, - payments: payments?.data?.length ?? 0, - normalizedTransactions: normalized.length, - }, - }; -} diff --git a/server/lib/error-handling.ts b/server/lib/error-handling.ts index 7a6028d..5e3da02 100644 --- a/server/lib/error-handling.ts +++ b/server/lib/error-handling.ts @@ -347,6 +347,5 @@ export const circuitBreakers = { mercury: new CircuitBreaker(5, 60000), wave: new CircuitBreaker(5, 60000), stripe: new CircuitBreaker(5, 60000), - doorloop: new CircuitBreaker(5, 60000), chittyConnect: new CircuitBreaker(3, 30000), }; diff --git a/server/lib/financialServices.ts b/server/lib/financialServices.ts index da0ac8d..58e3d5d 100755 --- a/server/lib/financialServices.ts +++ b/server/lib/financialServices.ts @@ -136,12 +136,6 @@ export async function fetchWavAppsData(integration: Integration): Promise> { - console.warn('DoorLoop integration not yet implemented — returning empty data'); - return {}; -} - // TODO: Wire to Stripe API for financial data (real integration exists in stripe.ts for payments) export async function fetchStripeData(_integration: Integration): Promise> { console.warn('Stripe financial data fetch not yet implemented — returning empty data'); @@ -203,9 +197,6 @@ export async function getAggregatedFinancialData(integrations: Integration[]): P case 'wavapps': serviceData = await fetchWavAppsData(integration); break; - case 'doorloop': - serviceData = await fetchDoorLoopData(integration); - break; case 'stripe': serviceData = await fetchStripeData(integration); break; diff --git a/server/lib/universalConnector.ts b/server/lib/universalConnector.ts index 91a84b5..f4583af 100755 --- a/server/lib/universalConnector.ts +++ b/server/lib/universalConnector.ts @@ -1,9 +1,8 @@ import { Integration } from "@shared/schema"; import { FinancialData } from "./financialServices"; -import { +import { fetchMercuryBankData, fetchWavAppsData, - fetchDoorLoopData, fetchStripeData, fetchQuickBooksData, fetchXeroData, @@ -178,7 +177,6 @@ export async function transformToUniversalFormat( function getSourceFromTransactionId(id: string): string { if (id.startsWith('merc-')) return 'mercury_bank'; if (id.startsWith('wavapps-')) return 'wavapps'; - if (id.startsWith('doorloop-')) return 'doorloop'; if (id.startsWith('stripe-')) return 'stripe'; if (id.startsWith('qb-')) return 'quickbooks'; if (id.startsWith('xero-')) return 'xero'; @@ -193,7 +191,6 @@ function getSourceFromTransactionId(id: string): string { function getSourceFromChargeId(id: string): string { if (id.startsWith('merc-charge-')) return 'mercury_bank'; if (id.startsWith('wavapps-charge-')) return 'wavapps'; - if (id.startsWith('doorloop-charge-')) return 'doorloop'; if (id.startsWith('stripe-charge-')) return 'stripe'; if (id.startsWith('qb-charge-')) return 'quickbooks'; if (id.startsWith('xero-charge-')) return 'xero'; diff --git a/server/routes.ts b/server/routes.ts index ea2eb09..6a078ab 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -915,7 +915,6 @@ export async function registerRoutes(app: Express): Promise { switch (platformId) { case "mercury_bank": case "wavapps": - case "doorloop": case "stripe": case "quickbooks": case "xero": @@ -946,7 +945,7 @@ export async function registerRoutes(app: Express): Promise { let recurringCharges; // Only test recurring charges on platforms that support it - if (["mercury_bank", "wavapps", "doorloop", "stripe", "quickbooks", "xero", "brex"].includes(platformId)) { + if (["mercury_bank", "wavapps", "stripe", "quickbooks", "xero", "brex"].includes(platformId)) { recurringCharges = await getRecurringCharges(user.id); results.tests.push({ diff --git a/server/routes/doorloop.ts b/server/routes/doorloop.ts deleted file mode 100755 index 5b80902..0000000 --- a/server/routes/doorloop.ts +++ /dev/null @@ -1,23 +0,0 @@ -// @ts-nocheck - This file uses Fastify but the project uses Express. Needs migration. -import type { FastifyInstance } from "fastify"; -import { listProperties, listLeases, listPayments } from "../integrations/doorloopClient.js"; - -export default async function doorloopRoutes(app: FastifyInstance) { - app.get("/doorloop/properties", async (req: any, res: any) => { - const apiKey = process.env.DOORLOOP_API_KEY; - const data = await listProperties(apiKey); - return res.send(data); - }); - - app.get("/doorloop/leases", async (req: any, res: any) => { - const apiKey = process.env.DOORLOOP_API_KEY; - const data = await listLeases(apiKey); - return res.send(data); - }); - - app.get("/doorloop/payments", async (req: any, res: any) => { - const apiKey = process.env.DOORLOOP_API_KEY; - const data = await listPayments(apiKey); - return res.send(data); - }); -} diff --git a/server/routes/integrations.ts b/server/routes/integrations.ts index ba6751a..998d2d6 100644 --- a/server/routes/integrations.ts +++ b/server/routes/integrations.ts @@ -1,5 +1,6 @@ import { Hono } from 'hono'; import type { HonoEnv } from '../env'; +import { getCloudflareProxyCapabilities, invokeCloudflareProxy } from '../lib/chittyagent-cloudflare'; export const integrationRoutes = new Hono(); @@ -63,3 +64,36 @@ integrationRoutes.patch('/api/integrations/:id', async (c) => { const updated = await storage.updateIntegration(id, body); return c.json(updated); }); + +// GET /api/integrations/chittyagent/cloudflare/capabilities — list proxy capabilities + config checks +integrationRoutes.get('/api/integrations/chittyagent/cloudflare/capabilities', async (c) => { + const capabilities = getCloudflareProxyCapabilities(c.env); + return c.json(capabilities); +}); + +// POST /api/integrations/chittyagent/cloudflare/execute — execute an audited Cloudflare operation through ChittyAgent proxy +integrationRoutes.post('/api/integrations/chittyagent/cloudflare/execute', async (c) => { + const body = await c.req.json(); + + if (!body.operation || !body.action) { + return c.json({ error: 'operation and action are required' }, 400); + } + if (!body.intent || !body.rollbackNotes) { + return c.json({ error: 'intent and rollbackNotes are required' }, 400); + } + + try { + const result = await invokeCloudflareProxy(c.env, { + operation: body.operation, + action: body.action, + payload: body.payload || {}, + intent: body.intent, + rollbackNotes: body.rollbackNotes, + }); + return c.json(result, result.ok ? 200 : 502); + } catch (error) { + return c.json({ + error: error instanceof Error ? error.message : 'Cloudflare proxy request failed', + }, 400); + } +}); diff --git a/server/routes/reports.ts b/server/routes/reports.ts new file mode 100644 index 0000000..2d14cc8 --- /dev/null +++ b/server/routes/reports.ts @@ -0,0 +1,297 @@ +import { Hono } from 'hono'; +import type { HonoEnv } from '../env'; +import { + buildConsolidatedReport, + buildPreflightChecks, + buildRemediationPrompts, + detectTransactionState, + parseStateTaxRates, + type ConsolidatedReportOptions, + type ReportingAccountRow, + type ReportingTransactionRow, +} from '../lib/consolidated-reporting'; +import { ledgerLog } from '../lib/ledger-client'; + +export const reportRoutes = new Hono(); + +function parseBool(value: unknown, defaultValue: boolean): boolean { + if (typeof value === 'boolean') return value; + if (typeof value !== 'string') return defaultValue; + const normalized = value.trim().toLowerCase(); + if (['1', 'true', 'yes', 'on'].includes(normalized)) return true; + if (['0', 'false', 'no', 'off'].includes(normalized)) return false; + return defaultValue; +} + +function parseCsv(value: unknown): string[] { + if (!value || typeof value !== 'string') return []; + return value.split(',').map((v) => v.trim()).filter(Boolean); +} + +function parseRate(value: unknown): number | undefined { + if (value === undefined || value === null || value === '') return undefined; + const parsed = typeof value === 'number' ? value : parseFloat(String(value)); + if (!Number.isFinite(parsed)) return undefined; + return parsed; +} + +function normalizeDateInput(value: unknown): string { + if (typeof value !== 'string' || !/^\d{4}-\d{2}-\d{2}$/.test(value)) { + throw new Error('Dates must use YYYY-MM-DD format.'); + } + return value; +} + +async function generateAiReview( + env: HonoEnv['Bindings'], + payload: { + report: ReturnType; + checks: ReturnType; + prompts: string[]; + }, +) { + const warningCount = payload.checks.checks.filter((c) => c.status === 'warn').length; + const failCount = payload.checks.checks.filter((c) => c.status === 'fail').length; + + const fallback = [ + `Tax readiness: ${payload.checks.readyToFileTaxes ? 'READY' : 'NOT READY'}.`, + `Scope: ${payload.report.scope.tenantIds.length} entities, ${payload.report.byState.length} states.`, + `Quality: ${warningCount} warnings, ${failCount} failures.`, + payload.prompts.length > 0 + ? `Top remediation: ${payload.prompts[0]}` + : 'No remediation prompts generated.', + ].join(' '); + + const agentBase = env.CHITTYAGENT_API_BASE; + const agentToken = env.CHITTYAGENT_API_TOKEN; + if (!agentBase || !agentToken) { + return { provider: 'rule-based', content: fallback }; + } + + try { + const response = await fetch(`${agentBase.replace(/\/$/, '')}/chat`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${agentToken}`, + }, + body: JSON.stringify({ + service: 'chittyfinance', + context: { + totals: payload.report.totals, + quality: payload.report.quality, + checks: payload.checks.checks, + prompts: payload.prompts, + }, + message: 'Produce a concise tax-close readiness review with top risks and next actions.', + }), + signal: AbortSignal.timeout(10_000), + }); + + if (!response.ok) { + return { provider: 'rule-based', content: fallback }; + } + + const data = await response.json() as Record; + const content = + (typeof data.content === 'string' && data.content) || + (typeof data.response === 'string' && data.response) || + fallback; + + return { provider: 'chittyagent', content }; + } catch { + return { provider: 'rule-based', content: fallback }; + } +} + +async function buildReportForRequest( + storage: any, + tenantId: string, + params: { + startDate: string; + endDate: string; + includeDescendants: boolean; + includeIntercompany: boolean; + strictReadiness: boolean; + stateFilter: string[]; + entityTypes: string[]; + federalTaxRate?: number; + defaultStateTaxRate?: number; + stateTaxRates?: Record; + }, +) { + let tenantIds = params.includeDescendants + ? await storage.getTenantDescendantIds(tenantId) + : [tenantId]; + + if (params.entityTypes.length > 0) { + const tenants = await storage.getTenantsByIds(tenantIds); + const allowed = new Set(params.entityTypes.map((value) => value.toLowerCase())); + tenantIds = tenants + .filter((tenant: any) => allowed.has(String(tenant.type || '').toLowerCase())) + .map((tenant: any) => tenant.id); + } + + const startDateIso = `${params.startDate}T00:00:00.000Z`; + const endDateIso = `${params.endDate}T23:59:59.999Z`; + + let transactions = await storage.getTransactionsForTenantScope( + tenantIds, + startDateIso, + endDateIso, + params.entityTypes, + ) as ReportingTransactionRow[]; + + if (params.stateFilter.length > 0) { + const allowedStates = new Set(params.stateFilter.map((value) => value.trim().toUpperCase())); + transactions = transactions.filter((tx) => allowedStates.has(detectTransactionState(tx))); + } + + let eliminatedIntercompanyCount = 0; + if (!params.includeIntercompany) { + const internalLinks = await storage.getInternalIntercompanyLinkedTransactionIds( + tenantIds, + startDateIso, + endDateIso, + ) as Set; + + const before = transactions.length; + transactions = transactions.filter((tx) => !internalLinks.has(tx.id)); + eliminatedIntercompanyCount = before - transactions.length; + } + + const accounts = await storage.getAccountsForTenantScope(tenantIds) as ReportingAccountRow[]; + const options: ConsolidatedReportOptions = { + includeDescendants: params.includeDescendants, + includeIntercompany: params.includeIntercompany, + strictReadiness: params.strictReadiness, + stateFilter: params.stateFilter, + entityTypes: params.entityTypes, + federalTaxRate: params.federalTaxRate, + defaultStateTaxRate: params.defaultStateTaxRate, + stateTaxRates: params.stateTaxRates, + }; + + const report = buildConsolidatedReport({ + startDate: params.startDate, + endDate: params.endDate, + tenantIds, + transactions, + accounts, + options, + internalIntercompanyEliminated: eliminatedIntercompanyCount, + }); + + const preflight = buildPreflightChecks(report, params.strictReadiness); + const remediationPrompts = buildRemediationPrompts(preflight.checks); + + return { + report, + preflight, + remediationPrompts, + verificationChecklist: preflight.checks.map((item) => ({ + id: item.id, + status: item.status, + message: item.message, + })), + }; +} + +// GET /api/reports/consolidated — multi-entity, multi-state report with verification checks +reportRoutes.get('/api/reports/consolidated', async (c) => { + const storage = c.get('storage'); + const tenantId = c.get('tenantId'); + + try { + const startDate = normalizeDateInput(c.req.query('startDate')); + const endDate = normalizeDateInput(c.req.query('endDate')); + const includeDescendants = parseBool(c.req.query('includeDescendants'), true); + const includeIntercompany = parseBool(c.req.query('includeIntercompany'), false); + const strictReadiness = parseBool(c.req.query('strictReadiness'), false); + const stateFilter = parseCsv(c.req.query('states')); + const entityTypes = parseCsv(c.req.query('entityTypes')); + + const payload = await buildReportForRequest(storage, tenantId, { + startDate, + endDate, + includeDescendants, + includeIntercompany, + strictReadiness, + stateFilter, + entityTypes, + federalTaxRate: parseRate(c.req.query('federalTaxRate')), + defaultStateTaxRate: parseRate(c.req.query('defaultStateTaxRate')), + stateTaxRates: parseStateTaxRates(c.req.query('stateTaxRates')), + }); + + return c.json(payload); + } catch (error) { + return c.json({ + error: error instanceof Error ? error.message : 'Failed to generate consolidated report', + }, 400); + } +}); + +// POST /api/workflows/close-tax-automation — end-to-end automated close + tax readiness workflow +reportRoutes.post('/api/workflows/close-tax-automation', async (c) => { + const storage = c.get('storage'); + const tenantId = c.get('tenantId'); + const body = await c.req.json(); + + try { + const startDate = normalizeDateInput(body.startDate); + const endDate = normalizeDateInput(body.endDate); + const includeDescendants = parseBool(body.includeDescendants, true); + const includeIntercompany = parseBool(body.includeIntercompany, false); + const strictReadiness = parseBool(body.strictReadiness, true); + const stateFilter = Array.isArray(body.states) ? body.states.map(String) : parseCsv(body.states); + const entityTypes = Array.isArray(body.entityTypes) ? body.entityTypes.map(String) : parseCsv(body.entityTypes); + + const payload = await buildReportForRequest(storage, tenantId, { + startDate, + endDate, + includeDescendants, + includeIntercompany, + strictReadiness, + stateFilter, + entityTypes, + federalTaxRate: parseRate(body.federalTaxRate), + defaultStateTaxRate: parseRate(body.defaultStateTaxRate), + stateTaxRates: body.stateTaxRates ? parseStateTaxRates(JSON.stringify(body.stateTaxRates)) : undefined, + }); + + const runAiReview = parseBool(body.runAiReview, true); + const aiReview = runAiReview + ? await generateAiReview(c.env, { + report: payload.report, + checks: payload.preflight, + prompts: payload.remediationPrompts, + }) + : null; + + ledgerLog(c, { + entityType: 'audit', + action: 'workflow.close-tax-automation', + metadata: { + tenantId, + startDate, + endDate, + readyToFileTaxes: payload.preflight.readyToFileTaxes, + warnings: payload.preflight.checks.filter((x) => x.status === 'warn').length, + failures: payload.preflight.checks.filter((x) => x.status === 'fail').length, + }, + }, c.env); + + return c.json({ + runId: `close-${Date.now()}`, + generatedAt: new Date().toISOString(), + ...payload, + aiReview, + nextStep: payload.preflight.readyToFileTaxes ? 'prepare_tax_package' : 'resolve_preflight_issues', + }); + } catch (error) { + return c.json({ + error: error instanceof Error ? error.message : 'Failed to run close-tax automation workflow', + }, 400); + } +}); diff --git a/server/storage/system.ts b/server/storage/system.ts index 6865005..eaacecb 100755 --- a/server/storage/system.ts +++ b/server/storage/system.ts @@ -478,4 +478,125 @@ export class SystemStorage { .returning(); return row; } + + // ── CONSOLIDATED REPORTING HELPERS ── + + async getTenantDescendantIds(rootTenantId: string) { + const seen = new Set(); + const queue: string[] = [rootTenantId]; + + while (queue.length > 0) { + const current = queue.shift()!; + if (seen.has(current)) continue; + seen.add(current); + + const children = await this.db + .select({ id: schema.tenants.id }) + .from(schema.tenants) + .where(eq(schema.tenants.parentId, current)); + + for (const child of children) { + if (!seen.has(child.id)) queue.push(child.id); + } + } + + return Array.from(seen); + } + + async getTenantsByIds(tenantIds: string[]) { + if (tenantIds.length === 0) return []; + return this.db + .select() + .from(schema.tenants) + .where(inArray(schema.tenants.id, tenantIds)); + } + + async getTransactionsForTenantScope( + tenantIds: string[], + startDateIso: string, + endDateIso: string, + entityTypes?: string[], + ) { + if (tenantIds.length === 0) return []; + + const conditions = [ + inArray(schema.transactions.tenantId, tenantIds), + sql`${schema.transactions.date} >= ${startDateIso}`, + sql`${schema.transactions.date} <= ${endDateIso}`, + ]; + + if (entityTypes && entityTypes.length > 0) { + conditions.push(inArray(schema.tenants.type, entityTypes)); + } + + return this.db + .select({ + id: schema.transactions.id, + tenantId: schema.transactions.tenantId, + tenantName: schema.tenants.name, + tenantType: schema.tenants.type, + tenantMetadata: schema.tenants.metadata, + accountId: schema.transactions.accountId, + amount: schema.transactions.amount, + type: schema.transactions.type, + category: schema.transactions.category, + description: schema.transactions.description, + date: schema.transactions.date, + payee: schema.transactions.payee, + propertyId: schema.transactions.propertyId, + propertyState: schema.properties.state, + reconciled: schema.transactions.reconciled, + metadata: schema.transactions.metadata, + }) + .from(schema.transactions) + .innerJoin(schema.tenants, eq(schema.transactions.tenantId, schema.tenants.id)) + .leftJoin(schema.properties, eq(schema.transactions.propertyId, schema.properties.id)) + .where(and(...conditions)) + .orderBy(desc(schema.transactions.date)); + } + + async getAccountsForTenantScope(tenantIds: string[]) { + if (tenantIds.length === 0) return []; + return this.db + .select({ + id: schema.accounts.id, + tenantId: schema.accounts.tenantId, + tenantName: schema.tenants.name, + tenantType: schema.tenants.type, + type: schema.accounts.type, + balance: schema.accounts.balance, + currency: schema.accounts.currency, + }) + .from(schema.accounts) + .innerJoin(schema.tenants, eq(schema.accounts.tenantId, schema.tenants.id)) + .where(inArray(schema.accounts.tenantId, tenantIds)); + } + + async getInternalIntercompanyLinkedTransactionIds( + tenantIds: string[], + startDateIso: string, + endDateIso: string, + ) { + if (tenantIds.length === 0) return new Set(); + + const links = await this.db + .select({ + fromTransactionId: schema.intercompanyTransactions.fromTransactionId, + toTransactionId: schema.intercompanyTransactions.toTransactionId, + }) + .from(schema.intercompanyTransactions) + .where(and( + inArray(schema.intercompanyTransactions.fromTenantId, tenantIds), + inArray(schema.intercompanyTransactions.toTenantId, tenantIds), + sql`${schema.intercompanyTransactions.date} >= ${startDateIso}`, + sql`${schema.intercompanyTransactions.date} <= ${endDateIso}`, + )); + + const ids = new Set(); + for (const row of links) { + if (row.fromTransactionId) ids.add(row.fromTransactionId); + if (row.toTransactionId) ids.add(row.toTransactionId); + } + return ids; + } } diff --git a/theme.json b/theme.json deleted file mode 100755 index 05bfc4a..0000000 --- a/theme.json +++ /dev/null @@ -1,7 +0,0 @@ - -{ - "variant": "vibrant", - "primary": "hsl(265, 84%, 50%)", - "appearance": "dark", - "radius": 1.0 -} diff --git a/unmatched_local_docs.zip b/unmatched_local_docs.zip deleted file mode 100755 index 77189ac..0000000 Binary files a/unmatched_local_docs.zip and /dev/null differ diff --git a/vite.config.ts b/vite.config.ts index d52cc0b..820d7bb 100755 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,35 +1,18 @@ import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; -import themePlugin from "@replit/vite-plugin-shadcn-theme-json"; import path from "path"; -import runtimeErrorOverlay from "@replit/vite-plugin-runtime-error-modal"; -export default defineConfig(async () => { - const plugins: any[] = [ - react(), - runtimeErrorOverlay(), - themePlugin(), - ]; - - if (process.env.NODE_ENV !== "production" && process.env.REPL_ID !== undefined) { - // Load conditionally to avoid type-version mismatches and only include on Replit - const mod: any = await import("@replit/vite-plugin-cartographer"); - if (mod?.cartographer) plugins.push(mod.cartographer()); - } - - return { - plugins, - resolve: { - alias: { - "@": path.resolve(import.meta.dirname, "client", "src"), - "@shared": path.resolve(import.meta.dirname, "shared"), - "@assets": path.resolve(import.meta.dirname, "attached_assets"), - }, - }, - root: path.resolve(import.meta.dirname, "client"), - build: { - outDir: path.resolve(import.meta.dirname, "dist/public"), - emptyOutDir: true, +export default defineConfig({ + plugins: [react()], + resolve: { + alias: { + "@": path.resolve(import.meta.dirname, "client", "src"), + "@shared": path.resolve(import.meta.dirname, "shared"), }, - }; + }, + root: path.resolve(import.meta.dirname, "client"), + build: { + outDir: path.resolve(import.meta.dirname, "dist/public"), + emptyOutDir: true, + }, }); diff --git a/ziEuxr4R b/ziEuxr4R deleted file mode 100755 index e69de29..0000000 diff --git a/zip_local_from_csv.sh b/zip_local_from_csv.sh deleted file mode 100755 index 0d7153c..0000000 --- a/zip_local_from_csv.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/zsh - -CSV="Unmatched_Timeline_Documents_for_Extraction.csv" -ZIP="unmatched_local_docs.zip" - -echo "Reading CSV…" - -# File_Path is 4th TAB-separated column -file_list=("${(@f)$(tail -n +2 "$CSV" | awk -F'\t' '{print $4}' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')}") - -valid_files=() -missing_files=() - -total=${#file_list[@]} -echo "Total rows: $total" - -i=0 -for f in "${file_list[@]}"; do - ((i++)) - printf "\r[%d/%d] Checking…" "$i" "$total" - - # skip empty or non-absolute paths - [[ -z "$f" || "$f" != /* ]] && continue - - if [[ -f "$f" ]]; then - valid_files+=("$f") - else - echo "\nMISSING: $f" - missing_files+=("$f") - fi -done - -echo "" -echo "Creating ZIP…" - -if (( ${#valid_files[@]} == 0 )); then - echo "ERROR: No valid files found. ZIP aborted." - exit 1 -fi - -zip -r "$ZIP" "${valid_files[@]}" - -echo "Done." -echo "Valid: ${#valid_files[@]}" -echo "Missing: ${#missing_files[@]}"