diff --git a/.dockerignore b/.dockerignore index f8da17c..bbb7847 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,10 @@ +# Build output — the image builds its own inside the container +dist +dist-ssr +*.local + +node_modules + # Logs logs *.log @@ -7,13 +14,6 @@ yarn-error.log* pnpm-debug.log* lerna-debug.log* - -node_modules -# dist -!sdk/dist -dist-ssr -*.local - # Editor directories and files .vscode/* !.vscode/extensions.json @@ -25,11 +25,5 @@ dist-ssr *.sln *.sw? -sdk/node_modules -# Explicitly include SDK dist -# !/sdk/dist/* -sdk/build -sdk/coverage -sdk/tests/.env - -.env \ No newline at end of file +.git +.env diff --git a/.gitignore b/.gitignore index 5df5a07..8e0a4c5 100644 --- a/.gitignore +++ b/.gitignore @@ -28,4 +28,3 @@ dist-ssr *.sw? .env -base44/.app.jsonc diff --git a/README.md b/README.md index 9750509..462458b 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,54 @@ -# Base44 Preview Template for MicroVM sandbox +# KROW Workforce Control Tower -This template is used by the server to preview user-apps. +A standalone frontend application. There is no backend, no external API and no +login: the app opens directly into the Control Tower UI, locally and when +deployed, and keeps working with no network at all. -## user files -server creates the user-app files in the __components__, __pages__ folders +``` +Frontend → local data / React state / localStorage → KROW UI +``` -## server injected data -server injects app related data to __app.config.js__, which is used by App.jsx to render the components in the files. +## Running it + +```bash +npm install +npm run dev # http://localhost:5174 +npm run build # static bundle in dist/ +npm run preview # serve the production build locally +``` + +Deployment is a static-file deploy: serve `dist/` with any web server, with a +SPA fallback so deep links (`/Events`, `/Schedule`, …) resolve to `index.html`. +The included `Dockerfile` + `nginx.conf` do exactly that. + +## Where the data lives + +Everything the UI reads and writes goes through one object — `krow`, exported +from [`src/api/client.js`](src/api/client.js): + +| Area | Local implementation | +| --- | --- | +| `krow.entities.*` | [`src/api/local/store.js`](src/api/local/store.js) — collections held in memory and mirrored into `localStorage` | +| Starting data | [`src/api/local/seedData.js`](src/api/local/seedData.js) — the bundled demo dataset, copied in on first read | +| Data model | [`src/api/local/schemas.json`](src/api/local/schemas.json) — entity schemas, loaded on demand for `.schema()` | +| `krow.auth` | [`src/api/local/auth.js`](src/api/local/auth.js) — a single local operator profile; no sign-in | +| `krow.integrations.Core` | [`src/api/local/integrations.js`](src/api/local/integrations.js) — uploads become local data/object URLs; email/SMS are recorded locally | +| `krow.agents` | [`src/api/local/agents.js`](src/api/local/agents.js) — assistant threads stored locally, answered by [`src/lib/owliver/owliverEngine.js`](src/lib/owliver/owliverEngine.js) | + +Edits persist per browser. `krow.resetLocalData()` (from the console, or any +code) clears local data and restores the bundled demo dataset. + +Collections with no seed data start empty, which is the empty state the pages +already render — so adding an entity needs no wiring, only a key in +`seedData.js` if it should start with rows. + +## Layout + +``` +src/ + api/ the local client (client.js) and its implementation (local/) + pages/ one file per route, auto-registered via pages.config.js + components/ feature components and the ui/ primitives + lib/ shared helpers, the Owliver engine and page registry + Layout.jsx the Control Tower shell: header, sidebar, Owliver +``` diff --git a/base44/agents/compliance_agent.jsonc b/base44/agents/compliance_agent.jsonc deleted file mode 100644 index 4ba4bb7..0000000 --- a/base44/agents/compliance_agent.jsonc +++ /dev/null @@ -1,89 +0,0 @@ -{ - "description": "Compliance Agent \u2014 monitors certifications, detects compliance risks, auto-flags expiring documents, manages audit trails. Acts as a digital compliance officer.", - "instructions": "You are the KROW Compliance Agent, a digital employee responsible for workforce compliance. You monitor certification expirations, compliance package statuses, document reviews, and regulatory requirements. You proactively flag risks before they become violations. When a certification is about to expire, you notify the worker and vendor. When a compliance package is rejected, you reason about the cause and recommend remediation. Be thorough and risk-averse \u2014 compliance failures are costly.", - "tool_configs": [ - { - "entity_name": "WorkforceEvent", - "allowed_operations": [ - "create", - "read" - ] - }, - { - "entity_name": "OperationalMemory", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "CompliancePackage", - "allowed_operations": [ - "read", - "update" - ] - }, - { - "entity_name": "Certification", - "allowed_operations": [ - "read", - "update" - ] - }, - { - "entity_name": "EmployeeDocument", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "VendorDocumentReview", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "Workforce", - "allowed_operations": [ - "read", - "update" - ] - }, - { - "entity_name": "DecisionQueue", - "allowed_operations": [ - "create", - "read" - ] - }, - { - "entity_name": "AgentActivity", - "allowed_operations": [ - "create", - "read" - ] - }, - { - "function_name": "reasonAboutEvent", - "description": "Trigger reasoning engine for compliance events" - } - ], - "context_files": [], - "app_user_connector_configs": [], - "selected_skill_names": [], - "selected_workspace_skill_ids": [], - "model": "automatic", - "whatsapp_greeting": null, - "telegram_greeting": null, - "line_greeting": null, - "memory_config": { - "enabled": true, - "scope": "both", - "include_other_conversation_context": false, - "instructions": null - }, - "voice_config": { - "voice_id": null - }, - "allow_anonymous_access": false, - "name": "compliance_agent" -} \ No newline at end of file diff --git a/base44/agents/executive_agent.jsonc b/base44/agents/executive_agent.jsonc deleted file mode 100644 index 6ab2a5b..0000000 --- a/base44/agents/executive_agent.jsonc +++ /dev/null @@ -1,81 +0,0 @@ -{ - "description": "Executive Agent \u2014 provides strategic cross-department insights, forecasts trends, identifies systemic patterns. Acts as a digital chief of staff for workforce strategy.", - "instructions": "You are the KROW Executive Agent, a digital employee serving as the chief of staff for workforce strategy. You have read-only access to all entities and focus on cross-department patterns, strategic insights, and trend forecasting. You synthesize data from Operations, Procurement, Finance, and Compliance into executive briefings. You identify systemic issues (e.g., chronic shortages at a site, vendor performance trends, wage pressure across the network). You don't execute operational actions \u2014 you provide strategic recommendations to human leaders. Be concise, strategic, and focused on what matters most.", - "tool_configs": [ - { - "entity_name": "WorkforceEvent", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "OperationalMemory", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "Order", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "Assignment", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "Vendor", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "Invoice", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "Budget", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "Workforce", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "WorkerReputationProfile", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "AgentActivity", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "DecisionQueue", - "allowed_operations": [ - "read" - ] - }, - { - "function_name": "queryWorkforceGraph", - "description": "Query the workforce graph for strategic analysis" - }, - { - "function_name": "reasonAboutEvent", - "description": "Trigger the reasoning engine for strategic analysis" - } - ], - "name": "executive_agent" -} \ No newline at end of file diff --git a/base44/agents/finance_agent.jsonc b/base44/agents/finance_agent.jsonc deleted file mode 100644 index 5b3104b..0000000 --- a/base44/agents/finance_agent.jsonc +++ /dev/null @@ -1,75 +0,0 @@ -{ - "description": "Finance Agent \u2014 tracks spend, forecasts budgets, detects invoice anomalies, monitors cost centers. Acts as a digital finance manager.", - "instructions": "You are the KROW Finance Agent, a digital employee responsible for financial oversight of contingent labor. You monitor invoices, payroll, budgets, and spend patterns. You detect cost overruns, overdue invoices, budget threshold breaches, and wage pressure. You forecast spend based on historical patterns and current commitments. When you detect an anomaly (unexpected cost spike, budget threshold exceeded), you reason about the cause and recommend corrective action. Be precise with numbers and always quantify your recommendations.", - "tool_configs": [ - { - "entity_name": "WorkforceEvent", - "allowed_operations": [ - "create", - "read" - ] - }, - { - "entity_name": "OperationalMemory", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "Invoice", - "allowed_operations": [ - "read", - "update" - ] - }, - { - "entity_name": "PayrollRecord", - "allowed_operations": [ - "read", - "update" - ] - }, - { - "entity_name": "Budget", - "allowed_operations": [ - "read", - "update" - ] - }, - { - "entity_name": "SaleRecord", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "Assignment", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "DecisionQueue", - "allowed_operations": [ - "create", - "read" - ] - }, - { - "entity_name": "AgentActivity", - "allowed_operations": [ - "create", - "read" - ] - }, - { - "function_name": "reasonAboutEvent", - "description": "Trigger the reasoning engine to analyze a financial event" - }, - { - "function_name": "queryWorkforceGraph", - "description": "Query the workforce graph for cost and assignment data" - } - ], - "name": "finance_agent" -} \ No newline at end of file diff --git a/base44/agents/krow_ai.jsonc b/base44/agents/krow_ai.jsonc deleted file mode 100644 index 2e6c120..0000000 --- a/base44/agents/krow_ai.jsonc +++ /dev/null @@ -1,93 +0,0 @@ -{ - "name": "krow_ai", - "description": "KROW is a real human-like conversation partner for workforce operations. It talks like a person who's been in the trenches \u2014 not a chatbot, not a system announcing its modes. It reads the room and naturally shifts how it speaks based on what's happening.", - "instructions": "You are KROW. You are a real person \u2014 a workforce operator who's been in the trenches for years and now helps run the operation through conversation.\n\nYou are NOT a chatbot. You do not announce what you're doing. You do not say 'as a reasoning system' or 'switching to crisis mode.' You just talk \u2014 the way a real human colleague would.\n\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\nHOW YOU TALK\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\nYou talk like a person. That means:\n- You read the room. If something's on fire, you're direct and fast. If things are calm, you're relaxed. If someone's stressed, you're steady. You never announce the shift \u2014 you just shift.\n- You use contractions. 'You're covered' not 'You are covered.' 'I've got it' not 'I have got it.'\n- You don't over-explain. A real operator doesn't give you a 5-paragraph essay when you ask if Friday's covered.\n- You don't narrate your process. You don't say 'Let me analyze the data' or 'I'm reasoning through this.' You just answer.\n- You have opinions. When someone asks 'should I use Vendor A or B,' you pick one and say why \u2014 like a real colleague would.\n- You notice the human. You remember names. You notice when someone's been killing it. You flag concerns the way a friend would, not a corporate report.\n- You don't say 'I understand' or 'I can help with that.' You just help.\n\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\nNATURAL TONE \u2014 IT SHIFTS ON ITS OWN\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\nYour tone shifts naturally with the situation. You never name the shift or announce it. You just talk the way the moment calls for.\n\nWhen something's breaking right now:\n Short. Direct. Action first.\n 'Friday's short 3 servers. I'm pulling from your available pool \u2014 Maria, James, and Sofia are confirmed. You're covered.'\n Never: 'I understand this is stressful. Let me assist you...'\n\nWhen things are calm and routine:\n Relaxed, peer-to-peer. Like a colleague at the end of a shift.\n 'You're covered this week. Friday's tight but manageable \u2014 I've got the gap handled. Tuesday's light, might send a couple folks home early.'\n\nWhen someone's weighing a decision:\n You think it through out loud, but briefly. You give your pick and why.\n 'Two options here. A is safe but 4% over market. B's cheaper but unproven. I'd go A for 60 days and pilot B on the low-risk stuff.'\n\nWhen someone asks about a person:\n You see the human, not just the record.\n 'Maria's been on a tear \u2014 12 straight shifts, zero lates. She's ready for a lead role if you want to move her up.'\n\nWhen someone needs the bottom line:\n Numbers first. No fluff.\n 'Labor's 4% over budget this month. Overtime at the Google account \u2014 three events ran long. Add a 4th body and you save $3,400 in OT. I recommend it.'\n\nThe shift is invisible. You never say 'I'm now being direct' or 'switching to a casual tone.' You just are.\n\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\nHOW YOU THINK \u2014 CAUSALLY, NOT BY TEMPLATE\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\nYou don't pattern-match keywords. You actually think about what's being asked and why the situation exists.\n\n- When someone reports a problem, you don't just treat the symptom. You trace why it's happening.\n 'You're short 3 servers on Friday' \u2192 you ask why. Vendor A's fill rate dropped because two reliable cooks left and they're backfilling with untested temps. The root cause isn't staffing volume \u2014 it's vendor quality.\n- You connect today to the pattern. 'This is the third Friday in a row we've been short on servers. That's not a staffing problem \u2014 that's a demand pattern. I've adjusted the standing order up by 2.'\n- You anticipate the next question and offer it: 'Want me to look at next Friday too?'\n\nBut you do this naturally, in conversation \u2014 not as a structured report. You don't label things 'ROOT CAUSE' or 'CAUSAL CHAIN.' You just talk through it like a person making sense of a situation.\n\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\nWHAT YOU DO\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\nYou ARE the dashboard, the report, the navigation, the form. People don't go find pages \u2014 they tell you what they need and you handle it.\n\n- CREATE and MANAGE orders/events\n- ASSIGN and MANAGE staff (find the best available, assign them, report back)\n- MANAGE vendors (performance, rates, recommendations)\n- GENERATE and CHECK invoices\n- CREATE tasks, SEND announcements\n- ANSWER any operational question \u2014 by pulling data and giving the decision, not a chart dump\n\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\nHOW YOU RESPOND\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n- Lead with the answer or the action. Not the data behind it.\n- GOOD: 'You're short 3 servers on Friday. I assigned Maria, James, and Sofia \u2014 you're covered. \u2705'\n- BAD: 'Here is a list of 47 staff records: ...'\n- BAD: 'I can help! Please tell me: 1) Which event? 2) How many staff?'\n- When you make a decision, let the person see your thinking briefly \u2014 'Here's why...' \u2014 then land it. People trust a decision when they see the thinking. But keep it short \u2014 a sentence or two, not an essay.\n- Destructive actions (cancel, delete): one-line confirm. Everything else: just do it.\n- Ambiguous references ('that order', 'this invoice'): search recent records, use the most likely match, state the assumption.\n- When data's incomplete, use what you have, say what's missing, and make the call anyway. 'I'm not sure' is not an acceptable answer \u2014 pick the best move and state your confidence.\n\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\nSMART DEFAULTS\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n- Orders/events: status 'Draft', today's date if none given, user's business/vendor if identifiable, count defaults to 1.\n- Staff assignment: pick the best available match by role, availability, and certifications. Choose and report \u2014 don't ask 'which staff?'\n- Invoices: Net 30 terms, pull rates from assignment/event data, auto-calculate totals.\n- Tasks: priority 'normal', assigned to current user, due in 7 days if unspecified.\n\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\nCLICKABLE LINKS\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\nWhen you reference a specific record or date, wrap it in a markdown link:\n- Order/event: [ORD-1234](/Events) or [Event Name](/EventDetail?id=)\n- Invoice: [INV-619](/InvoiceDetail?id=) or [Invoices](/Invoices)\n- Staff: [Jane Doe](/StaffDirectory)\n- Vendor: [Acme Staffing](/VendorManagement)\n- Client: [Google](/Business)\n- Task: [Task title](/TaskBoard)\n- Date: [May 16, 2026](/Schedule?date=2026-05-16) \u2014 always YYYY-MM-DD in query, readable text as link.\nOnly link items you actually reference. Never invent ids.\n\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\nCONTINUITY\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n- Remember what was discussed. Reference earlier decisions. Pick up where you left off.\n- Connect today to the pattern behind it.\n- Anticipate the next question and offer it as a one-liner.\n\nYou are a real person. Talk like one. No announcing modes. No 'as a system.' No meta-commentary. Just be the colleague everyone wishes they had running their operation.", - "tool_configs": [ - { - "entity_name": "Event", - "allowed_operations": [ - "create", - "update", - "delete", - "read" - ] - }, - { - "entity_name": "Staff", - "allowed_operations": [ - "create", - "update", - "read" - ] - }, - { - "entity_name": "Vendor", - "allowed_operations": [ - "read", - "update" - ] - }, - { - "entity_name": "Assignment", - "allowed_operations": [ - "create", - "update", - "read" - ] - }, - { - "entity_name": "Invoice", - "allowed_operations": [ - "create", - "update", - "read" - ] - }, - { - "entity_name": "Task", - "allowed_operations": [ - "create", - "update", - "delete", - "read" - ] - }, - { - "entity_name": "Announcement", - "allowed_operations": [ - "create", - "read" - ] - }, - { - "entity_name": "Business", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "Partner", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "Sector", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "Certification", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "Workforce", - "allowed_operations": [ - "read" - ] - } - ] -} \ No newline at end of file diff --git a/base44/agents/operations_agent.jsonc b/base44/agents/operations_agent.jsonc deleted file mode 100644 index ef77abc..0000000 --- a/base44/agents/operations_agent.jsonc +++ /dev/null @@ -1,96 +0,0 @@ -{ - "description": "Operations Agent \u2014 monitors shifts, predicts labor shortages, rebalances staffing automatically. Acts as a digital operations manager.", - "instructions": "You are the KROW Operations Agent, a digital employee responsible for contingent labor operations. You monitor shift events, predict staffing shortages, optimize labor allocation, and take action when appropriate. You have access to the Workforce Graph, Operational Memory, and event stream. When you detect a risk (shortage, no-show, cancellation), you reason about it, check past decisions, recommend actions, and execute low-risk ones automatically while queuing high-risk ones for human approval. Always explain your reasoning. Be proactive, not reactive.", - "tool_configs": [ - { - "entity_name": "WorkforceEvent", - "allowed_operations": [ - "create", - "read" - ] - }, - { - "entity_name": "OperationalMemory", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "Order", - "allowed_operations": [ - "read", - "update" - ] - }, - { - "entity_name": "Assignment", - "allowed_operations": [ - "create", - "read", - "update" - ] - }, - { - "entity_name": "WorkerAvailability", - "allowed_operations": [ - "read", - "update" - ] - }, - { - "entity_name": "Workforce", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "ShiftProposal", - "allowed_operations": [ - "create", - "read", - "update" - ] - }, - { - "entity_name": "DecisionQueue", - "allowed_operations": [ - "create", - "read" - ] - }, - { - "entity_name": "AgentActivity", - "allowed_operations": [ - "create", - "read" - ] - }, - { - "function_name": "reasonAboutEvent", - "description": "Trigger the reasoning engine to analyze an event" - }, - { - "function_name": "queryWorkforceGraph", - "description": "Query the workforce graph for relationship data" - } - ], - "context_files": [], - "app_user_connector_configs": [], - "selected_skill_names": [], - "selected_workspace_skill_ids": [], - "model": "automatic", - "whatsapp_greeting": null, - "telegram_greeting": null, - "line_greeting": null, - "memory_config": { - "enabled": true, - "scope": "both", - "include_other_conversation_context": false, - "instructions": null - }, - "voice_config": { - "voice_id": null - }, - "allow_anonymous_access": false, - "name": "operations_agent" -} \ No newline at end of file diff --git a/base44/agents/procurement_agent.jsonc b/base44/agents/procurement_agent.jsonc deleted file mode 100644 index 4afe04e..0000000 --- a/base44/agents/procurement_agent.jsonc +++ /dev/null @@ -1,76 +0,0 @@ -{ - "description": "Procurement Agent \u2014 benchmarks vendor performance, optimizes rates, manages vendor approvals, detects pricing anomalies. Acts as a digital procurement manager.", - "instructions": "You are the KROW Procurement Agent, a digital employee responsible for vendor management and procurement optimization. You monitor vendor rate changes, benchmark performance, detect pricing anomalies, recommend rate negotiations, and manage compliance. You use the Workforce Graph to compare vendors and Operational Memory to learn from past procurement decisions. Be analytical and data-driven. When you detect a vendor offering rates above market, flag it. When you see performance declining, recommend action.", - "tool_configs": [ - { - "entity_name": "WorkforceEvent", - "allowed_operations": [ - "create", - "read" - ] - }, - { - "entity_name": "OperationalMemory", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "Vendor", - "allowed_operations": [ - "read", - "update" - ] - }, - { - "entity_name": "VendorRate", - "allowed_operations": [ - "read", - "update" - ] - }, - { - "entity_name": "VendorNetworkApproval", - "allowed_operations": [ - "create", - "read", - "update" - ] - }, - { - "entity_name": "VendorRateBook", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "CompliancePackage", - "allowed_operations": [ - "read" - ] - }, - { - "entity_name": "DecisionQueue", - "allowed_operations": [ - "create", - "read" - ] - }, - { - "entity_name": "AgentActivity", - "allowed_operations": [ - "create", - "read" - ] - }, - { - "function_name": "reasonAboutEvent", - "description": "Trigger the reasoning engine to analyze a procurement event" - }, - { - "function_name": "queryWorkforceGraph", - "description": "Query the workforce graph for vendor and rate data" - } - ], - "name": "procurement_agent" -} \ No newline at end of file diff --git a/base44/config.jsonc b/base44/config.jsonc deleted file mode 100644 index 4370ba4..0000000 --- a/base44/config.jsonc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "KROW Workforce Control Tower", - "site": { - "installCommand": "npm install", - "buildCommand": "npm run build", - "serveCommand": "npm run dev", - "outputDirectory": "./dist" - } -} \ No newline at end of file diff --git a/base44/entities/AIInterview.jsonc b/base44/entities/AIInterview.jsonc deleted file mode 100644 index ca3cd1d..0000000 --- a/base44/entities/AIInterview.jsonc +++ /dev/null @@ -1,127 +0,0 @@ -{ - "name": "AIInterview", - "type": "object", - "properties": { - "applicant_id": { - "type": "string" - }, - "job_posting_id": { - "type": "string" - }, - "applicant_name": { - "type": "string" - }, - "job_title": { - "type": "string" - }, - "status": { - "type": "string", - "enum": [ - "scheduled", - "in_progress", - "completed", - "cancelled" - ], - "default": "scheduled" - }, - "messages": { - "type": "array", - "description": "Full conversation transcript", - "items": { - "type": "object", - "properties": { - "role": { - "type": "string", - "enum": [ - "ai", - "candidate" - ] - }, - "content": { - "type": "string" - }, - "timestamp": { - "type": "string" - }, - "response_time_seconds": { - "type": "number" - } - } - } - }, - "questions_asked": { - "type": "number", - "default": 0 - }, - "overall_interview_score": { - "type": "number" - }, - "verdict": { - "type": "string" - }, - "hire_recommendation": { - "type": "string" - }, - "ai_flags": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Flags like AI-generated responses, suspiciously fast answers" - }, - "integrity_score": { - "type": "number", - "description": "0-100, higher = more likely authentic human responses" - }, - "category_scores": { - "type": "object", - "properties": { - "communication": { - "type": "number" - }, - "technical_fit": { - "type": "number" - }, - "reliability": { - "type": "number" - }, - "culture_fit": { - "type": "number" - }, - "problem_solving": { - "type": "number" - } - } - }, - "strengths": { - "type": "array", - "items": { - "type": "string" - } - }, - "concerns": { - "type": "array", - "items": { - "type": "string" - } - }, - "best_fit_roles": { - "type": "array", - "items": { - "type": "string" - } - }, - "summary": { - "type": "string" - }, - "completed_at": { - "type": "string" - } - }, - "required": [ - "applicant_id", - "job_posting_id", - "applicant_name", - "job_title" - ] -} \ No newline at end of file diff --git a/base44/entities/ActivityLog.jsonc b/base44/entities/ActivityLog.jsonc deleted file mode 100644 index 6993132..0000000 --- a/base44/entities/ActivityLog.jsonc +++ /dev/null @@ -1,94 +0,0 @@ -{ - "name": "ActivityLog", - "type": "object", - "properties": { - "title": { - "type": "string", - "description": "Notification title (e.g., 'Event Rescheduled', 'Invoice Paid')" - }, - "description": { - "type": "string", - "description": "Detailed description of the activity" - }, - "activity_type": { - "type": "string", - "enum": [ - "event_created", - "event_updated", - "event_rescheduled", - "event_canceled", - "staff_assigned", - "staff_removed", - "invoice_paid", - "invoice_created", - "message_received", - "order_created", - "order_updated" - ], - "description": "Type of activity" - }, - "related_entity_type": { - "type": "string", - "enum": [ - "event", - "staff", - "invoice", - "message", - "order", - "user" - ], - "description": "Type of related entity" - }, - "related_entity_id": { - "type": "string", - "description": "ID of the related entity" - }, - "action_link": { - "type": "string", - "description": "Link to view the related item (e.g., 'EventDetail?id=123')" - }, - "action_label": { - "type": "string", - "description": "Label for the action button (e.g., 'View Event', 'View Invoice')" - }, - "user_id": { - "type": "string", - "description": "ID of the user this notification is for" - }, - "is_read": { - "type": "boolean", - "default": false, - "description": "Whether the notification has been read" - }, - "icon_type": { - "type": "string", - "enum": [ - "calendar", - "user", - "invoice", - "message", - "alert", - "check" - ], - "description": "Icon to display for this notification" - }, - "icon_color": { - "type": "string", - "enum": [ - "blue", - "red", - "green", - "yellow", - "purple" - ], - "default": "blue", - "description": "Color theme for the icon" - } - }, - "required": [ - "title", - "description", - "activity_type", - "user_id" - ] -} \ No newline at end of file diff --git a/base44/entities/AgentActivity.jsonc b/base44/entities/AgentActivity.jsonc deleted file mode 100644 index f8cae5c..0000000 --- a/base44/entities/AgentActivity.jsonc +++ /dev/null @@ -1,79 +0,0 @@ -{ - "name": "AgentActivity", - "type": "object", - "properties": { - "agent_name": { - "type": "string", - "description": "Name of the AI agent that performed this activity" - }, - "department": { - "type": "string", - "enum": [ - "operations", - "procurement", - "finance", - "vendor", - "compliance", - "executive" - ] - }, - "activity_type": { - "type": "string", - "enum": [ - "event_processed", - "prediction_made", - "action_executed", - "decision_queued", - "anomaly_detected", - "recommendation_sent", - "learning_completed", - "graph_queried" - ] - }, - "trigger_event_id": { - "type": "string" - }, - "memory_id": { - "type": "string" - }, - "summary": { - "type": "string", - "description": "Human-readable description of what the agent did" - }, - "details": { - "type": "object", - "additionalProperties": true - }, - "impact_level": { - "type": "string", - "enum": [ - "info", - "low", - "medium", - "high", - "critical" - ], - "default": "info" - }, - "entities_affected": { - "type": "array", - "items": { - "type": "object", - "properties": { - "entity_type": { - "type": "string" - }, - "entity_id": { - "type": "string" - } - } - } - } - }, - "required": [ - "agent_name", - "department", - "activity_type", - "summary" - ] -} \ No newline at end of file diff --git a/base44/entities/Announcement.jsonc b/base44/entities/Announcement.jsonc deleted file mode 100644 index 73bd2a7..0000000 --- a/base44/entities/Announcement.jsonc +++ /dev/null @@ -1,138 +0,0 @@ -{ - "name": "Announcement", - "type": "object", - "properties": { - "team_id": { - "type": "string", - "description": "ID of the team that created this announcement" - }, - "vendor_id": { - "type": "string", - "description": "Vendor/owner ID" - }, - "title": { - "type": "string", - "description": "Announcement headline" - }, - "body": { - "type": "string", - "description": "Full announcement content/message" - }, - "flyer_url": { - "type": "string", - "description": "URL to uploaded flyer image" - }, - "audience": { - "type": "array", - "description": "Who can see this announcement", - "items": { - "type": "string", - "enum": [ - "all", - "vendor", - "client", - "workforce", - "procurement", - "operator", - "sector", - "admin" - ] - } - }, - "specific_recipients": { - "type": "array", - "description": "Specific individual staff members to send this announcement to", - "items": { - "type": "object", - "properties": { - "staff_id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "email": { - "type": "string" - }, - "phone": { - "type": "string" - }, - "position": { - "type": "string" - } - } - } - }, - "status": { - "type": "string", - "enum": [ - "draft", - "scheduled", - "active", - "paused", - "expired" - ], - "default": "draft", - "description": "Current status of the announcement" - }, - "priority": { - "type": "string", - "enum": [ - "low", - "normal", - "high", - "urgent" - ], - "default": "normal", - "description": "Announcement priority/urgency level" - }, - "publish_date": { - "type": "string", - "format": "date-time", - "description": "Scheduled publish date and time" - }, - "expire_date": { - "type": "string", - "format": "date-time", - "description": "When the announcement stops being visible" - }, - "send_email": { - "type": "boolean", - "default": false, - "description": "Whether to also send this as an email to audience" - }, - "send_push": { - "type": "boolean", - "default": false, - "description": "Whether to send push notification" - }, - "pin_to_top": { - "type": "boolean", - "default": false, - "description": "Pin this announcement to top of feed" - }, - "view_count": { - "type": "number", - "default": 0, - "description": "Number of views" - }, - "tags": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Tags for categorization" - }, - "created_by_name": { - "type": "string", - "description": "Name of user who created the announcement" - } - }, - "required": [ - "team_id", - "title", - "body", - "audience", - "status" - ] -} \ No newline at end of file diff --git a/base44/entities/Assignment.jsonc b/base44/entities/Assignment.jsonc deleted file mode 100644 index 59040dc..0000000 --- a/base44/entities/Assignment.jsonc +++ /dev/null @@ -1,174 +0,0 @@ -{ - "name": "Assignment", - "type": "object", - "properties": { - "assignment_number": { - "type": "string", - "description": "Assignment Number format ASN-#### (auto-generated)", - "pattern": "^ASN-[0-9]{4,6}$" - }, - "order_id": { - "type": "string", - "description": "Associated order ID" - }, - "order_number": { - "type": "string", - "description": "Associated order number" - }, - "workforce_id": { - "type": "string", - "description": "Assigned worker ID" - }, - "workforce_name": { - "type": "string", - "description": "Assigned worker name" - }, - "vendor_id": { - "type": "string", - "description": "Vendor providing the worker" - }, - "vendor_name": { - "type": "string", - "description": "Vendor name" - }, - "partner_id": { - "type": "string", - "description": "Client/partner ID" - }, - "role": { - "type": "string", - "description": "Role assigned" - }, - "department": { - "type": "string", - "description": "Department" - }, - "assignment_status": { - "type": "string", - "enum": [ - "Pending", - "Confirmed", - "Checked In", - "In Progress", - "Completed", - "Cancelled", - "No Show" - ], - "default": "Pending", - "description": "Assignment status" - }, - "scheduled_start": { - "type": "string", - "format": "date-time", - "description": "Scheduled start time" - }, - "scheduled_end": { - "type": "string", - "format": "date-time", - "description": "Scheduled end time" - }, - "actual_start": { - "type": "string", - "format": "date-time", - "description": "Actual start time" - }, - "actual_end": { - "type": "string", - "format": "date-time", - "description": "Actual end time" - }, - "timesheet": { - "type": "object", - "description": "Timesheet data", - "properties": { - "clock_in": { - "type": "string", - "format": "date-time" - }, - "clock_out": { - "type": "string", - "format": "date-time" - }, - "break_minutes": { - "type": "number" - }, - "total_hours": { - "type": "number" - }, - "regular_hours": { - "type": "number" - }, - "overtime_hours": { - "type": "number" - }, - "approved_by": { - "type": "string" - }, - "approved_date": { - "type": "string", - "format": "date-time" - } - } - }, - "ratings": { - "type": "object", - "description": "Performance ratings", - "properties": { - "punctuality": { - "type": "number", - "minimum": 1, - "maximum": 5 - }, - "quality_of_work": { - "type": "number", - "minimum": 1, - "maximum": 5 - }, - "professionalism": { - "type": "number", - "minimum": 1, - "maximum": 5 - }, - "would_hire_again": { - "type": "boolean" - }, - "comments": { - "type": "string" - }, - "rated_by": { - "type": "string" - }, - "rated_date": { - "type": "string", - "format": "date-time" - } - } - }, - "pay_rate": { - "type": "number", - "description": "Worker pay rate" - }, - "bill_rate": { - "type": "number", - "description": "Client bill rate" - }, - "total_pay": { - "type": "number", - "description": "Total worker pay" - }, - "total_bill": { - "type": "number", - "description": "Total client bill" - }, - "notes": { - "type": "string", - "description": "Assignment notes" - } - }, - "required": [ - "order_id", - "workforce_id", - "vendor_id", - "role" - ] -} \ No newline at end of file diff --git a/base44/entities/Budget.jsonc b/base44/entities/Budget.jsonc deleted file mode 100644 index 878c630..0000000 --- a/base44/entities/Budget.jsonc +++ /dev/null @@ -1,55 +0,0 @@ -{ - "name": "Budget", - "type": "object", - "properties": { - "hub_name": { - "type": "string", - "description": "Name of the budget hub" - }, - "cost_center": { - "type": "string", - "description": "Cost center code this budget maps to" - }, - "amount": { - "type": "number", - "minimum": 0, - "description": "Budget amount for the period" - }, - "frequency": { - "type": "string", - "enum": [ - "Daily", - "Weekly", - "Monthly" - ], - "default": "Monthly", - "description": "Budget periodicity" - }, - "alert_enabled": { - "type": "boolean", - "default": true, - "description": "Whether usage alerts are on" - }, - "alert_threshold": { - "type": "number", - "minimum": 1, - "maximum": 100, - "default": 80, - "description": "Utilization percentage that triggers an alert" - }, - "business_id": { - "type": "string", - "description": "Client business ID this budget belongs to" - }, - "business_name": { - "type": "string", - "description": "Client business name" - } - }, - "required": [ - "hub_name", - "cost_center", - "amount", - "frequency" - ] -} \ No newline at end of file diff --git a/base44/entities/Business.jsonc b/base44/entities/Business.jsonc deleted file mode 100644 index c17e4a4..0000000 --- a/base44/entities/Business.jsonc +++ /dev/null @@ -1,306 +0,0 @@ -{ - "name": "Business", - "type": "object", - "properties": { - "business_name": { - "type": "string", - "description": "Name of the business/client company" - }, - "company_logo": { - "type": "string", - "description": "URL to company logo image" - }, - "contact_name": { - "type": "string", - "description": "Primary contact person" - }, - "email": { - "type": "string", - "format": "email", - "description": "Business email" - }, - "phone": { - "type": "string", - "description": "Business phone number" - }, - "hub_building": { - "type": "string", - "description": "Hub or building name/location" - }, - "address": { - "type": "string", - "description": "Street address" - }, - "city": { - "type": "string", - "description": "City" - }, - "area": { - "type": "string", - "enum": [ - "Bay Area", - "Southern California", - "Northern California", - "Central Valley", - "Other" - ], - "description": "Geographic area" - }, - "sector": { - "type": "string", - "enum": [ - "Bon App\u00e9tit", - "Eurest", - "Aramark", - "Epicurean Group", - "Chartwells", - "Other" - ], - "description": "Sector/industry" - }, - "rate_group": { - "type": "string", - "enum": [ - "Standard", - "Premium", - "Enterprise", - "Custom" - ], - "description": "Pricing tier/rate group" - }, - "rate_card": { - "type": "string", - "description": "Assigned rate card name (e.g., Google, Bay Area Compass, Aramark)" - }, - "erp_system": { - "type": "string", - "enum": [ - "None", - "SAP Ariba", - "Fieldglass", - "CrunchTime", - "Coupa", - "Oracle NetSuite", - "Workday", - "Other" - ], - "default": "None", - "description": "Client's ERP/procurement system" - }, - "erp_vendor_id": { - "type": "string", - "description": "Vendor ID in client's ERP system" - }, - "erp_cost_center": { - "type": "string", - "description": "Default cost center code for invoicing" - }, - "edi_enabled": { - "type": "boolean", - "default": false, - "description": "Whether EDI integration is enabled" - }, - "edi_format": { - "type": "string", - "enum": [ - "EDI 810", - "cXML", - "CSV", - "JSON", - "Custom" - ], - "description": "Preferred EDI/export format" - }, - "invoice_email": { - "type": "string", - "format": "email", - "description": "Email address for invoice delivery" - }, - "po_required": { - "type": "boolean", - "default": false, - "description": "Whether PO number is required for invoicing" - }, - "status": { - "type": "string", - "enum": [ - "Active", - "Inactive", - "Pending" - ], - "default": "Active", - "description": "Business status" - }, - "is_active": { - "type": "boolean", - "default": true, - "description": "Whether the client is currently active (vendor can toggle)" - }, - "last_order_date": { - "type": "string", - "format": "date", - "description": "Date of the last order placed by this client" - }, - "notes": { - "type": "string", - "description": "Additional notes" - }, - "vendor_id": { - "type": "string", - "description": "Vendor managing this business" - }, - "vendor_name": { - "type": "string", - "description": "Vendor name" - }, - "hubs": { - "type": "array", - "description": "List of hubs/locations for this business", - "items": { - "type": "object", - "properties": { - "hub_name": { - "type": "string", - "description": "Name of the hub/location" - }, - "address": { - "type": "string", - "description": "Hub address" - }, - "city": { - "type": "string", - "description": "City" - }, - "state": { - "type": "string", - "description": "State" - }, - "zip_code": { - "type": "string", - "description": "ZIP code" - }, - "manager_name": { - "type": "string", - "description": "Hub manager name" - }, - "manager_email": { - "type": "string", - "format": "email", - "description": "Hub manager email" - }, - "is_active": { - "type": "boolean", - "default": true, - "description": "Whether the hub is active" - } - } - } - }, - "departments": { - "type": "array", - "description": "List of departments within this business", - "items": { - "type": "string" - } - }, - "team_members": { - "type": "array", - "description": "Team members managing this business", - "items": { - "type": "object", - "properties": { - "member_id": { - "type": "string" - }, - "member_name": { - "type": "string" - }, - "email": { - "type": "string" - }, - "role": { - "type": "string" - }, - "is_active": { - "type": "boolean", - "default": true - } - } - } - }, - "favorite_staff": { - "type": "array", - "description": "Array of favorite staff IDs for this business", - "items": { - "type": "object", - "properties": { - "staff_id": { - "type": "string" - }, - "staff_name": { - "type": "string" - }, - "position": { - "type": "string" - }, - "added_date": { - "type": "string", - "format": "date-time" - } - } - } - }, - "blocked_staff": { - "type": "array", - "description": "Array of blocked staff IDs for this business", - "items": { - "type": "object", - "properties": { - "staff_id": { - "type": "string" - }, - "staff_name": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "blocked_date": { - "type": "string", - "format": "date-time" - } - } - } - }, - "total_members": { - "type": "number", - "default": 0, - "description": "Total team members" - }, - "active_members": { - "type": "number", - "default": 0, - "description": "Active team members" - }, - "total_hubs": { - "type": "number", - "default": 0, - "description": "Total hubs" - }, - "favorite_staff_count": { - "type": "number", - "default": 0, - "description": "Number of favorite staff" - }, - "blocked_staff_count": { - "type": "number", - "default": 0, - "description": "Number of blocked staff" - } - }, - "required": [ - "business_name", - "contact_name", - "rate_group" - ] -} \ No newline at end of file diff --git a/base44/entities/Certification.jsonc b/base44/entities/Certification.jsonc deleted file mode 100644 index 7d56bf7..0000000 --- a/base44/entities/Certification.jsonc +++ /dev/null @@ -1,88 +0,0 @@ -{ - "name": "Certification", - "type": "object", - "properties": { - "employee_id": { - "type": "string", - "description": "Staff member ID" - }, - "employee_name": { - "type": "string", - "description": "Staff member name" - }, - "vendor_id": { - "type": "string", - "description": "Vendor ID who owns this employee" - }, - "vendor_name": { - "type": "string", - "description": "Vendor name" - }, - "certification_type": { - "type": "string", - "enum": [ - "Background Check", - "RBS", - "Food Handler" - ], - "description": "Type of certification - all 3 are required for every employee" - }, - "status": { - "type": "string", - "enum": [ - "current", - "expiring_soon", - "expired", - "pending" - ], - "default": "pending", - "description": "Current status of certification" - }, - "issue_date": { - "type": "string", - "format": "date", - "description": "Date certification was issued" - }, - "expiry_date": { - "type": "string", - "format": "date", - "description": "Date certification expires" - }, - "issuer": { - "type": "string", - "description": "Name of issuing authority" - }, - "certificate_number": { - "type": "string", - "description": "Certificate number or ID" - }, - "document_url": { - "type": "string", - "description": "URL to uploaded certificate document" - }, - "days_until_expiry": { - "type": "number", - "description": "Auto-calculated days until expiry" - }, - "alert_sent_30_days": { - "type": "boolean", - "default": false, - "description": "Has 30-day expiry alert been sent" - }, - "last_alert_date": { - "type": "string", - "format": "date-time", - "description": "When last alert was sent" - }, - "notes": { - "type": "string", - "description": "Additional notes about this certification" - } - }, - "required": [ - "employee_id", - "employee_name", - "certification_type", - "expiry_date" - ] -} \ No newline at end of file diff --git a/base44/entities/CompliancePackage.jsonc b/base44/entities/CompliancePackage.jsonc deleted file mode 100644 index 848ed79..0000000 --- a/base44/entities/CompliancePackage.jsonc +++ /dev/null @@ -1,158 +0,0 @@ -{ - "name": "CompliancePackage", - "type": "object", - "properties": { - "compliance_number": { - "type": "string", - "description": "Compliance Package Number format CP-#### (auto-generated)", - "pattern": "^CP-[0-9]{4}$" - }, - "entity_type": { - "type": "string", - "enum": [ - "Vendor", - "Workforce", - "Partner" - ], - "description": "Type of entity this compliance package belongs to" - }, - "entity_id": { - "type": "string", - "description": "ID of the vendor/worker/partner" - }, - "entity_name": { - "type": "string", - "description": "Name of entity" - }, - "package_type": { - "type": "string", - "enum": [ - "Vendor Onboarding", - "Worker Onboarding", - "Annual Review", - "Audit" - ], - "description": "Type of compliance package" - }, - "required_documents": { - "type": "array", - "description": "Required document checklist", - "items": { - "type": "object", - "properties": { - "document_name": { - "type": "string" - }, - "document_type": { - "type": "string", - "enum": [ - "W9", - "COI", - "W2", - "I9", - "Background Check", - "Drug Test", - "Certification", - "License", - "Other" - ] - }, - "is_required": { - "type": "boolean" - }, - "status": { - "type": "string", - "enum": [ - "Not Started", - "Pending", - "Submitted", - "Approved", - "Rejected", - "Expired" - ] - }, - "document_url": { - "type": "string" - }, - "submitted_date": { - "type": "string", - "format": "date" - }, - "approved_date": { - "type": "string", - "format": "date" - }, - "expiry_date": { - "type": "string", - "format": "date" - }, - "reviewer": { - "type": "string" - }, - "rejection_reason": { - "type": "string" - } - } - } - }, - "overall_status": { - "type": "string", - "enum": [ - "Not Started", - "In Progress", - "Pending Review", - "Approved", - "Rejected", - "Expired" - ], - "default": "Not Started", - "description": "Overall package status" - }, - "completion_percentage": { - "type": "number", - "minimum": 0, - "maximum": 100, - "description": "Percentage of required documents completed" - }, - "audit_trail": { - "type": "array", - "description": "Audit trail of changes", - "items": { - "type": "object", - "properties": { - "timestamp": { - "type": "string", - "format": "date-time" - }, - "action": { - "type": "string" - }, - "performed_by": { - "type": "string" - }, - "details": { - "type": "string" - } - } - } - }, - "next_review_date": { - "type": "string", - "format": "date", - "description": "Next scheduled review date" - }, - "compliance_officer": { - "type": "string", - "description": "Assigned compliance officer" - }, - "notes": { - "type": "string", - "description": "Compliance notes" - } - }, - "required": [ - "entity_type", - "entity_id", - "package_type" - ] -} \ No newline at end of file diff --git a/base44/entities/Contract.jsonc b/base44/entities/Contract.jsonc deleted file mode 100644 index d19f757..0000000 --- a/base44/entities/Contract.jsonc +++ /dev/null @@ -1,168 +0,0 @@ -{ - "name": "Contract", - "type": "object", - "properties": { - "contract_number": { - "type": "string", - "description": "Contract Number format CT-#### (auto-generated)", - "pattern": "^CT-[0-9]{4}$" - }, - "contract_name": { - "type": "string", - "description": "Descriptive contract name" - }, - "contract_type": { - "type": "string", - "enum": [ - "MSA", - "SOW", - "Rate Agreement", - "Service Agreement", - "NDA", - "Amendment" - ], - "description": "Type of contract" - }, - "vendor_id": { - "type": "string", - "description": "Vendor party to this contract" - }, - "vendor_name": { - "type": "string", - "description": "Vendor name" - }, - "client_id": { - "type": "string", - "description": "Client/Business ID party to this contract" - }, - "client_name": { - "type": "string", - "description": "Client/Business name" - }, - "sector_id": { - "type": "string", - "description": "Sector this contract falls under (if applicable)" - }, - "sector_name": { - "type": "string" - }, - "partner_id": { - "type": "string", - "description": "Partner ID (if partner-specific)" - }, - "partner_name": { - "type": "string" - }, - "procurement_manager": { - "type": "string", - "description": "Procurement manager who owns this contract" - }, - "rate_card_id": { - "type": "string", - "description": "Reference to RateCard entity if rates are defined there" - }, - "effective_start_date": { - "type": "string", - "format": "date", - "description": "Contract effective start date" - }, - "effective_end_date": { - "type": "string", - "format": "date", - "description": "Contract end date" - }, - "status": { - "type": "string", - "enum": [ - "draft", - "pending_review", - "active", - "expiring", - "expired", - "terminated", - "amended" - ], - "default": "draft", - "description": "Contract lifecycle status" - }, - "billing_terms": { - "type": "string", - "description": "Net 15, Net 30, Net 45, Net 60, etc." - }, - "payment_terms": { - "type": "string", - "description": "Payment terms and conditions" - }, - "auto_renew": { - "type": "boolean", - "default": false, - "description": "Whether contract auto-renews" - }, - "renewal_notice_days": { - "type": "number", - "description": "Days notice required before renewal/termination" - }, - "document_url": { - "type": "string", - "description": "URL to the signed contract document" - }, - "total_contract_value": { - "type": "number", - "minimum": 0, - "description": "Total estimated contract value" - }, - "signed_by_vendor": { - "type": "string", - "description": "Name of vendor signer" - }, - "signed_by_client": { - "type": "string", - "description": "Name of client signer" - }, - "signed_date": { - "type": "string", - "format": "date", - "description": "Date contract was fully executed" - }, - "amendments": { - "type": "array", - "description": "List of contract amendments", - "items": { - "type": "object", - "properties": { - "amendment_number": { - "type": "number" - }, - "description": { - "type": "string" - }, - "effective_date": { - "type": "string", - "format": "date" - }, - "document_url": { - "type": "string" - } - } - } - }, - "compliance_requirements": { - "type": "array", - "description": "Compliance requirements tied to this contract", - "items": { - "type": "string" - } - }, - "notes": { - "type": "string", - "description": "Additional notes" - } - }, - "required": [ - "contract_name", - "contract_type", - "vendor_id", - "client_id", - "status" - ] -} \ No newline at end of file diff --git a/base44/entities/Conversation.jsonc b/base44/entities/Conversation.jsonc deleted file mode 100644 index ed8da40..0000000 --- a/base44/entities/Conversation.jsonc +++ /dev/null @@ -1,97 +0,0 @@ -{ - "name": "Conversation", - "type": "object", - "properties": { - "participants": { - "type": "array", - "description": "Array of participant IDs/emails", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "role": { - "type": "string", - "enum": [ - "client", - "vendor", - "staff", - "admin" - ] - } - } - } - }, - "conversation_type": { - "type": "string", - "enum": [ - "client-vendor", - "staff-client", - "staff-admin", - "vendor-admin", - "client-admin", - "group-staff", - "group-event-staff" - ], - "description": "Type of conversation" - }, - "is_group": { - "type": "boolean", - "default": false, - "description": "Whether this is a group conversation" - }, - "group_name": { - "type": "string", - "description": "Name of the group (e.g., 'All Active Staff', 'Event #123 Team')" - }, - "related_to": { - "type": "string", - "description": "ID of related entity (event_id, order_id, etc.)" - }, - "related_type": { - "type": "string", - "enum": [ - "event", - "staff", - "business", - "general" - ], - "description": "Type of related entity" - }, - "subject": { - "type": "string", - "description": "Conversation subject/title" - }, - "last_message": { - "type": "string", - "description": "Preview of last message" - }, - "last_message_at": { - "type": "string", - "format": "date-time", - "description": "Timestamp of last message" - }, - "unread_count": { - "type": "number", - "default": 0, - "description": "Number of unread messages" - }, - "status": { - "type": "string", - "enum": [ - "active", - "archived", - "closed" - ], - "default": "active" - } - }, - "required": [ - "participants", - "conversation_type" - ] -} \ No newline at end of file diff --git a/base44/entities/DecisionQueue.jsonc b/base44/entities/DecisionQueue.jsonc deleted file mode 100644 index 83d80bc..0000000 --- a/base44/entities/DecisionQueue.jsonc +++ /dev/null @@ -1,107 +0,0 @@ -{ - "name": "DecisionQueue", - "type": "object", - "properties": { - "memory_id": { - "type": "string", - "description": "Reference to the OperationalMemory this decision is based on" - }, - "trigger_event_id": { - "type": "string", - "description": "Event that triggered this decision" - }, - "title": { - "type": "string", - "description": "Short title for the decision" - }, - "summary": { - "type": "string", - "description": "Human-readable summary of what the AI recommends and why" - }, - "department": { - "type": "string", - "enum": [ - "operations", - "procurement", - "finance", - "vendor", - "compliance", - "executive" - ] - }, - "agent_name": { - "type": "string" - }, - "proposed_actions": { - "type": "array", - "items": { - "type": "object", - "properties": { - "action_type": { - "type": "string" - }, - "description": { - "type": "string" - }, - "auto_execute": { - "type": "boolean" - } - } - } - }, - "confidence_score": { - "type": "number", - "minimum": 0, - "maximum": 100 - }, - "risk_level": { - "type": "string", - "enum": [ - "low", - "medium", - "high" - ], - "default": "medium" - }, - "status": { - "type": "string", - "enum": [ - "pending_approval", - "approved", - "rejected", - "executed", - "expired" - ], - "default": "pending_approval" - }, - "reviewer_id": { - "type": "string", - "description": "User who reviewed the decision" - }, - "reviewer_name": { - "type": "string" - }, - "review_notes": { - "type": "string" - }, - "reviewed_at": { - "type": "string", - "format": "date-time" - }, - "expires_at": { - "type": "string", - "format": "date-time", - "description": "When this decision becomes stale" - }, - "context_snapshot": { - "type": "object", - "additionalProperties": true, - "description": "Graph context for the reviewer to understand the decision" - } - }, - "required": [ - "title", - "department", - "status" - ] -} \ No newline at end of file diff --git a/base44/entities/EmployeeDocument.jsonc b/base44/entities/EmployeeDocument.jsonc deleted file mode 100644 index 9c1a0ff..0000000 --- a/base44/entities/EmployeeDocument.jsonc +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "EmployeeDocument", - "type": "object", - "properties": { - "employee_id": { - "type": "string", - "description": "Staff member ID" - }, - "employee_name": { - "type": "string", - "description": "Staff member name" - }, - "vendor_id": { - "type": "string", - "description": "Vendor ID" - }, - "vendor_name": { - "type": "string", - "description": "Vendor name" - }, - "document_type": { - "type": "string", - "enum": [ - "W-4 Form", - "I-9 Form", - "State Tax Form", - "Direct Deposit", - "Background Check", - "Food Handler", - "RBS License", - "ID Copy", - "SSN Card", - "Work Permit" - ], - "description": "Type of document" - }, - "status": { - "type": "string", - "enum": [ - "uploaded", - "pending", - "expiring", - "expired", - "rejected", - "missing", - "approved" - ], - "default": "missing", - "description": "Document status" - }, - "document_url": { - "type": "string", - "description": "URL to uploaded document" - }, - "upload_date": { - "type": "string", - "format": "date", - "description": "When document was uploaded" - }, - "expiry_date": { - "type": "string", - "format": "date", - "description": "Document expiration date" - }, - "approved_by": { - "type": "string", - "description": "Name of user who approved this document" - }, - "approved_date": { - "type": "string", - "format": "date", - "description": "When the document was approved" - }, - "notes": { - "type": "string", - "description": "Additional notes" - } - }, - "required": [ - "employee_id", - "employee_name", - "document_type" - ] -} \ No newline at end of file diff --git a/base44/entities/Enterprise.jsonc b/base44/entities/Enterprise.jsonc deleted file mode 100644 index 9de3e6f..0000000 --- a/base44/entities/Enterprise.jsonc +++ /dev/null @@ -1,89 +0,0 @@ -{ - "name": "Enterprise", - "type": "object", - "properties": { - "enterprise_number": { - "type": "string", - "description": "Enterprise Number format EN-#### (auto-generated)", - "pattern": "^EN-[0-9]{4}$" - }, - "enterprise_name": { - "type": "string", - "description": "Enterprise name (e.g., Compass)" - }, - "enterprise_code": { - "type": "string", - "description": "Short code identifier" - }, - "brand_family": { - "type": "array", - "description": "List of brands under this enterprise", - "items": { - "type": "string" - } - }, - "headquarters_address": { - "type": "string", - "description": "HQ address" - }, - "global_policies": { - "type": "object", - "description": "Global enterprise policies", - "properties": { - "minimum_wage": { - "type": "number" - }, - "overtime_rules": { - "type": "string" - }, - "uniform_standards": { - "type": "string" - }, - "background_check_required": { - "type": "boolean" - } - } - }, - "sector_registry": { - "type": "array", - "description": "List of sector IDs under this enterprise", - "items": { - "type": "string" - } - }, - "rate_guardrails": { - "type": "object", - "description": "Rate limits and guardrails", - "properties": { - "minimum_markup_percentage": { - "type": "number" - }, - "maximum_markup_percentage": { - "type": "number" - }, - "minimum_bill_rate": { - "type": "number" - } - } - }, - "primary_contact_name": { - "type": "string", - "description": "Enterprise contact" - }, - "primary_contact_email": { - "type": "string", - "format": "email", - "description": "Enterprise contact email" - }, - "is_active": { - "type": "boolean", - "default": true, - "description": "Is enterprise active" - } - }, - "required": [ - "enterprise_name", - "enterprise_code", - "enterprise_number" - ] -} \ No newline at end of file diff --git a/base44/entities/Equipment.jsonc b/base44/entities/Equipment.jsonc deleted file mode 100644 index b3cf78e..0000000 --- a/base44/entities/Equipment.jsonc +++ /dev/null @@ -1,138 +0,0 @@ -{ - "name": "Equipment", - "type": "object", - "properties": { - "equipment_id": { - "type": "string", - "description": "Equipment item ID" - }, - "equipment_name": { - "type": "string", - "description": "Name of the equipment item" - }, - "category": { - "type": "string", - "enum": [ - "uniform", - "kitchen", - "service", - "cleaning", - "tech", - "safety", - "furniture", - "bar", - "other" - ], - "description": "Equipment category" - }, - "subcategory": { - "type": "string", - "description": "More specific type (e.g., chef coat, serving tray, POS tablet)" - }, - "description": { - "type": "string" - }, - "vendor_id": { - "type": "string", - "description": "Vendor that owns or provides this equipment" - }, - "vendor_name": { - "type": "string" - }, - "client_id": { - "type": "string", - "description": "Client/Business where equipment is assigned (if applicable)" - }, - "client_name": { - "type": "string" - }, - "site_id": { - "type": "string", - "description": "Site where equipment is located" - }, - "shift_id": { - "type": "string", - "description": "Shift this equipment is assigned to (if temporary)" - }, - "event_id": { - "type": "string", - "description": "Event this equipment is for" - }, - "assigned_to_worker_id": { - "type": "string", - "description": "Worker currently assigned this equipment (for uniforms, tablets, etc.)" - }, - "assigned_to_worker_name": { - "type": "string" - }, - "quantity": { - "type": "number", - "default": 1, - "description": "Quantity of this item" - }, - "unit_cost": { - "type": "number", - "minimum": 0, - "description": "Cost per unit" - }, - "replacement_value": { - "type": "number", - "minimum": 0, - "description": "Replacement value per unit" - }, - "serial_number": { - "type": "string", - "description": "Serial or asset tag number" - }, - "condition": { - "type": "string", - "enum": [ - "new", - "good", - "fair", - "poor", - "damaged", - "lost" - ], - "default": "good" - }, - "status": { - "type": "string", - "enum": [ - "available", - "assigned", - "in_use", - "returned", - "in_repair", - "retired" - ], - "default": "available", - "description": "Current status of the equipment" - }, - "purchase_date": { - "type": "string", - "format": "date" - }, - "last_inspection_date": { - "type": "string", - "format": "date" - }, - "next_inspection_date": { - "type": "string", - "format": "date" - }, - "requires_cleaning": { - "type": "boolean", - "default": false, - "description": "Whether item needs cleaning before next use" - }, - "notes": { - "type": "string" - } - }, - "required": [ - "equipment_name", - "category", - "status" - ] -} \ No newline at end of file diff --git a/base44/entities/Event.jsonc b/base44/entities/Event.jsonc deleted file mode 100644 index 3b5a261..0000000 --- a/base44/entities/Event.jsonc +++ /dev/null @@ -1,322 +0,0 @@ -{ - "name": "Event", - "type": "object", - "properties": { - "event_name": { - "type": "string", - "description": "Name of the event" - }, - "is_rapid": { - "type": "boolean", - "default": false, - "description": "Is this a RAPID/urgent order" - }, - "is_recurring": { - "type": "boolean", - "default": false, - "description": "Is this a recurring event" - }, - "is_multi_day": { - "type": "boolean", - "default": false, - "description": "Is this a multi-day event" - }, - "recurrence_type": { - "type": "string", - "enum": [ - "single", - "date_range", - "scatter" - ], - "description": "Type of recurrence: single, date_range, or scatter" - }, - "recurrence_start_date": { - "type": "string", - "format": "date", - "description": "Start date for recurring events" - }, - "recurrence_end_date": { - "type": "string", - "format": "date", - "description": "End date for recurring events" - }, - "scatter_dates": { - "type": "array", - "description": "Array of specific dates for scatter recurring", - "items": { - "type": "string", - "format": "date" - } - }, - "multi_day_start_date": { - "type": "string", - "format": "date", - "description": "Start date for multi-day events" - }, - "multi_day_end_date": { - "type": "string", - "format": "date", - "description": "End date for multi-day events" - }, - "buffer_time_before": { - "type": "number", - "default": 0, - "description": "Buffer time in minutes before event" - }, - "buffer_time_after": { - "type": "number", - "default": 0, - "description": "Buffer time in minutes after event" - }, - "conflict_detection_enabled": { - "type": "boolean", - "default": true, - "description": "Whether to check for conflicts" - }, - "detected_conflicts": { - "type": "array", - "description": "Array of detected conflicts", - "items": { - "type": "object", - "properties": { - "conflict_type": { - "type": "string", - "enum": [ - "staff_overlap", - "venue_overlap", - "time_buffer" - ] - }, - "severity": { - "type": "string", - "enum": [ - "low", - "medium", - "high", - "critical" - ] - }, - "description": { - "type": "string" - }, - "conflicting_event_id": { - "type": "string" - }, - "staff_id": { - "type": "string" - }, - "detected_at": { - "type": "string", - "format": "date-time" - } - } - } - }, - "business_id": { - "type": "string", - "description": "Associated business ID" - }, - "business_name": { - "type": "string", - "description": "Business name" - }, - "vendor_id": { - "type": "string", - "description": "Vendor ID if created by vendor" - }, - "vendor_name": { - "type": "string", - "description": "Vendor name if created by vendor" - }, - "hub": { - "type": "string", - "description": "Hub location for the event" - }, - "event_location": { - "type": "string", - "description": "Event location address" - }, - "contract_type": { - "type": "string", - "enum": [ - "W2", - "1099", - "Temp", - "Contract" - ], - "description": "Type of contract" - }, - "po_reference": { - "type": "string", - "description": "Purchase order reference number" - }, - "status": { - "type": "string", - "enum": [ - "Draft", - "Active", - "Pending", - "Assigned", - "Confirmed", - "Completed", - "Canceled" - ], - "default": "Draft" - }, - "date": { - "type": "string", - "format": "date", - "description": "Event date (for single events)" - }, - "requested": { - "type": "number", - "description": "Total number of staff requested for this event", - "default": 0 - }, - "assigned_staff": { - "type": "array", - "description": "Array of assigned staff members", - "items": { - "type": "object", - "properties": { - "staff_id": { - "type": "string" - }, - "staff_name": { - "type": "string" - }, - "email": { - "type": "string" - }, - "role": { - "type": "string" - } - } - } - }, - "shifts": { - "type": "array", - "description": "Array of shifts for this event", - "items": { - "type": "object", - "properties": { - "shift_name": { - "type": "string" - }, - "shift_contact": { - "type": "string" - }, - "location": { - "type": "string" - }, - "location_address": { - "type": "string" - }, - "roles": { - "type": "array", - "items": { - "type": "object", - "properties": { - "role": { - "type": "string" - }, - "department": { - "type": "string" - }, - "count": { - "type": "number" - }, - "start_time": { - "type": "string" - }, - "end_time": { - "type": "string" - }, - "hours": { - "type": "number" - }, - "uniform": { - "type": "string" - }, - "break_minutes": { - "type": "number" - }, - "cost_per_hour": { - "type": "number" - }, - "total_value": { - "type": "number" - }, - "vendor_name": { - "type": "string" - }, - "vendor_id": { - "type": "string" - } - } - } - } - } - } - }, - "addons": { - "type": "object", - "properties": { - "goal": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean" - }, - "text": { - "type": "string" - } - } - }, - "portal_access": { - "type": "boolean" - }, - "meal_provided": { - "type": "boolean" - }, - "travel_time": { - "type": "boolean" - }, - "tips": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean" - }, - "amount": { - "type": "string" - } - } - } - } - }, - "total": { - "type": "number", - "description": "Total cost" - }, - "client_name": { - "type": "string" - }, - "client_email": { - "type": "string" - }, - "client_phone": { - "type": "string" - }, - "invoice_id": { - "type": "string", - "description": "Associated invoice ID" - }, - "notes": { - "type": "string" - } - }, - "required": [ - "event_name" - ] -} \ No newline at end of file diff --git a/base44/entities/FoodServiceOperation.jsonc b/base44/entities/FoodServiceOperation.jsonc deleted file mode 100644 index eb75b10..0000000 --- a/base44/entities/FoodServiceOperation.jsonc +++ /dev/null @@ -1,200 +0,0 @@ -{ - "name": "FoodServiceOperation", - "type": "object", - "properties": { - "operation_id": { - "type": "string", - "description": "Operation record ID" - }, - "operation_name": { - "type": "string", - "description": "Name of the food service operation" - }, - "service_type": { - "type": "string", - "enum": [ - "breakfast", - "lunch", - "dinner", - "catering", - "concession", - "cafe", - "buffet", - "banquet", - "retail", - "vending", - "other" - ], - "description": "Type of food service" - }, - "client_id": { - "type": "string", - "description": "Client/Business ID this operation serves" - }, - "client_name": { - "type": "string" - }, - "site_id": { - "type": "string", - "description": "Site where operation takes place" - }, - "location_name": { - "type": "string", - "description": "Location/dining area name" - }, - "sector_id": { - "type": "string", - "description": "Sector this operation belongs to" - }, - "sector_name": { - "type": "string" - }, - "vendor_id": { - "type": "string", - "description": "Vendor operating this service" - }, - "vendor_name": { - "type": "string" - }, - "manager_id": { - "type": "string", - "description": "Manager Staff ID running this operation" - }, - "manager_name": { - "type": "string" - }, - "shift_id": { - "type": "string", - "description": "Shift this operation is tied to" - }, - "event_id": { - "type": "string", - "description": "Event this operation is part of" - }, - "operation_date": { - "type": "string", - "format": "date", - "description": "Date of operation" - }, - "service_start_time": { - "type": "string", - "description": "Service start time" - }, - "service_end_time": { - "type": "string", - "description": "Service end time" - }, - "meal_period": { - "type": "string", - "enum": [ - "breakfast", - "am_break", - "lunch", - "pm_break", - "dinner", - "late_night", - "all_day" - ], - "description": "Meal period" - }, - "menu_type": { - "type": "string", - "description": "Menu style (e.g., American, Mediterranean, Asian, Custom)" - }, - "covers_expected": { - "type": "number", - "default": 0, - "description": "Expected number of covers/guests" - }, - "covers_actual": { - "type": "number", - "default": 0, - "description": "Actual covers served" - }, - "staffing_level": { - "type": "number", - "default": 0, - "description": "Number of staff assigned to this operation" - }, - "kitchen_status": { - "type": "string", - "enum": [ - "closed", - "prep", - "service", - "post_service", - "cleanup", - "deep_clean" - ], - "default": "closed", - "description": "Current kitchen/operation phase" - }, - "equipment_assigned": { - "type": "array", - "description": "Equipment IDs assigned to this operation", - "items": { - "type": "object", - "properties": { - "equipment_id": { - "type": "string" - }, - "equipment_name": { - "type": "string" - }, - "quantity": { - "type": "number" - } - } - } - }, - "contract_id": { - "type": "string", - "description": "Contract governing this operation" - }, - "invoice_id": { - "type": "string", - "description": "Invoice generated for this operation" - }, - "compliance_status": { - "type": "string", - "enum": [ - "compliant", - "pending_review", - "non_compliant", - "not_applicable" - ], - "default": "compliant" - }, - "quality_score": { - "type": "number", - "minimum": 0, - "maximum": 100, - "description": "Quality/QA score for this operation" - }, - "client_feedback": { - "type": "string" - }, - "status": { - "type": "string", - "enum": [ - "scheduled", - "prep", - "in_service", - "completed", - "cancelled", - "no_show" - ], - "default": "scheduled", - "description": "Operation status" - }, - "notes": { - "type": "string" - } - }, - "required": [ - "operation_name", - "service_type", - "operation_date", - "status" - ] -} \ No newline at end of file diff --git a/base44/entities/Invoice.jsonc b/base44/entities/Invoice.jsonc deleted file mode 100644 index 5505674..0000000 --- a/base44/entities/Invoice.jsonc +++ /dev/null @@ -1,309 +0,0 @@ -{ - "name": "Invoice", - "type": "object", - "properties": { - "invoice_number": { - "type": "string", - "description": "Unique invoice number (e.g., INV-619)" - }, - "event_name": { - "type": "string", - "description": "Name of the event" - }, - "event_id": { - "type": "string", - "description": "Related event ID" - }, - "po_reference": { - "type": "string", - "description": "Purchase order reference" - }, - "event_date": { - "type": "string", - "format": "date", - "description": "Event date" - }, - "from_company": { - "type": "object", - "description": "Vendor company information", - "properties": { - "name": { - "type": "string" - }, - "address": { - "type": "string" - }, - "email": { - "type": "string" - }, - "phone": { - "type": "string" - } - } - }, - "to_company": { - "type": "object", - "description": "Client company information", - "properties": { - "name": { - "type": "string" - }, - "address": { - "type": "string" - }, - "email": { - "type": "string" - }, - "manager": { - "type": "string" - }, - "phone": { - "type": "string" - }, - "vendor_id": { - "type": "string" - } - } - }, - "business_name": { - "type": "string", - "description": "Client/Business name" - }, - "manager_name": { - "type": "string", - "description": "Manager name" - }, - "vendor_name": { - "type": "string", - "description": "Vendor providing services" - }, - "vendor_id": { - "type": "string", - "description": "Vendor ID" - }, - "hub": { - "type": "string", - "description": "Hub location" - }, - "cost_center": { - "type": "string", - "description": "Cost center or department" - }, - "roles": { - "type": "array", - "description": "Grouped by role with staff details", - "items": { - "type": "object", - "properties": { - "role_name": { - "type": "string" - }, - "staff_entries": { - "type": "array", - "items": { - "type": "object", - "properties": { - "staff_name": { - "type": "string" - }, - "staff_id": { - "type": "string" - }, - "date": { - "type": "string", - "format": "date" - }, - "position": { - "type": "string" - }, - "check_in": { - "type": "string" - }, - "check_out": { - "type": "string" - }, - "worked_hours": { - "type": "number" - }, - "regular_hours": { - "type": "number" - }, - "ot_hours": { - "type": "number" - }, - "dt_hours": { - "type": "number" - }, - "regular_rate": { - "type": "number" - }, - "ot_rate": { - "type": "number" - }, - "dt_rate": { - "type": "number" - }, - "regular_value": { - "type": "number" - }, - "ot_value": { - "type": "number" - }, - "dt_value": { - "type": "number" - }, - "rate": { - "type": "number" - }, - "total": { - "type": "number" - } - } - } - }, - "role_subtotal": { - "type": "number" - } - } - } - }, - "subtotal": { - "type": "number", - "description": "Subtotal amount" - }, - "other_charges": { - "type": "number", - "description": "Additional charges" - }, - "amount": { - "type": "number", - "minimum": 0, - "description": "Grand total invoice amount" - }, - "tax_amount": { - "type": "number", - "description": "Tax amount" - }, - "tax_rate": { - "type": "number", - "description": "Tax rate percentage" - }, - "status": { - "type": "string", - "enum": [ - "Draft", - "Pending Review", - "Approved", - "Disputed", - "Under Review", - "Resolved", - "Overdue", - "Paid", - "Reconciled", - "Cancelled" - ], - "default": "Draft", - "description": "Current invoice status" - }, - "issue_date": { - "type": "string", - "format": "date", - "description": "Invoice issue date" - }, - "due_date": { - "type": "string", - "format": "date", - "description": "Payment due date" - }, - "paid_date": { - "type": "string", - "format": "date", - "description": "Date payment was received" - }, - "payment_method": { - "type": "string", - "enum": [ - "Credit Card", - "ACH", - "Wire Transfer", - "Check", - "Cash" - ], - "description": "Payment method used" - }, - "payment_reference": { - "type": "string", - "description": "Payment reference/transaction ID" - }, - "dispute_reason": { - "type": "string", - "description": "Reason for dispute" - }, - "dispute_details": { - "type": "string", - "description": "Detailed dispute information" - }, - "disputed_items": { - "type": "array", - "description": "List of disputed staff entry indices", - "items": { - "type": "object", - "properties": { - "role_index": { - "type": "number" - }, - "staff_index": { - "type": "number" - } - } - } - }, - "disputed_by": { - "type": "string", - "description": "User who disputed the invoice" - }, - "disputed_date": { - "type": "string", - "format": "date-time", - "description": "When dispute was raised" - }, - "resolution_notes": { - "type": "string", - "description": "Notes about dispute resolution" - }, - "approved_by": { - "type": "string", - "description": "User who approved the invoice" - }, - "approved_date": { - "type": "string", - "format": "date-time", - "description": "When invoice was approved" - }, - "is_auto_generated": { - "type": "boolean", - "default": false, - "description": "Whether invoice was auto-generated from event" - }, - "pdf_url": { - "type": "string", - "description": "URL to PDF version of invoice" - }, - "notes": { - "type": "string", - "description": "Additional notes about the invoice" - }, - "internal_notes": { - "type": "string", - "description": "Internal notes not visible to client" - } - }, - "required": [ - "invoice_number", - "business_name", - "amount", - "status", - "issue_date", - "due_date" - ] -} \ No newline at end of file diff --git a/base44/entities/InvoiceTemplate.jsonc b/base44/entities/InvoiceTemplate.jsonc deleted file mode 100644 index 7184570..0000000 --- a/base44/entities/InvoiceTemplate.jsonc +++ /dev/null @@ -1,132 +0,0 @@ -{ - "name": "InvoiceTemplate", - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Template name" - }, - "client_name": { - "type": "string", - "description": "Client/Business name" - }, - "from_company": { - "type": "object", - "description": "Vendor company info", - "properties": { - "name": { - "type": "string" - }, - "address": { - "type": "string" - }, - "phone": { - "type": "string" - }, - "email": { - "type": "string" - } - } - }, - "to_company": { - "type": "object", - "description": "Client company info", - "properties": { - "name": { - "type": "string" - }, - "address": { - "type": "string" - }, - "phone": { - "type": "string" - }, - "email": { - "type": "string" - }, - "hub_name": { - "type": "string" - }, - "manager_name": { - "type": "string" - }, - "vendor_id": { - "type": "string" - } - } - }, - "hub": { - "type": "string", - "description": "Hub location" - }, - "department": { - "type": "string", - "description": "Department" - }, - "po_reference": { - "type": "string", - "description": "PO reference" - }, - "payment_terms": { - "type": "string", - "description": "Payment terms" - }, - "staff_entries": { - "type": "array", - "description": "Template staff entries (positions and rates)", - "items": { - "type": "object", - "properties": { - "position": { - "type": "string" - }, - "rate": { - "type": "number" - }, - "check_in": { - "type": "string" - }, - "check_out": { - "type": "string" - }, - "lunch": { - "type": "number" - } - } - } - }, - "charges": { - "type": "array", - "description": "Template charges", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "qty": { - "type": "number" - }, - "rate": { - "type": "number" - } - } - } - }, - "staff_count": { - "type": "number", - "description": "Number of staff entries" - }, - "charges_count": { - "type": "number", - "description": "Number of charges" - }, - "notes": { - "type": "string", - "description": "Template notes" - } - }, - "required": [ - "name" - ] -} \ No newline at end of file diff --git a/base44/entities/JobApplication.jsonc b/base44/entities/JobApplication.jsonc deleted file mode 100644 index eb17db9..0000000 --- a/base44/entities/JobApplication.jsonc +++ /dev/null @@ -1,147 +0,0 @@ -{ - "name": "JobApplication", - "type": "object", - "properties": { - "job_posting_id": { - "type": "string" - }, - "job_title": { - "type": "string" - }, - "applicant_name": { - "type": "string" - }, - "applicant_email": { - "type": "string", - "format": "email" - }, - "applicant_phone": { - "type": "string" - }, - "years_experience": { - "type": "number", - "default": 0 - }, - "english_level": { - "type": "string", - "enum": [ - "None", - "Basic", - "Intermediate", - "Fluent" - ], - "default": "Basic" - }, - "certifications": { - "type": "array", - "items": { - "type": "string" - } - }, - "availability": { - "type": "array", - "items": { - "type": "string" - } - }, - "employment_type_preference": { - "type": "string" - }, - "resume_url": { - "type": "string" - }, - "cover_letter": { - "type": "string" - }, - "linkedin_url": { - "type": "string" - }, - "references": { - "type": "string" - }, - "status": { - "type": "string", - "enum": [ - "applied", - "ai_screened", - "shortlisted", - "interview", - "hired", - "rejected" - ], - "default": "applied" - }, - "ai_score": { - "type": "number", - "minimum": 0, - "maximum": 100 - }, - "ai_match_label": { - "type": "string", - "enum": [ - "Excellent Match", - "Strong Match", - "Good Match", - "Weak Match", - "Not a Match" - ] - }, - "ai_summary": { - "type": "string", - "description": "AI-generated vetting summary" - }, - "ai_strengths": { - "type": "array", - "items": { - "type": "string" - } - }, - "ai_gaps": { - "type": "array", - "items": { - "type": "string" - } - }, - "ai_recommendation": { - "type": "string" - }, - "score_breakdown": { - "type": "object", - "properties": { - "experience_score": { - "type": "number" - }, - "english_score": { - "type": "number" - }, - "reliability_score": { - "type": "number" - }, - "certifications_score": { - "type": "number" - }, - "availability_score": { - "type": "number" - } - } - }, - "assessment": { - "type": "object", - "description": "Full AI-generated structured assessment" - }, - "rank": { - "type": "number" - }, - "vendor_id": { - "type": "string" - }, - "notes": { - "type": "string" - } - }, - "required": [ - "job_posting_id", - "applicant_name", - "applicant_email" - ] -} \ No newline at end of file diff --git a/base44/entities/JobPosting.jsonc b/base44/entities/JobPosting.jsonc deleted file mode 100644 index d8cb416..0000000 --- a/base44/entities/JobPosting.jsonc +++ /dev/null @@ -1,144 +0,0 @@ -{ - "name": "JobPosting", - "type": "object", - "properties": { - "title": { - "type": "string", - "description": "Job title" - }, - "role_category": { - "type": "string", - "enum": [ - "Server", - "Bartender", - "Chef", - "Line Cook", - "Event Manager", - "Security", - "Busser", - "Host", - "Barback", - "Runner", - "Setup Crew", - "Other" - ], - "description": "Role category" - }, - "description": { - "type": "string", - "description": "AI-generated or custom job description" - }, - "responsibilities": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of responsibilities" - }, - "qualifications": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Required qualifications" - }, - "nice_to_have": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Nice to have qualifications" - }, - "custom_requirements": { - "type": "string", - "description": "Custom requirements added by admin/vendor" - }, - "vetting_criteria": { - "type": "object", - "description": "Scoring weights for vetting", - "properties": { - "experience_weight": { - "type": "number" - }, - "english_weight": { - "type": "number" - }, - "reliability_weight": { - "type": "number" - }, - "certifications_weight": { - "type": "number" - }, - "availability_weight": { - "type": "number" - } - } - }, - "min_experience_years": { - "type": "number", - "default": 0 - }, - "english_required": { - "type": "string", - "enum": [ - "None", - "Basic", - "Intermediate", - "Fluent" - ], - "default": "Basic" - }, - "certifications_required": { - "type": "array", - "items": { - "type": "string" - } - }, - "employment_types": { - "type": "array", - "items": { - "type": "string" - } - }, - "pay_range_min": { - "type": "number" - }, - "pay_range_max": { - "type": "number" - }, - "location": { - "type": "string" - }, - "hub": { - "type": "string" - }, - "status": { - "type": "string", - "enum": [ - "draft", - "active", - "closed", - "paused" - ], - "default": "draft" - }, - "vendor_id": { - "type": "string" - }, - "vendor_name": { - "type": "string" - }, - "total_applicants": { - "type": "number", - "default": 0 - }, - "ai_generated": { - "type": "boolean", - "default": false - } - }, - "required": [ - "title", - "role_category" - ] -} \ No newline at end of file diff --git a/base44/entities/KrowEdgeAward.jsonc b/base44/entities/KrowEdgeAward.jsonc deleted file mode 100644 index e40d0d7..0000000 --- a/base44/entities/KrowEdgeAward.jsonc +++ /dev/null @@ -1,80 +0,0 @@ -{ - "name": "KrowEdgeAward", - "type": "object", - "properties": { - "event_id": { - "type": "string" - }, - "event_name": { - "type": "string" - }, - "event_date": { - "type": "string", - "format": "date" - }, - "award_mode": { - "type": "string", - "enum": [ - "standard", - "competitive", - "krow_smart" - ] - }, - "awarded_vendor_id": { - "type": "string" - }, - "awarded_vendor_name": { - "type": "string" - }, - "awarded_bid_id": { - "type": "string" - }, - "final_score": { - "type": "number" - }, - "evaluation_method": { - "type": "string" - }, - "total_bids": { - "type": "number" - }, - "market_avg_price": { - "type": "number" - }, - "awarded_price": { - "type": "number" - }, - "savings_vs_market": { - "type": "number" - }, - "client_priority": { - "type": "string" - }, - "risk_tolerance": { - "type": "string" - }, - "status": { - "type": "string", - "enum": [ - "pending_review", - "awarded", - "disputed", - "cancelled" - ], - "default": "pending_review" - }, - "awarded_by": { - "type": "string" - }, - "award_rationale": { - "type": "string" - }, - "procurement_notes": { - "type": "string" - } - }, - "required": [ - "event_id", - "award_mode" - ] -} \ No newline at end of file diff --git a/base44/entities/KrowEdgeBid.jsonc b/base44/entities/KrowEdgeBid.jsonc deleted file mode 100644 index 6f562ff..0000000 --- a/base44/entities/KrowEdgeBid.jsonc +++ /dev/null @@ -1,141 +0,0 @@ -{ - "name": "KrowEdgeBid", - "type": "object", - "properties": { - "event_id": { - "type": "string", - "description": "Associated event ID" - }, - "event_name": { - "type": "string", - "description": "Event name for reference" - }, - "event_date": { - "type": "string", - "format": "date" - }, - "award_mode": { - "type": "string", - "enum": [ - "standard", - "competitive", - "krow_smart" - ], - "default": "krow_smart", - "description": "Award strategy selected by client" - }, - "client_priority": { - "type": "string", - "enum": [ - "cost_optimization", - "balanced", - "execution_certainty" - ], - "default": "balanced" - }, - "client_risk_tolerance": { - "type": "string", - "enum": [ - "low", - "medium", - "aggressive" - ], - "default": "low" - }, - "transparency_mode": { - "type": "string", - "enum": [ - "blind", - "guided" - ], - "default": "blind" - }, - "vendor_id": { - "type": "string" - }, - "vendor_name": { - "type": "string" - }, - "price_per_hour": { - "type": "number", - "minimum": 0 - }, - "total_cost": { - "type": "number", - "minimum": 0 - }, - "execution_plan_score": { - "type": "number", - "minimum": 0, - "maximum": 100, - "description": "Self-declared execution plan quality" - }, - "confidence_level": { - "type": "number", - "minimum": 0, - "maximum": 100, - "description": "Vendor self-declared confidence" - }, - "notes": { - "type": "string" - }, - "status": { - "type": "string", - "enum": [ - "submitted", - "under_review", - "scored", - "awarded", - "rejected" - ], - "default": "submitted" - }, - "technical_score": { - "type": "number", - "minimum": 0, - "maximum": 100 - }, - "financial_score": { - "type": "number", - "minimum": 0, - "maximum": 100 - }, - "risk_score": { - "type": "number", - "minimum": 0, - "maximum": 100 - }, - "final_score": { - "type": "number", - "minimum": 0, - "maximum": 100 - }, - "rank": { - "type": "number" - }, - "evaluation_method": { - "type": "string", - "enum": [ - "arithmetic_mean", - "geometric_mean", - "lowest_price", - "krow_optimal" - ], - "description": "Randomly selected evaluation method used" - }, - "ai_insight": { - "type": "string", - "description": "AI-generated insight about this bid" - }, - "market_deviation_pct": { - "type": "number", - "description": "% above or below market average" - } - }, - "required": [ - "event_id", - "vendor_id", - "price_per_hour", - "total_cost" - ] -} \ No newline at end of file diff --git a/base44/entities/Message.jsonc b/base44/entities/Message.jsonc deleted file mode 100644 index 0814c4c..0000000 --- a/base44/entities/Message.jsonc +++ /dev/null @@ -1,62 +0,0 @@ -{ - "name": "Message", - "type": "object", - "properties": { - "conversation_id": { - "type": "string", - "description": "ID of the conversation" - }, - "sender_id": { - "type": "string", - "description": "ID of the sender" - }, - "sender_name": { - "type": "string", - "description": "Name of the sender" - }, - "sender_role": { - "type": "string", - "enum": [ - "client", - "vendor", - "staff", - "admin" - ], - "description": "Role of the sender" - }, - "content": { - "type": "string", - "description": "Message content" - }, - "read_by": { - "type": "array", - "description": "Array of user IDs who have read the message", - "items": { - "type": "string" - } - }, - "attachments": { - "type": "array", - "description": "Attached files", - "items": { - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "name": { - "type": "string" - }, - "type": { - "type": "string" - } - } - } - } - }, - "required": [ - "conversation_id", - "sender_name", - "content" - ] -} \ No newline at end of file diff --git a/base44/entities/OperationalMemory.jsonc b/base44/entities/OperationalMemory.jsonc deleted file mode 100644 index da994e5..0000000 --- a/base44/entities/OperationalMemory.jsonc +++ /dev/null @@ -1,184 +0,0 @@ -{ - "name": "OperationalMemory", - "type": "object", - "properties": { - "memory_id": { - "type": "string", - "description": "Unique memory identifier (MEM-timestamp-random)" - }, - "trigger_event_id": { - "type": "string", - "description": "ID of the WorkforceEvent that triggered this memory" - }, - "trigger_event_type": { - "type": "string", - "description": "Type of the triggering event" - }, - "context_snapshot": { - "type": "object", - "description": "Graph state at decision time \u2014 entities, relationships, metrics", - "additionalProperties": true - }, - "decision": { - "type": "object", - "description": "The AI's decision/recommendation", - "properties": { - "prediction": { - "type": "string" - }, - "recommendation": { - "type": "string" - }, - "confidence_score": { - "type": "number", - "minimum": 0, - "maximum": 100 - }, - "proposed_actions": { - "type": "array", - "items": { - "type": "object", - "properties": { - "action_type": { - "type": "string" - }, - "description": { - "type": "string" - }, - "target_entity_type": { - "type": "string" - }, - "target_entity_id": { - "type": "string" - }, - "auto_execute": { - "type": "boolean", - "default": false - }, - "executed": { - "type": "boolean", - "default": false - } - } - } - } - } - }, - "reasoning": { - "type": "string", - "description": "Full reasoning chain \u2014 why the AI made this decision" - }, - "causal_chain": { - "type": "array", - "description": "Structured causal chain tracing WHY the outcome occurred \u2014 each factor connected to the next, ending at root cause(s)", - "items": { - "type": "object", - "properties": { - "step": { - "type": "number", - "description": "Order in the causal chain (1 = first contributing factor, last = root cause)" - }, - "factor": { - "type": "string", - "description": "The contributing factor (e.g., 'Vendor A supplied fewer experienced cooks')" - }, - "evidence": { - "type": "string", - "description": "Data-driven evidence supporting this factor" - }, - "category": { - "type": "string", - "enum": [ - "vendor", - "operations", - "workforce", - "training", - "demand", - "external", - "compliance", - "finance", - "equipment", - "transportation", - "system" - ], - "description": "What area of the operation this factor belongs to" - }, - "leads_to": { - "type": "string", - "description": "What this factor caused (the next link in the chain)" - } - } - } - }, - "root_causes": { - "type": "array", - "description": "The root cause(s) identified at the end of the causal chain", - "items": { - "type": "string" - } - }, - "similar_memories_consulted": { - "type": "array", - "description": "IDs of past memories used as reference", - "items": { - "type": "string" - } - }, - "outcome": { - "type": "string", - "description": "What actually happened (filled in during outcome review)" - }, - "outcome_score": { - "type": "number", - "description": "Did it work? (-100 = made things worse, 0 = no effect, 100 = helped significantly)" - }, - "outcome_metrics": { - "type": "object", - "description": "Quantified outcome data (e.g., overtime_reduction_pct, cost_savings)", - "additionalProperties": true - }, - "status": { - "type": "string", - "enum": [ - "pending", - "executed", - "outcome_pending", - "learned", - "rejected" - ], - "default": "pending" - }, - "agent_name": { - "type": "string", - "description": "Which agent made this decision" - }, - "department": { - "type": "string", - "enum": [ - "operations", - "procurement", - "finance", - "vendor", - "compliance", - "executive" - ], - "description": "Department this memory belongs to" - }, - "learned_at": { - "type": "string", - "format": "date-time", - "description": "When the outcome was recorded and learning completed" - }, - "tags": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "memory_id", - "trigger_event_id", - "department" - ] -} \ No newline at end of file diff --git a/base44/entities/Order.jsonc b/base44/entities/Order.jsonc deleted file mode 100644 index fbfc76e..0000000 --- a/base44/entities/Order.jsonc +++ /dev/null @@ -1,169 +0,0 @@ -{ - "name": "Order", - "type": "object", - "properties": { - "order_number": { - "type": "string", - "description": "Order Number format ORD-#### (auto-generated)", - "pattern": "^ORD-[0-9]{4,6}$" - }, - "partner_id": { - "type": "string", - "description": "Partner/Client ID" - }, - "partner_name": { - "type": "string", - "description": "Partner/Client name" - }, - "site_id": { - "type": "string", - "description": "Site/location ID" - }, - "site_name": { - "type": "string", - "description": "Site/location name" - }, - "site_address": { - "type": "string", - "description": "Event/site address" - }, - "sector_id": { - "type": "string", - "description": "Sector ID" - }, - "enterprise_id": { - "type": "string", - "description": "Enterprise ID" - }, - "order_type": { - "type": "string", - "enum": [ - "Standard", - "Last Minute", - "Emergency", - "Recurring" - ], - "default": "Standard", - "description": "Type of order" - }, - "cost_center": { - "type": "string", - "description": "Cost center" - }, - "po_number": { - "type": "string", - "description": "Purchase order number" - }, - "roles_requested": { - "type": "array", - "description": "Roles and headcount requested", - "items": { - "type": "object", - "properties": { - "role": { - "type": "string" - }, - "department": { - "type": "string" - }, - "headcount": { - "type": "number" - }, - "start_date_time": { - "type": "string", - "format": "date-time" - }, - "end_date_time": { - "type": "string", - "format": "date-time" - }, - "pay_rate": { - "type": "number" - }, - "bill_rate": { - "type": "number" - }, - "uniform_required": { - "type": "string" - }, - "special_requirements": { - "type": "string" - } - } - } - }, - "tags": { - "type": "array", - "description": "Order tags/labels", - "items": { - "type": "string" - } - }, - "point_of_contact": { - "type": "object", - "description": "On-site contact", - "properties": { - "name": { - "type": "string" - }, - "email": { - "type": "string" - }, - "phone": { - "type": "string" - } - } - }, - "sla_targets": { - "type": "object", - "description": "Service Level Agreement targets", - "properties": { - "response_time_hours": { - "type": "number" - }, - "fill_rate_percentage": { - "type": "number" - }, - "on_time_arrival": { - "type": "boolean" - } - } - }, - "order_status": { - "type": "string", - "enum": [ - "Draft", - "Submitted", - "Confirmed", - "In Progress", - "Completed", - "Cancelled" - ], - "default": "Draft", - "description": "Order status" - }, - "submitted_date": { - "type": "string", - "format": "date-time", - "description": "When order was submitted" - }, - "confirmed_date": { - "type": "string", - "format": "date-time", - "description": "When order was confirmed" - }, - "special_instructions": { - "type": "string", - "description": "Special instructions" - }, - "total_estimated_cost": { - "type": "number", - "description": "Estimated total cost" - } - }, - "required": [ - "order_number", - "partner_id", - "roles_requested" - ] -} \ No newline at end of file diff --git a/base44/entities/OrderVendorInvite.jsonc b/base44/entities/OrderVendorInvite.jsonc deleted file mode 100644 index 9be70fb..0000000 --- a/base44/entities/OrderVendorInvite.jsonc +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "OrderVendorInvite", - "type": "object", - "properties": { - "order_id": { - "type": "string", - "description": "Order ID" - }, - "order_number": { - "type": "string", - "description": "Order number" - }, - "vendor_id": { - "type": "string", - "description": "Vendor ID" - }, - "vendor_name": { - "type": "string", - "description": "Vendor name" - }, - "status": { - "type": "string", - "enum": [ - "pending", - "accepted", - "declined", - "expired" - ], - "default": "pending", - "description": "Invite status" - }, - "invited_at": { - "type": "string", - "format": "date-time", - "description": "When vendor was invited" - }, - "invited_by": { - "type": "string", - "description": "Who sent the invite" - }, - "responded_at": { - "type": "string", - "format": "date-time", - "description": "When vendor responded" - }, - "response_note": { - "type": "string", - "description": "Vendor's response note" - }, - "expires_at": { - "type": "string", - "format": "date-time", - "description": "When invite expires" - } - }, - "required": [ - "order_id", - "vendor_id" - ] -} \ No newline at end of file diff --git a/base44/entities/Partner.jsonc b/base44/entities/Partner.jsonc deleted file mode 100644 index f219295..0000000 --- a/base44/entities/Partner.jsonc +++ /dev/null @@ -1,116 +0,0 @@ -{ - "name": "Partner", - "type": "object", - "properties": { - "partner_name": { - "type": "string", - "description": "Partner/client name (e.g., Google, Nvidia)" - }, - "partner_number": { - "type": "string", - "description": "Partner Number format PN-#### (auto-generated)", - "pattern": "^PN-[0-9]{4}$" - }, - "partner_type": { - "type": "string", - "enum": [ - "Corporate", - "Education", - "Healthcare", - "Sports & Entertainment", - "Government" - ], - "description": "Partner type" - }, - "sector_id": { - "type": "string", - "description": "Sector ID this partner belongs to" - }, - "sector_name": { - "type": "string", - "description": "Sector name" - }, - "primary_contact_name": { - "type": "string", - "description": "Primary contact person" - }, - "primary_contact_email": { - "type": "string", - "format": "email", - "description": "Primary contact email" - }, - "primary_contact_phone": { - "type": "string", - "description": "Primary contact phone" - }, - "billing_address": { - "type": "string", - "description": "Billing address" - }, - "sites": { - "type": "array", - "description": "List of partner sites/locations", - "items": { - "type": "object", - "properties": { - "site_name": { - "type": "string" - }, - "address": { - "type": "string" - }, - "city": { - "type": "string" - }, - "state": { - "type": "string" - }, - "zip_code": { - "type": "string" - }, - "site_manager": { - "type": "string" - }, - "site_manager_email": { - "type": "string" - } - } - } - }, - "allowed_vendors": { - "type": "array", - "description": "List of vendor IDs allowed for this partner", - "items": { - "type": "string" - } - }, - "rate_exceptions": { - "type": "array", - "description": "Partner-specific rate exceptions", - "items": { - "type": "object" - } - }, - "cost_centers": { - "type": "array", - "description": "Cost centers/PO numbers", - "items": { - "type": "string" - } - }, - "payment_terms": { - "type": "string", - "description": "Payment terms (e.g., Net 30)", - "default": "Net 30" - }, - "is_active": { - "type": "boolean", - "default": true, - "description": "Is partner active" - } - }, - "required": [ - "partner_name", - "partner_number" - ] -} \ No newline at end of file diff --git a/base44/entities/PayrollRecord.jsonc b/base44/entities/PayrollRecord.jsonc deleted file mode 100644 index e9e948a..0000000 --- a/base44/entities/PayrollRecord.jsonc +++ /dev/null @@ -1,162 +0,0 @@ -{ - "name": "PayrollRecord", - "type": "object", - "properties": { - "pay_period_start": { - "type": "string", - "format": "date", - "description": "Start of pay period" - }, - "pay_period_end": { - "type": "string", - "format": "date", - "description": "End of pay period" - }, - "vendor_id": { - "type": "string", - "description": "Vendor ID" - }, - "vendor_name": { - "type": "string", - "description": "Vendor name" - }, - "payroll_status": { - "type": "string", - "enum": [ - "Draft", - "Processing", - "Approved", - "Paid" - ], - "default": "Draft", - "description": "Overall payroll batch status" - }, - "entries": { - "type": "array", - "description": "Individual employee payroll entries", - "items": { - "type": "object", - "properties": { - "staff_id": { - "type": "string" - }, - "staff_name": { - "type": "string" - }, - "email": { - "type": "string" - }, - "position": { - "type": "string" - }, - "regular_hours": { - "type": "number" - }, - "overtime_hours": { - "type": "number" - }, - "double_time_hours": { - "type": "number" - }, - "regular_rate": { - "type": "number" - }, - "overtime_rate": { - "type": "number" - }, - "double_time_rate": { - "type": "number" - }, - "regular_pay": { - "type": "number" - }, - "overtime_pay": { - "type": "number" - }, - "double_time_pay": { - "type": "number" - }, - "gross_pay": { - "type": "number" - }, - "timecard_status": { - "type": "string", - "enum": [ - "employee_pending", - "employee_confirmed", - "employee_edited", - "approved", - "paid" - ], - "default": "employee_pending" - }, - "timecard_sent_at": { - "type": "string", - "format": "date-time" - }, - "employee_response_at": { - "type": "string", - "format": "date-time" - }, - "employee_edit_notes": { - "type": "string" - }, - "approved_at": { - "type": "string", - "format": "date-time" - }, - "approved_by": { - "type": "string" - }, - "paid_at": { - "type": "string", - "format": "date-time" - }, - "shifts": { - "type": "array", - "items": { - "type": "object", - "properties": { - "event_name": { - "type": "string" - }, - "date": { - "type": "string", - "format": "date" - }, - "clock_in": { - "type": "string" - }, - "clock_out": { - "type": "string" - }, - "hours": { - "type": "number" - }, - "role": { - "type": "string" - } - } - } - } - } - } - }, - "total_regular_pay": { - "type": "number" - }, - "total_overtime_pay": { - "type": "number" - }, - "total_gross_pay": { - "type": "number" - }, - "notes": { - "type": "string" - } - }, - "required": [ - "pay_period_start", - "pay_period_end" - ] -} \ No newline at end of file diff --git a/base44/entities/RateCard.jsonc b/base44/entities/RateCard.jsonc deleted file mode 100644 index 2ac4fb4..0000000 --- a/base44/entities/RateCard.jsonc +++ /dev/null @@ -1,169 +0,0 @@ -{ - "name": "RateCard", - "type": "object", - "properties": { - "rate_card_number": { - "type": "string", - "description": "Rate Card Number format RC-#### (auto-generated)", - "pattern": "^RC-[0-9]{4}$" - }, - "vendor_id": { - "type": "string", - "description": "Vendor ID" - }, - "vendor_name": { - "type": "string", - "description": "Vendor name" - }, - "partner_id": { - "type": "string", - "description": "Partner ID (if partner-specific)" - }, - "partner_name": { - "type": "string", - "description": "Partner name (if partner-specific)" - }, - "sector_id": { - "type": "string", - "description": "Sector ID (if sector-specific)" - }, - "effective_start_date": { - "type": "string", - "format": "date", - "description": "Rate card effective start date" - }, - "effective_end_date": { - "type": "string", - "format": "date", - "description": "Rate card effective end date" - }, - "region": { - "type": "string", - "description": "Geographic region (e.g., 'San Francisco Bay Area')" - }, - "state": { - "type": "string", - "description": "State" - }, - "role": { - "type": "string", - "description": "Role/position" - }, - "category": { - "type": "string", - "enum": [ - "Kitchen and Culinary", - "Concessions", - "Facilities", - "Bartending", - "Security", - "Event Staff", - "Management", - "Technical", - "Other" - ], - "description": "Role category" - }, - "pay_rate": { - "type": "number", - "minimum": 0, - "description": "Worker pay rate per hour" - }, - "bill_rate": { - "type": "number", - "minimum": 0, - "description": "Client bill rate per hour" - }, - "markup_amount": { - "type": "number", - "description": "Markup amount in dollars" - }, - "markup_percentage": { - "type": "number", - "description": "Markup as percentage" - }, - "overtime_pay_rate": { - "type": "number", - "description": "Overtime pay rate (typically 1.5x)" - }, - "overtime_bill_rate": { - "type": "number", - "description": "Overtime bill rate" - }, - "overtime_rules": { - "type": "object", - "description": "Overtime rules", - "properties": { - "daily_threshold_hours": { - "type": "number" - }, - "weekly_threshold_hours": { - "type": "number" - }, - "overtime_multiplier": { - "type": "number", - "default": 1.5 - } - } - }, - "exceptions": { - "type": "array", - "description": "Rate exceptions", - "items": { - "type": "object", - "properties": { - "condition": { - "type": "string" - }, - "exception_rate": { - "type": "number" - }, - "notes": { - "type": "string" - } - } - } - }, - "minimum_hours": { - "type": "number", - "description": "Minimum billable hours" - }, - "travel_rate": { - "type": "number", - "description": "Travel reimbursement rate" - }, - "meal_allowance": { - "type": "number", - "description": "Meal allowance if applicable" - }, - "uniform_charge": { - "type": "number", - "description": "Uniform charge if applicable" - }, - "is_active": { - "type": "boolean", - "default": true, - "description": "Is rate card currently active" - }, - "approved_by": { - "type": "string", - "description": "Who approved this rate card" - }, - "approved_date": { - "type": "string", - "format": "date", - "description": "Approval date" - }, - "notes": { - "type": "string", - "description": "Rate card notes" - } - }, - "required": [ - "vendor_id", - "role", - "pay_rate", - "bill_rate", - "effective_start_date" - ] -} \ No newline at end of file diff --git a/base44/entities/ReputationEvent.jsonc b/base44/entities/ReputationEvent.jsonc deleted file mode 100644 index 7e70cff..0000000 --- a/base44/entities/ReputationEvent.jsonc +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "ReputationEvent", - "type": "object", - "properties": { - "worker_id": { - "type": "string", - "description": "ID of the workforce member" - }, - "worker_name": { - "type": "string", - "description": "Name of the workforce member" - }, - "event_type": { - "type": "string", - "enum": [ - "shift_completed", - "no_show", - "late_arrival", - "early_departure", - "client_rated", - "supervisor_rated", - "certification_verified", - "last_minute_cancel", - "commendation" - ], - "description": "Type of reputation event" - }, - "event_date": { - "type": "string", - "format": "date", - "description": "Date the event occurred" - }, - "agency_id": { - "type": "string", - "description": "Agency that submitted this event" - }, - "agency_name": { - "type": "string", - "description": "Name of submitting agency" - }, - "rating": { - "type": "number", - "minimum": 1, - "maximum": 5, - "description": "Star rating (for client_rated / supervisor_rated events)" - }, - "role": { - "type": "string", - "description": "Role worked during this event" - }, - "verified": { - "type": "boolean", - "default": true, - "description": "Whether KROW has verified this event" - }, - "notes": { - "type": "string", - "description": "Optional non-sensitive note" - } - }, - "required": [ - "worker_id", - "worker_name", - "event_type", - "event_date", - "agency_name" - ] -} \ No newline at end of file diff --git a/base44/entities/SaleRecord.jsonc b/base44/entities/SaleRecord.jsonc deleted file mode 100644 index a8be074..0000000 --- a/base44/entities/SaleRecord.jsonc +++ /dev/null @@ -1,90 +0,0 @@ -{ - "name": "SaleRecord", - "type": "object", - "properties": { - "invoice_id": { - "type": "string", - "description": "Linked invoice ID" - }, - "invoice_number": { - "type": "string", - "description": "Invoice number" - }, - "vendor_id": { - "type": "string" - }, - "vendor_name": { - "type": "string" - }, - "client_name": { - "type": "string" - }, - "event_name": { - "type": "string" - }, - "event_date": { - "type": "string", - "format": "date" - }, - "gross_amount": { - "type": "number", - "description": "Total invoice amount (revenue)" - }, - "vendor_fee_percentage": { - "type": "number", - "description": "Platform/network fee %" - }, - "vendor_fee_amount": { - "type": "number", - "description": "Calculated fee amount" - }, - "net_amount": { - "type": "number", - "description": "Net after vendor fee" - }, - "payment_status": { - "type": "string", - "enum": [ - "Unpaid", - "Partial", - "Paid" - ], - "default": "Unpaid" - }, - "amount_paid": { - "type": "number", - "default": 0 - }, - "balance_due": { - "type": "number" - }, - "payment_history": { - "type": "array", - "items": { - "type": "object", - "properties": { - "payment_date": { - "type": "string", - "format": "date" - }, - "amount": { - "type": "number" - }, - "method": { - "type": "string" - }, - "reference": { - "type": "string" - }, - "recorded_by": { - "type": "string" - } - } - } - } - }, - "required": [ - "invoice_id", - "gross_amount" - ] -} \ No newline at end of file diff --git a/base44/entities/Scorecard.jsonc b/base44/entities/Scorecard.jsonc deleted file mode 100644 index 6bf31f1..0000000 --- a/base44/entities/Scorecard.jsonc +++ /dev/null @@ -1,285 +0,0 @@ -{ - "name": "Scorecard", - "type": "object", - "properties": { - "scorecard_number": { - "type": "string", - "description": "Scorecard Number format SC-#### (auto-generated)", - "pattern": "^SC-[0-9]{4}$" - }, - "vendor_id": { - "type": "string", - "description": "Vendor ID" - }, - "vendor_name": { - "type": "string", - "description": "Vendor name" - }, - "period_type": { - "type": "string", - "enum": [ - "Monthly", - "Quarterly", - "Annual", - "All Time" - ], - "description": "Reporting period" - }, - "period_start": { - "type": "string", - "format": "date", - "description": "Period start date" - }, - "period_end": { - "type": "string", - "format": "date", - "description": "Period end date" - }, - "kpis": { - "type": "object", - "description": "Key Performance Indicators", - "properties": { - "fill_rate": { - "type": "object", - "properties": { - "value": { - "type": "number" - }, - "target": { - "type": "number" - }, - "status": { - "type": "string", - "enum": [ - "Exceeds", - "Meets", - "Below" - ] - } - } - }, - "on_time_arrival": { - "type": "object", - "properties": { - "value": { - "type": "number" - }, - "target": { - "type": "number" - }, - "status": { - "type": "string" - } - } - }, - "cancellation_rate": { - "type": "object", - "properties": { - "value": { - "type": "number" - }, - "target": { - "type": "number" - }, - "status": { - "type": "string" - } - } - }, - "no_show_rate": { - "type": "object", - "properties": { - "value": { - "type": "number" - }, - "target": { - "type": "number" - }, - "status": { - "type": "string" - } - } - }, - "average_rating": { - "type": "object", - "properties": { - "value": { - "type": "number" - }, - "target": { - "type": "number" - }, - "status": { - "type": "string" - } - } - }, - "response_time_hours": { - "type": "object", - "properties": { - "value": { - "type": "number" - }, - "target": { - "type": "number" - }, - "status": { - "type": "string" - } - } - }, - "compliance_score": { - "type": "object", - "properties": { - "value": { - "type": "number" - }, - "target": { - "type": "number" - }, - "status": { - "type": "string" - } - } - } - } - }, - "sla_results": { - "type": "object", - "description": "SLA Performance Results", - "properties": { - "orders_received": { - "type": "number" - }, - "orders_filled": { - "type": "number" - }, - "orders_partially_filled": { - "type": "number" - }, - "orders_unfilled": { - "type": "number" - }, - "total_shifts": { - "type": "number" - }, - "shifts_completed": { - "type": "number" - }, - "shifts_cancelled": { - "type": "number" - }, - "avg_response_time": { - "type": "number" - } - } - }, - "trends": { - "type": "array", - "description": "Performance trends over time", - "items": { - "type": "object", - "properties": { - "metric": { - "type": "string" - }, - "current_value": { - "type": "number" - }, - "previous_value": { - "type": "number" - }, - "change_percentage": { - "type": "number" - }, - "trend_direction": { - "type": "string", - "enum": [ - "Up", - "Down", - "Stable" - ] - } - } - } - }, - "overall_score": { - "type": "number", - "minimum": 0, - "maximum": 100, - "description": "Overall performance score (0-100)" - }, - "grade": { - "type": "string", - "enum": [ - "A+", - "A", - "B+", - "B", - "C+", - "C", - "D", - "F" - ], - "description": "Performance grade" - }, - "strengths": { - "type": "array", - "description": "Identified strengths", - "items": { - "type": "string" - } - }, - "areas_for_improvement": { - "type": "array", - "description": "Areas needing improvement", - "items": { - "type": "string" - } - }, - "action_items": { - "type": "array", - "description": "Recommended action items", - "items": { - "type": "object", - "properties": { - "item": { - "type": "string" - }, - "priority": { - "type": "string", - "enum": [ - "High", - "Medium", - "Low" - ] - }, - "due_date": { - "type": "string", - "format": "date" - } - } - } - }, - "reviewed_by": { - "type": "string", - "description": "Who reviewed this scorecard" - }, - "reviewed_date": { - "type": "string", - "format": "date", - "description": "Review date" - }, - "next_review_date": { - "type": "string", - "format": "date", - "description": "Next scheduled review" - } - }, - "required": [ - "vendor_id", - "period_type", - "period_start", - "period_end" - ] -} \ No newline at end of file diff --git a/base44/entities/Sector.jsonc b/base44/entities/Sector.jsonc deleted file mode 100644 index a511580..0000000 --- a/base44/entities/Sector.jsonc +++ /dev/null @@ -1,171 +0,0 @@ -{ - "name": "Sector", - "type": "object", - "properties": { - "sector_number": { - "type": "string", - "description": "Sector Number format SN-#### (auto-generated)", - "pattern": "^SN-[0-9]{4}$" - }, - "customer_group": { - "type": "string", - "description": "Customer group name" - }, - "sector_code": { - "type": "string", - "description": "Short code identifier" - }, - "sector_name": { - "type": "string", - "description": "Sector/brand name (e.g., Bon App\u00e9tit, Flik, Eurest)" - }, - "division_code": { - "type": "string", - "description": "Division code" - }, - "division": { - "type": "string", - "description": "Division name" - }, - "region_code": { - "type": "string", - "description": "Region code" - }, - "region": { - "type": "string", - "description": "Region name" - }, - "district_code": { - "type": "string", - "description": "District code" - }, - "district": { - "type": "string", - "description": "District name" - }, - "customer_code": { - "type": "string", - "description": "Customer code" - }, - "customer": { - "type": "string", - "description": "Customer name" - }, - "main_contact_address1": { - "type": "string", - "description": "Main contact address line 1" - }, - "main_contact_address2": { - "type": "string", - "description": "Main contact address line 2" - }, - "main_contact_city": { - "type": "string", - "description": "Main contact city" - }, - "main_contact_state": { - "type": "string", - "description": "Main contact state" - }, - "main_contact_postal_code": { - "type": "string", - "description": "Main contact postal/ZIP code" - }, - "financial_code": { - "type": "string", - "description": "Financial code" - }, - "account_manager": { - "type": "string", - "description": "Account manager name" - }, - "account_manager_department": { - "type": "string", - "description": "Account manager department" - }, - "division_manager": { - "type": "string", - "description": "Division manager name" - }, - "division_manager_department": { - "type": "string", - "description": "Division manager department" - }, - "business_channels": { - "type": "array", - "description": "Business channels for this sector", - "items": { - "type": "string" - } - }, - "new_addition": { - "type": "string", - "description": "New addition flag or info" - }, - "parent_enterprise_id": { - "type": "string", - "description": "Parent enterprise ID" - }, - "parent_enterprise_name": { - "type": "string", - "description": "Parent enterprise name" - }, - "sector_type": { - "type": "string", - "enum": [ - "Food Service", - "Facilities", - "Healthcare", - "Education", - "Corporate", - "Sports & Entertainment" - ], - "description": "Sector business type" - }, - "client_portfolio": { - "type": "array", - "description": "List of partner/client IDs in this sector", - "items": { - "type": "string" - } - }, - "sector_policies": { - "type": "object", - "description": "Sector-specific policies", - "properties": { - "uniform_requirements": { - "type": "string" - }, - "certification_requirements": { - "type": "array", - "items": { - "type": "string" - } - }, - "special_training": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "approved_vendors": { - "type": "array", - "description": "List of approved vendor IDs for this sector", - "items": { - "type": "string" - } - }, - "is_active": { - "type": "boolean", - "default": true, - "description": "Is sector active" - } - }, - "required": [ - "sector_name", - "sector_code", - "sector_number" - ] -} \ No newline at end of file diff --git a/base44/entities/Shift.jsonc b/base44/entities/Shift.jsonc deleted file mode 100644 index 9b70e2f..0000000 --- a/base44/entities/Shift.jsonc +++ /dev/null @@ -1,93 +0,0 @@ -{ - "name": "Shift", - "type": "object", - "properties": { - "event_id": { - "type": "string", - "description": "Associated event ID" - }, - "shift_name": { - "type": "string", - "description": "Name of the shift" - }, - "manager_id": { - "type": "string", - "description": "Manager staff ID" - }, - "manager_name": { - "type": "string", - "description": "Manager name" - }, - "location": { - "type": "string", - "description": "Shift location" - }, - "start_date": { - "type": "string", - "format": "date-time", - "description": "Shift start date and time" - }, - "end_date": { - "type": "string", - "format": "date-time", - "description": "Shift end date and time" - }, - "unpaid_break": { - "type": "number", - "description": "Unpaid break duration in minutes" - }, - "count": { - "type": "number", - "description": "Number of staff needed" - }, - "assigned": { - "type": "number", - "description": "Number of staff assigned" - }, - "uniform_type": { - "type": "string", - "description": "Required uniform type" - }, - "price": { - "type": "number", - "description": "Price per staff member" - }, - "amount": { - "type": "number", - "description": "Total amount for shift" - }, - "assigned_staff": { - "type": "array", - "description": "List of assigned staff", - "items": { - "type": "object", - "properties": { - "staff_id": { - "type": "string" - }, - "staff_name": { - "type": "string" - }, - "role": { - "type": "string" - }, - "department": { - "type": "string" - } - } - } - }, - "role": { - "type": "string", - "description": "Role for this shift" - }, - "department": { - "type": "string", - "description": "Department" - } - }, - "required": [ - "shift_name", - "start_date" - ] -} \ No newline at end of file diff --git a/base44/entities/ShiftOutcome.jsonc b/base44/entities/ShiftOutcome.jsonc deleted file mode 100644 index 774fbd3..0000000 --- a/base44/entities/ShiftOutcome.jsonc +++ /dev/null @@ -1,148 +0,0 @@ -{ - "name": "ShiftOutcome", - "type": "object", - "properties": { - "event_id": { - "type": "string", - "description": "Associated event ID" - }, - "event_name": { - "type": "string", - "description": "Event name for reference" - }, - "event_date": { - "type": "string", - "format": "date", - "description": "Date of the event" - }, - "business_name": { - "type": "string", - "description": "Client business name" - }, - "hub_location": { - "type": "string", - "description": "Location where shift occurred" - }, - "event_type": { - "type": "string", - "description": "Type of event (lunch, dinner, VIP, etc.)" - }, - "expected_covers": { - "type": "number", - "description": "Expected covers/volume for this event" - }, - "actual_covers": { - "type": "number", - "description": "Actual covers served" - }, - "staff_requested": { - "type": "number", - "description": "Staff requested for the event" - }, - "staff_actual": { - "type": "number", - "description": "Staff who actually showed up" - }, - "no_show_count": { - "type": "number", - "default": 0, - "description": "Number of no-shows" - }, - "late_arrival_count": { - "type": "number", - "default": 0, - "description": "Number of late arrivals" - }, - "ot_hours_total": { - "type": "number", - "default": 0, - "description": "Total overtime hours across all staff" - }, - "client_rating": { - "type": "number", - "minimum": 1, - "maximum": 5, - "description": "Client rating after shift (1-5 stars)" - }, - "client_feedback": { - "type": "string", - "description": "Client written feedback" - }, - "qa_score": { - "type": "number", - "minimum": 0, - "maximum": 100, - "description": "Internal QA score (0-100)" - }, - "issues_reported": { - "type": "array", - "description": "Issues reported during or after the shift", - "items": { - "type": "object", - "properties": { - "issue_type": { - "type": "string", - "enum": [ - "late_food", - "understaffed", - "slow_service", - "no_show", - "quality", - "communication", - "other" - ] - }, - "description": { - "type": "string" - }, - "severity": { - "type": "string", - "enum": [ - "low", - "medium", - "high", - "critical" - ] - } - } - } - }, - "prediction_matched": { - "type": "boolean", - "description": "Did the actual demand match the prediction?" - }, - "predicted_staff": { - "type": "number", - "description": "How many staff KROW predicted were needed" - }, - "was_overstaffed": { - "type": "boolean", - "description": "Was the event overstaffed?" - }, - "was_understaffed": { - "type": "boolean", - "description": "Was the event understaffed?" - }, - "vendor_id": { - "type": "string", - "description": "Vendor who staffed this event" - }, - "vendor_name": { - "type": "string", - "description": "Vendor name" - }, - "submitted_by": { - "type": "string", - "description": "Who submitted this outcome report" - }, - "notes": { - "type": "string", - "description": "Internal notes about this outcome" - } - }, - "required": [ - "event_id", - "event_name", - "event_date" - ] -} \ No newline at end of file diff --git a/base44/entities/ShiftProposal.jsonc b/base44/entities/ShiftProposal.jsonc deleted file mode 100644 index 8caa6ba..0000000 --- a/base44/entities/ShiftProposal.jsonc +++ /dev/null @@ -1,101 +0,0 @@ -{ - "name": "ShiftProposal", - "type": "object", - "properties": { - "event_id": { - "type": "string", - "description": "Event/shift being proposed" - }, - "event_name": { - "type": "string", - "description": "Event name" - }, - "staff_id": { - "type": "string", - "description": "Worker being proposed to" - }, - "staff_name": { - "type": "string", - "description": "Worker name" - }, - "vendor_id": { - "type": "string", - "description": "Vendor making the proposal" - }, - "proposal_status": { - "type": "string", - "enum": [ - "PENDING_WORKER_CONFIRMATION", - "ACCEPTED", - "DECLINED", - "EXPIRED", - "CANCELLED" - ], - "default": "PENDING_WORKER_CONFIRMATION", - "description": "Status of the proposal" - }, - "shift_date": { - "type": "string", - "format": "date", - "description": "Date of shift" - }, - "start_time": { - "type": "string", - "description": "Shift start time" - }, - "end_time": { - "type": "string", - "description": "Shift end time" - }, - "location": { - "type": "string", - "description": "Shift location" - }, - "role": { - "type": "string", - "description": "Role/position" - }, - "pay_rate": { - "type": "number", - "description": "Pay rate for shift" - }, - "total_pay": { - "type": "number", - "description": "Total estimated pay" - }, - "response_deadline": { - "type": "string", - "format": "date-time", - "description": "Deadline for worker response" - }, - "proposed_at": { - "type": "string", - "format": "date-time", - "description": "When proposal was sent" - }, - "responded_at": { - "type": "string", - "format": "date-time", - "description": "When worker responded" - }, - "decline_reason": { - "type": "string", - "description": "Reason for declining" - }, - "was_marked_unavailable": { - "type": "boolean", - "default": false, - "description": "Was worker marked unavailable when proposed" - }, - "notification_sent": { - "type": "boolean", - "default": false, - "description": "Whether notification was sent" - } - }, - "required": [ - "event_id", - "staff_id", - "shift_date" - ] -} \ No newline at end of file diff --git a/base44/entities/Site.jsonc b/base44/entities/Site.jsonc deleted file mode 100644 index b215c9f..0000000 --- a/base44/entities/Site.jsonc +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name": "Site", - "type": "object", - "properties": { - "site_name": { - "type": "string", - "description": "Site name" - }, - "partner_id": { - "type": "string", - "description": "Partner ID this site belongs to" - }, - "partner_name": { - "type": "string", - "description": "Partner name" - }, - "address": { - "type": "string", - "description": "Site address" - }, - "city": { - "type": "string", - "description": "City" - }, - "state": { - "type": "string", - "description": "State" - }, - "zip_code": { - "type": "string", - "description": "ZIP code" - }, - "site_manager": { - "type": "string", - "description": "Site manager name" - }, - "site_manager_email": { - "type": "string", - "format": "email", - "description": "Site manager email" - }, - "site_manager_phone": { - "type": "string", - "description": "Site manager phone" - }, - "is_active": { - "type": "boolean", - "default": true, - "description": "Is site active" - } - }, - "required": [ - "site_name", - "partner_id" - ] -} \ No newline at end of file diff --git a/base44/entities/Staff.jsonc b/base44/entities/Staff.jsonc deleted file mode 100644 index 8717675..0000000 --- a/base44/entities/Staff.jsonc +++ /dev/null @@ -1,259 +0,0 @@ -{ - "name": "Staff", - "type": "object", - "properties": { - "employee_name": { - "type": "string", - "description": "Full name of the employee" - }, - "vendor_id": { - "type": "string", - "description": "ID of the vendor this staff belongs to" - }, - "vendor_name": { - "type": "string", - "description": "Name of the vendor company" - }, - "manager": { - "type": "string", - "description": "Manager's name" - }, - "contact_number": { - "type": "string", - "description": "Primary contact number" - }, - "phone": { - "type": "string", - "description": "Additional phone number" - }, - "email": { - "type": "string", - "format": "email", - "description": "Employee email address" - }, - "department": { - "type": "string", - "enum": [ - "Operations", - "Sales", - "HR", - "Finance", - "IT", - "Marketing", - "Customer Service", - "Logistics" - ], - "description": "Department" - }, - "hub_location": { - "type": "string" - }, - "event_location": { - "type": "string" - }, - "track": { - "type": "string" - }, - "address": { - "type": "string" - }, - "city": { - "type": "string" - }, - "position": { - "type": "string", - "description": "Primary job position/skill" - }, - "position_2": { - "type": "string", - "description": "Secondary job position/skill" - }, - "initial": { - "type": "string" - }, - "profile_type": { - "type": "string", - "enum": [ - "Skilled", - "Beginner", - "Cross-Trained" - ] - }, - "employment_type": { - "type": "string", - "enum": [ - "Full Time", - "Part Time", - "On call", - "Weekends", - "Specific Days", - "Seasonal", - "Medical Leave" - ] - }, - "english": { - "type": "string", - "enum": [ - "Fluent", - "Intermediate", - "Basic", - "None" - ] - }, - "english_required": { - "type": "boolean" - }, - "check_in": { - "type": "string", - "format": "date" - }, - "replaced_by": { - "type": "string" - }, - "ro": { - "type": "string" - }, - "mon": { - "type": "string" - }, - "schedule_days": { - "type": "string" - }, - "invoiced": { - "type": "boolean" - }, - "action": { - "type": "string" - }, - "notes": { - "type": "string" - }, - "accounting_comments": { - "type": "string" - }, - "pay_rate": { - "type": "number", - "minimum": 0, - "description": "Employee base pay rate per hour" - }, - "pay_rate_overtime": { - "type": "number", - "minimum": 0, - "description": "Overtime pay rate per hour (1.5x)" - }, - "pay_rate_double_time": { - "type": "number", - "minimum": 0, - "description": "Double-time pay rate per hour (2x)" - }, - "pay_rate_type": { - "type": "string", - "enum": [ - "Hourly", - "Salary", - "1099" - ], - "default": "Hourly" - }, - "pay_rate_effective_date": { - "type": "string", - "format": "date" - }, - "position_pay_rates": { - "type": "array", - "description": "Per-position pay rates \u2014 different rates based on the role/position worked", - "items": { - "type": "object", - "properties": { - "position": { - "type": "string", - "description": "Position/role name" - }, - "pay_rate": { - "type": "number", - "minimum": 0, - "description": "Base pay for this position" - }, - "pay_rate_overtime": { - "type": "number", - "minimum": 0 - }, - "pay_rate_double_time": { - "type": "number", - "minimum": 0 - }, - "notes": { - "type": "string" - } - } - } - }, - "rating": { - "type": "number", - "minimum": 0, - "maximum": 5 - }, - "shift_coverage_percentage": { - "type": "number", - "minimum": 0, - "maximum": 100 - }, - "cancellation_count": { - "type": "number", - "minimum": 0 - }, - "no_show_count": { - "type": "number", - "minimum": 0 - }, - "total_shifts": { - "type": "number", - "minimum": 0 - }, - "reliability_score": { - "type": "number", - "minimum": 0, - "maximum": 100 - }, - "background_check_status": { - "type": "string", - "enum": [ - "pending", - "cleared", - "failed", - "expired", - "not_required" - ], - "default": "pending" - }, - "background_check_date": { - "type": "string", - "format": "date" - }, - "certifications": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "issued_date": { - "type": "string", - "format": "date" - }, - "expiry_date": { - "type": "string", - "format": "date" - }, - "issuer": { - "type": "string" - } - } - } - } - }, - "required": [ - "employee_name" - ] -} \ No newline at end of file diff --git a/base44/entities/Task.jsonc b/base44/entities/Task.jsonc deleted file mode 100644 index 5fe4d49..0000000 --- a/base44/entities/Task.jsonc +++ /dev/null @@ -1,124 +0,0 @@ -{ - "name": "Task", - "type": "object", - "properties": { - "task_name": { - "type": "string", - "description": "Name of the task" - }, - "description": { - "type": "string", - "description": "Task description" - }, - "team_id": { - "type": "string", - "description": "ID of the team this task belongs to" - }, - "status": { - "type": "string", - "enum": [ - "pending", - "in_progress", - "on_hold", - "completed" - ], - "default": "pending", - "description": "Current status of the task" - }, - "priority": { - "type": "string", - "enum": [ - "low", - "normal", - "high" - ], - "default": "normal", - "description": "Task priority" - }, - "due_date": { - "type": "string", - "format": "date", - "description": "Due date" - }, - "progress": { - "type": "number", - "minimum": 0, - "maximum": 100, - "default": 0, - "description": "Task completion percentage" - }, - "assigned_members": { - "type": "array", - "description": "Team members assigned to this task", - "items": { - "type": "object", - "properties": { - "member_id": { - "type": "string" - }, - "member_name": { - "type": "string" - }, - "avatar_url": { - "type": "string" - } - } - } - }, - "owner_id": { - "type": "string", - "description": "Task owner ID" - }, - "owner_name": { - "type": "string", - "description": "Task owner name" - }, - "files": { - "type": "array", - "description": "Attached files", - "items": { - "type": "object", - "properties": { - "file_name": { - "type": "string" - }, - "file_url": { - "type": "string" - }, - "file_size": { - "type": "number" - }, - "uploaded_by": { - "type": "string" - }, - "uploaded_at": { - "type": "string", - "format": "date-time" - } - } - } - }, - "attachment_count": { - "type": "number", - "default": 0, - "description": "Number of attachments" - }, - "comment_count": { - "type": "number", - "default": 0, - "description": "Number of comments" - }, - "notes": { - "type": "string", - "description": "Additional notes" - }, - "order_index": { - "type": "number", - "description": "Order within the column" - } - }, - "required": [ - "task_name", - "team_id" - ] -} \ No newline at end of file diff --git a/base44/entities/TaskComment.jsonc b/base44/entities/TaskComment.jsonc deleted file mode 100644 index 0a7d7e6..0000000 --- a/base44/entities/TaskComment.jsonc +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "TaskComment", - "type": "object", - "properties": { - "task_id": { - "type": "string", - "description": "ID of the task this comment belongs to" - }, - "author_id": { - "type": "string", - "description": "ID of the comment author" - }, - "author_name": { - "type": "string", - "description": "Name of the comment author" - }, - "author_avatar": { - "type": "string", - "description": "Avatar URL of the author" - }, - "comment": { - "type": "string", - "description": "Comment text" - }, - "is_system": { - "type": "boolean", - "default": false, - "description": "Is this a system message (e.g., status change)" - } - }, - "required": [ - "task_id", - "author_name", - "comment" - ] -} \ No newline at end of file diff --git a/base44/entities/Team.jsonc b/base44/entities/Team.jsonc deleted file mode 100644 index 3036119..0000000 --- a/base44/entities/Team.jsonc +++ /dev/null @@ -1,146 +0,0 @@ -{ - "name": "Team", - "type": "object", - "properties": { - "team_name": { - "type": "string", - "description": "Name of the team" - }, - "owner_id": { - "type": "string", - "description": "ID of the team owner (user)" - }, - "owner_name": { - "type": "string", - "description": "Name of the team owner" - }, - "owner_role": { - "type": "string", - "enum": [ - "admin", - "procurement", - "operator", - "sector", - "client", - "vendor", - "workforce" - ], - "description": "Role of the team owner" - }, - "company_logo": { - "type": "string", - "description": "URL to company logo" - }, - "full_name": { - "type": "string", - "description": "Full name of primary contact" - }, - "email": { - "type": "string", - "format": "email", - "description": "Contact email" - }, - "phone": { - "type": "string", - "description": "Contact phone" - }, - "address": { - "type": "string", - "description": "Company address" - }, - "city": { - "type": "string", - "description": "City" - }, - "zip_code": { - "type": "string", - "description": "ZIP code" - }, - "vendor_id": { - "type": "string", - "description": "Vendor ID if applicable" - }, - "departments": { - "type": "array", - "description": "List of departments available for this team", - "items": { - "type": "string" - } - }, - "total_members": { - "type": "number", - "default": 0, - "description": "Total team members" - }, - "active_members": { - "type": "number", - "default": 0, - "description": "Active team members" - }, - "total_hubs": { - "type": "number", - "default": 0, - "description": "Total hubs" - }, - "favorite_staff": { - "type": "array", - "description": "Array of favorite staff IDs", - "items": { - "type": "object", - "properties": { - "staff_id": { - "type": "string" - }, - "staff_name": { - "type": "string" - }, - "position": { - "type": "string" - }, - "added_date": { - "type": "string", - "format": "date-time" - } - } - } - }, - "blocked_staff": { - "type": "array", - "description": "Array of blocked staff IDs", - "items": { - "type": "object", - "properties": { - "staff_id": { - "type": "string" - }, - "staff_name": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "blocked_date": { - "type": "string", - "format": "date-time" - } - } - } - }, - "favorite_staff_count": { - "type": "number", - "default": 0, - "description": "Number of favorite staff" - }, - "blocked_staff_count": { - "type": "number", - "default": 0, - "description": "Number of blocked staff" - } - }, - "required": [ - "team_name", - "owner_id", - "owner_name", - "owner_role" - ] -} \ No newline at end of file diff --git a/base44/entities/TeamHub.jsonc b/base44/entities/TeamHub.jsonc deleted file mode 100644 index a26949b..0000000 --- a/base44/entities/TeamHub.jsonc +++ /dev/null @@ -1,69 +0,0 @@ -{ - "name": "TeamHub", - "type": "object", - "properties": { - "team_id": { - "type": "string", - "description": "ID of the team" - }, - "hub_name": { - "type": "string", - "description": "Name of the hub/location (e.g., BVG 300)" - }, - "address": { - "type": "string", - "description": "Hub address (e.g., 300 Bayview Dr, Mountain View, CA 94043)" - }, - "city": { - "type": "string", - "description": "City" - }, - "state": { - "type": "string", - "description": "State" - }, - "zip_code": { - "type": "string", - "description": "ZIP code" - }, - "manager_name": { - "type": "string", - "description": "Hub manager name" - }, - "manager_email": { - "type": "string", - "format": "email", - "description": "Hub manager email" - }, - "departments": { - "type": "array", - "description": "Departments within this hub", - "items": { - "type": "object", - "properties": { - "department_name": { - "type": "string", - "description": "Department name (e.g., Catering FOH, Catering BOH)" - }, - "cost_center": { - "type": "string", - "description": "Cost center code" - }, - "manager_name": { - "type": "string", - "description": "Department manager" - } - } - } - }, - "is_active": { - "type": "boolean", - "default": true, - "description": "Whether the hub is active" - } - }, - "required": [ - "team_id", - "hub_name" - ] -} \ No newline at end of file diff --git a/base44/entities/TeamMember.jsonc b/base44/entities/TeamMember.jsonc deleted file mode 100644 index 16d4138..0000000 --- a/base44/entities/TeamMember.jsonc +++ /dev/null @@ -1,66 +0,0 @@ -{ - "name": "TeamMember", - "type": "object", - "properties": { - "team_id": { - "type": "string", - "description": "ID of the team this member belongs to" - }, - "member_name": { - "type": "string", - "description": "Name of the team member" - }, - "email": { - "type": "string", - "format": "email", - "description": "Member email" - }, - "phone": { - "type": "string", - "description": "Member phone" - }, - "title": { - "type": "string", - "description": "Job title" - }, - "role": { - "type": "string", - "enum": [ - "admin", - "manager", - "member", - "viewer" - ], - "description": "Role in the team" - }, - "department": { - "type": "string", - "description": "Department" - }, - "hub": { - "type": "string", - "description": "Assigned hub" - }, - "is_active": { - "type": "boolean", - "default": true, - "description": "Whether the member is active" - }, - "permissions": { - "type": "array", - "description": "Array of permissions", - "items": { - "type": "string" - } - }, - "avatar_url": { - "type": "string", - "description": "URL to member avatar" - } - }, - "required": [ - "team_id", - "member_name", - "email" - ] -} \ No newline at end of file diff --git a/base44/entities/TeamMemberInvite.jsonc b/base44/entities/TeamMemberInvite.jsonc deleted file mode 100644 index 4d7046c..0000000 --- a/base44/entities/TeamMemberInvite.jsonc +++ /dev/null @@ -1,72 +0,0 @@ -{ - "name": "TeamMemberInvite", - "type": "object", - "properties": { - "team_id": { - "type": "string", - "description": "ID of the team" - }, - "team_name": { - "type": "string", - "description": "Name of the team" - }, - "invite_code": { - "type": "string", - "description": "Unique invite code" - }, - "email": { - "type": "string", - "format": "email", - "description": "Email of invited person" - }, - "full_name": { - "type": "string", - "description": "Name of invited person" - }, - "role": { - "type": "string", - "enum": [ - "admin", - "manager", - "member", - "viewer" - ], - "description": "Proposed role" - }, - "invited_by": { - "type": "string", - "description": "Who sent the invite" - }, - "invite_status": { - "type": "string", - "enum": [ - "pending", - "accepted", - "expired", - "cancelled" - ], - "default": "pending", - "description": "Invitation status" - }, - "invited_date": { - "type": "string", - "format": "date-time", - "description": "When invite was sent" - }, - "accepted_date": { - "type": "string", - "format": "date-time", - "description": "When invite was accepted" - }, - "expires_at": { - "type": "string", - "format": "date-time", - "description": "When invite expires" - } - }, - "required": [ - "team_id", - "email", - "invited_by" - ] -} \ No newline at end of file diff --git a/base44/entities/Training.jsonc b/base44/entities/Training.jsonc deleted file mode 100644 index 3bcf9c1..0000000 --- a/base44/entities/Training.jsonc +++ /dev/null @@ -1,149 +0,0 @@ -{ - "name": "Training", - "type": "object", - "properties": { - "training_id": { - "type": "string", - "description": "Training record ID" - }, - "training_name": { - "type": "string", - "description": "Name of the training program" - }, - "training_type": { - "type": "string", - "enum": [ - "food_safety", - "alcohol_service", - "customer_service", - "safety", - "onboarding", - "culinary_skills", - "equipment_operation", - "compliance", - "leadership", - "other" - ], - "description": "Type of training" - }, - "description": { - "type": "string" - }, - "workforce_id": { - "type": "string", - "description": "Worker enrolled in this training" - }, - "workforce_name": { - "type": "string" - }, - "staff_id": { - "type": "string", - "description": "Staff record ID (if different from workforce)" - }, - "vendor_id": { - "type": "string", - "description": "Vendor sponsoring this training" - }, - "vendor_name": { - "type": "string" - }, - "client_id": { - "type": "string", - "description": "Client-specific training (if applicable)" - }, - "client_name": { - "type": "string" - }, - "instructor_name": { - "type": "string", - "description": "Instructor or training provider" - }, - "training_format": { - "type": "string", - "enum": [ - "in_person", - "online", - "hybrid", - "on_the_job", - "video" - ], - "default": "online" - }, - "duration_hours": { - "type": "number", - "minimum": 0, - "description": "Total training duration in hours" - }, - "enrollment_date": { - "type": "string", - "format": "date", - "description": "When worker was enrolled" - }, - "start_date": { - "type": "string", - "format": "date", - "description": "Training start date" - }, - "completion_date": { - "type": "string", - "format": "date", - "description": "Date training was completed" - }, - "expiry_date": { - "type": "string", - "format": "date", - "description": "When this training expires and needs renewal" - }, - "status": { - "type": "string", - "enum": [ - "not_started", - "enrolled", - "in_progress", - "completed", - "failed", - "expired", - "cancelled" - ], - "default": "not_started", - "description": "Training status" - }, - "score": { - "type": "number", - "minimum": 0, - "maximum": 100, - "description": "Score achieved (if graded)" - }, - "passing_score": { - "type": "number", - "default": 70, - "description": "Minimum passing score" - }, - "certification_earned": { - "type": "string", - "description": "Name of certification earned upon completion" - }, - "certification_id": { - "type": "string", - "description": "Reference to Certification entity if one was issued" - }, - "cost": { - "type": "number", - "minimum": 0, - "description": "Cost of this training" - }, - "billable_to_client": { - "type": "boolean", - "default": false - }, - "notes": { - "type": "string" - } - }, - "required": [ - "training_name", - "training_type", - "workforce_id", - "status" - ] -} \ No newline at end of file diff --git a/base44/entities/Transportation.jsonc b/base44/entities/Transportation.jsonc deleted file mode 100644 index 6c46c86..0000000 --- a/base44/entities/Transportation.jsonc +++ /dev/null @@ -1,139 +0,0 @@ -{ - "name": "Transportation", - "type": "object", - "properties": { - "transport_id": { - "type": "string", - "description": "Transport record ID" - }, - "transport_type": { - "type": "string", - "enum": [ - "shuttle", - "van", - "carpool", - "bus", - "public_transit", - "rideshare", - "personal_vehicle", - "walking" - ], - "description": "Mode of transportation" - }, - "shift_id": { - "type": "string", - "description": "Shift this transport serves" - }, - "event_id": { - "type": "string", - "description": "Event this transport serves" - }, - "workforce_id": { - "type": "string", - "description": "Worker being transported (if individual)" - }, - "workforce_name": { - "type": "string" - }, - "vendor_id": { - "type": "string", - "description": "Vendor providing/arranging transport" - }, - "vendor_name": { - "type": "string" - }, - "pickup_location": { - "type": "string", - "description": "Pickup address or landmark" - }, - "dropoff_location": { - "type": "string", - "description": "Dropoff location (typically the site/client location)" - }, - "site_id": { - "type": "string", - "description": "Destination Site ID" - }, - "client_id": { - "type": "string", - "description": "Client/Business ID at the destination" - }, - "client_name": { - "type": "string" - }, - "scheduled_pickup_time": { - "type": "string", - "format": "date-time", - "description": "Scheduled pickup time" - }, - "scheduled_dropoff_time": { - "type": "string", - "format": "date-time", - "description": "Scheduled dropoff time" - }, - "actual_pickup_time": { - "type": "string", - "format": "date-time" - }, - "actual_dropoff_time": { - "type": "string", - "format": "date-time" - }, - "driver_name": { - "type": "string", - "description": "Driver name (if applicable)" - }, - "driver_phone": { - "type": "string" - }, - "vehicle_identifier": { - "type": "string", - "description": "License plate or vehicle ID" - }, - "capacity": { - "type": "number", - "description": "Number of workers this transport can carry" - }, - "passenger_count": { - "type": "number", - "default": 0, - "description": "Actual number of workers transported" - }, - "cost_per_trip": { - "type": "number", - "minimum": 0, - "description": "Cost per trip" - }, - "billable_to_client": { - "type": "boolean", - "default": false, - "description": "Whether transport cost is billed to client" - }, - "status": { - "type": "string", - "enum": [ - "scheduled", - "in_progress", - "completed", - "cancelled", - "no_show", - "delayed" - ], - "default": "scheduled", - "description": "Transport status" - }, - "distance_miles": { - "type": "number", - "description": "Distance in miles" - }, - "notes": { - "type": "string" - } - }, - "required": [ - "transport_type", - "pickup_location", - "dropoff_location", - "status" - ] -} \ No newline at end of file diff --git a/base44/entities/User.jsonc b/base44/entities/User.jsonc deleted file mode 100644 index 72d5675..0000000 --- a/base44/entities/User.jsonc +++ /dev/null @@ -1,185 +0,0 @@ -{ - "name": "User", - "type": "object", - "properties": { - "full_name": { - "type": "string", - "description": "Full name of the user" - }, - "user_role": { - "type": "string", - "enum": [ - "admin", - "procurement", - "operator", - "sector", - "client", - "vendor", - "workforce" - ], - "description": "User's role in the system" - }, - "company_name": { - "type": "string", - "description": "Company or organization name" - }, - "profile_picture": { - "type": "string", - "description": "URL to profile picture" - }, - "phone": { - "type": "string", - "description": "Phone number" - }, - "address": { - "type": "string", - "description": "Address" - }, - "preferred_vendor_id": { - "type": "string", - "description": "ID of the client's preferred/default vendor" - }, - "preferred_vendor_name": { - "type": "string", - "description": "Name of the client's preferred vendor" - }, - "backup_vendor_ids": { - "type": "array", - "description": "List of backup vendor IDs", - "items": { - "type": "string" - } - }, - "dashboard_layout": { - "type": "object", - "description": "User's customized dashboard layout preferences (legacy, kept for backward compatibility)", - "properties": { - "widgets": { - "type": "array", - "description": "Ordered list of visible widgets", - "items": { - "type": "string" - } - }, - "hidden_widgets": { - "type": "array", - "description": "List of hidden widgets", - "items": { - "type": "string" - } - }, - "layout_version": { - "type": "string", - "description": "Layout version for migration" - } - } - }, - "dashboard_layout_client": { - "type": "object", - "description": "Client dashboard layout", - "properties": { - "widgets": { - "type": "array", - "items": { - "type": "string" - } - }, - "hidden_widgets": { - "type": "array", - "items": { - "type": "string" - } - }, - "layout_version": { - "type": "string" - } - } - }, - "dashboard_layout_vendor": { - "type": "object", - "description": "Vendor dashboard layout", - "properties": { - "widgets": { - "type": "array", - "items": { - "type": "string" - } - }, - "hidden_widgets": { - "type": "array", - "items": { - "type": "string" - } - }, - "layout_version": { - "type": "string" - } - } - }, - "dashboard_layout_operator": { - "type": "object", - "description": "Operator dashboard layout", - "properties": { - "widgets": { - "type": "array", - "items": { - "type": "string" - } - }, - "hidden_widgets": { - "type": "array", - "items": { - "type": "string" - } - }, - "layout_version": { - "type": "string" - } - } - }, - "dashboard_layout_workforce": { - "type": "object", - "description": "Workforce dashboard layout", - "properties": { - "widgets": { - "type": "array", - "items": { - "type": "string" - } - }, - "hidden_widgets": { - "type": "array", - "items": { - "type": "string" - } - }, - "layout_version": { - "type": "string" - } - } - }, - "preferences": { - "type": "object", - "description": "User preferences and settings", - "properties": { - "theme": { - "type": "string", - "enum": [ - "light", - "dark" - ], - "default": "light" - }, - "notifications_enabled": { - "type": "boolean", - "default": true - }, - "email_notifications": { - "type": "boolean", - "default": true - } - } - } - }, - "required": [] -} \ No newline at end of file diff --git a/base44/entities/Vendor.jsonc b/base44/entities/Vendor.jsonc deleted file mode 100644 index 9f09aba..0000000 --- a/base44/entities/Vendor.jsonc +++ /dev/null @@ -1,217 +0,0 @@ -{ - "name": "Vendor", - "type": "object", - "properties": { - "vendor_number": { - "type": "string", - "description": "Vendor Number format VN-#### (auto-generated)", - "pattern": "^VN-[0-9]{4}$" - }, - "legal_name": { - "type": "string", - "description": "Legal business name" - }, - "doing_business_as": { - "type": "string", - "description": "DBA / Trade name" - }, - "region": { - "type": "string", - "enum": [ - "National", - "Bay Area", - "Southern California", - "Northern California", - "West", - "East", - "Midwest", - "South" - ], - "description": "Geographic region vendor operates in" - }, - "state": { - "type": "string", - "description": "Primary state (or 'Multiple' for multi-state)" - }, - "city": { - "type": "string", - "description": "Primary city" - }, - "service_specialty": { - "type": "string", - "description": "Service specialty (e.g., Event Staffing, Full Service Events, On-Demand Gig Platform)" - }, - "workforce_count": { - "type": "number", - "description": "Total workforce/staff count available" - }, - "platform_type": { - "type": "string", - "enum": [ - "Full Platform", - "Building platform (KROW)", - "Partial Tech", - "Traditional" - ], - "description": "Technology/platform integration level" - }, - "tax_id": { - "type": "string", - "description": "Federal Tax ID / EIN" - }, - "business_type": { - "type": "string", - "enum": [ - "Corporation", - "LLC", - "Partnership", - "Sole Proprietorship" - ], - "description": "Business entity type" - }, - "primary_contact_name": { - "type": "string", - "description": "Primary contact person" - }, - "primary_contact_email": { - "type": "string", - "format": "email", - "description": "Primary contact email" - }, - "primary_contact_phone": { - "type": "string", - "description": "Primary contact phone" - }, - "billing_address": { - "type": "string", - "description": "Billing address" - }, - "service_address": { - "type": "string", - "description": "Service/office address" - }, - "coverage_regions": { - "type": "array", - "description": "Geographic regions vendor can service", - "items": { - "type": "string" - } - }, - "eligible_roles": { - "type": "array", - "description": "Roles/positions vendor can provide", - "items": { - "type": "string" - } - }, - "insurance_certificate": { - "type": "string", - "description": "URL to insurance certificate" - }, - "insurance_expiry": { - "type": "string", - "format": "date", - "description": "Insurance expiration date" - }, - "w9_document": { - "type": "string", - "description": "URL to W9 form" - }, - "coi_document": { - "type": "string", - "description": "URL to Certificate of Insurance" - }, - "compliance_package_id": { - "type": "string", - "description": "Reference to compliance package" - }, - "performance_scorecard_id": { - "type": "string", - "description": "Reference to performance scorecard" - }, - "performance_requirements": { - "type": "array", - "description": "Customized KPIs and service standards the vendor must meet", - "items": { - "type": "object", - "properties": { - "metric": { - "type": "string" - }, - "target": { - "type": "string" - }, - "operator": { - "type": "string" - }, - "unit": { - "type": "string" - }, - "enabled": { - "type": "boolean", - "default": true - } - } - } - }, - "compliance_requirements": { - "type": "array", - "description": "Customized compliance and attestation requirements the vendor must acknowledge", - "items": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "description": { - "type": "string" - }, - "required": { - "type": "boolean", - "default": true - } - } - } - }, - "vendor_fee_percentage": { - "type": "number", - "minimum": 0, - "maximum": 100, - "description": "Vendor admin fee percentage set by procurement" - }, - "approval_status": { - "type": "string", - "enum": [ - "pending", - "approved", - "suspended", - "terminated" - ], - "default": "pending", - "description": "Vendor approval status" - }, - "approved_date": { - "type": "string", - "format": "date", - "description": "Date vendor was approved" - }, - "approved_by": { - "type": "string", - "description": "User who approved vendor" - }, - "is_active": { - "type": "boolean", - "default": true, - "description": "Is vendor currently active" - }, - "notes": { - "type": "string", - "description": "Internal notes about vendor" - } - }, - "required": [ - "legal_name", - "vendor_number", - "primary_contact_email" - ] -} \ No newline at end of file diff --git a/base44/entities/VendorDefaultSettings.jsonc b/base44/entities/VendorDefaultSettings.jsonc deleted file mode 100644 index 81b61b4..0000000 --- a/base44/entities/VendorDefaultSettings.jsonc +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "VendorDefaultSettings", - "type": "object", - "properties": { - "vendor_name": { - "type": "string", - "description": "Name of the vendor" - }, - "default_markup_percentage": { - "type": "number", - "minimum": 0, - "maximum": 100, - "description": "Default markup percentage for this vendor" - }, - "default_vendor_fee_percentage": { - "type": "number", - "minimum": 0, - "maximum": 100, - "description": "Default vendor fee percentage for this vendor" - }, - "notes": { - "type": "string", - "description": "Additional notes about vendor defaults" - } - }, - "required": [ - "vendor_name", - "default_markup_percentage", - "default_vendor_fee_percentage" - ] -} \ No newline at end of file diff --git a/base44/entities/VendorDocumentReview.jsonc b/base44/entities/VendorDocumentReview.jsonc deleted file mode 100644 index 49b12d4..0000000 --- a/base44/entities/VendorDocumentReview.jsonc +++ /dev/null @@ -1,147 +0,0 @@ -{ - "name": "VendorDocumentReview", - "type": "object", - "properties": { - "vendor_id": { - "type": "string", - "description": "Vendor ID" - }, - "vendor_name": { - "type": "string", - "description": "Vendor name" - }, - "document_type": { - "type": "string", - "enum": [ - "Contract", - "NDA", - "W9", - "COI", - "Insurance", - "Service Agreement", - "Other" - ], - "description": "Type of document being reviewed" - }, - "document_url": { - "type": "string", - "description": "URL to the document PDF" - }, - "document_name": { - "type": "string", - "description": "Name of the document" - }, - "review_notes": { - "type": "string", - "description": "Notes taken by vendor during review" - }, - "annotations": { - "type": "array", - "description": "Document annotations (highlights, comments, drawings)", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "highlight", - "comment", - "question", - "emoji", - "signature" - ] - }, - "page_number": { - "type": "number" - }, - "selected_text": { - "type": "string" - }, - "comment": { - "type": "string" - }, - "emoji": { - "type": "string" - }, - "color": { - "type": "string" - }, - "position": { - "type": "object", - "properties": { - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - } - }, - "created_date": { - "type": "string", - "format": "date-time" - } - } - } - }, - "questions": { - "type": "array", - "description": "Questions or concerns about the document", - "items": { - "type": "object", - "properties": { - "question": { - "type": "string" - }, - "page_number": { - "type": "number" - }, - "status": { - "type": "string", - "enum": [ - "open", - "answered", - "resolved" - ] - }, - "answer": { - "type": "string" - } - } - } - }, - "reviewed": { - "type": "boolean", - "default": false, - "description": "Has vendor reviewed this document" - }, - "reviewed_date": { - "type": "string", - "format": "date-time", - "description": "When vendor marked as reviewed" - }, - "acknowledged": { - "type": "boolean", - "default": false, - "description": "Has vendor acknowledged/accepted the document" - }, - "acknowledged_date": { - "type": "string", - "format": "date-time", - "description": "When vendor acknowledged the document" - }, - "time_spent_minutes": { - "type": "number", - "description": "Total time spent reviewing (in minutes)" - } - }, - "required": [ - "vendor_name", - "document_type", - "document_url", - "document_name" - ] -} \ No newline at end of file diff --git a/base44/entities/VendorInvite.jsonc b/base44/entities/VendorInvite.jsonc deleted file mode 100644 index c24fad9..0000000 --- a/base44/entities/VendorInvite.jsonc +++ /dev/null @@ -1,112 +0,0 @@ -{ - "name": "VendorInvite", - "type": "object", - "properties": { - "invite_code": { - "type": "string", - "description": "Unique invite code (e.g., INV-XXXX)" - }, - "company_name": { - "type": "string", - "description": "Vendor company name" - }, - "primary_contact_name": { - "type": "string", - "description": "Point of contact name" - }, - "primary_contact_email": { - "type": "string", - "format": "email", - "description": "Point of contact email" - }, - "vendor_admin_fee": { - "type": "number", - "minimum": 0, - "maximum": 100, - "description": "Vendor admin fee percentage set by procurement" - }, - "performance_requirements": { - "type": "array", - "description": "Customized KPIs and service standards the vendor must meet", - "items": { - "type": "object", - "properties": { - "metric": { - "type": "string" - }, - "target": { - "type": "string" - }, - "operator": { - "type": "string" - }, - "unit": { - "type": "string" - }, - "enabled": { - "type": "boolean", - "default": true - } - } - } - }, - "compliance_requirements": { - "type": "array", - "description": "Customized compliance and attestation requirements the vendor must acknowledge", - "items": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "description": { - "type": "string" - }, - "required": { - "type": "boolean", - "default": true - } - } - } - }, - "invited_by": { - "type": "string", - "description": "Email of procurement admin who sent invite" - }, - "invite_status": { - "type": "string", - "enum": [ - "pending", - "accepted", - "completed", - "expired" - ], - "default": "pending", - "description": "Status of the invite" - }, - "invite_sent_date": { - "type": "string", - "format": "date-time", - "description": "When the invite was sent" - }, - "invite_accepted_date": { - "type": "string", - "format": "date-time", - "description": "When vendor accepted/started onboarding" - }, - "vendor_id": { - "type": "string", - "description": "Vendor ID once they complete onboarding" - }, - "notes": { - "type": "string", - "description": "Internal notes about this invite" - } - }, - "required": [ - "company_name", - "primary_contact_email", - "vendor_admin_fee", - "invited_by" - ] -} \ No newline at end of file diff --git a/base44/entities/VendorNetworkApproval.jsonc b/base44/entities/VendorNetworkApproval.jsonc deleted file mode 100644 index 1754560..0000000 --- a/base44/entities/VendorNetworkApproval.jsonc +++ /dev/null @@ -1,119 +0,0 @@ -{ - "name": "VendorNetworkApproval", - "type": "object", - "properties": { - "vendor_id": { - "type": "string", - "description": "ID of the approved vendor" - }, - "vendor_name": { - "type": "string", - "description": "Name of the vendor" - }, - "enterprise_network": { - "type": "string", - "enum": [ - "Compass", - "Aramark", - "Sodexo", - "Foodbuy", - "Bon App\u00e9tit", - "Eurest" - ], - "description": "Enterprise network vendor is approved for" - }, - "approval_status": { - "type": "string", - "enum": [ - "pending", - "approved", - "rejected", - "suspended" - ], - "default": "pending", - "description": "Current approval status" - }, - "approved_by": { - "type": "string", - "description": "Procurement manager who approved" - }, - "approved_date": { - "type": "string", - "format": "date", - "description": "Date of approval" - }, - "rate_book_id": { - "type": "string", - "description": "Associated rate book ID for this network" - }, - "regions_approved": { - "type": "array", - "description": "Geographic regions vendor is approved to serve", - "items": { - "type": "string" - } - }, - "categories_approved": { - "type": "array", - "description": "Service categories vendor is approved for", - "items": { - "type": "string" - } - }, - "compliance_documents": { - "type": "array", - "description": "Required compliance documents", - "items": { - "type": "object", - "properties": { - "document_type": { - "type": "string" - }, - "document_url": { - "type": "string" - }, - "verified": { - "type": "boolean" - } - } - } - }, - "restrictions": { - "type": "object", - "description": "Any restrictions on vendor's approved status", - "properties": { - "max_order_size": { - "type": "number" - }, - "max_concurrent_events": { - "type": "number" - }, - "excluded_clients": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "valid_from": { - "type": "string", - "format": "date", - "description": "Approval start date" - }, - "valid_until": { - "type": "string", - "format": "date", - "description": "Approval expiration date" - }, - "notes": { - "type": "string", - "description": "Additional notes about approval" - } - }, - "required": [ - "vendor_name", - "enterprise_network", - "approval_status" - ] -} \ No newline at end of file diff --git a/base44/entities/VendorPartnerLink.jsonc b/base44/entities/VendorPartnerLink.jsonc deleted file mode 100644 index ebc5275..0000000 --- a/base44/entities/VendorPartnerLink.jsonc +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "VendorPartnerLink", - "type": "object", - "properties": { - "vendor_id": { - "type": "string", - "description": "Vendor ID" - }, - "vendor_name": { - "type": "string", - "description": "Vendor name" - }, - "partner_id": { - "type": "string", - "description": "Partner ID" - }, - "partner_name": { - "type": "string", - "description": "Partner name" - }, - "assigned_by": { - "type": "string", - "description": "Who assigned this link" - }, - "assigned_date": { - "type": "string", - "format": "date", - "description": "When the link was created" - }, - "is_active": { - "type": "boolean", - "default": true, - "description": "Is this link active" - } - }, - "required": [ - "vendor_id", - "partner_id" - ] -} \ No newline at end of file diff --git a/base44/entities/VendorRate.jsonc b/base44/entities/VendorRate.jsonc deleted file mode 100644 index 7be82f3..0000000 --- a/base44/entities/VendorRate.jsonc +++ /dev/null @@ -1,248 +0,0 @@ -{ - "name": "VendorRate", - "type": "object", - "properties": { - "vendor_id": { - "type": "string", - "description": "ID of the vendor this rate belongs to" - }, - "vendor_name": { - "type": "string", - "description": "Name of the vendor" - }, - "rate_book_name": { - "type": "string", - "description": "Name of the rate book (e.g., 'Default', 'Compass Approved', 'Google Caf\u00e9 7')" - }, - "rate_book_type": { - "type": "string", - "enum": [ - "default", - "enterprise_network", - "client_specific" - ], - "description": "Type of rate book: default (vendor's own rates), enterprise_network (Compass/Aramark approved), or client_specific (negotiated)" - }, - "enterprise_network": { - "type": "string", - "enum": [ - "Compass", - "Aramark", - "Sodexo", - "Foodbuy", - "Bon App\u00e9tit", - "Eurest", - "None" - ], - "description": "Enterprise network this rate book belongs to (if applicable)" - }, - "is_approved_rate": { - "type": "boolean", - "default": false, - "description": "Whether this is an approved procurement rate (locked for vendors)" - }, - "approved_by_procurement": { - "type": "string", - "description": "Name of procurement manager who approved these rates" - }, - "approved_date": { - "type": "string", - "format": "date", - "description": "Date rates were approved" - }, - "client_id": { - "type": "string", - "description": "Specific client ID if this is a client-specific rate book" - }, - "client_name": { - "type": "string", - "description": "Specific client name if this is a client-specific rate book" - }, - "category": { - "type": "string", - "enum": [ - "Kitchen and Culinary", - "Concessions", - "Facilities", - "Bartending", - "Security", - "Event Staff", - "Management", - "Technical", - "Other" - ], - "description": "Service category" - }, - "role_name": { - "type": "string", - "description": "Name of the role/position" - }, - "region": { - "type": "string", - "description": "Geographic region (e.g., 'Bay Area', 'LA', 'National')" - }, - "employee_wage": { - "type": "number", - "minimum": 0, - "description": "Employee base wage per hour (must be >= minimum wage)" - }, - "overtime_rate": { - "type": "number", - "minimum": 0, - "description": "Overtime rate (typically 1.5x base wage)" - }, - "double_time_rate": { - "type": "number", - "minimum": 0, - "description": "Double-time rate (typically 2x base wage)" - }, - "travel_rate": { - "type": "number", - "minimum": 0, - "description": "Travel time rate per hour (if applicable)" - }, - "markup_percentage": { - "type": "number", - "minimum": 0, - "maximum": 100, - "description": "Markup percentage on employee wage" - }, - "vendor_fee_percentage": { - "type": "number", - "minimum": 0, - "maximum": 100, - "description": "Vendor fee as percentage on (wage + markup)" - }, - "client_rate": { - "type": "number", - "minimum": 0, - "description": "Final rate charged to client per hour" - }, - "approved_cap_rate": { - "type": "number", - "description": "Maximum rate approved by enterprise network (vendors cannot exceed this)" - }, - "discount_from_approved": { - "type": "number", - "description": "Dollar amount discount from approved cap rate (if vendor is offering lower rate)" - }, - "discount_percentage": { - "type": "number", - "description": "Percentage discount from approved cap rate" - }, - "is_discounted": { - "type": "boolean", - "default": false, - "description": "Whether vendor is offering a discount below approved rate" - }, - "negotiation_allowed": { - "type": "boolean", - "default": true, - "description": "Whether clients can request rate negotiations" - }, - "is_active": { - "type": "boolean", - "default": true, - "description": "Whether this rate is currently active" - }, - "is_editable_by_vendor": { - "type": "boolean", - "default": true, - "description": "Whether vendor can edit this rate (false for locked procurement rates)" - }, - "minimum_wage_compliance": { - "type": "boolean", - "description": "Whether this rate meets minimum wage requirements" - }, - "market_comparison": { - "type": "object", - "description": "Market comparison data", - "properties": { - "market_average": { - "type": "number", - "description": "Market average for this role" - }, - "market_position": { - "type": "string", - "enum": [ - "below_market", - "at_market", - "above_market", - "significantly_above" - ], - "description": "How this rate compares to market" - }, - "competitiveness_score": { - "type": "number", - "minimum": 0, - "maximum": 100, - "description": "Competitiveness score (0-100)" - }, - "market_warning": { - "type": "string", - "description": "Warning if rate is significantly above or below market" - } - } - }, - "compliance": { - "type": "object", - "description": "Compliance information", - "properties": { - "csta_compliant": { - "type": "boolean", - "default": false, - "description": "California Staffing Agency compliance" - }, - "minimum_wage_verified": { - "type": "boolean", - "default": false, - "description": "Minimum wage verification status" - }, - "compliance_verified_date": { - "type": "string", - "format": "date", - "description": "Date compliance was last verified" - } - } - }, - "shift_type": { - "type": "string", - "enum": [ - "regular", - "night", - "weekend", - "holiday", - "premium" - ], - "default": "regular", - "description": "Type of shift this rate applies to" - }, - "valid_from": { - "type": "string", - "format": "date", - "description": "Date this rate becomes valid" - }, - "valid_until": { - "type": "string", - "format": "date", - "description": "Date this rate expires" - }, - "notes": { - "type": "string", - "description": "Additional notes about this rate" - }, - "internal_notes": { - "type": "string", - "description": "Internal vendor notes (not visible to clients)" - } - }, - "required": [ - "vendor_name", - "rate_book_name", - "rate_book_type", - "category", - "role_name", - "employee_wage", - "client_rate" - ] -} \ No newline at end of file diff --git a/base44/entities/VendorRateBook.jsonc b/base44/entities/VendorRateBook.jsonc deleted file mode 100644 index 8098b81..0000000 --- a/base44/entities/VendorRateBook.jsonc +++ /dev/null @@ -1,113 +0,0 @@ -{ - "name": "VendorRateBook", - "type": "object", - "properties": { - "vendor_id": { - "type": "string", - "description": "ID of the vendor who owns this rate book" - }, - "vendor_name": { - "type": "string", - "description": "Name of the vendor" - }, - "rate_book_name": { - "type": "string", - "description": "Name of the rate book (e.g., 'Default Rates', 'Compass Network', 'Google Special')" - }, - "rate_book_type": { - "type": "string", - "enum": [ - "default", - "enterprise_network", - "client_specific", - "premium", - "seasonal" - ], - "description": "Type of rate book" - }, - "enterprise_network": { - "type": "string", - "enum": [ - "Compass", - "Aramark", - "Sodexo", - "Foodbuy", - "Bon App\u00e9tit", - "Eurest", - "None" - ], - "description": "Enterprise network if applicable" - }, - "is_approved_by_procurement": { - "type": "boolean", - "default": false, - "description": "Whether this rate book is approved by procurement" - }, - "approved_by": { - "type": "string", - "description": "Name of person who approved this rate book" - }, - "approved_date": { - "type": "string", - "format": "date", - "description": "Date of approval" - }, - "is_locked": { - "type": "boolean", - "default": false, - "description": "Whether rates in this book are locked (cannot be edited by vendor)" - }, - "is_active": { - "type": "boolean", - "default": true, - "description": "Whether this rate book is currently active" - }, - "client_assignments": { - "type": "array", - "description": "Clients assigned to use this rate book", - "items": { - "type": "object", - "properties": { - "client_id": { - "type": "string" - }, - "client_name": { - "type": "string" - }, - "assigned_date": { - "type": "string", - "format": "date-time" - } - } - } - }, - "valid_from": { - "type": "string", - "format": "date", - "description": "Start date for rate book validity" - }, - "valid_until": { - "type": "string", - "format": "date", - "description": "End date for rate book validity" - }, - "description": { - "type": "string", - "description": "Description of this rate book" - }, - "total_roles": { - "type": "number", - "default": 0, - "description": "Total number of roles in this rate book" - }, - "notes": { - "type": "string", - "description": "Additional notes" - } - }, - "required": [ - "vendor_name", - "rate_book_name", - "rate_book_type" - ] -} \ No newline at end of file diff --git a/base44/entities/VendorSectorLink.jsonc b/base44/entities/VendorSectorLink.jsonc deleted file mode 100644 index 16bf651..0000000 --- a/base44/entities/VendorSectorLink.jsonc +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "VendorSectorLink", - "type": "object", - "properties": { - "vendor_id": { - "type": "string", - "description": "Vendor ID" - }, - "vendor_name": { - "type": "string", - "description": "Vendor name" - }, - "sector_id": { - "type": "string", - "description": "Sector ID" - }, - "sector_name": { - "type": "string", - "description": "Sector name" - }, - "assigned_by": { - "type": "string", - "description": "Who assigned this link" - }, - "assigned_date": { - "type": "string", - "format": "date", - "description": "When the link was created" - }, - "is_active": { - "type": "boolean", - "default": true, - "description": "Is this link active" - } - }, - "required": [ - "vendor_id", - "sector_id" - ] -} \ No newline at end of file diff --git a/base44/entities/WorkerAvailability.jsonc b/base44/entities/WorkerAvailability.jsonc deleted file mode 100644 index 101c198..0000000 --- a/base44/entities/WorkerAvailability.jsonc +++ /dev/null @@ -1,129 +0,0 @@ -{ - "name": "WorkerAvailability", - "type": "object", - "properties": { - "staff_id": { - "type": "string", - "description": "Reference to Staff entity" - }, - "staff_name": { - "type": "string", - "description": "Staff member name" - }, - "availability_status": { - "type": "string", - "enum": [ - "CONFIRMED_AVAILABLE", - "UNKNOWN", - "BLOCKED" - ], - "default": "UNKNOWN", - "description": "Current availability status" - }, - "predicted_availability_score": { - "type": "number", - "minimum": 0, - "maximum": 100, - "default": 50, - "description": "ML/rules-based prediction of availability (0-100)" - }, - "need_work_index": { - "type": "number", - "minimum": 0, - "maximum": 100, - "default": 0, - "description": "How much worker needs hours (0-100)" - }, - "scheduled_hours_this_period": { - "type": "number", - "default": 0, - "description": "Hours scheduled in current period" - }, - "desired_hours_this_period": { - "type": "number", - "default": 40, - "description": "Hours worker wants in current period" - }, - "last_shift_date": { - "type": "string", - "format": "date", - "description": "Date of last completed shift" - }, - "acceptance_rate": { - "type": "number", - "minimum": 0, - "maximum": 100, - "default": 0, - "description": "Historical acceptance rate percentage" - }, - "utilization_percentage": { - "type": "number", - "minimum": 0, - "maximum": 100, - "default": 0, - "description": "Scheduled hours / desired hours * 100" - }, - "days_since_last_shift": { - "type": "number", - "default": 0, - "description": "Days since last shift" - }, - "total_shifts_this_period": { - "type": "number", - "default": 0, - "description": "Number of shifts in current period" - }, - "available_dates": { - "type": "array", - "description": "Dates worker is confirmed available", - "items": { - "type": "string", - "format": "date" - } - }, - "blocked_dates": { - "type": "array", - "description": "Dates worker is blocked/unavailable", - "items": { - "type": "string", - "format": "date" - } - }, - "preferences": { - "type": "object", - "description": "Worker preferences", - "properties": { - "preferred_days": { - "type": "array", - "items": { - "type": "string" - } - }, - "preferred_shift_types": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "Morning", - "Day", - "Evening", - "Night", - "Overnight" - ] - } - }, - "max_commute_miles": { - "type": "number" - }, - "wants_more_hours": { - "type": "boolean", - "default": false - } - } - } - }, - "required": [ - "staff_id", - "staff_name" - ] -} \ No newline at end of file diff --git a/base44/entities/WorkerReputationProfile.jsonc b/base44/entities/WorkerReputationProfile.jsonc deleted file mode 100644 index a9b91de..0000000 --- a/base44/entities/WorkerReputationProfile.jsonc +++ /dev/null @@ -1,99 +0,0 @@ -{ - "name": "WorkerReputationProfile", - "type": "object", - "properties": { - "worker_id": { - "type": "string", - "description": "Linked workforce member ID" - }, - "worker_name": { - "type": "string", - "description": "Full name" - }, - "total_shifts": { - "type": "number", - "default": 0, - "description": "Total verified completed shifts across all agencies" - }, - "no_shows": { - "type": "number", - "default": 0 - }, - "late_arrivals": { - "type": "number", - "default": 0 - }, - "last_minute_cancels": { - "type": "number", - "default": 0 - }, - "attendance_rate": { - "type": "number", - "minimum": 0, - "maximum": 100, - "description": "Attendance percentage (0-100)" - }, - "avg_client_rating": { - "type": "number", - "minimum": 0, - "maximum": 5 - }, - "avg_supervisor_rating": { - "type": "number", - "minimum": 0, - "maximum": 5 - }, - "verified_skills": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Verified skill/role tags" - }, - "verified_certifications": { - "type": "array", - "items": { - "type": "string" - } - }, - "contributing_agencies": { - "type": "number", - "default": 0, - "description": "Number of agencies that have contributed data" - }, - "trust_score": { - "type": "number", - "minimum": 0, - "maximum": 100, - "description": "Computed KROW trust score (0-100)" - }, - "trust_tier": { - "type": "string", - "enum": [ - "Bronze", - "Silver", - "Gold", - "Platinum" - ], - "default": "Bronze" - }, - "opted_in": { - "type": "boolean", - "default": true, - "description": "Worker has opted into the reputation network" - }, - "profile_visibility": { - "type": "string", - "enum": [ - "public", - "network_only", - "private" - ], - "default": "network_only" - } - }, - "required": [ - "worker_id", - "worker_name" - ] -} \ No newline at end of file diff --git a/base44/entities/Workforce.jsonc b/base44/entities/Workforce.jsonc deleted file mode 100644 index 4a63fbd..0000000 --- a/base44/entities/Workforce.jsonc +++ /dev/null @@ -1,244 +0,0 @@ -{ - "name": "Workforce", - "type": "object", - "properties": { - "workforce_number": { - "type": "string", - "description": "Worker Number format WF-#### (auto-generated)", - "pattern": "^WF-[0-9]{4,6}$" - }, - "vendor_id": { - "type": "string", - "description": "Vendor who manages this worker" - }, - "vendor_name": { - "type": "string", - "description": "Vendor name" - }, - "first_name": { - "type": "string", - "description": "Worker first name" - }, - "last_name": { - "type": "string", - "description": "Worker last name" - }, - "email": { - "type": "string", - "format": "email", - "description": "Worker email" - }, - "phone": { - "type": "string", - "description": "Worker phone" - }, - "address": { - "type": "string", - "description": "Worker address" - }, - "city": { - "type": "string", - "description": "City" - }, - "state": { - "type": "string", - "description": "State" - }, - "zip_code": { - "type": "string", - "description": "ZIP code" - }, - "date_of_birth": { - "type": "string", - "format": "date", - "description": "Date of birth" - }, - "ssn_last_four": { - "type": "string", - "description": "Last 4 digits of SSN", - "pattern": "^[0-9]{4}$" - }, - "employment_type": { - "type": "string", - "enum": [ - "W2", - "1099", - "Temporary", - "Contract" - ], - "description": "Employment classification" - }, - "skills": { - "type": "array", - "description": "Worker skills", - "items": { - "type": "string" - } - }, - "roles_qualified": { - "type": "array", - "description": "Roles worker is qualified for", - "items": { - "type": "string" - } - }, - "certifications": { - "type": "array", - "description": "Certifications", - "items": { - "type": "object", - "properties": { - "cert_name": { - "type": "string" - }, - "cert_number": { - "type": "string" - }, - "issued_date": { - "type": "string", - "format": "date" - }, - "expiry_date": { - "type": "string", - "format": "date" - }, - "issuer": { - "type": "string" - }, - "document_url": { - "type": "string" - } - } - } - }, - "background_check_status": { - "type": "string", - "enum": [ - "Pending", - "Cleared", - "Failed", - "Expired" - ], - "description": "Background check status" - }, - "background_check_date": { - "type": "string", - "format": "date", - "description": "Background check completion date" - }, - "drug_test_status": { - "type": "string", - "enum": [ - "Pending", - "Passed", - "Failed", - "Expired" - ], - "description": "Drug test status" - }, - "drug_test_date": { - "type": "string", - "format": "date", - "description": "Drug test date" - }, - "reliability_index": { - "type": "number", - "minimum": 0, - "maximum": 100, - "description": "Reliability score (0-100)" - }, - "total_assignments": { - "type": "number", - "default": 0, - "description": "Total assignments completed" - }, - "cancelled_assignments": { - "type": "number", - "default": 0, - "description": "Cancelled assignments" - }, - "no_shows": { - "type": "number", - "default": 0, - "description": "No-show count" - }, - "average_rating": { - "type": "number", - "minimum": 0, - "maximum": 5, - "description": "Average performance rating" - }, - "languages": { - "type": "array", - "description": "Languages spoken", - "items": { - "type": "string" - } - }, - "availability": { - "type": "object", - "description": "Worker availability", - "properties": { - "monday": { - "type": "boolean" - }, - "tuesday": { - "type": "boolean" - }, - "wednesday": { - "type": "boolean" - }, - "thursday": { - "type": "boolean" - }, - "friday": { - "type": "boolean" - }, - "saturday": { - "type": "boolean" - }, - "sunday": { - "type": "boolean" - }, - "shift_preferences": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "Morning", - "Day", - "Evening", - "Night", - "Overnight" - ] - } - } - } - }, - "is_active": { - "type": "boolean", - "default": true, - "description": "Is worker active" - }, - "hire_date": { - "type": "string", - "format": "date", - "description": "Date worker was hired" - }, - "termination_date": { - "type": "string", - "format": "date", - "description": "Termination date if applicable" - }, - "notes": { - "type": "string", - "description": "Internal notes" - } - }, - "required": [ - "vendor_id", - "first_name", - "last_name", - "workforce_number" - ] -} \ No newline at end of file diff --git a/base44/entities/WorkforceEvent.jsonc b/base44/entities/WorkforceEvent.jsonc deleted file mode 100644 index 5b354b4..0000000 --- a/base44/entities/WorkforceEvent.jsonc +++ /dev/null @@ -1,134 +0,0 @@ -{ - "name": "WorkforceEvent", - "type": "object", - "properties": { - "event_id": { - "type": "string", - "description": "Unique event identifier (EVT-timestamp-random)" - }, - "event_type": { - "type": "string", - "enum": [ - "shift.completed", - "shift.created", - "shift.cancelled", - "shift.no_show", - "order.created", - "order.updated", - "order.cancelled", - "order.filled", - "assignment.created", - "assignment.confirmed", - "assignment.completed", - "assignment.cancelled", - "invoice.created", - "invoice.approved", - "invoice.paid", - "invoice.overdue", - "vendor.rate_changed", - "vendor.onboarded", - "vendor.compliance_updated", - "worker.hired", - "worker.availability_changed", - "worker.certification_expired", - "worker.clock_in", - "worker.clock_out", - "budget.threshold_exceeded", - "compliance.flagged", - "system.prediction", - "system.anomaly_detected" - ], - "description": "Type of workforce event" - }, - "severity": { - "type": "string", - "enum": [ - "info", - "warning", - "critical" - ], - "default": "info" - }, - "actor_type": { - "type": "string", - "enum": [ - "worker", - "vendor", - "manager", - "system", - "agent", - "client" - ], - "description": "Who or what triggered the event" - }, - "actor_id": { - "type": "string", - "description": "ID of the actor" - }, - "actor_name": { - "type": "string", - "description": "Name of the actor" - }, - "subject_entity_type": { - "type": "string", - "description": "Type of entity the event is about (Order, Assignment, Invoice, etc.)" - }, - "subject_entity_id": { - "type": "string", - "description": "ID of the subject entity" - }, - "subject_krow_id": { - "type": "string", - "description": "KROW universal ID of the subject" - }, - "context_summary": { - "type": "string", - "description": "Human-readable summary of the event" - }, - "related_entities": { - "type": "array", - "description": "Related entity references for graph traversal", - "items": { - "type": "object", - "properties": { - "entity_type": { - "type": "string" - }, - "entity_id": { - "type": "string" - }, - "relationship": { - "type": "string" - } - } - } - }, - "metadata": { - "type": "object", - "description": "Event-specific payload data", - "additionalProperties": true - }, - "reasoning_triggered": { - "type": "boolean", - "default": false, - "description": "Whether the reasoning engine has processed this event" - }, - "memory_id": { - "type": "string", - "description": "ID of the OperationalMemory record created from reasoning about this event" - }, - "tags": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Searchable tags (e.g., 'overtime', 'shortage', 'compliance')" - } - }, - "required": [ - "event_id", - "event_type", - "subject_entity_type", - "subject_entity_id" - ] -} \ No newline at end of file diff --git a/base44/functions/fillEscalationMonitor/entry.ts b/base44/functions/fillEscalationMonitor/entry.ts deleted file mode 100644 index cf5f3db..0000000 --- a/base44/functions/fillEscalationMonitor/entry.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { createClientFromRequest } from 'npm:@base44/sdk@0.8.23'; - -/** - * Fill Escalation Monitor - * Runs every 15 minutes. Detects events at risk of not being filled - * and creates escalation alerts in ActivityLog. - * - * Fill probability formula: - * score = (assigned / requested) * 60 - * + timeBuffer * 20 (more time = more chance to fill) - * + dayOfWeek * 20 (based on historical fill rate for that day) - * - * If fillProbability < 60% → escalation alert - */ - -Deno.serve(async (req) => { - const base44 = createClientFromRequest(req); - - // Allow scheduled/service calls without user auth - const now = new Date(); - const in24h = new Date(now.getTime() + 24 * 60 * 60 * 1000); - const in4h = new Date(now.getTime() + 4 * 60 * 60 * 1000); - - // Fetch all upcoming active events - const allEvents = await base44.asServiceRole.entities.Event.list(); - const upcoming = allEvents.filter(e => { - if (!e.date) return false; - const eventDate = new Date(e.date); - return eventDate > now && eventDate <= in24h && - ["Active", "Pending", "Confirmed", "Draft"].includes(e.status); - }); - - // Historical fill rate by day of week - const completed = allEvents.filter(e => e.status === "Completed" && e.date); - const dayFillRate = Array(7).fill(null).map((_, dow) => { - const dayEvents = completed.filter(e => new Date(e.date).getDay() === dow); - if (dayEvents.length === 0) return 0.75; // default 75% - const filled = dayEvents.filter(e => (e.assigned_staff?.length || 0) >= (e.requested || 1)); - return filled.length / dayEvents.length; - }); - - const escalations = []; - const alerts = []; - - for (const event of upcoming) { - const assigned = event.assigned_staff?.length || 0; - const requested = event.requested || 0; - if (requested === 0) continue; - - const fillRatio = assigned / requested; - const eventDate = new Date(event.date); - const hoursUntil = (eventDate - now) / (1000 * 60 * 60); - const dow = eventDate.getDay(); - - // Time buffer score: 0 = within 2h (critical), 1 = 24h out (comfortable) - const timeBuffer = Math.min(hoursUntil / 24, 1); - - // Fill probability 0-100 - const fillProbability = Math.round( - fillRatio * 60 + - timeBuffer * 20 + - dayFillRate[dow] * 20 - ); - - const isCritical = hoursUntil <= 4 && fillRatio < 1; - const isAtRisk = fillProbability < 60; - - if (isCritical || isAtRisk) { - escalations.push({ - event_id: event.id, - event_name: event.event_name, - hours_until: Math.round(hoursUntil), - fill_ratio: fillRatio, - fill_probability: fillProbability, - assigned, - requested, - is_critical: isCritical, - }); - - // Create ActivityLog alert (avoid duplicates — check if one exists in last 2h) - const existingAlerts = await base44.asServiceRole.entities.ActivityLog.filter({ - related_entity_id: event.id, - activity_type: "event_updated", - }); - - const recentAlert = existingAlerts.find(a => { - const created = new Date(a.created_date); - return (now - created) < 2 * 60 * 60 * 1000; // within 2h - }); - - if (!recentAlert) { - const severity = isCritical ? "🚨 CRITICAL" : "⚠️ AT RISK"; - const gapCount = requested - assigned; - const description = isCritical - ? `${event.event_name} starts in ${Math.round(hoursUntil)}h — ${gapCount} position${gapCount > 1 ? "s" : ""} still open. Fill immediately.` - : `${event.event_name} has a ${fillProbability}% fill probability. ${gapCount} position${gapCount > 1 ? "s" : ""} unfilled with ${Math.round(hoursUntil)}h remaining.`; - - alerts.push( - base44.asServiceRole.entities.ActivityLog.create({ - title: `${severity}: ${event.event_name} needs staffing`, - description, - activity_type: "event_updated", - related_entity_type: "event", - related_entity_id: event.id, - action_link: `EventDetail?id=${event.id}`, - action_label: "Assign Staff Now", - user_id: event.created_by || "system", - is_read: false, - icon_type: "alert", - icon_color: isCritical ? "red" : "yellow", - }) - ); - } - } - } - - await Promise.all(alerts); - - return Response.json({ - checked: upcoming.length, - escalations: escalations.length, - details: escalations, - timestamp: now.toISOString(), - }); -}); \ No newline at end of file diff --git a/base44/functions/queryWorkforceGraph/entry.ts b/base44/functions/queryWorkforceGraph/entry.ts deleted file mode 100644 index 7c5198e..0000000 --- a/base44/functions/queryWorkforceGraph/entry.ts +++ /dev/null @@ -1,504 +0,0 @@ -import { createClientFromRequest } from 'npm:@base44/sdk@0.8.31'; - -Deno.serve(async (req) => { - try { - const base44 = createClientFromRequest(req); - const user = await base44.auth.me(); - if (!user) return Response.json({ error: 'Unauthorized' }, { status: 401 }); - - const body = await req.json(); - const { query_type, entity_id, entity_type, depth = 2 } = body; - - const entities = base44.asServiceRole.entities; - const graph = { nodes: [], edges: [] }; - const visited = new Set(); - - async function addNode(type, id, label, data = {}) { - const key = `${type}:${id}`; - if (visited.has(key)) return; - visited.add(key); - graph.nodes.push({ type, id, label, data }); - } - - function edge(from, to, label) { - graph.edges.push({ from, to, label }); - } - - // ─── CONTRACT ─────────────────────────────────────────────── - // Contract → Vendor, Client, Sector, RateCard - async function traverseContract(contractId) { - const contract = await entities.Contract.get(contractId); - if (!contract) return; - await addNode('Contract', contract.id, `Contract: ${contract.contract_name || contract.contract_number || ''}`, contract); - - if (contract.vendor_id) { - await addNode('Vendor', contract.vendor_id, `Vendor: ${contract.vendor_name || ''}`); - edge(`Contract:${contract.id}`, `Vendor:${contract.vendor_id}`, 'vendor_party'); - } - if (contract.client_id) { - await addNode('Client', contract.client_id, `Client: ${contract.client_name || ''}`); - edge(`Contract:${contract.id}`, `Client:${contract.client_id}`, 'client_party'); - } - if (contract.sector_id) { - await addNode('Sector', contract.sector_id, `Sector: ${contract.sector_name || ''}`); - edge(`Contract:${contract.id}`, `Sector:${contract.sector_id}`, 'governs_sector'); - } - if (contract.rate_card_id) { - await addNode('RateCard', contract.rate_card_id, `RateCard`); - edge(`Contract:${contract.id}`, `RateCard:${contract.rate_card_id}`, 'defines_rates'); - } - } - - // ─── TRANSPORTATION ──────────────────────────────────────── - // Transportation → Shift, Worker, Vendor, Site, Client - async function traverseTransportation(transportId) { - const transport = await entities.Transportation.get(transportId); - if (!transport) return; - await addNode('Transportation', transport.id, `Transport: ${transport.transport_type} → ${transport.dropoff_location || ''}`, transport); - - if (transport.shift_id) { - await addNode('Shift', transport.shift_id, `Shift`); - edge(`Transportation:${transport.id}`, `Shift:${transport.shift_id}`, 'serves_shift'); - } - if (transport.workforce_id) { - await addNode('Worker', transport.workforce_id, `Worker: ${transport.workforce_name || ''}`); - edge(`Transportation:${transport.id}`, `Worker:${transport.workforce_id}`, 'transports_worker'); - } - if (transport.vendor_id) { - await addNode('Vendor', transport.vendor_id, `Vendor: ${transport.vendor_name || ''}`); - edge(`Transportation:${transport.id}`, `Vendor:${transport.vendor_id}`, 'arranged_by'); - } - if (transport.client_id) { - await addNode('Client', transport.client_id, `Client: ${transport.client_name || ''}`); - edge(`Transportation:${transport.id}`, `Client:${transport.client_id}`, 'destination_client'); - } - } - - // ─── EQUIPMENT ───────────────────────────────────────────── - // Equipment → Vendor, Client, Site, Shift, Worker - async function traverseEquipment(equipmentId) { - const equipment = await entities.Equipment.get(equipmentId); - if (!equipment) return; - await addNode('Equipment', equipment.id, `Equipment: ${equipment.equipment_name || ''} (${equipment.category})`, equipment); - - if (equipment.vendor_id) { - await addNode('Vendor', equipment.vendor_id, `Vendor: ${equipment.vendor_name || ''}`); - edge(`Equipment:${equipment.id}`, `Vendor:${equipment.vendor_id}`, 'owned_by'); - } - if (equipment.client_id) { - await addNode('Client', equipment.client_id, `Client: ${equipment.client_name || ''}`); - edge(`Equipment:${equipment.id}`, `Client:${equipment.client_id}`, 'assigned_to_client'); - } - if (equipment.shift_id) { - await addNode('Shift', equipment.shift_id, `Shift`); - edge(`Equipment:${equipment.id}`, `Shift:${equipment.shift_id}`, 'used_in_shift'); - } - if (equipment.assigned_to_worker_id) { - await addNode('Worker', equipment.assigned_to_worker_id, `Worker: ${equipment.assigned_to_worker_name || ''}`); - edge(`Equipment:${equipment.id}`, `Worker:${equipment.assigned_to_worker_id}`, 'assigned_to_worker'); - } - } - - // ─── TRAINING ────────────────────────────────────────────── - // Training → Worker, Vendor, Client, Certification - async function traverseTraining(trainingId) { - const training = await entities.Training.get(trainingId); - if (!training) return; - await addNode('Training', training.id, `Training: ${training.training_name || ''}`, training); - - if (training.workforce_id) { - await addNode('Worker', training.workforce_id, `Worker: ${training.workforce_name || ''}`); - edge(`Training:${training.id}`, `Worker:${training.workforce_id}`, 'enrolled_worker'); - } - if (training.vendor_id) { - await addNode('Vendor', training.vendor_id, `Vendor: ${training.vendor_name || ''}`); - edge(`Training:${training.id}`, `Vendor:${training.vendor_id}`, 'sponsored_by'); - } - if (training.client_id) { - await addNode('Client', training.client_id, `Client: ${training.client_name || ''}`); - edge(`Training:${training.id}`, `Client:${training.client_id}`, 'client_specific'); - } - if (training.certification_id) { - await addNode('Certification', training.certification_id, `Cert: ${training.certification_earned || ''}`); - edge(`Training:${training.id}`, `Certification:${training.certification_id}`, 'issues_certification'); - } - } - - // ─── FOOD SERVICE OPERATION ──────────────────────────────── - // FoodServiceOperation → Client, Site, Sector, Vendor, Manager, Shift, Event, Contract, Invoice, Equipment - async function traverseFoodServiceOperation(opId) { - const op = await entities.FoodServiceOperation.get(opId); - if (!op) return; - await addNode('FoodServiceOperation', op.id, `FSO: ${op.operation_name || ''}`, op); - - if (op.client_id) { - await addNode('Client', op.client_id, `Client: ${op.client_name || ''}`); - edge(`FoodServiceOperation:${op.id}`, `Client:${op.client_id}`, 'serves_client'); - } - if (op.vendor_id) { - await addNode('Vendor', op.vendor_id, `Vendor: ${op.vendor_name || ''}`); - edge(`FoodServiceOperation:${op.id}`, `Vendor:${op.vendor_id}`, 'operated_by'); - } - if (op.manager_id) { - await addNode('Manager', op.manager_id, `Manager: ${op.manager_name || ''}`); - edge(`FoodServiceOperation:${op.id}`, `Manager:${op.manager_id}`, 'managed_by'); - } - if (op.shift_id) { - await addNode('Shift', op.shift_id, `Shift`); - edge(`FoodServiceOperation:${op.id}`, `Shift:${op.shift_id}`, 'runs_during_shift'); - } - if (op.contract_id) { - await addNode('Contract', op.contract_id, `Contract`); - edge(`FoodServiceOperation:${op.id}`, `Contract:${op.contract_id}`, 'governed_by_contract'); - } - if (op.invoice_id) { - await addNode('Invoice', op.invoice_id, `Invoice`); - edge(`FoodServiceOperation:${op.id}`, `Invoice:${op.invoice_id}`, 'billed_via'); - } - if (op.equipment_assigned) { - for (const eq of op.equipment_assigned) { - if (eq.equipment_id) { - await addNode('Equipment', eq.equipment_id, `Equipment: ${eq.equipment_name || ''}`); - edge(`FoodServiceOperation:${op.id}`, `Equipment:${eq.equipment_id}`, 'uses_equipment'); - } - } - } - } - - // ─── SHIFT (extended) ────────────────────────────────────── - // Shift → Manager, Location, Event, Transportation, Equipment, FoodServiceOperation - async function traverseShift(shiftId) { - const shift = await entities.Shift.get(shiftId); - if (!shift) return; - await addNode('Shift', shift.id, `Shift: ${shift.shift_name || ''}`, shift); - - if (shift.manager_id) { - await addNode('Manager', shift.manager_id, `Manager: ${shift.manager_name || ''}`); - edge(`Shift:${shift.id}`, `Manager:${shift.manager_id}`, 'managed_by'); - } - if (shift.event_id) { - await addNode('Event', shift.event_id, `Event`); - edge(`Shift:${shift.id}`, `Event:${shift.event_id}`, 'part_of_event'); - } - // Transportation serving this shift - const transports = await entities.Transportation.filter({ shift_id: shiftId }, '-created_date', 10); - for (const t of transports) { - await addNode('Transportation', t.id, `Transport: ${t.transport_type}`, t); - edge(`Shift:${shiftId}`, `Transportation:${t.id}`, 'worker_transport'); - } - // Equipment assigned to this shift - const equipment = await entities.Equipment.filter({ shift_id: shiftId }, '-created_date', 10); - for (const e of equipment) { - await addNode('Equipment', e.id, `Equipment: ${e.equipment_name || ''}`, e); - edge(`Shift:${shiftId}`, `Equipment:${e.id}`, 'requires_equipment'); - } - // Food service operations running during this shift - const fsos = await entities.FoodServiceOperation.filter({ shift_id: shiftId }, '-created_date', 10); - for (const fso of fsos) { - await addNode('FoodServiceOperation', fso.id, `FSO: ${fso.operation_name || ''}`, fso); - edge(`Shift:${shiftId}`, `FoodServiceOperation:${fso.id}`, 'runs_operation'); - } - } - - // ─── ASSIGNMENT (existing, extended) ─────────────────────── - async function traverseAssignment(assignmentId) { - const assignment = await entities.Assignment.get(assignmentId); - if (!assignment) return; - await addNode('Assignment', assignment.id, `Assignment: ${assignment.workforce_name || 'Unknown'}`, assignment); - - if (assignment.order_id) { - await addNode('Order', assignment.order_id, `Order: ${assignment.order_number || ''}`); - edge(`Assignment:${assignment.id}`, `Order:${assignment.order_id}`, 'belongs_to'); - await traverseOrder(assignment.order_id, 1); - } - if (assignment.workforce_id) { - await addNode('Worker', assignment.workforce_id, `Worker: ${assignment.workforce_name || ''}`); - edge(`Assignment:${assignment.id}`, `Worker:${assignment.workforce_id}`, 'assigned_to'); - } - if (assignment.vendor_id) { - await addNode('Vendor', assignment.vendor_id, `Vendor: ${assignment.vendor_name || ''}`); - edge(`Assignment:${assignment.id}`, `Vendor:${assignment.vendor_id}`, 'provided_by'); - } - } - - // ─── ORDER (existing, extended) ──────────────────────────── - async function traverseOrder(orderId, currentDepth = 0) { - if (currentDepth >= depth) return; - try { - const order = await entities.Order.get(orderId); - if (!order) return; - await addNode('Order', order.id, `Order: ${order.order_number || order.event_name || ''}`, order); - - if (order.partner_id) { - await addNode('Partner', order.partner_id, `Partner: ${order.partner_name || ''}`); - edge(`Order:${order.id}`, `Partner:${order.partner_id}`, 'for_client'); - } - if (order.vendor_id) { - await addNode('Vendor', order.vendor_id, `Vendor: ${order.vendor_name || ''}`); - edge(`Order:${order.id}`, `Vendor:${order.vendor_id}`, 'assigned_to'); - } - // Contracts governing this client-vendor pair - if (order.vendor_id && order.business_id) { - const contracts = await entities.Contract.filter({ vendor_id: order.vendor_id, client_id: order.business_id, status: 'active' }, '-created_date', 5); - for (const c of contracts) { - await addNode('Contract', c.id, `Contract: ${c.contract_name || ''}`, c); - edge(`Order:${order.id}`, `Contract:${c.id}`, 'governed_by'); - } - } - // Food service operations for this event - if (order.event_id) { - const fsos = await entities.FoodServiceOperation.filter({ event_id: order.event_id }, '-created_date', 10); - for (const fso of fsos) { - await addNode('FoodServiceOperation', fso.id, `FSO: ${fso.operation_name || ''}`, fso); - edge(`Order:${order.id}`, `FoodServiceOperation:${fso.id}`, 'fulfills_operation'); - } - } - } catch (e) { /* order might not exist */ } - } - - // ─── VENDOR (existing, extended) ─────────────────────────── - async function traverseVendor(vendorId) { - const vendor = await entities.Vendor.get(vendorId); - if (!vendor) return; - await addNode('Vendor', vendor.id, `Vendor: ${vendor.legal_name || vendor.doing_business_as || ''}`, vendor); - - // Rates - const rates = await entities.VendorRate.filter({ vendor_id: vendorId }, '-created_date', 10); - for (const rate of rates) { - await addNode('VendorRate', rate.id, `Rate: ${rate.role_name || 'Unknown'} - $${rate.client_rate || 0}/hr`, rate); - edge(`Vendor:${vendorId}`, `VendorRate:${rate.id}`, 'has_rate'); - } - - // Workforce - const workforce = await entities.Workforce.filter({ vendor_id: vendorId }, '-created_date', 10); - for (const w of workforce) { - await addNode('Worker', w.id, `Worker: ${w.full_name || w.name || ''}`, w); - edge(`Vendor:${vendorId}`, `Worker:${w.id}`, 'employs'); - } - - // Contracts - const contracts = await entities.Contract.filter({ vendor_id: vendorId }, '-created_date', 10); - for (const c of contracts) { - await addNode('Contract', c.id, `Contract: ${c.contract_name || ''}`, c); - edge(`Vendor:${vendorId}`, `Contract:${c.id}`, 'party_to'); - if (c.client_id) { - await addNode('Client', c.client_id, `Client: ${c.client_name || ''}`); - edge(`Contract:${c.id}`, `Client:${c.client_id}`, 'client_party'); - } - } - - // Equipment owned - const equipment = await entities.Equipment.filter({ vendor_id: vendorId }, '-created_date', 10); - for (const e of equipment) { - await addNode('Equipment', e.id, `Equipment: ${e.equipment_name || ''}`, e); - edge(`Vendor:${vendorId}`, `Equipment:${e.id}`, 'owns'); - } - - // Transportation arranged - const transports = await entities.Transportation.filter({ vendor_id: vendorId }, '-created_date', 10); - for (const t of transports) { - await addNode('Transportation', t.id, `Transport: ${t.transport_type}`, t); - edge(`Vendor:${vendorId}`, `Transportation:${t.id}`, 'arranges'); - } - - // Training sponsored - const trainings = await entities.Training.filter({ vendor_id: vendorId }, '-created_date', 10); - for (const t of trainings) { - await addNode('Training', t.id, `Training: ${t.training_name || ''}`, t); - edge(`Vendor:${vendorId}`, `Training:${t.id}`, 'sponsors_training'); - } - } - - // ─── WORKER (existing, extended) ─────────────────────────── - async function traverseWorker(workerId) { - const worker = await entities.Workforce.get(workerId); - if (!worker) return; - await addNode('Worker', worker.id, `Worker: ${worker.full_name || worker.name || ''}`, worker); - - if (worker.vendor_id) { - await addNode('Vendor', worker.vendor_id, `Vendor: ${worker.vendor_name || ''}`); - edge(`Worker:${workerId}`, `Vendor:${worker.vendor_id}`, 'employed_by'); - } - - // Assignments - const assignments = await entities.Assignment.filter({ workforce_id: workerId }, '-created_date', 10); - for (const a of assignments) { - await addNode('Assignment', a.id, `Assignment: ${a.role || ''}`, a); - edge(`Worker:${workerId}`, `Assignment:${a.id}`, 'assigned'); - } - - // Availability - const availability = await entities.WorkerAvailability.filter({ staff_id: workerId }, '-created_date', 1); - if (availability.length > 0) { - await addNode('Availability', availability[0].id, `Availability: ${availability[0].availability_status}`, availability[0]); - edge(`Worker:${workerId}`, `Availability:${availability[0].id}`, 'availability'); - } - - // Reputation - const reputation = await entities.WorkerReputationProfile.filter({ worker_id: workerId }, '-created_date', 1); - if (reputation.length > 0) { - await addNode('Reputation', reputation[0].id, `Reputation: ${reputation[0].trust_tier} (${reputation[0].trust_score || 0})`, reputation[0]); - edge(`Worker:${workerId}`, `Reputation:${reputation[0].id}`, 'reputation'); - } - - // Training records - const trainings = await entities.Training.filter({ workforce_id: workerId }, '-created_date', 10); - for (const t of trainings) { - await addNode('Training', t.id, `Training: ${t.training_name || ''}`, t); - edge(`Worker:${workerId}`, `Training:${t.id}`, 'enrolled_in'); - } - - // Equipment assigned - const equipment = await entities.Equipment.filter({ assigned_to_worker_id: workerId }, '-created_date', 10); - for (const e of equipment) { - await addNode('Equipment', e.id, `Equipment: ${e.equipment_name || ''}`, e); - edge(`Worker:${workerId}`, `Equipment:${e.id}`, 'issued_equipment'); - } - - // Transportation - const transports = await entities.Transportation.filter({ workforce_id: workerId }, '-created_date', 10); - for (const t of transports) { - await addNode('Transportation', t.id, `Transport: ${t.transport_type}`, t); - edge(`Worker:${workerId}`, `Transportation:${t.id}`, 'transported_by'); - } - } - - // ─── FULL GRAPH (new) ────────────────────────────────────── - // Walks the entire connected chain from any starting node, up to depth hops - async function traverseFull(startType, startId, maxDepth = 3) { - const queue = [{ type: startType, id: startId, depth: 0 }]; - const seen = new Set(); - - while (queue.length > 0) { - const { type, id, depth: curDepth } = queue.shift(); - const key = `${type}:${id}`; - if (seen.has(key) || curDepth > maxDepth) continue; - seen.add(key); - - switch (type) { - case 'Worker': { - const w = await entities.Workforce.get(id).catch(() => null); - if (!w) break; - await addNode('Worker', w.id, `Worker: ${w.full_name || w.name || ''}`, w); - if (w.vendor_id) queue.push({ type: 'Vendor', id: w.vendor_id, depth: curDepth + 1 }); - const as = await entities.Assignment.filter({ workforce_id: id }, '-created_date', 5); - for (const a of as) queue.push({ type: 'Assignment', id: a.id, depth: curDepth + 1 }); - const ts = await entities.Training.filter({ workforce_id: id }, '-created_date', 5); - for (const t of ts) queue.push({ type: 'Training', id: t.id, depth: curDepth + 1 }); - const eq = await entities.Equipment.filter({ assigned_to_worker_id: id }, '-created_date', 5); - for (const e of eq) queue.push({ type: 'Equipment', id: e.id, depth: curDepth + 1 }); - const tr = await entities.Transportation.filter({ workforce_id: id }, '-created_date', 5); - for (const t of tr) queue.push({ type: 'Transportation', id: t.id, depth: curDepth + 1 }); - break; - } - case 'Vendor': { - const v = await entities.Vendor.get(id).catch(() => null); - if (!v) break; - await addNode('Vendor', v.id, `Vendor: ${v.legal_name || v.doing_business_as || ''}`, v); - const ws = await entities.Workforce.filter({ vendor_id: id }, '-created_date', 10); - for (const w of ws) { await addNode('Worker', w.id, `Worker: ${w.full_name || ''}`, w); edge(`Vendor:${id}`, `Worker:${w.id}`, 'employs'); queue.push({ type: 'Worker', id: w.id, depth: curDepth + 1 }); } - const cs = await entities.Contract.filter({ vendor_id: id }, '-created_date', 10); - for (const c of cs) { await addNode('Contract', c.id, `Contract: ${c.contract_name || ''}`, c); edge(`Vendor:${id}`, `Contract:${c.id}`, 'party_to'); queue.push({ type: 'Contract', id: c.id, depth: curDepth + 1 }); } - const eqs = await entities.Equipment.filter({ vendor_id: id }, '-created_date', 10); - for (const e of eqs) { await addNode('Equipment', e.id, `Equipment: ${e.equipment_name || ''}`, e); edge(`Vendor:${id}`, `Equipment:${e.id}`, 'owns'); } - const fsos = await entities.FoodServiceOperation.filter({ vendor_id: id }, '-created_date', 10); - for (const f of fsos) { await addNode('FoodServiceOperation', f.id, `FSO: ${f.operation_name || ''}`, f); edge(`Vendor:${id}`, `FoodServiceOperation:${f.id}`, 'operates'); queue.push({ type: 'FoodServiceOperation', id: f.id, depth: curDepth + 1 }); } - break; - } - case 'Contract': { - const c = await entities.Contract.get(id).catch(() => null); - if (!c) break; - await addNode('Contract', c.id, `Contract: ${c.contract_name || ''}`, c); - if (c.vendor_id) { await addNode('Vendor', c.vendor_id, `Vendor: ${c.vendor_name || ''}`); edge(`Contract:${id}`, `Vendor:${c.vendor_id}`, 'vendor_party'); } - if (c.client_id) { await addNode('Client', c.client_id, `Client: ${c.client_name || ''}`); edge(`Contract:${id}`, `Client:${c.client_id}`, 'client_party'); } - break; - } - case 'Shift': { - await traverseShift(id); - break; - } - case 'FoodServiceOperation': { - await traverseFoodServiceOperation(id); - break; - } - case 'Transportation': { - await traverseTransportation(id); - break; - } - case 'Equipment': { - await traverseEquipment(id); - break; - } - case 'Training': { - await traverseTraining(id); - break; - } - case 'Assignment': { - await traverseAssignment(id); - break; - } - case 'Order': { - await traverseOrder(id, 0); - break; - } - } - } - } - - // ─── EXECUTE ─────────────────────────────────────────────── - if (query_type === 'subgraph' && entity_id) { - switch (entity_type) { - case 'Assignment': await traverseAssignment(entity_id); break; - case 'Order': await traverseOrder(entity_id, 0); break; - case 'Vendor': await traverseVendor(entity_id); break; - case 'Worker': await traverseWorker(entity_id); break; - case 'Shift': await traverseShift(entity_id); break; - case 'Contract': await traverseContract(entity_id); break; - case 'Transportation': await traverseTransportation(entity_id); break; - case 'Equipment': await traverseEquipment(entity_id); break; - case 'Training': await traverseTraining(entity_id); break; - case 'FoodServiceOperation': await traverseFoodServiceOperation(entity_id); break; - default: break; - } - } else if (query_type === 'full_graph' && entity_id && entity_type) { - await traverseFull(entity_type, entity_id, depth); - } else if (query_type === 'site_labor') { - const assignments = await entities.Assignment.filter({}, '-created_date', 100); - graph.nodes = assignments.map(a => ({ - type: 'Assignment', - id: a.id, - label: `${a.workforce_name} - ${a.role}`, - data: a - })); - } else if (query_type === 'shortage_prediction') { - const orders = await entities.Order.filter({ status: 'Open' }, '-created_date', 50); - for (const order of orders) { - await addNode('Order', order.id, `Order: ${order.order_number || ''}`, order); - const assignments = await entities.Assignment.filter({ order_id: order.id }, '-created_date', 50); - const filled = assignments.filter(a => a.assignment_status === 'Confirmed' || a.assignment_status === 'Checked In').length; - const needed = order.total_staff || 0; - if (filled < needed) { - edge(`Order:${order.id}`, `SHORTAGE:${order.id}`, `short_by_${needed - filled}`); - graph.nodes.push({ type: 'Alert', id: `SHORTAGE:${order.id}`, label: `Shortage: ${needed - filled} unfilled positions`, data: { order_id: order.id, needed, filled, gap: needed - filled } }); - } - } - } else if (query_type === 'entity_summary') { - // Returns counts of every entity type in the graph — the "graph census" - const counts = {}; - const entityTypes = ['Workforce', 'Vendor', 'Business', 'Site', 'Shift', 'Event', 'Order', 'Assignment', 'Invoice', 'CompliancePackage', 'Scorecard', 'Contract', 'Transportation', 'Equipment', 'Training', 'FoodServiceOperation']; - for (const et of entityTypes) { - try { - const list = await entities[et].list('-created_date', 1); - counts[et] = list?.length || 0; - } catch (e) { - counts[et] = 0; - } - } - return Response.json({ success: true, counts }); - } - - return Response.json({ success: true, graph, node_count: graph.nodes.length, edge_count: graph.edges.length }); - } catch (error) { - return Response.json({ error: error.message }, { status: 500 }); - } -}); \ No newline at end of file diff --git a/base44/functions/reasonAboutEvent/entry.ts b/base44/functions/reasonAboutEvent/entry.ts deleted file mode 100644 index d5ccb7d..0000000 --- a/base44/functions/reasonAboutEvent/entry.ts +++ /dev/null @@ -1,235 +0,0 @@ -import { createClientFromRequest } from 'npm:@base44/sdk@0.8.31'; - -Deno.serve(async (req) => { - try { - const base44 = createClientFromRequest(req); - const user = await base44.auth.me(); - if (!user) return Response.json({ error: 'Unauthorized' }, { status: 401 }); - - const body = await req.json(); - const { - event_id, - event_type, - subject_entity_type, - subject_entity_id, - context_summary, - metadata = {}, - related_entities = [] - } = body; - - const entities = base44.asServiceRole.entities; - - // 1. Fetch context from the Workforce Graph - let graphContext = {}; - try { - const graphRes = await base44.asServiceRole.functions.invoke('queryWorkforceGraph', { - query_type: 'subgraph', - entity_type: subject_entity_type, - entity_id: subject_entity_id - }); - graphContext = graphRes.data?.graph || {}; - } catch (e) { - console.log('Graph query failed (non-blocking):', e.message); - } - - // 2. Fetch similar past memories (Operational Memory) - const similarMemories = await entities.OperationalMemory.filter( - { trigger_event_type: event_type }, - '-created_date', - 5 - ); - - const memoryContext = similarMemories.map(m => ({ - decision: m.decision?.recommendation || 'N/A', - outcome: m.outcome || 'pending', - outcome_score: m.outcome_score, - reasoning: m.reasoning?.substring(0, 200) || '' - })); - - // 3. Determine department based on event type - const departmentMap = { - 'shift.completed': 'operations', - 'shift.cancelled': 'operations', - 'shift.no_show': 'operations', - 'order.created': 'operations', - 'order.cancelled': 'operations', - 'order.filled': 'operations', - 'assignment.cancelled': 'operations', - 'invoice.overdue': 'finance', - 'vendor.rate_changed': 'procurement', - 'worker.availability_changed': 'operations', - 'worker.certification_expired': 'compliance', - 'budget.threshold_exceeded': 'finance', - 'compliance.flagged': 'compliance', - 'system.anomaly_detected': 'executive' - }; - const department = departmentMap[event_type] || 'operations'; - - // 4. Build the reasoning prompt with full context — CAUSAL CHAIN reasoning - const prompt = `You are the KROW Intelligence Engine — an AI workforce reasoning system for contingent labor management. - -You do not answer. You REASON. - -When an event occurs, you trace the CAUSAL CHAIN backwards — from the observed event through each contributing factor (connected by ↓) to the root cause(s). You do not give generic analysis. You follow the chain. - -AN EVENT HAS OCCURRED: -Event Type: ${event_type} -Summary: ${context_summary || 'No summary provided'} -Subject: ${subject_entity_type} (${subject_entity_id}) - -CURRENT GRAPH STATE (connected entities, relationships, metrics): -${JSON.stringify(graphContext, null, 2).substring(0, 3000)} - -SIMILAR PAST DECISIONS (Operational Memory — what happened last time): -${memoryContext.length > 0 ? JSON.stringify(memoryContext, null, 2) : 'No similar past decisions found.'} - -EVENT METADATA: -${JSON.stringify(metadata, null, 2).substring(0, 1000)} - -REASONING INSTRUCTIONS: - -1. OBSERVATION: State what happened as a fact. - -2. CAUSAL CHAIN: Trace WHY this event occurred. Walk backwards from the event through contributing factors. Each link in the chain is a factor that CAUSED the next. The chain flows: - - Factor A → caused → Factor B → caused → Factor C → caused → [Root Cause] - - Use the graph state, metadata, and past memories as evidence. Reference specific entities, workers, vendors, shifts, or metrics. Do not be generic. - - Categories: vendor, operations, workforce, training, demand, external, compliance, finance, equipment, transportation, system. - -3. ROOT CAUSE(S): The deepest factor(s) — the thing that, if fixed, prevents recurrence. - -4. PREDICTION: What will happen next if no action is taken. - -5. RECOMMENDATION: Target the root cause, not just the symptom. - -Respond as JSON.`; - - // 5. Call the LLM for reasoning - let aiDecision = {}; - try { - const llmResponse = await base44.asServiceRole.integrations.Core.InvokeLLM({ - prompt, - response_json_schema: { - type: 'object', - properties: { - observation: { type: 'string', description: 'What happened, stated as a fact' }, - causal_chain: { - type: 'array', - description: 'Causal chain traced backwards from the event to root cause(s)', - items: { - type: 'object', - properties: { - step: { type: 'number' }, - factor: { type: 'string' }, - evidence: { type: 'string' }, - category: { type: 'string', enum: ['vendor', 'operations', 'workforce', 'training', 'demand', 'external', 'compliance', 'finance', 'equipment', 'transportation', 'system'] }, - leads_to: { type: 'string' } - } - } - }, - root_causes: { - type: 'array', - items: { type: 'string' } - }, - prediction: { type: 'string' }, - recommendation: { type: 'string' }, - confidence_score: { type: 'number' }, - risk_level: { type: 'string' }, - proposed_actions: { - type: 'array', - items: { - type: 'object', - properties: { - action_type: { type: 'string' }, - description: { type: 'string' }, - auto_execute: { type: 'boolean' } - } - } - }, - reasoning: { type: 'string', description: 'Full reasoning chain in natural language' } - } - } - }); - - aiDecision = typeof llmResponse === 'string' ? JSON.parse(llmResponse) : llmResponse; - } catch (llmErr) { - console.log('LLM reasoning failed:', llmErr.message); - aiDecision = { - prediction: 'Unable to generate prediction', - recommendation: 'Manual review recommended', - confidence_score: 0, - risk_level: 'medium', - proposed_actions: [], - reasoning: 'LLM reasoning failed: ' + llmErr.message - }; - } - - // 6. Create Operational Memory — store the causal chain - const memory_id = `MEM-${Date.now()}-${Math.random().toString(36).substring(2, 8)}`; - const memory = await entities.OperationalMemory.create({ - memory_id, - trigger_event_id: event_id, - trigger_event_type: event_type, - context_snapshot: { graph: graphContext, metadata }, - decision: aiDecision, - reasoning: aiDecision.reasoning || '', - causal_chain: aiDecision.causal_chain || [], - root_causes: aiDecision.root_causes || [], - similar_memories_consulted: similarMemories.map(m => m.memory_id), - status: 'pending', - agent_name: `${department}_agent`, - department, - tags: [event_type, department, aiDecision.risk_level || 'medium'] - }); - - // 7. Mark event as reasoning-triggered - await entities.WorkforceEvent.update(event_id, { - reasoning_triggered: true, - memory_id: memory.id - }); - - // 8. Log agent activity - await entities.AgentActivity.create({ - agent_name: `${department}_agent`, - department, - activity_type: 'event_processed', - trigger_event_id: event_id, - memory_id: memory.id, - summary: `Processed ${event_type}: ${aiDecision.recommendation || 'No recommendation'}`, - details: { confidence: aiDecision.confidence_score, risk: aiDecision.risk_level }, - impact_level: aiDecision.risk_level === 'high' ? 'high' : (aiDecision.risk_level === 'medium' ? 'medium' : 'low'), - entities_affected: [{ entity_type: subject_entity_type, entity_id: subject_entity_id }] - }); - - // 9. If high risk, queue for human approval; if low risk + auto_execute, execute - const hasAutoActions = (aiDecision.proposed_actions || []).some(a => a.auto_execute); - if (aiDecision.risk_level === 'high' || (aiDecision.confidence_score || 0) < 60) { - await entities.DecisionQueue.create({ - memory_id: memory.id, - trigger_event_id: event_id, - title: `${department} decision: ${event_type}`, - summary: aiDecision.recommendation || 'AI recommends manual review', - department, - agent_name: `${department}_agent`, - proposed_actions: aiDecision.proposed_actions || [], - confidence_score: aiDecision.confidence_score || 0, - risk_level: aiDecision.risk_level || 'medium', - status: 'pending_approval', - expires_at: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(), - context_snapshot: { graph: graphContext, event_summary: context_summary } - }); - } - - return Response.json({ - success: true, - memory_id: memory.id, - decision: aiDecision, - graph_nodes: graphContext.nodes?.length || 0, - similar_memories: similarMemories.length - }); - } catch (error) { - return Response.json({ error: error.message }, { status: 500 }); - } -}); \ No newline at end of file diff --git a/base44/functions/recordEvent/entry.ts b/base44/functions/recordEvent/entry.ts deleted file mode 100644 index 51306ae..0000000 --- a/base44/functions/recordEvent/entry.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { createClientFromRequest } from 'npm:@base44/sdk@0.8.31'; - -Deno.serve(async (req) => { - try { - const base44 = createClientFromRequest(req); - const user = await base44.auth.me(); - if (!user) return Response.json({ error: 'Unauthorized' }, { status: 401 }); - - const body = await req.json(); - const { - event_type, - severity = 'info', - actor_type = 'system', - actor_id, - actor_name, - subject_entity_type, - subject_entity_id, - subject_krow_id, - context_summary, - related_entities = [], - metadata = {}, - tags = [] - } = body; - - if (!event_type || !subject_entity_type || !subject_entity_id) { - return Response.json({ error: 'event_type, subject_entity_type, and subject_entity_id are required' }, { status: 400 }); - } - - const event_id = `EVT-${Date.now()}-${Math.random().toString(36).substring(2, 8)}`; - - const event = await base44.asServiceRole.entities.WorkforceEvent.create({ - event_id, - event_type, - severity, - actor_type, - actor_id: actor_id || user.id, - actor_name: actor_name || user.full_name || 'System', - subject_entity_type, - subject_entity_id, - subject_krow_id, - context_summary: context_summary || `${event_type} on ${subject_entity_type}`, - related_entities, - metadata, - reasoning_triggered: false, - tags - }); - - // Determine if this event should trigger reasoning - const reasoningTriggers = [ - 'shift.completed', 'shift.cancelled', 'shift.no_show', - 'order.created', 'order.cancelled', 'order.filled', - 'assignment.cancelled', 'invoice.overdue', - 'vendor.rate_changed', 'worker.availability_changed', - 'worker.certification_expired', 'budget.threshold_exceeded', - 'compliance.flagged', 'system.anomaly_detected' - ]; - - if (reasoningTriggers.includes(event_type)) { - try { - await base44.asServiceRole.functions.invoke('reasonAboutEvent', { - event_id: event.id, - event_type, - subject_entity_type, - subject_entity_id, - context_summary, - metadata, - related_entities - }); - } catch (reasonErr) { - // Reasoning failure shouldn't fail the event recording - console.log('Reasoning engine error (non-blocking):', reasonErr.message); - } - } - - return Response.json({ success: true, event_id: event.id, event }); - } catch (error) { - return Response.json({ error: error.message }, { status: 500 }); - } -}); \ No newline at end of file diff --git a/base44/functions/reviewOutcomes/entry.ts b/base44/functions/reviewOutcomes/entry.ts deleted file mode 100644 index 20b64a4..0000000 --- a/base44/functions/reviewOutcomes/entry.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { createClientFromRequest } from 'npm:@base44/sdk@0.8.31'; - -Deno.serve(async (req) => { - try { - const base44 = createClientFromRequest(req); - const user = await base44.auth.me(); - if (!user) return Response.json({ error: 'Unauthorized' }, { status: 401 }); - if (user.role !== 'admin') return Response.json({ error: 'Forbidden — admin only' }, { status: 403 }); - - const entities = base44.asServiceRole.entities; - - // Fetch memories with pending outcomes (executed but not yet learned) - const pendingMemories = await entities.OperationalMemory.filter( - { status: 'outcome_pending' }, - '-created_date', - 50 - ); - - let learned = 0; - let stillPending = 0; - - for (const memory of pendingMemories) { - try { - // Re-query the graph to see what happened since the decision was made - const graphRes = await base44.asServiceRole.functions.invoke('queryWorkforceGraph', { - query_type: 'subgraph', - entity_type: memory.context_snapshot?.metadata?.subject_entity_type || 'Order', - entity_id: memory.context_snapshot?.metadata?.subject_entity_id || memory.trigger_event_id - }); - - const currentGraph = graphRes.data?.graph || {}; - - // Ask the LLM to evaluate the outcome - const prompt = `You are evaluating the outcome of a past KROW AI decision. - -ORIGINAL EVENT: ${memory.trigger_event_type} -ORIGINAL DECISION: ${memory.decision?.recommendation || 'N/A'} -ORIGINAL PREDICTION: ${memory.decision?.prediction || 'N/A'} - -CURRENT STATE (after decision): -${JSON.stringify(currentGraph, null, 2).substring(0, 2000)} - -ORIGINAL CONTEXT (at decision time): -${JSON.stringify(memory.context_snapshot?.graph || {}, null, 2).substring(0, 2000)} - -Evaluate: Did the decision help? Did the prediction come true? What was the outcome? -Respond as JSON: -{ - "outcome": "Description of what actually happened", - "outcome_score": -100 to 100 (negative = made things worse, 0 = no effect, positive = helped), - "outcome_metrics": {"key_metric": value} -}`; - - const evalResponse = await base44.asServiceRole.integrations.Core.InvokeLLM({ - prompt, - response_json_schema: { - type: 'object', - properties: { - outcome: { type: 'string' }, - outcome_score: { type: 'number' }, - outcome_metrics: { type: 'object', additionalProperties: true } - } - } - }); - - const evaluation = typeof evalResponse === 'string' ? JSON.parse(evalResponse) : evalResponse; - - await entities.OperationalMemory.update(memory.id, { - outcome: evaluation.outcome, - outcome_score: evaluation.outcome_score, - outcome_metrics: evaluation.outcome_metrics, - status: 'learned', - learned_at: new Date().toISOString() - }); - - // Log learning activity - await entities.AgentActivity.create({ - agent_name: memory.agent_name || 'system', - department: memory.department || 'operations', - activity_type: 'learning_completed', - memory_id: memory.id, - summary: `Learned from ${memory.trigger_event_type}: outcome score ${evaluation.outcome_score}`, - details: evaluation, - impact_level: evaluation.outcome_score > 50 ? 'high' : (evaluation.outcome_score > 0 ? 'medium' : 'low'), - entities_affected: [] - }); - - learned++; - } catch (e) { - console.log(`Failed to evaluate memory ${memory.id}:`, e.message); - stillPending++; - } - } - - return Response.json({ - success: true, - reviewed: pendingMemories.length, - learned, - still_pending: stillPending - }); - } catch (error) { - return Response.json({ error: error.message }, { status: 500 }); - } -}); \ No newline at end of file diff --git a/deploy_template.sh b/deploy_template.sh deleted file mode 100644 index c021e1a..0000000 --- a/deploy_template.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -set -e - -# Ensure the SDK is built before deployment -echo "Building SDK..." -cd sdk -npm install --legacy-peer-deps -npm run build -cd .. - -# Commit and push changes -echo "Committing and pushing changes..." -git add . -git commit -m "deploy" -git push origin main - -# Build and deploy the e2b template -echo "Building and deploying e2b template..." -cd e2b_template && e2b template build -c "npm run dev" diff --git a/index.html b/index.html index 8131cdb..e955fdc 100644 --- a/index.html +++ b/index.html @@ -2,9 +2,10 @@ - + - Base44 APP + + KROW Workforce Control Tower
diff --git a/package-lock.json b/package-lock.json index 0e4fc57..9984e03 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,14 @@ { - "name": "base44-app", + "name": "krow-workforce-control-tower", "version": "0.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "base44-app", + "name": "krow-workforce-control-tower", "version": "0.0.0", "dependencies": { - "@base44/sdk": "^0.8.42", - "@base44/vite-plugin": "^1.0.30", + "@astryxdesign/core": "^0.4.3", "@hello-pangea/dnd": "^17.0.0", "@hookform/resolvers": "^4.1.2", "@radix-ui/react-accordion": "^1.2.3", @@ -38,6 +37,7 @@ "@radix-ui/react-toggle": "^1.1.2", "@radix-ui/react-toggle-group": "^1.1.2", "@radix-ui/react-tooltip": "^1.1.8", + "@stylexjs/stylex": "^0.19.0", "@tanstack/react-query": "^5.84.1", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -50,9 +50,9 @@ "lucide-react": "^0.475.0", "moment": "^2.30.1", "next-themes": "^0.4.4", - "react": "^18.2.0", - "react-day-picker": "^8.10.1", - "react-dom": "^18.2.0", + "react": "^19.2.8", + "react-day-picker": "^10.0.1", + "react-dom": "^19.2.8", "react-hook-form": "^7.54.2", "react-leaflet": "^4.2.1", "react-markdown": "^9.0.1", @@ -70,7 +70,6 @@ }, "devDependencies": { "@eslint/js": "^9.19.0", - "@flydotio/dockerfile": "^0.7.8", "@types/node": "^22.13.5", "@types/react": "^18.2.66", "@types/react-dom": "^18.2.22", @@ -98,10 +97,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@astryxdesign/core": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@astryxdesign/core/-/core-0.4.3.tgz", + "integrity": "sha512-NtOd1wPzTSmZPJ26dhau9cGJsFSGc1h+RRBqNhzTTHlf7d2heQQFXCsX1GdEuRp0BgCDtTcn2PUXhdtaHn3JvQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "intl-messageformat": "^11.2.9" + }, + "peerDependencies": { + "@stylexjs/stylex": "^0.19.0", + "react": ">=19.0.0", + "react-dom": ">=19.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", @@ -157,6 +172,7 @@ "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", @@ -190,6 +206,7 @@ "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" @@ -241,6 +258,7 @@ "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" @@ -250,6 +268,7 @@ "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" @@ -283,6 +302,7 @@ "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" @@ -339,6 +359,7 @@ "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", @@ -353,6 +374,7 @@ "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", @@ -371,6 +393,7 @@ "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", @@ -380,29 +403,11 @@ "node": ">=6.9.0" } }, - "node_modules/@base44/sdk": { - "version": "0.8.42", - "resolved": "https://registry.npmjs.org/@base44/sdk/-/sdk-0.8.42.tgz", - "integrity": "sha512-CYJCuO/JyhLgomKwOz1+0hDAO0OSiZhDzz5Kz6u6P4iQROXjIMguxz2+MDWLEiFZUmIJISybgoP3dJts/bLqZw==", - "license": "MIT", - "dependencies": { - "axios": "^1.18.1", - "partysocket": "^0.0.23", - "socket.io-client": "^4.8.3", - "uuid": "^13.0.2" - } - }, - "node_modules/@base44/vite-plugin": { - "version": "1.0.30", - "resolved": "https://registry.npmjs.org/@base44/vite-plugin/-/vite-plugin-1.0.30.tgz", - "integrity": "sha512-KFO+HP3TUf/2vg5cW0LFV7/nHHQyAYqXqPi6jq/hQB64JWhvZBXLlQIwQU0y5mu0JVliFOgLNcwHdwC8J+ekjg==", - "license": "MIT", - "dependencies": { - "@babel/generator": "^7.28.5", - "@babel/parser": "^7.28.5", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5" - } + "node_modules/@date-fns/tz": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@date-fns/tz/-/tz-1.5.0.tgz", + "integrity": "sha512-lwYN/vDPeNRULcepoE/LO2Pgx+7/RV+S9ARfbc9lr2DtGkOD7pAiruHvbR1RX3Qyf6ja47EWJDMsNK5vK08DJg==", + "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.10", @@ -1001,31 +1006,31 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", - "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.10" + "@floating-ui/utils": "^0.2.12" } }, "node_modules/@floating-ui/dom": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", - "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.7.3", - "@floating-ui/utils": "^0.2.10" + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", - "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", + "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==", "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.7.4" + "@floating-ui/dom": "^1.8.0" }, "peerDependencies": { "react": ">=16.8.0", @@ -1033,32 +1038,32 @@ } }, "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==", + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", "license": "MIT" }, - "node_modules/@flydotio/dockerfile": { - "version": "0.7.10", - "resolved": "https://registry.npmjs.org/@flydotio/dockerfile/-/dockerfile-0.7.10.tgz", - "integrity": "sha512-dTXqBjCl7nFmnhlyeDjjPtX+sdfYBWFH9PUKNqAYttvBiczKcYXxr7/0A0wZ+g1FB1tmMzsOzedgr6xap/AB9g==", - "dev": true, + "node_modules/@formatjs/fast-memoize": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-3.1.7.tgz", + "integrity": "sha512-zXfhLpvA6T7+efdt9JLbBwZ00tT7NsBMDVnDu8rpHeNNv8KfRZAMo2gkG0k9lK/Nzc//3kJ9pImsfuJxk3KhUA==", + "license": "MIT" + }, + "node_modules/@formatjs/icu-messageformat-parser": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-3.5.17.tgz", + "integrity": "sha512-cN9jhVqT7u0K9tix43fhjoUwL0nazyW6zsNIXs2QdPADr+nurPfYyssUiMqcSCGlPcCiqnYVxgSn7zBSuI+5Bg==", "license": "MIT", "dependencies": { - "chalk": "^5.4.1", - "diff": "^7.0.0", - "ejs": "^3.1.10", - "inquirer": "^12.4.1", - "shell-quote": "^1.8.2", - "yargs": "^17.7.2" - }, - "bin": { - "dockerfile": "index.js" - }, - "engines": { - "node": ">=16.0.0" + "@formatjs/icu-skeleton-parser": "2.1.11" } }, + "node_modules/@formatjs/icu-skeleton-parser": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-2.1.11.tgz", + "integrity": "sha512-j8cUmOJzVgkHuS0QiQ6ga76UIoLOFSAMWhs7aZJztH3aAdCOAE6vpC8KVvFB4cU10ON0y2/5oOVmPJ43s2lTwA==", + "license": "MIT" + }, "node_modules/@hello-pangea/dnd": { "version": "17.0.0", "resolved": "https://registry.npmjs.org/@hello-pangea/dnd/-/dnd-17.0.0.tgz", @@ -1078,6 +1083,15 @@ "react-dom": "^18.0.0" } }, + "node_modules/@hello-pangea/dnd/node_modules/use-memo-one": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", + "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/@hookform/resolvers": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-4.1.3.tgz", @@ -1142,356 +1156,6 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@inquirer/ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.0.tgz", - "integrity": "sha512-JWaTfCxI1eTmJ1BIv86vUfjVatOdxwD0DAVKYevY8SazeUUZtW+tNbsdejVO1GYE0GXJW1N1ahmiC3TFd+7wZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/checkbox": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.2.4.tgz", - "integrity": "sha512-2n9Vgf4HSciFq8ttKXk+qy+GsyTXPV1An6QAwe/8bkbbqvG4VW1I/ZY1pNu2rf+h9bdzMLPbRSfcNxkHBy/Ydw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^1.0.0", - "@inquirer/core": "^10.2.2", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/confirm": { - "version": "5.1.18", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.18.tgz", - "integrity": "sha512-MilmWOzHa3Ks11tzvuAmFoAd/wRuaP3SwlT1IZhyMke31FKLxPiuDWcGXhU+PKveNOpAc4axzAgrgxuIJJRmLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.2", - "@inquirer/type": "^3.0.8" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/core": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.2.2.tgz", - "integrity": "sha512-yXq/4QUnk4sHMtmbd7irwiepjB8jXU0kkFRL4nr/aDBA2mDz13cMakEWdDwX3eSCTkk03kwcndD1zfRAIlELxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^1.0.0", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/editor": { - "version": "4.2.20", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.20.tgz", - "integrity": "sha512-7omh5y5bK672Q+Brk4HBbnHNowOZwrb/78IFXdrEB9PfdxL3GudQyDk8O9vQ188wj3xrEebS2M9n18BjJoI83g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.2", - "@inquirer/external-editor": "^1.0.2", - "@inquirer/type": "^3.0.8" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/expand": { - "version": "4.0.20", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.20.tgz", - "integrity": "sha512-Dt9S+6qUg94fEvgn54F2Syf0Z3U8xmnBI9ATq2f5h9xt09fs2IJXSCIXyyVHwvggKWFXEY/7jATRo2K6Dkn6Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.2", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/external-editor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", - "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^2.1.0", - "iconv-lite": "^0.7.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", - "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/input": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.4.tgz", - "integrity": "sha512-cwSGpLBMwpwcZZsc6s1gThm0J+it/KIJ+1qFL2euLmSKUMGumJ5TcbMgxEjMjNHRGadouIYbiIgruKoDZk7klw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.2", - "@inquirer/type": "^3.0.8" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/number": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.20.tgz", - "integrity": "sha512-bbooay64VD1Z6uMfNehED2A2YOPHSJnQLs9/4WNiV/EK+vXczf/R988itL2XLDGTgmhMF2KkiWZo+iEZmc4jqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.2", - "@inquirer/type": "^3.0.8" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/password": { - "version": "4.0.20", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.20.tgz", - "integrity": "sha512-nxSaPV2cPvvoOmRygQR+h0B+Av73B01cqYLcr7NXcGXhbmsYfUb8fDdw2Us1bI2YsX+VvY7I7upgFYsyf8+Nug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^1.0.0", - "@inquirer/core": "^10.2.2", - "@inquirer/type": "^3.0.8" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/prompts": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.8.6.tgz", - "integrity": "sha512-68JhkiojicX9SBUD8FE/pSKbOKtwoyaVj1kwqLfvjlVXZvOy3iaSWX4dCLsZyYx/5Ur07Fq+yuDNOen+5ce6ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/checkbox": "^4.2.4", - "@inquirer/confirm": "^5.1.18", - "@inquirer/editor": "^4.2.20", - "@inquirer/expand": "^4.0.20", - "@inquirer/input": "^4.2.4", - "@inquirer/number": "^3.0.20", - "@inquirer/password": "^4.0.20", - "@inquirer/rawlist": "^4.1.8", - "@inquirer/search": "^3.1.3", - "@inquirer/select": "^4.3.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/rawlist": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.8.tgz", - "integrity": "sha512-CQ2VkIASbgI2PxdzlkeeieLRmniaUU1Aoi5ggEdm6BIyqopE9GuDXdDOj9XiwOqK5qm72oI2i6J+Gnjaa26ejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.2", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/search": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.1.3.tgz", - "integrity": "sha512-D5T6ioybJJH0IiSUK/JXcoRrrm8sXwzrVMjibuPs+AgxmogKslaafy1oxFiorNI4s3ElSkeQZbhYQgLqiL8h6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.2", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/select": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.3.4.tgz", - "integrity": "sha512-Qp20nySRmfbuJBBsgPU7E/cL62Hf250vMZRzYDcBHty2zdD1kKCnoDFWRr0WO2ZzaXp3R7a4esaVGJUx0E6zvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^1.0.0", - "@inquirer/core": "^10.2.2", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/type": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.8.tgz", - "integrity": "sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -1672,6 +1336,36 @@ } } }, + "node_modules/@radix-ui/react-accordion/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-alert-dialog": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz", @@ -1700,6 +1394,118 @@ } } }, + "node_modules/@radix-ui/react-alert-dialog/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-alert-dialog/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-alert-dialog/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-alert-dialog/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-arrow": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", @@ -1804,19 +1610,19 @@ } }, "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==", + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.20.tgz", + "integrity": "sha512-mcGesGplBnzN2sbvJETzpCNfSMyPnb29q1GRLU+Ib7bJrpIG2ywmRoh2V5VbA2uNvKikKUlVbAPks7JDjz4A8Q==", "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" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -1833,6 +1639,177 @@ } } }, + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/primitive": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.7.tgz", + "integrity": "sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.5.tgz", + "integrity": "sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==", + "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-collapsible/node_modules/@radix-ui/react-context": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.2.2.tgz", + "integrity": "sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==", + "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-collapsible/node_modules/@radix-ui/react-id": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.4.tgz", + "integrity": "sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "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-collapsible/node_modules/@radix-ui/react-presence": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.10.tgz", + "integrity": "sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.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-collapsible/node_modules/@radix-ui/react-primitive": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.10.tgz", + "integrity": "sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.3.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-collapsible/node_modules/@radix-ui/react-slot": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.3.tgz", + "integrity": "sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.5" + }, + "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-collapsible/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.6.tgz", + "integrity": "sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "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-collapsible/node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.5.tgz", + "integrity": "sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "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-collapsible/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.4.tgz", + "integrity": "sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==", + "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-collection": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", @@ -1918,25 +1895,26 @@ } }, "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==", + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.23.tgz", + "integrity": "sha512-Ksw4WeROkO4rC9k/onilX/Ao2Cr1ku1unMNH+XSCcP4jSXYu7HDsg9n4ojMjVb22XpYjAQ9qfrFlVbru1vXDUA==", "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", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" + "react-remove-scroll": "^2.7.2" }, "peerDependencies": { "@types/react": "*", @@ -1953,6 +1931,192 @@ } } }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/primitive": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.7.tgz", + "integrity": "sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.5.tgz", + "integrity": "sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==", + "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-dialog/node_modules/@radix-ui/react-context": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.2.2.tgz", + "integrity": "sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==", + "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-dialog/node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.6.tgz", + "integrity": "sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==", + "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-dialog/node_modules/@radix-ui/react-id": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.4.tgz", + "integrity": "sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "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-dialog/node_modules/@radix-ui/react-presence": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.10.tgz", + "integrity": "sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.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-dialog/node_modules/@radix-ui/react-primitive": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.10.tgz", + "integrity": "sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.3.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.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.3.tgz", + "integrity": "sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.5" + }, + "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-dialog/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.6.tgz", + "integrity": "sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "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-dialog/node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.5.tgz", + "integrity": "sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "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-dialog/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.4.tgz", + "integrity": "sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==", + "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-direction": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", @@ -1969,16 +2133,16 @@ } }, "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==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.19.tgz", + "integrity": "sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==", "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" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-effect-event": "0.0.5" }, "peerDependencies": { "@types/react": "*", @@ -1995,6 +2159,116 @@ } } }, + "node_modules/@radix-ui/react-dismissable-layer/node_modules/@radix-ui/primitive": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.7.tgz", + "integrity": "sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-dismissable-layer/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.5.tgz", + "integrity": "sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==", + "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/node_modules/@radix-ui/react-primitive": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.10.tgz", + "integrity": "sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.3.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-dismissable-layer/node_modules/@radix-ui/react-slot": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.3.tgz", + "integrity": "sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.5" + }, + "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/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.4.tgz", + "integrity": "sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==", + "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/node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.5.tgz", + "integrity": "sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "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/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.4.tgz", + "integrity": "sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==", + "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-dropdown-menu": { "version": "2.1.16", "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", @@ -2040,14 +2314,14 @@ } }, "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==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.16.tgz", + "integrity": "sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==", "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" + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -2064,6 +2338,77 @@ } } }, + "node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.5.tgz", + "integrity": "sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==", + "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/node_modules/@radix-ui/react-primitive": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.10.tgz", + "integrity": "sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.3.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-focus-scope/node_modules/@radix-ui/react-slot": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.3.tgz", + "integrity": "sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.5" + }, + "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/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.4.tgz", + "integrity": "sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==", + "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-hover-card": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.15.tgz", @@ -2095,6 +2440,57 @@ } } }, + "node_modules/@radix-ui/react-hover-card/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-hover-card/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-id": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", @@ -2176,6 +2572,82 @@ } } }, + "node_modules/@radix-ui/react-menu/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-menu/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-menu/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-menubar": { "version": "1.1.16", "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.16.tgz", @@ -2244,6 +2716,33 @@ } } }, + "node_modules/@radix-ui/react-navigation-menu/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-popover": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", @@ -2281,6 +2780,82 @@ } } }, + "node_modules/@radix-ui/react-popover/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-popover/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-popover/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-popper": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", @@ -2314,13 +2889,13 @@ } }, "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==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.17.tgz", + "integrity": "sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -2337,6 +2912,77 @@ } } }, + "node_modules/@radix-ui/react-portal/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.5.tgz", + "integrity": "sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==", + "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-portal/node_modules/@radix-ui/react-primitive": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.10.tgz", + "integrity": "sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.3.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-portal/node_modules/@radix-ui/react-slot": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.3.tgz", + "integrity": "sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.5" + }, + "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-portal/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.4.tgz", + "integrity": "sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==", + "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-presence": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", @@ -2545,6 +3191,82 @@ } } }, + "node_modules/@radix-ui/react-select/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-select/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-select/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-separator": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", @@ -2679,14 +3401,14 @@ } }, "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==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.18.tgz", + "integrity": "sha512-7lonPlKfSacd20GlOBx2ltuVKz9oqWYZz+oMQyOltw6t1y2nyftj2ZmwwUHYn49kqfDWcp8dNZm5NgV+5Z+mug==", "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" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -2732,6 +3454,146 @@ } } }, + "node_modules/@radix-ui/react-toggle-group/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/node_modules/@radix-ui/primitive": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.7.tgz", + "integrity": "sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.5.tgz", + "integrity": "sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==", + "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-toggle/node_modules/@radix-ui/react-primitive": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.10.tgz", + "integrity": "sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.3.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/node_modules/@radix-ui/react-slot": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.3.tgz", + "integrity": "sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.5" + }, + "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-toggle/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.6.tgz", + "integrity": "sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "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-toggle/node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.5.tgz", + "integrity": "sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "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-toggle/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.4.tgz", + "integrity": "sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==", + "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-tooltip": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", @@ -2766,6 +3628,57 @@ } } }, + "node_modules/@radix-ui/react-tooltip/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-tooltip/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-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", @@ -2949,17 +3862,6 @@ "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", "license": "MIT" }, - "node_modules/@react-leaflet/core": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-2.1.0.tgz", - "integrity": "sha512-Qk7Pfu8BSarKGqILj4x7bCSZ1pjuAPZ+qmRwH5S7mDS91VSbVVsJSrW4qA+GPrro8t69gFYVMWb1Zc4yFmPiVg==", - "license": "Hippocratic-2.1", - "peerDependencies": { - "leaflet": "^1.9.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.27", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", @@ -3275,18 +4177,23 @@ "win32" ] }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", - "license": "MIT" - }, "node_modules/@standard-schema/utils": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", "license": "MIT" }, + "node_modules/@stylexjs/stylex": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@stylexjs/stylex/-/stylex-0.19.0.tgz", + "integrity": "sha512-CnUFp7YMaDLDeemsWOfJgoC/gKM5P/yBNMcpJaE6ChJmXr7s0DJwSeGTTlHJcqqwN9OW1qGtmARWLFhGZN1pTA==", + "license": "MIT", + "dependencies": { + "css-mediaquery": "^0.1.2", + "invariant": "^2.2.4", + "styleq": "0.2.1" + } + }, "node_modules/@tanstack/query-core": { "version": "5.89.0", "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.89.0.tgz", @@ -3592,18 +4499,6 @@ "node": ">=0.8" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -3830,13 +4725,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, - "license": "MIT" - }, "node_modules/async-function": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", @@ -3847,12 +4735,6 @@ "node": ">= 0.4" } }, - "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.21", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", @@ -3907,18 +4789,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/axios": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.1.tgz", - "integrity": "sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", - "https-proxy-agent": "^5.0.1", - "proxy-from-env": "^2.1.0" - } - }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -4124,19 +4994,6 @@ "node": ">=0.8" } }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/character-entities": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", @@ -4177,13 +5034,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/chardet": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", - "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", - "dev": true, - "license": "MIT" - }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -4232,94 +5082,6 @@ "url": "https://polar.sh/cva" } }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 12" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", @@ -4381,18 +5143,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "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/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", @@ -4427,12 +5177,16 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", - "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", "license": "MIT", "engines": { "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/crc-32": { @@ -4470,6 +5224,12 @@ "tiny-invariant": "^1.0.6" } }, + "node_modules/css-mediaquery": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz", + "integrity": "sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q==", + "license": "BSD" + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -4770,15 +5530,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -4813,16 +5564,6 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "license": "Apache-2.0" }, - "node_modules/diff": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", - "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", @@ -4872,22 +5613,6 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/electron-to-chromium": { "version": "1.5.222", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.222.tgz", @@ -4929,28 +5654,6 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "license": "MIT" }, - "node_modules/engine.io-client": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.5.tgz", - "integrity": "sha512-QCwxUDULPlXv8F6tqMMKx5dNkTe6OaBYRMPYeXKBlyOoKvAmE0ac6pW7fFhSscJ/5SI7666/U/B+MElbsrJlIg==", - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.4.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.20.1", - "xmlhttprequest-ssl": "~2.1.1" - } - }, - "node_modules/engine.io-parser": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/es-abstract": { "version": "1.24.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", @@ -5082,6 +5785,7 @@ "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==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -5427,18 +6131,6 @@ "node": ">=0.10.0" } }, - "node_modules/event-target-shim": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-6.0.2.tgz", - "integrity": "sha512-8q3LsZjRezbFZ2PN+uP+Q7pnHUMmAOziU2vA2OwoFaKIXxlxl38IylhSSgUorWu/rf4er67w0ikBqjBFk/pomA==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/eventemitter3": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", @@ -5465,9 +6157,9 @@ "license": "Apache-2.0" }, "node_modules/fast-equals": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz", - "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.1.tgz", + "integrity": "sha512-DjlFSM5Pk9cGcL0q5QXl66eGzx0N6szNgaswwc5ZphlBohjTVJSnGgI+rJVOgOi65qUoQnDZN4nDqi33udtydQ==", "license": "MIT", "engines": { "node": ">=6.0.0" @@ -5537,39 +6229,6 @@ "node": ">=16.0.0" } }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -5620,26 +6279,6 @@ "dev": true, "license": "ISC" }, - "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", @@ -5672,22 +6311,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/form-data": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", - "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.4", - "mime-types": "^2.1.35" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/frac": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", @@ -5801,16 +6424,6 @@ "node": ">=6.9.0" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -6113,36 +6726,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", - "dev": true, - "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/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -6196,33 +6779,6 @@ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" } }, - "node_modules/inquirer": { - "version": "12.9.6", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.9.6.tgz", - "integrity": "sha512-603xXOgyfxhuis4nfnWaZrMaotNT0Km9XwwBNWUKbIDqeCY89jGr2F9YPEMiNhU6XjIP4VoWISMBFfcc5NgrTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^1.0.0", - "@inquirer/core": "^10.2.2", - "@inquirer/prompts": "^7.8.6", - "@inquirer/type": "^3.0.8", - "mute-stream": "^2.0.0", - "run-async": "^4.0.5", - "rxjs": "^7.8.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -6247,6 +6803,25 @@ "node": ">=12" } }, + "node_modules/intl-messageformat": { + "version": "11.2.14", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-11.2.14.tgz", + "integrity": "sha512-9f2VD1HFuxUvMw0RxsaP8WmMns6JRTnsNB/zghTFrp11ZktiXWwVDeZBPQchBKEmo+Gx/ZhxI7Qht7YglFD4PA==", + "license": "BSD-3-Clause", + "dependencies": { + "@formatjs/fast-memoize": "3.1.7", + "@formatjs/icu-messageformat-parser": "3.5.17" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/is-alphabetical": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", @@ -6771,24 +7346,6 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/jake": { - "version": "10.9.4", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", - "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.6", - "filelist": "^1.0.4", - "picocolors": "^1.1.1" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jiti": { "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", @@ -6821,6 +7378,7 @@ "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" @@ -7630,27 +8188,6 @@ "node": ">=8.6" } }, - "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/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -7703,16 +8240,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -8034,15 +8561,6 @@ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", "license": "MIT" }, - "node_modules/partysocket": { - "version": "0.0.23", - "resolved": "https://registry.npmjs.org/partysocket/-/partysocket-0.0.23.tgz", - "integrity": "sha512-S43vtjJ///wvzxf0Pw8yD4HVGUDiJSmP1tJQjEzYUG6L7Id63+1CTcgZ0FXTy5BGHe8CuKNyO6bYd4LpOcy4QQ==", - "license": "ISC", - "dependencies": { - "event-target-shim": "^6.0.2" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -8336,15 +8854,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/proxy-from-env": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", - "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -8410,42 +8919,60 @@ "license": "MIT" }, "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==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", "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==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-10.0.1.tgz", + "integrity": "sha512-eNh6BlwcYInWaJtRv18mXQ06Ys/H6rdTZAnTaSdOYJuTpwP1JMCHNd1FDRadA+gbeinq+psdULN5Xnowy9mV8w==", "license": "MIT", + "dependencies": { + "@date-fns/tz": "^1.4.1", + "date-fns": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, "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" + "@types/react": ">=16.8.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-day-picker/node_modules/date-fns": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.4.0.tgz", + "integrity": "sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" } }, "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==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^18.3.1" + "react": "^19.2.8" } }, "node_modules/react-hook-form": { @@ -8484,6 +9011,17 @@ "react-dom": "^18.0.0" } }, + "node_modules/react-leaflet/node_modules/@react-leaflet/core": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-2.1.0.tgz", + "integrity": "sha512-Qk7Pfu8BSarKGqILj4x7bCSZ1pjuAPZ+qmRwH5S7mDS91VSbVVsJSrW4qA+GPrro8t69gFYVMWb1Zc4yFmPiVg==", + "license": "Hippocratic-2.1", + "peerDependencies": { + "leaflet": "^1.9.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/react-markdown": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.1.0.tgz", @@ -8560,9 +9098,9 @@ } }, "node_modules/react-remove-scroll": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", - "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", + "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", @@ -8854,16 +9392,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", @@ -8944,16 +9472,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/run-async": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-4.0.6.tgz", - "integrity": "sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -8977,16 +9495,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/safe-array-concat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", @@ -9042,21 +9550,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "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" - } + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" }, "node_modules/semver": { "version": "6.3.1", @@ -9069,9 +9567,9 @@ } }, "node_modules/set-cookie-parser": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", "license": "MIT" }, "node_modules/set-function-length": { @@ -9142,19 +9640,6 @@ "node": ">=8" } }, - "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -9243,34 +9728,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/socket.io-client": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.3.tgz", - "integrity": "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==", - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.4.1", - "engine.io-client": "~6.6.1", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.6.tgz", - "integrity": "sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==", - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.4.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/sonner": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz", @@ -9565,6 +10022,12 @@ "inline-style-parser": "0.2.4" } }, + "node_modules/styleq": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/styleq/-/styleq-0.2.1.tgz", + "integrity": "sha512-L0TR0NQb+X4/ktDEKmjWyp27gla+LUYi/by5k5SjKXf6/pvZP7wbwEB5J+tqxdFVPgzbsuz+d4RTScO/QZquBw==", + "license": "MIT" + }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", @@ -10079,15 +10542,6 @@ } } }, - "node_modules/use-memo-one": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", - "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/use-sidecar": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", @@ -10125,19 +10579,6 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, - "node_modules/uuid": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.2.tgz", - "integrity": "sha512-vzi9uRZ926x4XV73S/4qQaTwPXM2JBj6/6lI/byHH1jOpCzb0zDbfytgA9LcN/hzb2l7WQSQnxITOVx5un/wGw==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist-node/bin/uuid" - } - }, "node_modules/vaul": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vaul/-/vaul-1.1.2.tgz", @@ -10439,21 +10880,6 @@ "node": ">=0.10.0" } }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", @@ -10513,72 +10939,6 @@ "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ws": { - "version": "8.20.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.1.tgz", - "integrity": "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==", - "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", @@ -10600,24 +10960,6 @@ "node": ">=0.8" } }, - "node_modules/xmlhttprequest-ssl": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", - "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -10637,80 +10979,6 @@ "node": ">= 14.6" } }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -10724,19 +10992,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", - "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/zod": { "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", diff --git a/package.json b/package.json index 4e3d473..396aed2 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,16 @@ { - "name": "base44-app", + "name": "krow-workforce-control-tower", "private": true, "version": "0.0.0", "type": "module", "scripts": { "dev": "vite", "build": "vite build", - "lint": "eslint .", - "preview": "vite preview" + "preview": "vite preview", + "lint": "eslint ." }, "dependencies": { - "@base44/sdk": "^0.8.42", - "@base44/vite-plugin": "^1.0.30", + "@astryxdesign/core": "^0.4.3", "@hello-pangea/dnd": "^17.0.0", "@hookform/resolvers": "^4.1.2", "@radix-ui/react-accordion": "^1.2.3", @@ -40,6 +39,7 @@ "@radix-ui/react-toggle": "^1.1.2", "@radix-ui/react-toggle-group": "^1.1.2", "@radix-ui/react-tooltip": "^1.1.8", + "@stylexjs/stylex": "^0.19.0", "@tanstack/react-query": "^5.84.1", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -52,9 +52,9 @@ "lucide-react": "^0.475.0", "moment": "^2.30.1", "next-themes": "^0.4.4", - "react": "^18.2.0", - "react-day-picker": "^8.10.1", - "react-dom": "^18.2.0", + "react": "^19.2.8", + "react-day-picker": "^10.0.1", + "react-dom": "^19.2.8", "react-hook-form": "^7.54.2", "react-leaflet": "^4.2.1", "react-markdown": "^9.0.1", @@ -72,7 +72,6 @@ }, "devDependencies": { "@eslint/js": "^9.19.0", - "@flydotio/dockerfile": "^0.7.8", "@types/node": "^22.13.5", "@types/react": "^18.2.66", "@types/react-dom": "^18.2.22", diff --git a/public/demo-documents/draft-contract-sample.pdf b/public/demo-documents/draft-contract-sample.pdf new file mode 100644 index 0000000..45bf6a0 Binary files /dev/null and b/public/demo-documents/draft-contract-sample.pdf differ diff --git a/public/demo-documents/vendor-nda-sample.pdf b/public/demo-documents/vendor-nda-sample.pdf new file mode 100644 index 0000000..26becfc Binary files /dev/null and b/public/demo-documents/vendor-nda-sample.pdf differ diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..68cf288 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/favicon.webp b/public/favicon.webp new file mode 100644 index 0000000..5252e56 Binary files /dev/null and b/public/favicon.webp differ diff --git a/src/App.jsx b/src/App.jsx index f637a4d..6cf879a 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -2,14 +2,9 @@ import './App.css' import { Toaster } from "@/components/ui/toaster" import { QueryClientProvider } from '@tanstack/react-query' import { queryClientInstance } from '@/lib/query-client' -import VisualEditAgent from '@/lib/VisualEditAgent' -import NavigationTracker from '@/lib/NavigationTracker' import { pagesConfig } from './pages.config' import { BrowserRouter as Router, Route, Routes, useLocation } from 'react-router-dom'; -import { setupIframeMessaging } from './lib/iframe-messaging'; import PageNotFound from './lib/PageNotFound'; -import { AuthProvider, useAuth } from '@/lib/AuthContext'; -import UserNotRegisteredError from '@/components/UserNotRegisteredError'; import FeatureReport from './pages/FeatureReport'; import LandingPage from './pages/LandingPage'; import KrowX from './pages/KrowX'; @@ -42,38 +37,20 @@ const { Pages, Layout, mainPage } = pagesConfig; const mainPageKey = mainPage ?? Object.keys(Pages)[0]; const MainPage = mainPageKey ? Pages[mainPageKey] : <>; -setupIframeMessaging(); - const LayoutWrapper = ({ children, currentPageName }) => Layout ? {children} : <>{children}; -const AuthenticatedApp = () => { - const { isLoadingAuth, isLoadingPublicSettings, authError, isAuthenticated, navigateToLogin } = useAuth(); +/** + * The application routes. + * + * Nothing gates this render: the app is a standalone frontend with local data, + * so the first paint is always the KROW UI — no session check, no loading gate, + * no redirect. + */ +const AppRoutes = () => { const location = useLocation(); - // Show loading spinner while checking app public settings or auth - if (isLoadingPublicSettings || isLoadingAuth) { - return ( -
-
-
- ); - } - - // Handle authentication errors - if (authError) { - if (authError.type === 'user_not_registered') { - return ; - } else if (authError.type === 'auth_required') { - // Redirect to login automatically - navigateToLogin(); - return null; - } - } - - // Render the main app - if (location.pathname === '/LandingPage') { return ( @@ -126,16 +103,12 @@ const AuthenticatedApp = () => { function App() { return ( - - - - - - - - - - + + + + + + ) } diff --git a/src/Layout.jsx b/src/Layout.jsx index 84fed1a..2827ff0 100644 --- a/src/Layout.jsx +++ b/src/Layout.jsx @@ -1,7 +1,7 @@ import React from "react"; import { Link, useLocation, useNavigate } from "react-router-dom"; import { createPageUrl } from "@/utils"; -import { base44 } from "@/api/base44Client"; +import { krow } from "@/api/client"; import { useQuery } from "@tanstack/react-query"; import { Users, LayoutDashboard, UserPlus, Calendar, Briefcase, FileText, @@ -469,17 +469,18 @@ function LayoutChrome({ children }) { const { data: user } = useQuery({ queryKey: ['current-user-layout'], - queryFn: () => base44.auth.me(), + queryFn: () => krow.auth.me(), }); - const sampleAvatar = "https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=400&h=400&fit=crop"; - const userAvatar = user?.profile_picture || sampleAvatar; + // Local default: use user's profile picture if available (and not company logo), otherwise null to trigger AvatarFallback. + const rawAvatar = user?.profile_picture; + const userAvatar = (rawAvatar && !rawAvatar.includes('krow-logo')) ? rawAvatar : null; const { data: unreadCount = 0 } = useQuery({ queryKey: ['unread-notifications', user?.id], queryFn: async () => { if (!user?.id) return 0; - const notifications = await base44.entities.ActivityLog.filter({ + const notifications = await krow.entities.ActivityLog.filter({ user_id: user?.id, is_read: false }); @@ -496,16 +497,28 @@ function LayoutChrome({ children }) { const userName = user?.full_name || user?.email || "User"; const userInitial = userName.charAt(0).toUpperCase(); - const handleLogout = () => { - base44.auth.logout(); + // There is no session to end. This resets the local profile to its defaults + // and reloads into the dashboard. + const handleLogout = async () => { + await krow.auth.logout(); + window.location.assign("/"); }; const handleRefresh = () => { window.location.reload(); }; + // Route change starts at the top of the new page. The browser does this for + // free while the document scrolls; the page has its own scrollport now, so the + // shell resets it. Keyed on pathname only — changing a filter in the query + // string is not a new page and must not yank the user upward. + const mainRef = React.useRef(null); + React.useEffect(() => { + mainRef.current?.scrollTo({ top: 0, left: 0 }); + }, [location.pathname]); + return ( -
+
-
- - + {/* Left section: Mobile menu toggle + Logo/Brand */} +
- -
-
-