computer-use-ootb-internal 0.0.147__py3-none-any.whl → 0.0.149__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- computer_use_ootb_internal/app_teachmode.py +23 -36
- computer_use_ootb_internal/guard_service.py +123 -99
- {computer_use_ootb_internal-0.0.147.dist-info → computer_use_ootb_internal-0.0.149.dist-info}/METADATA +1 -1
- {computer_use_ootb_internal-0.0.147.dist-info → computer_use_ootb_internal-0.0.149.dist-info}/RECORD +6 -6
- {computer_use_ootb_internal-0.0.147.dist-info → computer_use_ootb_internal-0.0.149.dist-info}/WHEEL +0 -0
- {computer_use_ootb_internal-0.0.147.dist-info → computer_use_ootb_internal-0.0.149.dist-info}/entry_points.txt +0 -0
@@ -123,7 +123,6 @@ class SharedState:
|
|
123
123
|
self.trace_id = args.trace_id
|
124
124
|
self.api_keys = args.api_keys
|
125
125
|
self.server_url = args.server_url
|
126
|
-
self.port = getattr(args, 'port', None)
|
127
126
|
self.message_queue = []
|
128
127
|
self.is_processing = False
|
129
128
|
self.should_stop = False
|
@@ -207,8 +206,6 @@ async def update_parameters(request: Request):
|
|
207
206
|
shared_state.trace_id = getattr(shared_state.args, 'trace_id', "build_scroll_combat")
|
208
207
|
shared_state.api_keys = getattr(shared_state.args, 'api_keys', "sk-proj-1234567890")
|
209
208
|
shared_state.server_url = getattr(shared_state.args, 'server_url', "http://ec2-44-234-43-86.us-west-2.compute.amazonaws.com")
|
210
|
-
# Include the specified port if available
|
211
|
-
shared_state.port = getattr(shared_state.args, 'port', None)
|
212
209
|
|
213
210
|
log_ootb_request(shared_state.server_url, "update_params", data)
|
214
211
|
|
@@ -496,8 +493,9 @@ def main():
|
|
496
493
|
parser.add_argument("--trace_id", type=str, default="build_scroll_combat", help="Trace ID for the session")
|
497
494
|
parser.add_argument("--api_keys", type=str, default="sk-proj-1234567890", help="API keys")
|
498
495
|
parser.add_argument("--server_url", type=str, default="http://ec2-44-234-43-86.us-west-2.compute.amazonaws.com", help="Server URL for the session")
|
499
|
-
# Add
|
500
|
-
parser.add_argument("-p", "--port", type=int, default=None, help="Specify the
|
496
|
+
# Add arguments for port override and target user
|
497
|
+
parser.add_argument("-p", "--port", type=int, default=None, help="Specify the port to run the server on, overriding user-based calculation.")
|
498
|
+
parser.add_argument("--target_user", type=str, default=None, help="Specify the target username for port calculation if --port is not given.")
|
501
499
|
|
502
500
|
args = parser.parse_args()
|
503
501
|
|
@@ -509,49 +507,38 @@ def main():
|
|
509
507
|
if not hasattr(args, 'trace_id'): args.trace_id = "unknown_trace"
|
510
508
|
if not hasattr(args, 'api_keys'): args.api_keys = "none"
|
511
509
|
if not hasattr(args, 'server_url'): args.server_url = "none"
|
512
|
-
# Ensure the port arg exists
|
513
|
-
if not hasattr(args, 'port'): args.port = None
|
514
510
|
|
515
511
|
shared_state = SharedState(args)
|
516
512
|
rate_limiter = RateLimiter(interval_seconds=2) # Re-initialize rate limiter
|
517
513
|
logging.info(f"Shared state initialized for user: {args.user_id}")
|
518
514
|
|
519
|
-
# --- Port
|
520
|
-
port =
|
515
|
+
# --- Port Calculation Logic ---
|
516
|
+
port = 7888 # Default port
|
521
517
|
host = "0.0.0.0" # Listen on all interfaces
|
522
|
-
|
523
|
-
if port is not None:
|
518
|
+
|
519
|
+
if args.port is not None:
|
520
|
+
port = args.port
|
524
521
|
logging.info(f"Using specified port from --port argument: {port}")
|
525
|
-
elif platform.system() == "Windows":
|
526
|
-
# Fallback to username calculation ONLY if --port was not provided
|
527
|
-
port = 7888 # Default port for fallback calculation
|
522
|
+
elif platform.system() == "Windows" and args.target_user is not None:
|
528
523
|
try:
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
port = 14000 + num
|
539
|
-
else:
|
540
|
-
logging.warning(f"Guest user number {num} out of range (1-10), using default port {port}.")
|
541
|
-
elif username == "administrator":
|
542
|
-
logging.info(f"Running as Administrator, using default port {port}.")
|
524
|
+
# Use the --target_user argument for calculation
|
525
|
+
username = args.target_user.lower()
|
526
|
+
logging.info(f"Determining port based on Windows username from --target_user: {username}")
|
527
|
+
if username == "altair":
|
528
|
+
port = 14000
|
529
|
+
elif username.startswith("guest") and username[5:].isdigit():
|
530
|
+
num = int(username[5:])
|
531
|
+
if 1 <= num <= 10: # Assuming max 10 guests for this range
|
532
|
+
port = 14000 + num
|
543
533
|
else:
|
544
|
-
|
534
|
+
logging.warning(f"Guest user number {num} out of range (1-10), using default port {port}.")
|
545
535
|
else:
|
546
|
-
logging.
|
536
|
+
logging.info(f"Username '{username}' doesn't match specific rules, using default port {port}.")
|
547
537
|
except Exception as e:
|
548
|
-
|
538
|
+
logging.error(f"Error determining port from --target_user '{args.target_user}': {e}. Using default port {port}.", exc_info=True)
|
549
539
|
else:
|
550
|
-
|
551
|
-
|
552
|
-
logging.info(f"Not on Windows or username not found, using default port {port}.")
|
553
|
-
|
554
|
-
# --- End Port Determination ---
|
540
|
+
logging.info(f"--port not specified, and not on Windows or --target_user not specified. Using default port {port}.")
|
541
|
+
# --- End Port Calculation ---
|
555
542
|
|
556
543
|
logging.info(f"Final Host={host}, Port={port}")
|
557
544
|
|
@@ -52,9 +52,6 @@ _service_instance = None
|
|
52
52
|
# --- Flask App Definition ---
|
53
53
|
flask_app = Flask(__name__)
|
54
54
|
|
55
|
-
# Default port constant
|
56
|
-
_DEFAULT_OOTB_PORT = 7888
|
57
|
-
|
58
55
|
@flask_app.route('/command', methods=['POST'])
|
59
56
|
def receive_command():
|
60
57
|
global _service_instance
|
@@ -666,7 +663,9 @@ class GuardService(win32serviceutil.ServiceFramework):
|
|
666
663
|
trigger_results = {}
|
667
664
|
for user in target_users_normalized:
|
668
665
|
self.log_info(f"Calling internal start trigger for user: {user}")
|
669
|
-
#
|
666
|
+
# Call the core logic directly (this is now synchronous within the handler)
|
667
|
+
# Or queue it? Queuing might be better to avoid blocking the handler if many users.
|
668
|
+
# Let's stick to the queue approach from the internal endpoint:
|
670
669
|
internal_command = {
|
671
670
|
"action": "_internal_start_ootb",
|
672
671
|
"target_user": user
|
@@ -683,15 +682,45 @@ class GuardService(win32serviceutil.ServiceFramework):
|
|
683
682
|
|
684
683
|
|
685
684
|
def _trigger_start_for_user(self, username):
|
686
|
-
"""Core logic to start OOTB for a single user
|
685
|
+
"""Core logic to start OOTB for a single user. Called internally."""
|
687
686
|
user = username.lower() # Ensure lowercase
|
688
687
|
self.log_info(f"Internal trigger: Starting OOTB check for user '{user}'...")
|
689
|
-
|
688
|
+
task_created_status = "task_unknown"
|
689
|
+
immediate_start_status = "start_not_attempted"
|
690
690
|
final_status = "failed_unknown"
|
691
|
+
calculated_port = 7888 # Default port
|
692
|
+
|
693
|
+
# --- Calculate Port based on username (mirroring app_teachmode logic) ---
|
694
|
+
try:
|
695
|
+
if user == "altair":
|
696
|
+
calculated_port = 14000
|
697
|
+
elif user.startswith("guest") and user[5:].isdigit():
|
698
|
+
num = int(user[5:])
|
699
|
+
if 1 <= num <= 10:
|
700
|
+
calculated_port = 14000 + num
|
701
|
+
else:
|
702
|
+
self.log_warning(f"Internal trigger: User 'guest{num}' out of range (1-10), using default port {calculated_port} for launch.")
|
703
|
+
# else: use default 7888
|
704
|
+
self.log_info(f"Internal trigger: Calculated port {calculated_port} for user '{user}'.")
|
705
|
+
except Exception as port_calc_e:
|
706
|
+
self.log_error(f"Internal trigger: Error calculating port for user '{user}': {port_calc_e}. Using default port {calculated_port}.")
|
707
|
+
# --- End Port Calculation ---
|
708
|
+
|
691
709
|
|
692
710
|
try:
|
693
|
-
# 1.
|
711
|
+
# 1. Ensure scheduled task exists (still useful fallback/persistence)
|
712
|
+
try:
|
713
|
+
task_created = self.create_or_update_logon_task(user)
|
714
|
+
task_created_status = "task_success" if task_created else "task_failed"
|
715
|
+
except Exception as task_err:
|
716
|
+
self.log_error(f"Internal trigger: Exception creating/updating task for {user}: {task_err}", exc_info=True)
|
717
|
+
task_created_status = "task_exception"
|
718
|
+
# Don't necessarily fail the whole operation yet
|
719
|
+
|
720
|
+
# 2. Check if user is active
|
721
|
+
active_sessions = {} # Re-check active sessions specifically for this user
|
694
722
|
session_id = None
|
723
|
+
token = None
|
695
724
|
is_active = False
|
696
725
|
try:
|
697
726
|
sessions = win32ts.WTSEnumerateSessions(win32ts.WTS_CURRENT_SERVER_HANDLE)
|
@@ -707,69 +736,90 @@ class GuardService(win32serviceutil.ServiceFramework):
|
|
707
736
|
except Exception: pass # Ignore errors querying other sessions
|
708
737
|
except Exception as e:
|
709
738
|
self.log_error(f"Internal trigger: Error checking active sessions for {user}: {e}")
|
710
|
-
#
|
711
|
-
|
712
|
-
|
739
|
+
# Continue, assume inactive if check failed?
|
740
|
+
|
713
741
|
if not is_active:
|
714
|
-
self.log_info(f"Internal trigger: User '{user}' is not active. Skipping immediate start
|
715
|
-
|
716
|
-
|
717
|
-
|
718
|
-
|
719
|
-
|
720
|
-
# Maybe return a specific status?
|
721
|
-
except Exception as task_err:
|
722
|
-
self.log_error(f"Exception creating/updating task for inactive user {user}: {task_err}")
|
723
|
-
return "skipped_inactive_user"
|
724
|
-
|
725
|
-
# 2. Check if already running for this active user
|
742
|
+
self.log_info(f"Internal trigger: User '{user}' is not active. Skipping immediate start.")
|
743
|
+
immediate_start_status = "start_skipped_inactive"
|
744
|
+
final_status = task_created_status # Status depends only on task creation
|
745
|
+
return final_status # Exit early if inactive
|
746
|
+
|
747
|
+
# 3. Check if already running for this active user
|
726
748
|
is_running = False
|
727
749
|
try:
|
728
750
|
running_procs = self._get_ootb_processes(user)
|
729
751
|
if running_procs:
|
730
752
|
is_running = True
|
731
|
-
self.log_info(f"Internal trigger: OOTB already running for active user '{user}'. Skipping
|
732
|
-
|
753
|
+
self.log_info(f"Internal trigger: OOTB already running for active user '{user}'. Skipping immediate start.")
|
754
|
+
immediate_start_status = "start_skipped_already_running"
|
755
|
+
final_status = "success_already_running" # Considered success
|
733
756
|
return final_status # Exit early if already running
|
734
757
|
except Exception as e:
|
735
758
|
self.log_error(f"Internal trigger: Error checking existing processes for {user}: {e}")
|
736
|
-
#
|
759
|
+
# Continue and attempt start despite error?
|
737
760
|
|
738
|
-
#
|
739
|
-
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
|
744
|
-
|
745
|
-
|
746
|
-
self.log_error(f"Internal trigger: Exception creating/updating task '{task_name}': {task_err}", exc_info=True)
|
747
|
-
return "failed_task_exception"
|
761
|
+
# 4. Attempt immediate start (User is active and not running)
|
762
|
+
immediate_start_status = "start_attempted"
|
763
|
+
self.log_info(f"Internal trigger: User '{user}' is active and not running. Attempting immediate start via PowerShell elevation...")
|
764
|
+
|
765
|
+
if not self.target_executable_path:
|
766
|
+
self.log_error("Internal trigger: Cannot start process - target executable path not found.")
|
767
|
+
final_status = "failed_exe_not_found"
|
768
|
+
return final_status # Exit early if executable missing
|
748
769
|
|
749
|
-
# 4. Attempt immediate start by running the scheduled task
|
750
|
-
self.log_info(f"Internal trigger: User '{user}' is active and OOTB not running. Attempting start via Start-ScheduledTask '{task_name}'...")
|
751
|
-
ps_command = f'Start-ScheduledTask -TaskName "{task_name}"'
|
752
770
|
try:
|
753
|
-
|
754
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
|
760
|
-
|
761
|
-
|
762
|
-
|
763
|
-
|
764
|
-
|
765
|
-
|
766
|
-
|
767
|
-
|
768
|
-
|
769
|
-
|
770
|
-
|
771
|
-
|
772
|
-
|
771
|
+
token = win32ts.WTSQueryUserToken(session_id)
|
772
|
+
env = win32profile.CreateEnvironmentBlock(token, False)
|
773
|
+
startup = win32process.STARTUPINFO()
|
774
|
+
# Use CREATE_NEW_CONSOLE to make the PS window visible and potentially the UAC prompt
|
775
|
+
creation_flags = win32con.CREATE_NEW_CONSOLE
|
776
|
+
|
777
|
+
# Command to run PowerShell, which then elevates the target executable
|
778
|
+
target_exe_unquoted = self.target_executable_path.strip('"')
|
779
|
+
target_exe_for_ps = target_exe_unquoted.replace("'", "''") # Escape single quotes for PS
|
780
|
+
arguments_for_ps = f"--port {calculated_port} --target_user '{user}'" # Pass calculated port and target user
|
781
|
+
powershell_command = (
|
782
|
+
f'Start-Process -FilePath "{target_exe_for_ps}" '
|
783
|
+
f'-ArgumentList "{arguments_for_ps}" -Verb RunAs'
|
784
|
+
)
|
785
|
+
# Launch powershell.exe directly, tell it to run the Start-Process command, and keep window open
|
786
|
+
# Need to escape quotes within the -Command argument
|
787
|
+
escaped_ps_command_for_command_arg = powershell_command.replace('"', '`"' ) # Use backtick escaping for PS command arg
|
788
|
+
|
789
|
+
lpCommandLine = f'powershell.exe -NoProfile -ExecutionPolicy Bypass -NoExit -Command "& {{{escaped_ps_command_for_command_arg}}}"'
|
790
|
+
|
791
|
+
lpApplicationName = None # Must be None if using lpCommandLine
|
792
|
+
cwd = os.path.dirname(target_exe_unquoted) if os.path.dirname(target_exe_unquoted) else None
|
793
|
+
|
794
|
+
# Log details before call
|
795
|
+
self.log_info(f"Internal trigger: Launching PowerShell directly for elevation:")
|
796
|
+
self.log_info(f" lpCommandLine: {lpCommandLine}")
|
797
|
+
self.log_info(f" lpCurrentDirectory: {cwd if cwd else 'Default'}")
|
798
|
+
|
799
|
+
hProcess, hThread, dwPid, dwTid = win32process.CreateProcessAsUser(
|
800
|
+
token, lpApplicationName, lpCommandLine, None, None, False,
|
801
|
+
creation_flags, env, cwd, startup
|
802
|
+
)
|
803
|
+
# We get the PID of cmd.exe/powershell.exe here, not the final elevated process.
|
804
|
+
# We can't easily track the elevated process PID across the UAC boundary.
|
805
|
+
self.log_info(f"Internal trigger: CreateProcessAsUser call to initiate elevation succeeded for user '{user}' (Launcher PID: {dwPid}). UAC prompt expected if needed.")
|
806
|
+
win32api.CloseHandle(hProcess)
|
807
|
+
win32api.CloseHandle(hThread)
|
808
|
+
|
809
|
+
# Assume success if the call didn't raise an exception.
|
810
|
+
# We cannot easily verify if the *elevated* process actually started.
|
811
|
+
immediate_start_status = "start_elevation_initiated"
|
812
|
+
final_status = "success_elevation_initiated" # Report success based on initiating the elevation
|
813
|
+
|
814
|
+
except Exception as proc_err:
|
815
|
+
self.log_error(f"Internal trigger: Exception during CreateProcessAsUser for elevation attempt (user '{user}'): {proc_err}", exc_info=True)
|
816
|
+
immediate_start_status = "start_failed_exception"
|
817
|
+
final_status = "failed_start_exception"
|
818
|
+
finally:
|
819
|
+
if token: win32api.CloseHandle(token)
|
820
|
+
|
821
|
+
# Combine results (mostly determined by start attempt now)
|
822
|
+
# Example: final_status = f"{task_created_status}_{immediate_start_status}"
|
773
823
|
return final_status
|
774
824
|
|
775
825
|
except Exception as e:
|
@@ -792,32 +842,32 @@ class GuardService(win32serviceutil.ServiceFramework):
|
|
792
842
|
python_exe = f'"{python_exe}"'
|
793
843
|
|
794
844
|
task_name = f"OOTB_UserConnect_{username}"
|
795
|
-
#
|
796
|
-
|
797
|
-
|
798
|
-
|
799
|
-
|
800
|
-
|
845
|
+
# Action: Run python.exe with the signal script and username argument
|
846
|
+
action_executable = python_exe
|
847
|
+
# Ensure script path is quoted if needed
|
848
|
+
script_arg = self.signal_script_path # Should be quoted already by _find_signal_script
|
849
|
+
# Username might need quoting if it contains spaces, though unlikely
|
850
|
+
user_arg = username # Keep simple for now
|
851
|
+
action_arguments = f'{script_arg} "{user_arg}"' # Pass username as quoted arg
|
801
852
|
safe_action_executable = action_executable.replace("'", "''") # Escape for PS
|
802
853
|
safe_action_arguments = action_arguments.replace("'", "''") # Escape for PS
|
803
854
|
|
804
|
-
# Working directory for the
|
855
|
+
# Working directory for the script (likely its own directory)
|
805
856
|
try:
|
806
|
-
|
807
|
-
if not
|
808
|
-
safe_working_directory =
|
857
|
+
script_dir = os.path.dirname(self.signal_script_path.strip('"'))
|
858
|
+
if not script_dir: script_dir = "."
|
859
|
+
safe_working_directory = script_dir.replace("'", "''")
|
809
860
|
working_directory_setting = f"$action.WorkingDirectory = '{safe_working_directory}'"
|
810
861
|
except Exception as e:
|
811
|
-
self.log_error(f"Error determining working directory for
|
862
|
+
self.log_error(f"Error determining working directory for signal script task: {e}. WD will not be set.")
|
812
863
|
working_directory_setting = "# Could not set WorkingDirectory"
|
813
864
|
|
814
865
|
# PowerShell command construction
|
815
866
|
ps_command = f"""
|
816
867
|
$taskName = "{task_name}"
|
817
|
-
|
818
|
-
$principal = New-ScheduledTaskPrincipal -UserId "{username}" -LogonType Interactive -RunLevel Highest
|
868
|
+
$principal = New-ScheduledTaskPrincipal -UserId "{username}" -LogonType Interactive
|
819
869
|
|
820
|
-
# Action: Run
|
870
|
+
# Action: Run python signal script
|
821
871
|
$action = New-ScheduledTaskAction -Execute '{safe_action_executable}' -Argument '{safe_action_arguments}'
|
822
872
|
{working_directory_setting}
|
823
873
|
|
@@ -889,9 +939,7 @@ class GuardService(win32serviceutil.ServiceFramework):
|
|
889
939
|
return True
|
890
940
|
|
891
941
|
def _find_signal_script(self):
|
892
|
-
"""Finds the signal_connection.py script relative to this service file.
|
893
|
-
# This might no longer be needed if the task directly runs the main executable
|
894
|
-
self.log_warning("_find_signal_script called - this might be deprecated.")
|
942
|
+
"""Finds the signal_connection.py script relative to this service file."""
|
895
943
|
try:
|
896
944
|
base_dir = os.path.dirname(os.path.abspath(__file__))
|
897
945
|
script_path = os.path.join(base_dir, "signal_connection.py")
|
@@ -908,30 +956,6 @@ class GuardService(win32serviceutil.ServiceFramework):
|
|
908
956
|
self.log_error(f"Error finding signal script: {e}")
|
909
957
|
return None
|
910
958
|
|
911
|
-
def _calculate_port_for_user(self, username):
|
912
|
-
"""Calculates the target port based on the username."""
|
913
|
-
port = _DEFAULT_OOTB_PORT # Start with default
|
914
|
-
username_lower = username.lower()
|
915
|
-
self.log_info(f"Calculating port for username: {username_lower}")
|
916
|
-
try:
|
917
|
-
if username_lower == "altair":
|
918
|
-
port = 14000
|
919
|
-
elif username_lower.startswith("guest") and username_lower[5:].isdigit():
|
920
|
-
num = int(username_lower[5:])
|
921
|
-
if 1 <= num <= 10:
|
922
|
-
port = 14000 + num
|
923
|
-
else:
|
924
|
-
self.log_warning(f"Guest user number {num} out of range (1-10) for port calculation, using default {port}.")
|
925
|
-
# Add Administrator or other specific users if needed
|
926
|
-
# elif username_lower == "administrator":
|
927
|
-
# port = 14999 # Example
|
928
|
-
else:
|
929
|
-
self.log_info(f"Username '{username_lower}' doesn't match specific rules, using default port {port}.")
|
930
|
-
except Exception as e:
|
931
|
-
self.log_error(f"Error during port calculation for {username_lower}: {e}. Using default {port}.", exc_info=True)
|
932
|
-
self.log_info(f"Calculated port {port} for user {username_lower}")
|
933
|
-
return port
|
934
|
-
|
935
959
|
# --- Main Execution Block ---
|
936
960
|
if __name__ == '__main__':
|
937
961
|
if len(sys.argv) > 1 and sys.argv[1] == 'debug':
|
{computer_use_ootb_internal-0.0.147.dist-info → computer_use_ootb_internal-0.0.149.dist-info}/RECORD
RENAMED
@@ -1,8 +1,8 @@
|
|
1
1
|
computer_use_ootb_internal/README.md,sha256=FxpW95lyub2iX73ZDfK6ML7SdEKg060H5I6Grub7li4,31
|
2
2
|
computer_use_ootb_internal/__init__.py,sha256=Nqnn8clbgv-5l0PgxcTOldg8mkMKrFn4TvPL-rYUUGg,1
|
3
|
-
computer_use_ootb_internal/app_teachmode.py,sha256=
|
3
|
+
computer_use_ootb_internal/app_teachmode.py,sha256=hiUTiX4jl1-5yqs3AwrOjNmToL5LbUb42o5XS4fiKAA,23805
|
4
4
|
computer_use_ootb_internal/dependency_check.py,sha256=y8RMEP6RXQzTgU1MS_1piBLtz4J-Hfn9RjUZg59dyvo,1333
|
5
|
-
computer_use_ootb_internal/guard_service.py,sha256=
|
5
|
+
computer_use_ootb_internal/guard_service.py,sha256=qPEmIHykWw9aD1Kw8HtdH94V39r2OOe55RiyTbyu8-k,52326
|
6
6
|
computer_use_ootb_internal/requirements-lite.txt,sha256=5DAHomz4A_P2BmTIXNkNqkHbnIF0AyZ4_1XAlb1LaYs,290
|
7
7
|
computer_use_ootb_internal/run_teachmode_ootb_args.py,sha256=eUPpfA7bB3bdBBiIBIxKJSS-Jpz2G6R46fpDO440Jyo,7687
|
8
8
|
computer_use_ootb_internal/service_manager.py,sha256=SD8jzfn0VVXBOr_nP6zmBWSC2TzrU_sp2e5JJkSlQFU,9734
|
@@ -34,7 +34,7 @@ computer_use_ootb_internal/computer_use_demo/tools/run.py,sha256=xhXdnBK1di9muaO
|
|
34
34
|
computer_use_ootb_internal/computer_use_demo/tools/screen_capture.py,sha256=L8qfvtUkPPQGt92N-2Zfw5ZTDBzLsDps39uMnX3_uSA,6857
|
35
35
|
computer_use_ootb_internal/preparation/__init__.py,sha256=AgtGHcBpiTkxJjF0xwcs3yyQ6SyUvhL3G0vD2XO-zJw,63
|
36
36
|
computer_use_ootb_internal/preparation/star_rail_prepare.py,sha256=r0b19M_c1sXkN3_MRFjql8w_ThC9nZUe8zbSLYUvKS8,4635
|
37
|
-
computer_use_ootb_internal-0.0.
|
38
|
-
computer_use_ootb_internal-0.0.
|
39
|
-
computer_use_ootb_internal-0.0.
|
40
|
-
computer_use_ootb_internal-0.0.
|
37
|
+
computer_use_ootb_internal-0.0.149.dist-info/METADATA,sha256=CtwPTxIQ54d1Wu4dExuOl8iZUrdj0rAck1otUNwe0PE,1048
|
38
|
+
computer_use_ootb_internal-0.0.149.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
39
|
+
computer_use_ootb_internal-0.0.149.dist-info/entry_points.txt,sha256=bXfyAU_qq-G1EiEgAQEioXvgEdRCFxaTooqdDD9Y4OA,258
|
40
|
+
computer_use_ootb_internal-0.0.149.dist-info/RECORD,,
|
{computer_use_ootb_internal-0.0.147.dist-info → computer_use_ootb_internal-0.0.149.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|