paradiseDev commited on
Commit
3d67fa4
·
verified ·
1 Parent(s): 6752019

Upload 8 files

Browse files
Files changed (7) hide show
  1. .gitignore +35 -0
  2. app.py +129 -95
  3. gradio_ui.py +121 -238
  4. mcp_host_config.json +10 -0
  5. modal_implementation.py +13 -19
  6. package-lock.json +1430 -0
  7. package.json +5 -0
.gitignore ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Virtual environments
2
+ venv/
3
+ env/
4
+ .env
5
+
6
+ # Python
7
+ __pycache__/
8
+ *.pyc
9
+ *.pyo
10
+ *.pyd
11
+ .Python
12
+ *.so
13
+ .pytest_cache/
14
+
15
+ # IDE
16
+ .vscode/
17
+ .idea/
18
+ *.swp
19
+ *.swo
20
+ mco-protocol.code-workspace
21
+
22
+ # OS
23
+ .DS_Store
24
+ Thumbs.db
25
+
26
+ # Logs
27
+ *.log
28
+
29
+ # Coding Agents
30
+ .claude
31
+ .qodo
32
+ .windsurfrules
33
+ .clinerules
34
+ .blackboxai
35
+ .goose
app.py CHANGED
@@ -1,132 +1,166 @@
1
  #!/usr/bin/env python3
2
  """
3
- MCO Hackathon Final Submission - Main Entry Point
4
 
5
- This script integrates all components of the MCO Hackathon project:
6
- 1. Real Modal API integration for AutoGPT-like agent
7
- 2. Real MCO MCP server for orchestration
8
- 3. Single-page Gradio UI with agent thinking and MCO logs
9
- 4. Visual SNLP generator with value/NLP editing toggle
10
-
11
- Author: Manus AI
12
- Date: June 10, 2025
13
  """
14
 
15
  import os
16
  import sys
17
- import json
18
  import subprocess
19
- import tempfile
20
- from pathlib import Path
21
 
22
- # Set up environment
23
  APP_DIR = os.path.dirname(os.path.abspath(__file__))
24
  os.environ["MCO_CONFIG_DIR"] = os.path.join(APP_DIR, "mco-config")
25
- # The local mco-server.js defaults to port 3000
26
  os.environ["MCO_SERVER_URL"] = "http://localhost:3000"
27
 
28
- # Import components
29
- from modal_implementation import stub as modal_app
30
- from gradio_ui import create_ui
31
- from snlp_generator import SNLPGenerator
32
 
33
- # Check if running in Hugging Face Spaces
34
- IS_HF_SPACE = os.environ.get("SPACE_ID") is not None
35
 
36
  # Global variable to hold the MCO server process
37
  mco_server_process = None
38
 
39
  def setup_mco_server():
40
- """Ensures the MCO MCP server script is available and starts it."""
 
41
  global mco_server_process
42
- print("Setting up and starting MCO MCP server...")
43
- import shutil # For copying files
44
 
45
- app_dir = os.path.dirname(os.path.abspath(__file__))
46
- # Standard name for the server script, matching Dockerfile copy destination
47
- server_script_name = "mco-mcp-server.js"
48
- server_script_path = os.path.join(app_dir, server_script_name)
49
- mco_config_dir = os.environ.get("MCO_CONFIG_DIR", os.path.join(app_dir, "mco-config"))
 
 
 
 
 
 
 
50
 
51
- if not os.path.exists(server_script_path):
52
- print(f"MCO MCP server script '{server_script_name}' not found in '{app_dir}'.")
53
- print("Attempting to install '@paradiselabs/mco-protocol' and copy server script...")
54
- try:
55
- # Ensure npm is available (basic check, validate_environment should do more)
56
- subprocess.run(["npm", "--version"], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
57
-
58
- # Install/update the package - this will create node_modules if not present
59
- print("Running: npm install @paradiselabs/mco-protocol")
60
- subprocess.run(
61
- ["npm", "install", "@paradiselabs/mco-protocol"],
62
- check=True,
63
- cwd=app_dir, # Run npm install in the application directory
64
- stdout=subprocess.PIPE, stderr=subprocess.PIPE
65
- )
66
- print("'@paradiselabs/mco-protocol' package installed/updated.")
67
 
68
- # Define path to the script within node_modules
69
- node_modules_path = os.path.join(app_dir, "node_modules")
70
- source_server_script = os.path.join(node_modules_path, "@paradiselabs", "mco-protocol", "bin", server_script_name)
 
 
 
 
 
 
 
71
 
72
- if os.path.exists(source_server_script):
73
- shutil.copy(source_server_script, server_script_path)
74
- print(f"Copied '{server_script_name}' to '{server_script_path}'.")
75
- else:
76
- print(f"ERROR: Could not find '{server_script_name}' in '{os.path.join(node_modules_path, '@paradiselabs/mco-protocol/bin')}' after npm install.")
77
- print("Please check npm installation and package contents. Cannot start MCO server.")
78
- return
79
- except subprocess.CalledProcessError as e:
80
- print(f"Error during npm operations: {e}")
81
- print(f"stdout: {e.stdout.decode() if e.stdout else 'N/A'}")
82
- print(f"stderr: {e.stderr.decode() if e.stderr else 'N/A'}")
83
- print("Please ensure Node.js and npm are installed and accessible. Cannot start MCO server.")
84
- return
85
- except FileNotFoundError:
86
- print("Error: npm command not found. Please ensure Node.js and npm are installed and in your PATH.")
87
- return
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
 
89
- # Command to start the MCO server directly with node
 
 
 
 
90
  server_command = [
91
  "node",
92
- server_script_path, # Use the now ensured server_script_path
93
- "--config-dir", mco_config_dir,
94
- "--host", "0.0.0.0", # Listen on all interfaces for container accessibility
95
- "--port", "3000" # Explicitly set port, matches MCO_SERVER_URL
 
96
  ]
97
 
98
  try:
99
- print(f"Starting MCO server with command: {' '.join(server_command)}")
100
- mco_server_process = subprocess.Popen(
101
- server_command,
102
- stdout=subprocess.PIPE,
103
- stderr=subprocess.PIPE,
104
- text=True,
105
- cwd=app_dir
106
- )
107
- print(f"MCO MCP server process started with PID: {mco_server_process.pid}")
108
- # Give the server a moment to start up
109
- import time
110
- time.sleep(3) # Increased sleep to allow server to fully initialize
111
- print("MCO MCP server setup and start complete.")
112
 
 
 
 
 
 
113
  except Exception as e:
114
- print(f"Error starting MCO MCP server: {e}")
115
- if mco_server_process:
116
- mco_server_process.terminate()
117
- mco_server_process = None
118
-
119
- # SNLP files are assumed to be present in MCO_CONFIG_DIR
120
- # create_sample_snlp_files() # Removed this call
121
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
122
 
123
- # def create_sample_snlp_files(): # Function removed as SNLP files are expected to exist
124
- # """Create sample SNLP files if they don't exist"""
125
- # generator = SNLPGenerator()
126
- #
127
- # # Check if any SNLP files exist
128
- # if not any(os.path.exists(os.path.join(os.environ["MCO_CONFIG_DIR"], file))
129
- # for file in ["mco.core", "mco.sc", "mco.features", "mco.styles"]):
130
  # print("Creating sample SNLP files...")
131
  # generator.generate_sample_files("General", "Python")
132
  # print("Sample SNLP files created")
 
1
  #!/usr/bin/env python3
2
  """
3
+ MCO Hackathon Demo - Main Entry Point
4
 
5
+ This script sets up and runs the MCO Hackathon project:
6
+ 1. Starts the MCO MCP server for orchestration.
7
+ 2. Launches the polished Gradio UI for the demonstration.
 
 
 
 
 
8
  """
9
 
10
  import os
11
  import sys
 
12
  import subprocess
13
+ import time
14
+ import shutil
15
 
16
+ # Set up environment variables before other imports
17
  APP_DIR = os.path.dirname(os.path.abspath(__file__))
18
  os.environ["MCO_CONFIG_DIR"] = os.path.join(APP_DIR, "mco-config")
 
19
  os.environ["MCO_SERVER_URL"] = "http://localhost:3000"
20
 
21
+ # Import the Gradio UI creation function
22
+ from gradio_ui import create_gradio_ui
 
 
23
 
24
+ print("--- app.py: Script execution started (top level) ---")
 
25
 
26
  # Global variable to hold the MCO server process
27
  mco_server_process = None
28
 
29
  def setup_mco_server():
30
+ print("--- app.py: setup_mco_server() function started ---")
31
+ """Installs MCO dependencies via npm and starts the server."""
32
  global mco_server_process
33
+ print("--- Setting up and starting MCO MCP server ---")
 
34
 
35
+ # Step 1: Ensure npm dependencies are installed (cleanly).
36
+ print("--- Performing a clean install of MCO server dependencies via npm... ---")
37
+ try:
38
+ # Clean up old artifacts
39
+ node_modules_path = os.path.join(APP_DIR, "node_modules")
40
+ package_lock_path = os.path.join(APP_DIR, "package-lock.json")
41
+ if os.path.isdir(node_modules_path):
42
+ print(f"Removing existing node_modules directory: {node_modules_path}")
43
+ shutil.rmtree(node_modules_path)
44
+ if os.path.exists(package_lock_path):
45
+ print(f"Removing existing package-lock.json: {package_lock_path}")
46
+ os.remove(package_lock_path)
47
 
48
+ # General npm install for all dependencies
49
+ print("Running general 'npm install'...")
50
+ npm_install_command = ["npm", "install"]
51
+ print(f"Executing: {' '.join(npm_install_command)}")
52
+ npm_install_process = subprocess.run(npm_install_command, cwd=APP_DIR, check=True, capture_output=True, text=True)
53
+ print("--- npm install stdout ---")
54
+ print(npm_install_process.stdout)
55
+ print("--- npm install stderr ---")
56
+ print(npm_install_process.stderr)
57
+ print("'npm install' completed.")
 
 
 
 
 
 
58
 
59
+ # Specifically install/update @paradiselabs/mco-protocol to the latest version
60
+ print("Ensuring latest '@paradiselabs/mco-protocol' is installed...")
61
+ npm_update_specific_pkg_command = ["npm", "install", "@paradiselabs/mco-protocol@latest"]
62
+ print(f"Executing: {' '.join(npm_update_specific_pkg_command)}")
63
+ npm_update_specific_pkg_process = subprocess.run(npm_update_specific_pkg_command, cwd=APP_DIR, check=True, capture_output=True, text=True)
64
+ print("--- npm install @paradiselabs/mco-protocol@latest stdout ---")
65
+ print(npm_update_specific_pkg_process.stdout)
66
+ print("--- npm install @paradiselabs/mco-protocol@latest stderr ---")
67
+ print(npm_update_specific_pkg_process.stderr)
68
+ print("'@paradiselabs/mco-protocol@latest' installed/updated.")
69
 
70
+ # Hot-patch mco-server.js to fix internal pathing issue
71
+ mco_server_script_to_patch_path = os.path.join(APP_DIR, "node_modules", "@paradiselabs", "mco-protocol", "bin", "mco-server.js")
72
+ if os.path.exists(mco_server_script_to_patch_path):
73
+ print(f"Attempting to hot-patch {mco_server_script_to_patch_path}...")
74
+ try:
75
+ with open(mco_server_script_to_patch_path, 'r') as f:
76
+ content = f.read()
77
+
78
+ original_substring = "require('./lib/"
79
+ corrected_substring = "require('../lib/"
80
+
81
+ if original_substring in content:
82
+ content = content.replace(original_substring, corrected_substring)
83
+ with open(mco_server_script_to_patch_path, 'w') as f:
84
+ f.write(content)
85
+ print(f"Successfully patched {mco_server_script_to_patch_path}: replaced all instances of '{original_substring}' with '{corrected_substring}'.")
86
+ else:
87
+ print(f"Hot-patch warning: Original substring '{original_substring}' not found in {mco_server_script_to_patch_path}. The script might already be patched or has changed.")
88
+ except Exception as patch_err:
89
+ print(f"Error during hot-patching {mco_server_script_to_patch_path}: {patch_err}")
90
+ else:
91
+ print(f"Hot-patch error: {mco_server_script_to_patch_path} not found. Cannot apply patch.")
92
+
93
+ except subprocess.CalledProcessError as e:
94
+ print(f"ERROR: npm command failed with exit code {e.returncode}.")
95
+ print(f"Command: {' '.join(e.cmd)}")
96
+ print(f"stdout:\n{e.stdout}")
97
+ print(f"stderr:\n{e.stderr}")
98
+ sys.exit(1)
99
+ except FileNotFoundError:
100
+ print("ERROR: `npm` command not found. Please ensure Node.js and npm are installed.")
101
+ sys.exit(1)
102
+ except Exception as e:
103
+ print(f"An unexpected error occurred during npm setup: {e}")
104
+ sys.exit(1)
105
+
106
+ # Step 2: Attempt to run the server using mco-cli.js, with CWD at package root.
107
+ server_script_name = "mco-cli.js" # Using the CLI script as an alternative entry point
108
+ server_script_path = os.path.join(APP_DIR, "node_modules", "@paradiselabs", "mco-protocol", "bin", server_script_name)
109
+ mco_config_dir = os.environ["MCO_CONFIG_DIR"]
110
 
111
+ if not os.path.exists(server_script_path):
112
+ print(f"ERROR: MCO CLI script not found at '{server_script_path}' after npm install.")
113
+ sys.exit(1)
114
+
115
+ # Construct the command to run the CLI script directly with node, using the 'serve' subcommand.
116
  server_command = [
117
  "node",
118
+ server_script_path,
119
+ "serve", # The 'serve' subcommand for mco-cli.js
120
+ mco_config_dir,
121
+ "--host", "0.0.0.0",
122
+ "--port", os.environ.get("MCO_PORT", "3001")
123
  ]
124
 
125
  try:
126
+ print(f"Starting MCO server: {' '.join(server_command)}")
127
+ package_root_dir = os.path.join(APP_DIR, "node_modules", "@paradiselabs", "mco-protocol")
128
+ if not os.path.isdir(package_root_dir):
129
+ print(f"ERROR: MCO package directory not found at '{package_root_dir}'. This is unexpected after npm install.")
130
+ sys.exit(1)
 
 
 
 
 
 
 
 
131
 
132
+ # The server's stdout and stderr will now go to the main console.
133
+ mco_server_process = subprocess.Popen(server_command, cwd=package_root_dir)
134
+
135
+ print(f"MCO server process started with PID: {mco_server_process.pid} (CWD: {package_root_dir})")
136
+ time.sleep(5) # Allow server more time to initialize and write to logs
137
  except Exception as e:
138
+ print(f"Error starting MCO server: {e}")
139
+ sys.exit(1)
 
 
 
 
 
140
 
141
+ def main():
142
+ print("--- app.py: main() function started ---")
143
+ """Main function to run the server and UI."""
144
+ global mco_server_process
145
+ try:
146
+ setup_mco_server()
147
+ if mco_server_process and mco_server_process.poll() is None:
148
+ print("--- MCO server is running. Launching Gradio UI... ---")
149
+ gradio_app = create_gradio_ui()
150
+ print("--- Calling gradio_app.launch() locally... ---")
151
+ gradio_app.launch()
152
+ print("--- Gradio UI has been shut down. --- ")
153
+ # If we reach here, it means Gradio's launch() returned.
154
+ # We should still try to shut down the server cleanly.
155
+ print("--- Shutting down MCO server... ---")
156
+ if mco_server_process:
157
+ print("--- Terminating MCO server process... ---")
158
+ mco_server_process.terminate()
159
+ mco_server_process.wait()
160
+ print("--- MCO server stopped. ---")
161
+ except Exception as e:
162
+ print(f"An unexpected error occurred: {e}")
163
 
 
 
 
 
 
 
 
164
  # print("Creating sample SNLP files...")
165
  # generator.generate_sample_files("General", "Python")
166
  # print("Sample SNLP files created")
gradio_ui.py CHANGED
@@ -1,257 +1,140 @@
1
- """
2
- Gradio UI for MCO Agent Orchestration
3
-
4
- This script creates a Gradio user interface for interacting with a Modal-based agent
5
- that is orchestrated by the MCO protocol. The UI provides two main tabs:
6
-
7
- 1. **Agent Demo**: Allows users to input a high-level goal for SNLP (Structured
8
- Natural Language Processing) generation. The agent's thinking process, MCO
9
- orchestration logs, and final results are displayed in real-time.
10
-
11
- 2. **SNLP File Editor**: A static tool for loading, editing, and downloading SNLP
12
- orchestration files. It supports two editing modes:
13
- - **Values Only**: A simplified view for editing values and NLP content in JSON format.
14
- - **Full Edit**: A code editor for viewing and editing the raw SNLP file content.
15
 
16
- Helper functions are included for parsing, generating, and manipulating SNLP files,
17
- as well as for handling file downloads as individual files or as a single zip archive.
 
18
  """
19
 
20
- import os
21
- import json
22
  import gradio as gr
23
- import modal
24
- import tempfile
25
- import zipfile
26
- from pathlib import Path
27
-
28
- # --- Constants and Setup ---
29
 
30
  # Attempt to import the Modal app; handle gracefully if not available
31
  try:
32
- from modal_implementation import app as modal_app
33
  except (ImportError, ModuleNotFoundError):
34
  print("Warning: Modal app not found. Running in local simulation mode.")
35
- modal_app = None
36
-
37
- # Define paths and file names
38
- ORCHESTRATION_DIR = Path(__file__).parent / "snlp_orchestrations"
39
- SNLP_FILES = ["mco.core", "mco.sc", "mco.features", "mco.styles"]
40
- ORCHESTRATION_DIR.mkdir(exist_ok=True)
41
-
42
- # --- Helper Functions ---
43
-
44
- def get_available_orchestrations():
45
- """Scans the orchestration directory for available orchestration sets."""
46
- return [d.name for d in ORCHESTRATION_DIR.iterdir() if d.is_dir()]
47
-
48
- def parse_snlp_file(content):
49
- """Parses SNLP file content into a dictionary of sections."""
50
- sections = {}
51
- current_section, current_content = None, []
52
- for line in content.splitlines():
53
- if line.startswith("@"):
54
- if current_section:
55
- sections[current_section] = "\n".join(current_content)
56
- parts = line.split(" ", 1)
57
- current_section = parts[0][1:]
58
- current_content = [parts[1]] if len(parts) > 1 else []
59
- elif current_section:
60
- current_content.append(line)
61
- if current_section:
62
- sections[current_section] = "\n".join(current_content)
63
- return sections
64
-
65
- def extract_values_and_nlp(content):
66
- """Extracts structured values and NLP text from SNLP content."""
67
- values, nlp = {}, {}
68
- for section, section_content in parse_snlp_file(content).items():
69
- nlp_lines = [line[1:].strip() for line in section_content.splitlines() if line.startswith(">")]
70
- value_lines = [line for line in section_content.splitlines() if not line.startswith(">")]
71
- if nlp_lines:
72
- nlp[section] = "\n".join(nlp_lines)
73
- if value_lines:
74
- values[section] = "\n".join(value_lines).strip()
75
- return values, nlp
76
-
77
- def create_ui():
78
- """Creates and configures the Gradio user interface."""
79
- available_orchestrations = get_available_orchestrations()
80
-
81
- with gr.Blocks(theme=gr.themes.Soft(), title="MCO Protocol Agent") as app:
82
- gr.Markdown("""
83
- # MCO Protocol: Agent Orchestration Demo
84
- Demonstrates a Modal-based agent orchestrated by the MCO MCP server to generate SNLP files.
85
- """)
86
-
87
- with gr.Tabs():
88
- with gr.TabItem("Agent Demo"):
89
- with gr.Row():
90
- with gr.Column(scale=2):
91
- task_input = gr.Textbox(
92
- label="High-Level Goal for SNLP Generation",
93
- placeholder="e.g., Generate a new MCO orchestration for a 'Security' review of 'Python' code.",
94
- lines=4,
95
- )
96
- run_button = gr.Button("Run Agent to Generate SNLP Files", variant="primary")
97
- with gr.Column(scale=1):
98
- status = gr.Markdown("Status: Ready")
99
-
100
- with gr.Row():
101
- thinking_output = gr.Markdown(label="Agent Thinking Process")
102
- orchestration_log = gr.JSON(label="MCO Orchestration Log")
103
- results_output = gr.Markdown(label="Agent Results")
104
-
105
- with gr.TabItem("SNLP File Editor"):
106
- gr.Markdown("### Static SNLP File Editor and Generator")
107
- gr.Markdown("Load, edit, and download SNLP files. This is a static tool and does not use an LLM.")
108
- with gr.Row():
109
- orchestration_select = gr.Dropdown(
110
- label="Select Orchestration",
111
- choices=available_orchestrations,
112
- value=available_orchestrations[0] if available_orchestrations else None,
113
- )
114
- load_button = gr.Button("Load", variant="secondary")
115
- edit_mode = gr.Radio(choices=["Values Only", "Full Edit"], value="Values Only", label="Edit Mode")
116
-
117
- snlp_ui_map = {}
118
- with gr.Tabs():
119
- for file in SNLP_FILES:
120
- with gr.TabItem(file):
121
- with gr.Row(visible=True) as values_row:
122
- values_json = gr.JSON(label="Values")
123
- nlp_json = gr.JSON(label="NLP")
124
- content_code = gr.Code(label=f"{file} Content", language="markdown", visible=False)
125
- snlp_ui_map[file] = {
126
- "values_row": values_row,
127
- "values": values_json,
128
- "nlp": nlp_json,
129
- "content": content_code,
130
- }
131
-
132
- with gr.Row():
133
- download_buttons = [gr.Button(f"Download {f}") for f in SNLP_FILES]
134
- download_all = gr.Button("Download All as ZIP", variant="primary")
135
-
136
- # --- Event Handlers ---
137
-
138
- def handle_run_agent(task):
139
- """Streams agent output to the UI when the 'Run Agent' button is clicked."""
140
- yield {status: "Status: Starting agent...", thinking_output: "", orchestration_log: {}, results_output: ""}
141
- if not modal_app:
142
- yield {status: "Status: Error - Modal app not available."}
143
- return
144
-
145
- try:
146
- # Ensure the correct function name is called
147
- for chunk in modal_app.run_agent.remote_gen(task):
148
- yield {
149
- thinking_output: chunk.get("thinking_output", ""),
150
- orchestration_log: chunk.get("orchestration_log", {}),
151
- results_output: chunk.get("results_output", ""),
152
- status: f"Status: {chunk.get('status', 'Running...')}",
153
- }
154
- except Exception as e:
155
- yield {status: f"Status: Error - {e}"}
156
-
157
- def load_snlp_files(orchestration_name):
158
- """Loads the selected SNLP orchestration files into the editor."""
159
- updates = {}
160
- if not orchestration_name:
161
- # Create empty updates for all components to clear them
162
- for ui_comps in snlp_ui_map.values():
163
- updates[ui_comps["content"]] = gr.update(value="")
164
- updates[ui_comps["values"]] = gr.update(value={})
165
- updates[ui_comps["nlp"]] = gr.update(value={})
166
- return updates
167
-
168
- orchestration_path = ORCHESTRATION_DIR / orchestration_name
169
- for file, ui_comps in snlp_ui_map.items():
170
- file_path = orchestration_path / file
171
- if file_path.exists():
172
- content = file_path.read_text(encoding="utf-8")
173
- values, nlp = extract_values_and_nlp(content)
174
- updates[ui_comps["content"]] = gr.update(value=content)
175
- updates[ui_comps["values"]] = gr.update(value=values)
176
- updates[ui_comps["nlp"]] = gr.update(value=nlp)
177
- else:
178
- not_found_msg = f"// {file} not found in {orchestration_name}."
179
- updates[ui_comps["content"]] = gr.update(value=not_found_msg)
180
- updates[ui_comps["values"]] = gr.update(value={})
181
- updates[ui_comps["nlp"]] = gr.update(value={})
182
- return updates
183
-
184
- def handle_edit_mode(mode):
185
- """Toggles between the simplified 'Values Only' and 'Full Edit' views."""
186
- is_values_only = mode == "Values Only"
187
- updates = {}
188
- for comps in snlp_ui_map.values():
189
- updates[comps["values_row"]] = gr.update(visible=is_values_only)
190
- updates[comps["content"]] = gr.update(visible=not is_values_only)
191
- return updates
192
-
193
- def download_file(content):
194
- """Creates a temporary file for downloading."""
195
- with tempfile.NamedTemporaryFile(delete=False, mode="w", suffix=".txt", encoding="utf-8") as f:
196
- f.write(content or "")
197
- return f.name
198
-
199
- def create_zip_file(*contents):
200
- """Creates a ZIP archive of all SNLP files for download."""
201
- # Create a temporary file with a .zip extension
202
- with tempfile.NamedTemporaryFile(delete=False, suffix=".zip", mode='w+b') as f:
203
- zip_path = f.name
204
 
205
- # Write to the zip file
206
- with zipfile.ZipFile(zip_path, "w") as zf:
207
- for i, content in enumerate(contents):
208
- zf.writestr(SNLP_FILES[i], content or "")
209
- return zip_path
210
-
211
- # --- Wire up UI Components ---
212
-
213
- run_button.click(
214
- fn=handle_run_agent,
215
- inputs=[task_input],
216
- outputs=[status, thinking_output, orchestration_log, results_output],
217
- )
218
-
219
- # Collect all output components for load_snlp_files and handle_edit_mode
220
- snlp_ui_outputs = []
221
- for comps in snlp_ui_map.values():
222
- snlp_ui_outputs.extend([comps["content"], comps["values"], comps["nlp"], comps["values_row"]])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
223
 
224
- load_button.click(
225
- fn=load_snlp_files,
226
- inputs=[orchestration_select],
227
- outputs=snlp_ui_outputs,
 
 
 
 
 
228
  )
229
-
230
- edit_mode.change(
231
- fn=handle_edit_mode,
232
- inputs=[edit_mode],
233
- outputs=snlp_ui_outputs,
 
 
 
234
  )
235
 
236
- # Wire up download buttons
237
- for i, button in enumerate(download_buttons):
238
- button.click(
239
- fn=download_file,
240
- inputs=[snlp_ui_map[SNLP_FILES[i]]["content"]],
241
- outputs=gr.File(label=f"Download {SNLP_FILES[i]}")
242
- )
243
-
244
- download_all.click(
245
- fn=create_zip_file,
246
- inputs=[snlp_ui_map[f]["content"] for f in SNLP_FILES],
247
- outputs=gr.File(label="Download All as ZIP"),
248
  )
249
-
250
- return app
251
-
252
- # --- Main Execution ---
253
 
254
  if __name__ == "__main__":
255
- gradio_ui = create_ui()
256
  gradio_ui.launch(share=True)
257
 
 
1
+ """
2
+ Gradio UI for MCO Agent Orchestration - Hackathon Demo
 
 
 
 
 
 
 
 
 
 
 
 
3
 
4
+ This script creates a polished Gradio user interface to showcase the MCO protocol.
5
+ The UI is designed for a compelling presentation, focusing on the agent's
6
+ orchestrated task execution without requiring user input.
7
  """
8
 
 
 
9
  import gradio as gr
10
+ import asyncio
 
 
 
 
 
11
 
12
  # Attempt to import the Modal app; handle gracefully if not available
13
  try:
14
+ from modal_implementation import run_mco_agent
15
  except (ImportError, ModuleNotFoundError):
16
  print("Warning: Modal app not found. Running in local simulation mode.")
17
+ # Define a dummy sync generator for local testing
18
+ def run_mco_agent(prompt):
19
+ for i in range(5):
20
+ yield {"type": "status", "message": f"<thinking>Simulation step {i+1} for prompt: {prompt}</thinking>"}
21
+ time.sleep(1)
22
+ yield {"type": "final_result", "result": "<thinking>Simulation complete.</thinking>"}
23
+
24
+ def run_orchestration_and_stream_results():
25
+ """
26
+ Runs the MCO agent with a fixed prompt and streams back thinking and log updates.
27
+ """
28
+ user_prompt = "Use the mco server to orchestrate your tasks. use <thinking> xml each step of the way, while you learn about the mco orchestration."
29
+
30
+ full_log = ""
31
+ thinking_stream = ""
32
+
33
+ try:
34
+ # The agent runner is a synchronous generator from Modal
35
+ for result in run_mco_agent.remote_gen(user_prompt):
36
+ message = result.get("message", result.get("result", ""))
37
+
38
+ if result.get("type") == "status":
39
+ full_log += message + "\n\n"
40
+ thinking_stream = message
41
+ elif result.get("type") == "error":
42
+ error_msg = f"<error>ERROR: {message}</error>"
43
+ full_log += error_msg + "\n\n"
44
+ thinking_stream = error_msg
45
+ elif result.get("type") == "final_result":
46
+ final_msg = message
47
+ full_log += f"\n--- ORCHESTRATION COMPLETE ---\n{final_msg}"
48
+ thinking_stream = final_msg
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
 
50
+ yield thinking_stream, full_log
51
+
52
+ except Exception as e:
53
+ error_message = f"<error>An unexpected error occurred: {e}</error>"
54
+ yield error_message, full_log + f"\n{error_message}"
55
+
56
+ def create_gradio_ui():
57
+ """Creates and returns the Gradio UI Blocks for the MCO Hackathon Demo."""
58
+
59
+ css = """
60
+ body { background-color: #f7f7f7; }
61
+ .main-title { text-align: center; font-size: 2.8em; color: #4A00E0; font-weight: bold; letter-spacing: -1px; margin-bottom: 10px; }
62
+ .subtitle { text-align: center; font-size: 1.3em; color: #555; margin-bottom: 25px; line-height: 1.6; }
63
+ .thinking-box {
64
+ border: 2px solid #8E2DE2;
65
+ padding: 20px;
66
+ border-radius: 12px;
67
+ background-color: #ffffff;
68
+ font-family: 'Courier New', Courier, monospace;
69
+ font-size: 1.1em;
70
+ min-height: 60px;
71
+ box-shadow: 0 4px 15px rgba(0,0,0,0.05);
72
+ }
73
+ .log-box {
74
+ font-family: 'Menlo', 'Monaco', 'Consolas', monospace;
75
+ background-color: #1e1e1e;
76
+ color: #d4d4d4;
77
+ border: 1px solid #333;
78
+ border-radius: 12px;
79
+ padding: 15px;
80
+ }
81
+ .orchestrate-button {
82
+ background: linear-gradient(45deg, #8E2DE2, #4A00E0) !important;
83
+ color: white !important;
84
+ font-weight: bold !important;
85
+ font-size: 1.2em !important;
86
+ border-radius: 10px !important;
87
+ padding: 15px 30px !important;
88
+ border: none !important;
89
+ box-shadow: 0 4px 15px rgba(74, 0, 224, 0.4);
90
+ transition: all 0.3s ease;
91
+ }
92
+ .orchestrate-button:hover {
93
+ transform: translateY(-2px);
94
+ box-shadow: 0 6px 20px rgba(74, 0, 224, 0.5);
95
+ }
96
+ .gr-label { display: none !important; }
97
+ """
98
+
99
+ with gr.Blocks(theme=gr.themes.Soft(primary_hue="purple", secondary_hue="blue"), css=css, title="MCO Protocol Demo") as demo:
100
+ gr.Markdown("""
101
+ <h1 class='main-title'>🏆 The Missing Layer of Agentic AI: Orchestration 🏆</h1>
102
+ <p class='subtitle'>
103
+ Welcome to the future of agentic systems with the <strong>MCO Protocol</strong>. <br>
104
+ This agent, powered by Claude on Modal, connects to an <strong>MCO Server</strong> that orchestrates its every move. <br>
105
+ Click below to witness a complex task unfold, step-by-step, guided entirely by MCO.
106
+ </p>
107
+ """)
108
 
109
+ with gr.Row():
110
+ orchestrate_button = gr.Button("🚀 Orchestrate! 🚀", elem_classes="orchestrate-button")
111
+
112
+ gr.Markdown("### 🧠 Agent's Real-time Thinking")
113
+ agent_thinking_box = gr.Textbox(
114
+ label="Current Status",
115
+ elem_classes="thinking-box",
116
+ interactive=False,
117
+ show_label=False
118
  )
119
+
120
+ gr.Markdown("### 📜 Full Orchestration Log")
121
+ agent_log_box = gr.Textbox(
122
+ label="Log",
123
+ elem_classes="log-box",
124
+ lines=20,
125
+ interactive=False,
126
+ show_label=False
127
  )
128
 
129
+ orchestrate_button.click(
130
+ fn=run_orchestration_and_stream_results,
131
+ inputs=[],
132
+ outputs=[agent_thinking_box, agent_log_box]
 
 
 
 
 
 
 
 
133
  )
134
+
135
+ return demo
 
 
136
 
137
  if __name__ == "__main__":
138
+ gradio_ui = create_gradio_ui()
139
  gradio_ui.launch(share=True)
140
 
mcp_host_config.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "mcpServers": {
3
+ "mco-orchestration": {
4
+ "command": "npx",
5
+ "args": ["@paradiselabs/mco-protocol", "--config-dir", "/app/mco-config"],
6
+ "workingDirectory": "/app",
7
+ "description": "MCO Orchestration Server"
8
+ }
9
+ }
10
+ }
modal_implementation.py CHANGED
@@ -12,7 +12,6 @@ import json
12
  import asyncio
13
  import websockets
14
  import modal
15
- import anthropic
16
  from typing import Dict, Any, Optional
17
 
18
  # --- Modal App Setup ---
@@ -21,7 +20,6 @@ stub = modal.App(
21
  name="mco-autogpt-agent",
22
  secrets=[modal.Secret.from_dotenv()],
23
  image=modal.Image.debian_slim(python_version="3.10").pip_install(
24
- "anthropic",
25
  "websockets",
26
  )
27
  )
@@ -302,22 +300,18 @@ async def arun_mco_agent(user_prompt: str):
302
  yield {"type": "status", "message": "<thinking>MCP client shut down.</thinking>"}
303
 
304
  @stub.function(
305
- timeout=900,
306
- container_idle_timeout=300,
307
- cpu=2
308
  )
309
  def run_mco_agent(user_prompt: str):
310
- """Synchronous wrapper for the async agent runner to be called by Gradio."""
311
- # This is how Gradio will call our Modal generator
312
- # It needs to iterate over the results from the generator
313
- # and yield them back to Gradio's streaming mechanism.
314
- # print(f"run_mco_agent called with user_prompt: {user_prompt}")
315
- for item in arun_mco_agent(user_prompt=user_prompt):
316
- # print(f"run_mco_agent yielding: {item}")
317
- yield item
318
-
319
- @stub.local_entrypoint()
320
- def main(prompt: str = "Review the provided code snippet for potential bugs."):
321
- """Local entrypoint for testing the Modal app via the command line."""
322
- for update in run_mco_agent.remote_gen(prompt=prompt):
323
- print(json.dumps(update, indent=2))
 
12
  import asyncio
13
  import websockets
14
  import modal
 
15
  from typing import Dict, Any, Optional
16
 
17
  # --- Modal App Setup ---
 
20
  name="mco-autogpt-agent",
21
  secrets=[modal.Secret.from_dotenv()],
22
  image=modal.Image.debian_slim(python_version="3.10").pip_install(
 
23
  "websockets",
24
  )
25
  )
 
300
  yield {"type": "status", "message": "<thinking>MCP client shut down.</thinking>"}
301
 
302
  @stub.function(
303
+ secrets=[modal.Secret.from_dotenv()],
304
+ timeout=600,
305
+ scaledown_window=120,
306
  )
307
  def run_mco_agent(user_prompt: str):
308
+ """Synchronous wrapper for the async generator, exposed as a Modal Function.
309
+ This allows Gradio to call the agent and stream results.
310
+ """
311
+ import asyncio
312
+ g = arun_mco_agent(user_prompt)
313
+ try:
314
+ while True:
315
+ yield asyncio.run(g.__anext__())
316
+ except StopAsyncIteration:
317
+ pass
 
 
 
 
package-lock.json ADDED
@@ -0,0 +1,1430 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "mco-protocol",
3
+ "lockfileVersion": 3,
4
+ "requires": true,
5
+ "packages": {
6
+ "": {
7
+ "dependencies": {
8
+ "@paradiselabs/mco-protocol": "^0.2.8"
9
+ }
10
+ },
11
+ "node_modules/@paradiselabs/mco-protocol": {
12
+ "version": "0.2.8",
13
+ "resolved": "https://registry.npmjs.org/@paradiselabs/mco-protocol/-/mco-protocol-0.2.8.tgz",
14
+ "integrity": "sha512-+5ovItKgkKu8kMDnRTk7bxas6rKtDMF7ngL1By//E0kbwrWoega8Gvw0vQePMRxEZAXbByPqyNqAEnTWT2IpSw==",
15
+ "license": "MIT",
16
+ "dependencies": {
17
+ "commander": "^11.0.0",
18
+ "express": "^4.18.2",
19
+ "fs-extra": "^11.1.1",
20
+ "open": "^9.1.0",
21
+ "uuid": "^9.0.0",
22
+ "ws": "^8.13.0",
23
+ "yaml": "^2.3.1"
24
+ },
25
+ "bin": {
26
+ "mco": "bin/mco-cli.js"
27
+ },
28
+ "engines": {
29
+ "node": ">=16.0.0"
30
+ }
31
+ },
32
+ "node_modules/accepts": {
33
+ "version": "1.3.8",
34
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
35
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
36
+ "license": "MIT",
37
+ "dependencies": {
38
+ "mime-types": "~2.1.34",
39
+ "negotiator": "0.6.3"
40
+ },
41
+ "engines": {
42
+ "node": ">= 0.6"
43
+ }
44
+ },
45
+ "node_modules/array-flatten": {
46
+ "version": "1.1.1",
47
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
48
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
49
+ "license": "MIT"
50
+ },
51
+ "node_modules/big-integer": {
52
+ "version": "1.6.52",
53
+ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz",
54
+ "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==",
55
+ "license": "Unlicense",
56
+ "engines": {
57
+ "node": ">=0.6"
58
+ }
59
+ },
60
+ "node_modules/body-parser": {
61
+ "version": "1.20.3",
62
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
63
+ "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
64
+ "license": "MIT",
65
+ "dependencies": {
66
+ "bytes": "3.1.2",
67
+ "content-type": "~1.0.5",
68
+ "debug": "2.6.9",
69
+ "depd": "2.0.0",
70
+ "destroy": "1.2.0",
71
+ "http-errors": "2.0.0",
72
+ "iconv-lite": "0.4.24",
73
+ "on-finished": "2.4.1",
74
+ "qs": "6.13.0",
75
+ "raw-body": "2.5.2",
76
+ "type-is": "~1.6.18",
77
+ "unpipe": "1.0.0"
78
+ },
79
+ "engines": {
80
+ "node": ">= 0.8",
81
+ "npm": "1.2.8000 || >= 1.4.16"
82
+ }
83
+ },
84
+ "node_modules/bplist-parser": {
85
+ "version": "0.2.0",
86
+ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz",
87
+ "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==",
88
+ "license": "MIT",
89
+ "dependencies": {
90
+ "big-integer": "^1.6.44"
91
+ },
92
+ "engines": {
93
+ "node": ">= 5.10.0"
94
+ }
95
+ },
96
+ "node_modules/bundle-name": {
97
+ "version": "3.0.0",
98
+ "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz",
99
+ "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==",
100
+ "license": "MIT",
101
+ "dependencies": {
102
+ "run-applescript": "^5.0.0"
103
+ },
104
+ "engines": {
105
+ "node": ">=12"
106
+ },
107
+ "funding": {
108
+ "url": "https://github.com/sponsors/sindresorhus"
109
+ }
110
+ },
111
+ "node_modules/bytes": {
112
+ "version": "3.1.2",
113
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
114
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
115
+ "license": "MIT",
116
+ "engines": {
117
+ "node": ">= 0.8"
118
+ }
119
+ },
120
+ "node_modules/call-bind-apply-helpers": {
121
+ "version": "1.0.2",
122
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
123
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
124
+ "license": "MIT",
125
+ "dependencies": {
126
+ "es-errors": "^1.3.0",
127
+ "function-bind": "^1.1.2"
128
+ },
129
+ "engines": {
130
+ "node": ">= 0.4"
131
+ }
132
+ },
133
+ "node_modules/call-bound": {
134
+ "version": "1.0.4",
135
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
136
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
137
+ "license": "MIT",
138
+ "dependencies": {
139
+ "call-bind-apply-helpers": "^1.0.2",
140
+ "get-intrinsic": "^1.3.0"
141
+ },
142
+ "engines": {
143
+ "node": ">= 0.4"
144
+ },
145
+ "funding": {
146
+ "url": "https://github.com/sponsors/ljharb"
147
+ }
148
+ },
149
+ "node_modules/commander": {
150
+ "version": "11.1.0",
151
+ "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
152
+ "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
153
+ "license": "MIT",
154
+ "engines": {
155
+ "node": ">=16"
156
+ }
157
+ },
158
+ "node_modules/content-disposition": {
159
+ "version": "0.5.4",
160
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
161
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
162
+ "license": "MIT",
163
+ "dependencies": {
164
+ "safe-buffer": "5.2.1"
165
+ },
166
+ "engines": {
167
+ "node": ">= 0.6"
168
+ }
169
+ },
170
+ "node_modules/content-type": {
171
+ "version": "1.0.5",
172
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
173
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
174
+ "license": "MIT",
175
+ "engines": {
176
+ "node": ">= 0.6"
177
+ }
178
+ },
179
+ "node_modules/cookie": {
180
+ "version": "0.7.1",
181
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
182
+ "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
183
+ "license": "MIT",
184
+ "engines": {
185
+ "node": ">= 0.6"
186
+ }
187
+ },
188
+ "node_modules/cookie-signature": {
189
+ "version": "1.0.6",
190
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
191
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
192
+ "license": "MIT"
193
+ },
194
+ "node_modules/cross-spawn": {
195
+ "version": "7.0.6",
196
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
197
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
198
+ "license": "MIT",
199
+ "dependencies": {
200
+ "path-key": "^3.1.0",
201
+ "shebang-command": "^2.0.0",
202
+ "which": "^2.0.1"
203
+ },
204
+ "engines": {
205
+ "node": ">= 8"
206
+ }
207
+ },
208
+ "node_modules/debug": {
209
+ "version": "2.6.9",
210
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
211
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
212
+ "license": "MIT",
213
+ "dependencies": {
214
+ "ms": "2.0.0"
215
+ }
216
+ },
217
+ "node_modules/default-browser": {
218
+ "version": "4.0.0",
219
+ "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz",
220
+ "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==",
221
+ "license": "MIT",
222
+ "dependencies": {
223
+ "bundle-name": "^3.0.0",
224
+ "default-browser-id": "^3.0.0",
225
+ "execa": "^7.1.1",
226
+ "titleize": "^3.0.0"
227
+ },
228
+ "engines": {
229
+ "node": ">=14.16"
230
+ },
231
+ "funding": {
232
+ "url": "https://github.com/sponsors/sindresorhus"
233
+ }
234
+ },
235
+ "node_modules/default-browser-id": {
236
+ "version": "3.0.0",
237
+ "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz",
238
+ "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==",
239
+ "license": "MIT",
240
+ "dependencies": {
241
+ "bplist-parser": "^0.2.0",
242
+ "untildify": "^4.0.0"
243
+ },
244
+ "engines": {
245
+ "node": ">=12"
246
+ },
247
+ "funding": {
248
+ "url": "https://github.com/sponsors/sindresorhus"
249
+ }
250
+ },
251
+ "node_modules/define-lazy-prop": {
252
+ "version": "3.0.0",
253
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
254
+ "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
255
+ "license": "MIT",
256
+ "engines": {
257
+ "node": ">=12"
258
+ },
259
+ "funding": {
260
+ "url": "https://github.com/sponsors/sindresorhus"
261
+ }
262
+ },
263
+ "node_modules/depd": {
264
+ "version": "2.0.0",
265
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
266
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
267
+ "license": "MIT",
268
+ "engines": {
269
+ "node": ">= 0.8"
270
+ }
271
+ },
272
+ "node_modules/destroy": {
273
+ "version": "1.2.0",
274
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
275
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
276
+ "license": "MIT",
277
+ "engines": {
278
+ "node": ">= 0.8",
279
+ "npm": "1.2.8000 || >= 1.4.16"
280
+ }
281
+ },
282
+ "node_modules/dunder-proto": {
283
+ "version": "1.0.1",
284
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
285
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
286
+ "license": "MIT",
287
+ "dependencies": {
288
+ "call-bind-apply-helpers": "^1.0.1",
289
+ "es-errors": "^1.3.0",
290
+ "gopd": "^1.2.0"
291
+ },
292
+ "engines": {
293
+ "node": ">= 0.4"
294
+ }
295
+ },
296
+ "node_modules/ee-first": {
297
+ "version": "1.1.1",
298
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
299
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
300
+ "license": "MIT"
301
+ },
302
+ "node_modules/encodeurl": {
303
+ "version": "2.0.0",
304
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
305
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
306
+ "license": "MIT",
307
+ "engines": {
308
+ "node": ">= 0.8"
309
+ }
310
+ },
311
+ "node_modules/es-define-property": {
312
+ "version": "1.0.1",
313
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
314
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
315
+ "license": "MIT",
316
+ "engines": {
317
+ "node": ">= 0.4"
318
+ }
319
+ },
320
+ "node_modules/es-errors": {
321
+ "version": "1.3.0",
322
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
323
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
324
+ "license": "MIT",
325
+ "engines": {
326
+ "node": ">= 0.4"
327
+ }
328
+ },
329
+ "node_modules/es-object-atoms": {
330
+ "version": "1.1.1",
331
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
332
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
333
+ "license": "MIT",
334
+ "dependencies": {
335
+ "es-errors": "^1.3.0"
336
+ },
337
+ "engines": {
338
+ "node": ">= 0.4"
339
+ }
340
+ },
341
+ "node_modules/escape-html": {
342
+ "version": "1.0.3",
343
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
344
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
345
+ "license": "MIT"
346
+ },
347
+ "node_modules/etag": {
348
+ "version": "1.8.1",
349
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
350
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
351
+ "license": "MIT",
352
+ "engines": {
353
+ "node": ">= 0.6"
354
+ }
355
+ },
356
+ "node_modules/execa": {
357
+ "version": "7.2.0",
358
+ "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz",
359
+ "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==",
360
+ "license": "MIT",
361
+ "dependencies": {
362
+ "cross-spawn": "^7.0.3",
363
+ "get-stream": "^6.0.1",
364
+ "human-signals": "^4.3.0",
365
+ "is-stream": "^3.0.0",
366
+ "merge-stream": "^2.0.0",
367
+ "npm-run-path": "^5.1.0",
368
+ "onetime": "^6.0.0",
369
+ "signal-exit": "^3.0.7",
370
+ "strip-final-newline": "^3.0.0"
371
+ },
372
+ "engines": {
373
+ "node": "^14.18.0 || ^16.14.0 || >=18.0.0"
374
+ },
375
+ "funding": {
376
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
377
+ }
378
+ },
379
+ "node_modules/express": {
380
+ "version": "4.21.2",
381
+ "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
382
+ "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
383
+ "license": "MIT",
384
+ "dependencies": {
385
+ "accepts": "~1.3.8",
386
+ "array-flatten": "1.1.1",
387
+ "body-parser": "1.20.3",
388
+ "content-disposition": "0.5.4",
389
+ "content-type": "~1.0.4",
390
+ "cookie": "0.7.1",
391
+ "cookie-signature": "1.0.6",
392
+ "debug": "2.6.9",
393
+ "depd": "2.0.0",
394
+ "encodeurl": "~2.0.0",
395
+ "escape-html": "~1.0.3",
396
+ "etag": "~1.8.1",
397
+ "finalhandler": "1.3.1",
398
+ "fresh": "0.5.2",
399
+ "http-errors": "2.0.0",
400
+ "merge-descriptors": "1.0.3",
401
+ "methods": "~1.1.2",
402
+ "on-finished": "2.4.1",
403
+ "parseurl": "~1.3.3",
404
+ "path-to-regexp": "0.1.12",
405
+ "proxy-addr": "~2.0.7",
406
+ "qs": "6.13.0",
407
+ "range-parser": "~1.2.1",
408
+ "safe-buffer": "5.2.1",
409
+ "send": "0.19.0",
410
+ "serve-static": "1.16.2",
411
+ "setprototypeof": "1.2.0",
412
+ "statuses": "2.0.1",
413
+ "type-is": "~1.6.18",
414
+ "utils-merge": "1.0.1",
415
+ "vary": "~1.1.2"
416
+ },
417
+ "engines": {
418
+ "node": ">= 0.10.0"
419
+ },
420
+ "funding": {
421
+ "type": "opencollective",
422
+ "url": "https://opencollective.com/express"
423
+ }
424
+ },
425
+ "node_modules/finalhandler": {
426
+ "version": "1.3.1",
427
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
428
+ "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
429
+ "license": "MIT",
430
+ "dependencies": {
431
+ "debug": "2.6.9",
432
+ "encodeurl": "~2.0.0",
433
+ "escape-html": "~1.0.3",
434
+ "on-finished": "2.4.1",
435
+ "parseurl": "~1.3.3",
436
+ "statuses": "2.0.1",
437
+ "unpipe": "~1.0.0"
438
+ },
439
+ "engines": {
440
+ "node": ">= 0.8"
441
+ }
442
+ },
443
+ "node_modules/forwarded": {
444
+ "version": "0.2.0",
445
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
446
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
447
+ "license": "MIT",
448
+ "engines": {
449
+ "node": ">= 0.6"
450
+ }
451
+ },
452
+ "node_modules/fresh": {
453
+ "version": "0.5.2",
454
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
455
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
456
+ "license": "MIT",
457
+ "engines": {
458
+ "node": ">= 0.6"
459
+ }
460
+ },
461
+ "node_modules/fs-extra": {
462
+ "version": "11.3.0",
463
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz",
464
+ "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==",
465
+ "license": "MIT",
466
+ "dependencies": {
467
+ "graceful-fs": "^4.2.0",
468
+ "jsonfile": "^6.0.1",
469
+ "universalify": "^2.0.0"
470
+ },
471
+ "engines": {
472
+ "node": ">=14.14"
473
+ }
474
+ },
475
+ "node_modules/function-bind": {
476
+ "version": "1.1.2",
477
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
478
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
479
+ "license": "MIT",
480
+ "funding": {
481
+ "url": "https://github.com/sponsors/ljharb"
482
+ }
483
+ },
484
+ "node_modules/get-intrinsic": {
485
+ "version": "1.3.0",
486
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
487
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
488
+ "license": "MIT",
489
+ "dependencies": {
490
+ "call-bind-apply-helpers": "^1.0.2",
491
+ "es-define-property": "^1.0.1",
492
+ "es-errors": "^1.3.0",
493
+ "es-object-atoms": "^1.1.1",
494
+ "function-bind": "^1.1.2",
495
+ "get-proto": "^1.0.1",
496
+ "gopd": "^1.2.0",
497
+ "has-symbols": "^1.1.0",
498
+ "hasown": "^2.0.2",
499
+ "math-intrinsics": "^1.1.0"
500
+ },
501
+ "engines": {
502
+ "node": ">= 0.4"
503
+ },
504
+ "funding": {
505
+ "url": "https://github.com/sponsors/ljharb"
506
+ }
507
+ },
508
+ "node_modules/get-proto": {
509
+ "version": "1.0.1",
510
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
511
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
512
+ "license": "MIT",
513
+ "dependencies": {
514
+ "dunder-proto": "^1.0.1",
515
+ "es-object-atoms": "^1.0.0"
516
+ },
517
+ "engines": {
518
+ "node": ">= 0.4"
519
+ }
520
+ },
521
+ "node_modules/get-stream": {
522
+ "version": "6.0.1",
523
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
524
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
525
+ "license": "MIT",
526
+ "engines": {
527
+ "node": ">=10"
528
+ },
529
+ "funding": {
530
+ "url": "https://github.com/sponsors/sindresorhus"
531
+ }
532
+ },
533
+ "node_modules/gopd": {
534
+ "version": "1.2.0",
535
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
536
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
537
+ "license": "MIT",
538
+ "engines": {
539
+ "node": ">= 0.4"
540
+ },
541
+ "funding": {
542
+ "url": "https://github.com/sponsors/ljharb"
543
+ }
544
+ },
545
+ "node_modules/graceful-fs": {
546
+ "version": "4.2.11",
547
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
548
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
549
+ "license": "ISC"
550
+ },
551
+ "node_modules/has-symbols": {
552
+ "version": "1.1.0",
553
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
554
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
555
+ "license": "MIT",
556
+ "engines": {
557
+ "node": ">= 0.4"
558
+ },
559
+ "funding": {
560
+ "url": "https://github.com/sponsors/ljharb"
561
+ }
562
+ },
563
+ "node_modules/hasown": {
564
+ "version": "2.0.2",
565
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
566
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
567
+ "license": "MIT",
568
+ "dependencies": {
569
+ "function-bind": "^1.1.2"
570
+ },
571
+ "engines": {
572
+ "node": ">= 0.4"
573
+ }
574
+ },
575
+ "node_modules/http-errors": {
576
+ "version": "2.0.0",
577
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
578
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
579
+ "license": "MIT",
580
+ "dependencies": {
581
+ "depd": "2.0.0",
582
+ "inherits": "2.0.4",
583
+ "setprototypeof": "1.2.0",
584
+ "statuses": "2.0.1",
585
+ "toidentifier": "1.0.1"
586
+ },
587
+ "engines": {
588
+ "node": ">= 0.8"
589
+ }
590
+ },
591
+ "node_modules/human-signals": {
592
+ "version": "4.3.1",
593
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz",
594
+ "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==",
595
+ "license": "Apache-2.0",
596
+ "engines": {
597
+ "node": ">=14.18.0"
598
+ }
599
+ },
600
+ "node_modules/iconv-lite": {
601
+ "version": "0.4.24",
602
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
603
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
604
+ "license": "MIT",
605
+ "dependencies": {
606
+ "safer-buffer": ">= 2.1.2 < 3"
607
+ },
608
+ "engines": {
609
+ "node": ">=0.10.0"
610
+ }
611
+ },
612
+ "node_modules/inherits": {
613
+ "version": "2.0.4",
614
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
615
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
616
+ "license": "ISC"
617
+ },
618
+ "node_modules/ipaddr.js": {
619
+ "version": "1.9.1",
620
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
621
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
622
+ "license": "MIT",
623
+ "engines": {
624
+ "node": ">= 0.10"
625
+ }
626
+ },
627
+ "node_modules/is-docker": {
628
+ "version": "3.0.0",
629
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
630
+ "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
631
+ "license": "MIT",
632
+ "bin": {
633
+ "is-docker": "cli.js"
634
+ },
635
+ "engines": {
636
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
637
+ },
638
+ "funding": {
639
+ "url": "https://github.com/sponsors/sindresorhus"
640
+ }
641
+ },
642
+ "node_modules/is-inside-container": {
643
+ "version": "1.0.0",
644
+ "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
645
+ "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
646
+ "license": "MIT",
647
+ "dependencies": {
648
+ "is-docker": "^3.0.0"
649
+ },
650
+ "bin": {
651
+ "is-inside-container": "cli.js"
652
+ },
653
+ "engines": {
654
+ "node": ">=14.16"
655
+ },
656
+ "funding": {
657
+ "url": "https://github.com/sponsors/sindresorhus"
658
+ }
659
+ },
660
+ "node_modules/is-stream": {
661
+ "version": "3.0.0",
662
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
663
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
664
+ "license": "MIT",
665
+ "engines": {
666
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
667
+ },
668
+ "funding": {
669
+ "url": "https://github.com/sponsors/sindresorhus"
670
+ }
671
+ },
672
+ "node_modules/is-wsl": {
673
+ "version": "2.2.0",
674
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
675
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
676
+ "license": "MIT",
677
+ "dependencies": {
678
+ "is-docker": "^2.0.0"
679
+ },
680
+ "engines": {
681
+ "node": ">=8"
682
+ }
683
+ },
684
+ "node_modules/is-wsl/node_modules/is-docker": {
685
+ "version": "2.2.1",
686
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
687
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
688
+ "license": "MIT",
689
+ "bin": {
690
+ "is-docker": "cli.js"
691
+ },
692
+ "engines": {
693
+ "node": ">=8"
694
+ },
695
+ "funding": {
696
+ "url": "https://github.com/sponsors/sindresorhus"
697
+ }
698
+ },
699
+ "node_modules/isexe": {
700
+ "version": "2.0.0",
701
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
702
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
703
+ "license": "ISC"
704
+ },
705
+ "node_modules/jsonfile": {
706
+ "version": "6.1.0",
707
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
708
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
709
+ "license": "MIT",
710
+ "dependencies": {
711
+ "universalify": "^2.0.0"
712
+ },
713
+ "optionalDependencies": {
714
+ "graceful-fs": "^4.1.6"
715
+ }
716
+ },
717
+ "node_modules/math-intrinsics": {
718
+ "version": "1.1.0",
719
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
720
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
721
+ "license": "MIT",
722
+ "engines": {
723
+ "node": ">= 0.4"
724
+ }
725
+ },
726
+ "node_modules/media-typer": {
727
+ "version": "0.3.0",
728
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
729
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
730
+ "license": "MIT",
731
+ "engines": {
732
+ "node": ">= 0.6"
733
+ }
734
+ },
735
+ "node_modules/merge-descriptors": {
736
+ "version": "1.0.3",
737
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
738
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
739
+ "license": "MIT",
740
+ "funding": {
741
+ "url": "https://github.com/sponsors/sindresorhus"
742
+ }
743
+ },
744
+ "node_modules/merge-stream": {
745
+ "version": "2.0.0",
746
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
747
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
748
+ "license": "MIT"
749
+ },
750
+ "node_modules/methods": {
751
+ "version": "1.1.2",
752
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
753
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
754
+ "license": "MIT",
755
+ "engines": {
756
+ "node": ">= 0.6"
757
+ }
758
+ },
759
+ "node_modules/mime": {
760
+ "version": "1.6.0",
761
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
762
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
763
+ "license": "MIT",
764
+ "bin": {
765
+ "mime": "cli.js"
766
+ },
767
+ "engines": {
768
+ "node": ">=4"
769
+ }
770
+ },
771
+ "node_modules/mime-db": {
772
+ "version": "1.52.0",
773
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
774
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
775
+ "license": "MIT",
776
+ "engines": {
777
+ "node": ">= 0.6"
778
+ }
779
+ },
780
+ "node_modules/mime-types": {
781
+ "version": "2.1.35",
782
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
783
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
784
+ "license": "MIT",
785
+ "dependencies": {
786
+ "mime-db": "1.52.0"
787
+ },
788
+ "engines": {
789
+ "node": ">= 0.6"
790
+ }
791
+ },
792
+ "node_modules/mimic-fn": {
793
+ "version": "4.0.0",
794
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
795
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
796
+ "license": "MIT",
797
+ "engines": {
798
+ "node": ">=12"
799
+ },
800
+ "funding": {
801
+ "url": "https://github.com/sponsors/sindresorhus"
802
+ }
803
+ },
804
+ "node_modules/ms": {
805
+ "version": "2.0.0",
806
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
807
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
808
+ "license": "MIT"
809
+ },
810
+ "node_modules/negotiator": {
811
+ "version": "0.6.3",
812
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
813
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
814
+ "license": "MIT",
815
+ "engines": {
816
+ "node": ">= 0.6"
817
+ }
818
+ },
819
+ "node_modules/npm-run-path": {
820
+ "version": "5.3.0",
821
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
822
+ "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
823
+ "license": "MIT",
824
+ "dependencies": {
825
+ "path-key": "^4.0.0"
826
+ },
827
+ "engines": {
828
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
829
+ },
830
+ "funding": {
831
+ "url": "https://github.com/sponsors/sindresorhus"
832
+ }
833
+ },
834
+ "node_modules/npm-run-path/node_modules/path-key": {
835
+ "version": "4.0.0",
836
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
837
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
838
+ "license": "MIT",
839
+ "engines": {
840
+ "node": ">=12"
841
+ },
842
+ "funding": {
843
+ "url": "https://github.com/sponsors/sindresorhus"
844
+ }
845
+ },
846
+ "node_modules/object-inspect": {
847
+ "version": "1.13.4",
848
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
849
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
850
+ "license": "MIT",
851
+ "engines": {
852
+ "node": ">= 0.4"
853
+ },
854
+ "funding": {
855
+ "url": "https://github.com/sponsors/ljharb"
856
+ }
857
+ },
858
+ "node_modules/on-finished": {
859
+ "version": "2.4.1",
860
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
861
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
862
+ "license": "MIT",
863
+ "dependencies": {
864
+ "ee-first": "1.1.1"
865
+ },
866
+ "engines": {
867
+ "node": ">= 0.8"
868
+ }
869
+ },
870
+ "node_modules/onetime": {
871
+ "version": "6.0.0",
872
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
873
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
874
+ "license": "MIT",
875
+ "dependencies": {
876
+ "mimic-fn": "^4.0.0"
877
+ },
878
+ "engines": {
879
+ "node": ">=12"
880
+ },
881
+ "funding": {
882
+ "url": "https://github.com/sponsors/sindresorhus"
883
+ }
884
+ },
885
+ "node_modules/open": {
886
+ "version": "9.1.0",
887
+ "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz",
888
+ "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==",
889
+ "license": "MIT",
890
+ "dependencies": {
891
+ "default-browser": "^4.0.0",
892
+ "define-lazy-prop": "^3.0.0",
893
+ "is-inside-container": "^1.0.0",
894
+ "is-wsl": "^2.2.0"
895
+ },
896
+ "engines": {
897
+ "node": ">=14.16"
898
+ },
899
+ "funding": {
900
+ "url": "https://github.com/sponsors/sindresorhus"
901
+ }
902
+ },
903
+ "node_modules/parseurl": {
904
+ "version": "1.3.3",
905
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
906
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
907
+ "license": "MIT",
908
+ "engines": {
909
+ "node": ">= 0.8"
910
+ }
911
+ },
912
+ "node_modules/path-key": {
913
+ "version": "3.1.1",
914
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
915
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
916
+ "license": "MIT",
917
+ "engines": {
918
+ "node": ">=8"
919
+ }
920
+ },
921
+ "node_modules/path-to-regexp": {
922
+ "version": "0.1.12",
923
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
924
+ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
925
+ "license": "MIT"
926
+ },
927
+ "node_modules/proxy-addr": {
928
+ "version": "2.0.7",
929
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
930
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
931
+ "license": "MIT",
932
+ "dependencies": {
933
+ "forwarded": "0.2.0",
934
+ "ipaddr.js": "1.9.1"
935
+ },
936
+ "engines": {
937
+ "node": ">= 0.10"
938
+ }
939
+ },
940
+ "node_modules/qs": {
941
+ "version": "6.13.0",
942
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
943
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
944
+ "license": "BSD-3-Clause",
945
+ "dependencies": {
946
+ "side-channel": "^1.0.6"
947
+ },
948
+ "engines": {
949
+ "node": ">=0.6"
950
+ },
951
+ "funding": {
952
+ "url": "https://github.com/sponsors/ljharb"
953
+ }
954
+ },
955
+ "node_modules/range-parser": {
956
+ "version": "1.2.1",
957
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
958
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
959
+ "license": "MIT",
960
+ "engines": {
961
+ "node": ">= 0.6"
962
+ }
963
+ },
964
+ "node_modules/raw-body": {
965
+ "version": "2.5.2",
966
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
967
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
968
+ "license": "MIT",
969
+ "dependencies": {
970
+ "bytes": "3.1.2",
971
+ "http-errors": "2.0.0",
972
+ "iconv-lite": "0.4.24",
973
+ "unpipe": "1.0.0"
974
+ },
975
+ "engines": {
976
+ "node": ">= 0.8"
977
+ }
978
+ },
979
+ "node_modules/run-applescript": {
980
+ "version": "5.0.0",
981
+ "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz",
982
+ "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==",
983
+ "license": "MIT",
984
+ "dependencies": {
985
+ "execa": "^5.0.0"
986
+ },
987
+ "engines": {
988
+ "node": ">=12"
989
+ },
990
+ "funding": {
991
+ "url": "https://github.com/sponsors/sindresorhus"
992
+ }
993
+ },
994
+ "node_modules/run-applescript/node_modules/execa": {
995
+ "version": "5.1.1",
996
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
997
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
998
+ "license": "MIT",
999
+ "dependencies": {
1000
+ "cross-spawn": "^7.0.3",
1001
+ "get-stream": "^6.0.0",
1002
+ "human-signals": "^2.1.0",
1003
+ "is-stream": "^2.0.0",
1004
+ "merge-stream": "^2.0.0",
1005
+ "npm-run-path": "^4.0.1",
1006
+ "onetime": "^5.1.2",
1007
+ "signal-exit": "^3.0.3",
1008
+ "strip-final-newline": "^2.0.0"
1009
+ },
1010
+ "engines": {
1011
+ "node": ">=10"
1012
+ },
1013
+ "funding": {
1014
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
1015
+ }
1016
+ },
1017
+ "node_modules/run-applescript/node_modules/human-signals": {
1018
+ "version": "2.1.0",
1019
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
1020
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
1021
+ "license": "Apache-2.0",
1022
+ "engines": {
1023
+ "node": ">=10.17.0"
1024
+ }
1025
+ },
1026
+ "node_modules/run-applescript/node_modules/is-stream": {
1027
+ "version": "2.0.1",
1028
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
1029
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
1030
+ "license": "MIT",
1031
+ "engines": {
1032
+ "node": ">=8"
1033
+ },
1034
+ "funding": {
1035
+ "url": "https://github.com/sponsors/sindresorhus"
1036
+ }
1037
+ },
1038
+ "node_modules/run-applescript/node_modules/mimic-fn": {
1039
+ "version": "2.1.0",
1040
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
1041
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
1042
+ "license": "MIT",
1043
+ "engines": {
1044
+ "node": ">=6"
1045
+ }
1046
+ },
1047
+ "node_modules/run-applescript/node_modules/npm-run-path": {
1048
+ "version": "4.0.1",
1049
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
1050
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
1051
+ "license": "MIT",
1052
+ "dependencies": {
1053
+ "path-key": "^3.0.0"
1054
+ },
1055
+ "engines": {
1056
+ "node": ">=8"
1057
+ }
1058
+ },
1059
+ "node_modules/run-applescript/node_modules/onetime": {
1060
+ "version": "5.1.2",
1061
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
1062
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
1063
+ "license": "MIT",
1064
+ "dependencies": {
1065
+ "mimic-fn": "^2.1.0"
1066
+ },
1067
+ "engines": {
1068
+ "node": ">=6"
1069
+ },
1070
+ "funding": {
1071
+ "url": "https://github.com/sponsors/sindresorhus"
1072
+ }
1073
+ },
1074
+ "node_modules/run-applescript/node_modules/strip-final-newline": {
1075
+ "version": "2.0.0",
1076
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
1077
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
1078
+ "license": "MIT",
1079
+ "engines": {
1080
+ "node": ">=6"
1081
+ }
1082
+ },
1083
+ "node_modules/safe-buffer": {
1084
+ "version": "5.2.1",
1085
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1086
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1087
+ "funding": [
1088
+ {
1089
+ "type": "github",
1090
+ "url": "https://github.com/sponsors/feross"
1091
+ },
1092
+ {
1093
+ "type": "patreon",
1094
+ "url": "https://www.patreon.com/feross"
1095
+ },
1096
+ {
1097
+ "type": "consulting",
1098
+ "url": "https://feross.org/support"
1099
+ }
1100
+ ],
1101
+ "license": "MIT"
1102
+ },
1103
+ "node_modules/safer-buffer": {
1104
+ "version": "2.1.2",
1105
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1106
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1107
+ "license": "MIT"
1108
+ },
1109
+ "node_modules/send": {
1110
+ "version": "0.19.0",
1111
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
1112
+ "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
1113
+ "license": "MIT",
1114
+ "dependencies": {
1115
+ "debug": "2.6.9",
1116
+ "depd": "2.0.0",
1117
+ "destroy": "1.2.0",
1118
+ "encodeurl": "~1.0.2",
1119
+ "escape-html": "~1.0.3",
1120
+ "etag": "~1.8.1",
1121
+ "fresh": "0.5.2",
1122
+ "http-errors": "2.0.0",
1123
+ "mime": "1.6.0",
1124
+ "ms": "2.1.3",
1125
+ "on-finished": "2.4.1",
1126
+ "range-parser": "~1.2.1",
1127
+ "statuses": "2.0.1"
1128
+ },
1129
+ "engines": {
1130
+ "node": ">= 0.8.0"
1131
+ }
1132
+ },
1133
+ "node_modules/send/node_modules/encodeurl": {
1134
+ "version": "1.0.2",
1135
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
1136
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
1137
+ "license": "MIT",
1138
+ "engines": {
1139
+ "node": ">= 0.8"
1140
+ }
1141
+ },
1142
+ "node_modules/send/node_modules/ms": {
1143
+ "version": "2.1.3",
1144
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1145
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1146
+ "license": "MIT"
1147
+ },
1148
+ "node_modules/serve-static": {
1149
+ "version": "1.16.2",
1150
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
1151
+ "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
1152
+ "license": "MIT",
1153
+ "dependencies": {
1154
+ "encodeurl": "~2.0.0",
1155
+ "escape-html": "~1.0.3",
1156
+ "parseurl": "~1.3.3",
1157
+ "send": "0.19.0"
1158
+ },
1159
+ "engines": {
1160
+ "node": ">= 0.8.0"
1161
+ }
1162
+ },
1163
+ "node_modules/setprototypeof": {
1164
+ "version": "1.2.0",
1165
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1166
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
1167
+ "license": "ISC"
1168
+ },
1169
+ "node_modules/shebang-command": {
1170
+ "version": "2.0.0",
1171
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
1172
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
1173
+ "license": "MIT",
1174
+ "dependencies": {
1175
+ "shebang-regex": "^3.0.0"
1176
+ },
1177
+ "engines": {
1178
+ "node": ">=8"
1179
+ }
1180
+ },
1181
+ "node_modules/shebang-regex": {
1182
+ "version": "3.0.0",
1183
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
1184
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
1185
+ "license": "MIT",
1186
+ "engines": {
1187
+ "node": ">=8"
1188
+ }
1189
+ },
1190
+ "node_modules/side-channel": {
1191
+ "version": "1.1.0",
1192
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
1193
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
1194
+ "license": "MIT",
1195
+ "dependencies": {
1196
+ "es-errors": "^1.3.0",
1197
+ "object-inspect": "^1.13.3",
1198
+ "side-channel-list": "^1.0.0",
1199
+ "side-channel-map": "^1.0.1",
1200
+ "side-channel-weakmap": "^1.0.2"
1201
+ },
1202
+ "engines": {
1203
+ "node": ">= 0.4"
1204
+ },
1205
+ "funding": {
1206
+ "url": "https://github.com/sponsors/ljharb"
1207
+ }
1208
+ },
1209
+ "node_modules/side-channel-list": {
1210
+ "version": "1.0.0",
1211
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
1212
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
1213
+ "license": "MIT",
1214
+ "dependencies": {
1215
+ "es-errors": "^1.3.0",
1216
+ "object-inspect": "^1.13.3"
1217
+ },
1218
+ "engines": {
1219
+ "node": ">= 0.4"
1220
+ },
1221
+ "funding": {
1222
+ "url": "https://github.com/sponsors/ljharb"
1223
+ }
1224
+ },
1225
+ "node_modules/side-channel-map": {
1226
+ "version": "1.0.1",
1227
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
1228
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
1229
+ "license": "MIT",
1230
+ "dependencies": {
1231
+ "call-bound": "^1.0.2",
1232
+ "es-errors": "^1.3.0",
1233
+ "get-intrinsic": "^1.2.5",
1234
+ "object-inspect": "^1.13.3"
1235
+ },
1236
+ "engines": {
1237
+ "node": ">= 0.4"
1238
+ },
1239
+ "funding": {
1240
+ "url": "https://github.com/sponsors/ljharb"
1241
+ }
1242
+ },
1243
+ "node_modules/side-channel-weakmap": {
1244
+ "version": "1.0.2",
1245
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
1246
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
1247
+ "license": "MIT",
1248
+ "dependencies": {
1249
+ "call-bound": "^1.0.2",
1250
+ "es-errors": "^1.3.0",
1251
+ "get-intrinsic": "^1.2.5",
1252
+ "object-inspect": "^1.13.3",
1253
+ "side-channel-map": "^1.0.1"
1254
+ },
1255
+ "engines": {
1256
+ "node": ">= 0.4"
1257
+ },
1258
+ "funding": {
1259
+ "url": "https://github.com/sponsors/ljharb"
1260
+ }
1261
+ },
1262
+ "node_modules/signal-exit": {
1263
+ "version": "3.0.7",
1264
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
1265
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
1266
+ "license": "ISC"
1267
+ },
1268
+ "node_modules/statuses": {
1269
+ "version": "2.0.1",
1270
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1271
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1272
+ "license": "MIT",
1273
+ "engines": {
1274
+ "node": ">= 0.8"
1275
+ }
1276
+ },
1277
+ "node_modules/strip-final-newline": {
1278
+ "version": "3.0.0",
1279
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
1280
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
1281
+ "license": "MIT",
1282
+ "engines": {
1283
+ "node": ">=12"
1284
+ },
1285
+ "funding": {
1286
+ "url": "https://github.com/sponsors/sindresorhus"
1287
+ }
1288
+ },
1289
+ "node_modules/titleize": {
1290
+ "version": "3.0.0",
1291
+ "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz",
1292
+ "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==",
1293
+ "license": "MIT",
1294
+ "engines": {
1295
+ "node": ">=12"
1296
+ },
1297
+ "funding": {
1298
+ "url": "https://github.com/sponsors/sindresorhus"
1299
+ }
1300
+ },
1301
+ "node_modules/toidentifier": {
1302
+ "version": "1.0.1",
1303
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1304
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1305
+ "license": "MIT",
1306
+ "engines": {
1307
+ "node": ">=0.6"
1308
+ }
1309
+ },
1310
+ "node_modules/type-is": {
1311
+ "version": "1.6.18",
1312
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1313
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1314
+ "license": "MIT",
1315
+ "dependencies": {
1316
+ "media-typer": "0.3.0",
1317
+ "mime-types": "~2.1.24"
1318
+ },
1319
+ "engines": {
1320
+ "node": ">= 0.6"
1321
+ }
1322
+ },
1323
+ "node_modules/universalify": {
1324
+ "version": "2.0.1",
1325
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
1326
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
1327
+ "license": "MIT",
1328
+ "engines": {
1329
+ "node": ">= 10.0.0"
1330
+ }
1331
+ },
1332
+ "node_modules/unpipe": {
1333
+ "version": "1.0.0",
1334
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1335
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1336
+ "license": "MIT",
1337
+ "engines": {
1338
+ "node": ">= 0.8"
1339
+ }
1340
+ },
1341
+ "node_modules/untildify": {
1342
+ "version": "4.0.0",
1343
+ "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
1344
+ "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
1345
+ "license": "MIT",
1346
+ "engines": {
1347
+ "node": ">=8"
1348
+ }
1349
+ },
1350
+ "node_modules/utils-merge": {
1351
+ "version": "1.0.1",
1352
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1353
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1354
+ "license": "MIT",
1355
+ "engines": {
1356
+ "node": ">= 0.4.0"
1357
+ }
1358
+ },
1359
+ "node_modules/uuid": {
1360
+ "version": "9.0.1",
1361
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
1362
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
1363
+ "funding": [
1364
+ "https://github.com/sponsors/broofa",
1365
+ "https://github.com/sponsors/ctavan"
1366
+ ],
1367
+ "license": "MIT",
1368
+ "bin": {
1369
+ "uuid": "dist/bin/uuid"
1370
+ }
1371
+ },
1372
+ "node_modules/vary": {
1373
+ "version": "1.1.2",
1374
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1375
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1376
+ "license": "MIT",
1377
+ "engines": {
1378
+ "node": ">= 0.8"
1379
+ }
1380
+ },
1381
+ "node_modules/which": {
1382
+ "version": "2.0.2",
1383
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
1384
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
1385
+ "license": "ISC",
1386
+ "dependencies": {
1387
+ "isexe": "^2.0.0"
1388
+ },
1389
+ "bin": {
1390
+ "node-which": "bin/node-which"
1391
+ },
1392
+ "engines": {
1393
+ "node": ">= 8"
1394
+ }
1395
+ },
1396
+ "node_modules/ws": {
1397
+ "version": "8.18.2",
1398
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz",
1399
+ "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==",
1400
+ "license": "MIT",
1401
+ "engines": {
1402
+ "node": ">=10.0.0"
1403
+ },
1404
+ "peerDependencies": {
1405
+ "bufferutil": "^4.0.1",
1406
+ "utf-8-validate": ">=5.0.2"
1407
+ },
1408
+ "peerDependenciesMeta": {
1409
+ "bufferutil": {
1410
+ "optional": true
1411
+ },
1412
+ "utf-8-validate": {
1413
+ "optional": true
1414
+ }
1415
+ }
1416
+ },
1417
+ "node_modules/yaml": {
1418
+ "version": "2.8.0",
1419
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz",
1420
+ "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==",
1421
+ "license": "ISC",
1422
+ "bin": {
1423
+ "yaml": "bin.mjs"
1424
+ },
1425
+ "engines": {
1426
+ "node": ">= 14.6"
1427
+ }
1428
+ }
1429
+ }
1430
+ }
package.json ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ {
2
+ "dependencies": {
3
+ "@paradiselabs/mco-protocol": "^0.2.8"
4
+ }
5
+ }