commit bd48e12c23c496300d0d3ec34e1c1f951a8ce357 Author: Bhanu Prakash Sai Potteri Date: Wed Aug 19 12:42:50 2026 +0530 feat: seed from p2p reference repo diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c58db5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +node_modules/ +dist/ +.env +*.local +.DS_Store +*-local-command-caveatcaveat-*.txt diff --git a/components.json b/components.json new file mode 100644 index 0000000..5c23ec4 --- /dev/null +++ b/components.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "radix-nova", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/index.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "lucide", + "rtl": false, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "menuColor": "default", + "menuAccent": "subtle", + "registries": {} +} diff --git a/frontgen_projects_dev_to_studio.sql b/frontgen_projects_dev_to_studio.sql new file mode 100644 index 0000000..642e2b3 --- /dev/null +++ b/frontgen_projects_dev_to_studio.sql @@ -0,0 +1,36 @@ +-- ============================================================ +-- Frontgen Projects — Dev → Studio Migration +-- Run against: studio DB +-- +-- Studio already has: clinic-workflow, support-ticket, customer-onboarding, +-- task-management, truck, p2p (already on studio URL) +-- Missing in studio: dealer-1, grfm-app, dealer-new-1, grfm, truck2, adani-dealer +-- ============================================================ + +BEGIN; + +-- 1. Repoint zino_api_url for projects already in studio (excluding p2p which is correct) +UPDATE frontgen.projects +SET zino_api_url = 'https://studio.getzino.in' +WHERE id IN ( + '09c3357e-9b6c-4a93-abaf-9464e90ebbe4', -- Clinic workflow + '14307640-8e37-4448-ba3c-c3672da68bbf', -- Support Ticket + 'a22cd6ba-c5e4-4f7e-ac84-1db17559c075', -- Customer Onboarding + '242eb4da-066f-4c46-9f5b-479f3e1df3f1', -- Task Management + '9134befe-f74b-4c87-925d-d4eaa096dbf0' -- Truck +); + +-- 2. Insert the 6 missing projects (all pre-pointed at studio) +INSERT INTO frontgen.projects (id, name, slug, framework, repo_name, preview_url, workflow_id, zino_api_url, last_build_status, last_build_at, last_commit_sha, created_at, updated_at) VALUES +('0afe0940-6ced-4310-bd95-acbda3d9da6e', 'dealer 1', 'dealer-1', 'react', 'dealer-1', 'https://preview.getzino.in/dealer-1/', 'fd7e72a5-5920-4d41-a660-40aa14a21fb6', 'https://studio.getzino.in', 'success', '2026-04-02 10:17:20.206652+00', '1bdd529a7bb461dee4ffc33c8c75dd7795f710a6', '2026-03-31 07:01:58.61003+00', '2026-04-02 10:17:20.209667+00'), +('0ca7e50c-ea3c-4238-9ae1-07cdd61c9023', 'GRFM APP', 'grfm-app', 'react', 'grfm-app', 'http://preview.getzino.in/grfm-app/', '7dabcd26-30a4-498c-82a8-0fc88f1ad0dc', 'https://studio.getzino.in', 'success', '2026-03-31 10:24:14.231953+00', '5b4c587976d2ba4ba5a8c3bc03617ee9e52c63a2', '2026-03-31 10:06:47.566653+00', '2026-03-31 10:24:14.23535+00'), +('69aa6f58-0e45-4562-8413-19de03f9f8b5', 'Dealer new 1', 'dealer-new-1', 'react', 'dealer-new-1', 'http://preview.getzino.in/dealer-new-1/', '817a45fe-882f-4502-b3cb-4ace65ca7b48', 'https://studio.getzino.in', 'success', '2026-04-10 13:30:05.24563+00', '9369958d64c266ef2c03afeab0c99117a7981388', '2026-04-08 05:58:17.232322+00', '2026-04-10 13:30:05.24978+00'), +('8660fc96-9a06-4813-956f-2a22c8a6c69f', 'GRFM', 'grfm', 'react', 'grfm', 'http://preview.getzino.in/grfm/', '276d050c-c668-4fb4-9d4c-c627fc71c217', 'https://studio.getzino.in', 'success', '2026-04-13 06:15:35.019749+00', 'f9917e10eb4534ecff57bf743393676d8c844b0e', '2026-04-13 06:00:26.479567+00', '2026-04-13 06:15:35.024828+00'), +('a12e234c-be37-4eb8-8410-0bff989e9b0b', 'Truck2', 'truck2', 'react', 'truck2', 'http://preview.getzino.in/truck2/', '6e144d23-dd76-478c-b330-6acd3b736129"', 'https://studio.getzino.in', 'success', '2026-04-13 11:56:50.316279+00', '9014d4522664b12315fae11f516632c20ada1617', '2026-04-13 11:31:17.284247+00', '2026-04-13 11:56:50.320774+00'), +('0782a310-8dbc-4032-93b4-98454ae33317', 'Adani Dealer', 'adani-dealer', 'react', 'adani-dealer', 'http://preview.getzino.in/adani-dealer/', 'fc0dc1f1-bf24-4e5b-a066-6d16efc95899', 'https://studio.getzino.in', 'success', '2026-04-16 05:57:06.831479+00', '22025ea5fe2a28df6cb954de9141edeb3d68ead0', '2026-04-16 05:40:06.970758+00', '2026-04-16 05:57:06.834982+00') +ON CONFLICT (id) DO NOTHING; + +COMMIT; + +-- Verify +SELECT id, name, slug, zino_api_url FROM frontgen.projects ORDER BY created_at; diff --git a/index.html b/index.html new file mode 100644 index 0000000..f1ad924 --- /dev/null +++ b/index.html @@ -0,0 +1,16 @@ + + + + + + + + + + P2P + + +
+ + + \ No newline at end of file diff --git a/migration_dev_to_studio.sql b/migration_dev_to_studio.sql new file mode 100644 index 0000000..ee28685 --- /dev/null +++ b/migration_dev_to_studio.sql @@ -0,0 +1,405 @@ +-- ============================================================ +-- P2P Invoice System — Full Migration: Dev → Studio +-- Org 20, App 20 +-- Generated from dev DB (studio-v2-pg) +-- ============================================================ +BEGIN; + +-- 1. Users + +INSERT INTO usersystem.tbl_users (id, name, email, password) VALUES (29100, 'Priya AI Finance (P2P Demo)', 'org20_priya.p2p@company.com', 'priya123') ON CONFLICT (id) DO NOTHING; +INSERT INTO usersystem.tbl_users (id, name, email, password) VALUES (29101, 'Vendor Portal User', 'org20_vendor@abcsupplies.com', 'vendor123') ON CONFLICT (id) DO NOTHING; +INSERT INTO usersystem.tbl_users (id, name, email, password) VALUES (29102, 'Rajesh Sharma (Warehouse)', 'org20_rajesh.warehouse@company.com', 'rajesh123') ON CONFLICT (id) DO NOTHING; +INSERT INTO usersystem.tbl_users (id, name, email, password) VALUES (29103, 'Meera Patel (Procurement)', 'org20_meera.procurement@company.com', 'meera123') ON CONFLICT (id) DO NOTHING; +INSERT INTO usersystem.tbl_users (id, name, email, password) VALUES (29104, 'Anita Desai (Accounts Payable)', 'org20_anita.ap@company.com', 'anita123') ON CONFLICT (id) DO NOTHING; +INSERT INTO usersystem.tbl_users (id, name, email, password) VALUES (29105, 'Vikram Singh (Finance Manager)', 'org20_vikram.finance@company.com', 'vikram123') ON CONFLICT (id) DO NOTHING; + +-- Org users +INSERT INTO usersystem.tbl_org_users (id, user_id, org_id) VALUES (20027, 29100, 20) ON CONFLICT (id) DO NOTHING; +INSERT INTO usersystem.tbl_org_users (id, user_id, org_id) VALUES (20028, 29101, 20) ON CONFLICT (id) DO NOTHING; +INSERT INTO usersystem.tbl_org_users (id, user_id, org_id) VALUES (20029, 29102, 20) ON CONFLICT (id) DO NOTHING; +INSERT INTO usersystem.tbl_org_users (id, user_id, org_id) VALUES (20030, 29103, 20) ON CONFLICT (id) DO NOTHING; +INSERT INTO usersystem.tbl_org_users (id, user_id, org_id) VALUES (20031, 29104, 20) ON CONFLICT (id) DO NOTHING; +INSERT INTO usersystem.tbl_org_users (id, user_id, org_id) VALUES (20032, 29105, 20) ON CONFLICT (id) DO NOTHING; + +-- Roles +INSERT INTO usersystem.tbl_roles (id, name, org_id) VALUES (29100, 'p2p_ai_finance', 20) ON CONFLICT (id) DO NOTHING; +INSERT INTO usersystem.tbl_roles (id, name, org_id) VALUES (29101, 'p2p_vendor', 20) ON CONFLICT (id) DO NOTHING; +INSERT INTO usersystem.tbl_roles (id, name, org_id) VALUES (29102, 'p2p_warehouse', 20) ON CONFLICT (id) DO NOTHING; +INSERT INTO usersystem.tbl_roles (id, name, org_id) VALUES (29103, 'p2p_procurement', 20) ON CONFLICT (id) DO NOTHING; +INSERT INTO usersystem.tbl_roles (id, name, org_id) VALUES (29104, 'p2p_ap_team', 20) ON CONFLICT (id) DO NOTHING; +INSERT INTO usersystem.tbl_roles (id, name, org_id) VALUES (29105, 'p2p_finance_reviewer', 20) ON CONFLICT (id) DO NOTHING; + +-- User roles +INSERT INTO usersystem.tbl_user_roles (user_id, role_id, org_id) VALUES (29100, 29100, 20) ON CONFLICT DO NOTHING; +INSERT INTO usersystem.tbl_user_roles (user_id, role_id, org_id) VALUES (29101, 29101, 20) ON CONFLICT DO NOTHING; +INSERT INTO usersystem.tbl_user_roles (user_id, role_id, org_id) VALUES (29102, 29102, 20) ON CONFLICT DO NOTHING; +INSERT INTO usersystem.tbl_user_roles (user_id, role_id, org_id) VALUES (29103, 29103, 20) ON CONFLICT DO NOTHING; +INSERT INTO usersystem.tbl_user_roles (user_id, role_id, org_id) VALUES (29104, 29104, 20) ON CONFLICT DO NOTHING; +INSERT INTO usersystem.tbl_user_roles (user_id, role_id, org_id) VALUES (29105, 29105, 20) ON CONFLICT DO NOTHING; + +-- User groups + +-- User app assignments +INSERT INTO usersystem.tbl_org_user_apps (id, org_user_id, app_id, org_id) VALUES (20129, 20027, 20, 20) ON CONFLICT (id) DO NOTHING; +INSERT INTO usersystem.tbl_org_user_apps (id, org_user_id, app_id, org_id) VALUES (20130, 20028, 20, 20) ON CONFLICT (id) DO NOTHING; +INSERT INTO usersystem.tbl_org_user_apps (id, org_user_id, app_id, org_id) VALUES (20131, 20029, 20, 20) ON CONFLICT (id) DO NOTHING; +INSERT INTO usersystem.tbl_org_user_apps (id, org_user_id, app_id, org_id) VALUES (20132, 20030, 20, 20) ON CONFLICT (id) DO NOTHING; +INSERT INTO usersystem.tbl_org_user_apps (id, org_user_id, app_id, org_id) VALUES (20133, 20031, 20, 20) ON CONFLICT (id) DO NOTHING; +INSERT INTO usersystem.tbl_org_user_apps (id, org_user_id, app_id, org_id) VALUES (20134, 20032, 20, 20) ON CONFLICT (id) DO NOTHING; + +-- 2. App +INSERT INTO tbl_apps (id, name, org_id, description) VALUES (20, 'P2P Invoice System', 20, 'AI-powered invoice validation with department clarification and finance approval') ON CONFLICT (id) DO NOTHING; + +-- Workflow config +INSERT INTO tbl_appconfig_workflows (id, workflow_uid, version, app_id, content) VALUES (20109, 'wf_p2p_invoice_demo', '1', 20, '{"name": "P2P Invoice Validation", "states": [{"uid": "p2p-state-awaiting-clarification", "name": "Awaiting Clarification", "type": "STANDARD", "allowed_activities": ["p2p-act-provide-clarification"]}, {"uid": "p2p-state-invoice-submitted", "name": "Invoice Submitted", "type": "STANDARD", "allowed_activities": ["p2p-act-request-clarification", "p2p-act-submit-recommendation"]}, {"uid": "p2p-state-ai-analysis", "name": "AI Analysis", "type": "STANDARD", "allowed_activities": ["p2p-act-request-clarification", "p2p-act-submit-recommendation"]}, {"uid": "p2p-state-finance-review", "name": "Finance Review", "type": "STANDARD", "allowed_activities": ["p2p-act-approve-payment", "p2p-act-reject-payment", "p2p-act-hold-payment"]}, {"uid": "p2p-state-approved", "name": "Approved", "type": "END", "allowed_activities": []}, {"uid": "p2p-state-rejected", "name": "Rejected", "type": "END", "allowed_activities": []}, {"uid": "p2p-state-on-hold", "name": "On Hold", "type": "END", "allowed_activities": []}], "version": 1, "sg_rules": [], "activities": [{"uid": "p2p-act-submit-invoice", "name": "Submit Invoice", "type": "INIT", "ai_confidence_threshold": 0.5}, {"uid": "p2p-act-request-clarification", "name": "Request Clarification", "type": "NORMAL", "ai_confidence_threshold": 0.5}, {"uid": "p2p-act-submit-recommendation", "name": "Submit Recommendation", "type": "NORMAL", "ai_confidence_threshold": 0.5}, {"uid": "p2p-act-provide-clarification", "name": "Provide Clarification", "type": "NORMAL", "ai_confidence_threshold": 0.5}, {"uid": "p2p-act-approve-payment", "name": "Approve Payment", "type": "NORMAL", "ai_confidence_threshold": 0.5}, {"uid": "p2p-act-reject-payment", "name": "Reject Payment", "type": "NORMAL", "ai_confidence_threshold": 0.5}, {"uid": "p2p-act-hold-payment", "name": "Hold Payment", "type": "NORMAL", "ai_confidence_threshold": 0.5}], "stage_gates": [], "transitions": [{"to_state_id": "p2p-state-invoice-submitted", "from_state_id": "", "by_activity_id": "p2p-act-submit-invoice", "transition_type": "INIT_TO_STATE"}, {"to_state_id": "p2p-state-awaiting-clarification", "from_state_id": "p2p-state-invoice-submitted", "by_activity_id": "p2p-act-request-clarification", "transition_type": "TO_STATE"}, {"to_state_id": "p2p-state-finance-review", "from_state_id": "p2p-state-invoice-submitted", "by_activity_id": "p2p-act-submit-recommendation", "transition_type": "TO_STATE"}, {"to_state_id": "p2p-state-awaiting-clarification", "from_state_id": "p2p-state-ai-analysis", "by_activity_id": "p2p-act-request-clarification", "transition_type": "TO_STATE"}, {"to_state_id": "p2p-state-finance-review", "from_state_id": "p2p-state-ai-analysis", "by_activity_id": "p2p-act-submit-recommendation", "transition_type": "TO_STATE"}, {"to_state_id": "p2p-state-ai-analysis", "from_state_id": "p2p-state-awaiting-clarification", "by_activity_id": "p2p-act-provide-clarification", "transition_type": "TO_STATE"}, {"to_state_id": "p2p-state-approved", "from_state_id": "p2p-state-finance-review", "by_activity_id": "p2p-act-approve-payment", "transition_type": "TO_STATE"}, {"to_state_id": "p2p-state-rejected", "from_state_id": "p2p-state-finance-review", "by_activity_id": "p2p-act-reject-payment", "transition_type": "TO_STATE"}, {"to_state_id": "p2p-state-on-hold", "from_state_id": "p2p-state-finance-review", "by_activity_id": "p2p-act-hold-payment", "transition_type": "TO_STATE"}], "workflow_id": "wf_p2p_invoice_demo", "activity_prefills": [], "activity_triggers": [{"nodes": [{"id": "a0a0a0a0-0000-4000-8000-000000093011", "name": "Start", "type": "start", "edges": [{"target": "a0a0a0a0-0000-4000-8000-000000093012", "source_handle": "output"}], "config": {}, "ui_config": null}, {"id": "a0a0a0a0-0000-4000-8000-000000093012", "name": "AI Employee", "type": "aiEmployee", "edges": [{"target": "a0a0a0a0-0000-4000-8000-000000093013", "source_handle": "output"}], "config": {"ai_user_id": "29100"}, "ui_config": null}, {"id": "a0a0a0a0-0000-4000-8000-000000093013", "name": "Complete", "type": "response", "edges": [], "config": {"message": "AI Employee task dispatched", "success": true, "status_code": 200}, "ui_config": null}], "trigger_uid": "trigger_p2p_submit", "activity_uid": "p2p-act-submit-invoice", "trigger_config": {}}, {"nodes": [{"id": "a0a0a0a0-0000-4000-8000-000000093041", "name": "Start", "type": "start", "edges": [{"target": "a0a0a0a0-0000-4000-8000-000000093042", "source_handle": "output"}], "config": {}, "ui_config": null}, {"id": "a0a0a0a0-0000-4000-8000-000000093042", "name": "AI Employee", "type": "aiEmployee", "edges": [{"target": "a0a0a0a0-0000-4000-8000-000000093043", "source_handle": "output"}], "config": {"ai_user_id": "29100"}, "ui_config": null}, {"id": "a0a0a0a0-0000-4000-8000-000000093043", "name": "Complete", "type": "response", "edges": [], "config": {"message": "AI Employee task dispatched", "success": true, "status_code": 200}, "ui_config": null}], "trigger_uid": "trigger_p2p_clarify", "activity_uid": "p2p-act-provide-clarification", "trigger_config": {}}], "activity_data_fields": [{"data_fields": [{"id": "vendor_id", "uid": "p2p-field-9401", "name": "Vendor ID", "type": "local", "data_type": "text", "mandatory": true}, {"id": "vendor_name", "uid": "p2p-field-9402", "name": "Vendor Name", "type": "local", "data_type": "text", "mandatory": true}, {"id": "invoice_number", "uid": "p2p-field-9403", "name": "Invoice Number", "type": "local", "data_type": "text", "mandatory": true}, {"id": "invoice_date", "uid": "p2p-field-9404", "name": "Invoice Date", "type": "local", "data_type": "date", "mandatory": true}, {"id": "po_number", "uid": "p2p-field-9405", "name": "PO Number", "type": "local", "data_type": "text", "mandatory": true}, {"id": "currency", "uid": "p2p-field-9406", "name": "Currency", "type": "local", "data_type": "text", "mandatory": false}, {"id": "total_amount", "uid": "p2p-field-9407", "name": "Total Amount", "type": "local", "data_type": "number", "mandatory": true}, {"id": "tax_amount", "uid": "p2p-field-9408", "name": "Tax Amount", "type": "local", "data_type": "number", "mandatory": false}, {"id": "payment_terms", "uid": "p2p-field-9409", "name": "Payment Terms", "type": "local", "data_type": "text", "mandatory": false}, {"id": "notes", "uid": "p2p-field-9410", "name": "Notes", "type": "local", "data_type": "text", "mandatory": false}], "activity_uid": "p2p-act-submit-invoice", "activity_name": "Submit Invoice"}, {"data_fields": [{"id": "target_department", "uid": "p2p-field-9411", "name": "Target Department", "type": "local", "data_type": "text", "mandatory": true}, {"id": "clarification_question", "uid": "p2p-field-9412", "name": "Question", "type": "local", "data_type": "text", "mandatory": true}, {"id": "clarification_context", "uid": "p2p-field-9413", "name": "Context", "type": "local", "data_type": "text", "mandatory": false}, {"id": "analysis_so_far", "uid": "p2p-field-9414", "name": "Analysis So Far", "type": "local", "data_type": "text", "mandatory": false}], "activity_uid": "p2p-act-request-clarification", "activity_name": "Request Clarification"}, {"data_fields": [{"id": "response_text", "uid": "p2p-field-9415", "name": "Response", "type": "local", "data_type": "text", "mandatory": true}, {"id": "confirmed_quantity", "uid": "p2p-field-9416", "name": "Confirmed Quantity", "type": "local", "data_type": "number", "mandatory": false}, {"id": "response_notes", "uid": "p2p-field-9417", "name": "Additional Notes", "type": "local", "data_type": "text", "mandatory": false}], "activity_uid": "p2p-act-provide-clarification", "activity_name": "Provide Clarification"}, {"data_fields": [{"id": "recommendation", "uid": "p2p-field-9418", "name": "Recommendation", "type": "local", "data_type": "text", "mandatory": true}, {"id": "recommended_amount", "uid": "p2p-field-9419", "name": "Recommended Payment Amount", "type": "local", "data_type": "number", "mandatory": false}, {"id": "match_summary", "uid": "p2p-field-9420", "name": "Match Summary", "type": "local", "data_type": "text", "mandatory": false}, {"id": "ai_reasoning", "uid": "p2p-field-9421", "name": "AI Reasoning", "type": "local", "data_type": "text", "mandatory": false}, {"id": "ai_confidence", "uid": "p2p-field-9422", "name": "AI Confidence", "type": "local", "data_type": "number", "mandatory": false}], "activity_uid": "p2p-act-submit-recommendation", "activity_name": "Submit Recommendation"}, {"data_fields": [{"id": "approved_amount", "uid": "p2p-field-9423", "name": "Approved Amount", "type": "local", "data_type": "number", "mandatory": true}, {"id": "reviewer_notes", "uid": "p2p-field-9424", "name": "Reviewer Notes", "type": "local", "data_type": "text", "mandatory": false}], "activity_uid": "p2p-act-approve-payment", "activity_name": "Approve Payment"}, {"data_fields": [{"id": "rejection_reason", "uid": "p2p-field-9425", "name": "Rejection Reason", "type": "local", "data_type": "text", "mandatory": true}, {"id": "reviewer_notes", "uid": "p2p-field-9426", "name": "Reviewer Notes", "type": "local", "data_type": "text", "mandatory": false}], "activity_uid": "p2p-act-reject-payment", "activity_name": "Reject Payment"}, {"data_fields": [{"id": "hold_reason", "uid": "p2p-field-9427", "name": "Hold Reason", "type": "local", "data_type": "text", "mandatory": true}, {"id": "reviewer_notes", "uid": "p2p-field-9428", "name": "Reviewer Notes", "type": "local", "data_type": "text", "mandatory": false}], "activity_uid": "p2p-act-hold-payment", "activity_name": "Hold Payment"}], "activity_permissions": [], "workflow_data_fields": null}'::jsonb) ON CONFLICT (id) DO UPDATE SET content = EXCLUDED.content; + +-- Record views +INSERT INTO tbl_appconfig_recordview (id, rv_uid, rv_description, workflow_uid, app_id, config) VALUES (20034, 'p2p-rv-all-invoices', 'All invoice instances across all states', 'wf_p2p_invoice_demo', 20, '{"fields": [{"type": "system-global", "data_type": "text", "field_key": "instance_id", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Instance ID"}, {"type": "system-global", "data_type": "text", "field_key": "current_state_name", "field_uid": "", "is_filter": true, "is_search": false, "activity_id": "SYSTEM", "output_label": "Current State"}, {"type": "local", "data_type": "text", "field_key": "vendor_name", "field_uid": "p2p-field-9401", "is_filter": true, "is_search": true, "activity_id": "p2p-act-submit-invoice", "output_label": "Vendor"}, {"type": "local", "data_type": "text", "field_key": "invoice_number", "field_uid": "p2p-field-9403", "is_filter": false, "is_search": true, "activity_id": "p2p-act-submit-invoice", "output_label": "Invoice #"}, {"type": "local", "data_type": "text", "field_key": "po_number", "field_uid": "p2p-field-9405", "is_filter": false, "is_search": true, "activity_id": "p2p-act-submit-invoice", "output_label": "PO #"}, {"type": "local", "data_type": "number", "field_key": "total_amount", "field_uid": "p2p-field-9407", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Amount"}, {"type": "system-global", "data_type": "datetime", "field_key": "created_at", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Created"}]}'::jsonb) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_recordview (id, rv_uid, rv_description, workflow_uid, app_id, config) VALUES (20035, 'p2p-rv-pending-clarifications', 'Invoices awaiting department clarification', 'wf_p2p_invoice_demo', 20, '{"fields": [{"type": "system-global", "data_type": "text", "field_key": "instance_id", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Instance ID"}, {"type": "local", "data_type": "text", "field_key": "vendor_name", "field_uid": "p2p-field-9402", "is_filter": false, "is_search": true, "activity_id": "p2p-act-submit-invoice", "output_label": "Vendor"}, {"type": "local", "data_type": "text", "field_key": "invoice_number", "field_uid": "p2p-field-9403", "is_filter": false, "is_search": true, "activity_id": "p2p-act-submit-invoice", "output_label": "Invoice #"}, {"type": "local", "data_type": "number", "field_key": "total_amount", "field_uid": "p2p-field-9407", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Amount"}, {"type": "local", "data_type": "text", "field_key": "target_department", "field_uid": "p2p-field-9411", "is_filter": true, "is_search": false, "activity_id": "p2p-act-request-clarification", "output_label": "Department"}, {"type": "system-global", "data_type": "datetime", "field_key": "created_at", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Created"}], "prefilters": {"logic": "AND", "conditions": [{"value": "Awaiting Clarification", "operator": "equals", "data_type": "text", "field_key": "current_state_name"}]}}'::jsonb) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_recordview (id, rv_uid, rv_description, workflow_uid, app_id, config) VALUES (20037, 'p2p-rv-vendor-invoices', 'Vendor''s submitted invoices with status tracking', 'wf_p2p_invoice_demo', 20, '{"fields": [{"type": "system-global", "data_type": "text", "field_key": "instance_id", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Instance ID"}, {"type": "system-global", "data_type": "text", "field_key": "current_state_name", "field_uid": "", "is_filter": true, "is_search": false, "activity_id": "SYSTEM", "output_label": "Status"}, {"type": "local", "data_type": "text", "field_key": "invoice_number", "field_uid": "p2p-field-9403", "is_filter": false, "is_search": true, "activity_id": "p2p-act-submit-invoice", "output_label": "Invoice #"}, {"type": "local", "data_type": "text", "field_key": "po_number", "field_uid": "p2p-field-9405", "is_filter": false, "is_search": true, "activity_id": "p2p-act-submit-invoice", "output_label": "PO #"}, {"type": "local", "data_type": "number", "field_key": "total_amount", "field_uid": "p2p-field-9407", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Amount"}, {"type": "system-global", "data_type": "datetime", "field_key": "created_at", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Submitted"}]}'::jsonb) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_recordview (id, rv_uid, rv_description, workflow_uid, app_id, config) VALUES (20036, 'p2p-rv-finance-review-queue', 'Invoices ready for finance review with AI recommendations', 'wf_p2p_invoice_demo', 20, '{"fields": [{"type": "local", "data_type": "number", "field_key": "recommended_amount", "field_uid": "p2p-field-9419", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-recommendation", "output_label": "Recommended Amt"}, {"type": "system-global", "data_type": "datetime", "field_key": "created_at", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Created"}, {"type": "system-global", "data_type": "text", "field_key": "instance_id", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Instance ID"}, {"type": "local", "data_type": "text", "field_key": "vendor_name", "field_uid": "p2p-field-9402", "is_filter": false, "is_search": true, "activity_id": "p2p-act-submit-invoice", "output_label": "Vendor"}, {"type": "local", "data_type": "text", "field_key": "invoice_number", "field_uid": "p2p-field-9403", "is_filter": false, "is_search": true, "activity_id": "p2p-act-submit-invoice", "output_label": "Invoice #"}, {"type": "local", "data_type": "number", "field_key": "total_amount", "field_uid": "p2p-field-9407", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Amount"}, {"type": "local", "data_type": "text", "field_key": "recommendation", "field_uid": "p2p-field-9418", "is_filter": true, "is_search": false, "activity_id": "p2p-act-submit-recommendation", "output_label": "AI Recommendation"}], "prefilters": {"logic": "AND", "conditions": [{"value": "Finance Review", "operator": "equals", "data_type": "text", "field_key": "current_state_name"}]}}'::jsonb) ON CONFLICT (id) DO NOTHING; + +-- Detail views +INSERT INTO tbl_appconfig_detailview (id, dv_uid, dv_description, workflow_uid, app_id, config) VALUES (20014, 'p2p-dv-clarification-detail', 'AI question and context for department response', 'wf_p2p_invoice_demo', 20, '{"fields": [{"type": "system-global", "data_type": "text", "field_key": "instance_id", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Instance ID"}, {"type": "local", "data_type": "text", "field_key": "vendor_name", "field_uid": "p2p-field-9402", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Vendor"}, {"type": "local", "data_type": "text", "field_key": "invoice_number", "field_uid": "p2p-field-9403", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Invoice #"}, {"type": "local", "data_type": "text", "field_key": "po_number", "field_uid": "p2p-field-9405", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "PO #"}, {"type": "local", "data_type": "number", "field_key": "total_amount", "field_uid": "p2p-field-9407", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Amount"}, {"type": "local", "data_type": "text", "field_key": "target_department", "field_uid": "p2p-field-9411", "is_filter": false, "is_search": false, "activity_id": "p2p-act-request-clarification", "output_label": "Target Department"}, {"type": "local", "data_type": "text", "field_key": "clarification_question", "field_uid": "p2p-field-9412", "is_filter": false, "is_search": false, "activity_id": "p2p-act-request-clarification", "output_label": "AI Question"}, {"type": "local", "data_type": "text", "field_key": "clarification_context", "field_uid": "p2p-field-9413", "is_filter": false, "is_search": false, "activity_id": "p2p-act-request-clarification", "output_label": "Context"}, {"type": "local", "data_type": "text", "field_key": "analysis_so_far", "field_uid": "p2p-field-9414", "is_filter": false, "is_search": false, "activity_id": "p2p-act-request-clarification", "output_label": "Analysis So Far"}]}'::jsonb) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_detailview (id, dv_uid, dv_description, workflow_uid, app_id, config) VALUES (20015, 'p2p-dv-finance-review-detail', 'AI recommendation with full decision trail for finance reviewer', 'wf_p2p_invoice_demo', 20, '{"fields": [{"type": "system-global", "data_type": "text", "field_key": "instance_id", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Instance ID"}, {"type": "system-global", "data_type": "text", "field_key": "current_state_name", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Status"}, {"type": "local", "data_type": "text", "field_key": "vendor_name", "field_uid": "p2p-field-9402", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Vendor"}, {"type": "local", "data_type": "text", "field_key": "invoice_number", "field_uid": "p2p-field-9403", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Invoice #"}, {"type": "local", "data_type": "text", "field_key": "po_number", "field_uid": "p2p-field-9405", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "PO #"}, {"type": "local", "data_type": "number", "field_key": "total_amount", "field_uid": "p2p-field-9407", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Invoice Amount"}, {"type": "local", "data_type": "number", "field_key": "tax_amount", "field_uid": "p2p-field-9408", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Tax"}, {"type": "local", "data_type": "text", "field_key": "recommendation", "field_uid": "p2p-field-9418", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-recommendation", "output_label": "AI Recommendation"}, {"type": "local", "data_type": "number", "field_key": "recommended_amount", "field_uid": "p2p-field-9419", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-recommendation", "output_label": "Recommended Amount"}, {"type": "local", "data_type": "text", "field_key": "match_summary", "field_uid": "p2p-field-9420", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-recommendation", "output_label": "Match Summary"}, {"type": "local", "data_type": "text", "field_key": "ai_reasoning", "field_uid": "p2p-field-9421", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-recommendation", "output_label": "AI Reasoning"}, {"type": "local", "data_type": "number", "field_key": "ai_confidence", "field_uid": "p2p-field-9422", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-recommendation", "output_label": "AI Confidence"}]}'::jsonb) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_detailview (id, dv_uid, dv_description, workflow_uid, app_id, config) VALUES (20013, 'p2p-dv-invoice-detail', 'Full invoice detail with AI analysis trail', 'wf_p2p_invoice_demo', 20, '{"fields": [{"type": "system-global", "data_type": "text", "field_key": "instance_id", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Instance ID"}, {"type": "system-global", "data_type": "text", "field_key": "current_state_name", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Status"}, {"type": "system-global", "data_type": "datetime", "field_key": "created_at", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Created"}, {"type": "local", "data_type": "text", "field_key": "vendor_id", "field_uid": "p2p-field-9401", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Vendor ID"}, {"type": "local", "data_type": "text", "field_key": "vendor_name", "field_uid": "p2p-field-9402", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Vendor Name"}, {"type": "local", "data_type": "text", "field_key": "invoice_number", "field_uid": "p2p-field-9403", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Invoice Number"}, {"type": "local", "data_type": "date", "field_key": "invoice_date", "field_uid": "p2p-field-9404", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Invoice Date"}, {"type": "local", "data_type": "text", "field_key": "po_number", "field_uid": "p2p-field-9405", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "PO Number"}, {"type": "local", "data_type": "number", "field_key": "total_amount", "field_uid": "p2p-field-9407", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Total Amount"}, {"type": "local", "data_type": "number", "field_key": "tax_amount", "field_uid": "p2p-field-9408", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Tax Amount"}, {"type": "local", "data_type": "text", "field_key": "payment_terms", "field_uid": "p2p-field-9409", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Payment Terms"}, {"type": "local", "data_type": "text", "field_key": "notes", "field_uid": "p2p-field-9410", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Vendor Notes"}]}'::jsonb) ON CONFLICT (id) DO NOTHING; + +-- Screens +INSERT INTO tbl_appconfig_screens (id, source_screen_id, app_id, screen_name, device, description, layout, permissions) VALUES (20010, 29631, 20, 'P2P - My Invoices', 'desktop', 'P2P - My Invoices', '[{"type": "element", "style": {"marginBottom": "16px"}, "config": {"icon": "add", "name": "+ Submit New Invoice", "type": "button", "params": {"workflow_id": "wf_p2p_invoice_demo", "activity_id_init": "p2p-act-submit-invoice"}, "action_end": [{"type": "refresh_page"}], "job_template": "start_state_machine"}, "classes": ["z-btn-primary"]}, {"type": "element", "style": {"width": "100%"}, "config": {"type": "recordsview", "view_id": "29601"}}]'::jsonb, NULL) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_screens (id, source_screen_id, app_id, screen_name, device, description, layout, permissions) VALUES (20011, 29632, 20, 'P2P - Pending Clarifications', 'desktop', 'P2P - Pending Clarifications', '[{"type": "element", "style": {"width": "100%"}, "config": {"type": "recordsview", "view_id": "29602"}}]'::jsonb, NULL) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_screens (id, source_screen_id, app_id, screen_name, device, description, layout, permissions) VALUES (20013, 29634, 20, 'P2P - All Invoices', 'desktop', 'P2P - All Invoices', '[{"type": "element", "style": {"width": "100%"}, "config": {"type": "recordsview", "view_id": "29604"}}]'::jsonb, NULL) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_screens (id, source_screen_id, app_id, screen_name, device, description, layout, permissions) VALUES (20025, 29641, 20, 'P2P - Invoice Detail', 'desktop', 'P2P - Invoice Detail', '[{"type": "element", "style": {"width": "100%", "padding": "16px"}, "config": {"type": "detailsview", "view_id": "29611"}}]'::jsonb, NULL) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_screens (id, source_screen_id, app_id, screen_name, device, description, layout, permissions) VALUES (20026, 29642, 20, 'P2P - Clarification Detail', 'desktop', 'P2P - Clarification Detail', '[{"type": "element", "style": {"width": "100%", "padding": "16px"}, "config": {"type": "detailsview", "view_id": "29612"}}]'::jsonb, NULL) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_screens (id, source_screen_id, app_id, screen_name, device, description, layout, permissions) VALUES (20027, 29643, 20, 'P2P - Finance Review Detail', 'desktop', 'P2P - Finance Review Detail', '[{"type": "element", "style": {"width": "100%", "padding": "16px"}, "config": {"type": "detailsview", "view_id": "29613"}}]'::jsonb, NULL) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_screens (id, source_screen_id, app_id, screen_name, device, description, layout, permissions) VALUES (20012, 29633, 20, 'P2P - Finance Review', 'desktop', 'P2P - Finance Review', '[{"type": "element", "style": {"width": "100%"}, "config": {"type": "recordsview", "view_id": "29603"}}]'::jsonb, NULL) ON CONFLICT (id) DO NOTHING; + +-- RV Screens +INSERT INTO tbl_appconfig_rv_screens (id, source_screen_id, app_id, screen_name, device, description, layout, rv_template_id) VALUES (20001, 29601, 20, 'Vendor - My Invoices', 'desktop', 'Vendor - My Invoices', '[{"type": "element", "style": {}, "config": {"type": "rv_table", "columns": [{"id": "current_state_name", "display": "Status", "key_name": "current_state_name", "data_type": "text"}, {"id": "invoice_number", "display": "Invoice #", "key_name": "invoice_number", "data_type": "text"}, {"id": "po_number", "display": "PO #", "key_name": "po_number", "data_type": "text"}, {"id": "total_amount", "display": "Amount", "key_name": "total_amount", "data_type": "number"}, {"id": "created_at", "display": "Submitted", "key_name": "created_at", "data_type": "datetime"}], "view_id": "29601", "on_row_click": {"screen_id": "29641", "job_template": "navigate_to_screen"}}}]'::jsonb, 29504) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_rv_screens (id, source_screen_id, app_id, screen_name, device, description, layout, rv_template_id) VALUES (20003, 29603, 20, 'Finance - Review Queue', 'desktop', 'Finance - Review Queue', '[{"type": "element", "style": {}, "config": {"type": "rv_table", "columns": [{"id": "vendor_name", "display": "Vendor", "key_name": "vendor_name", "data_type": "text"}, {"id": "invoice_number", "display": "Invoice #", "key_name": "invoice_number", "data_type": "text"}, {"id": "total_amount", "display": "Amount", "key_name": "total_amount", "data_type": "number"}, {"id": "recommendation", "display": "AI Recommendation", "key_name": "recommendation", "data_type": "text"}, {"id": "recommended_amount", "display": "Recommended Amt", "key_name": "recommended_amount", "data_type": "number"}, {"id": "created_at", "display": "Created", "key_name": "created_at", "data_type": "datetime"}], "view_id": "29603", "on_row_click": {"screen_id": "29643", "job_template": "navigate_to_screen"}}}]'::jsonb, 29503) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_rv_screens (id, source_screen_id, app_id, screen_name, device, description, layout, rv_template_id) VALUES (20004, 29604, 20, 'Admin - All Invoices', 'desktop', 'Admin - All Invoices', '[{"type": "element", "style": {}, "config": {"type": "rv_table", "columns": [{"id": "current_state_name", "display": "Status", "key_name": "current_state_name", "data_type": "text"}, {"id": "vendor_name", "display": "Vendor", "key_name": "vendor_name", "data_type": "text"}, {"id": "invoice_number", "display": "Invoice #", "key_name": "invoice_number", "data_type": "text"}, {"id": "po_number", "display": "PO #", "key_name": "po_number", "data_type": "text"}, {"id": "total_amount", "display": "Amount", "key_name": "total_amount", "data_type": "number"}, {"id": "created_at", "display": "Created", "key_name": "created_at", "data_type": "datetime"}], "view_id": "29604", "on_row_click": {"screen_id": "29641", "job_template": "navigate_to_screen"}}}]'::jsonb, 29501) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_rv_screens (id, source_screen_id, app_id, screen_name, device, description, layout, rv_template_id) VALUES (20002, 29602, 20, 'Department - Pending Clarifications', 'desktop', 'Department - Pending Clarifications', '[{"type": "element", "style": {}, "config": {"type": "rv_table", "columns": [{"id": "vendor_name", "display": "Vendor", "key_name": "vendor_name", "data_type": "text"}, {"id": "invoice_number", "display": "Invoice #", "key_name": "invoice_number", "data_type": "text"}, {"id": "total_amount", "display": "Amount", "key_name": "total_amount", "data_type": "number"}, {"id": "target_department", "display": "Department", "key_name": "target_department", "data_type": "text"}, {"id": "created_at", "display": "Created", "key_name": "created_at", "data_type": "datetime"}], "view_id": "29602", "on_row_click": {"screen_id": "29642", "job_template": "navigate_to_screen"}}}]'::jsonb, 29502) ON CONFLICT (id) DO NOTHING; + +-- DV Screens +INSERT INTO tbl_appconfig_dv_screens (id, source_screen_id, app_id, screen_name, device, description, layout, dv_template_id) VALUES (20005, 29612, 20, 'Clarification Detail View', 'desktop', 'Clarification Detail View', '[{"type": "element", "style": {"fontSize": "16px", "marginTop": "20px", "fontWeight": "700", "borderBottom": "1px solid #e2e8f0", "marginBottom": "8px", "paddingBottom": "6px"}, "config": {"name": "Invoice Summary", "type": "label"}, "classes": []}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Vendor", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Vendor", "keyName": "vendor_name"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Invoice Number", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Invoice #", "keyName": "invoice_number"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "PO Number", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "PO #", "keyName": "po_number"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Amount", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Amount", "keyName": "total_amount"}}}, {"type": "element", "style": {"fontSize": "16px", "marginTop": "20px", "fontWeight": "700", "borderBottom": "1px solid #e2e8f0", "marginBottom": "8px", "paddingBottom": "6px"}, "config": {"name": "AI Clarification Request", "type": "label"}, "classes": []}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Target Department", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Department", "keyName": "target_department"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Question from AI", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Question", "keyName": "clarification_question"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Context", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Context", "keyName": "clarification_context"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Analysis So Far", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Analysis", "keyName": "analysis_so_far"}}}, {"type": "element", "style": {"marginTop": "20px"}, "config": {"icon": "reply", "name": "Respond to Clarification", "type": "button", "params": {"activity_id": "p2p-act-provide-clarification", "workflow_id": "wf_p2p_invoice_demo"}, "action_end": [{"type": "refresh_page"}], "job_template": "perform_activity"}, "classes": ["z-btn-primary"]}]'::jsonb, 29512) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_dv_screens (id, source_screen_id, app_id, screen_name, device, description, layout, dv_template_id) VALUES (20004, 29611, 20, 'Invoice Detail View', 'desktop', 'Invoice Detail View', '[{"type": "element", "style": {"fontSize": "16px", "marginTop": "20px", "fontWeight": "700", "borderBottom": "1px solid #e2e8f0", "marginBottom": "8px", "paddingBottom": "6px"}, "config": {"name": "Invoice Details", "type": "label"}, "classes": []}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Status", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Status", "keyName": "current_state_name"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Vendor", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Vendor", "keyName": "vendor_name"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Invoice Number", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Invoice #", "keyName": "invoice_number"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Invoice Date", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Date", "keyName": "invoice_date"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "PO Number", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "PO #", "keyName": "po_number"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Total Amount", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Amount", "keyName": "total_amount"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Tax Amount", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Tax", "keyName": "tax_amount"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Payment Terms", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Terms", "keyName": "payment_terms"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Vendor Notes", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Notes", "keyName": "notes"}}}]'::jsonb, 29511) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_dv_screens (id, source_screen_id, app_id, screen_name, device, description, layout, dv_template_id) VALUES (20006, 29613, 20, 'Finance Review Detail View', 'desktop', 'Finance Review Detail View', '[{"type": "element", "style": {"fontSize": "16px", "marginTop": "20px", "fontWeight": "700", "borderBottom": "1px solid #e2e8f0", "marginBottom": "8px", "paddingBottom": "6px"}, "config": {"name": "Invoice Details", "type": "label"}, "classes": []}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Status", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Status", "keyName": "current_state_name"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Vendor", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Vendor", "keyName": "vendor_name"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Invoice Number", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Invoice #", "keyName": "invoice_number"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "PO Number", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "PO #", "keyName": "po_number"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Invoice Amount", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Amount", "keyName": "total_amount"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Tax", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Tax", "keyName": "tax_amount"}}}, {"type": "element", "style": {"fontSize": "16px", "marginTop": "20px", "fontWeight": "700", "borderBottom": "1px solid #e2e8f0", "marginBottom": "8px", "paddingBottom": "6px"}, "config": {"name": "AI Recommendation", "type": "label"}, "classes": []}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Recommendation", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Recommendation", "keyName": "recommendation"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Recommended Amount", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Amount", "keyName": "recommended_amount"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Match Summary", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Match Summary", "keyName": "match_summary"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "AI Reasoning", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Reasoning", "keyName": "ai_reasoning"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "AI Confidence", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Confidence", "keyName": "ai_confidence"}}}, {"type": "element", "style": {"display": "inline-block", "marginTop": "20px", "marginRight": "8px"}, "config": {"icon": "check_circle", "name": "Approve Payment", "type": "button", "params": {"activity_id": "p2p-act-approve-payment", "workflow_id": "wf_p2p_invoice_demo"}, "action_end": [{"type": "refresh_page"}], "job_template": "perform_activity"}, "classes": ["z-btn-primary"]}, {"type": "element", "style": {"display": "inline-block", "marginTop": "20px", "marginRight": "8px"}, "config": {"icon": "cancel", "name": "Reject Payment", "type": "button", "params": {"activity_id": "p2p-act-reject-payment", "workflow_id": "wf_p2p_invoice_demo"}, "action_end": [{"type": "refresh_page"}], "job_template": "perform_activity"}, "classes": ["z-btn-outline"]}, {"type": "element", "style": {"display": "inline-block", "marginTop": "20px"}, "config": {"icon": "pause_circle", "name": "Hold Payment", "type": "button", "params": {"activity_id": "p2p-act-hold-payment", "workflow_id": "wf_p2p_invoice_demo"}, "action_end": [{"type": "refresh_page"}], "job_template": "perform_activity"}, "classes": ["z-btn-outline"]}]'::jsonb, 29513) ON CONFLICT (id) DO NOTHING; + +-- Form Screens +INSERT INTO tbl_appconfig_form_screens (id, source_form_id, activity_uid, device_type, layout, grid_config, app_id) VALUES (20136, 20094, 'p2p-act-submit-invoice', 'desktop', '[]'::jsonb, '[{"h": 1, "i": "p2p-field-9401", "w": 6, "x": 0, "y": 0}, {"h": 1, "i": "p2p-field-9402", "w": 6, "x": 6, "y": 0}, {"h": 1, "i": "p2p-field-9403", "w": 6, "x": 0, "y": 1}, {"h": 1, "i": "p2p-field-9404", "w": 6, "x": 6, "y": 1}, {"h": 1, "i": "p2p-field-9405", "w": 6, "x": 0, "y": 2}, {"h": 1, "i": "p2p-field-9406", "w": 6, "x": 6, "y": 2}, {"h": 1, "i": "p2p-field-9407", "w": 6, "x": 0, "y": 3}, {"h": 1, "i": "p2p-field-9408", "w": 6, "x": 6, "y": 3}, {"h": 1, "i": "p2p-field-9409", "w": 6, "x": 0, "y": 4}, {"h": 1, "i": "p2p-field-9410", "w": 6, "x": 6, "y": 4}]'::jsonb, 20) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_form_screens (id, source_form_id, activity_uid, device_type, layout, grid_config, app_id) VALUES (20137, 20095, 'p2p-act-provide-clarification', 'desktop', '[]'::jsonb, '[{"h": 1, "i": "p2p-field-9415", "w": 12, "x": 0, "y": 0}, {"h": 1, "i": "p2p-field-9416", "w": 12, "x": 0, "y": 1}, {"h": 1, "i": "p2p-field-9417", "w": 12, "x": 0, "y": 2}]'::jsonb, 20) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_form_screens (id, source_form_id, activity_uid, device_type, layout, grid_config, app_id) VALUES (20138, 20096, 'p2p-act-approve-payment', 'desktop', '[]'::jsonb, '[{"h": 1, "i": "p2p-field-9423", "w": 6, "x": 0, "y": 0}, {"h": 1, "i": "p2p-field-9424", "w": 6, "x": 6, "y": 0}]'::jsonb, 20) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_form_screens (id, source_form_id, activity_uid, device_type, layout, grid_config, app_id) VALUES (20139, 20097, 'p2p-act-reject-payment', 'desktop', '[]'::jsonb, '[{"h": 1, "i": "p2p-field-9425", "w": 12, "x": 0, "y": 0}, {"h": 1, "i": "p2p-field-9426", "w": 12, "x": 0, "y": 1}]'::jsonb, 20) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_form_screens (id, source_form_id, activity_uid, device_type, layout, grid_config, app_id) VALUES (20140, 20098, 'p2p-act-hold-payment', 'desktop', '[]'::jsonb, '[{"h": 1, "i": "p2p-field-9427", "w": 12, "x": 0, "y": 0}, {"h": 1, "i": "p2p-field-9428", "w": 12, "x": 0, "y": 1}]'::jsonb, 20) ON CONFLICT (id) DO NOTHING; + +-- Header Config +INSERT INTO tbl_appconfig_header_config (id, app_id, device_type, config) VALUES (20001, 20, 'desktop', '{"slots": {"left": ["logo", "nav"], "right": ["profile"], "center": []}, "layout": {"type": "classic", "height": "56px", "position": "sticky", "full_width": true}, "components": {"nav": {"items": [{"id": "nav_vendor", "icon": "receipt_long", "type": "screen", "label": "My Invoices", "screen_id": 29631}, {"id": "nav_clarifications", "icon": "help_outline", "type": "screen", "label": "Pending Clarifications", "screen_id": 29632}, {"id": "nav_finance", "icon": "account_balance", "type": "screen", "label": "Finance Review", "screen_id": 29633}, {"id": "nav_all", "icon": "list_alt", "type": "screen", "label": "All Invoices", "screen_id": 29634}]}, "logo": {"text": "P2P Invoice System", "display_type": "text"}, "profile": {"shape": "circle", "show_name": true}}}'::jsonb) ON CONFLICT (id) DO NOTHING; + +-- 3. Workflow design +INSERT INTO workflow.tbl_workflows (id, uid, app_id, name, description) VALUES (29100, 'wf_p2p_invoice_demo', 20, 'P2P Invoice Validation', 'AI-powered invoice validation with department clarification and finance approval') ON CONFLICT (id) DO NOTHING; + +-- Workflow versions + + +-- States +INSERT INTO workflow.tbl_wf_states (id, uid, version_id, name, description, type) VALUES (29203, 'p2p-state-awaiting-clarification', 29100, 'Awaiting Clarification', '', 'STANDARD') ON CONFLICT (id) DO NOTHING; +INSERT INTO workflow.tbl_wf_states (id, uid, version_id, name, description, type) VALUES (20057, 'p2p-state-invoice-submitted', 29100, 'Invoice Submitted', '', 'STANDARD') ON CONFLICT (id) DO NOTHING; +INSERT INTO workflow.tbl_wf_states (id, uid, version_id, name, description, type) VALUES (20058, 'p2p-state-ai-analysis', 29100, 'AI Analysis', '', 'STANDARD') ON CONFLICT (id) DO NOTHING; +INSERT INTO workflow.tbl_wf_states (id, uid, version_id, name, description, type) VALUES (20059, 'p2p-state-finance-review', 29100, 'Finance Review', '', 'STANDARD') ON CONFLICT (id) DO NOTHING; +INSERT INTO workflow.tbl_wf_states (id, uid, version_id, name, description, type) VALUES (20060, 'p2p-state-approved', 29100, 'Approved', '', 'END') ON CONFLICT (id) DO NOTHING; +INSERT INTO workflow.tbl_wf_states (id, uid, version_id, name, description, type) VALUES (20061, 'p2p-state-rejected', 29100, 'Rejected', '', 'END') ON CONFLICT (id) DO NOTHING; +INSERT INTO workflow.tbl_wf_states (id, uid, version_id, name, description, type) VALUES (20062, 'p2p-state-on-hold', 29100, 'On Hold', '', 'END') ON CONFLICT (id) DO NOTHING; + +-- Activities +INSERT INTO workflow.tbl_wf_activities (id, activity_uid, workflow_version_id, name, type) VALUES (20070, 'p2p-act-submit-invoice', 29100, 'Submit Invoice', 'INIT') ON CONFLICT (id) DO NOTHING; +INSERT INTO workflow.tbl_wf_activities (id, activity_uid, workflow_version_id, name, type) VALUES (20071, 'p2p-act-request-clarification', 29100, 'Request Clarification', 'NORMAL') ON CONFLICT (id) DO NOTHING; +INSERT INTO workflow.tbl_wf_activities (id, activity_uid, workflow_version_id, name, type) VALUES (20072, 'p2p-act-submit-recommendation', 29100, 'Submit Recommendation', 'NORMAL') ON CONFLICT (id) DO NOTHING; +INSERT INTO workflow.tbl_wf_activities (id, activity_uid, workflow_version_id, name, type) VALUES (20073, 'p2p-act-provide-clarification', 29100, 'Provide Clarification', 'NORMAL') ON CONFLICT (id) DO NOTHING; +INSERT INTO workflow.tbl_wf_activities (id, activity_uid, workflow_version_id, name, type) VALUES (20074, 'p2p-act-approve-payment', 29100, 'Approve Payment', 'NORMAL') ON CONFLICT (id) DO NOTHING; +INSERT INTO workflow.tbl_wf_activities (id, activity_uid, workflow_version_id, name, type) VALUES (20075, 'p2p-act-reject-payment', 29100, 'Reject Payment', 'NORMAL') ON CONFLICT (id) DO NOTHING; +INSERT INTO workflow.tbl_wf_activities (id, activity_uid, workflow_version_id, name, type) VALUES (20076, 'p2p-act-hold-payment', 29100, 'Hold Payment', 'NORMAL') ON CONFLICT (id) DO NOTHING; + +-- Activity fields +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9401', 'vendor_id', 20070, 'Vendor ID', 'local', 'text', true) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9402', 'vendor_name', 20070, 'Vendor Name', 'local', 'text', true) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9403', 'invoice_number', 20070, 'Invoice Number', 'local', 'text', true) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9404', 'invoice_date', 20070, 'Invoice Date', 'local', 'date', true) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9405', 'po_number', 20070, 'PO Number', 'local', 'text', true) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9406', 'currency', 20070, 'Currency', 'local', 'text', false) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9407', 'total_amount', 20070, 'Total Amount', 'local', 'number', true) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9408', 'tax_amount', 20070, 'Tax Amount', 'local', 'number', false) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9409', 'payment_terms', 20070, 'Payment Terms', 'local', 'text', false) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9410', 'notes', 20070, 'Notes', 'local', 'text', false) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9411', 'target_department', 20071, 'Target Department', 'local', 'text', true) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9412', 'clarification_question', 20071, 'Question', 'local', 'text', true) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9413', 'clarification_context', 20071, 'Context', 'local', 'text', false) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9414', 'analysis_so_far', 20071, 'Analysis So Far', 'local', 'text', false) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9415', 'response_text', 20073, 'Response', 'local', 'text', true) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9416', 'confirmed_quantity', 20073, 'Confirmed Quantity', 'local', 'number', false) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9417', 'response_notes', 20073, 'Additional Notes', 'local', 'text', false) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9418', 'recommendation', 20072, 'Recommendation', 'local', 'text', true) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9419', 'recommended_amount', 20072, 'Recommended Payment Amount', 'local', 'number', false) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9420', 'match_summary', 20072, 'Match Summary', 'local', 'text', false) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9421', 'ai_reasoning', 20072, 'AI Reasoning', 'local', 'text', false) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9422', 'ai_confidence', 20072, 'AI Confidence', 'local', 'number', false) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9423', 'approved_amount', 20074, 'Approved Amount', 'local', 'number', true) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9424', 'reviewer_notes', 20074, 'Reviewer Notes', 'local', 'text', false) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9425', 'rejection_reason', 20075, 'Rejection Reason', 'local', 'text', true) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9426', 'reviewer_notes', 20075, 'Reviewer Notes', 'local', 'text', false) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9427', 'hold_reason', 20076, 'Hold Reason', 'local', 'text', true) ON CONFLICT DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_fields (uid, field_s_id, activity_id, name, field_type, data_type, is_mandatory) VALUES ('p2p-field-9428', 'reviewer_notes', 20076, 'Reviewer Notes', 'local', 'text', false) ON CONFLICT DO NOTHING; + +-- Activity triggers +INSERT INTO workflow.tbl_wf_activity_triggers (id, activity_id, trigger_uid, trigger_config) VALUES (67, 20070, 'trigger_p2p_submit', '{}'::jsonb) ON CONFLICT (id) DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_triggers (id, activity_id, trigger_uid, trigger_config) VALUES (68, 20073, 'trigger_p2p_clarify', '{}'::jsonb) ON CONFLICT (id) DO NOTHING; + +-- Activity trigger nodes +INSERT INTO workflow.tbl_wf_activity_trigger_nodes (id, trigger_id, name, type, config, edges, ui_config) VALUES ('a0a0a0a0-0000-4000-8000-000000093011', 67, 'Start', 'start', '{}'::jsonb, '[{"target": "a0a0a0a0-0000-4000-8000-000000093012", "source_handle": "output"}]'::jsonb, NULL) ON CONFLICT (id) DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_trigger_nodes (id, trigger_id, name, type, config, edges, ui_config) VALUES ('a0a0a0a0-0000-4000-8000-000000093012', 67, 'AI Employee', 'aiEmployee', '{"ai_user_id": "29100"}'::jsonb, '[{"target": "a0a0a0a0-0000-4000-8000-000000093013", "source_handle": "output"}]'::jsonb, NULL) ON CONFLICT (id) DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_trigger_nodes (id, trigger_id, name, type, config, edges, ui_config) VALUES ('a0a0a0a0-0000-4000-8000-000000093013', 67, 'Complete', 'response', '{"message": "AI Employee task dispatched", "success": true, "status_code": 200}'::jsonb, '[]'::jsonb, NULL) ON CONFLICT (id) DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_trigger_nodes (id, trigger_id, name, type, config, edges, ui_config) VALUES ('a0a0a0a0-0000-4000-8000-000000093041', 68, 'Start', 'start', '{}'::jsonb, '[{"target": "a0a0a0a0-0000-4000-8000-000000093042", "source_handle": "output"}]'::jsonb, NULL) ON CONFLICT (id) DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_trigger_nodes (id, trigger_id, name, type, config, edges, ui_config) VALUES ('a0a0a0a0-0000-4000-8000-000000093042', 68, 'AI Employee', 'aiEmployee', '{"ai_user_id": "29100"}'::jsonb, '[{"target": "a0a0a0a0-0000-4000-8000-000000093043", "source_handle": "output"}]'::jsonb, NULL) ON CONFLICT (id) DO NOTHING; +INSERT INTO workflow.tbl_wf_activity_trigger_nodes (id, trigger_id, name, type, config, edges, ui_config) VALUES ('a0a0a0a0-0000-4000-8000-000000093043', 68, 'Complete', 'response', '{"message": "AI Employee task dispatched", "success": true, "status_code": 200}'::jsonb, '[]'::jsonb, NULL) ON CONFLICT (id) DO NOTHING; + +-- Activity permissions + +-- 4. AI Employee +INSERT INTO aiemployee.tbl_ai_employees (id, user_id, org_id, name, model, autonomy_level, config, status) VALUES (20, '29100', '20', 'Priya AI Finance (P2P Demo)', 'claude-sonnet-4-5-20250929', 'semi_autonomous', '{"mcp_servers": [], "rate_limits": {"max_tasks_per_day": 500, "max_tasks_per_hour": 100, "confidence_threshold": 0.5, "max_tasks_per_minute": 10, "max_llm_calls_per_task": 12}, "available_tools": {"agentic_tools": ["29110", "29111", "29112", "29113"], "autonomous_agents": []}, "monthly_budget_usd": 200, "max_concurrent_tasks": 3}'::jsonb, 'active') ON CONFLICT (id) DO NOTHING; + +-- AI Employee appconfig +INSERT INTO aiemployee.tbl_appconfig_ai_employees (id, user_id, org_id, name, model, autonomy_level, config, status, email, password) VALUES (20038, '29100', '20', 'Priya AI Finance (P2P Demo)', 'claude-sonnet-4-5-20250929', 'semi_autonomous', '{"mcp_servers": [], "rate_limits": {"max_tasks_per_day": 500, "max_tasks_per_hour": 100, "confidence_threshold": 0.5, "max_tasks_per_minute": 10, "max_llm_calls_per_task": 12}, "available_tools": {"agentic_tools": ["29110", "29111", "29112", "29113"], "autonomous_agents": []}, "monthly_budget_usd": 200, "max_concurrent_tasks": 3}'::jsonb, 'active', '', '') ON CONFLICT (id) DO NOTHING; + +-- AI Employee registry +INSERT INTO aiemployee.tbl_ai_employee_registry (ai_user_id, service_url, status) VALUES ('29100', 'http://localhost:8090', 'running') ON CONFLICT (ai_user_id) DO NOTHING; + +-- 5. Agentic tools + +-- 6. DB Connection +INSERT INTO tbl_org_db_connections (id, org_id, name, type, host, port, "user", password, database_name, ssl_mode) VALUES (5, 20, 'P2P Azure DB', 'postgres', 'studio-v2-pg.postgres.database.azure.com', 5432, 'studiov2pgadmin', 'YmzkpmVprw0Fsn8s0cvR', 'sm', 'require') ON CONFLICT (id) DO NOTHING; + +-- ============================================================ +-- 7. P2P DEMO DATA (p2p_demo schema) +-- ============================================================ +CREATE SCHEMA IF NOT EXISTS p2p_demo; + +CREATE TABLE p2p_demo.contract_line_items ( + id integer NOT NULL, + contract_id text, + product_code text NOT NULL, + description text, + unit_price numeric(12,2) NOT NULL, + currency text DEFAULT 'INR'::text +); + + +ALTER TABLE p2p_demo.contract_line_items OWNER TO postgres; + +-- +-- Name: contract_line_items_id_seq; Type: SEQUENCE; Schema: p2p_demo; Owner: postgres +-- + +CREATE SEQUENCE p2p_demo.contract_line_items_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER SEQUENCE p2p_demo.contract_line_items_id_seq OWNER TO postgres; + +-- +-- Name: contract_line_items_id_seq; Type: SEQUENCE OWNED BY; Schema: p2p_demo; Owner: postgres +-- + +ALTER SEQUENCE p2p_demo.contract_line_items_id_seq OWNED BY p2p_demo.contract_line_items.id; + + +-- +-- Name: contracts; Type: TABLE; Schema: p2p_demo; Owner: postgres +-- + +CREATE TABLE p2p_demo.contracts ( + contract_id text NOT NULL, + vendor_id text NOT NULL, + vendor_name text NOT NULL, + effective_date date, + expiry_date date, + status text DEFAULT 'active'::text, + payment_terms text, + price_tolerance_pct numeric(5,2) DEFAULT 2.0, + quantity_tolerance_pct numeric(5,2) DEFAULT 5.0, + created_at timestamp without time zone DEFAULT now() +); + + +ALTER TABLE p2p_demo.contracts OWNER TO postgres; + +-- +-- Name: goods_receipts; Type: TABLE; Schema: p2p_demo; Owner: postgres +-- + +CREATE TABLE p2p_demo.goods_receipts ( + gr_number text NOT NULL, + po_number text NOT NULL, + vendor_id text NOT NULL, + receipt_date date, + received_by text, + notes text, + created_at timestamp without time zone DEFAULT now() +); + + +ALTER TABLE p2p_demo.goods_receipts OWNER TO postgres; + +-- +-- Name: gr_line_items; Type: TABLE; Schema: p2p_demo; Owner: postgres +-- + +CREATE TABLE p2p_demo.gr_line_items ( + id integer NOT NULL, + gr_number text, + product_code text NOT NULL, + quantity_received integer NOT NULL, + condition text DEFAULT 'good'::text +); + + +ALTER TABLE p2p_demo.gr_line_items OWNER TO postgres; + +-- +-- Name: gr_line_items_id_seq; Type: SEQUENCE; Schema: p2p_demo; Owner: postgres +-- + +CREATE SEQUENCE p2p_demo.gr_line_items_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER SEQUENCE p2p_demo.gr_line_items_id_seq OWNER TO postgres; + +-- +-- Name: gr_line_items_id_seq; Type: SEQUENCE OWNED BY; Schema: p2p_demo; Owner: postgres +-- + +ALTER SEQUENCE p2p_demo.gr_line_items_id_seq OWNED BY p2p_demo.gr_line_items.id; + + +-- +-- Name: payments; Type: TABLE; Schema: p2p_demo; Owner: postgres +-- + +CREATE TABLE p2p_demo.payments ( + payment_id text NOT NULL, + invoice_number text, + po_number text, + vendor_id text NOT NULL, + amount numeric(14,2) NOT NULL, + payment_date date, + status text DEFAULT 'completed'::text, + created_at timestamp without time zone DEFAULT now() +); + + +ALTER TABLE p2p_demo.payments OWNER TO postgres; + +-- +-- Name: po_line_items; Type: TABLE; Schema: p2p_demo; Owner: postgres +-- + +CREATE TABLE p2p_demo.po_line_items ( + id integer NOT NULL, + po_number text, + product_code text NOT NULL, + description text, + quantity integer NOT NULL, + unit_price numeric(12,2) NOT NULL +); + + +ALTER TABLE p2p_demo.po_line_items OWNER TO postgres; + +-- +-- Name: po_line_items_id_seq; Type: SEQUENCE; Schema: p2p_demo; Owner: postgres +-- + +CREATE SEQUENCE p2p_demo.po_line_items_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER SEQUENCE p2p_demo.po_line_items_id_seq OWNER TO postgres; + +-- +-- Name: po_line_items_id_seq; Type: SEQUENCE OWNED BY; Schema: p2p_demo; Owner: postgres +-- + +ALTER SEQUENCE p2p_demo.po_line_items_id_seq OWNED BY p2p_demo.po_line_items.id; + + +-- +-- Name: purchase_orders; Type: TABLE; Schema: p2p_demo; Owner: postgres +-- + +CREATE TABLE p2p_demo.purchase_orders ( + po_number text NOT NULL, + vendor_id text NOT NULL, + vendor_name text NOT NULL, + contract_id text, + order_date date, + expected_delivery date, + status text DEFAULT 'open'::text, + total_amount numeric(14,2), + created_at timestamp without time zone DEFAULT now() +); + + +ALTER TABLE p2p_demo.purchase_orders OWNER TO postgres; + +-- +-- Name: tbl_messages; Type: TABLE; Schema: pipeline_ai; Owner: postgres +-- + +CREATE TABLE pipeline_ai.tbl_messages ( + id bigint NOT NULL, + session_id bigint, + role text, + content text, + metadata jsonb DEFAULT '{}'::jsonb, + created_at timestamp with time zone +); + + +ALTER TABLE pipeline_ai.tbl_messages OWNER TO postgres; + +-- + +COMMIT; + +-- User agent assignments + +-- Activity permissions + +-- Agentic tools +INSERT INTO agents.tbl_agentic_tools (id, org_id, group_id, name, description, flow_config, status, icon) VALUES (29112, 20, 20, 'fetch_contract', 'Fetch contract details by contract_id or vendor_id. Returns contract terms, pricing, tolerances. Use parameter: contract_id (preferred) or vendor_id.', E'{"edges": [{"id": "e1", "type": "custom", "source": "trigger-1", "target": "db-query-1", "sourceHandle": "output", "targetHandle": "input"}, {"id": "e2", "type": "custom", "source": "db-query-1", "target": "success-1", "sourceHandle": "output", "targetHandle": "input"}], "nodes": [{"id": "trigger-1", "data": {"label": "Input", "config": {"path": "/", "method": "POST"}}, "type": "webhookTrigger", "position": {"x": 100, "y": 50}}, {"id": "db-query-1", "data": {"label": "Query p2p_demo", "config": {"query": "SELECT json_build_object(\\\\n\\\\t\\\\t\\\\t\\\\t''contract_id'', c.contract_id,\\\\n\\\\t\\\\t\\\\t\\\\t''vendor_id'', c.vendor_id,\\\\n\\\\t\\\\t\\\\t\\\\t''vendor_name'', c.vendor_name,\\\\n\\\\t\\\\t\\\\t\\\\t''effective_date'', c.effective_date,\\\\n\\\\t\\\\t\\\\t\\\\t''expiry_date'', c.expiry_date,\\\\n\\\\t\\\\t\\\\t\\\\t''status'', c.status,\\\\n\\\\t\\\\t\\\\t\\\\t''payment_terms'', c.payment_terms,\\\\n\\\\t\\\\t\\\\t\\\\t''price_tolerance_pct'', c.price_tolerance_pct,\\\\n\\\\t\\\\t\\\\t\\\\t''quantity_tolerance_pct'', c.quantity_tolerance_pct,\\\\n\\\\t\\\\t\\\\t\\\\t''line_items'', COALESCE((\\\\n\\\\t\\\\t\\\\t\\\\t\\\\tSELECT json_agg(json_build_object(\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t''product_code'', cli.product_code,\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t''description'', cli.description,\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t''unit_price'', cli.unit_price,\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t''currency'', cli.currency\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t))\\\\n\\\\t\\\\t\\\\t\\\\t\\\\tFROM p2p_demo.contract_line_items cli WHERE cli.contract_id = c.contract_id\\\\n\\\\t\\\\t\\\\t\\\\t), ''[]''::json)\\\\n\\\\t\\\\t\\\\t) AS result\\\\n\\\\t\\\\t\\\\tFROM p2p_demo.contracts c\\\\n\\\\t\\\\t\\\\tWHERE c.contract_id = ''{{contract_id}}''\\\\n\\\\t\\\\t\\\\t OR c.vendor_id = ''{{vendor_id}}''\\\\n\\\\t\\\\t\\\\tLIMIT 1", "db_type": "postgresql", "operation": "raw", "connection": "{{env.DATABASE_URL}}", "result_limit": 50, "output_variable": "result"}}, "type": "databaseQuery", "position": {"x": 100, "y": 200}}, {"id": "success-1", "data": {"label": "Output", "config": {"output_field": "result"}}, "type": "success", "position": {"x": 100, "y": 350}}]}'::jsonb, 'active', '') ON CONFLICT (id) DO NOTHING; +INSERT INTO agents.tbl_agentic_tools (id, org_id, group_id, name, description, flow_config, status, icon) VALUES (29110, 20, 20, 'fetch_purchase_order', 'Fetch purchase order details by PO number. Returns PO header (vendor, status, total, dates) and line items (product, quantity, unit price). Use parameter: po_number.', E'{"edges": [{"id": "e1", "type": "custom", "source": "trigger-1", "target": "db-query-1", "sourceHandle": "output", "targetHandle": "input"}, {"id": "e2", "type": "custom", "source": "db-query-1", "target": "success-1", "sourceHandle": "output", "targetHandle": "input"}], "nodes": [{"id": "trigger-1", "data": {"label": "Input", "config": {"path": "/", "method": "POST"}}, "type": "webhookTrigger", "position": {"x": 100, "y": 50}}, {"id": "db-query-1", "data": {"label": "Query p2p_demo", "config": {"query": "SELECT json_build_object(\\\\n\\\\t\\\\t\\\\t\\\\t''po_number'', po.po_number,\\\\n\\\\t\\\\t\\\\t\\\\t''vendor_id'', po.vendor_id,\\\\n\\\\t\\\\t\\\\t\\\\t''vendor_name'', po.vendor_name,\\\\n\\\\t\\\\t\\\\t\\\\t''contract_id'', po.contract_id,\\\\n\\\\t\\\\t\\\\t\\\\t''order_date'', po.order_date,\\\\n\\\\t\\\\t\\\\t\\\\t''expected_delivery'', po.expected_delivery,\\\\n\\\\t\\\\t\\\\t\\\\t''status'', po.status,\\\\n\\\\t\\\\t\\\\t\\\\t''total_amount'', po.total_amount,\\\\n\\\\t\\\\t\\\\t\\\\t''line_items'', COALESCE((\\\\n\\\\t\\\\t\\\\t\\\\t\\\\tSELECT json_agg(json_build_object(\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t''product_code'', li.product_code,\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t''description'', li.description,\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t''quantity'', li.quantity,\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t''unit_price'', li.unit_price\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t))\\\\n\\\\t\\\\t\\\\t\\\\t\\\\tFROM p2p_demo.po_line_items li WHERE li.po_number = po.po_number\\\\n\\\\t\\\\t\\\\t\\\\t), ''[]''::json)\\\\n\\\\t\\\\t\\\\t) AS result\\\\n\\\\t\\\\t\\\\tFROM p2p_demo.purchase_orders po\\\\n\\\\t\\\\t\\\\tWHERE po.po_number = ''{{po_number}}''", "db_type": "postgresql", "operation": "raw", "connection": "{{env.DATABASE_URL}}", "result_limit": 50, "output_variable": "result"}}, "type": "databaseQuery", "position": {"x": 100, "y": 200}}, {"id": "success-1", "data": {"label": "Output", "config": {"output_field": "result"}}, "type": "success", "position": {"x": 100, "y": 350}}]}'::jsonb, 'active', '') ON CONFLICT (id) DO NOTHING; +INSERT INTO agents.tbl_agentic_tools (id, org_id, group_id, name, description, flow_config, status, icon) VALUES (29111, 20, 20, 'fetch_goods_receipt', 'Fetch goods receipt records for a PO number. Returns all delivery records with received quantities, dates, and notes. Use parameter: po_number.', E'{"edges": [{"id": "e1", "type": "custom", "source": "trigger-1", "target": "db-query-1", "sourceHandle": "output", "targetHandle": "input"}, {"id": "e2", "type": "custom", "source": "db-query-1", "target": "success-1", "sourceHandle": "output", "targetHandle": "input"}], "nodes": [{"id": "trigger-1", "data": {"label": "Input", "config": {"path": "/", "method": "POST"}}, "type": "webhookTrigger", "position": {"x": 100, "y": 50}}, {"id": "db-query-1", "data": {"label": "Query p2p_demo", "config": {"query": "SELECT json_build_object(\\\\n\\\\t\\\\t\\\\t\\\\t''po_number'', ''{{po_number}}'',\\\\n\\\\t\\\\t\\\\t\\\\t''receipts'', COALESCE((\\\\n\\\\t\\\\t\\\\t\\\\t\\\\tSELECT json_agg(json_build_object(\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t''gr_number'', gr.gr_number,\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t''receipt_date'', gr.receipt_date,\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t''received_by'', gr.received_by,\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t''notes'', gr.notes,\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t''line_items'', COALESCE((\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t\\\\tSELECT json_agg(json_build_object(\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t''product_code'', gli.product_code,\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t''quantity_received'', gli.quantity_received,\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t''condition'', gli.condition\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t))\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t\\\\tFROM p2p_demo.gr_line_items gli WHERE gli.gr_number = gr.gr_number\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t), ''[]''::json)\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t))\\\\n\\\\t\\\\t\\\\t\\\\t\\\\tFROM p2p_demo.goods_receipts gr WHERE gr.po_number = ''{{po_number}}''\\\\n\\\\t\\\\t\\\\t\\\\t), ''[]''::json),\\\\n\\\\t\\\\t\\\\t\\\\t''total_received'', COALESCE((\\\\n\\\\t\\\\t\\\\t\\\\t\\\\tSELECT SUM(gli.quantity_received)\\\\n\\\\t\\\\t\\\\t\\\\t\\\\tFROM p2p_demo.goods_receipts gr\\\\n\\\\t\\\\t\\\\t\\\\t\\\\tJOIN p2p_demo.gr_line_items gli ON gli.gr_number = gr.gr_number\\\\n\\\\t\\\\t\\\\t\\\\t\\\\tWHERE gr.po_number = ''{{po_number}}''\\\\n\\\\t\\\\t\\\\t\\\\t), 0)\\\\n\\\\t\\\\t\\\\t) AS result", "db_type": "postgresql", "operation": "raw", "connection": "{{env.DATABASE_URL}}", "result_limit": 50, "output_variable": "result"}}, "type": "databaseQuery", "position": {"x": 100, "y": 200}}, {"id": "success-1", "data": {"label": "Output", "config": {"output_field": "result"}}, "type": "success", "position": {"x": 100, "y": 350}}]}'::jsonb, 'active', '') ON CONFLICT (id) DO NOTHING; +INSERT INTO agents.tbl_agentic_tools (id, org_id, group_id, name, description, flow_config, status, icon) VALUES (29113, 20, 20, 'fetch_payment_history', 'Fetch payment history for a PO number or vendor. Returns all payments made, total paid amount. Use parameter: po_number (preferred) or vendor_id.', E'{"edges": [{"id": "e1", "type": "custom", "source": "trigger-1", "target": "db-query-1", "sourceHandle": "output", "targetHandle": "input"}, {"id": "e2", "type": "custom", "source": "db-query-1", "target": "success-1", "sourceHandle": "output", "targetHandle": "input"}], "nodes": [{"id": "trigger-1", "data": {"label": "Input", "config": {"path": "/", "method": "POST"}}, "type": "webhookTrigger", "position": {"x": 100, "y": 50}}, {"id": "db-query-1", "data": {"label": "Query p2p_demo", "config": {"query": "SELECT json_build_object(\\\\n\\\\t\\\\t\\\\t\\\\t''payments'', COALESCE((\\\\n\\\\t\\\\t\\\\t\\\\t\\\\tSELECT json_agg(json_build_object(\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t''payment_id'', p.payment_id,\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t''invoice_number'', p.invoice_number,\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t''po_number'', p.po_number,\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t''amount'', p.amount,\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t''payment_date'', p.payment_date,\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t\\\\t''status'', p.status\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t))\\\\n\\\\t\\\\t\\\\t\\\\t\\\\tFROM p2p_demo.payments p\\\\n\\\\t\\\\t\\\\t\\\\t\\\\tWHERE p.po_number = ''{{po_number}}'' OR p.vendor_id = ''{{vendor_id}}''\\\\n\\\\t\\\\t\\\\t\\\\t), ''[]''::json),\\\\n\\\\t\\\\t\\\\t\\\\t''total_paid'', COALESCE((\\\\n\\\\t\\\\t\\\\t\\\\t\\\\tSELECT SUM(p.amount)\\\\n\\\\t\\\\t\\\\t\\\\t\\\\tFROM p2p_demo.payments p\\\\n\\\\t\\\\t\\\\t\\\\t\\\\tWHERE (p.po_number = ''{{po_number}}'' OR p.vendor_id = ''{{vendor_id}}'')\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t AND p.status = ''completed''\\\\n\\\\t\\\\t\\\\t\\\\t), 0)\\\\n\\\\t\\\\t\\\\t) AS result", "db_type": "postgresql", "operation": "raw", "connection": "{{env.DATABASE_URL}}", "result_limit": 50, "output_variable": "result"}}, "type": "databaseQuery", "position": {"x": 100, "y": 200}}, {"id": "success-1", "data": {"label": "Output", "config": {"output_field": "result"}}, "type": "success", "position": {"x": 100, "y": 350}}]}'::jsonb, 'active', '') ON CONFLICT (id) DO NOTHING; + +-- ============================================================ +-- 7. P2P DEMO DATA (p2p_demo schema) +-- ============================================================ +-- Import from: /Users/bhanuprakash/Downloads/sm_db.sql +-- Extract p2p_demo tables/data separately using: +-- grep -A lines for p2p_demo CREATE TABLE and COPY statements + +COMMIT; diff --git a/p2p_demo_schema.sql b/p2p_demo_schema.sql new file mode 100644 index 0000000..7bd985f --- /dev/null +++ b/p2p_demo_schema.sql @@ -0,0 +1,164 @@ +-- P2P Demo Schema Data +CREATE SCHEMA IF NOT EXISTS p2p_demo; + +CREATE TABLE p2p_demo.contract_line_items ( + id integer NOT NULL, + contract_id text, + product_code text NOT NULL, + description text, + unit_price numeric(12,2) NOT NULL, + currency text DEFAULT 'INR'::text +); + +ALTER TABLE p2p_demo.contract_line_items OWNER TO postgres; +CREATE SEQUENCE p2p_demo.contract_line_items_id_seq +ALTER SEQUENCE p2p_demo.contract_line_items_id_seq OWNER TO postgres; +ALTER SEQUENCE p2p_demo.contract_line_items_id_seq OWNED BY p2p_demo.contract_line_items.id; +CREATE TABLE p2p_demo.contracts ( + contract_id text NOT NULL, + vendor_id text NOT NULL, + vendor_name text NOT NULL, + effective_date date, + expiry_date date, + status text DEFAULT 'active'::text, + payment_terms text, + price_tolerance_pct numeric(5,2) DEFAULT 2.0, + quantity_tolerance_pct numeric(5,2) DEFAULT 5.0, + created_at timestamp without time zone DEFAULT now() +); + +ALTER TABLE p2p_demo.contracts OWNER TO postgres; +CREATE TABLE p2p_demo.goods_receipts ( + gr_number text NOT NULL, + po_number text NOT NULL, + vendor_id text NOT NULL, + receipt_date date, + received_by text, + notes text, + created_at timestamp without time zone DEFAULT now() +); + +ALTER TABLE p2p_demo.goods_receipts OWNER TO postgres; +CREATE TABLE p2p_demo.gr_line_items ( + id integer NOT NULL, + gr_number text, + product_code text NOT NULL, + quantity_received integer NOT NULL, + condition text DEFAULT 'good'::text +); + +ALTER TABLE p2p_demo.gr_line_items OWNER TO postgres; +CREATE SEQUENCE p2p_demo.gr_line_items_id_seq +ALTER SEQUENCE p2p_demo.gr_line_items_id_seq OWNER TO postgres; +ALTER SEQUENCE p2p_demo.gr_line_items_id_seq OWNED BY p2p_demo.gr_line_items.id; +CREATE TABLE p2p_demo.payments ( + payment_id text NOT NULL, + invoice_number text, + po_number text, + vendor_id text NOT NULL, + amount numeric(14,2) NOT NULL, + payment_date date, + status text DEFAULT 'completed'::text, + created_at timestamp without time zone DEFAULT now() +); + +ALTER TABLE p2p_demo.payments OWNER TO postgres; +CREATE TABLE p2p_demo.po_line_items ( + id integer NOT NULL, + po_number text, + product_code text NOT NULL, + description text, + quantity integer NOT NULL, + unit_price numeric(12,2) NOT NULL +); + +ALTER TABLE p2p_demo.po_line_items OWNER TO postgres; +CREATE SEQUENCE p2p_demo.po_line_items_id_seq +ALTER SEQUENCE p2p_demo.po_line_items_id_seq OWNER TO postgres; +ALTER SEQUENCE p2p_demo.po_line_items_id_seq OWNED BY p2p_demo.po_line_items.id; +CREATE TABLE p2p_demo.purchase_orders ( + po_number text NOT NULL, + vendor_id text NOT NULL, + vendor_name text NOT NULL, + contract_id text, + order_date date, + expected_delivery date, + status text DEFAULT 'open'::text, + total_amount numeric(14,2), + created_at timestamp without time zone DEFAULT now() +); + +ALTER TABLE p2p_demo.purchase_orders OWNER TO postgres; +ALTER TABLE ONLY p2p_demo.contract_line_items ALTER COLUMN id SET DEFAULT nextval('p2p_demo.contract_line_items_id_seq'::regclass); +ALTER TABLE ONLY p2p_demo.contract_line_items ALTER COLUMN id SET DEFAULT nextval('p2p_demo.contract_line_items_id_seq'::regclass); +ALTER TABLE ONLY p2p_demo.gr_line_items ALTER COLUMN id SET DEFAULT nextval('p2p_demo.gr_line_items_id_seq'::regclass); +ALTER TABLE ONLY p2p_demo.gr_line_items ALTER COLUMN id SET DEFAULT nextval('p2p_demo.gr_line_items_id_seq'::regclass); +ALTER TABLE ONLY p2p_demo.po_line_items ALTER COLUMN id SET DEFAULT nextval('p2p_demo.po_line_items_id_seq'::regclass); +ALTER TABLE ONLY p2p_demo.po_line_items ALTER COLUMN id SET DEFAULT nextval('p2p_demo.po_line_items_id_seq'::regclass); +COPY p2p_demo.contract_line_items (id, contract_id, product_code, description, unit_price, currency) FROM stdin; +233 CNT-100 PRD-101 Steel Rods 12mm 1000.00 INR +234 CNT-100 PRD-102 Steel Plates 5mm 2500.00 INR +235 CNT-200 PRD-201 A4 Paper Ream (500 sheets) 200.00 INR +236 CNT-200 PRD-202 Printer Ink Cartridge 1500.00 INR +237 CNT-300 PRD-301 Circuit Board Type-A 500.00 INR +238 CNT-300 PRD-302 LED Panel 24inch 3500.00 INR +239 CNT-400 PRD-401 Safety Helmet 150.00 INR +240 CNT-400 PRD-402 Industrial Gloves (pair) 80.00 INR +\. + +COPY p2p_demo.contracts (contract_id, vendor_id, vendor_name, effective_date, expiry_date, status, payment_terms, price_tolerance_pct, quantity_tolerance_pct, created_at) FROM stdin; +CNT-100 VND-001 Tata Steel Ltd 2026-01-01 2026-12-31 active Net 30 2.00 5.00 2026-03-30 18:34:11.089882 +CNT-200 VND-002 Reliance Office Supplies 2026-01-01 2026-12-31 active Net 15 3.00 5.00 2026-03-30 18:34:11.091337 +CNT-300 VND-003 Bharat Electronics 2026-01-01 2026-12-31 active Net 30 2.00 5.00 2026-03-30 18:34:11.092484 +CNT-400 VND-004 Godrej Industrial 2026-01-01 2026-12-31 active 2/10 Net 30 2.00 5.00 2026-03-30 18:34:11.093581 +\. + +COPY p2p_demo.goods_receipts (gr_number, po_number, vendor_id, receipt_date, received_by, notes, created_at) FROM stdin; +GR-2001 PO-2001 VND-002 2026-03-18 Amit Kumar Full delivery received. All items in good condition. 2026-03-30 18:34:11.100119 +GR-1001 PO-1001 VND-001 2026-03-18 Rajesh Sharma Partial delivery. 700 of 1000 units received. Vendor confirmed remaining 300 shipped separately, expected April 5. 2026-03-30 18:34:11.101225 +GR-3001 PO-3001 VND-003 2026-03-18 Sunil Verma Full delivery received. QC passed. 2026-03-30 18:34:11.102194 +GR-2002 PO-2002 VND-002 2026-03-18 Amit Kumar Full delivery received. 2026-03-30 18:34:11.103112 +GR-1002 PO-1002 VND-001 2026-03-18 Rajesh Sharma Partial delivery. 600 of 800 plates received. Remaining 200 delayed due to transport issues. 2026-03-30 18:34:11.104018 +\. + +COPY p2p_demo.gr_line_items (id, gr_number, product_code, quantity_received, condition) FROM stdin; +146 GR-2001 PRD-201 500 good +147 GR-1001 PRD-101 700 good +148 GR-3001 PRD-301 200 good +149 GR-2002 PRD-202 50 good +150 GR-1002 PRD-102 600 good +\. + +COPY p2p_demo.payments (payment_id, invoice_number, po_number, vendor_id, amount, payment_date, status, created_at) FROM stdin; +PAY-5001 INV-2026-00700 PO-2002 VND-002 75000.00 2026-03-10 completed 2026-03-30 18:34:11.10478 +PAY-5002 INV-2026-00800 PO-1002 VND-001 200000.00 2026-03-05 completed 2026-03-30 18:34:11.105142 +\. + +COPY p2p_demo.po_line_items (id, po_number, product_code, description, quantity, unit_price) FROM stdin; +175 PO-2001 PRD-201 A4 Paper Ream (500 sheets) 500 200.00 +176 PO-1001 PRD-101 Steel Rods 12mm 1000 1000.00 +177 PO-3001 PRD-301 Circuit Board Type-A 200 500.00 +178 PO-2002 PRD-202 Printer Ink Cartridge 50 1500.00 +179 PO-4001 PRD-401 Safety Helmet 300 150.00 +180 PO-1002 PRD-102 Steel Plates 5mm 800 1000.00 +\. + +COPY p2p_demo.purchase_orders (po_number, vendor_id, vendor_name, contract_id, order_date, expected_delivery, status, total_amount, created_at) FROM stdin; +PO-2001 VND-002 Reliance Office Supplies CNT-200 2026-02-15 2026-03-15 fully_received 100000.00 2026-03-30 18:34:11.094652 +PO-1001 VND-001 Tata Steel Ltd CNT-100 2026-02-15 2026-03-15 partially_received 1000000.00 2026-03-30 18:34:11.095959 +PO-3001 VND-003 Bharat Electronics CNT-300 2026-02-15 2026-03-15 fully_received 100000.00 2026-03-30 18:34:11.096847 +PO-2002 VND-002 Reliance Office Supplies CNT-200 2026-02-15 2026-03-15 fully_received 75000.00 2026-03-30 18:34:11.09772 +PO-4001 VND-004 Godrej Industrial CNT-400 2026-02-15 2026-03-15 open 45000.00 2026-03-30 18:34:11.098572 +PO-1002 VND-001 Tata Steel Ltd CNT-100 2026-02-15 2026-03-15 partially_received 800000.00 2026-03-30 18:34:11.099363 +\. + +ALTER TABLE ONLY p2p_demo.contract_line_items +ALTER TABLE ONLY p2p_demo.contracts +ALTER TABLE ONLY p2p_demo.goods_receipts +ALTER TABLE ONLY p2p_demo.gr_line_items +ALTER TABLE ONLY p2p_demo.payments +ALTER TABLE ONLY p2p_demo.po_line_items +ALTER TABLE ONLY p2p_demo.purchase_orders +ALTER TABLE ONLY p2p_demo.contract_line_items +ALTER TABLE ONLY p2p_demo.gr_line_items +ALTER TABLE ONLY p2p_demo.po_line_items \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..12235b9 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7975 @@ +{ + "name": "p2p-studio", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "p2p-studio", + "version": "0.1.0", + "dependencies": { + "@fontsource-variable/geist": "^5.3.0", + "@tailwindcss/vite": "^4.3.3", + "@tanstack/react-query": "^5.60.5", + "@tanstack/react-table": "^8.21.3", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "lucide-react": "^0.441.0", + "next-themes": "^0.4.6", + "nuqs": "^2.9.2", + "radix-ui": "^1.6.7", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^6.26.0", + "recharts": "^3.10.1", + "shadcn": "^4.16.0", + "sonner": "^2.0.7", + "tailwind-merge": "^3.6.0", + "tw-animate-css": "^1.4.0" + }, + "devDependencies": { + "@types/node": "^26.1.2", + "@types/react": "^18.3.5", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.1", + "tailwindcss": "^4.3.3", + "typescript": "~5.5.4", + "vite": "^5.4.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", + "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/traverse": "^7.29.7", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", + "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", + "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", + "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", + "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", + "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-syntax-typescript": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz", + "integrity": "sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-syntax-jsx": "^7.29.7", + "@babel/plugin-transform-modules-commonjs": "^7.29.7", + "@babel/plugin-transform-typescript": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@dotenvx/dotenvx": { + "version": "1.75.1", + "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.75.1.tgz", + "integrity": "sha512-/BITOC9dmS/edY2zQwZNicQ059O6RKabtQfyEafV0nGtfYRNHYy1DIPiYVcov40+tob9hfmBnbR963dS+EQ1DQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@dotenvx/primitives": "^0.8.0", + "commander": "^11.1.0", + "conf": "^10.2.0", + "dotenv": "^17.2.1", + "enquirer": "^2.4.1", + "env-paths": "^2.2.1", + "execa": "^5.1.1", + "fdir": "^6.2.0", + "ignore": "^5.3.0", + "object-treeify": "1.1.33", + "open": "^8.4.2", + "picomatch": "^4.0.4", + "systeminformation": "^5.22.11", + "undici": "^7.11.0", + "which": "^4.0.0", + "yocto-spinner": "^1.1.0" + }, + "bin": { + "dotenvx": "src/cli/dotenvx.js" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/@dotenvx/dotenvx/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@dotenvx/primitives": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@dotenvx/primitives/-/primitives-0.8.0.tgz", + "integrity": "sha512-VYJy0uhFm9zTJ1TxBaW/pA8bjbOM/OttaNMwZ1RHG4JKyRG7DhSdiqD1ipQoAyoD22olUtxbP78W9xY3Wd11bg==", + "license": "BSD-3-Clause" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@floating-ui/core": { + "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.12" + } + }, + "node_modules/@floating-ui/dom": { + "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.8.0", + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/react-dom": { + "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.8.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "license": "MIT" + }, + "node_modules/@fontsource-variable/geist": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource-variable/geist/-/geist-5.3.0.tgz", + "integrity": "sha512-j0m+vLQuG5XAYoHtGCVu0spvlGreR3EzpECUVzkFmI1mTVnAO38l/NEPDCFgZ177JxzYJCLSmTQibIiYPilGrA==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@hono/node-server": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-2.0.12.tgz", + "integrity": "sha512-eWpQYr67tqJLeaSUl0Q+TquuYfUdTibpOJlUMV2FfUP7+KqCC5TufnwnlXL6mobZBJbGAYRd7ZvEBDCbLInjhg==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "hono": "^4" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.30.0.tgz", + "integrity": "sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==", + "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.19.9 || ^2.0.5", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.2.1", + "express-rate-limit": "^8.2.1", + "hono": "^4.11.4", + "jose": "^6.1.3", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.3.tgz", + "integrity": "sha512-Road2bidD0uu/1BGDOWNdPI06g0lIRy6IF9GZcIrDK2KGItfor8IQwQa+yM2ERgHM1MmHxaxpTzk0/Jp42lNfA==", + "license": "MIT" + }, + "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-accessible-icon": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.15.tgz", + "integrity": "sha512-WTQwcAvQf5sOcuUyi90lKPbhwcvQ+j55cjrSmeaN+L2vKU3DooOvlKw2MDeiJ5IkV5N905KW0/fGojKOBhD11A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-visually-hidden": "1.2.11" + }, + "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-accordion": { + "version": "1.2.20", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.20.tgz", + "integrity": "sha512-jDhG9FvAEnlhnjrsINbNXcUa4G+L1KqSkJSunkbKEzFRcAb52jvM0PjPxPRvhe1HNc5F5yc0yzzWeeqlH4yBIg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collapsible": "1.1.20", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" + }, + "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.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.23.tgz", + "integrity": "sha512-VAYOiQRqj3GPpYJE0I9J+X8Ip05cyVlNdKOFeiGS2Ou1HHGfpl0BxOyZm6nmVDyU+W+NF3/XLzmjHmVGydhwgA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dialog": "1.1.23", + "@radix-ui/react-primitive": "2.1.10" + }, + "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.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.15.tgz", + "integrity": "sha512-v4zggRcjadnI+ClKDuijlQEW4tw3NoaeHc/PwpKnLoLLKNUG4InLegkstooLcRIUWCs+8L22dGURCVuFfOKfnA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.10" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-aspect-ratio": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.15.tgz", + "integrity": "sha512-fy+dyVR+90nelK8rqIznFlxzx7uPcGbhxH8Nfr2bHb4UfSe+e3hklOC0luK0hDwVwnRX7xTRySpsrQVeW+/oNQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.10" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-avatar": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.2.6.tgz", + "integrity": "sha512-4ULOTJ/mqy2hT9GlWa/MFHxHSvH3nJzHnZM1waNsc5Bonv7i70aNenghXmD97S6OJ81ekXONGGt4nT1r0PfEdA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-is-hydrated": "0.1.3", + "@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-checkbox": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.11.tgz", + "integrity": "sha512-Gnptr9pDDQxD3hgq2dtPbtrp/c2qH1mBwIzw3X/ivrMb2e1t0jMTi606fVEqFPaQR1ggXIVQWKj3P2WW9v7zGQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@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-size": "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": { + "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.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": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.15.tgz", + "integrity": "sha512-9W+B9NPF0NaaPh/1NJd3+KqsnlLqU9H7T2rvww+fp+T/evVXdNAyYcnfRQZFOjkR1ajQp3yORlqnI8soawLvNA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@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-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-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-context-menu": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.3.7.tgz", + "integrity": "sha512-CtXP35dxaB5T3zXSd+E3uHe/QpXcpYnZmxp6OaIbfthtfW4wyb77M23BG+bwIJDtsMwEP/YssdsmNyZu7jhWew==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-menu": "2.1.24", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.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.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.7.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-direction": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.4.tgz", + "integrity": "sha512-5pzg4FGQNpExhnhT2zlrP1wZFaYCd1K0nYWoFAdcYoYK868IEigqMX3B3f8yIoRlAhAeDWciLI6ZdCKHF9P4Vg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.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.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": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.24.tgz", + "integrity": "sha512-geq8l2rJkxvkXsT9RMgtUE3P8pITFpTsvYpbySi1IH4fZEABD/Gp85myayFgxk0ktljGMJnCbeFkyTusvSvv7g==", + "license": "MIT", + "dependencies": { + "@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-menu": "2.1.24", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.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-focus-scope": { + "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.5", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "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-form": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.1.16.tgz", + "integrity": "sha512-Q4TLEn2A7TAypxwmd6R9EwrlXDvkfYSDMrq9/887AXAGh+G1rH+kYJKSTv+Si9Y0JPKTwKYv6PviAJosysNimA==", + "license": "MIT", + "dependencies": { + "@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-label": "2.1.15", + "@radix-ui/react-primitive": "2.1.10" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-hover-card": { + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.23.tgz", + "integrity": "sha512-H8qONfZd3ltrU3+jHCIgITbWo6e1iTKvP9DHdrvYbX48ooRM5FjEDTn16AMwdfuOGkWdZEhpl3PLL/Wk/AnHDQ==", + "license": "MIT", + "dependencies": { + "@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-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" + }, + "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.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-label": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.15.tgz", + "integrity": "sha512-o/rdYEwZTTo5tjknnPeyQFU45kUC4i/XyeDPP+HGyi6XqpOP6Zf5Ya5vh/Yfe9Id5JiuWnnAx2XqIeD3UYZt0g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.10" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.24.tgz", + "integrity": "sha512-uW7RVuU6Lp/ZtfeY4b3kL32zccgEWvPv1+cf17ubYzHa9cL8AHokmk36cG/XEiH/smbQvumnieXX9j/e9RqJWA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@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-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-callback-ref": "1.1.4", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.7.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-menubar": { + "version": "1.1.24", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.24.tgz", + "integrity": "sha512-eeVs0vf7cuqXaM0qLQCPcufImiJNVBXdJDLu7ZGYl2732UH23Qat/foNGrr6vYV3/DdTsBqASoggUFgH14OcZA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-menu": "2.1.24", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-use-controllable-state": "1.2.6" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-navigation-menu": { + "version": "1.2.22", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.22.tgz", + "integrity": "sha512-ou7iLEJ+yrhQndkkA4U21XIdS/CS45F4iXIkTZcb6/Ne9EMsOuDudVmCwmDnfFZZ+y1FZqXRNSIgBy+YMvZVZg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@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-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-previous": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11" + }, + "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-one-time-password-field": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-one-time-password-field/-/react-one-time-password-field-0.1.16.tgz", + "integrity": "sha512-Tj9P6ntAJEw52oq/F0AGknXR4XncxEt7XU47O3xJQOiWfLzEy3d9gtgKfvjSzGxzHkfL+VzvxGu2KTFsloJqXw==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-is-hydrated": "0.1.3", + "@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-password-toggle-field": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-password-toggle-field/-/react-password-toggle-field-0.1.11.tgz", + "integrity": "sha512-4gvFnmDXu3dgj21CqsufzIameRvlRd4SBqaWhcrlrNhRo0Y5i/49AmRJYe1fdAM3G2VNBbmin4b0D6cdQocwgw==", + "license": "MIT", + "dependencies": { + "@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-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-is-hydrated": "0.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.23.tgz", + "integrity": "sha512-mw58MrBlyHWFisTOYignD0vf/3gdcgAR+9of1s9G/38CbFiUwH1nCDkc0AUM9IrXFgN5Ue8n45j9WCgyM1sbiQ==", + "license": "MIT", + "dependencies": { + "@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-popper": "1.3.7", + "@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", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.7.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-popper": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.7.tgz", + "integrity": "sha512-UsJrrd7w4wuKKTdvd/DNERVlwSlUcyXzjhyDwBk+3aPOsCjOY6ZSbxuw8E6lZTjjfP8Cpd0J8VVkrYUWyGYXyg==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-rect": "1.1.4", + "@radix-ui/react-use-size": "1.1.4", + "@radix-ui/rect": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "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.10", + "@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-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-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-progress": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.16.tgz", + "integrity": "sha512-5XnomAsoZZCY+KNTxbIghpGqPruZvKFNlvcAljVAOdDRDsH4/OZQxhtwo5wdtoDM5R6MhJBb2sPnDuRFep3lzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.4.7.tgz", + "integrity": "sha512-cgYFEkntCxppHZgtSZ+7vh0wbZQ+IC7PPMw8DSnRG27B6kDd32/Zw0OJt7dGDigCoprMuWHjg2PvUn3PYvPFoQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-size": "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-roving-focus": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.19.tgz", + "integrity": "sha512-V9jI6hDjT7l3jsCQD9bLNvDLM3tH/gdbOTp7Tefp3hbbgCGQoK7tUvrWiRlcoBHIZ809ElXwNQwVo0B98LuTXQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-is-hydrated": "0.1.3", + "@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-scroll-area": { + "version": "1.2.18", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.18.tgz", + "integrity": "sha512-Zn5Cd171wxsO3Dfg8HaW6RifTb9CYTKQJHs/G4+LN1GfmJpaQMZQyQxMprVPHpaz7QY4l9BxK2JwQuzHsXC8nA==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@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-select": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.3.7.tgz", + "integrity": "sha512-WFGImkmbzcfxeIwq/+4HvRN0pizBwbwQUED4I13ezQsDdfl38ZntN6TmR8XaSzPBqoCToe8rF75j6NPNDSzhbg==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@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-popper": "1.3.7", + "@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-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-previous": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.7.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-separator": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.15.tgz", + "integrity": "sha512-jOLO4lssEzWpoDu7G+Ze4VjwMRUBt291pnZD0gmalREZipnTX3wadQo7Fy48GCTfe14/YRN6rw/rOJqrE85Wxw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.10" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slider": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.4.7.tgz", + "integrity": "sha512-mTSLf1GC/C0moWjTbvCM6Qn/gBjvlFt1azuWF2v7MN5C3Zq2U2J2lN3ZEYkpujuOU5Ro7A28wkviSxaKnG0BYg==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@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", + "@radix-ui/react-use-previous": "1.1.4", + "@radix-ui/react-use-size": "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-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-switch": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.3.7.tgz", + "integrity": "sha512-48tB/4dn2UVLBCYhTu9AuR63IHl73l/qLbLgxd86noTUor4/K4LFDAcYjK+isP5313qxaFpjPVogE7+Y0/V3Kw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-size": "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-tabs": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.21.tgz", + "integrity": "sha512-UKxJlZid7FVtsk/WTxj4i4uSEgj2Au+KBbS7SQyTlzMhhn+86Cz3tISZdTa87bfEfcuvZezf2ZsxD4xuEKtkog==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-use-controllable-state": "1.2.6" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toast": { + "version": "1.2.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.23.tgz", + "integrity": "sha512-ofhyAsYaocRGOs/n0XWdUOSVzEAG6BfrMVM8z0c0kLEWY38w/0WuMFPTJP/HVaZPYkMvHZoKIIhNcjbTCBILPg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@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-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle": { + "version": "1.1.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.7", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle-group": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.19.tgz", + "integrity": "sha512-OtnwuSVjd1Ofi+AdnvhsjQdyuhCDwYs1w9RyB5BN/OavXOVQo42SYqQjwUnbPnaiPFBpQ9aX70dWeee+v2oBLA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-toggle": "1.1.18", + "@radix-ui/react-use-controllable-state": "1.2.6" + }, + "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-toolbar": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.19.tgz", + "integrity": "sha512-Ph0IvtYw4VB12ZnZg+YtrGs8yJQsnizwo/zu0R4Y/nWugtJzA7Pg1eWeuDR9+LSqn+xjamss+UOSOJJJ4gx8jw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-separator": "1.1.15", + "@radix-ui/react-toggle-group": "1.1.19" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.16.tgz", + "integrity": "sha512-6EamKFRRnlpdadndbZ6LMwycfwkwPte1B42hs6QA0gYhjaOKqW4PZ4pjaW9UrlDX5eVt/OjncE7BFTPL5nmZhg==", + "license": "MIT", + "dependencies": { + "@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-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@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", + "@radix-ui/react-visually-hidden": "1.2.11" + }, + "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.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-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-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-use-escape-keydown": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.5.tgz", + "integrity": "sha512-ge3ipobwSXTj4JyVtswQ7qZj0ZHdtbGuOno/LrgAAeSxtsJ6Vs4Gz5IkPH2bmqpjcLUFoqGhA/mueuIf63UXlA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "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-use-is-hydrated": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.3.tgz", + "integrity": "sha512-umO/aJ+82CpOnhDZUTbILCQf7kU/g0iv+oGs/Q8jw7IkhWBzaEP4sA268PhFAJTFetbwp3ICc6ktpI4TqtxcIw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-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-use-previous": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.4.tgz", + "integrity": "sha512-XoSLhbRbqxFtgJoi2fNHA3C6pDlY34x508vUpUGoFZfvePfHXHbE1lC4FYFMnJWgiCRroSTw6fOsXQoVS9RwZg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.4.tgz", + "integrity": "sha512-cSOCh6JlkmfjLyNcLiu2nB4v+nm+dkZ+Q5KHWk/soo4U7ZLiEQFKHK9/YmtBHjfCEaU43IBKQOc4/uJmCaiCTQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.4.tgz", + "integrity": "sha512-D3anSY15EJoxrihpsXI6SMrmmonnQtR2ni7arO+Lfdg3O95b9hNXxONk8jA5C8ANdF/h5HMAxejgs8PWJ6rlhw==", + "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-visually-hidden": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.11.tgz", + "integrity": "sha512-NFS86RYYZb4/exihaESBGOpMJFz8MGLAfu3mOBSGByVnVPC9JPASfYubxd/8KbkQK0sYAv8lVQDEQukDX/qXvQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.10" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.3.tgz", + "integrity": "sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==", + "license": "MIT" + }, + "node_modules/@reduxjs/toolkit": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.12.0.tgz", + "integrity": "sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "immer": "^11.0.0", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@remix-run/router": { + "version": "1.23.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz", + "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==", + "license": "MIT", + "engines": { + "node": ">=14.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", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", + "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", + "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", + "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", + "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", + "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", + "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", + "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", + "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", + "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", + "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", + "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", + "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", + "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", + "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", + "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", + "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", + "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", + "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", + "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", + "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", + "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", + "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", + "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", + "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", + "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "license": "MIT" + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "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/@tailwindcss/node": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", + "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.24.1", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", + "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", + "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", + "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", + "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", + "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", + "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", + "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", + "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", + "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", + "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz", + "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "tailwindcss": "4.3.3" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@tanstack/query-core": { + "version": "5.95.2", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.95.2.tgz", + "integrity": "sha512-o4T8vZHZET4Bib3jZ/tCW9/7080urD4c+0/AUaYVpIqOsr7y0reBc1oX3ttNaSW5mYyvZHctiQ/UOP2PfdmFEQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.95.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.95.2.tgz", + "integrity": "sha512-/wGkvLj/st5Ud1Q76KF1uFxScV7WeqN1slQx5280ycwAyYkIPGaRZAEgHxe3bjirSd5Zpwkj6zNcR4cqYni/ZA==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.95.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@tanstack/react-table": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.21.3.tgz", + "integrity": "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==", + "license": "MIT", + "dependencies": { + "@tanstack/table-core": "8.21.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.3.tgz", + "integrity": "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@ts-morph/common": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.27.0.tgz", + "integrity": "sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.3.3", + "minimatch": "^10.0.1", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "26.1.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.2.tgz", + "integrity": "sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~8.3.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", + "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "devOptional": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, + "node_modules/@types/validate-npm-package-name": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/validate-npm-package-name/-/validate-npm-package-name-4.0.2.tgz", + "integrity": "sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/atomically": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", + "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", + "license": "MIT", + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.12", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.12.tgz", + "integrity": "sha512-qyq26DxfY4awP2gIRXhhLWfwzwI+N5Nxk6iQi8EFizIaWIjqicQTE4sLnZZVdeKPRcVNoJOkkpfzoIYuvCKaIQ==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/body-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", + "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^2.0.0", + "debug": "^4.4.3", + "http-errors": "^2.0.1", + "iconv-lite": "^0.7.2", + "on-finished": "^2.4.1", + "qs": "^6.15.2", + "raw-body": "^3.0.2", + "type-is": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz", + "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001782", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001782.tgz", + "integrity": "sha512-dZcaJLJeDMh4rELYFw1tvSn1bhZWYFOt468FcbHHxx/Z/dFidd1I6ciyFdi3iwfQCyOjqo9upF6lGQYtMiJWxw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cmdk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz", + "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "^1.1.1", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-id": "^1.1.0", + "@radix-ui/react-primitive": "^2.0.2" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/code-block-writer": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", + "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", + "license": "MIT" + }, + "node_modules/conf": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", + "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", + "license": "MIT", + "dependencies": { + "ajv": "^8.6.3", + "ajv-formats": "^2.1.1", + "atomically": "^1.7.0", + "debounce-fn": "^4.0.0", + "dot-prop": "^6.0.1", + "env-paths": "^2.2.1", + "json-schema-typed": "^7.0.3", + "onetime": "^5.1.2", + "pkg-up": "^3.1.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conf/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/conf/node_modules/json-schema-typed": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", + "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==", + "license": "BSD-2-Clause" + }, + "node_modules/conf/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/content-disposition": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", + "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", + "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/debounce-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", + "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, + "node_modules/dedent": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/diff": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dotenv": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", + "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.328", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.328.tgz", + "integrity": "sha512-QNQ5l45DzYytThO21403XN3FvK0hOkWDG8viNf6jqS42msJ8I4tGDSpBCgvDRRPnkffafiwAym2X2eHeGD2V0w==", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.24.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.4.tgz", + "integrity": "sha512-GVoi+ICHocoOIU7qVVM48wOJziRsqrsyqlI0Ce0LdowRn6v3bcH2zUa9kp85ncx0nwIb9/HOCOLS3fdThDG/XQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-toolkit": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.50.0.tgz", + "integrity": "sha512-OyZKhUVvEep9ITEiwHn8GKnMRQIVqoSIX7WnRbkWgJkllCujilqP2rD0u979tkl8wqyc8ICwlc1UBVv/Sl1G6w==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks", + "tests/types" + ] + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.0.tgz", + "integrity": "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/execa": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.6.1.tgz", + "integrity": "sha512-0D493aP61w0TJ2A0wy27riRsO7FMQ7FK+KUHOKCSfPvYo0R55aiC6emCVgFUeShH0fq0ICPVzNcgoS+BsbXQCA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "ip-address": "^10.2.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-uri": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", + "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-extra": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", + "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fuzzysort": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fuzzysort/-/fuzzysort-3.1.0.tgz", + "integrity": "sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==", + "license": "MIT" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-own-enumerable-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-own-enumerable-keys/-/get-own-enumerable-keys-1.0.0.tgz", + "integrity": "sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hono": { + "version": "4.12.32", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.32.tgz", + "integrity": "sha512-XcuyW9qE2kJn07PkecMOBd5Vq/hMy7mmGw+idz1yblbg9N17ijJODrvPkn7/dwL3Kulj8LcRJ69DLOWf91dRUg==", + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/human-signals": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", + "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", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "11.1.15", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.15.tgz", + "integrity": "sha512-VrNANlmnWQnh5COXIIOQXM9oOJw7naGKlBT74ZOOR6lpVXc3gFEu9FJLDFcpCJ2j+NWr8TIwtWD//T6ZX6TKiQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/ip-address": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.3.1.tgz", + "integrity": "sha512-1e9d3kb97NHJTIJDZW9rKqW2h6+dFa50Dy0fpPSMQp2ADje5gvKsXmdiK6dwY5t76TaTt5+P5N1Y/LoToIxP6g==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-in-ssh": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", + "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/is-regexp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-3.1.0.tgz", + "integrity": "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jose": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.4.tgz", + "integrity": "sha512-N8acGzVsQy6M/fjFcxtysNc4Q379TcM5dM/qKkNtsHFji88yANnXTr7BLeP75iPnFwBfQzM/jg2BZ9+HZrHCZA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "license": "BSD-2-Clause" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.441.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.441.0.tgz", + "integrity": "sha512-0vfExYtvSDhkC2lqg0zYVW1Uu9GsI4knuV9GP9by5z0Xhc4Zi5RejTxfz9LsjRmCyWVzHCJvxGKZWcRyvQCWVg==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.1.tgz", + "integrity": "sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/next-themes": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", + "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/node-releases": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "license": "MIT" + }, + "node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nuqs": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/nuqs/-/nuqs-2.9.2.tgz", + "integrity": "sha512-SUrBU5PfLckv2SAquHkYs76s603vbjl2OLEc+jlL3sITwvJDbE/fg3vN7l9Rdp4WIUs6E0QD+m3DfH9QUQfLkg==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "1.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/franky47" + }, + "peerDependencies": { + "@remix-run/react": ">=2", + "@tanstack/react-router": "^1", + "next": ">=14.2.0", + "react": ">=18.2.0 || ^19.0.0-0", + "react-router": "^5 || ^6 || ^7 || ^8", + "react-router-dom": "^5 || ^6 || ^7" + }, + "peerDependenciesMeta": { + "@remix-run/react": { + "optional": true + }, + "@tanstack/react-router": { + "optional": true + }, + "next": { + "optional": true + }, + "react-router": { + "optional": true + }, + "react-router-dom": { + "optional": true + } + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-treeify": { + "version": "1.1.33", + "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", + "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/onetime/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/open": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz", + "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==", + "license": "MIT", + "dependencies": { + "default-browser": "^5.4.0", + "define-lazy-prop": "^3.0.0", + "is-in-ssh": "^1.0.0", + "is-inside-container": "^1.0.0", + "powershell-utils": "^0.1.0", + "wsl-utils": "^0.3.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-to-regexp": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/powershell-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", + "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-ms": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", + "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", + "license": "MIT", + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/radix-ui": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.6.7.tgz", + "integrity": "sha512-QBdhh1arIEUvPC0dQ5+nwWAxt7+N+oP/9jPwjJkGFoSk/sqxg32gJtSXGtFh8frAIcS6oC9cx2Q+7KYCQLOAeA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-accessible-icon": "1.1.15", + "@radix-ui/react-accordion": "1.2.20", + "@radix-ui/react-alert-dialog": "1.1.23", + "@radix-ui/react-arrow": "1.1.15", + "@radix-ui/react-aspect-ratio": "1.1.15", + "@radix-ui/react-avatar": "1.2.6", + "@radix-ui/react-checkbox": "1.3.11", + "@radix-ui/react-collapsible": "1.1.20", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-context-menu": "2.3.7", + "@radix-ui/react-dialog": "1.1.23", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-dropdown-menu": "2.1.24", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-form": "0.1.16", + "@radix-ui/react-hover-card": "1.1.23", + "@radix-ui/react-label": "2.1.15", + "@radix-ui/react-menu": "2.1.24", + "@radix-ui/react-menubar": "1.1.24", + "@radix-ui/react-navigation-menu": "1.2.22", + "@radix-ui/react-one-time-password-field": "0.1.16", + "@radix-ui/react-password-toggle-field": "0.1.11", + "@radix-ui/react-popover": "1.1.23", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-progress": "1.1.16", + "@radix-ui/react-radio-group": "1.4.7", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-scroll-area": "1.2.18", + "@radix-ui/react-select": "2.3.7", + "@radix-ui/react-separator": "1.1.15", + "@radix-ui/react-slider": "1.4.7", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-switch": "1.3.7", + "@radix-ui/react-tabs": "1.1.21", + "@radix-ui/react-toast": "1.2.23", + "@radix-ui/react-toggle": "1.1.18", + "@radix-ui/react-toggle-group": "1.1.19", + "@radix-ui/react-toolbar": "1.1.19", + "@radix-ui/react-tooltip": "1.2.16", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-escape-keydown": "1.1.5", + "@radix-ui/react-use-is-hydrated": "0.1.3", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-size": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11" + }, + "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/range-parser": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", + "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.8.tgz", + "integrity": "sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==", + "license": "MIT", + "peer": true + }, + "node_modules/react-redux": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.3.0.tgz", + "integrity": "sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==", + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz", + "integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz", + "integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.2", + "react-router": "6.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/recast": { + "version": "0.23.12", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.12.tgz", + "integrity": "sha512-dEWRjcINDu/F4l2dYx57ugBtD7HV9KXESyxhzw/MqWLeglJrsjJKqACPyUPg+6AF8mIgm+Zi0dZ3ACoIg+QtpA==", + "license": "MIT", + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/recharts": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.10.1.tgz", + "integrity": "sha512-QXFrvt6IVcw7eeZCoyXTwkIJAX3Dv1nyVhMicXJ47GsGDDpcN8z6o644DibE9XjpBTThtsomLKnTV6lc+cVFUA==", + "license": "MIT", + "workspaces": [ + "www" + ], + "dependencies": { + "@reduxjs/toolkit": "^1.9.0 || 2.x.x", + "clsx": "^2.1.1", + "decimal.js-light": "^2.5.1", + "es-toolkit": "^1.39.3", + "eventemitter3": "^5.0.1", + "immer": "^11.1.8", + "react-redux": "8.x.x || 9.x.x", + "reselect": "5.2.0", + "tiny-invariant": "^1.3.3", + "use-sync-external-store": "^1.2.2", + "victory-vendor": "^37.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reselect": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.2.0.tgz", + "integrity": "sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==", + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", + "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.1", + "@rollup/rollup-android-arm64": "4.60.1", + "@rollup/rollup-darwin-arm64": "4.60.1", + "@rollup/rollup-darwin-x64": "4.60.1", + "@rollup/rollup-freebsd-arm64": "4.60.1", + "@rollup/rollup-freebsd-x64": "4.60.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", + "@rollup/rollup-linux-arm-musleabihf": "4.60.1", + "@rollup/rollup-linux-arm64-gnu": "4.60.1", + "@rollup/rollup-linux-arm64-musl": "4.60.1", + "@rollup/rollup-linux-loong64-gnu": "4.60.1", + "@rollup/rollup-linux-loong64-musl": "4.60.1", + "@rollup/rollup-linux-ppc64-gnu": "4.60.1", + "@rollup/rollup-linux-ppc64-musl": "4.60.1", + "@rollup/rollup-linux-riscv64-gnu": "4.60.1", + "@rollup/rollup-linux-riscv64-musl": "4.60.1", + "@rollup/rollup-linux-s390x-gnu": "4.60.1", + "@rollup/rollup-linux-x64-gnu": "4.60.1", + "@rollup/rollup-linux-x64-musl": "4.60.1", + "@rollup/rollup-openbsd-x64": "4.60.1", + "@rollup/rollup-openharmony-arm64": "4.60.1", + "@rollup/rollup-win32-arm64-msvc": "4.60.1", + "@rollup/rollup-win32-ia32-msvc": "4.60.1", + "@rollup/rollup-win32-x64-gnu": "4.60.1", + "@rollup/rollup-win32-x64-msvc": "4.60.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shadcn": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/shadcn/-/shadcn-4.16.0.tgz", + "integrity": "sha512-kPr4RrQmbbZeAjwBYeBSpFvAHV8rkTlNPUluIxkRriq5TpevfFelVO5xvcF6oguHPVn0R6wPuVer4HudfcLy/A==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/parser": "^7.28.0", + "@babel/plugin-transform-typescript": "^7.28.0", + "@babel/preset-typescript": "^7.27.1", + "@dotenvx/dotenvx": "^1.48.4", + "@modelcontextprotocol/sdk": "^1.26.0", + "@types/validate-npm-package-name": "^4.0.2", + "browserslist": "^4.26.2", + "commander": "^14.0.0", + "cosmiconfig": "^9.0.0", + "dedent": "^1.6.0", + "deepmerge": "^4.3.1", + "diff": "^8.0.2", + "execa": "^9.6.0", + "fast-glob": "^3.3.3", + "fs-extra": "^11.3.1", + "fuzzysort": "^3.1.0", + "kleur": "^4.1.5", + "open": "^11.0.0", + "ora": "^8.2.0", + "postcss": "^8.5.6", + "postcss-selector-parser": "^7.1.0", + "prompts": "^2.4.2", + "recast": "^0.23.11", + "stringify-object": "^5.0.0", + "tailwind-merge": "^3.0.1", + "ts-morph": "^26.0.0", + "tsconfig-paths": "^4.2.0", + "undici": "^7.27.2", + "validate-npm-package-name": "^7.0.1", + "zod": "^3.24.1", + "zod-to-json-schema": "^3.24.6" + }, + "bin": { + "shadcn": "dist/index.js" + }, + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/shadcn/node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/shadcn/node_modules/postcss-selector-parser": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/sonner": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz", + "integrity": "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==", + "license": "MIT", + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stringify-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-5.0.0.tgz", + "integrity": "sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-keys": "^1.0.0", + "is-obj": "^3.0.0", + "is-regexp": "^3.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/stringify-object?sponsor=1" + } + }, + "node_modules/stringify-object/node_modules/is-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-3.0.0.tgz", + "integrity": "sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/systeminformation": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.33.1.tgz", + "integrity": "sha512-DEN6ICHk3Tk0Uf/hrAHh7xlt7iL5CJFBtPZinA0H62DrGG/KPKqq/Nzj6lCXPS4Ay/sf/14zNnk9LpqKzBIc+w==", + "license": "MIT", + "os": [ + "darwin", + "linux", + "win32", + "freebsd", + "openbsd", + "netbsd", + "sunos", + "android" + ], + "bin": { + "systeminformation": "lib/cli.js" + }, + "engines": { + "node": ">=10.0.0" + }, + "funding": { + "type": "Buy me a coffee", + "url": "https://www.buymeacoffee.com/systeminfo" + } + }, + "node_modules/tailwind-merge": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", + "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ts-morph": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-26.0.0.tgz", + "integrity": "sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==", + "license": "MIT", + "dependencies": { + "@ts-morph/common": "~0.27.0", + "code-block-writer": "^13.0.3" + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tw-animate-css": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz", + "integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Wombosvideo" + } + }, + "node_modules/type-is": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", + "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", + "license": "MIT", + "dependencies": { + "content-type": "^2.0.0", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/type-is/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", + "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/validate-npm-package-name": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz", + "integrity": "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==", + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/victory-vendor": { + "version": "37.3.6", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", + "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/wsl-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.1.tgz", + "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0", + "powershell-utils": "^0.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yocto-spinner": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-spinner/-/yocto-spinner-1.2.2.tgz", + "integrity": "sha512-DODGl1wJjA/s5pnJFKau9lIYHT81lnhob1i3e1TjxZRxEhWRKl74nTbWE6H5KlkViQQTo/Z29YFdxzTZAMY3ng==", + "license": "MIT", + "dependencies": { + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18.19" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.2.0.tgz", + "integrity": "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==", + "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", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", + "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25.28 || ^4" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..6483d63 --- /dev/null +++ b/package.json @@ -0,0 +1,42 @@ +{ + "name": "p2p-studio", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "typecheck": "tsc -b", + "preview": "vite preview" + }, + "dependencies": { + "@fontsource-variable/geist": "^5.3.0", + "@tailwindcss/vite": "^4.3.3", + "@tanstack/react-query": "^5.60.5", + "@tanstack/react-table": "^8.21.3", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "lucide-react": "^0.441.0", + "next-themes": "^0.4.6", + "nuqs": "^2.9.2", + "radix-ui": "^1.6.7", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^6.26.0", + "recharts": "^3.10.1", + "shadcn": "^4.16.0", + "sonner": "^2.0.7", + "tailwind-merge": "^3.6.0", + "tw-animate-css": "^1.4.0" + }, + "devDependencies": { + "@types/node": "^26.1.2", + "@types/react": "^18.3.5", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.1", + "tailwindcss": "^4.3.3", + "typescript": "~5.5.4", + "vite": "^5.4.2" + } +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..a11777c Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/zino-logo.svg b/public/zino-logo.svg new file mode 100644 index 0000000..76f11fa --- /dev/null +++ b/public/zino-logo.svg @@ -0,0 +1,9 @@ + + + + + + + + ZINO + diff --git a/public/zino.svg b/public/zino.svg new file mode 100644 index 0000000..662b67e --- /dev/null +++ b/public/zino.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/seed.sql b/seed.sql new file mode 100644 index 0000000..dc78efd --- /dev/null +++ b/seed.sql @@ -0,0 +1,47 @@ +-- App 20 Seed Script +-- Generated from local DB + + +-- Workflow +INSERT INTO tbl_appconfig_workflows (id, workflow_uid, version, app_id, content) VALUES (20109, 'wf_p2p_invoice_demo', '1', 20, '{"name": "P2P Invoice Validation", "states": [{"uid": "p2p-state-invoice-submitted", "name": "Invoice Submitted", "type": "STANDARD", "allowed_activities": ["p2p-act-request-clarification", "p2p-act-submit-recommendation"]}, {"uid": "p2p-state-ai-analysis", "name": "AI Analysis", "type": "STANDARD", "allowed_activities": ["p2p-act-request-clarification", "p2p-act-submit-recommendation"]}, {"uid": "p2p-state-awaiting-clarification", "name": "Awaiting Clarification", "type": "STANDARD", "allowed_activities": ["p2p-act-provide-clarification"]}, {"uid": "p2p-state-finance-review", "name": "Finance Review", "type": "STANDARD", "allowed_activities": ["p2p-act-approve-payment", "p2p-act-reject-payment", "p2p-act-hold-payment"]}, {"uid": "p2p-state-approved", "name": "Approved", "type": "END", "allowed_activities": []}, {"uid": "p2p-state-rejected", "name": "Rejected", "type": "END", "allowed_activities": []}, {"uid": "p2p-state-on-hold", "name": "On Hold", "type": "END", "allowed_activities": []}], "version": 1, "sg_rules": [], "activities": [{"uid": "p2p-act-submit-invoice", "name": "Submit Invoice", "type": "INIT"}, {"uid": "p2p-act-analyze-invoice", "name": "Analyze Invoice", "type": "NORMAL", "ai_confidence_threshold": 0.5}, {"uid": "p2p-act-request-clarification", "name": "Request Clarification", "type": "NORMAL"}, {"uid": "p2p-act-provide-clarification", "name": "Provide Clarification", "type": "NORMAL"}, {"uid": "p2p-act-submit-recommendation", "name": "Submit Recommendation", "type": "NORMAL"}, {"uid": "p2p-act-approve-payment", "name": "Approve Payment", "type": "NORMAL"}, {"uid": "p2p-act-reject-payment", "name": "Reject Payment", "type": "NORMAL"}, {"uid": "p2p-act-hold-payment", "name": "Hold Payment", "type": "NORMAL"}], "stage_gates": [], "transitions": [{"to_state_id": "p2p-state-invoice-submitted", "from_state_id": "", "by_activity_id": "p2p-act-submit-invoice", "transition_type": "INIT_TO_STATE"}, {"to_state_id": "p2p-state-awaiting-clarification", "from_state_id": "p2p-state-invoice-submitted", "by_activity_id": "p2p-act-request-clarification", "transition_type": "TO_STATE"}, {"to_state_id": "p2p-state-finance-review", "from_state_id": "p2p-state-invoice-submitted", "by_activity_id": "p2p-act-submit-recommendation", "transition_type": "TO_STATE"}, {"to_state_id": "p2p-state-awaiting-clarification", "from_state_id": "p2p-state-ai-analysis", "by_activity_id": "p2p-act-request-clarification", "transition_type": "TO_STATE"}, {"to_state_id": "p2p-state-finance-review", "from_state_id": "p2p-state-ai-analysis", "by_activity_id": "p2p-act-submit-recommendation", "transition_type": "TO_STATE"}, {"to_state_id": "p2p-state-ai-analysis", "from_state_id": "p2p-state-awaiting-clarification", "by_activity_id": "p2p-act-provide-clarification", "transition_type": "TO_STATE"}, {"to_state_id": "p2p-state-approved", "from_state_id": "p2p-state-finance-review", "by_activity_id": "p2p-act-approve-payment", "transition_type": "TO_STATE"}, {"to_state_id": "p2p-state-rejected", "from_state_id": "p2p-state-finance-review", "by_activity_id": "p2p-act-reject-payment", "transition_type": "TO_STATE"}, {"to_state_id": "p2p-state-on-hold", "from_state_id": "p2p-state-finance-review", "by_activity_id": "p2p-act-hold-payment", "transition_type": "TO_STATE"}], "workflow_id": "wf_p2p_invoice_demo", "activity_prefills": [], "activity_triggers": [{"nodes": [{"id": "a0a0a0a0-0000-4000-8000-000000093011", "name": "Start", "type": "start", "edges": [{"target": "a0a0a0a0-0000-4000-8000-000000093012", "source_handle": "output"}], "config": {}, "ui_config": null}, {"id": "a0a0a0a0-0000-4000-8000-000000093012", "name": "AI Employee", "type": "aiEmployee", "edges": [{"target": "a0a0a0a0-0000-4000-8000-000000093013", "source_handle": "output"}], "config": {"ai_user_id": "29100"}, "ui_config": null}, {"id": "a0a0a0a0-0000-4000-8000-000000093013", "name": "Complete", "type": "response", "edges": [], "config": {"message": "AI Employee task dispatched", "success": true, "status_code": 200}, "ui_config": null}], "trigger_uid": "trigger_p2p_submit", "activity_uid": "p2p-act-submit-invoice", "trigger_config": {}}, {"nodes": [{"id": "a0a0a0a0-0000-4000-8000-000000093041", "name": "Start", "type": "start", "edges": [{"target": "a0a0a0a0-0000-4000-8000-000000093042", "source_handle": "output"}], "config": {}, "ui_config": null}, {"id": "a0a0a0a0-0000-4000-8000-000000093042", "name": "AI Employee", "type": "aiEmployee", "edges": [{"target": "a0a0a0a0-0000-4000-8000-000000093043", "source_handle": "output"}], "config": {"ai_user_id": "29100"}, "ui_config": null}, {"id": "a0a0a0a0-0000-4000-8000-000000093043", "name": "Complete", "type": "response", "edges": [], "config": {"message": "AI Employee task dispatched", "success": true, "status_code": 200}, "ui_config": null}], "trigger_uid": "trigger_p2p_clarify", "activity_uid": "p2p-act-provide-clarification", "trigger_config": {}}], "activity_data_fields": [{"data_fields": [{"id": "approved_amount", "uid": "p2p-field-9423", "name": "Approved Amount", "type": "local", "data_type": "number", "mandatory": true}, {"id": "reviewer_notes", "uid": "p2p-field-9424", "name": "Reviewer Notes", "type": "local", "data_type": "text", "mandatory": false}], "activity_uid": "p2p-act-approve-payment", "activity_name": "Approve Payment"}, {"data_fields": [{"id": "rejection_reason", "uid": "p2p-field-9425", "name": "Rejection Reason", "type": "local", "data_type": "text", "mandatory": true}, {"id": "reviewer_notes", "uid": "p2p-field-9426", "name": "Reviewer Notes", "type": "local", "data_type": "text", "mandatory": false}], "activity_uid": "p2p-act-reject-payment", "activity_name": "Reject Payment"}, {"data_fields": [{"id": "hold_reason", "uid": "p2p-field-9427", "name": "Hold Reason", "type": "local", "data_type": "text", "mandatory": true}, {"id": "reviewer_notes", "uid": "p2p-field-9428", "name": "Reviewer Notes", "type": "local", "data_type": "text", "mandatory": false}], "activity_uid": "p2p-act-hold-payment", "activity_name": "Hold Payment"}, {"data_fields": [{"id": "vendor_id", "uid": "p2p-field-9401", "name": "Vendor ID", "type": "local", "data_type": "text", "mandatory": true}, {"id": "vendor_name", "uid": "p2p-field-9402", "name": "Vendor Name", "type": "local", "data_type": "text", "mandatory": true}, {"id": "invoice_number", "uid": "p2p-field-9403", "name": "Invoice Number", "type": "local", "data_type": "text", "mandatory": true}, {"id": "invoice_date", "uid": "p2p-field-9404", "name": "Invoice Date", "type": "local", "data_type": "date", "mandatory": true}, {"id": "po_number", "uid": "p2p-field-9405", "name": "PO Number", "type": "local", "data_type": "text", "mandatory": true}, {"id": "currency", "uid": "p2p-field-9406", "name": "Currency", "type": "local", "data_type": "text", "mandatory": false}, {"id": "total_amount", "uid": "p2p-field-9407", "name": "Total Amount", "type": "local", "data_type": "number", "mandatory": true}, {"id": "tax_amount", "uid": "p2p-field-9408", "name": "Tax Amount", "type": "local", "data_type": "number", "mandatory": false}, {"id": "payment_terms", "uid": "p2p-field-9409", "name": "Payment Terms", "type": "local", "data_type": "text", "mandatory": false}, {"id": "notes", "uid": "p2p-field-9410", "name": "Notes", "type": "local", "data_type": "text", "mandatory": false}], "activity_uid": "p2p-act-submit-invoice", "activity_name": "Submit Invoice"}, {"data_fields": [{"id": "target_department", "uid": "p2p-field-9411", "name": "Target Department", "type": "local", "data_type": "text", "mandatory": true}, {"id": "clarification_question", "uid": "p2p-field-9412", "name": "Question", "type": "local", "data_type": "text", "mandatory": true}, {"id": "clarification_context", "uid": "p2p-field-9413", "name": "Context", "type": "local", "data_type": "text", "mandatory": false}, {"id": "analysis_so_far", "uid": "p2p-field-9414", "name": "Analysis So Far", "type": "local", "data_type": "text", "mandatory": false}], "activity_uid": "p2p-act-request-clarification", "activity_name": "Request Clarification"}, {"data_fields": [{"id": "response_text", "uid": "p2p-field-9415", "name": "Response", "type": "local", "data_type": "text", "mandatory": true}, {"id": "confirmed_quantity", "uid": "p2p-field-9416", "name": "Confirmed Quantity", "type": "local", "data_type": "number", "mandatory": false}, {"id": "response_notes", "uid": "p2p-field-9417", "name": "Additional Notes", "type": "local", "data_type": "text", "mandatory": false}], "activity_uid": "p2p-act-provide-clarification", "activity_name": "Provide Clarification"}, {"data_fields": [{"id": "recommendation", "uid": "p2p-field-9418", "name": "Recommendation", "type": "local", "data_type": "text", "mandatory": true}, {"id": "recommended_amount", "uid": "p2p-field-9419", "name": "Recommended Payment Amount", "type": "local", "data_type": "number", "mandatory": false}, {"id": "match_summary", "uid": "p2p-field-9420", "name": "Match Summary", "type": "local", "data_type": "text", "mandatory": false}, {"id": "ai_reasoning", "uid": "p2p-field-9421", "name": "AI Reasoning", "type": "local", "data_type": "text", "mandatory": false}, {"id": "ai_confidence", "uid": "p2p-field-9422", "name": "AI Confidence", "type": "local", "data_type": "number", "mandatory": false}], "activity_uid": "p2p-act-submit-recommendation", "activity_name": "Submit Recommendation"}], "activity_permissions": [{"id": "p2p-act-submit-invoice", "allowed_roles": [{"role": "p2p_vendor", "positions": ""}], "allowed_groups": [], "dynamic_rbac_allowed": false, "only_roles_positions": false}, {"id": "p2p-act-analyze-invoice", "allowed_roles": [{"role": "p2p_ai_finance", "positions": ""}], "allowed_groups": [], "dynamic_rbac_allowed": false, "only_roles_positions": false}, {"id": "p2p-act-request-clarification", "allowed_roles": [{"role": "p2p_ai_finance", "positions": ""}], "allowed_groups": [], "dynamic_rbac_allowed": false, "only_roles_positions": false}, {"id": "p2p-act-provide-clarification", "allowed_roles": [{"role": "p2p_warehouse", "positions": ""}, {"role": "p2p_procurement", "positions": ""}, {"role": "p2p_ap_team", "positions": ""}], "allowed_groups": [], "dynamic_rbac_allowed": false, "only_roles_positions": false}, {"id": "p2p-act-submit-recommendation", "allowed_roles": [{"role": "p2p_ai_finance", "positions": ""}], "allowed_groups": [], "dynamic_rbac_allowed": false, "only_roles_positions": false}, {"id": "p2p-act-approve-payment", "allowed_roles": [{"role": "p2p_finance_reviewer", "positions": ""}], "allowed_groups": [], "dynamic_rbac_allowed": false, "only_roles_positions": false}, {"id": "p2p-act-reject-payment", "allowed_roles": [{"role": "p2p_finance_reviewer", "positions": ""}], "allowed_groups": [], "dynamic_rbac_allowed": false, "only_roles_positions": false}, {"id": "p2p-act-hold-payment", "allowed_roles": [{"role": "p2p_finance_reviewer", "positions": ""}], "allowed_groups": [], "dynamic_rbac_allowed": false, "only_roles_positions": false}], "workflow_data_fields": null}'::jsonb) ON CONFLICT (id) DO UPDATE SET content = EXCLUDED.content; + +-- Record Views +INSERT INTO tbl_appconfig_recordview (id, rv_uid, rv_description, workflow_uid, app_id, config) VALUES (20034, 'p2p-rv-all-invoices', 'All invoice instances across all states', 'wf_p2p_invoice_demo', 20, '{"fields": [{"type": "system-global", "data_type": "text", "field_key": "instance_id", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Instance ID"}, {"type": "system-global", "data_type": "text", "field_key": "current_state_name", "field_uid": "", "is_filter": true, "is_search": false, "activity_id": "SYSTEM", "output_label": "Current State"}, {"type": "local", "data_type": "text", "field_key": "vendor_name", "field_uid": "p2p-field-9401", "is_filter": true, "is_search": true, "activity_id": "p2p-act-submit-invoice", "output_label": "Vendor"}, {"type": "local", "data_type": "text", "field_key": "invoice_number", "field_uid": "p2p-field-9403", "is_filter": false, "is_search": true, "activity_id": "p2p-act-submit-invoice", "output_label": "Invoice #"}, {"type": "local", "data_type": "text", "field_key": "po_number", "field_uid": "p2p-field-9405", "is_filter": false, "is_search": true, "activity_id": "p2p-act-submit-invoice", "output_label": "PO #"}, {"type": "local", "data_type": "number", "field_key": "total_amount", "field_uid": "p2p-field-9407", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Amount"}, {"type": "system-global", "data_type": "datetime", "field_key": "created_at", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Created"}]}'::jsonb) ON CONFLICT (id) DO UPDATE SET config = EXCLUDED.config; +INSERT INTO tbl_appconfig_recordview (id, rv_uid, rv_description, workflow_uid, app_id, config) VALUES (20035, 'p2p-rv-pending-clarifications', 'Invoices awaiting department clarification', 'wf_p2p_invoice_demo', 20, '{"fields": [{"type": "system-global", "data_type": "text", "field_key": "instance_id", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Instance ID"}, {"type": "local", "data_type": "text", "field_key": "vendor_name", "field_uid": "p2p-field-9402", "is_filter": false, "is_search": true, "activity_id": "p2p-act-submit-invoice", "output_label": "Vendor"}, {"type": "local", "data_type": "text", "field_key": "invoice_number", "field_uid": "p2p-field-9403", "is_filter": false, "is_search": true, "activity_id": "p2p-act-submit-invoice", "output_label": "Invoice #"}, {"type": "local", "data_type": "number", "field_key": "total_amount", "field_uid": "p2p-field-9407", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Amount"}, {"type": "local", "data_type": "text", "field_key": "target_department", "field_uid": "p2p-field-9411", "is_filter": true, "is_search": false, "activity_id": "p2p-act-request-clarification", "output_label": "Department"}, {"type": "system-global", "data_type": "datetime", "field_key": "created_at", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Created"}], "prefilters": {"logic": "AND", "conditions": [{"value": "Awaiting Clarification", "operator": "equals", "data_type": "text", "field_key": "current_state_name"}]}}'::jsonb) ON CONFLICT (id) DO UPDATE SET config = EXCLUDED.config; +INSERT INTO tbl_appconfig_recordview (id, rv_uid, rv_description, workflow_uid, app_id, config) VALUES (20037, 'p2p-rv-vendor-invoices', 'Vendor''s submitted invoices with status tracking', 'wf_p2p_invoice_demo', 20, '{"fields": [{"type": "system-global", "data_type": "text", "field_key": "instance_id", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Instance ID"}, {"type": "system-global", "data_type": "text", "field_key": "current_state_name", "field_uid": "", "is_filter": true, "is_search": false, "activity_id": "SYSTEM", "output_label": "Status"}, {"type": "local", "data_type": "text", "field_key": "invoice_number", "field_uid": "p2p-field-9403", "is_filter": false, "is_search": true, "activity_id": "p2p-act-submit-invoice", "output_label": "Invoice #"}, {"type": "local", "data_type": "text", "field_key": "po_number", "field_uid": "p2p-field-9405", "is_filter": false, "is_search": true, "activity_id": "p2p-act-submit-invoice", "output_label": "PO #"}, {"type": "local", "data_type": "number", "field_key": "total_amount", "field_uid": "p2p-field-9407", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Amount"}, {"type": "system-global", "data_type": "datetime", "field_key": "created_at", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Submitted"}]}'::jsonb) ON CONFLICT (id) DO UPDATE SET config = EXCLUDED.config; +INSERT INTO tbl_appconfig_recordview (id, rv_uid, rv_description, workflow_uid, app_id, config) VALUES (20036, 'p2p-rv-finance-review-queue', 'Invoices ready for finance review with AI recommendations', 'wf_p2p_invoice_demo', 20, '{"fields": [{"type": "system-global", "data_type": "text", "field_key": "instance_id", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Instance ID"}, {"type": "local", "data_type": "text", "field_key": "vendor_name", "field_uid": "p2p-field-9402", "is_filter": false, "is_search": true, "activity_id": "p2p-act-submit-invoice", "output_label": "Vendor"}, {"type": "local", "data_type": "text", "field_key": "invoice_number", "field_uid": "p2p-field-9403", "is_filter": false, "is_search": true, "activity_id": "p2p-act-submit-invoice", "output_label": "Invoice #"}, {"type": "local", "data_type": "number", "field_key": "total_amount", "field_uid": "p2p-field-9407", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Amount"}, {"type": "local", "data_type": "text", "field_key": "recommendation", "field_uid": "p2p-field-9418", "is_filter": true, "is_search": false, "activity_id": "p2p-act-submit-recommendation", "output_label": "AI Recommendation"}, {"type": "local", "data_type": "number", "field_key": "recommended_amount", "field_uid": "p2p-field-9419", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-recommendation", "output_label": "Recommended Amt"}, {"type": "system-global", "data_type": "datetime", "field_key": "created_at", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Created"}], "prefilters": {"logic": "AND", "conditions": [{"value": "Finance Review", "operator": "equals", "data_type": "text", "field_key": "current_state_name"}]}}'::jsonb) ON CONFLICT (id) DO UPDATE SET config = EXCLUDED.config; + +-- Detail Views +INSERT INTO tbl_appconfig_detailview (id, dv_uid, dv_description, workflow_uid, app_id, config) VALUES (20014, 'p2p-dv-clarification-detail', 'AI question and context for department response', 'wf_p2p_invoice_demo', 20, '{"fields": [{"type": "system-global", "data_type": "text", "field_key": "instance_id", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Instance ID"}, {"type": "local", "data_type": "text", "field_key": "vendor_name", "field_uid": "p2p-field-9402", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Vendor"}, {"type": "local", "data_type": "text", "field_key": "invoice_number", "field_uid": "p2p-field-9403", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Invoice #"}, {"type": "local", "data_type": "text", "field_key": "po_number", "field_uid": "p2p-field-9405", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "PO #"}, {"type": "local", "data_type": "number", "field_key": "total_amount", "field_uid": "p2p-field-9407", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Amount"}, {"type": "local", "data_type": "text", "field_key": "target_department", "field_uid": "p2p-field-9411", "is_filter": false, "is_search": false, "activity_id": "p2p-act-request-clarification", "output_label": "Target Department"}, {"type": "local", "data_type": "text", "field_key": "clarification_question", "field_uid": "p2p-field-9412", "is_filter": false, "is_search": false, "activity_id": "p2p-act-request-clarification", "output_label": "AI Question"}, {"type": "local", "data_type": "text", "field_key": "clarification_context", "field_uid": "p2p-field-9413", "is_filter": false, "is_search": false, "activity_id": "p2p-act-request-clarification", "output_label": "Context"}, {"type": "local", "data_type": "text", "field_key": "analysis_so_far", "field_uid": "p2p-field-9414", "is_filter": false, "is_search": false, "activity_id": "p2p-act-request-clarification", "output_label": "Analysis So Far"}]}'::jsonb) ON CONFLICT (id) DO UPDATE SET config = EXCLUDED.config; +INSERT INTO tbl_appconfig_detailview (id, dv_uid, dv_description, workflow_uid, app_id, config) VALUES (20015, 'p2p-dv-finance-review-detail', 'AI recommendation with full decision trail for finance reviewer', 'wf_p2p_invoice_demo', 20, '{"fields": [{"type": "system-global", "data_type": "text", "field_key": "instance_id", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Instance ID"}, {"type": "system-global", "data_type": "text", "field_key": "current_state_name", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Status"}, {"type": "local", "data_type": "text", "field_key": "vendor_name", "field_uid": "p2p-field-9402", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Vendor"}, {"type": "local", "data_type": "text", "field_key": "invoice_number", "field_uid": "p2p-field-9403", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Invoice #"}, {"type": "local", "data_type": "text", "field_key": "po_number", "field_uid": "p2p-field-9405", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "PO #"}, {"type": "local", "data_type": "number", "field_key": "total_amount", "field_uid": "p2p-field-9407", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Invoice Amount"}, {"type": "local", "data_type": "number", "field_key": "tax_amount", "field_uid": "p2p-field-9408", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Tax"}, {"type": "local", "data_type": "text", "field_key": "recommendation", "field_uid": "p2p-field-9418", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-recommendation", "output_label": "AI Recommendation"}, {"type": "local", "data_type": "number", "field_key": "recommended_amount", "field_uid": "p2p-field-9419", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-recommendation", "output_label": "Recommended Amount"}, {"type": "local", "data_type": "text", "field_key": "match_summary", "field_uid": "p2p-field-9420", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-recommendation", "output_label": "Match Summary"}, {"type": "local", "data_type": "text", "field_key": "ai_reasoning", "field_uid": "p2p-field-9421", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-recommendation", "output_label": "AI Reasoning"}, {"type": "local", "data_type": "number", "field_key": "ai_confidence", "field_uid": "p2p-field-9422", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-recommendation", "output_label": "AI Confidence"}]}'::jsonb) ON CONFLICT (id) DO UPDATE SET config = EXCLUDED.config; +INSERT INTO tbl_appconfig_detailview (id, dv_uid, dv_description, workflow_uid, app_id, config) VALUES (20013, 'p2p-dv-invoice-detail', 'Full invoice detail with AI analysis trail', 'wf_p2p_invoice_demo', 20, '{"fields": [{"type": "system-global", "data_type": "text", "field_key": "instance_id", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Instance ID"}, {"type": "system-global", "data_type": "text", "field_key": "current_state_name", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Status"}, {"type": "system-global", "data_type": "datetime", "field_key": "created_at", "field_uid": "", "is_filter": false, "is_search": false, "activity_id": "SYSTEM", "output_label": "Created"}, {"type": "local", "data_type": "text", "field_key": "vendor_id", "field_uid": "p2p-field-9401", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Vendor ID"}, {"type": "local", "data_type": "text", "field_key": "vendor_name", "field_uid": "p2p-field-9402", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Vendor Name"}, {"type": "local", "data_type": "text", "field_key": "invoice_number", "field_uid": "p2p-field-9403", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Invoice Number"}, {"type": "local", "data_type": "date", "field_key": "invoice_date", "field_uid": "p2p-field-9404", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Invoice Date"}, {"type": "local", "data_type": "text", "field_key": "po_number", "field_uid": "p2p-field-9405", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "PO Number"}, {"type": "local", "data_type": "number", "field_key": "total_amount", "field_uid": "p2p-field-9407", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Total Amount"}, {"type": "local", "data_type": "number", "field_key": "tax_amount", "field_uid": "p2p-field-9408", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Tax Amount"}, {"type": "local", "data_type": "text", "field_key": "payment_terms", "field_uid": "p2p-field-9409", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Payment Terms"}, {"type": "local", "data_type": "text", "field_key": "notes", "field_uid": "p2p-field-9410", "is_filter": false, "is_search": false, "activity_id": "p2p-act-submit-invoice", "output_label": "Vendor Notes"}]}'::jsonb) ON CONFLICT (id) DO UPDATE SET config = EXCLUDED.config; + +-- Screens +INSERT INTO tbl_appconfig_screens (id, source_screen_id, app_id, screen_name, device, description, layout, permissions) VALUES (20027, 29643, 20, 'P2P - Finance Review Detail', 'desktop', 'P2P - Finance Review Detail', '[{"type": "element", "style": {"width": "100%", "padding": "16px"}, "config": {"type": "detailsview", "view_id": "29613"}}]'::jsonb, NULL) ON CONFLICT (id) DO UPDATE SET layout = EXCLUDED.layout; +INSERT INTO tbl_appconfig_screens (id, source_screen_id, app_id, screen_name, device, description, layout, permissions) VALUES (20010, 29631, 20, 'P2P - My Invoices', 'desktop', 'P2P - My Invoices', '[{"type": "element", "style": {"marginBottom": "16px"}, "config": {"icon": "add", "name": "+ Submit New Invoice", "type": "button", "params": {"workflow_id": "wf_p2p_invoice_demo", "activity_id_init": "p2p-act-submit-invoice"}, "action_end": [{"type": "refresh_page"}], "job_template": "start_state_machine"}, "classes": ["z-btn-primary"]}, {"type": "element", "style": {"width": "100%"}, "config": {"type": "recordsview", "view_id": "29601"}}]'::jsonb, NULL) ON CONFLICT (id) DO UPDATE SET layout = EXCLUDED.layout; +INSERT INTO tbl_appconfig_screens (id, source_screen_id, app_id, screen_name, device, description, layout, permissions) VALUES (20011, 29632, 20, 'P2P - Pending Clarifications', 'desktop', 'P2P - Pending Clarifications', '[{"type": "element", "style": {"width": "100%"}, "config": {"type": "recordsview", "view_id": "29602"}}]'::jsonb, NULL) ON CONFLICT (id) DO UPDATE SET layout = EXCLUDED.layout; +INSERT INTO tbl_appconfig_screens (id, source_screen_id, app_id, screen_name, device, description, layout, permissions) VALUES (20012, 29633, 20, 'P2P - Finance Review', 'desktop', 'P2P - Finance Review', '[{"type": "element", "style": {"width": "100%"}, "config": {"type": "recordsview", "view_id": "29603"}}]'::jsonb, NULL) ON CONFLICT (id) DO UPDATE SET layout = EXCLUDED.layout; +INSERT INTO tbl_appconfig_screens (id, source_screen_id, app_id, screen_name, device, description, layout, permissions) VALUES (20013, 29634, 20, 'P2P - All Invoices', 'desktop', 'P2P - All Invoices', '[{"type": "element", "style": {"width": "100%"}, "config": {"type": "recordsview", "view_id": "29604"}}]'::jsonb, NULL) ON CONFLICT (id) DO UPDATE SET layout = EXCLUDED.layout; +INSERT INTO tbl_appconfig_screens (id, source_screen_id, app_id, screen_name, device, description, layout, permissions) VALUES (20025, 29641, 20, 'P2P - Invoice Detail', 'desktop', 'P2P - Invoice Detail', '[{"type": "element", "style": {"width": "100%", "padding": "16px"}, "config": {"type": "detailsview", "view_id": "29611"}}]'::jsonb, NULL) ON CONFLICT (id) DO UPDATE SET layout = EXCLUDED.layout; +INSERT INTO tbl_appconfig_screens (id, source_screen_id, app_id, screen_name, device, description, layout, permissions) VALUES (20026, 29642, 20, 'P2P - Clarification Detail', 'desktop', 'P2P - Clarification Detail', '[{"type": "element", "style": {"width": "100%", "padding": "16px"}, "config": {"type": "detailsview", "view_id": "29612"}}]'::jsonb, NULL) ON CONFLICT (id) DO UPDATE SET layout = EXCLUDED.layout; + +-- RV Screens +INSERT INTO tbl_appconfig_rv_screens (id, source_screen_id, app_id, screen_name, device, description, layout, rv_template_id) VALUES (20001, 29601, 20, 'Vendor - My Invoices', 'desktop', 'Vendor - My Invoices', '[{"type": "element", "style": {}, "config": {"type": "rv_table", "columns": [{"id": "current_state_name", "display": "Status", "key_name": "current_state_name", "data_type": "text"}, {"id": "invoice_number", "display": "Invoice #", "key_name": "invoice_number", "data_type": "text"}, {"id": "po_number", "display": "PO #", "key_name": "po_number", "data_type": "text"}, {"id": "total_amount", "display": "Amount", "key_name": "total_amount", "data_type": "number"}, {"id": "created_at", "display": "Submitted", "key_name": "created_at", "data_type": "datetime"}], "view_id": "29601", "on_row_click": {"screen_id": "29641", "job_template": "navigate_to_screen"}}}]'::jsonb, 29504) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_rv_screens (id, source_screen_id, app_id, screen_name, device, description, layout, rv_template_id) VALUES (20002, 29602, 20, 'Department - Pending Clarifications', 'desktop', 'Department - Pending Clarifications', '[{"type": "element", "style": {}, "config": {"type": "rv_table", "columns": [{"id": "vendor_name", "display": "Vendor", "key_name": "vendor_name", "data_type": "text"}, {"id": "invoice_number", "display": "Invoice #", "key_name": "invoice_number", "data_type": "text"}, {"id": "total_amount", "display": "Amount", "key_name": "total_amount", "data_type": "number"}, {"id": "target_department", "display": "Department", "key_name": "target_department", "data_type": "text"}, {"id": "created_at", "display": "Created", "key_name": "created_at", "data_type": "datetime"}], "view_id": "29602", "on_row_click": {"screen_id": "29642", "job_template": "navigate_to_screen"}}}]'::jsonb, 29502) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_rv_screens (id, source_screen_id, app_id, screen_name, device, description, layout, rv_template_id) VALUES (20003, 29603, 20, 'Finance - Review Queue', 'desktop', 'Finance - Review Queue', '[{"type": "element", "style": {}, "config": {"type": "rv_table", "columns": [{"id": "vendor_name", "display": "Vendor", "key_name": "vendor_name", "data_type": "text"}, {"id": "invoice_number", "display": "Invoice #", "key_name": "invoice_number", "data_type": "text"}, {"id": "total_amount", "display": "Amount", "key_name": "total_amount", "data_type": "number"}, {"id": "recommendation", "display": "AI Recommendation", "key_name": "recommendation", "data_type": "text"}, {"id": "recommended_amount", "display": "Recommended Amt", "key_name": "recommended_amount", "data_type": "number"}, {"id": "created_at", "display": "Created", "key_name": "created_at", "data_type": "datetime"}], "view_id": "29603", "on_row_click": {"screen_id": "29643", "job_template": "navigate_to_screen"}}}]'::jsonb, 29503) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_rv_screens (id, source_screen_id, app_id, screen_name, device, description, layout, rv_template_id) VALUES (20004, 29604, 20, 'Admin - All Invoices', 'desktop', 'Admin - All Invoices', '[{"type": "element", "style": {}, "config": {"type": "rv_table", "columns": [{"id": "current_state_name", "display": "Status", "key_name": "current_state_name", "data_type": "text"}, {"id": "vendor_name", "display": "Vendor", "key_name": "vendor_name", "data_type": "text"}, {"id": "invoice_number", "display": "Invoice #", "key_name": "invoice_number", "data_type": "text"}, {"id": "po_number", "display": "PO #", "key_name": "po_number", "data_type": "text"}, {"id": "total_amount", "display": "Amount", "key_name": "total_amount", "data_type": "number"}, {"id": "created_at", "display": "Created", "key_name": "created_at", "data_type": "datetime"}], "view_id": "29604", "on_row_click": {"screen_id": "29641", "job_template": "navigate_to_screen"}}}]'::jsonb, 29501) ON CONFLICT (id) DO NOTHING; + +-- DV Screens +INSERT INTO tbl_appconfig_dv_screens (id, source_screen_id, app_id, screen_name, device, description, layout, dv_template_id) VALUES (20004, 29611, 20, 'Invoice Detail View', 'desktop', 'Invoice Detail View', '[{"type": "element", "style": {"fontSize": "16px", "marginTop": "20px", "fontWeight": "700", "borderBottom": "1px solid #e2e8f0", "marginBottom": "8px", "paddingBottom": "6px"}, "config": {"name": "Invoice Details", "type": "label"}, "classes": []}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Status", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Status", "keyName": "current_state_name"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Vendor", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Vendor", "keyName": "vendor_name"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Invoice Number", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Invoice #", "keyName": "invoice_number"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Invoice Date", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Date", "keyName": "invoice_date"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "PO Number", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "PO #", "keyName": "po_number"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Total Amount", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Amount", "keyName": "total_amount"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Tax Amount", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Tax", "keyName": "tax_amount"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Payment Terms", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Terms", "keyName": "payment_terms"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Vendor Notes", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Notes", "keyName": "notes"}}}]'::jsonb, 29511) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_dv_screens (id, source_screen_id, app_id, screen_name, device, description, layout, dv_template_id) VALUES (20006, 29613, 20, 'Finance Review Detail View', 'desktop', 'Finance Review Detail View', '[{"type": "element", "style": {"fontSize": "16px", "marginTop": "20px", "fontWeight": "700", "borderBottom": "1px solid #e2e8f0", "marginBottom": "8px", "paddingBottom": "6px"}, "config": {"name": "Invoice Details", "type": "label"}, "classes": []}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Status", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Status", "keyName": "current_state_name"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Vendor", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Vendor", "keyName": "vendor_name"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Invoice Number", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Invoice #", "keyName": "invoice_number"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "PO Number", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "PO #", "keyName": "po_number"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Invoice Amount", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Amount", "keyName": "total_amount"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Tax", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Tax", "keyName": "tax_amount"}}}, {"type": "element", "style": {"fontSize": "16px", "marginTop": "20px", "fontWeight": "700", "borderBottom": "1px solid #e2e8f0", "marginBottom": "8px", "paddingBottom": "6px"}, "config": {"name": "AI Recommendation", "type": "label"}, "classes": []}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Recommendation", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Recommendation", "keyName": "recommendation"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Recommended Amount", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Amount", "keyName": "recommended_amount"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Match Summary", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Match Summary", "keyName": "match_summary"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "AI Reasoning", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Reasoning", "keyName": "ai_reasoning"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "AI Confidence", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Confidence", "keyName": "ai_confidence"}}}, {"type": "element", "style": {"display": "inline-block", "marginTop": "20px", "marginRight": "8px"}, "config": {"icon": "check_circle", "name": "Approve Payment", "type": "button", "params": {"activity_id": "p2p-act-approve-payment", "workflow_id": "wf_p2p_invoice_demo"}, "action_end": [{"type": "refresh_page"}], "job_template": "perform_activity"}, "classes": ["z-btn-primary"]}, {"type": "element", "style": {"display": "inline-block", "marginTop": "20px", "marginRight": "8px"}, "config": {"icon": "cancel", "name": "Reject Payment", "type": "button", "params": {"activity_id": "p2p-act-reject-payment", "workflow_id": "wf_p2p_invoice_demo"}, "action_end": [{"type": "refresh_page"}], "job_template": "perform_activity"}, "classes": ["z-btn-outline"]}, {"type": "element", "style": {"display": "inline-block", "marginTop": "20px"}, "config": {"icon": "pause_circle", "name": "Hold Payment", "type": "button", "params": {"activity_id": "p2p-act-hold-payment", "workflow_id": "wf_p2p_invoice_demo"}, "action_end": [{"type": "refresh_page"}], "job_template": "perform_activity"}, "classes": ["z-btn-outline"]}]'::jsonb, 29513) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_dv_screens (id, source_screen_id, app_id, screen_name, device, description, layout, dv_template_id) VALUES (20005, 29612, 20, 'Clarification Detail View', 'desktop', 'Clarification Detail View', '[{"type": "element", "style": {"fontSize": "16px", "marginTop": "20px", "fontWeight": "700", "borderBottom": "1px solid #e2e8f0", "marginBottom": "8px", "paddingBottom": "6px"}, "config": {"name": "Invoice Summary", "type": "label"}, "classes": []}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Vendor", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Vendor", "keyName": "vendor_name"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Invoice Number", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Invoice #", "keyName": "invoice_number"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "PO Number", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "PO #", "keyName": "po_number"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Amount", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Amount", "keyName": "total_amount"}}}, {"type": "element", "style": {"fontSize": "16px", "marginTop": "20px", "fontWeight": "700", "borderBottom": "1px solid #e2e8f0", "marginBottom": "8px", "paddingBottom": "6px"}, "config": {"name": "AI Clarification Request", "type": "label"}, "classes": []}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Target Department", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Department", "keyName": "target_department"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Question from AI", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Question", "keyName": "clarification_question"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Context", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Context", "keyName": "clarification_context"}}}, {"type": "element", "style": {"color": "#64748b", "fontSize": "13px", "marginTop": "12px", "fontWeight": "600"}, "config": {"name": "Analysis So Far", "type": "label"}, "classes": []}, {"type": "element", "style": {"marginBottom": "4px"}, "config": {"type": "field", "field": {"label": "Analysis", "keyName": "analysis_so_far"}}}, {"type": "element", "style": {"marginTop": "20px"}, "config": {"icon": "reply", "name": "Respond to Clarification", "type": "button", "params": {"activity_id": "p2p-act-provide-clarification", "workflow_id": "wf_p2p_invoice_demo"}, "action_end": [{"type": "refresh_page"}], "job_template": "perform_activity"}, "classes": ["z-btn-primary"]}]'::jsonb, 29512) ON CONFLICT (id) DO NOTHING; + +-- Form Screens +INSERT INTO tbl_appconfig_form_screens (id, source_form_id, activity_uid, device_type, layout, grid_config, app_id) VALUES (20136, 20094, 'p2p-act-submit-invoice', 'desktop', '[]'::jsonb, '[{"h": 1, "i": "p2p-field-9401", "w": 6, "x": 0, "y": 0}, {"h": 1, "i": "p2p-field-9402", "w": 6, "x": 6, "y": 0}, {"h": 1, "i": "p2p-field-9403", "w": 6, "x": 0, "y": 1}, {"h": 1, "i": "p2p-field-9404", "w": 6, "x": 6, "y": 1}, {"h": 1, "i": "p2p-field-9405", "w": 6, "x": 0, "y": 2}, {"h": 1, "i": "p2p-field-9406", "w": 6, "x": 6, "y": 2}, {"h": 1, "i": "p2p-field-9407", "w": 6, "x": 0, "y": 3}, {"h": 1, "i": "p2p-field-9408", "w": 6, "x": 6, "y": 3}, {"h": 1, "i": "p2p-field-9409", "w": 6, "x": 0, "y": 4}, {"h": 1, "i": "p2p-field-9410", "w": 6, "x": 6, "y": 4}]'::jsonb, 20) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_form_screens (id, source_form_id, activity_uid, device_type, layout, grid_config, app_id) VALUES (20137, 20095, 'p2p-act-provide-clarification', 'desktop', '[]'::jsonb, '[{"h": 1, "i": "p2p-field-9415", "w": 12, "x": 0, "y": 0}, {"h": 1, "i": "p2p-field-9416", "w": 12, "x": 0, "y": 1}, {"h": 1, "i": "p2p-field-9417", "w": 12, "x": 0, "y": 2}]'::jsonb, 20) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_form_screens (id, source_form_id, activity_uid, device_type, layout, grid_config, app_id) VALUES (20138, 20096, 'p2p-act-approve-payment', 'desktop', '[]'::jsonb, '[{"h": 1, "i": "p2p-field-9423", "w": 6, "x": 0, "y": 0}, {"h": 1, "i": "p2p-field-9424", "w": 6, "x": 6, "y": 0}]'::jsonb, 20) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_form_screens (id, source_form_id, activity_uid, device_type, layout, grid_config, app_id) VALUES (20139, 20097, 'p2p-act-reject-payment', 'desktop', '[]'::jsonb, '[{"h": 1, "i": "p2p-field-9425", "w": 12, "x": 0, "y": 0}, {"h": 1, "i": "p2p-field-9426", "w": 12, "x": 0, "y": 1}]'::jsonb, 20) ON CONFLICT (id) DO NOTHING; +INSERT INTO tbl_appconfig_form_screens (id, source_form_id, activity_uid, device_type, layout, grid_config, app_id) VALUES (20140, 20098, 'p2p-act-hold-payment', 'desktop', '[]'::jsonb, '[{"h": 1, "i": "p2p-field-9427", "w": 12, "x": 0, "y": 0}, {"h": 1, "i": "p2p-field-9428", "w": 12, "x": 0, "y": 1}]'::jsonb, 20) ON CONFLICT (id) DO NOTHING; + +-- Header Config +INSERT INTO tbl_appconfig_header_config (id, app_id, device_type, config) VALUES (20001, 20, 'desktop', '{"slots": {"left": ["logo", "nav"], "right": ["profile"], "center": []}, "layout": {"type": "classic", "height": "56px", "position": "sticky", "full_width": true}, "components": {"nav": {"items": [{"id": "nav_vendor", "icon": "receipt_long", "type": "screen", "label": "My Invoices", "screen_id": 29631}, {"id": "nav_clarifications", "icon": "help_outline", "type": "screen", "label": "Pending Clarifications", "screen_id": 29632}, {"id": "nav_finance", "icon": "account_balance", "type": "screen", "label": "Finance Review", "screen_id": 29633}, {"id": "nav_all", "icon": "list_alt", "type": "screen", "label": "All Invoices", "screen_id": 29634}]}, "logo": {"text": "P2P Invoice System", "display_type": "text"}, "profile": {"shape": "circle", "show_name": true}}}'::jsonb) ON CONFLICT (id) DO UPDATE SET config = EXCLUDED.config; diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..4a187b0 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,37 @@ +import { Routes, Route, Navigate } from 'react-router-dom' +import { ProtectedRoute } from './components/ProtectedRoute' +import Login from './pages/Login' +import AppShell from './components/AppShell' + +export default function App() { + return ( + + } /> + + + + } + /> + + + + } + /> + + + + } + /> + } /> + + ) +} diff --git a/src/api/viewService.ts b/src/api/viewService.ts new file mode 100644 index 0000000..098624c --- /dev/null +++ b/src/api/viewService.ts @@ -0,0 +1,661 @@ +import { APP_ID } from "../config"; + +const TOKEN_KEY = "p2p_token"; + +function baseUrl(): string { + return (import.meta.env.VITE_ZINO_API_URL || "https://studio.getzino.in").replace(/\/+$/, ""); +} + +function headers(): Record { + const h: Record = { "Content-Type": "application/json" }; + const token = localStorage.getItem(TOKEN_KEY); + if (token) h["Authorization"] = `Bearer ${token}`; + return h; +} + +// Shared response handling — 401 bounces to login, error bodies are unwrapped +// from { error }. Used by both the JSON and multipart request paths. +async function parseResponse(res: Response): Promise { + if (res.status === 401) { + localStorage.removeItem(TOKEN_KEY); + localStorage.removeItem("p2p_user"); + window.location.href = `${import.meta.env.BASE_URL}login`; + throw new Error("Unauthorized"); + } + if (!res.ok) { + let msg = res.statusText; + try { const e = await res.json(); if (e.error) msg = e.error; } catch {} + throw new Error(msg); + } + if (res.status === 204) return undefined as T; + return res.json() as Promise; +} + +async function request(method: string, path: string, body?: unknown): Promise { + const res = await fetch(`${baseUrl()}${path}`, { + method, + headers: headers(), + body: body ? JSON.stringify(body) : undefined, + }); + return parseResponse(res); +} + +// Multipart POST for the field-scoped core-service endpoints (/upload, +// /ocr-extract). Content-Type is deliberately omitted so the browser sets the +// multipart boundary itself. +async function postFile(path: string, file: File, ctx: FieldFileContext): Promise { + const form = new FormData(); + form.append("file", file); + form.append("workflow_uuid", ctx.workflowUuid); + form.append("activity_id", ctx.activityId); + form.append("field_id", ctx.fieldId); + if (ctx.columnId) form.append("column_id", ctx.columnId); + if (ctx.versionUuid) form.append("version_uuid", ctx.versionUuid); + if (ctx.instanceId) form.append("instance_id", String(ctx.instanceId)); + + const token = localStorage.getItem(TOKEN_KEY); + const res = await fetch(`${baseUrl()}${path}`, { + method: "POST", + headers: token ? { Authorization: `Bearer ${token}` } : {}, + body: form, + }); + return parseResponse(res); +} + +// --------------------------------------------------------------------------- +// Header +// --------------------------------------------------------------------------- + +export interface HeaderConfig { + slots: { left: string[]; right: string[]; center: string[] }; + layout: { type: string; height: string; position: string; full_width: boolean }; + components: { + nav?: { items: NavItem[] }; + logo?: { text?: string; image_url?: string; display_type: string }; + profile?: { shape: string; show_name: boolean }; + }; +} + +export interface NavItem { + id: string; + icon: string; + type: string; + label: string; + screen_uuid: string; +} + +export async function getHeaderConfig(deviceType = "desktop"): Promise { + const raw = await request("GET", `/app/${APP_ID}/view/header/${deviceType}`); + return raw.config ?? raw; +} + +// --------------------------------------------------------------------------- +// Screens +// --------------------------------------------------------------------------- + +export interface ScreenListItem { + id: number; + source_screen_id: number; + screen_name: string; + device: string; + description: string; +} + +export interface ScreenLayout { + id: number; + source_screen_id: number; + screen_name: string; + layout: LayoutElement[]; +} + +export interface LayoutElement { + type: string; + style?: Record; + config: Record; + classes?: string[]; +} + +export function getScreens(deviceType = "desktop"): Promise { + return request("GET", `/app/${APP_ID}/view/screens?device_type=${deviceType}`); +} + +export function getScreen(idOrUuid: number | string): Promise { + return request("GET", `/app/${APP_ID}/view/screens/${idOrUuid}`); +} + +// --------------------------------------------------------------------------- +// RV Screens +// --------------------------------------------------------------------------- + +export interface RVScreen { + id: number; + source_screen_id: number; + screen_name: string; + rv_template_uid: string; + layout?: any; +} + +// Accepts either the numeric source_screen_id OR the source_uuid — both +// are accepted by the view-service's rv-screens endpoint. +export function getRVScreen(idOrUuid: number | string): Promise { + return request("GET", `/app/${APP_ID}/view/rv-screens/${idOrUuid}`); +} + +// --------------------------------------------------------------------------- +// Record View (POST-based) +// --------------------------------------------------------------------------- + +export interface SearchQuery { + page?: number; + limit?: number; + sort_by?: string; + sort_dir?: "asc" | "desc"; + search?: string; + filters?: Array<{ field_key: string; value: string; data_type?: string }>; +} + +export interface RecordViewField { + field_key: string; + output_label: string; + data_type: string; + is_filter: boolean; + is_search: boolean; + type?: string; + activity_id?: string; +} + +export interface TileValue { + tile_uid: string; + key: string; + value: unknown; +} + +export interface ChartDataRow { + dimension: unknown; + series?: string; + value: unknown; +} + +export interface ChartDataResponse { + chart_uid: string; + key: string; + rows: ChartDataRow[]; +} + +export interface RecordViewResponse { + config: { fields: RecordViewField[] }; + data: Record[]; + pagination?: { + page: number; + limit: number; + total_count: number; + total_pages: number; + }; + tile_values?: TileValue[]; + chart_data?: ChartDataResponse[]; +} + +export function getRecordView( + rvTemplateUid: string, + rvScreenId: string | number, + query: SearchQuery = {}, +): Promise { + return request("POST", `/app/${APP_ID}/view/recordview`, { + rv_template_uid: rvTemplateUid, + rv_screen_id: String(rvScreenId), + search_query: { + page: query.page || 1, + limit: query.limit || 50, + sort_by: query.sort_by || "", + sort_dir: query.sort_dir || "desc", + search: query.search || "", + filters: query.filters || [], + }, + }); +} + +export function getRecordViewLegacy( + rvUid: string, + query: SearchQuery = {}, +): Promise { + const qs = new URLSearchParams(); + qs.set("rv_id", rvUid); + if (query.page) qs.set("page", String(query.page)); + if (query.limit) qs.set("limit", String(query.limit)); + if (query.sort_by) qs.set("sort_by", query.sort_by); + if (query.sort_dir) qs.set("sort_dir", query.sort_dir); + if (query.search) qs.set("search", query.search); + if (query.filters) { + for (const f of query.filters) { + qs.set(`filter.${f.field_key}`, f.value); + } + } + return request("GET", `/recordview?${qs.toString()}`); +} + +// --------------------------------------------------------------------------- +// DV Screens +// --------------------------------------------------------------------------- + +export interface DVScreen { + id: number; + source_screen_id: number; + screen_name: string; + dv_template_uid: string; + layout?: any; +} + +export function getDVScreen(idOrUuid: number | string): Promise { + return request("GET", `/app/${APP_ID}/view/dv-screens/${idOrUuid}`); +} + +// --------------------------------------------------------------------------- +// Detail View +// --------------------------------------------------------------------------- + +export interface DetailViewResponse { + config: { fields: Array<{ field_key: string; output_label: string; data_type: string }> }; + data: Record; +} + +export function getDetailView(dvSourceIdOrUid: number | string, instanceId: string): Promise { + return request( + "GET", + `/app/${APP_ID}/view/detailview/${encodeURIComponent(String(dvSourceIdOrUid))}?instance_id=${encodeURIComponent(instanceId)}`, + ); +} + +export function getDetailViewLegacy(dvUid: string, instanceId: string): Promise { + return request( + "GET", + `/detailview?dv_id=${encodeURIComponent(dvUid)}&instance_id=${encodeURIComponent(instanceId)}`, + ); +} + +// --------------------------------------------------------------------------- +// Form Screens +// --------------------------------------------------------------------------- + +// One key the vision model must return, as configured in studio's OCR modal. +export interface OcrExtractionField { + key: string; + label: string; + data_type?: string; + description?: string; +} + +// extraction_key → the form field that receives the extracted value. +export interface OcrFieldMapping { + extraction_key: string; + target_field: string; +} + +// Studio's ocr_config block. `prompt` / `extraction_fields` are resolved +// server-side by /ocr-extract and are present here only for picker UX; the +// client genuinely needs `field_mappings` to know where to write the results. +export interface OcrConfig { + prompt?: string; + template?: string; + allowed_types?: string[] | string; + max_size_mb?: number | string; + placeholder?: string; + extraction_fields?: OcrExtractionField[]; + field_mappings?: OcrFieldMapping[]; +} + +export interface FormScreenField { + id: string; + uid: string; + name: string; + type: string; + data_type: string; + mandatory: boolean; + value?: any; + properties?: { + options?: Array<{ label: string; value: string }>; + country_code?: string; + placeholder?: string; + multiple?: boolean; + ocr_config?: OcrConfig; + // Some studio configs put the OCR keys flat on properties instead of + // nested under ocr_config — mirrored from FFOcrField's resolveOcrConfig. + allowed_types?: string[] | string; + max_size_mb?: number | string; + extraction_fields?: OcrExtractionField[]; + field_mappings?: OcrFieldMapping[]; + }; +} + +export interface FormScreenResponse { + id: number; + activity_uid: string; + activity_name: string; + device_type: string; + fields: FormScreenField[]; + grid_config: Array<{ i: string; x: number; y: number; w: number; h: number }>; + layout: any[]; + // Identifiers the field-scoped core endpoints (/upload, /ocr-extract) need + // so they can resolve the field's config + RBAC server-side. + workflow_uuid?: string; + version_uuid?: string; +} + +export function getFormScreen( + activityId: string, + instanceId?: string, + deviceType = "desktop", +): Promise { + const numericInstanceId = instanceId ? Number(instanceId) : undefined; + return request("POST", `/app/${APP_ID}/view/form-screens`, { + activity_id: activityId, + device_type: deviceType, + ...(numericInstanceId && !Number.isNaN(numericInstanceId) + ? { instance_id: numericInstanceId } + : {}), + }); +} + +// --------------------------------------------------------------------------- +// Field files & OCR (core-service) +// --------------------------------------------------------------------------- + +// Identifiers sent alongside every field-scoped file upload. The backend uses +// these to resolve the field's deployed allowed_types / max_size_mb / ocr_config +// and to run activity RBAC — anything the client sends about that config is +// ignored, so this trio is mandatory. +export interface FieldFileContext { + workflowUuid: string; + activityId: string; + fieldId: string; + columnId?: string; + versionUuid?: string; + instanceId?: string; +} + +// What /upload returns and what gets stored in instance data. `uuid` is the +// stable app-scoped handle; blob_path is kept for the legacy serve fallback. +export interface FileMeta { + uuid: string; + blob_path: string; + original_name: string; + mime_type: string; + size_bytes: number; +} + +export interface OcrExtractResponse { + // Keyed by the studio-configured extraction_fields[].key. A key whose value + // wasn't found in the document comes back as null. + extracted: Record; + raw?: string; + // Set when the model's reply wasn't parseable JSON — `raw` still holds the text. + parse_error?: string; +} + +// Stores a form-field file and returns the metadata to submit in its place. +export function uploadFieldFile(file: File, ctx: FieldFileContext): Promise { + return postFile(`/app/${APP_ID}/upload`, file, ctx); +} + +// Runs vision OCR over an uploaded document. The prompt and extraction schema +// live in the deployed ocr_config, so only the file + identifiers go over the wire. +export function extractOcr(file: File, ctx: FieldFileContext): Promise { + return postFile(`/app/${APP_ID}/ocr-extract`, file, ctx); +} + +// --------------------------------------------------------------------------- +// Workflow Actions +// --------------------------------------------------------------------------- + +export interface WorkflowResponse { + success: boolean; + status_code?: number; + message?: string; + data?: Record; + instance_id?: string; +} + +// Core-service expects the workflow UUID as `workflow_uuid` — the numeric +// `workflow_id` field was removed when the clone-portable identifier rolled out. +export function startWorkflow( + workflowUuid: string, + activityId: string, + data?: Record, +): Promise { + return request("POST", `/app/${APP_ID}/start`, { + workflow_uuid: workflowUuid, + activity_id: activityId, + data, + }); +} + +export function performActivity( + workflowUuid: string, + instanceId: string, + activityId: string, + data?: Record, +): Promise { + const numericInstanceId = Number(instanceId); + return request("POST", `/app/${APP_ID}/activity`, { + workflow_uuid: workflowUuid, + instance_id: Number.isNaN(numericInstanceId) ? instanceId : numericInstanceId, + activity_id: activityId, + data, + }); +} + +export function submitForm( + workflowUuid: string, + activityId: string, + formData: Record, + instanceId?: string, + deviceType = "desktop", +): Promise { + const numericInstanceId = instanceId ? Number(instanceId) : undefined; + return request("POST", `/app/${APP_ID}/form/submit`, { + workflow_uuid: workflowUuid, + activity_id: activityId, + device_type: deviceType, + form_data: formData, + ...(numericInstanceId && !Number.isNaN(numericInstanceId) + ? { instance_id: numericInstanceId } + : {}), + }); +} + +// --------------------------------------------------------------------------- +// Instance +// --------------------------------------------------------------------------- + +export interface InstanceResponse { + instance_id: string; + workflow_id: string; + current_state_id: string; + current_state_name: string; + data: Record; + created_at: string; + updated_at: string; +} + +export function getInstance(workflowUuid: string, instanceId: string): Promise { + return request("POST", `/app/${APP_ID}/instance`, { + workflow_uuid: workflowUuid, + instance_id: Number(instanceId), + }); +} + +// --------------------------------------------------------------------------- +// Audit +// --------------------------------------------------------------------------- + +export interface AuditEntry { + id: number; + user_id: string; + user_roles: string[]; + user_groups?: string[]; + activity_id: string; + data: Record; + /** State UUID the instance landed in after this activity. */ + execution_state: string; + created_at: string; + // Optional human-readable summary line. Populated by useInstanceMeta when + // the audit is synthesised from instance.data._activities. + context?: string; +} + +export function getAuditLog(instanceId: string): Promise { + return request("GET", `/app/${APP_ID}/view/audit?instance_id=${encodeURIComponent(instanceId)}`); +} + +// --------------------------------------------------------------------------- +// AI Employee monitoring (ai-employee-service) +// --------------------------------------------------------------------------- +// These are the same endpoints the studio builder's "AI Employee → Logs" tab +// uses. They are NOT app-scoped: the ingress maps studio.getzino.in/monitor +// straight to ai-employee-service:8090, so the path has no /app/{id} prefix. +// The app's own JWT is accepted. + +/** One reasoning pass the employee took, as stored in aiemployee.tbl_ai_decisions. */ +export interface AIDecision { + id: number; + ai_user_id: string; + instance_id: string; + /** The activity the employee SUBMITTED (its chosen next step), not the one it read. */ + activity_id: string; + /** State the instance was in when the employee looked at it. */ + instance_state?: string; + status: "submitted" | "failed" | "error" | "escalated" | "submitting" | string; + confidence?: number; + model?: string; + created_at: string; + /** Opening plan the model wrote before acting. */ + plan?: string; + /** Why it chose this action. */ + reasoning?: string; + /** Self-check pass. */ + reflexion?: { + concerns?: string; + should_escalate?: boolean; + adjusted_confidence?: number; + } | null; + knowledge_sources?: string[] | null; + /** The payload it submitted with the activity. */ + data?: Record; + error_message?: string; + cost?: number; + llm_calls?: number; + duration_ms?: number; +} + +export interface AIEscalation { + id: number; + instance_id: string; + recommended_action?: string; + reasoning?: string; + reason?: string; + status?: string; + created_at: string; +} + +export interface AIInstanceLog { + instance_id: string; + decisions: AIDecision[]; + escalations: AIEscalation[]; +} + +/** One step inside a run — a tool call, an LLM call, a context gather, etc. */ +export interface AITraceEvent { + seq: number; + parent_seq?: number; + type: string; + name: string; + status: string; + started_at: string; + ended_at?: string; + duration_ms?: number; + input?: unknown; + output?: unknown; + tokens_in?: number; + tokens_out?: number; + cost?: number; + error?: string; + decision_id?: number; +} + +/** One task the employee processed end-to-end. */ +export interface AITrace { + trace_id: string; + events: AITraceEvent[]; +} + +export interface AIInstanceTrace { + instance_id: string; + traces: AITrace[]; +} + +export function getAIInstanceLog(instanceId: string): Promise { + return request("GET", `/monitor/instances/${encodeURIComponent(instanceId)}/log`); +} + +export function getAIInstanceTrace(instanceId: string): Promise { + return request("GET", `/monitor/instances/${encodeURIComponent(instanceId)}/trace`); +} + +// --------------------------------------------------------------------------- +// Field-file download +// --------------------------------------------------------------------------- + +/** + * Fetches a stored form-field file (e.g. the uploaded invoice PDF) as a Blob. + * `blobPath` comes from the FileMeta the upload returned and is echoed back in + * the activity's submitted data. Returns a Blob so the caller can either build + * an object URL for inline preview or trigger a download — the endpoint sets + * Content-Disposition: attachment, so a plain link would always download. + */ +export async function downloadFieldFile(blobPath: string, originalName?: string): Promise { + const params = new URLSearchParams({ path: blobPath }); + if (originalName) params.set("name", originalName); + const token = localStorage.getItem(TOKEN_KEY); + const res = await fetch(`${baseUrl()}/app/${APP_ID}/download?${params.toString()}`, { + headers: token ? { Authorization: `Bearer ${token}` } : {}, + }); + if (!res.ok) { + if (res.status === 401) { + localStorage.removeItem(TOKEN_KEY); + window.location.href = `${import.meta.env.BASE_URL}login`; + } + throw new Error(`Could not load the document (${res.status})`); + } + return res.blob(); +} + +// --------------------------------------------------------------------------- +// RDBMS lookup records — used by the demo calendar to pull rows from the +// `mahindra_demo` schema via the lookup-field config on the INIT activity. +// --------------------------------------------------------------------------- + +export interface RdbmsLookupResponse { + records: Record[]; + total: number; + limit: number; + offset: number; +} + +export interface RdbmsLookupQuery { + workflowId: number; + activityId: string; + fieldId: string; + limit?: number; + offset?: number; + search?: string; +} + +export function fetchRdbmsLookupRecords(templateUuid: string, q: RdbmsLookupQuery): Promise { + return request("POST", `/app/${APP_ID}/rdbms-templates/${encodeURIComponent(templateUuid)}/records`, { + workflow_id: q.workflowId, + activity_id: q.activityId, + field_id: q.fieldId, + limit: q.limit ?? 1000, + offset: q.offset ?? 0, + search: q.search ?? "", + }); +} diff --git a/src/components/AiActivity.tsx b/src/components/AiActivity.tsx new file mode 100644 index 0000000..35a6757 --- /dev/null +++ b/src/components/AiActivity.tsx @@ -0,0 +1,367 @@ +// What the AI employee actually did on this instance. +// +// Sourced from /monitor/instances/{id}/log (decisions + escalations) and +// /trace (per-run step waterfall). Both are best-effort: an instance the +// employee never touched has no rows, and ai-employee-service is a separate +// deployment that can be down without this page breaking — hence `unavailable` +// rendering as a note rather than an error. +// +// Presentation is on our theme tokens; the decision↔trace linking, ordering and +// token/cost roll-up are the logic that came with the endpoints. + +import { useMemo, useState } from "react"; +import { + AlertTriangle, + ChevronDown, + Clock, + Coins, + Cpu, + Hash, + Sparkles, + TriangleAlert, +} from "lucide-react"; +import { cn } from "@/lib/utils"; +import type { AIDecision, AIEscalation, AITrace, AITraceEvent } from "@/api/viewService"; +import { activityLabel, fmtDuration } from "@/lib/workflowMeta"; +import { formatDate, formatTime } from "@/lib/format"; + +const STATUS_TONE: Record = { + submitted: "bg-state-approved/12 text-state-approved", + escalated: "bg-state-clarification/12 text-state-clarification", + submitting: "bg-state-review/12 text-state-review", + failed: "bg-state-rejected/12 text-state-rejected", + error: "bg-state-rejected/12 text-state-rejected", +}; + +/** Same banding as the assessment block: 90 auto-accept, 60 re-check. */ +const confidenceTone = (pct: number) => + pct >= 90 ? "text-state-approved" : pct >= 60 ? "text-state-clarification" : "text-state-rejected"; + +interface Props { + decisions: AIDecision[]; + escalations: AIEscalation[]; + traces: AITrace[]; + unavailable?: boolean; +} + +export default function AiActivity({ decisions, escalations, traces, unavailable }: Props) { + // Each trace carries the decision_id it belongs to on its events, so the + // waterfall can be attached to the decision it explains. + const traceByDecision = useMemo(() => { + const m = new Map(); + for (const t of traces) { + const id = t.events.find((e) => e.decision_id != null)?.decision_id; + if (id != null && !m.has(id)) m.set(id, t); + } + return m; + }, [traces]); + + const ordered = useMemo( + () => + [...decisions].sort( + (a, b) => new Date(a.created_at).getTime() - new Date(b.created_at).getTime(), + ), + [decisions], + ); + + const totals = useMemo(() => { + let tokens = 0; + let cost = 0; + let ms = 0; + for (const t of traces) + for (const e of t.events) { + tokens += (e.tokens_in ?? 0) + (e.tokens_out ?? 0); + cost += e.cost ?? 0; + // Only top-level steps, or nested spans would be counted twice. + if (e.parent_seq == null) ms += e.duration_ms ?? 0; + } + return { tokens, cost, ms }; + }, [traces]); + + if (unavailable) { + return ( +

+ + The AI monitoring service isn’t reachable, so decisions and traces can’t be shown. +

+ ); + } + if (ordered.length === 0 && escalations.length === 0) { + return ( +

The AI employee hasn’t acted on this invoice.

+ ); + } + + const models = [...new Set(ordered.map((d) => d.model).filter(Boolean))]; + + return ( +
+ {/* Run summary — the cost of the automation, before the detail of it. */} + {(ordered.length > 0 || totals.tokens > 0) && ( +
+ + {ordered.length} {ordered.length === 1 ? "decision" : "decisions"} + + {totals.ms > 0 && {fmtDuration(totals.ms)}} + {totals.tokens > 0 && ( + {totals.tokens.toLocaleString("en-IN")} tokens + )} + {totals.cost > 0 && ${totals.cost.toFixed(4)}} + {models.length > 0 && {models.join(", ")}} +
+ )} + +
    + {ordered.map((d, i) => ( + + ))} +
+ + {escalations.length > 0 && ( +
+ {escalations.map((e) => ( +
+

+ + Escalated to a human + {e.recommended_action && ( + + · {e.recommended_action} + + )} +

+ {(e.reasoning || e.reason) && ( +

+ {e.reasoning || e.reason} +

+ )} +
+ ))} +
+ )} +
+ ); +} + +function Stat({ icon: Icon, children }: { icon: typeof Hash; children: React.ReactNode }) { + return ( +
+ + {children} +
+ ); +} + +function Decision({ + decision: d, + trace, + index, + last, +}: { + decision: AIDecision; + trace?: AITrace; + index: number; + last: boolean; +}) { + const [open, setOpen] = useState(false); + // The self-check can revise the model's own confidence down; show the number + // it ended up acting on, and say so when it changed. + const raw = d.confidence != null ? d.confidence * 100 : null; + const adjusted = + d.reflexion?.adjusted_confidence != null ? d.reflexion.adjusted_confidence * 100 : null; + const pct = adjusted ?? raw; + const time = formatTime(d.created_at); + const hasDetail = !!(d.plan || d.reasoning || d.reflexion?.concerns || trace); + + return ( +
  • + {/* Connector — makes a multi-run sequence read as one process. */} + {!last && ( + + )} + + + {index} + + +
    +
    + + {activityLabel(d.activity_id)} + + + {d.status} + + {pct != null && ( + + {Math.round(pct)}% + {adjusted != null && raw != null && Math.round(adjusted) !== Math.round(raw) && ( + + (self-checked from {Math.round(raw)}%) + + )} + + )} + {d.reflexion?.should_escalate && ( + + flagged for escalation + + )} +
    + +

    + {formatDate(d.created_at)} + {time && ` · ${time}`} + {d.duration_ms != null && ` · ${fmtDuration(d.duration_ms)}`} + {d.llm_calls != null && d.llm_calls > 0 && ` · ${d.llm_calls} LLM calls`} +

    + + {d.error_message && ( +

    + {d.error_message} +

    + )} + + {hasDetail && ( + <> + + + {open && ( +
    + {d.plan && } + {d.reasoning && } + {d.reflexion?.concerns && ( + + )} + {d.knowledge_sources && d.knowledge_sources.length > 0 && ( +
    + +
      + {d.knowledge_sources.map((s) => ( +
    • + {s} +
    • + ))} +
    +
    + )} + {trace && } +
    + )} + + )} +
    +
  • + ); +} + +function Label({ children }: { children: React.ReactNode }) { + return ( +

    + {children} +

    + ); +} + +function Passage({ label, text, tone }: { label: string; text: string; tone?: "warn" }) { + return ( +
    +

    + {label} +

    +

    + {text.replace(/[ \t]{2,}/g, " ")} +

    +
    + ); +} + +/** Step timings for one run, as bars proportional to the slowest step. */ +function Waterfall({ trace }: { trace: AITrace }) { + const events = [...trace.events].sort((a, b) => a.seq - b.seq); + const max = Math.max(...events.map((e) => e.duration_ms ?? 0), 1); + + return ( +
    + +
      + {events.map((e) => ( + + ))} +
    +
    + ); +} + +function TraceRow({ event: e, max }: { event: AITraceEvent; max: number }) { + const failed = !!e.error || e.status === "error" || e.status === "failed"; + const tokens = (e.tokens_in ?? 0) + (e.tokens_out ?? 0); + + return ( +
  • + + {e.name || e.type} + + {tokens > 0 && ( + + {tokens.toLocaleString("en-IN")} tok + + )} + + + + + {fmtDuration(e.duration_ms)} + +
  • + ); +} diff --git a/src/components/AppShell.tsx b/src/components/AppShell.tsx new file mode 100644 index 0000000..352157e --- /dev/null +++ b/src/components/AppShell.tsx @@ -0,0 +1,344 @@ +import { Suspense, lazy, useCallback, useEffect, useState } from "react"; +import { useNavigate, useParams } from "react-router-dom"; +import { useQuery } from "@tanstack/react-query"; +import { ChevronRight, Loader2, Sparkles } from "lucide-react"; +import { cn } from "@/lib/utils"; +import { Button } from "@/components/ui/button"; +import { Skeleton } from "@/components/ui/skeleton"; +import DynamicHeader from "./DynamicHeader"; +import DashboardStats from "./DashboardStats"; +import ScreenRenderer from "./ScreenRenderer"; +import DetailViewPanel from "./DetailViewPanel"; +import RecordViewTable from "./RecordViewTable"; +import FormModal from "./FormModal"; +import CommandPalette from "./CommandPalette"; +import StatusBadge from "./StatusBadge"; +import { TableSkeleton } from "./Skeleton"; +import { getScreen, getInstance, type LayoutElement } from "@/api/viewService"; +import { useHeaderConfig } from "@/hooks/useHeaderConfig"; +import { useSidebar } from "@/hooks/useSidebar"; +import { actionsForStateId, stateById } from "@/lib/workflow"; +import { + RDBMS_DV_SCREEN_UUID, + RDBMS_RV_SCREEN_UUID, + SCREEN_UUIDS, + STATE_IDS, + WORKFLOW_ID, +} from "@/config"; + +// recharts is heavy — keep it out of the initial bundle so the queue paints +// first, then swap the charts in over a same-size placeholder. +const DashboardCharts = lazy(() => import("./DashboardCharts")); + +/** rv_screens rendered directly rather than through a screen layout. */ +const RDBMS_SCREEN_LABELS: Record = { + [RDBMS_RV_SCREEN_UUID]: "Purchase Orders", +}; +const RDBMS_DETAIL_SCREENS: Record = { + [RDBMS_RV_SCREEN_UUID]: RDBMS_DV_SCREEN_UUID, +}; + +/** List screen → detail screen. */ +const SCREEN_TO_DETAIL: Record = { + [SCREEN_UUIDS.MY_INVOICES]: SCREEN_UUIDS.INVOICE_DETAIL, + [SCREEN_UUIDS.PENDING_CLARIFICATIONS]: SCREEN_UUIDS.CLARIFICATION_DETAIL, + [SCREEN_UUIDS.FINANCE_REVIEW]: SCREEN_UUIDS.FINANCE_REVIEW_DETAIL, + [SCREEN_UUIDS.ALL_INVOICES]: SCREEN_UUIDS.INVOICE_DETAIL, +}; + +const detailScreenFor = (screenId: string | null) => + (screenId ? SCREEN_TO_DETAIL[screenId] ?? RDBMS_DETAIL_SCREENS[screenId] : null) ?? + SCREEN_UUIDS.INVOICE_DETAIL; + +export default function AppShell() { + const navigate = useNavigate(); + const params = useParams(); + const screenIdParam = params.screenId ?? null; + const instanceIdParam = params.instanceId ?? null; + + const sidebar = useSidebar(); + const { navItems, isSuccess: navReady } = useHeaderConfig(); + + const [activeScreenId, setActiveScreenId] = useState(screenIdParam); + const [detailTitle, setDetailTitle] = useState(null); + const [commandOpen, setCommandOpen] = useState(false); + const [formModal, setFormModal] = useState<{ + activityId: string; + instanceId: string; + title: string; + } | null>(null); + + const isRdbms = !!activeScreenId && activeScreenId === RDBMS_RV_SCREEN_UUID; + const detailViewId = instanceIdParam ? detailScreenFor(screenIdParam ?? activeScreenId) : null; + + // Land on the first nav item when no screen is in the URL. + useEffect(() => { + if (!screenIdParam && !instanceIdParam && navReady && navItems.length > 0) { + handleNavigate(navItems[0].screen_uuid); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [navReady, navItems.length, screenIdParam, instanceIdParam]); + + // Keep local screen state in step with browser back/forward. + useEffect(() => { + if (screenIdParam && screenIdParam !== activeScreenId) setActiveScreenId(screenIdParam); + if (!instanceIdParam) setDetailTitle(null); + }, [screenIdParam, instanceIdParam, activeScreenId]); + + // ── Screen layout ───────────────────────────────────────────────────────── + const screenQuery = useQuery({ + queryKey: ["screen", activeScreenId], + enabled: !!activeScreenId && !isRdbms && !instanceIdParam, + staleTime: 5 * 60_000, + queryFn: async () => (await getScreen(activeScreenId!)).layout ?? ([] as LayoutElement[]), + }); + + const detailScreenQuery = useQuery({ + queryKey: ["screen", detailViewId], + enabled: !!detailViewId, + staleTime: 5 * 60_000, + queryFn: async () => (await getScreen(detailViewId!)).layout ?? ([] as LayoutElement[]), + }); + + // ── Instance state ──────────────────────────────────────────────────────── + // The old code faked "wait for the AI" with a setTimeout(2500) that bumped a + // refresh key twice. This polls while the instance is mid-analysis and stops + // as soon as it settles. + const instanceQuery = useQuery({ + queryKey: ["instance", instanceIdParam], + enabled: !!instanceIdParam, + queryFn: () => getInstance(WORKFLOW_ID, instanceIdParam!), + refetchInterval: (q) => { + const stateId = (q.state.data as any)?.current_state_id; + return stateId === STATE_IDS.AI_ANALYSIS ? 3000 : false; + }, + }); + + const instanceStateId: string | null = + (instanceQuery.data as any)?.current_state_id ?? null; + const instanceState = stateById(instanceStateId); + const analysing = instanceStateId === STATE_IDS.AI_ANALYSIS; + const actions = actionsForStateId(instanceStateId); + + const handleNavigate = useCallback( + (id: string) => { + setActiveScreenId(id); + setDetailTitle(null); + navigate(`/screen/${id}`); + }, + [navigate], + ); + + const handleRowClick = useCallback( + (instanceId: string) => navigate(`/screen/${activeScreenId}/detail/${instanceId}`), + [activeScreenId, navigate], + ); + + const handleBack = () => navigate(`/screen/${activeScreenId}`); + + const screenLabel = + navItems.find((n) => n.screen_uuid === activeScreenId)?.label ?? + (activeScreenId ? RDBMS_SCREEN_LABELS[activeScreenId] : undefined) ?? + "Invoices"; + + if (!navReady && !screenIdParam && !instanceIdParam) { + return ( +
    +
    + + Loading… +
    +
    + ); + } + + const showDetail = !!instanceIdParam && !!detailViewId; + + return ( +
    + {/* Must be the first focusable element, and must move focus (not just + scroll) to satisfy WCAG 2.4.1. */} + + Skip to content + + + + +
    +
    + {showDetail ? ( +
    + {/* Breadcrumb — shows the invoice number once the detail view + reports it, instead of the raw instance UUID. */} +
    + + +
    + {analysing && ( + + + AI analysing… + + )} + {instanceState && !analysing && actions.length === 0 && ( + + )} + {actions.map((a) => ( + + ))} +
    +
    + + {detailScreenQuery.data && detailScreenQuery.data.length > 0 ? ( + + ) : ( + + )} +
    + ) : isRdbms ? ( + + ) : screenQuery.isPending ? ( + <> + + + + ) : screenQuery.data && screenQuery.data.length > 0 ? ( + <> + + }> + + + + + ) : ( +
    + Select a screen from the navigation. +
    + )} +
    +
    + + + + {formModal && ( + setFormModal(null)} + onSuccess={() => { + setFormModal(null); + instanceQuery.refetch(); + }} + /> + )} +
    + ); +} + +function StatsPlaceholder() { + return ( +
    + {Array.from({ length: 4 }).map((_, i) => ( +
    + +
    + + + +
    +
    + ))} +
    + ); +} + +/** + * Same height as the real charts row, so the lazy chunk arriving doesn't shove + * the table down the page. Kept local rather than imported from + * DashboardCharts, which would pull recharts back into the main bundle. + */ +function ChartsPlaceholder() { + return ( +
    + {Array.from({ length: 3 }).map((_, i) => ( +
    + + + +
    + ))} +
    + ); +} diff --git a/src/components/AuditTrail.tsx b/src/components/AuditTrail.tsx new file mode 100644 index 0000000..7e8c552 --- /dev/null +++ b/src/components/AuditTrail.tsx @@ -0,0 +1,137 @@ +// The invoice's history as a timeline. +// +// Built from GET /app/{id}/view/audit, which returns one row per performed +// activity with the actor (user_id + roles), the resulting state, the timestamp +// and the submitted payload. A status pill can't explain how an invoice reached +// its state; this can — including which steps the AI took versus a person, and +// how long each hop waited. +// +// Presentation is on our theme tokens; the actor resolution, per-activity +// headline and gap arithmetic are the logic that came with the endpoint. + +import { + CheckCircle2, + FileUp, + Gavel, + HelpCircle, + MessageSquareReply, + PauseCircle, + Sparkles, + User, + XCircle, + type LucideIcon, +} from "lucide-react"; +import { cn } from "@/lib/utils"; +import type { AuditEntry } from "@/api/viewService"; +import { ACTIVITY_IDS } from "@/config"; +import { activityLabel, fmtGap, resolveActor } from "@/lib/workflowMeta"; +import { formatCurrency, formatDate, formatTime } from "@/lib/format"; +import { stateById } from "@/lib/workflow"; +import StatusBadge from "./StatusBadge"; + +const ACTIVITY_ICON: Record = { + [ACTIVITY_IDS.SUBMIT_INVOICE]: FileUp, + [ACTIVITY_IDS.REQUEST_CLARIFICATION]: HelpCircle, + [ACTIVITY_IDS.PROVIDE_CLARIFICATION]: MessageSquareReply, + [ACTIVITY_IDS.SUBMIT_RECOMMENDATION]: Gavel, + [ACTIVITY_IDS.APPROVE_PAYMENT]: CheckCircle2, + [ACTIVITY_IDS.REJECT_PAYMENT]: XCircle, + [ACTIVITY_IDS.HOLD_PAYMENT]: PauseCircle, +}; + +/** + * Per-activity headline: the one or two values that matter at a glance, so the + * timeline reads as a story instead of a list of generic event names. + */ +function summarise(e: AuditEntry): string | null { + const d = (e.data ?? {}) as Record; + const money = (v: unknown) => (v != null ? formatCurrency(Number(v)) : null); + + switch (e.activity_id) { + case ACTIVITY_IDS.SUBMIT_INVOICE: + return ( + [d.invoice_number, d.po_number, money(d.total_amount)].filter(Boolean).join(" · ") || null + ); + case ACTIVITY_IDS.REQUEST_CLARIFICATION: + return d.target_department + ? `Asked ${String(d.target_department).replace(/_/g, " ")}` + : null; + case ACTIVITY_IDS.PROVIDE_CLARIFICATION: + return d.response_text ? String(d.response_text).replace(/[ \t]{2,}/g, " ") : null; + case ACTIVITY_IDS.SUBMIT_RECOMMENDATION: + return ( + [ + d.recommendation ? String(d.recommendation).toUpperCase() : null, + money(d.recommended_amount), + d.ai_confidence != null ? `${Math.round(Number(d.ai_confidence) * 100)}% confidence` : null, + ] + .filter(Boolean) + .join(" · ") || null + ); + case ACTIVITY_IDS.APPROVE_PAYMENT: + return money(d.approved_amount); + case ACTIVITY_IDS.REJECT_PAYMENT: + return d.rejection_reason ? String(d.rejection_reason) : null; + case ACTIVITY_IDS.HOLD_PAYMENT: + return d.hold_reason ? String(d.hold_reason) : null; + default: + return null; + } +} + +export default function AuditTrail({ audit }: { audit: AuditEntry[] }) { + if (audit.length === 0) { + return

    No activity recorded yet.

    ; + } + + return ( +
      + {audit.map((e, i) => { + const actor = resolveActor(e.user_roles, e.user_id); + const Icon = ACTIVITY_ICON[e.activity_id] ?? Gavel; + const state = stateById(e.execution_state); + const summary = summarise(e); + const gap = i > 0 ? fmtGap(audit[i - 1].created_at, e.created_at) : ""; + const time = formatTime(e.created_at); + + return ( +
    1. + + + + +
      +
      + + {activityLabel(e.activity_id)} + + + {actor.isAI && } + {!actor.isAI && } + {actor.name} + + {state && } +
      + + {summary && ( +

      {summary}

      + )} + +

      + {formatDate(e.created_at)} + {time && ` · ${time}`} + {/* How long this step waited on the one before it. */} + {gap && ` · +${gap}`} +

      +
      +
    2. + ); + })} +
    + ); +} diff --git a/src/components/CommandPalette.tsx b/src/components/CommandPalette.tsx new file mode 100644 index 0000000..deba97a --- /dev/null +++ b/src/components/CommandPalette.tsx @@ -0,0 +1,153 @@ +import { useEffect } from "react"; +import { useQueryStates } from "nuqs"; +import { FileText, ListFilter, Moon, Search, Sun, X } from "lucide-react"; +import { + CommandDialog, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, + CommandSeparator, + CommandShortcut, +} from "@/components/ui/command"; +import { useTheme } from "@/hooks/ThemeContext"; +import { useHeaderConfig } from "@/hooks/useHeaderConfig"; +import { tableParams, tableParamsOptions } from "@/lib/tableParams"; +import { WORKFLOW_STATES } from "@/lib/workflow"; +import { cn } from "@/lib/utils"; + +interface Props { + open: boolean; + onOpenChange: (open: boolean) => void; + onNavigate: (screenUuid: string) => void; +} + +/** + * ⌘K palette — jump between screens and apply status filters without leaving + * the keyboard. This is a queue-triage app; reaching for the mouse to change a + * filter is the slow path. + */ +export default function CommandPalette({ open, onOpenChange, onNavigate }: Props) { + const { theme, toggleTheme } = useTheme(); + const { navItems } = useHeaderConfig(); + const [params, setParams] = useQueryStates(tableParams, tableParamsOptions); + + useEffect(() => { + const onKey = (e: KeyboardEvent) => { + if (e.key === "k" && (e.metaKey || e.ctrlKey)) { + e.preventDefault(); + onOpenChange(!open); + } + }; + window.addEventListener("keydown", onKey); + return () => window.removeEventListener("keydown", onKey); + }, [open, onOpenChange]); + + const run = (fn: () => void) => { + fn(); + onOpenChange(false); + }; + + const filtersActive = params.status.length > 0 || !!params.q; + + return ( + + + + No matches. + + {navItems.length > 0 && ( + + {navItems.map((item) => ( + run(() => onNavigate(item.screen_uuid))} + > + + {item.label} + + ))} + + )} + + + + + {WORKFLOW_STATES.map((s) => { + const selected = params.status.includes(s.name); + return ( + + run(() => + setParams({ + status: selected + ? params.status.filter((x) => x !== s.name) + : [...params.status, s.name], + page: 1, + }), + ) + } + > + + {s.label} + {selected && active} + + ); + })} + {filtersActive && ( + run(() => setParams({ status: [], q: "", page: 1 }))} + > + + Clear all filters + + )} + + + + + + + run(() => { + // Defer so the dialog has released focus first. + requestAnimationFrame(() => { + document + .querySelector('input[aria-label="Search records"]') + ?.focus(); + }); + }) + } + > + + Search records + / + + run(toggleTheme)}> + {theme === "dark" ? ( + + ) : ( + + )} + Switch to {theme === "dark" ? "light" : "dark"} mode + + + + Tip: tiles on the dashboard also filter the queue + + + + + ); +} diff --git a/src/components/DashboardCharts.tsx b/src/components/DashboardCharts.tsx new file mode 100644 index 0000000..b490120 --- /dev/null +++ b/src/components/DashboardCharts.tsx @@ -0,0 +1,314 @@ +import { + Bar, + BarChart, + Cell, + LabelList, + Pie, + PieChart, + ResponsiveContainer, + Tooltip as RTooltip, + XAxis, + YAxis, +} from "recharts"; +import { useQueryStates } from "nuqs"; +import { cn } from "@/lib/utils"; +import { Skeleton } from "@/components/ui/skeleton"; +import { tableParams, tableParamsOptions } from "@/lib/tableParams"; +import { useInvoiceAnalytics, formatCurrency } from "@/hooks/useInvoiceAnalytics"; +import { CATEGORY_COLORS } from "@/lib/palette"; + +const CHART_H = 190; + +/** + * Aging ramp: fresh buckets in the calm end of the palette, overdue ones in + * warning hues — the chart says "chase these" without a legend. + */ +const AGING_COLORS = [ + "var(--chart-5)", + "var(--chart-4)", + "var(--chart-1)", + "var(--state-clarification)", + "var(--state-rejected)", +]; + +/** + * Tooltip styled off the theme tokens rather than recharts' defaults, which are + * hard-coded light and unreadable in dark mode. + */ +function ChartTooltip({ active, payload, label, valueFormat }: any) { + if (!active || !payload?.length) return null; + return ( +
    + {label &&
    {label}
    } + {payload.map((p: any) => ( +
    + + + {valueFormat ? valueFormat(p.value, p.payload) : p.value} + + {p.payload?.label && · {p.payload.label}} +
    + ))} +
    + ); +} + +function Panel({ + title, + subtitle, + badge, + children, + className, +}: { + title: string; + subtitle?: string; + /** Headline figure for the panel, right-aligned against the title. */ + badge?: string; + children: React.ReactNode; + className?: string; +}) { + return ( +
    +
    +
    +

    {title}

    + {subtitle &&

    {subtitle}

    } +
    + {badge && ( + + {badge} + + )} +
    + {children} +
    + ); +} + +const AXIS_TICK = { fontSize: 10, fill: "var(--muted-foreground)" } as const; + +export default function DashboardCharts() { + const { data, isPending, isError } = useInvoiceAnalytics(); + const [, setParams] = useQueryStates(tableParams, tableParamsOptions); + + if (isError) return null; + if (isPending) return ; + if (!data) return null; + + const hasAging = data.aging.some((b) => b.count > 0); + const hasMix = data.byState.length > 0; + const hasVendors = data.topVendors.length > 0; + if (!hasAging && !hasMix && !hasVendors) return null; + + const openTotal = data.aging.reduce((n, b) => n + b.count, 0); + const overdue = data.aging.filter((b) => b.overdue).reduce((n, b) => n + b.count, 0); + const agingData = data.aging.map((b, i) => ({ ...b, color: AGING_COLORS[i] })); + + return ( +
    + {/* ── Status mix ──────────────────────────────────────────────────── */} + {hasMix && ( + +
    +
    + + + + setParams({ status: [slice?.payload?.name], page: 1 }) + } + > + {data.byState.map((s) => ( + + ))} + + + `${v} ${v === 1 ? "invoice" : "invoices"}${ + row?.amount ? ` · ${formatCurrency(row.amount, true)}` : "" + }` + } + /> + } + /> + + + + {/* Centre label — a donut with a hole and nothing in it wastes + the most legible spot in the chart. */} +
    + + {data.total} + + + invoices + +
    +
    + + {/* Legend doubles as a per-state breakdown with counts and money. */} +
      + {data.byState.map((s) => ( +
    • + +
    • + ))} +
    +
    +
    + )} + + {/* ── Aging ───────────────────────────────────────────────────────── */} + {hasAging && ( + 0 + ? `${overdue} of ${openTotal} open past 14 days` + : "Open invoices by days since submission" + } + badge={`${openTotal} open`} + > + + + + + + `${v} open${row?.amount ? ` · ${formatCurrency(row.amount, true)}` : ""}` + } + /> + } + /> + + (v > 0 ? v : "")} + /> + {agingData.map((b) => ( + + ))} + + + + + )} + + {/* ── Top vendors ─────────────────────────────────────────────────── */} + {hasVendors && ( + + + + (v.length > 12 ? `${v.slice(0, 11)}…` : v)} + /> + formatCurrency(v, true)} + /> + + `${formatCurrency(v, true)} · ${row?.count} ${ + row?.count === 1 ? "invoice" : "invoices" + }` + } + /> + } + /> + + formatCurrency(v, true)} + /> + {data.topVendors.map((v, i) => ( + + ))} + + + + + )} +
    + ); +} + +function ChartsSkeleton() { + return ( +
    + {Array.from({ length: 3 }).map((_, i) => ( +
    + + + +
    + ))} +
    + ); +} diff --git a/src/components/DashboardStats.tsx b/src/components/DashboardStats.tsx new file mode 100644 index 0000000..335e30e --- /dev/null +++ b/src/components/DashboardStats.tsx @@ -0,0 +1,218 @@ +import { useQueryStates } from "nuqs"; +import { + AlertCircle, + CheckCircle2, + Clock, + FileText, + TrendingDown, + TrendingUp, + type LucideIcon, +} from "lucide-react"; +import { cn } from "@/lib/utils"; +import { Skeleton } from "@/components/ui/skeleton"; +import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; +import { tableParams, tableParamsOptions } from "@/lib/tableParams"; +import { useInvoiceAnalytics, formatCurrency, type InvoiceAnalytics } from "@/hooks/useInvoiceAnalytics"; +import { WORKFLOW_STATES } from "@/lib/workflow"; + +interface Tile { + key: string; + label: string; + value: string; + /** Secondary line — the money or ratio behind the count. */ + sub?: string; + icon: LucideIcon; + /** Tailwind classes for the icon chip. */ + tone: string; + /** State names this tile filters the table down to. Empty = clears filters. */ + filter: string[]; + hint: string; + /** Fraction of all invoices this tile represents. */ + share?: number; + /** Week-over-week change, as a fraction. */ + delta?: number | null; +} + +function buildTiles(a: InvoiceAnalytics): Tile[] { + const state = (key: string) => WORKFLOW_STATES.find((s) => s.key === key)!; + const pct = a.approvalRate === null ? null : Math.round(a.approvalRate * 100); + const share = (n: number) => (a.total > 0 ? n / a.total : 0); + + return [ + { + key: "total", + label: "Total Invoices", + value: String(a.total), + sub: a.totalAmount > 0 ? formatCurrency(a.totalAmount, true) + " in value" : undefined, + icon: FileText, + tone: "bg-primary/10 text-primary", + filter: [], + hint: "All invoices. Click to clear status filters.", + delta: a.momentum.deltaPct, + }, + { + key: "clarification", + label: "Pending Clarification", + value: String(a.counts.clarification), + sub: "with departments", + icon: AlertCircle, + tone: "bg-state-clarification/10 text-state-clarification", + filter: [state("clarification").name], + hint: "Waiting on a department to answer the AI's question.", + share: share(a.counts.clarification), + }, + { + key: "review", + label: "Finance Review", + value: String(a.counts.review), + sub: "awaiting decision", + icon: Clock, + tone: "bg-state-review/10 text-state-review", + filter: [state("review").name], + hint: "Queued for a finance reviewer to approve, reject or hold.", + share: share(a.counts.review), + }, + { + key: "approved", + label: "Approved", + value: String(a.counts.approved), + sub: + pct !== null + ? `${pct}% approval rate` + : a.approvedAmount > 0 + ? formatCurrency(a.approvedAmount, true) + : undefined, + icon: CheckCircle2, + tone: "bg-state-approved/10 text-state-approved", + filter: [state("approved").name], + hint: "Approved for payment.", + share: share(a.counts.approved), + }, + ]; +} + +export default function DashboardStats() { + const { data, isPending, isError } = useInvoiceAnalytics(); + const [params, setParams] = useQueryStates(tableParams, tableParamsOptions); + + if (isPending) return ; + // A failed dashboard shouldn't take the table down with it. + if (isError || !data) return null; + + const tiles = buildTiles(data); + + const apply = (filter: string[]) => { + const same = + filter.length === params.status.length && filter.every((f) => params.status.includes(f)); + // Clicking the active tile again clears it, so tiles behave like toggles. + setParams({ status: same ? [] : filter, page: 1 }); + }; + + return ( +
    + {tiles.map((tile, i) => { + const Icon = tile.icon; + const active = + tile.filter.length > 0 && + tile.filter.length === params.status.length && + tile.filter.every((f) => params.status.includes(f)); + const isClear = tile.filter.length === 0 && params.status.length === 0; + const on = active || isClear; + + return ( + + + + + +

    {tile.hint}

    +
    +
    + ); + })} +
    + ); +} + +function DeltaChip({ delta }: { delta: number }) { + const up = delta >= 0; + const Icon = up ? TrendingUp : TrendingDown; + return ( + + + {up ? "+" : ""} + {Math.round(delta * 100)}% + + ); +} + +function StatsSkeletonRow() { + return ( +
    + {Array.from({ length: 4 }).map((_, i) => ( +
    + +
    + + + +
    +
    + ))} +
    + ); +} diff --git a/src/components/DetailViewPanel.tsx b/src/components/DetailViewPanel.tsx new file mode 100644 index 0000000..30b6153 --- /dev/null +++ b/src/components/DetailViewPanel.tsx @@ -0,0 +1,983 @@ +import { useEffect, useRef, useState } from "react"; +import { useQuery } from "@tanstack/react-query"; +import { + Bot, + Building2, + Calendar, + Check, + ChevronDown, + ChevronUp, + CircleSlash, + FileText, + Gavel, + History, + Landmark, + MessageSquare, + Minus, + ReceiptText, + Sparkles, + TriangleAlert, + X, + type LucideIcon, +} from "lucide-react"; +import { cn } from "@/lib/utils"; +import { Separator } from "@/components/ui/separator"; +import { Skeleton } from "@/components/ui/skeleton"; +import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; +import { getDVScreen, getDetailView } from "@/api/viewService"; +import { useInstanceDetail } from "@/hooks/useInstanceDetail"; +import { DetailSkeleton } from "./Skeleton"; +import StatusBadge from "./StatusBadge"; +import WorkflowStepper from "./WorkflowStepper"; +import SourceDocument from "./SourceDocument"; +import AuditTrail from "./AuditTrail"; +import AiActivity from "./AiActivity"; +import { colorForName } from "@/lib/palette"; +import { + overallTone, + parseEvidence, + parseMatchSummary, + type Tone, + type Verdict, +} from "@/lib/matchSummary"; +import { formatCurrency, formatDate, formatLabel, formatRelative, formatValue } from "@/lib/format"; + +interface Field { + field_key: string; + output_label: string; + data_type: string; +} +interface Props { + viewId: number | string; + instanceId: string; + /** Lets the shell show a real title in the breadcrumb instead of a UUID. */ + onTitle?: (title: string) => void; +} + +// --------------------------------------------------------------------------- +// Field taxonomy +// +// Verified against GET /app/169/view/detailview across instances in every +// state (submitted, AI analysis, awaiting clarification, financial review, +// approved, rejected, on hold). Keys are matched exactly rather than by +// substring: the old heuristics put `payment_terms` ("Net 30") in the money +// column, where it rendered as "—", and filed the department's and reviewer's +// own words under an "AI generated" heading. +// +// Anything not listed falls through to the Details grid, so a new field the +// server starts serving shows up rather than vanishing. +// --------------------------------------------------------------------------- + +/** Rendered by the header/rail directly, not as a field row. */ +const HANDLED = new Set([ + "instance_id", + "current_state_id", + "current_state_name", + "po_status", + "created_at", + "invoice_number", + "po_number", + "vendor_name", + "vendor_id", + "total_amount", + "tax_amount", +]); + +/** The AI's own assessment. */ +const AI_KEYS = [ + "recommendation", + "ai_confidence", + "match_summary", + "ai_reasoning", + "analysis_so_far", + "recommended_amount", +]; + +/** The AI's question to a department, and that department's answer. */ +const CLARIFY_KEYS = [ + "target_department", + "clarification_question", + "clarification_context", + "response_text", + "response_notes", + "confirmed_quantity", +]; + +/** What a human reviewer decided. */ +const DECISION_KEYS = [ + "approved_amount", + "rejection_reason", + "reviewer_notes_2", + "hold_reason", +]; + +const has = (row: Record, key: string) => { + const v = row[key]; + return v != null && v !== "" && !(typeof v === "string" && !v.trim()); +}; + +const text = (row: Record, key: string) => String(row[key] ?? "").trim(); + +/** The AI's verdict vocabulary, as served in `recommendation`. */ +const VERDICT: Record = { + approve: { label: "Recommends approval", text: "text-state-approved", icon: Check }, + reject: { label: "Recommends rejection", text: "text-state-rejected", icon: X }, + hold: { label: "Recommends hold", text: "text-state-hold", icon: CircleSlash }, +}; + +/** Normalise a 0–1 or 0–100 score to a percentage. `ai_confidence` is 0–1. */ +function toPercent(value: unknown): number | null { + const n = Number(value); + if (!Number.isFinite(n)) return null; + return Math.max(0, Math.min(n > 1 ? n : n * 100, 100)); +} + +/** + * Confidence banding. 0.9 is the conventional auto-accept cutoff in document + * extraction; below ~60% a human should re-key rather than correct. + */ +function band(pct: number): "high" | "medium" | "low" { + return pct >= 90 ? "high" : pct >= 60 ? "medium" : "low"; +} + +const BAND_STYLE = { + high: { text: "text-state-approved", bar: "bg-state-approved", label: "High confidence" }, + medium: { + text: "text-state-clarification", + bar: "bg-state-clarification", + label: "Medium confidence — worth a glance", + }, + low: { + text: "text-state-rejected", + bar: "bg-state-rejected", + label: "Low confidence — verify against the document", + }, +} as const; + +// `match_summary` and `analysis_so_far` parsing lives in lib/matchSummary.ts. +// That parser handles cases mine did not: entity labels with digits and +// hyphens ("PO-3001:", "GR:"), a `warn` tone for PARTIAL/MISSING/PENDING, and +// "Payments: NONE" as neutral rather than a warning — NONE is the *good* +// outcome for a duplicate check. + +// --------------------------------------------------------------------------- + +export default function DetailViewPanel({ viewId, instanceId, onTitle }: Props) { + const { data, isPending, isError, error } = useQuery({ + queryKey: ["detail-view", String(viewId), instanceId], + enabled: !!instanceId, + queryFn: async () => { + // Prefer the dv_screen's template; fall back to treating viewId as the + // template itself for older configs. + let res; + try { + const dv = await getDVScreen(viewId); + res = await getDetailView(dv.dv_template_uid, instanceId); + } catch { + res = await getDetailView(viewId, instanceId); + } + return { + fields: (res.config?.fields ?? []).filter((f: Field) => f.field_key !== ""), + data: res.data ?? {}, + }; + }, + }); + + // Audit trail, AI decisions/traces and the uploaded PDF — one pass, shared by + // the three blocks below. + const instance = useInstanceDetail(instanceId); + + const titleRef = useRef(null); + + const fields: Field[] = data?.fields ?? []; + const row = data?.data ?? {}; + + const invoiceNo = text(row, "invoice_number"); + const poNo = text(row, "po_number"); + const title = invoiceNo || poNo; + + // Report the human-readable title upward for the breadcrumb. + useEffect(() => { + if (title && title !== titleRef.current) { + titleRef.current = title; + onTitle?.(title); + } + }, [title, onTitle]); + + if (isPending) return ; + if (isError) { + return ( +
    + +

    {(error as Error)?.message}

    +
    + ); + } + if (!fields.length) return null; + + const byKey = new Map(fields.map((f) => [f.field_key, f])); + const pick = (keys: string[]) => + keys.map((k) => byKey.get(k)).filter((f): f is Field => !!f && has(row, f.field_key)); + + const stateName = text(row, "current_state_name") || text(row, "po_status"); + const vendorName = text(row, "vendor_name"); + const vendorId = text(row, "vendor_id"); + const total = has(row, "total_amount") ? Number(row.total_amount) : null; + + const aiFields = pick(AI_KEYS); + const clarifyFields = pick(CLARIFY_KEYS); + const decisionFields = pick(DECISION_KEYS); + + // Everything the sections above don't claim — invoice_date, payment_terms, + // the Currency field (served under the opaque key `field_5`), notes, and any + // field the server adds later. + const detailFields = fields.filter( + (f) => + !HANDLED.has(f.field_key) && + !AI_KEYS.includes(f.field_key) && + !CLARIFY_KEYS.includes(f.field_key) && + !DECISION_KEYS.includes(f.field_key) && + has(row, f.field_key), + ); + + return ( +
    + + + {/* One surface, divided by hairlines. Every section used to be its own + bordered card, which read as a pile of boxes. */} +
    + {/* ══ Header ═════════════════════════════════════════════════════════ */} +
    +
    +
    +
    + {invoiceNo && ( +

    {invoiceNo}

    + )} + + {/* The PO reference used to be dropped entirely — it was + classified alongside the invoice number and only the first of + the pair was ever rendered. */} + {poNo && ( + + {poNo} + + )} +
    + +
    + {vendorName && {vendorName}} + {has(row, "created_at") && ( + + + {formatDate(text(row, "created_at"))} + {formatRelative(text(row, "created_at")) && ( + + · {formatRelative(text(row, "created_at"))} + + )} + + )} + {has(row, "instance_id") && ( + #{text(row, "instance_id")} + )} +
    +
    + + {total !== null && total > 0 && ( +
    +

    + {byKey.get("total_amount")?.output_label ?? "Total"} +

    +

    + {formatCurrency(total)} +

    +
    + )} +
    +
    + +
    + {/* ══ Main column ══════════════════════════════════════════════════ */} +
    + {aiFields.length > 0 && } + {clarifyFields.length > 0 && } + {decisionFields.length > 0 && ( + + )} + + {/* The document the whole record is about — write-only until now. */} + {(instance.invoicePdf || instance.loading) && ( + + {instance.loading && !instance.invoicePdf ? ( + + ) : ( + + )} + + )} + + + {instance.loading ? ( + + ) : ( + + )} + + + + {instance.loading ? ( + + ) : ( + + )} + +
    + + {/* ══ Rail ═════════════════════════════════════════════════════════ */} + +
    +
    +
    + ); +} + +// --------------------------------------------------------------------------- +// Sections +// --------------------------------------------------------------------------- + +/** The AI's assessment: verdict, confidence, 3-way match result, reasoning. */ +function AiAssessment({ + row, + byKey, +}: { + row: Record; + byKey: Map; +}) { + const verdict = VERDICT[text(row, "recommendation").toLowerCase()]; + const pct = has(row, "ai_confidence") ? toPercent(row.ai_confidence) : null; + const checks = parseMatchSummary(text(row, "match_summary")); + const failed = checks.filter((c) => c.tone === "bad" || c.tone === "warn").length; + const worst = overallTone(checks); + // Failures lead — a mismatch buried below four passes is the one thing a + // reviewer must not skim past. + const rank = (t: Tone) => (t === "bad" ? 0 : t === "warn" ? 1 : 2); + const ordered = [...checks].sort((a, b) => rank(a.tone) - rank(b.tone)); + // The evidence the verdict was reached from. Previously dropped outright by + // SKIP_KEYS for looking like a JSON blob, then shown as raw prose. + const evidence = parseEvidence(text(row, "analysis_so_far")); + const recommended = has(row, "recommended_amount") ? Number(row.recommended_amount) : null; + + return ( +
    +
    + + Automated 3-Way Match + + {/* Names the actor rather than restating "AI" a third time. */} + + Zino AI Agent + +
    + + {/* Verdict first: what the agent concluded, at what amount, how sure. */} + {(verdict || pct !== null || recommended !== null) && ( +
    + {verdict && ( + + + {verdict.label} + + )} + {recommended !== null && recommended > 0 && ( + + at{" "} + + {formatCurrency(recommended)} + + + )} + {pct !== null && } +
    + )} + + {/* Then the checks that produced it… */} + {checks.length > 0 && ( + 0 ? ( + + {failed} {failed === 1 ? "issue" : "issues"} + + ) : ( + + All {checks.length} checks pass + + ) + } + > +
      + {ordered.map((c) => ( + + ))} +
    +
    + )} + + {/* …then the underlying records those checks were run against — PO, + goods receipt, contract, payment history and the discrepancy. */} + {evidence.length > 0 && ( + +
    + {evidence.map((e) => ( +
    +
    + {e.label} +
    +
    + {e.value} +
    +
    + ))} +
    +
    + )} + + {/* Reasoning last: it narrates everything above, so it reads as the + conclusion rather than the preamble. */} + {has(row, "ai_reasoning") && ( + + + + )} +
    + ); +} + +/** + * A labelled part of the AI block. The hairline above each one gives the + * section an internal rhythm without nesting cards inside a card. + */ +function SubBlock({ + title, + badge, + icon: Icon, + children, +}: { + title: string; + badge?: React.ReactNode; + icon?: LucideIcon; + children: React.ReactNode; +}) { + return ( +
    +
    + {Icon && } +

    + {title} +

    + {badge} +
    + {children} +
    + ); +} + +/** + * The clarification exchange, rendered as the conversation it is: the AI asks a + * department a question, the department answers. Previously both halves sat + * under an "AI generated" badge, crediting the AI with the department's reply. + */ +function ClarificationThread({ + row, + byKey, +}: { + row: Record; + byKey: Map; +}) { + const dept = text(row, "target_department"); + const answered = has(row, "response_text") || has(row, "response_notes"); + const confirmed = has(row, "confirmed_quantity") ? Number(row.confirmed_quantity) : null; + + return ( + + {/* A timeline, not two cards: the vertical rule carries the exchange. */} +
      + {(has(row, "clarification_question") || has(row, "clarification_context")) && ( +
    1. + +
      +

      + AI asked{dept && ` · ${formatLabel(dept)}`} +

      + {has(row, "clarification_question") && ( + + )} + {has(row, "clarification_context") && ( + <> +

      + {byKey.get("clarification_context")?.output_label ?? "Context"} +

      + + + )} +
      +
    2. + )} + + {answered && ( +
    3. + +
      +

      + {dept ? `${formatLabel(dept)} replied` : "Reply"} +

      + {has(row, "response_text") && } + {has(row, "response_notes") && ( + <> +

      + {byKey.get("response_notes")?.output_label ?? "Additional Notes"} +

      + + + )} + {confirmed !== null && confirmed > 0 && ( +

      + {byKey.get("confirmed_quantity")?.output_label ?? "Confirmed Quantity"}:{" "} + + {confirmed.toLocaleString("en-IN")} + +

      + )} +
      +
    4. + )} +
    +
    + ); +} + +/** What the human reviewer decided, and why. */ +function Decision({ + row, + fields, + state, +}: { + row: Record; + fields: Field[]; + state: string; +}) { + const approved = has(row, "approved_amount") ? Number(row.approved_amount) : null; + // reviewer_notes_2 is served verbatim-identical to rejection_reason on the + // rejected instances, so showing both would just repeat the sentence. + const seen = new Set(); + const reasons = fields.filter((f) => { + if (f.field_key === "approved_amount") return false; + const v = text(row, f.field_key); + if (seen.has(v)) return false; + seen.add(v); + return true; + }); + + return ( + + {approved !== null && approved > 0 && ( +
    + Approved amount + + {formatCurrency(approved)} + +
    + )} +
    + {reasons.map((f) => ( +
    +

    + {formatLabel(f.output_label)} +

    + +
    + ))} +
    + {reasons.length === 0 && approved === null && ( +

    Decided in state “{state}”.

    + )} +
    + ); +} + +/** Money rail: the served amounts, plus recommended-vs-approved when both exist. */ +function Financials({ + row, + byKey, + total, +}: { + row: Record; + byKey: Map; + total: number | null; +}) { + const tax = has(row, "tax_amount") ? Number(row.tax_amount) : null; + const recommended = has(row, "recommended_amount") ? Number(row.recommended_amount) : null; + const approved = has(row, "approved_amount") ? Number(row.approved_amount) : null; + + if (total === null && tax === null) { + return ( + +

    No amounts on this record.

    +
    + ); + } + + return ( + + {tax !== null && ( + + )} + {total !== null && ( + <> + +
    + + {byKey.get("total_amount")?.output_label ?? "Total"} + + + {formatCurrency(total)} + +
    + + )} + + {(recommended !== null || approved !== null) && ( +
    + {recommended !== null && ( + + )} + {approved !== null && ( + + )} +
    + )} +
    + ); +} + +// --------------------------------------------------------------------------- +// Pieces +// --------------------------------------------------------------------------- + +/** A titled region of the single surface — no border of its own. */ +function Block({ + label, + icon, + children, + className, +}: { + label: string; + icon: LucideIcon; + children: React.ReactNode; + className?: string; +}) { + return ( +
    + {label} + {children} +
    + ); +} + +function SectionLabel({ + children, + icon: Icon, + className, +}: { + children: React.ReactNode; + icon?: LucideIcon; + className?: string; +}) { + return ( +

    + {Icon && ( + + + + )} + {children} +

    + ); +} + +function FieldRow({ field, value }: { field: Field; value: unknown }) { + return ( +
    +
    {formatLabel(field.output_label)}
    +
    + {formatValue(value, field.data_type, field.field_key)} +
    +
    + ); +} + +const MATCH_TONE: Record = { + good: { + text: "text-state-approved", + disc: "bg-state-approved/12 text-state-approved", + icon: Check, + }, + bad: { text: "text-state-rejected", disc: "bg-state-rejected/12 text-state-rejected", icon: X }, + warn: { + text: "text-state-clarification", + disc: "bg-state-clarification/12 text-state-clarification", + icon: TriangleAlert, + }, + neutral: { text: "text-muted-foreground", disc: "bg-muted text-muted-foreground", icon: Minus }, +}; + +/** + * One 3-way-match check. Two lines: verdict on the first so the column of + * MATCH/MISMATCH scans vertically, supporting detail muted beneath it. + */ +function MatchRow({ check }: { check: Verdict }) { + const tone = MATCH_TONE[check.tone]; + return ( +
  • + + + +
    +

    + {check.label} + {check.verdict && ( + + {check.verdict} + + )} +

    + {check.detail && ( +

    {check.detail}

    + )} +
    +
  • + ); +} + +function Confidence({ pct }: { pct: number }) { + const style = BAND_STYLE[band(pct)]; + return ( + + + + Confidence + + + + + {pct.toFixed(0)}% + + + + {style.label} + + ); +} + +function Bubble({ icon: Icon, tone }: { icon: LucideIcon; tone: "primary" | "clarification" }) { + return ( + + + + ); +} + +function Avatar({ name }: { name: string }) { + const initials = name + .split(/\s+/) + .filter((w) => /[a-z0-9]/i.test(w)) + .slice(0, 2) + .map((w) => w[0]!.toUpperCase()) + .join(""); + const tint = colorForName(name); + return ( + + {initials || "?"} + + ); +} + +function AmountRow({ + label, + value, + emphasis, + hint, +}: { + label: string; + value: number; + emphasis?: boolean; + hint?: string; +}) { + return ( +
    + + {formatLabel(label)} + {hint && ( + + {hint} + + )} + + + {Number.isFinite(value) ? formatCurrency(value) : "—"} + +
    + ); +} + +/** Three lines by default, expandable. */ +function ClampedText({ text: value, muted }: { text: string; muted?: boolean }) { + const [expanded, setExpanded] = useState(false); + const [clamped, setClamped] = useState(false); + const ref = useRef(null); + + useEffect(() => { + const el = ref.current; + if (el) setClamped(el.scrollHeight > el.clientHeight + 2); + }, [value]); + + return ( +
    +

    + {/* The served prose is padded with runs of layout whitespace. */} + {value.replace(/[ \t]{2,}/g, " ")} +

    + {(clamped || expanded) && ( + + )} +
    + ); +} diff --git a/src/components/DynamicHeader.tsx b/src/components/DynamicHeader.tsx new file mode 100644 index 0000000..ae09c8d --- /dev/null +++ b/src/components/DynamicHeader.tsx @@ -0,0 +1,374 @@ +import { useNavigate } from "react-router-dom"; +import { + FileText, + HelpCircle, + Landmark, + List, + LogOut, + Moon, + PanelLeftClose, + PanelLeftOpen, + Settings, + ShoppingCart, + Sun, +} from "lucide-react"; +import { cn } from "@/lib/utils"; +import { Button } from "@/components/ui/button"; +import { Separator } from "@/components/ui/separator"; +import { Sheet, SheetContent, SheetTitle } from "@/components/ui/sheet"; +import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { Skeleton } from "@/components/ui/skeleton"; +import { useAuthContext } from "@/hooks/AuthContext"; +import { useTheme } from "@/hooks/ThemeContext"; +import { useHeaderConfig } from "@/hooks/useHeaderConfig"; +import { RDBMS_RV_SCREEN_UUID } from "@/config"; +import type { NavItem } from "@/api/viewService"; + +const ICON_MAP: Record = { + receipt_long: FileText, + help_outline: HelpCircle, + account_balance: Landmark, + list_alt: List, + inventory_2: FileText, + question_mark: HelpCircle, + list: List, +}; + +/** Screens not present in the served nav config. */ +const EXTRA_NAV: Array<{ id: string; screen_uuid: string; label: string; icon: typeof FileText }> = [ + { + id: "vendor-data", + screen_uuid: RDBMS_RV_SCREEN_UUID, + label: "Purchase Orders", + icon: ShoppingCart, + }, +]; + +interface Props { + activeScreenId: string | null; + onNavigate: (screenUuid: string) => void; + sidebar: { + open: boolean; + toggle: () => void; + isMobile: boolean; + mobileOpen: boolean; + setMobileOpen: (v: boolean) => void; + }; +} + +export default function DynamicHeader({ + activeScreenId, + onNavigate, + sidebar, +}: Props) { + const { user, logout } = useAuthContext(); + const { theme, toggleTheme } = useTheme(); + const navigate = useNavigate(); + const { navItems, isPending } = useHeaderConfig(); + + const handleLogout = () => { + logout(); + navigate("/login"); + }; + + const initials = (user?.name || "U") + .split(" ") + .map((n) => n[0]) + .join("") + .slice(0, 2) + .toUpperCase(); + + const roleName = user?.roles?.[0]?.replace(/^p2p_/, "").replace(/_/g, " ") ?? ""; + + // Collapsed on desktop = icon rail. Previously the sidebar animated to w-0, + // which took the entire navigation away instead of condensing it. + const railed = !sidebar.open && !sidebar.isMobile; + + const items = [ + ...navItems.map((item: NavItem) => ({ + id: item.id, + screen_uuid: item.screen_uuid, + label: item.label, + Icon: ICON_MAP[item.icon] ?? FileText, + })), + ...EXTRA_NAV.map((e) => ({ + id: e.id, + screen_uuid: e.screen_uuid, + label: e.label, + Icon: e.icon, + })), + ]; + + const nav = ( + { + onNavigate(id); + sidebar.setMobileOpen(false); + }} + user={{ name: user?.name, roleName, initials }} + onLogout={handleLogout} + /> + ); + + return ( + <> + {/* ── Top bar ───────────────────────────────────────────────────────── */} + {/* Offset past the sidebar so the two read as one chrome: the sidebar + runs full height and owns the brand; the bar starts where it ends. */} +
    +
    + + + + + Toggle navigation + + + {/* On desktop the sidebar carries the identity; repeating the logo + here would double it up. */} + {sidebar.isMobile && ( + Zino + )} +
    + +
    + + + + + {theme === "dark" ? "Light mode" : "Dark mode"} + + + + + + + +
    +
    +
    + {initials} +
    +
    +

    {user?.name}

    +

    {user?.email}

    +
    +
    + {roleName && ( + + {roleName} + + )} +
    + + + + Settings + + + + + Sign out + +
    +
    +
    +
    + + {/* ── Sidebar ───────────────────────────────────────────────────────── */} + {sidebar.isMobile ? ( + + + Navigation + {nav} + + + ) : ( + + )} + + ); +} + +// --------------------------------------------------------------------------- + +interface SidebarBodyProps { + items: Array<{ id: string; screen_uuid: string; label: string; Icon: typeof FileText }>; + isPending: boolean; + railed: boolean; + activeScreenId: string | null; + onNavigate: (screenUuid: string) => void; + user: { name?: string; roleName: string; initials: string }; + onLogout: () => void; +} + +function SidebarBody({ + items, + isPending, + railed, + activeScreenId, + onNavigate, + user, + onLogout, +}: SidebarBodyProps) { + return ( +
    + {/* App identity — h-14 with a bottom border so it lines up exactly with + the top bar and the two read as one continuous frame. */} +
    + {/* 43×20 wordmark — fits the 56px rail as-is, so it needs no separate + collapsed mark. Inverted in dark mode like the top-bar copy. */} + Zino + {!railed && ( + + Procure to Pay + + )} +
    + + {/* Nav */} + + + {/* User card */} + +
    + +
    +
    + ); +} diff --git a/src/components/FormModal.tsx b/src/components/FormModal.tsx new file mode 100644 index 0000000..fbc2647 --- /dev/null +++ b/src/components/FormModal.tsx @@ -0,0 +1,429 @@ +import { useEffect, useMemo, useState } from "react"; +import { useQuery } from "@tanstack/react-query"; +import { AlertCircle, ArrowRight, CheckCircle2, Loader2 } from "lucide-react"; +import { toast } from "sonner"; +import { cn } from "@/lib/utils"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Textarea } from "@/components/ui/textarea"; +import { Skeleton } from "@/components/ui/skeleton"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { + getFormScreen, + performActivity, + startWorkflow, + uploadFieldFile, + type FieldFileContext, + type FormScreenField, +} from "@/api/viewService"; +import { WORKFLOW_ID } from "@/config"; +import OcrUploadField, { resolveOcrConfig } from "./OcrUploadField"; + +type FormField = FormScreenField; +interface GridItem { + i: string; + x: number; + y: number; + w: number; + h: number; +} + +// Field types whose value is a File rather than a scalar. They skip string +// validation and number coercion, and their File is uploaded via /upload before +// submit so instance data references the blob by metadata. +const MEDIA_TYPES = new Set(["ocr", "file", "image"]); + +const isEmpty = (v: unknown) => + v == null || + (typeof v === "string" && v.trim() === "") || + (Array.isArray(v) && v.length === 0); + +interface Props { + activityId: string; + instanceId?: string; + title?: string; + onClose: () => void; + onSuccess: () => void; +} + +export default function FormModal({ activityId, instanceId, title, onClose, onSuccess }: Props) { + const [formData, setFormData] = useState>({}); + const [touched, setTouched] = useState>(new Set()); + const [submitting, setSubmitting] = useState(false); + const [succeeded, setSucceeded] = useState(false); + const [error, setError] = useState(null); + + const { data, isPending } = useQuery({ + queryKey: ["form-screen", activityId, instanceId], + queryFn: () => getFormScreen(activityId, instanceId) as Promise, + }); + + const fields: FormField[] = data?.fields ?? data?.form_json?.fields ?? []; + const gridConfig: GridItem[] = data?.grid_config ?? []; + const formTitle = data?.activity_name || title || "Form"; + + // /upload and /ocr-extract resolve the field's deployed config and RBAC from + // these identifiers. The form screen echoes them; WORKFLOW_ID is the fallback + // for older view-service builds that don't. + const fileCtx: Omit = { + workflowUuid: data?.workflow_uuid || WORKFLOW_ID, + activityId, + versionUuid: data?.version_uuid || undefined, + instanceId, + }; + + // Seed prefills once the schema arrives. + useEffect(() => { + if (!fields.length) return; + const pre: Record = {}; + for (const f of fields) { + if (f.value == null) continue; + // Media prefills are already-uploaded metadata arrays, not strings. + pre[f.id] = MEDIA_TYPES.has(f.data_type) ? f.value : String(f.value); + } + setFormData(pre); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [data]); + + /** Rows derived from the studio grid layout, so field order matches design. */ + const rows = useMemo(() => { + const sorted = [...fields].sort((a, b) => { + const ga = gridConfig.find((g) => g.i === a.uid); + const gb = gridConfig.find((g) => g.i === b.uid); + if (!ga || !gb) return 0; + return ga.y !== gb.y ? ga.y - gb.y : ga.x - gb.x; + }); + const out: FormField[][] = []; + let currentY = -1; + for (const f of sorted) { + const y = gridConfig.find((g) => g.i === f.uid)?.y ?? out.length; + if (y !== currentY) { + out.push([]); + currentY = y; + } + out[out.length - 1].push(f); + } + return out; + }, [fields, gridConfig]); + + const setValue = (id: string, v: unknown) => { + setFormData((p) => ({ ...p, [id]: v })); + setTouched((t) => new Set(t).add(id)); + if (error) setError(null); + }; + + /** Write an OCR result into the fields ocr_config.field_mappings points at. */ + const applyExtraction = (ocrField: FormField, extracted: Record): number => { + const mappings = resolveOcrConfig(ocrField).field_mappings ?? []; + const next: Record = {}; + for (const m of mappings) { + if (!m?.extraction_key || !m?.target_field) continue; + const raw = extracted[m.extraction_key]; + if (raw == null || raw === "") continue; // key absent, or model found nothing + const target = fields.find((f) => f.id === m.target_field); + const coerced = coerceExtracted(raw, target?.data_type); + if (coerced === "") continue; + next[m.target_field] = coerced; + } + const filled = Object.keys(next); + if (filled.length > 0) { + setFormData((p) => ({ ...p, ...next })); + // Mark them touched so a value the model got wrong still shows validation. + setTouched((t) => { + const s = new Set(t); + filled.forEach((k) => s.add(k)); + return s; + }); + setError(null); + } + return filled.length; + }; + + const isMissing = (f: FormField) => f.mandatory && touched.has(f.id) && isEmpty(formData[f.id]); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setTouched(new Set(fields.map((f) => f.id))); + + const missing = fields.filter((f) => f.mandatory && isEmpty(formData[f.id])); + if (missing.length > 0) { + setError(`Please fill in: ${missing.map((f) => f.name).join(", ")}`); + return; + } + + setSubmitting(true); + setError(null); + try { + const payload: Record = {}; + for (const f of fields) { + const v = formData[f.id]; + if (MEDIA_TYPES.has(f.data_type)) { + // A freshly picked File is uploaded now and submitted as metadata; an + // array is already-uploaded metadata from a prefill. + if (v instanceof File) { + payload[f.id] = [await uploadFieldFile(v, { ...fileCtx, fieldId: f.id })]; + } else if (Array.isArray(v)) { + payload[f.id] = v; + } + continue; + } + const s = v ?? ""; + payload[f.id] = f.data_type === "number" ? (s !== "" ? Number(s) : 0) : String(s); + } + + if (instanceId) await performActivity(WORKFLOW_ID, instanceId, activityId, payload); + else await startWorkflow(WORKFLOW_ID, activityId, payload); + + setSucceeded(true); + // The toast outlives the dialog. The old 800ms in-modal overlay vanished + // with the modal, leaving no confirmation behind at all. + toast.success(`${formTitle} submitted`, { + description: instanceId ? "The invoice has been updated." : "A new invoice was created.", + }); + setTimeout(onSuccess, 600); + } catch (err: any) { + const message = err?.message || "Submission failed"; + setError(message); + toast.error(`${formTitle} failed`, { description: message }); + } finally { + setSubmitting(false); + } + }; + + return ( + !o && !submitting && onClose()}> + {/* Radix supplies the focus trap, Escape handling, aria-modal, scroll lock + and focus restore that the hand-rolled overlay never had. */} + submitting && e.preventDefault()} + > + + {formTitle} + + {instanceId ? "Update the details below." : "Fill in the details to submit."} + + + +
    + {isPending ? ( +
    + {Array.from({ length: 4 }).map((_, r) => ( +
    + {Array.from({ length: 2 }).map((__, c) => ( +
    + + +
    + ))} +
    + ))} +
    + ) : ( +
    + {rows.map((row, ri) => ( +
    1 ? "sm:grid-cols-2" : "grid-cols-1")} + > + {row.map((f) => { + const invalid = isMissing(f); + return ( +
    + + + {MEDIA_TYPES.has(f.data_type) ? ( + setValue(f.id, file)} + onExtracted={(extracted) => applyExtraction(f, extracted)} + hasError={invalid} + /> + ) : ( + setValue(f.id, v)} + invalid={invalid} + /> + )} + + {invalid && ( +

    + + Required +

    + )} +
    + ); + })} +
    + ))} +
    + )} + + {error && ( +
    + + {error} +
    + )} +
    + + {/* mx-0/mb-0 cancel DialogFooter's default negative margins, which + assume the content keeps its own padding — this dialog is p-0. */} + {!isPending && ( + +

    + * Required +

    +
    + + +
    +
    + )} +
    +
    + ); +} + +// --------------------------------------------------------------------------- +// Inputs +// --------------------------------------------------------------------------- + +function FieldInput({ + field, + value, + onChange, + invalid, +}: { + field: FormField; + value: string; + onChange: (v: string) => void; + invalid: boolean; +}) { + const options = field.properties?.options; + const describedBy = invalid ? `${field.id}-error` : undefined; + + if (options && options.length > 0) { + return ( + + ); + } + + const common = { + id: field.id, + value, + "aria-invalid": invalid, + "aria-describedby": describedBy, + onChange: (e: React.ChangeEvent) => + onChange(e.target.value), + }; + + switch (field.data_type) { + case "longtext": + return