From a038627ab8177970764206786e1be0cef0f97317 Mon Sep 17 00:00:00 2001 From: onur-askui <210008309+onur-askui@users.noreply.github.com> Date: Fri, 11 Jul 2025 16:36:54 +0200 Subject: [PATCH 01/21] chore: remove old code gen artifacts --- .../Controller_V1_pb2.py | 172 --- .../Controller_V1_pb2.pyi | 910 ------------- .../Controller_V1_pb2_grpc.py | 1148 ----------------- 3 files changed, 2230 deletions(-) delete mode 100644 src/askui/tools/askui/askui_ui_controller_grpc/Controller_V1_pb2.py delete mode 100644 src/askui/tools/askui/askui_ui_controller_grpc/Controller_V1_pb2.pyi delete mode 100644 src/askui/tools/askui/askui_ui_controller_grpc/Controller_V1_pb2_grpc.py diff --git a/src/askui/tools/askui/askui_ui_controller_grpc/Controller_V1_pb2.py b/src/askui/tools/askui/askui_ui_controller_grpc/Controller_V1_pb2.py deleted file mode 100644 index e0eb6a50..00000000 --- a/src/askui/tools/askui/askui_ui_controller_grpc/Controller_V1_pb2.py +++ /dev/null @@ -1,172 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: Controller_V1.proto -# Protobuf Python Version: 5.26.1 -"""Generated protocol buffer code.""" - -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder - -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x13\x43ontroller_V1.proto\x12\x0f\x41skui.API.TDKv1"\x06\n\x04Void"\x0e\n\x0cRequest_Void"\x0f\n\rResponse_Void"&\n\x05Size2\x12\r\n\x05width\x18\x01 \x01(\r\x12\x0e\n\x06height\x18\x02 \x01(\r"\x1e\n\x06\x44\x65lta2\x12\t\n\x01x\x18\x01 \x01(\x05\x12\t\n\x01y\x18\x02 \x01(\x05"#\n\x0b\x43oordinate2\x12\t\n\x01x\x18\x01 \x01(\x05\x12\t\n\x01y\x18\x02 \x01(\x05"E\n\tRectangle\x12\x0c\n\x04left\x18\x01 \x01(\x05\x12\x0b\n\x03top\x18\x02 \x01(\x05\x12\r\n\x05right\x18\x03 \x01(\x05\x12\x0e\n\x06\x62ottom\x18\x04 \x01(\x05"u\n\x06\x42itmap\x12\r\n\x05width\x18\x01 \x01(\r\x12\x0e\n\x06height\x18\x02 \x01(\r\x12\x11\n\tlineWidth\x18\x03 \x01(\r\x12\x14\n\x0c\x62itsPerPixel\x18\x04 \x01(\r\x12\x15\n\rbytesPerPixel\x18\x05 \x01(\r\x12\x0c\n\x04\x64\x61ta\x18\x06 \x01(\x0c"(\n\x05\x43olor\x12\t\n\x01r\x18\x01 \x01(\r\x12\t\n\x01g\x18\x02 \x01(\r\x12\t\n\x01\x62\x18\x03 \x01(\r")\n\x04GUID\x12\x10\n\x08highPart\x18\x01 \x01(\x04\x12\x0f\n\x07lowPart\x18\x02 \x01(\x04"L\n\x0bSessionInfo\x12*\n\x0bsessionGUID\x18\x01 \x01(\x0b\x32\x15.Askui.API.TDKv1.GUID\x12\x11\n\tsessionID\x18\x02 \x01(\x04"e\n\x0b\x43\x61ptureArea\x12$\n\x04size\x18\x03 \x01(\x0b\x32\x16.Askui.API.TDKv1.Size2\x12\x30\n\ncoordinate\x18\x02 \x01(\x0b\x32\x1c.Askui.API.TDKv1.Coordinate2"\x81\x01\n\x11\x43\x61ptureParameters\x12\x16\n\tdisplayID\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x36\n\x0b\x63\x61ptureArea\x18\x02 \x01(\x0b\x32\x1c.Askui.API.TDKv1.CaptureAreaH\x01\x88\x01\x01\x42\x0c\n\n_displayIDB\x0e\n\x0c_captureArea"6\n"PollEventParameters_ActionFinished\x12\x10\n\x08\x61\x63tionID\x18\x01 \x01(\r"n\n\x13PollEventParameters\x12M\n\x0e\x61\x63tionFinished\x18\x01 \x01(\x0b\x32\x33.Askui.API.TDKv1.PollEventParameters_ActionFinishedH\x00\x42\x08\n\x06\x64\x61taOf"-\n\x15\x41\x63tionParameters_Wait\x12\x14\n\x0cmilliseconds\x18\x01 \x01(\r"W\n"ActionParameters_MouseButton_Press\x12\x31\n\x0bmouseButton\x18\x01 \x01(\x0e\x32\x1c.Askui.API.TDKv1.MouseButton"Y\n$ActionParameters_MouseButton_Release\x12\x31\n\x0bmouseButton\x18\x01 \x01(\x0e\x32\x1c.Askui.API.TDKv1.MouseButton"p\n,ActionParameters_MouseButton_PressAndRelease\x12\x31\n\x0bmouseButton\x18\x01 \x01(\x0e\x32\x1c.Askui.API.TDKv1.MouseButton\x12\r\n\x05\x63ount\x18\x02 \x01(\r"\xc0\x01\n!ActionParameters_MouseWheelScroll\x12=\n\tdirection\x18\x01 \x01(\x0e\x32*.Askui.API.TDKv1.MouseWheelScrollDirection\x12\x37\n\tdeltaType\x18\x02 \x01(\x0e\x32$.Askui.API.TDKv1.MouseWheelDeltaType\x12\r\n\x05\x64\x65lta\x18\x03 \x01(\x05\x12\x14\n\x0cmilliseconds\x18\x04 \x01(\x05"x\n\x1a\x41\x63tionParameters_MouseMove\x12.\n\x08position\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.Coordinate2\x12\x19\n\x0cmilliseconds\x18\x02 \x01(\rH\x00\x88\x01\x01\x42\x0f\n\r_milliseconds"v\n ActionParameters_MouseMove_Delta\x12&\n\x05\x64\x65lta\x18\x01 \x01(\x0b\x32\x17.Askui.API.TDKv1.Delta2\x12\x19\n\x0cmilliseconds\x18\x02 \x01(\rH\x00\x88\x01\x01\x42\x0f\n\r_milliseconds"O\n"ActionParameters_KeyboardKey_Press\x12\x0f\n\x07keyName\x18\x01 \x01(\t\x12\x18\n\x10modifierKeyNames\x18\x02 \x03(\t"Q\n$ActionParameters_KeyboardKey_Release\x12\x0f\n\x07keyName\x18\x01 \x01(\t\x12\x18\n\x10modifierKeyNames\x18\x02 \x03(\t"Y\n,ActionParameters_KeyboardKey_PressAndRelease\x12\x0f\n\x07keyName\x18\x01 \x01(\t\x12\x18\n\x10modifierKeyNames\x18\x02 \x03(\t"Q\n#ActionParameters_KeyboardKeys_Press\x12\x10\n\x08keyNames\x18\x01 \x03(\t\x12\x18\n\x10modifierKeyNames\x18\x02 \x03(\t"S\n%ActionParameters_KeyboardKeys_Release\x12\x10\n\x08keyNames\x18\x01 \x03(\t\x12\x18\n\x10modifierKeyNames\x18\x02 \x03(\t"[\n-ActionParameters_KeyboardKeys_PressAndRelease\x12\x10\n\x08keyNames\x18\x01 \x03(\t\x12\x18\n\x10modifierKeyNames\x18\x02 \x03(\t"\x99\x01\n"ActionParameters_KeyboardType_Text\x12\x0c\n\x04text\x18\x01 \x01(\t\x12;\n\x10typingSpeedValue\x18\x02 \x01(\x0e\x32!.Askui.API.TDKv1.TypingSpeedValue\x12\x18\n\x0btypingSpeed\x18\x03 \x01(\rH\x00\x88\x01\x01\x42\x0e\n\x0c_typingSpeed"\xa0\x01\n)ActionParameters_KeyboardType_UnicodeText\x12\x0c\n\x04text\x18\x01 \x01(\x0c\x12;\n\x10typingSpeedValue\x18\x02 \x01(\x0e\x32!.Askui.API.TDKv1.TypingSpeedValue\x12\x18\n\x0btypingSpeed\x18\x03 \x01(\rH\x00\x88\x01\x01\x42\x0e\n\x0c_typingSpeed"l\n\x1b\x41\x63tionParameters_RunCommand\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\t\x12"\n\x15timeoutInMilliseconds\x18\x02 \x01(\rH\x00\x88\x01\x01\x42\x18\n\x16_timeoutInMilliseconds"\xf5\n\n\x10\x41\x63tionParameters\x12%\n\x04none\x18\x01 \x01(\x0b\x32\x15.Askui.API.TDKv1.VoidH\x00\x12\x36\n\x04wait\x18\x02 \x01(\x0b\x32&.Askui.API.TDKv1.ActionParameters_WaitH\x00\x12O\n\x10mouseButtonPress\x18\x03 \x01(\x0b\x32\x33.Askui.API.TDKv1.ActionParameters_MouseButton_PressH\x00\x12S\n\x12mouseButtonRelease\x18\x04 \x01(\x0b\x32\x35.Askui.API.TDKv1.ActionParameters_MouseButton_ReleaseH\x00\x12\x63\n\x1amouseButtonPressAndRelease\x18\x05 \x01(\x0b\x32=.Askui.API.TDKv1.ActionParameters_MouseButton_PressAndReleaseH\x00\x12N\n\x10mouseWheelScroll\x18\x06 \x01(\x0b\x32\x32.Askui.API.TDKv1.ActionParameters_MouseWheelScrollH\x00\x12@\n\tmouseMove\x18\x07 \x01(\x0b\x32+.Askui.API.TDKv1.ActionParameters_MouseMoveH\x00\x12K\n\x0emouseMoveDelta\x18\x08 \x01(\x0b\x32\x31.Askui.API.TDKv1.ActionParameters_MouseMove_DeltaH\x00\x12O\n\x10keyboardKeyPress\x18\t \x01(\x0b\x32\x33.Askui.API.TDKv1.ActionParameters_KeyboardKey_PressH\x00\x12S\n\x12keyboardKeyRelease\x18\n \x01(\x0b\x32\x35.Askui.API.TDKv1.ActionParameters_KeyboardKey_ReleaseH\x00\x12\x63\n\x1akeyboardKeyPressAndRelease\x18\x0b \x01(\x0b\x32=.Askui.API.TDKv1.ActionParameters_KeyboardKey_PressAndReleaseH\x00\x12Q\n\x11keyboardKeysPress\x18\x0c \x01(\x0b\x32\x34.Askui.API.TDKv1.ActionParameters_KeyboardKeys_PressH\x00\x12U\n\x13keyboardKeysRelease\x18\r \x01(\x0b\x32\x36.Askui.API.TDKv1.ActionParameters_KeyboardKeys_ReleaseH\x00\x12\x65\n\x1bkeyboardKeysPressAndRelease\x18\x0e \x01(\x0b\x32>.Askui.API.TDKv1.ActionParameters_KeyboardKeys_PressAndReleaseH\x00\x12O\n\x10keyboardTypeText\x18\x0f \x01(\x0b\x32\x33.Askui.API.TDKv1.ActionParameters_KeyboardType_TextH\x00\x12]\n\x17keyboardTypeUnicodeText\x18\x10 \x01(\x0b\x32:.Askui.API.TDKv1.ActionParameters_KeyboardType_UnicodeTextH\x00\x12\x42\n\nruncommand\x18\x11 \x01(\x0b\x32,.Askui.API.TDKv1.ActionParameters_RunCommandH\x00\x42\x08\n\x06\x64\x61taOf"G\n\x14Request_StartSession\x12\x13\n\x0bsessionGUID\x18\x01 \x01(\t\x12\x1a\n\x12immediateExecution\x18\x02 \x01(\x08"J\n\x15Response_StartSession\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo"G\n\x12Request_EndSession\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo"t\n\x0cRequest_Poll\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\x12\x31\n\x0bpollEventID\x18\x02 \x01(\x0e\x32\x1c.Askui.API.TDKv1.PollEventID"K\n\x16Request_StartExecution\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo"J\n\x15Request_StopExecution\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo"\x85\x01\n\rResponse_Poll\x12\x31\n\x0bpollEventID\x18\x01 \x01(\x0e\x32\x1c.Askui.API.TDKv1.PollEventID\x12\x41\n\x13pollEventParameters\x18\x02 \x01(\x0b\x32$.Askui.API.TDKv1.PollEventParameters"\xc2\x01\n\x19Request_RunRecordedAction\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\x12\x35\n\ractionClassID\x18\x02 \x01(\x0e\x32\x1e.Askui.API.TDKv1.ActionClassID\x12;\n\x10\x61\x63tionParameters\x18\x03 \x01(\x0b\x32!.Askui.API.TDKv1.ActionParameters"L\n\x1aResponse_RunRecordedAction\x12\x10\n\x08\x61\x63tionID\x18\x01 \x01(\r\x12\x1c\n\x14requiredMilliseconds\x18\x02 \x01(\r"\xc6\x01\n\x1dRequest_ScheduleBatchedAction\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\x12\x35\n\ractionClassID\x18\x02 \x01(\x0e\x32\x1e.Askui.API.TDKv1.ActionClassID\x12;\n\x10\x61\x63tionParameters\x18\x03 \x01(\x0b\x32!.Askui.API.TDKv1.ActionParameters"2\n\x1eResponse_ScheduleBatchedAction\x12\x10\n\x08\x61\x63tionID\x18\x01 \x01(\r"K\n\x16Request_GetActionCount\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo".\n\x17Response_GetActionCount\x12\x13\n\x0b\x61\x63tionCount\x18\x01 \x01(\r"[\n\x11Request_GetAction\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\x12\x13\n\x0b\x61\x63tionIndex\x18\x02 \x01(\r"\x9a\x01\n\x12Response_GetAction\x12\x10\n\x08\x61\x63tionID\x18\x01 \x01(\r\x12\x35\n\ractionClassID\x18\x02 \x01(\x0e\x32\x1e.Askui.API.TDKv1.ActionClassID\x12;\n\x10\x61\x63tionParameters\x18\x03 \x01(\x0b\x32!.Askui.API.TDKv1.ActionParameters"[\n\x14Request_RemoveAction\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\x12\x10\n\x08\x61\x63tionID\x18\x02 \x01(\r"M\n\x18Request_RemoveAllActions\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo"J\n\x15Request_StartBatchRun\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo"I\n\x14Request_StopBatchRun\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo"\xa4\x01\n\x15Request_CaptureScreen\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\x12\x42\n\x11\x63\x61ptureParameters\x18\x02 \x01(\x0b\x32".Askui.API.TDKv1.CaptureParametersH\x00\x88\x01\x01\x42\x14\n\x12_captureParameters"A\n\x16Response_CaptureScreen\x12\'\n\x06\x62itmap\x18\x01 \x01(\x0b\x32\x17.Askui.API.TDKv1.Bitmap"O\n$Response_GetContinuousCapturedScreen\x12\'\n\x06\x62itmap\x18\x01 \x01(\x0b\x32\x17.Askui.API.TDKv1.Bitmap"\xde\x01\n\x1cReuqest_SetTestConfiguration\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\x12\x44\n\x18\x64\x65\x66\x61ultCaptureParameters\x18\x02 \x01(\x0b\x32".Askui.API.TDKv1.CaptureParameters\x12 \n\x18mouseDelayInMilliseconds\x18\x03 \x01(\r\x12#\n\x1bkeyboardDelayInMilliseconds\x18\x04 \x01(\r"g\n\x15Request_SetMouseDelay\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\x12\x1b\n\x13\x64\x65layInMilliseconds\x18\x02 \x01(\r"j\n\x18Request_SetKeyboardDelay\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\x12\x1b\n\x13\x64\x65layInMilliseconds\x18\x02 \x01(\r"\x9f\x01\n\x12\x44isplayInformation\x12\x11\n\tdisplayID\x18\x01 \x01(\r\x12\x0c\n\x04name\x18\x02 \x01(\t\x12,\n\x0csizeInPixels\x18\x03 \x01(\x0b\x32\x16.Askui.API.TDKv1.Size2\x12:\n\x16virtualScreenRectangle\x18\x04 \x01(\x0b\x32\x1a.Askui.API.TDKv1.Rectangle"\x93\x01\n\x1eResponse_GetDisplayInformation\x12\x35\n\x08\x64isplays\x18\x01 \x03(\x0b\x32#.Askui.API.TDKv1.DisplayInformation\x12:\n\x16virtualScreenRectangle\x18\x02 \x01(\x0b\x32\x1a.Askui.API.TDKv1.Rectangle"1\n\x19Response_GetMousePosition\x12\t\n\x01x\x18\x01 \x01(\x05\x12\t\n\x01y\x18\x02 \x01(\x05"-\n\x18Request_SetActiveDisplay\x12\x11\n\tdisplayID\x18\x01 \x01(\r"Q\n\x10Request_GetColor\x12\t\n\x01x\x18\x01 \x01(\x05\x12\t\n\x01y\x18\x02 \x01(\x05\x12\'\n\x06\x62itmap\x18\x03 \x01(\x0b\x32\x17.Askui.API.TDKv1.Bitmap":\n\x11Response_GetColor\x12%\n\x05\x63olor\x18\x01 \x01(\x0b\x32\x16.Askui.API.TDKv1.Color"-\n\x15Request_GetPixelColor\x12\t\n\x01x\x18\x01 \x01(\x05\x12\t\n\x01y\x18\x02 \x01(\x05"?\n\x16Response_GetPixelColor\x12%\n\x05\x63olor\x18\x01 \x01(\x0b\x32\x16.Askui.API.TDKv1.Color"n\n\x17Request_SetDisplayLabel\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\x12\x11\n\tdisplayID\x18\x02 \x01(\r\x12\r\n\x05label\x18\x03 \x01(\t*N\n\x0bPollEventID\x12\x19\n\x15PollEventID_Undefined\x10\x00\x12\x1e\n\x1aPollEventID_ActionFinished\x10\x02"\x04\x08\x01\x10\x01*m\n\x0bMouseButton\x12\x19\n\x15MouseButton_Undefined\x10\x00\x12\x14\n\x10MouseButton_Left\x10\x01\x12\x15\n\x11MouseButton_Right\x10\x02\x12\x16\n\x12MouseButton_Middle\x10\x03*\x8b\x05\n\rActionClassID\x12\x1b\n\x17\x41\x63tionClassID_Undefined\x10\x00\x12\x16\n\x12\x41\x63tionClassID_Wait\x10\x01\x12#\n\x1f\x41\x63tionClassID_MouseButton_Press\x10\x08\x12%\n!ActionClassID_MouseButton_Release\x10\t\x12-\n)ActionClassID_MouseButton_PressAndRelease\x10\n\x12"\n\x1e\x41\x63tionClassID_MouseWheelScroll\x10\x0b\x12\x1b\n\x17\x41\x63tionClassID_MouseMove\x10\x0c\x12!\n\x1d\x41\x63tionClassID_MouseMove_Delta\x10\r\x12#\n\x1f\x41\x63tionClassID_KeyboardKey_Press\x10\x0e\x12%\n!ActionClassID_KeyboardKey_Release\x10\x0f\x12-\n)ActionClassID_KeyboardKey_PressAndRelease\x10\x10\x12$\n ActionClassID_KeyboardKeys_Press\x10\x11\x12&\n"ActionClassID_KeyboardKeys_Release\x10\x12\x12.\n*ActionClassID_KeyboardKeys_PressAndRelease\x10\x13\x12#\n\x1f\x41\x63tionClassID_KeyboardType_Text\x10\x14\x12*\n&ActionClassID_KeyboardType_UnicodeText\x10\x15\x12\x1c\n\x18\x41\x63tionClassID_RunCommand\x10\x16*i\n\x13MouseWheelDeltaType\x12\x1d\n\x19MouseWheelDelta_Undefined\x10\x00\x12\x17\n\x13MouseWheelDelta_Raw\x10\x01\x12\x1a\n\x16MouseWheelDelta_Detent\x10\x02*\x96\x01\n\x19MouseWheelScrollDirection\x12\'\n#MouseWheelScrollDirection_Undefined\x10\x00\x12&\n"MouseWheelScrollDirection_Vertical\x10\x01\x12(\n$MouseWheelScrollDirection_Horizontal\x10\x02*z\n\x10TypingSpeedValue\x12\x1e\n\x1aTypingSpeedValue_Undefined\x10\x00\x12(\n$TypingSpeedValue_CharactersPerSecond\x10\x01\x12\x1c\n\x18TypingSpeedValue_Seconds\x10\x02\x32\xad\x11\n\rControllerAPI\x12_\n\x0cStartSession\x12%.Askui.API.TDKv1.Request_StartSession\x1a&.Askui.API.TDKv1.Response_StartSession"\x00\x12S\n\nEndSession\x12#.Askui.API.TDKv1.Request_EndSession\x1a\x1e.Askui.API.TDKv1.Response_Void"\x00\x12G\n\x04Poll\x12\x1d.Askui.API.TDKv1.Request_Poll\x1a\x1e.Askui.API.TDKv1.Response_Poll"\x00\x12[\n\x0eStartExecution\x12\'.Askui.API.TDKv1.Request_StartExecution\x1a\x1e.Askui.API.TDKv1.Response_Void"\x00\x12Y\n\rStopExecution\x12&.Askui.API.TDKv1.Request_StopExecution\x1a\x1e.Askui.API.TDKv1.Response_Void"\x00\x12n\n\x11RunRecordedAction\x12*.Askui.API.TDKv1.Request_RunRecordedAction\x1a+.Askui.API.TDKv1.Response_RunRecordedAction"\x00\x12z\n\x15ScheduleBatchedAction\x12..Askui.API.TDKv1.Request_ScheduleBatchedAction\x1a/.Askui.API.TDKv1.Response_ScheduleBatchedAction"\x00\x12Y\n\rStartBatchRun\x12&.Askui.API.TDKv1.Request_StartBatchRun\x1a\x1e.Askui.API.TDKv1.Response_Void"\x00\x12W\n\x0cStopBatchRun\x12%.Askui.API.TDKv1.Request_StopBatchRun\x1a\x1e.Askui.API.TDKv1.Response_Void"\x00\x12\x65\n\x0eGetActionCount\x12\'.Askui.API.TDKv1.Request_GetActionCount\x1a(.Askui.API.TDKv1.Response_GetActionCount"\x00\x12V\n\tGetAction\x12".Askui.API.TDKv1.Request_GetAction\x1a#.Askui.API.TDKv1.Response_GetAction"\x00\x12W\n\x0cRemoveAction\x12%.Askui.API.TDKv1.Request_RemoveAction\x1a\x1e.Askui.API.TDKv1.Response_Void"\x00\x12_\n\x10RemoveAllActions\x12).Askui.API.TDKv1.Request_RemoveAllActions\x1a\x1e.Askui.API.TDKv1.Response_Void"\x00\x12\x62\n\rCaptureScreen\x12&.Askui.API.TDKv1.Request_CaptureScreen\x1a\'.Askui.API.TDKv1.Response_CaptureScreen"\x00\x12g\n\x14SetTestConfiguration\x12-.Askui.API.TDKv1.Reuqest_SetTestConfiguration\x1a\x1e.Askui.API.TDKv1.Response_Void"\x00\x12Y\n\rSetMouseDelay\x12&.Askui.API.TDKv1.Request_SetMouseDelay\x1a\x1e.Askui.API.TDKv1.Response_Void"\x00\x12_\n\x10SetKeyboardDelay\x12).Askui.API.TDKv1.Request_SetKeyboardDelay\x1a\x1e.Askui.API.TDKv1.Response_Void"\x00\x12i\n\x15GetDisplayInformation\x12\x1d.Askui.API.TDKv1.Request_Void\x1a/.Askui.API.TDKv1.Response_GetDisplayInformation"\x00\x12_\n\x10GetMousePosition\x12\x1d.Askui.API.TDKv1.Request_Void\x1a*.Askui.API.TDKv1.Response_GetMousePosition"\x00\x12_\n\x10SetActiveDisplay\x12).Askui.API.TDKv1.Request_SetActiveDisplay\x1a\x1e.Askui.API.TDKv1.Response_Void"\x00\x12S\n\x08GetColor\x12!.Askui.API.TDKv1.Request_GetColor\x1a".Askui.API.TDKv1.Response_GetColor"\x00\x12\x62\n\rGetPixelColor\x12&.Askui.API.TDKv1.Request_GetPixelColor\x1a\'.Askui.API.TDKv1.Response_GetPixelColor"\x00\x12]\n\x0fSetDisplayLabel\x12(.Askui.API.TDKv1.Request_SetDisplayLabel\x1a\x1e.Askui.API.TDKv1.Response_Void"\x00\x62\x06proto3' -) - -_globals = globals() -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "Controller_V1_pb2", _globals) -if not _descriptor._USE_C_DESCRIPTORS: - DESCRIPTOR._loaded_options = None - _globals["_POLLEVENTID"]._serialized_start = 7454 - _globals["_POLLEVENTID"]._serialized_end = 7532 - _globals["_MOUSEBUTTON"]._serialized_start = 7534 - _globals["_MOUSEBUTTON"]._serialized_end = 7643 - _globals["_ACTIONCLASSID"]._serialized_start = 7646 - _globals["_ACTIONCLASSID"]._serialized_end = 8297 - _globals["_MOUSEWHEELDELTATYPE"]._serialized_start = 8299 - _globals["_MOUSEWHEELDELTATYPE"]._serialized_end = 8404 - _globals["_MOUSEWHEELSCROLLDIRECTION"]._serialized_start = 8407 - _globals["_MOUSEWHEELSCROLLDIRECTION"]._serialized_end = 8557 - _globals["_TYPINGSPEEDVALUE"]._serialized_start = 8559 - _globals["_TYPINGSPEEDVALUE"]._serialized_end = 8681 - _globals["_VOID"]._serialized_start = 40 - _globals["_VOID"]._serialized_end = 46 - _globals["_REQUEST_VOID"]._serialized_start = 48 - _globals["_REQUEST_VOID"]._serialized_end = 62 - _globals["_RESPONSE_VOID"]._serialized_start = 64 - _globals["_RESPONSE_VOID"]._serialized_end = 79 - _globals["_SIZE2"]._serialized_start = 81 - _globals["_SIZE2"]._serialized_end = 119 - _globals["_DELTA2"]._serialized_start = 121 - _globals["_DELTA2"]._serialized_end = 151 - _globals["_COORDINATE2"]._serialized_start = 153 - _globals["_COORDINATE2"]._serialized_end = 188 - _globals["_RECTANGLE"]._serialized_start = 190 - _globals["_RECTANGLE"]._serialized_end = 259 - _globals["_BITMAP"]._serialized_start = 261 - _globals["_BITMAP"]._serialized_end = 378 - _globals["_COLOR"]._serialized_start = 380 - _globals["_COLOR"]._serialized_end = 420 - _globals["_GUID"]._serialized_start = 422 - _globals["_GUID"]._serialized_end = 463 - _globals["_SESSIONINFO"]._serialized_start = 465 - _globals["_SESSIONINFO"]._serialized_end = 541 - _globals["_CAPTUREAREA"]._serialized_start = 543 - _globals["_CAPTUREAREA"]._serialized_end = 644 - _globals["_CAPTUREPARAMETERS"]._serialized_start = 647 - _globals["_CAPTUREPARAMETERS"]._serialized_end = 776 - _globals["_POLLEVENTPARAMETERS_ACTIONFINISHED"]._serialized_start = 778 - _globals["_POLLEVENTPARAMETERS_ACTIONFINISHED"]._serialized_end = 832 - _globals["_POLLEVENTPARAMETERS"]._serialized_start = 834 - _globals["_POLLEVENTPARAMETERS"]._serialized_end = 944 - _globals["_ACTIONPARAMETERS_WAIT"]._serialized_start = 946 - _globals["_ACTIONPARAMETERS_WAIT"]._serialized_end = 991 - _globals["_ACTIONPARAMETERS_MOUSEBUTTON_PRESS"]._serialized_start = 993 - _globals["_ACTIONPARAMETERS_MOUSEBUTTON_PRESS"]._serialized_end = 1080 - _globals["_ACTIONPARAMETERS_MOUSEBUTTON_RELEASE"]._serialized_start = 1082 - _globals["_ACTIONPARAMETERS_MOUSEBUTTON_RELEASE"]._serialized_end = 1171 - _globals["_ACTIONPARAMETERS_MOUSEBUTTON_PRESSANDRELEASE"]._serialized_start = 1173 - _globals["_ACTIONPARAMETERS_MOUSEBUTTON_PRESSANDRELEASE"]._serialized_end = 1285 - _globals["_ACTIONPARAMETERS_MOUSEWHEELSCROLL"]._serialized_start = 1288 - _globals["_ACTIONPARAMETERS_MOUSEWHEELSCROLL"]._serialized_end = 1480 - _globals["_ACTIONPARAMETERS_MOUSEMOVE"]._serialized_start = 1482 - _globals["_ACTIONPARAMETERS_MOUSEMOVE"]._serialized_end = 1602 - _globals["_ACTIONPARAMETERS_MOUSEMOVE_DELTA"]._serialized_start = 1604 - _globals["_ACTIONPARAMETERS_MOUSEMOVE_DELTA"]._serialized_end = 1722 - _globals["_ACTIONPARAMETERS_KEYBOARDKEY_PRESS"]._serialized_start = 1724 - _globals["_ACTIONPARAMETERS_KEYBOARDKEY_PRESS"]._serialized_end = 1803 - _globals["_ACTIONPARAMETERS_KEYBOARDKEY_RELEASE"]._serialized_start = 1805 - _globals["_ACTIONPARAMETERS_KEYBOARDKEY_RELEASE"]._serialized_end = 1886 - _globals["_ACTIONPARAMETERS_KEYBOARDKEY_PRESSANDRELEASE"]._serialized_start = 1888 - _globals["_ACTIONPARAMETERS_KEYBOARDKEY_PRESSANDRELEASE"]._serialized_end = 1977 - _globals["_ACTIONPARAMETERS_KEYBOARDKEYS_PRESS"]._serialized_start = 1979 - _globals["_ACTIONPARAMETERS_KEYBOARDKEYS_PRESS"]._serialized_end = 2060 - _globals["_ACTIONPARAMETERS_KEYBOARDKEYS_RELEASE"]._serialized_start = 2062 - _globals["_ACTIONPARAMETERS_KEYBOARDKEYS_RELEASE"]._serialized_end = 2145 - _globals["_ACTIONPARAMETERS_KEYBOARDKEYS_PRESSANDRELEASE"]._serialized_start = 2147 - _globals["_ACTIONPARAMETERS_KEYBOARDKEYS_PRESSANDRELEASE"]._serialized_end = 2238 - _globals["_ACTIONPARAMETERS_KEYBOARDTYPE_TEXT"]._serialized_start = 2241 - _globals["_ACTIONPARAMETERS_KEYBOARDTYPE_TEXT"]._serialized_end = 2394 - _globals["_ACTIONPARAMETERS_KEYBOARDTYPE_UNICODETEXT"]._serialized_start = 2397 - _globals["_ACTIONPARAMETERS_KEYBOARDTYPE_UNICODETEXT"]._serialized_end = 2557 - _globals["_ACTIONPARAMETERS_RUNCOMMAND"]._serialized_start = 2559 - _globals["_ACTIONPARAMETERS_RUNCOMMAND"]._serialized_end = 2667 - _globals["_ACTIONPARAMETERS"]._serialized_start = 2670 - _globals["_ACTIONPARAMETERS"]._serialized_end = 4067 - _globals["_REQUEST_STARTSESSION"]._serialized_start = 4069 - _globals["_REQUEST_STARTSESSION"]._serialized_end = 4140 - _globals["_RESPONSE_STARTSESSION"]._serialized_start = 4142 - _globals["_RESPONSE_STARTSESSION"]._serialized_end = 4216 - _globals["_REQUEST_ENDSESSION"]._serialized_start = 4218 - _globals["_REQUEST_ENDSESSION"]._serialized_end = 4289 - _globals["_REQUEST_POLL"]._serialized_start = 4291 - _globals["_REQUEST_POLL"]._serialized_end = 4407 - _globals["_REQUEST_STARTEXECUTION"]._serialized_start = 4409 - _globals["_REQUEST_STARTEXECUTION"]._serialized_end = 4484 - _globals["_REQUEST_STOPEXECUTION"]._serialized_start = 4486 - _globals["_REQUEST_STOPEXECUTION"]._serialized_end = 4560 - _globals["_RESPONSE_POLL"]._serialized_start = 4563 - _globals["_RESPONSE_POLL"]._serialized_end = 4696 - _globals["_REQUEST_RUNRECORDEDACTION"]._serialized_start = 4699 - _globals["_REQUEST_RUNRECORDEDACTION"]._serialized_end = 4893 - _globals["_RESPONSE_RUNRECORDEDACTION"]._serialized_start = 4895 - _globals["_RESPONSE_RUNRECORDEDACTION"]._serialized_end = 4971 - _globals["_REQUEST_SCHEDULEBATCHEDACTION"]._serialized_start = 4974 - _globals["_REQUEST_SCHEDULEBATCHEDACTION"]._serialized_end = 5172 - _globals["_RESPONSE_SCHEDULEBATCHEDACTION"]._serialized_start = 5174 - _globals["_RESPONSE_SCHEDULEBATCHEDACTION"]._serialized_end = 5224 - _globals["_REQUEST_GETACTIONCOUNT"]._serialized_start = 5226 - _globals["_REQUEST_GETACTIONCOUNT"]._serialized_end = 5301 - _globals["_RESPONSE_GETACTIONCOUNT"]._serialized_start = 5303 - _globals["_RESPONSE_GETACTIONCOUNT"]._serialized_end = 5349 - _globals["_REQUEST_GETACTION"]._serialized_start = 5351 - _globals["_REQUEST_GETACTION"]._serialized_end = 5442 - _globals["_RESPONSE_GETACTION"]._serialized_start = 5445 - _globals["_RESPONSE_GETACTION"]._serialized_end = 5599 - _globals["_REQUEST_REMOVEACTION"]._serialized_start = 5601 - _globals["_REQUEST_REMOVEACTION"]._serialized_end = 5692 - _globals["_REQUEST_REMOVEALLACTIONS"]._serialized_start = 5694 - _globals["_REQUEST_REMOVEALLACTIONS"]._serialized_end = 5771 - _globals["_REQUEST_STARTBATCHRUN"]._serialized_start = 5773 - _globals["_REQUEST_STARTBATCHRUN"]._serialized_end = 5847 - _globals["_REQUEST_STOPBATCHRUN"]._serialized_start = 5849 - _globals["_REQUEST_STOPBATCHRUN"]._serialized_end = 5922 - _globals["_REQUEST_CAPTURESCREEN"]._serialized_start = 5925 - _globals["_REQUEST_CAPTURESCREEN"]._serialized_end = 6089 - _globals["_RESPONSE_CAPTURESCREEN"]._serialized_start = 6091 - _globals["_RESPONSE_CAPTURESCREEN"]._serialized_end = 6156 - _globals["_RESPONSE_GETCONTINUOUSCAPTUREDSCREEN"]._serialized_start = 6158 - _globals["_RESPONSE_GETCONTINUOUSCAPTUREDSCREEN"]._serialized_end = 6237 - _globals["_REUQEST_SETTESTCONFIGURATION"]._serialized_start = 6240 - _globals["_REUQEST_SETTESTCONFIGURATION"]._serialized_end = 6462 - _globals["_REQUEST_SETMOUSEDELAY"]._serialized_start = 6464 - _globals["_REQUEST_SETMOUSEDELAY"]._serialized_end = 6567 - _globals["_REQUEST_SETKEYBOARDDELAY"]._serialized_start = 6569 - _globals["_REQUEST_SETKEYBOARDDELAY"]._serialized_end = 6675 - _globals["_DISPLAYINFORMATION"]._serialized_start = 6678 - _globals["_DISPLAYINFORMATION"]._serialized_end = 6837 - _globals["_RESPONSE_GETDISPLAYINFORMATION"]._serialized_start = 6840 - _globals["_RESPONSE_GETDISPLAYINFORMATION"]._serialized_end = 6987 - _globals["_RESPONSE_GETMOUSEPOSITION"]._serialized_start = 6989 - _globals["_RESPONSE_GETMOUSEPOSITION"]._serialized_end = 7038 - _globals["_REQUEST_SETACTIVEDISPLAY"]._serialized_start = 7040 - _globals["_REQUEST_SETACTIVEDISPLAY"]._serialized_end = 7085 - _globals["_REQUEST_GETCOLOR"]._serialized_start = 7087 - _globals["_REQUEST_GETCOLOR"]._serialized_end = 7168 - _globals["_RESPONSE_GETCOLOR"]._serialized_start = 7170 - _globals["_RESPONSE_GETCOLOR"]._serialized_end = 7228 - _globals["_REQUEST_GETPIXELCOLOR"]._serialized_start = 7230 - _globals["_REQUEST_GETPIXELCOLOR"]._serialized_end = 7275 - _globals["_RESPONSE_GETPIXELCOLOR"]._serialized_start = 7277 - _globals["_RESPONSE_GETPIXELCOLOR"]._serialized_end = 7340 - _globals["_REQUEST_SETDISPLAYLABEL"]._serialized_start = 7342 - _globals["_REQUEST_SETDISPLAYLABEL"]._serialized_end = 7452 - _globals["_CONTROLLERAPI"]._serialized_start = 8684 - _globals["_CONTROLLERAPI"]._serialized_end = 10905 -# @@protoc_insertion_point(module_scope) diff --git a/src/askui/tools/askui/askui_ui_controller_grpc/Controller_V1_pb2.pyi b/src/askui/tools/askui/askui_ui_controller_grpc/Controller_V1_pb2.pyi deleted file mode 100644 index 58bb9f9e..00000000 --- a/src/askui/tools/askui/askui_ui_controller_grpc/Controller_V1_pb2.pyi +++ /dev/null @@ -1,910 +0,0 @@ -from typing import ( - ClassVar as _ClassVar, -) -from typing import ( - Iterable as _Iterable, -) -from typing import ( - Mapping as _Mapping, -) -from typing import ( - Optional as _Optional, -) -from typing import ( - Union as _Union, -) - -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf.internal import containers as _containers -from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper - -DESCRIPTOR: _descriptor.FileDescriptor - -class PollEventID(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): - __slots__ = () - PollEventID_Undefined: _ClassVar[PollEventID] - PollEventID_ActionFinished: _ClassVar[PollEventID] - -class MouseButton(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): - __slots__ = () - MouseButton_Undefined: _ClassVar[MouseButton] - MouseButton_Left: _ClassVar[MouseButton] - MouseButton_Right: _ClassVar[MouseButton] - MouseButton_Middle: _ClassVar[MouseButton] - -class ActionClassID(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): - __slots__ = () - ActionClassID_Undefined: _ClassVar[ActionClassID] - ActionClassID_Wait: _ClassVar[ActionClassID] - ActionClassID_MouseButton_Press: _ClassVar[ActionClassID] - ActionClassID_MouseButton_Release: _ClassVar[ActionClassID] - ActionClassID_MouseButton_PressAndRelease: _ClassVar[ActionClassID] - ActionClassID_MouseWheelScroll: _ClassVar[ActionClassID] - ActionClassID_MouseMove: _ClassVar[ActionClassID] - ActionClassID_MouseMove_Delta: _ClassVar[ActionClassID] - ActionClassID_KeyboardKey_Press: _ClassVar[ActionClassID] - ActionClassID_KeyboardKey_Release: _ClassVar[ActionClassID] - ActionClassID_KeyboardKey_PressAndRelease: _ClassVar[ActionClassID] - ActionClassID_KeyboardKeys_Press: _ClassVar[ActionClassID] - ActionClassID_KeyboardKeys_Release: _ClassVar[ActionClassID] - ActionClassID_KeyboardKeys_PressAndRelease: _ClassVar[ActionClassID] - ActionClassID_KeyboardType_Text: _ClassVar[ActionClassID] - ActionClassID_KeyboardType_UnicodeText: _ClassVar[ActionClassID] - ActionClassID_RunCommand: _ClassVar[ActionClassID] - -class MouseWheelDeltaType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): - __slots__ = () - MouseWheelDelta_Undefined: _ClassVar[MouseWheelDeltaType] - MouseWheelDelta_Raw: _ClassVar[MouseWheelDeltaType] - MouseWheelDelta_Detent: _ClassVar[MouseWheelDeltaType] - -class MouseWheelScrollDirection(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): - __slots__ = () - MouseWheelScrollDirection_Undefined: _ClassVar[MouseWheelScrollDirection] - MouseWheelScrollDirection_Vertical: _ClassVar[MouseWheelScrollDirection] - MouseWheelScrollDirection_Horizontal: _ClassVar[MouseWheelScrollDirection] - -class TypingSpeedValue(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): - __slots__ = () - TypingSpeedValue_Undefined: _ClassVar[TypingSpeedValue] - TypingSpeedValue_CharactersPerSecond: _ClassVar[TypingSpeedValue] - TypingSpeedValue_Seconds: _ClassVar[TypingSpeedValue] - -PollEventID_Undefined: PollEventID -PollEventID_ActionFinished: PollEventID -MouseButton_Undefined: MouseButton -MouseButton_Left: MouseButton -MouseButton_Right: MouseButton -MouseButton_Middle: MouseButton -ActionClassID_Undefined: ActionClassID -ActionClassID_Wait: ActionClassID -ActionClassID_MouseButton_Press: ActionClassID -ActionClassID_MouseButton_Release: ActionClassID -ActionClassID_MouseButton_PressAndRelease: ActionClassID -ActionClassID_MouseWheelScroll: ActionClassID -ActionClassID_MouseMove: ActionClassID -ActionClassID_MouseMove_Delta: ActionClassID -ActionClassID_KeyboardKey_Press: ActionClassID -ActionClassID_KeyboardKey_Release: ActionClassID -ActionClassID_KeyboardKey_PressAndRelease: ActionClassID -ActionClassID_KeyboardKeys_Press: ActionClassID -ActionClassID_KeyboardKeys_Release: ActionClassID -ActionClassID_KeyboardKeys_PressAndRelease: ActionClassID -ActionClassID_KeyboardType_Text: ActionClassID -ActionClassID_KeyboardType_UnicodeText: ActionClassID -ActionClassID_RunCommand: ActionClassID -MouseWheelDelta_Undefined: MouseWheelDeltaType -MouseWheelDelta_Raw: MouseWheelDeltaType -MouseWheelDelta_Detent: MouseWheelDeltaType -MouseWheelScrollDirection_Undefined: MouseWheelScrollDirection -MouseWheelScrollDirection_Vertical: MouseWheelScrollDirection -MouseWheelScrollDirection_Horizontal: MouseWheelScrollDirection -TypingSpeedValue_Undefined: TypingSpeedValue -TypingSpeedValue_CharactersPerSecond: TypingSpeedValue -TypingSpeedValue_Seconds: TypingSpeedValue - -class Void(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class Request_Void(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class Response_Void(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class Size2(_message.Message): - __slots__ = ("width", "height") - WIDTH_FIELD_NUMBER: _ClassVar[int] - HEIGHT_FIELD_NUMBER: _ClassVar[int] - width: int - height: int - def __init__( - self, width: _Optional[int] = ..., height: _Optional[int] = ... - ) -> None: ... - -class Delta2(_message.Message): - __slots__ = ("x", "y") - X_FIELD_NUMBER: _ClassVar[int] - Y_FIELD_NUMBER: _ClassVar[int] - x: int - y: int - def __init__(self, x: _Optional[int] = ..., y: _Optional[int] = ...) -> None: ... - -class Coordinate2(_message.Message): - __slots__ = ("x", "y") - X_FIELD_NUMBER: _ClassVar[int] - Y_FIELD_NUMBER: _ClassVar[int] - x: int - y: int - def __init__(self, x: _Optional[int] = ..., y: _Optional[int] = ...) -> None: ... - -class Rectangle(_message.Message): - __slots__ = ("left", "top", "right", "bottom") - LEFT_FIELD_NUMBER: _ClassVar[int] - TOP_FIELD_NUMBER: _ClassVar[int] - RIGHT_FIELD_NUMBER: _ClassVar[int] - BOTTOM_FIELD_NUMBER: _ClassVar[int] - left: int - top: int - right: int - bottom: int - def __init__( - self, - left: _Optional[int] = ..., - top: _Optional[int] = ..., - right: _Optional[int] = ..., - bottom: _Optional[int] = ..., - ) -> None: ... - -class Bitmap(_message.Message): - __slots__ = ( - "width", - "height", - "lineWidth", - "bitsPerPixel", - "bytesPerPixel", - "data", - ) - WIDTH_FIELD_NUMBER: _ClassVar[int] - HEIGHT_FIELD_NUMBER: _ClassVar[int] - LINEWIDTH_FIELD_NUMBER: _ClassVar[int] - BITSPERPIXEL_FIELD_NUMBER: _ClassVar[int] - BYTESPERPIXEL_FIELD_NUMBER: _ClassVar[int] - DATA_FIELD_NUMBER: _ClassVar[int] - width: int - height: int - lineWidth: int - bitsPerPixel: int - bytesPerPixel: int - data: bytes - def __init__( - self, - width: _Optional[int] = ..., - height: _Optional[int] = ..., - lineWidth: _Optional[int] = ..., - bitsPerPixel: _Optional[int] = ..., - bytesPerPixel: _Optional[int] = ..., - data: _Optional[bytes] = ..., - ) -> None: ... - -class Color(_message.Message): - __slots__ = ("r", "g", "b") - R_FIELD_NUMBER: _ClassVar[int] - G_FIELD_NUMBER: _ClassVar[int] - B_FIELD_NUMBER: _ClassVar[int] - r: int - g: int - b: int - def __init__( - self, r: _Optional[int] = ..., g: _Optional[int] = ..., b: _Optional[int] = ... - ) -> None: ... - -class GUID(_message.Message): - __slots__ = ("highPart", "lowPart") - HIGHPART_FIELD_NUMBER: _ClassVar[int] - LOWPART_FIELD_NUMBER: _ClassVar[int] - highPart: int - lowPart: int - def __init__( - self, highPart: _Optional[int] = ..., lowPart: _Optional[int] = ... - ) -> None: ... - -class SessionInfo(_message.Message): - __slots__ = ("sessionGUID", "sessionID") - SESSIONGUID_FIELD_NUMBER: _ClassVar[int] - SESSIONID_FIELD_NUMBER: _ClassVar[int] - sessionGUID: GUID - sessionID: int - def __init__( - self, - sessionGUID: _Optional[_Union[GUID, _Mapping]] = ..., - sessionID: _Optional[int] = ..., - ) -> None: ... - -class CaptureArea(_message.Message): - __slots__ = ("size", "coordinate") - SIZE_FIELD_NUMBER: _ClassVar[int] - COORDINATE_FIELD_NUMBER: _ClassVar[int] - size: Size2 - coordinate: Coordinate2 - def __init__( - self, - size: _Optional[_Union[Size2, _Mapping]] = ..., - coordinate: _Optional[_Union[Coordinate2, _Mapping]] = ..., - ) -> None: ... - -class CaptureParameters(_message.Message): - __slots__ = ("displayID", "captureArea") - DISPLAYID_FIELD_NUMBER: _ClassVar[int] - CAPTUREAREA_FIELD_NUMBER: _ClassVar[int] - displayID: int - captureArea: CaptureArea - def __init__( - self, - displayID: _Optional[int] = ..., - captureArea: _Optional[_Union[CaptureArea, _Mapping]] = ..., - ) -> None: ... - -class PollEventParameters_ActionFinished(_message.Message): - __slots__ = ("actionID",) - ACTIONID_FIELD_NUMBER: _ClassVar[int] - actionID: int - def __init__(self, actionID: _Optional[int] = ...) -> None: ... - -class PollEventParameters(_message.Message): - __slots__ = ("actionFinished",) - ACTIONFINISHED_FIELD_NUMBER: _ClassVar[int] - actionFinished: PollEventParameters_ActionFinished - def __init__( - self, - actionFinished: _Optional[ - _Union[PollEventParameters_ActionFinished, _Mapping] - ] = ..., - ) -> None: ... - -class ActionParameters_Wait(_message.Message): - __slots__ = ("milliseconds",) - MILLISECONDS_FIELD_NUMBER: _ClassVar[int] - milliseconds: int - def __init__(self, milliseconds: _Optional[int] = ...) -> None: ... - -class ActionParameters_MouseButton_Press(_message.Message): - __slots__ = ("mouseButton",) - MOUSEBUTTON_FIELD_NUMBER: _ClassVar[int] - mouseButton: MouseButton - def __init__( - self, mouseButton: _Optional[_Union[MouseButton, str]] = ... - ) -> None: ... - -class ActionParameters_MouseButton_Release(_message.Message): - __slots__ = ("mouseButton",) - MOUSEBUTTON_FIELD_NUMBER: _ClassVar[int] - mouseButton: MouseButton - def __init__( - self, mouseButton: _Optional[_Union[MouseButton, str]] = ... - ) -> None: ... - -class ActionParameters_MouseButton_PressAndRelease(_message.Message): - __slots__ = ("mouseButton", "count") - MOUSEBUTTON_FIELD_NUMBER: _ClassVar[int] - COUNT_FIELD_NUMBER: _ClassVar[int] - mouseButton: MouseButton - count: int - def __init__( - self, - mouseButton: _Optional[_Union[MouseButton, str]] = ..., - count: _Optional[int] = ..., - ) -> None: ... - -class ActionParameters_MouseWheelScroll(_message.Message): - __slots__ = ("direction", "deltaType", "delta", "milliseconds") - DIRECTION_FIELD_NUMBER: _ClassVar[int] - DELTATYPE_FIELD_NUMBER: _ClassVar[int] - DELTA_FIELD_NUMBER: _ClassVar[int] - MILLISECONDS_FIELD_NUMBER: _ClassVar[int] - direction: MouseWheelScrollDirection - deltaType: MouseWheelDeltaType - delta: int - milliseconds: int - def __init__( - self, - direction: _Optional[_Union[MouseWheelScrollDirection, str]] = ..., - deltaType: _Optional[_Union[MouseWheelDeltaType, str]] = ..., - delta: _Optional[int] = ..., - milliseconds: _Optional[int] = ..., - ) -> None: ... - -class ActionParameters_MouseMove(_message.Message): - __slots__ = ("position", "milliseconds") - POSITION_FIELD_NUMBER: _ClassVar[int] - MILLISECONDS_FIELD_NUMBER: _ClassVar[int] - position: Coordinate2 - milliseconds: int - def __init__( - self, - position: _Optional[_Union[Coordinate2, _Mapping]] = ..., - milliseconds: _Optional[int] = ..., - ) -> None: ... - -class ActionParameters_MouseMove_Delta(_message.Message): - __slots__ = ("delta", "milliseconds") - DELTA_FIELD_NUMBER: _ClassVar[int] - MILLISECONDS_FIELD_NUMBER: _ClassVar[int] - delta: Delta2 - milliseconds: int - def __init__( - self, - delta: _Optional[_Union[Delta2, _Mapping]] = ..., - milliseconds: _Optional[int] = ..., - ) -> None: ... - -class ActionParameters_KeyboardKey_Press(_message.Message): - __slots__ = ("keyName", "modifierKeyNames") - KEYNAME_FIELD_NUMBER: _ClassVar[int] - MODIFIERKEYNAMES_FIELD_NUMBER: _ClassVar[int] - keyName: str - modifierKeyNames: _containers.RepeatedScalarFieldContainer[str] - def __init__( - self, - keyName: _Optional[str] = ..., - modifierKeyNames: _Optional[_Iterable[str]] = ..., - ) -> None: ... - -class ActionParameters_KeyboardKey_Release(_message.Message): - __slots__ = ("keyName", "modifierKeyNames") - KEYNAME_FIELD_NUMBER: _ClassVar[int] - MODIFIERKEYNAMES_FIELD_NUMBER: _ClassVar[int] - keyName: str - modifierKeyNames: _containers.RepeatedScalarFieldContainer[str] - def __init__( - self, - keyName: _Optional[str] = ..., - modifierKeyNames: _Optional[_Iterable[str]] = ..., - ) -> None: ... - -class ActionParameters_KeyboardKey_PressAndRelease(_message.Message): - __slots__ = ("keyName", "modifierKeyNames") - KEYNAME_FIELD_NUMBER: _ClassVar[int] - MODIFIERKEYNAMES_FIELD_NUMBER: _ClassVar[int] - keyName: str - modifierKeyNames: _containers.RepeatedScalarFieldContainer[str] - def __init__( - self, - keyName: _Optional[str] = ..., - modifierKeyNames: _Optional[_Iterable[str]] = ..., - ) -> None: ... - -class ActionParameters_KeyboardKeys_Press(_message.Message): - __slots__ = ("keyNames", "modifierKeyNames") - KEYNAMES_FIELD_NUMBER: _ClassVar[int] - MODIFIERKEYNAMES_FIELD_NUMBER: _ClassVar[int] - keyNames: _containers.RepeatedScalarFieldContainer[str] - modifierKeyNames: _containers.RepeatedScalarFieldContainer[str] - def __init__( - self, - keyNames: _Optional[_Iterable[str]] = ..., - modifierKeyNames: _Optional[_Iterable[str]] = ..., - ) -> None: ... - -class ActionParameters_KeyboardKeys_Release(_message.Message): - __slots__ = ("keyNames", "modifierKeyNames") - KEYNAMES_FIELD_NUMBER: _ClassVar[int] - MODIFIERKEYNAMES_FIELD_NUMBER: _ClassVar[int] - keyNames: _containers.RepeatedScalarFieldContainer[str] - modifierKeyNames: _containers.RepeatedScalarFieldContainer[str] - def __init__( - self, - keyNames: _Optional[_Iterable[str]] = ..., - modifierKeyNames: _Optional[_Iterable[str]] = ..., - ) -> None: ... - -class ActionParameters_KeyboardKeys_PressAndRelease(_message.Message): - __slots__ = ("keyNames", "modifierKeyNames") - KEYNAMES_FIELD_NUMBER: _ClassVar[int] - MODIFIERKEYNAMES_FIELD_NUMBER: _ClassVar[int] - keyNames: _containers.RepeatedScalarFieldContainer[str] - modifierKeyNames: _containers.RepeatedScalarFieldContainer[str] - def __init__( - self, - keyNames: _Optional[_Iterable[str]] = ..., - modifierKeyNames: _Optional[_Iterable[str]] = ..., - ) -> None: ... - -class ActionParameters_KeyboardType_Text(_message.Message): - __slots__ = ("text", "typingSpeedValue", "typingSpeed") - TEXT_FIELD_NUMBER: _ClassVar[int] - TYPINGSPEEDVALUE_FIELD_NUMBER: _ClassVar[int] - TYPINGSPEED_FIELD_NUMBER: _ClassVar[int] - text: str - typingSpeedValue: TypingSpeedValue - typingSpeed: int - def __init__( - self, - text: _Optional[str] = ..., - typingSpeedValue: _Optional[_Union[TypingSpeedValue, str]] = ..., - typingSpeed: _Optional[int] = ..., - ) -> None: ... - -class ActionParameters_KeyboardType_UnicodeText(_message.Message): - __slots__ = ("text", "typingSpeedValue", "typingSpeed") - TEXT_FIELD_NUMBER: _ClassVar[int] - TYPINGSPEEDVALUE_FIELD_NUMBER: _ClassVar[int] - TYPINGSPEED_FIELD_NUMBER: _ClassVar[int] - text: bytes - typingSpeedValue: TypingSpeedValue - typingSpeed: int - def __init__( - self, - text: _Optional[bytes] = ..., - typingSpeedValue: _Optional[_Union[TypingSpeedValue, str]] = ..., - typingSpeed: _Optional[int] = ..., - ) -> None: ... - -class ActionParameters_RunCommand(_message.Message): - __slots__ = ("command", "timeoutInMilliseconds") - COMMAND_FIELD_NUMBER: _ClassVar[int] - TIMEOUTINMILLISECONDS_FIELD_NUMBER: _ClassVar[int] - command: str - timeoutInMilliseconds: int - def __init__( - self, command: _Optional[str] = ..., timeoutInMilliseconds: _Optional[int] = ... - ) -> None: ... - -class ActionParameters(_message.Message): - __slots__ = ( - "none", - "wait", - "mouseButtonPress", - "mouseButtonRelease", - "mouseButtonPressAndRelease", - "mouseWheelScroll", - "mouseMove", - "mouseMoveDelta", - "keyboardKeyPress", - "keyboardKeyRelease", - "keyboardKeyPressAndRelease", - "keyboardKeysPress", - "keyboardKeysRelease", - "keyboardKeysPressAndRelease", - "keyboardTypeText", - "keyboardTypeUnicodeText", - "runcommand", - ) - NONE_FIELD_NUMBER: _ClassVar[int] - WAIT_FIELD_NUMBER: _ClassVar[int] - MOUSEBUTTONPRESS_FIELD_NUMBER: _ClassVar[int] - MOUSEBUTTONRELEASE_FIELD_NUMBER: _ClassVar[int] - MOUSEBUTTONPRESSANDRELEASE_FIELD_NUMBER: _ClassVar[int] - MOUSEWHEELSCROLL_FIELD_NUMBER: _ClassVar[int] - MOUSEMOVE_FIELD_NUMBER: _ClassVar[int] - MOUSEMOVEDELTA_FIELD_NUMBER: _ClassVar[int] - KEYBOARDKEYPRESS_FIELD_NUMBER: _ClassVar[int] - KEYBOARDKEYRELEASE_FIELD_NUMBER: _ClassVar[int] - KEYBOARDKEYPRESSANDRELEASE_FIELD_NUMBER: _ClassVar[int] - KEYBOARDKEYSPRESS_FIELD_NUMBER: _ClassVar[int] - KEYBOARDKEYSRELEASE_FIELD_NUMBER: _ClassVar[int] - KEYBOARDKEYSPRESSANDRELEASE_FIELD_NUMBER: _ClassVar[int] - KEYBOARDTYPETEXT_FIELD_NUMBER: _ClassVar[int] - KEYBOARDTYPEUNICODETEXT_FIELD_NUMBER: _ClassVar[int] - RUNCOMMAND_FIELD_NUMBER: _ClassVar[int] - none: Void - wait: ActionParameters_Wait - mouseButtonPress: ActionParameters_MouseButton_Press - mouseButtonRelease: ActionParameters_MouseButton_Release - mouseButtonPressAndRelease: ActionParameters_MouseButton_PressAndRelease - mouseWheelScroll: ActionParameters_MouseWheelScroll - mouseMove: ActionParameters_MouseMove - mouseMoveDelta: ActionParameters_MouseMove_Delta - keyboardKeyPress: ActionParameters_KeyboardKey_Press - keyboardKeyRelease: ActionParameters_KeyboardKey_Release - keyboardKeyPressAndRelease: ActionParameters_KeyboardKey_PressAndRelease - keyboardKeysPress: ActionParameters_KeyboardKeys_Press - keyboardKeysRelease: ActionParameters_KeyboardKeys_Release - keyboardKeysPressAndRelease: ActionParameters_KeyboardKeys_PressAndRelease - keyboardTypeText: ActionParameters_KeyboardType_Text - keyboardTypeUnicodeText: ActionParameters_KeyboardType_UnicodeText - runcommand: ActionParameters_RunCommand - def __init__( - self, - none: _Optional[_Union[Void, _Mapping]] = ..., - wait: _Optional[_Union[ActionParameters_Wait, _Mapping]] = ..., - mouseButtonPress: _Optional[ - _Union[ActionParameters_MouseButton_Press, _Mapping] - ] = ..., - mouseButtonRelease: _Optional[ - _Union[ActionParameters_MouseButton_Release, _Mapping] - ] = ..., - mouseButtonPressAndRelease: _Optional[ - _Union[ActionParameters_MouseButton_PressAndRelease, _Mapping] - ] = ..., - mouseWheelScroll: _Optional[ - _Union[ActionParameters_MouseWheelScroll, _Mapping] - ] = ..., - mouseMove: _Optional[_Union[ActionParameters_MouseMove, _Mapping]] = ..., - mouseMoveDelta: _Optional[ - _Union[ActionParameters_MouseMove_Delta, _Mapping] - ] = ..., - keyboardKeyPress: _Optional[ - _Union[ActionParameters_KeyboardKey_Press, _Mapping] - ] = ..., - keyboardKeyRelease: _Optional[ - _Union[ActionParameters_KeyboardKey_Release, _Mapping] - ] = ..., - keyboardKeyPressAndRelease: _Optional[ - _Union[ActionParameters_KeyboardKey_PressAndRelease, _Mapping] - ] = ..., - keyboardKeysPress: _Optional[ - _Union[ActionParameters_KeyboardKeys_Press, _Mapping] - ] = ..., - keyboardKeysRelease: _Optional[ - _Union[ActionParameters_KeyboardKeys_Release, _Mapping] - ] = ..., - keyboardKeysPressAndRelease: _Optional[ - _Union[ActionParameters_KeyboardKeys_PressAndRelease, _Mapping] - ] = ..., - keyboardTypeText: _Optional[ - _Union[ActionParameters_KeyboardType_Text, _Mapping] - ] = ..., - keyboardTypeUnicodeText: _Optional[ - _Union[ActionParameters_KeyboardType_UnicodeText, _Mapping] - ] = ..., - runcommand: _Optional[_Union[ActionParameters_RunCommand, _Mapping]] = ..., - ) -> None: ... - -class Request_StartSession(_message.Message): - __slots__ = ("sessionGUID", "immediateExecution") - SESSIONGUID_FIELD_NUMBER: _ClassVar[int] - IMMEDIATEEXECUTION_FIELD_NUMBER: _ClassVar[int] - sessionGUID: str - immediateExecution: bool - def __init__( - self, sessionGUID: _Optional[str] = ..., immediateExecution: bool = ... - ) -> None: ... - -class Response_StartSession(_message.Message): - __slots__ = ("sessionInfo",) - SESSIONINFO_FIELD_NUMBER: _ClassVar[int] - sessionInfo: SessionInfo - def __init__( - self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ... - ) -> None: ... - -class Request_EndSession(_message.Message): - __slots__ = ("sessionInfo",) - SESSIONINFO_FIELD_NUMBER: _ClassVar[int] - sessionInfo: SessionInfo - def __init__( - self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ... - ) -> None: ... - -class Request_Poll(_message.Message): - __slots__ = ("sessionInfo", "pollEventID") - SESSIONINFO_FIELD_NUMBER: _ClassVar[int] - POLLEVENTID_FIELD_NUMBER: _ClassVar[int] - sessionInfo: SessionInfo - pollEventID: PollEventID - def __init__( - self, - sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ..., - pollEventID: _Optional[_Union[PollEventID, str]] = ..., - ) -> None: ... - -class Request_StartExecution(_message.Message): - __slots__ = ("sessionInfo",) - SESSIONINFO_FIELD_NUMBER: _ClassVar[int] - sessionInfo: SessionInfo - def __init__( - self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ... - ) -> None: ... - -class Request_StopExecution(_message.Message): - __slots__ = ("sessionInfo",) - SESSIONINFO_FIELD_NUMBER: _ClassVar[int] - sessionInfo: SessionInfo - def __init__( - self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ... - ) -> None: ... - -class Response_Poll(_message.Message): - __slots__ = ("pollEventID", "pollEventParameters") - POLLEVENTID_FIELD_NUMBER: _ClassVar[int] - POLLEVENTPARAMETERS_FIELD_NUMBER: _ClassVar[int] - pollEventID: PollEventID - pollEventParameters: PollEventParameters - def __init__( - self, - pollEventID: _Optional[_Union[PollEventID, str]] = ..., - pollEventParameters: _Optional[_Union[PollEventParameters, _Mapping]] = ..., - ) -> None: ... - -class Request_RunRecordedAction(_message.Message): - __slots__ = ("sessionInfo", "actionClassID", "actionParameters") - SESSIONINFO_FIELD_NUMBER: _ClassVar[int] - ACTIONCLASSID_FIELD_NUMBER: _ClassVar[int] - ACTIONPARAMETERS_FIELD_NUMBER: _ClassVar[int] - sessionInfo: SessionInfo - actionClassID: ActionClassID - actionParameters: ActionParameters - def __init__( - self, - sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ..., - actionClassID: _Optional[_Union[ActionClassID, str]] = ..., - actionParameters: _Optional[_Union[ActionParameters, _Mapping]] = ..., - ) -> None: ... - -class Response_RunRecordedAction(_message.Message): - __slots__ = ("actionID", "requiredMilliseconds") - ACTIONID_FIELD_NUMBER: _ClassVar[int] - REQUIREDMILLISECONDS_FIELD_NUMBER: _ClassVar[int] - actionID: int - requiredMilliseconds: int - def __init__( - self, actionID: _Optional[int] = ..., requiredMilliseconds: _Optional[int] = ... - ) -> None: ... - -class Request_ScheduleBatchedAction(_message.Message): - __slots__ = ("sessionInfo", "actionClassID", "actionParameters") - SESSIONINFO_FIELD_NUMBER: _ClassVar[int] - ACTIONCLASSID_FIELD_NUMBER: _ClassVar[int] - ACTIONPARAMETERS_FIELD_NUMBER: _ClassVar[int] - sessionInfo: SessionInfo - actionClassID: ActionClassID - actionParameters: ActionParameters - def __init__( - self, - sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ..., - actionClassID: _Optional[_Union[ActionClassID, str]] = ..., - actionParameters: _Optional[_Union[ActionParameters, _Mapping]] = ..., - ) -> None: ... - -class Response_ScheduleBatchedAction(_message.Message): - __slots__ = ("actionID",) - ACTIONID_FIELD_NUMBER: _ClassVar[int] - actionID: int - def __init__(self, actionID: _Optional[int] = ...) -> None: ... - -class Request_GetActionCount(_message.Message): - __slots__ = ("sessionInfo",) - SESSIONINFO_FIELD_NUMBER: _ClassVar[int] - sessionInfo: SessionInfo - def __init__( - self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ... - ) -> None: ... - -class Response_GetActionCount(_message.Message): - __slots__ = ("actionCount",) - ACTIONCOUNT_FIELD_NUMBER: _ClassVar[int] - actionCount: int - def __init__(self, actionCount: _Optional[int] = ...) -> None: ... - -class Request_GetAction(_message.Message): - __slots__ = ("sessionInfo", "actionIndex") - SESSIONINFO_FIELD_NUMBER: _ClassVar[int] - ACTIONINDEX_FIELD_NUMBER: _ClassVar[int] - sessionInfo: SessionInfo - actionIndex: int - def __init__( - self, - sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ..., - actionIndex: _Optional[int] = ..., - ) -> None: ... - -class Response_GetAction(_message.Message): - __slots__ = ("actionID", "actionClassID", "actionParameters") - ACTIONID_FIELD_NUMBER: _ClassVar[int] - ACTIONCLASSID_FIELD_NUMBER: _ClassVar[int] - ACTIONPARAMETERS_FIELD_NUMBER: _ClassVar[int] - actionID: int - actionClassID: ActionClassID - actionParameters: ActionParameters - def __init__( - self, - actionID: _Optional[int] = ..., - actionClassID: _Optional[_Union[ActionClassID, str]] = ..., - actionParameters: _Optional[_Union[ActionParameters, _Mapping]] = ..., - ) -> None: ... - -class Request_RemoveAction(_message.Message): - __slots__ = ("sessionInfo", "actionID") - SESSIONINFO_FIELD_NUMBER: _ClassVar[int] - ACTIONID_FIELD_NUMBER: _ClassVar[int] - sessionInfo: SessionInfo - actionID: int - def __init__( - self, - sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ..., - actionID: _Optional[int] = ..., - ) -> None: ... - -class Request_RemoveAllActions(_message.Message): - __slots__ = ("sessionInfo",) - SESSIONINFO_FIELD_NUMBER: _ClassVar[int] - sessionInfo: SessionInfo - def __init__( - self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ... - ) -> None: ... - -class Request_StartBatchRun(_message.Message): - __slots__ = ("sessionInfo",) - SESSIONINFO_FIELD_NUMBER: _ClassVar[int] - sessionInfo: SessionInfo - def __init__( - self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ... - ) -> None: ... - -class Request_StopBatchRun(_message.Message): - __slots__ = ("sessionInfo",) - SESSIONINFO_FIELD_NUMBER: _ClassVar[int] - sessionInfo: SessionInfo - def __init__( - self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ... - ) -> None: ... - -class Request_CaptureScreen(_message.Message): - __slots__ = ("sessionInfo", "captureParameters") - SESSIONINFO_FIELD_NUMBER: _ClassVar[int] - CAPTUREPARAMETERS_FIELD_NUMBER: _ClassVar[int] - sessionInfo: SessionInfo - captureParameters: CaptureParameters - def __init__( - self, - sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ..., - captureParameters: _Optional[_Union[CaptureParameters, _Mapping]] = ..., - ) -> None: ... - -class Response_CaptureScreen(_message.Message): - __slots__ = ("bitmap",) - BITMAP_FIELD_NUMBER: _ClassVar[int] - bitmap: Bitmap - def __init__(self, bitmap: _Optional[_Union[Bitmap, _Mapping]] = ...) -> None: ... - -class Response_GetContinuousCapturedScreen(_message.Message): - __slots__ = ("bitmap",) - BITMAP_FIELD_NUMBER: _ClassVar[int] - bitmap: Bitmap - def __init__(self, bitmap: _Optional[_Union[Bitmap, _Mapping]] = ...) -> None: ... - -class Reuqest_SetTestConfiguration(_message.Message): - __slots__ = ( - "sessionInfo", - "defaultCaptureParameters", - "mouseDelayInMilliseconds", - "keyboardDelayInMilliseconds", - ) - SESSIONINFO_FIELD_NUMBER: _ClassVar[int] - DEFAULTCAPTUREPARAMETERS_FIELD_NUMBER: _ClassVar[int] - MOUSEDELAYINMILLISECONDS_FIELD_NUMBER: _ClassVar[int] - KEYBOARDDELAYINMILLISECONDS_FIELD_NUMBER: _ClassVar[int] - sessionInfo: SessionInfo - defaultCaptureParameters: CaptureParameters - mouseDelayInMilliseconds: int - keyboardDelayInMilliseconds: int - def __init__( - self, - sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ..., - defaultCaptureParameters: _Optional[_Union[CaptureParameters, _Mapping]] = ..., - mouseDelayInMilliseconds: _Optional[int] = ..., - keyboardDelayInMilliseconds: _Optional[int] = ..., - ) -> None: ... - -class Request_SetMouseDelay(_message.Message): - __slots__ = ("sessionInfo", "delayInMilliseconds") - SESSIONINFO_FIELD_NUMBER: _ClassVar[int] - DELAYINMILLISECONDS_FIELD_NUMBER: _ClassVar[int] - sessionInfo: SessionInfo - delayInMilliseconds: int - def __init__( - self, - sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ..., - delayInMilliseconds: _Optional[int] = ..., - ) -> None: ... - -class Request_SetKeyboardDelay(_message.Message): - __slots__ = ("sessionInfo", "delayInMilliseconds") - SESSIONINFO_FIELD_NUMBER: _ClassVar[int] - DELAYINMILLISECONDS_FIELD_NUMBER: _ClassVar[int] - sessionInfo: SessionInfo - delayInMilliseconds: int - def __init__( - self, - sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ..., - delayInMilliseconds: _Optional[int] = ..., - ) -> None: ... - -class DisplayInformation(_message.Message): - __slots__ = ("displayID", "name", "sizeInPixels", "virtualScreenRectangle") - DISPLAYID_FIELD_NUMBER: _ClassVar[int] - NAME_FIELD_NUMBER: _ClassVar[int] - SIZEINPIXELS_FIELD_NUMBER: _ClassVar[int] - VIRTUALSCREENRECTANGLE_FIELD_NUMBER: _ClassVar[int] - displayID: int - name: str - sizeInPixels: Size2 - virtualScreenRectangle: Rectangle - def __init__( - self, - displayID: _Optional[int] = ..., - name: _Optional[str] = ..., - sizeInPixels: _Optional[_Union[Size2, _Mapping]] = ..., - virtualScreenRectangle: _Optional[_Union[Rectangle, _Mapping]] = ..., - ) -> None: ... - -class Response_GetDisplayInformation(_message.Message): - __slots__ = ("displays", "virtualScreenRectangle") - DISPLAYS_FIELD_NUMBER: _ClassVar[int] - VIRTUALSCREENRECTANGLE_FIELD_NUMBER: _ClassVar[int] - displays: _containers.RepeatedCompositeFieldContainer[DisplayInformation] - virtualScreenRectangle: Rectangle - def __init__( - self, - displays: _Optional[_Iterable[_Union[DisplayInformation, _Mapping]]] = ..., - virtualScreenRectangle: _Optional[_Union[Rectangle, _Mapping]] = ..., - ) -> None: ... - -class Response_GetMousePosition(_message.Message): - __slots__ = ("x", "y") - X_FIELD_NUMBER: _ClassVar[int] - Y_FIELD_NUMBER: _ClassVar[int] - x: int - y: int - def __init__(self, x: _Optional[int] = ..., y: _Optional[int] = ...) -> None: ... - -class Request_SetActiveDisplay(_message.Message): - __slots__ = ("displayID",) - DISPLAYID_FIELD_NUMBER: _ClassVar[int] - displayID: int - def __init__(self, displayID: _Optional[int] = ...) -> None: ... - -class Request_GetColor(_message.Message): - __slots__ = ("x", "y", "bitmap") - X_FIELD_NUMBER: _ClassVar[int] - Y_FIELD_NUMBER: _ClassVar[int] - BITMAP_FIELD_NUMBER: _ClassVar[int] - x: int - y: int - bitmap: Bitmap - def __init__( - self, - x: _Optional[int] = ..., - y: _Optional[int] = ..., - bitmap: _Optional[_Union[Bitmap, _Mapping]] = ..., - ) -> None: ... - -class Response_GetColor(_message.Message): - __slots__ = ("color",) - COLOR_FIELD_NUMBER: _ClassVar[int] - color: Color - def __init__(self, color: _Optional[_Union[Color, _Mapping]] = ...) -> None: ... - -class Request_GetPixelColor(_message.Message): - __slots__ = ("x", "y") - X_FIELD_NUMBER: _ClassVar[int] - Y_FIELD_NUMBER: _ClassVar[int] - x: int - y: int - def __init__(self, x: _Optional[int] = ..., y: _Optional[int] = ...) -> None: ... - -class Response_GetPixelColor(_message.Message): - __slots__ = ("color",) - COLOR_FIELD_NUMBER: _ClassVar[int] - color: Color - def __init__(self, color: _Optional[_Union[Color, _Mapping]] = ...) -> None: ... - -class Request_SetDisplayLabel(_message.Message): - __slots__ = ("sessionInfo", "displayID", "label") - SESSIONINFO_FIELD_NUMBER: _ClassVar[int] - DISPLAYID_FIELD_NUMBER: _ClassVar[int] - LABEL_FIELD_NUMBER: _ClassVar[int] - sessionInfo: SessionInfo - displayID: int - label: str - def __init__( - self, - sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ..., - displayID: _Optional[int] = ..., - label: _Optional[str] = ..., - ) -> None: ... diff --git a/src/askui/tools/askui/askui_ui_controller_grpc/Controller_V1_pb2_grpc.py b/src/askui/tools/askui/askui_ui_controller_grpc/Controller_V1_pb2_grpc.py deleted file mode 100644 index ecac6ac1..00000000 --- a/src/askui/tools/askui/askui_ui_controller_grpc/Controller_V1_pb2_grpc.py +++ /dev/null @@ -1,1148 +0,0 @@ -# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! -"""Client and server classes corresponding to protobuf-defined services.""" - -import warnings - -import grpc - -import askui.tools.askui.askui_ui_controller_grpc.Controller_V1_pb2 as Controller__V1__pb2 - -GRPC_GENERATED_VERSION = "1.64.1" -GRPC_VERSION = grpc.__version__ -EXPECTED_ERROR_RELEASE = "1.65.0" -SCHEDULED_RELEASE_DATE = "June 25, 2024" -_version_not_supported = False - -try: - from grpc._utilities import first_version_is_lower - - _version_not_supported = first_version_is_lower( - GRPC_VERSION, GRPC_GENERATED_VERSION - ) -except ImportError: - _version_not_supported = True - -if _version_not_supported: - warnings.warn( - f"The grpc package installed is at version {GRPC_VERSION}," - + " but the generated code in Controller_V1_pb2_grpc.py depends on" - + f" grpcio>={GRPC_GENERATED_VERSION}." - + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" - + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." - + f" This warning will become an error in {EXPECTED_ERROR_RELEASE}," - + f" scheduled for release on {SCHEDULED_RELEASE_DATE}.", - RuntimeWarning, - ) - - -class ControllerAPIStub(object): - """Missing associated documentation comment in .proto file.""" - - def __init__(self, channel): - """Constructor. - - Args: - channel: A grpc.Channel. - """ - self.StartSession = channel.unary_unary( - "/Askui.API.TDKv1.ControllerAPI/StartSession", - request_serializer=Controller__V1__pb2.Request_StartSession.SerializeToString, - response_deserializer=Controller__V1__pb2.Response_StartSession.FromString, - _registered_method=True, - ) - self.EndSession = channel.unary_unary( - "/Askui.API.TDKv1.ControllerAPI/EndSession", - request_serializer=Controller__V1__pb2.Request_EndSession.SerializeToString, - response_deserializer=Controller__V1__pb2.Response_Void.FromString, - _registered_method=True, - ) - self.Poll = channel.unary_unary( - "/Askui.API.TDKv1.ControllerAPI/Poll", - request_serializer=Controller__V1__pb2.Request_Poll.SerializeToString, - response_deserializer=Controller__V1__pb2.Response_Poll.FromString, - _registered_method=True, - ) - self.StartExecution = channel.unary_unary( - "/Askui.API.TDKv1.ControllerAPI/StartExecution", - request_serializer=Controller__V1__pb2.Request_StartExecution.SerializeToString, - response_deserializer=Controller__V1__pb2.Response_Void.FromString, - _registered_method=True, - ) - self.StopExecution = channel.unary_unary( - "/Askui.API.TDKv1.ControllerAPI/StopExecution", - request_serializer=Controller__V1__pb2.Request_StopExecution.SerializeToString, - response_deserializer=Controller__V1__pb2.Response_Void.FromString, - _registered_method=True, - ) - self.RunRecordedAction = channel.unary_unary( - "/Askui.API.TDKv1.ControllerAPI/RunRecordedAction", - request_serializer=Controller__V1__pb2.Request_RunRecordedAction.SerializeToString, - response_deserializer=Controller__V1__pb2.Response_RunRecordedAction.FromString, - _registered_method=True, - ) - self.ScheduleBatchedAction = channel.unary_unary( - "/Askui.API.TDKv1.ControllerAPI/ScheduleBatchedAction", - request_serializer=Controller__V1__pb2.Request_ScheduleBatchedAction.SerializeToString, - response_deserializer=Controller__V1__pb2.Response_ScheduleBatchedAction.FromString, - _registered_method=True, - ) - self.StartBatchRun = channel.unary_unary( - "/Askui.API.TDKv1.ControllerAPI/StartBatchRun", - request_serializer=Controller__V1__pb2.Request_StartBatchRun.SerializeToString, - response_deserializer=Controller__V1__pb2.Response_Void.FromString, - _registered_method=True, - ) - self.StopBatchRun = channel.unary_unary( - "/Askui.API.TDKv1.ControllerAPI/StopBatchRun", - request_serializer=Controller__V1__pb2.Request_StopBatchRun.SerializeToString, - response_deserializer=Controller__V1__pb2.Response_Void.FromString, - _registered_method=True, - ) - self.GetActionCount = channel.unary_unary( - "/Askui.API.TDKv1.ControllerAPI/GetActionCount", - request_serializer=Controller__V1__pb2.Request_GetActionCount.SerializeToString, - response_deserializer=Controller__V1__pb2.Response_GetActionCount.FromString, - _registered_method=True, - ) - self.GetAction = channel.unary_unary( - "/Askui.API.TDKv1.ControllerAPI/GetAction", - request_serializer=Controller__V1__pb2.Request_GetAction.SerializeToString, - response_deserializer=Controller__V1__pb2.Response_GetAction.FromString, - _registered_method=True, - ) - self.RemoveAction = channel.unary_unary( - "/Askui.API.TDKv1.ControllerAPI/RemoveAction", - request_serializer=Controller__V1__pb2.Request_RemoveAction.SerializeToString, - response_deserializer=Controller__V1__pb2.Response_Void.FromString, - _registered_method=True, - ) - self.RemoveAllActions = channel.unary_unary( - "/Askui.API.TDKv1.ControllerAPI/RemoveAllActions", - request_serializer=Controller__V1__pb2.Request_RemoveAllActions.SerializeToString, - response_deserializer=Controller__V1__pb2.Response_Void.FromString, - _registered_method=True, - ) - self.CaptureScreen = channel.unary_unary( - "/Askui.API.TDKv1.ControllerAPI/CaptureScreen", - request_serializer=Controller__V1__pb2.Request_CaptureScreen.SerializeToString, - response_deserializer=Controller__V1__pb2.Response_CaptureScreen.FromString, - _registered_method=True, - ) - self.SetTestConfiguration = channel.unary_unary( - "/Askui.API.TDKv1.ControllerAPI/SetTestConfiguration", - request_serializer=Controller__V1__pb2.Reuqest_SetTestConfiguration.SerializeToString, - response_deserializer=Controller__V1__pb2.Response_Void.FromString, - _registered_method=True, - ) - self.SetMouseDelay = channel.unary_unary( - "/Askui.API.TDKv1.ControllerAPI/SetMouseDelay", - request_serializer=Controller__V1__pb2.Request_SetMouseDelay.SerializeToString, - response_deserializer=Controller__V1__pb2.Response_Void.FromString, - _registered_method=True, - ) - self.SetKeyboardDelay = channel.unary_unary( - "/Askui.API.TDKv1.ControllerAPI/SetKeyboardDelay", - request_serializer=Controller__V1__pb2.Request_SetKeyboardDelay.SerializeToString, - response_deserializer=Controller__V1__pb2.Response_Void.FromString, - _registered_method=True, - ) - self.GetDisplayInformation = channel.unary_unary( - "/Askui.API.TDKv1.ControllerAPI/GetDisplayInformation", - request_serializer=Controller__V1__pb2.Request_Void.SerializeToString, - response_deserializer=Controller__V1__pb2.Response_GetDisplayInformation.FromString, - _registered_method=True, - ) - self.GetMousePosition = channel.unary_unary( - "/Askui.API.TDKv1.ControllerAPI/GetMousePosition", - request_serializer=Controller__V1__pb2.Request_Void.SerializeToString, - response_deserializer=Controller__V1__pb2.Response_GetMousePosition.FromString, - _registered_method=True, - ) - self.SetActiveDisplay = channel.unary_unary( - "/Askui.API.TDKv1.ControllerAPI/SetActiveDisplay", - request_serializer=Controller__V1__pb2.Request_SetActiveDisplay.SerializeToString, - response_deserializer=Controller__V1__pb2.Response_Void.FromString, - _registered_method=True, - ) - self.GetColor = channel.unary_unary( - "/Askui.API.TDKv1.ControllerAPI/GetColor", - request_serializer=Controller__V1__pb2.Request_GetColor.SerializeToString, - response_deserializer=Controller__V1__pb2.Response_GetColor.FromString, - _registered_method=True, - ) - self.GetPixelColor = channel.unary_unary( - "/Askui.API.TDKv1.ControllerAPI/GetPixelColor", - request_serializer=Controller__V1__pb2.Request_GetPixelColor.SerializeToString, - response_deserializer=Controller__V1__pb2.Response_GetPixelColor.FromString, - _registered_method=True, - ) - self.SetDisplayLabel = channel.unary_unary( - "/Askui.API.TDKv1.ControllerAPI/SetDisplayLabel", - request_serializer=Controller__V1__pb2.Request_SetDisplayLabel.SerializeToString, - response_deserializer=Controller__V1__pb2.Response_Void.FromString, - _registered_method=True, - ) - - -class ControllerAPIServicer(object): - """Missing associated documentation comment in .proto file.""" - - def StartSession(self, request, context): - """General""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def EndSession(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def Poll(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def StartExecution(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def StopExecution(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def RunRecordedAction(self, request, context): - """Run action and record it""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def ScheduleBatchedAction(self, request, context): - """Schedule an action""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def StartBatchRun(self, request, context): - """Start and stop batched execution""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def StopBatchRun(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def GetActionCount(self, request, context): - """Recorded or batched actions access""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def GetAction(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def RemoveAction(self, request, context): - """Modify acvtions batch""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def RemoveAllActions(self, request, context): - """Clear all batched or recorded actions""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def CaptureScreen(self, request, context): - """Capturing""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def SetTestConfiguration(self, request, context): - """Configuration""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def SetMouseDelay(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def SetKeyboardDelay(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def GetDisplayInformation(self, request, context): - """Device Information""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def GetMousePosition(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def SetActiveDisplay(self, request, context): - """Device Configuration""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def GetColor(self, request, context): - """Deprecated Utilities""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def GetPixelColor(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def SetDisplayLabel(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - -def add_ControllerAPIServicer_to_server(servicer, server): - rpc_method_handlers = { - "StartSession": grpc.unary_unary_rpc_method_handler( - servicer.StartSession, - request_deserializer=Controller__V1__pb2.Request_StartSession.FromString, - response_serializer=Controller__V1__pb2.Response_StartSession.SerializeToString, - ), - "EndSession": grpc.unary_unary_rpc_method_handler( - servicer.EndSession, - request_deserializer=Controller__V1__pb2.Request_EndSession.FromString, - response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, - ), - "Poll": grpc.unary_unary_rpc_method_handler( - servicer.Poll, - request_deserializer=Controller__V1__pb2.Request_Poll.FromString, - response_serializer=Controller__V1__pb2.Response_Poll.SerializeToString, - ), - "StartExecution": grpc.unary_unary_rpc_method_handler( - servicer.StartExecution, - request_deserializer=Controller__V1__pb2.Request_StartExecution.FromString, - response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, - ), - "StopExecution": grpc.unary_unary_rpc_method_handler( - servicer.StopExecution, - request_deserializer=Controller__V1__pb2.Request_StopExecution.FromString, - response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, - ), - "RunRecordedAction": grpc.unary_unary_rpc_method_handler( - servicer.RunRecordedAction, - request_deserializer=Controller__V1__pb2.Request_RunRecordedAction.FromString, - response_serializer=Controller__V1__pb2.Response_RunRecordedAction.SerializeToString, - ), - "ScheduleBatchedAction": grpc.unary_unary_rpc_method_handler( - servicer.ScheduleBatchedAction, - request_deserializer=Controller__V1__pb2.Request_ScheduleBatchedAction.FromString, - response_serializer=Controller__V1__pb2.Response_ScheduleBatchedAction.SerializeToString, - ), - "StartBatchRun": grpc.unary_unary_rpc_method_handler( - servicer.StartBatchRun, - request_deserializer=Controller__V1__pb2.Request_StartBatchRun.FromString, - response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, - ), - "StopBatchRun": grpc.unary_unary_rpc_method_handler( - servicer.StopBatchRun, - request_deserializer=Controller__V1__pb2.Request_StopBatchRun.FromString, - response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, - ), - "GetActionCount": grpc.unary_unary_rpc_method_handler( - servicer.GetActionCount, - request_deserializer=Controller__V1__pb2.Request_GetActionCount.FromString, - response_serializer=Controller__V1__pb2.Response_GetActionCount.SerializeToString, - ), - "GetAction": grpc.unary_unary_rpc_method_handler( - servicer.GetAction, - request_deserializer=Controller__V1__pb2.Request_GetAction.FromString, - response_serializer=Controller__V1__pb2.Response_GetAction.SerializeToString, - ), - "RemoveAction": grpc.unary_unary_rpc_method_handler( - servicer.RemoveAction, - request_deserializer=Controller__V1__pb2.Request_RemoveAction.FromString, - response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, - ), - "RemoveAllActions": grpc.unary_unary_rpc_method_handler( - servicer.RemoveAllActions, - request_deserializer=Controller__V1__pb2.Request_RemoveAllActions.FromString, - response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, - ), - "CaptureScreen": grpc.unary_unary_rpc_method_handler( - servicer.CaptureScreen, - request_deserializer=Controller__V1__pb2.Request_CaptureScreen.FromString, - response_serializer=Controller__V1__pb2.Response_CaptureScreen.SerializeToString, - ), - "SetTestConfiguration": grpc.unary_unary_rpc_method_handler( - servicer.SetTestConfiguration, - request_deserializer=Controller__V1__pb2.Reuqest_SetTestConfiguration.FromString, - response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, - ), - "SetMouseDelay": grpc.unary_unary_rpc_method_handler( - servicer.SetMouseDelay, - request_deserializer=Controller__V1__pb2.Request_SetMouseDelay.FromString, - response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, - ), - "SetKeyboardDelay": grpc.unary_unary_rpc_method_handler( - servicer.SetKeyboardDelay, - request_deserializer=Controller__V1__pb2.Request_SetKeyboardDelay.FromString, - response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, - ), - "GetDisplayInformation": grpc.unary_unary_rpc_method_handler( - servicer.GetDisplayInformation, - request_deserializer=Controller__V1__pb2.Request_Void.FromString, - response_serializer=Controller__V1__pb2.Response_GetDisplayInformation.SerializeToString, - ), - "GetMousePosition": grpc.unary_unary_rpc_method_handler( - servicer.GetMousePosition, - request_deserializer=Controller__V1__pb2.Request_Void.FromString, - response_serializer=Controller__V1__pb2.Response_GetMousePosition.SerializeToString, - ), - "SetActiveDisplay": grpc.unary_unary_rpc_method_handler( - servicer.SetActiveDisplay, - request_deserializer=Controller__V1__pb2.Request_SetActiveDisplay.FromString, - response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, - ), - "GetColor": grpc.unary_unary_rpc_method_handler( - servicer.GetColor, - request_deserializer=Controller__V1__pb2.Request_GetColor.FromString, - response_serializer=Controller__V1__pb2.Response_GetColor.SerializeToString, - ), - "GetPixelColor": grpc.unary_unary_rpc_method_handler( - servicer.GetPixelColor, - request_deserializer=Controller__V1__pb2.Request_GetPixelColor.FromString, - response_serializer=Controller__V1__pb2.Response_GetPixelColor.SerializeToString, - ), - "SetDisplayLabel": grpc.unary_unary_rpc_method_handler( - servicer.SetDisplayLabel, - request_deserializer=Controller__V1__pb2.Request_SetDisplayLabel.FromString, - response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, - ), - } - generic_handler = grpc.method_handlers_generic_handler( - "Askui.API.TDKv1.ControllerAPI", rpc_method_handlers - ) - server.add_generic_rpc_handlers((generic_handler,)) - server.add_registered_method_handlers( - "Askui.API.TDKv1.ControllerAPI", rpc_method_handlers - ) - - -# This class is part of an EXPERIMENTAL API. -class ControllerAPI(object): - """Missing associated documentation comment in .proto file.""" - - @staticmethod - def StartSession( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/Askui.API.TDKv1.ControllerAPI/StartSession", - Controller__V1__pb2.Request_StartSession.SerializeToString, - Controller__V1__pb2.Response_StartSession.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - _registered_method=True, - ) - - @staticmethod - def EndSession( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/Askui.API.TDKv1.ControllerAPI/EndSession", - Controller__V1__pb2.Request_EndSession.SerializeToString, - Controller__V1__pb2.Response_Void.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - _registered_method=True, - ) - - @staticmethod - def Poll( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/Askui.API.TDKv1.ControllerAPI/Poll", - Controller__V1__pb2.Request_Poll.SerializeToString, - Controller__V1__pb2.Response_Poll.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - _registered_method=True, - ) - - @staticmethod - def StartExecution( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/Askui.API.TDKv1.ControllerAPI/StartExecution", - Controller__V1__pb2.Request_StartExecution.SerializeToString, - Controller__V1__pb2.Response_Void.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - _registered_method=True, - ) - - @staticmethod - def StopExecution( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/Askui.API.TDKv1.ControllerAPI/StopExecution", - Controller__V1__pb2.Request_StopExecution.SerializeToString, - Controller__V1__pb2.Response_Void.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - _registered_method=True, - ) - - @staticmethod - def RunRecordedAction( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/Askui.API.TDKv1.ControllerAPI/RunRecordedAction", - Controller__V1__pb2.Request_RunRecordedAction.SerializeToString, - Controller__V1__pb2.Response_RunRecordedAction.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - _registered_method=True, - ) - - @staticmethod - def ScheduleBatchedAction( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/Askui.API.TDKv1.ControllerAPI/ScheduleBatchedAction", - Controller__V1__pb2.Request_ScheduleBatchedAction.SerializeToString, - Controller__V1__pb2.Response_ScheduleBatchedAction.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - _registered_method=True, - ) - - @staticmethod - def StartBatchRun( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/Askui.API.TDKv1.ControllerAPI/StartBatchRun", - Controller__V1__pb2.Request_StartBatchRun.SerializeToString, - Controller__V1__pb2.Response_Void.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - _registered_method=True, - ) - - @staticmethod - def StopBatchRun( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/Askui.API.TDKv1.ControllerAPI/StopBatchRun", - Controller__V1__pb2.Request_StopBatchRun.SerializeToString, - Controller__V1__pb2.Response_Void.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - _registered_method=True, - ) - - @staticmethod - def GetActionCount( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/Askui.API.TDKv1.ControllerAPI/GetActionCount", - Controller__V1__pb2.Request_GetActionCount.SerializeToString, - Controller__V1__pb2.Response_GetActionCount.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - _registered_method=True, - ) - - @staticmethod - def GetAction( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/Askui.API.TDKv1.ControllerAPI/GetAction", - Controller__V1__pb2.Request_GetAction.SerializeToString, - Controller__V1__pb2.Response_GetAction.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - _registered_method=True, - ) - - @staticmethod - def RemoveAction( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/Askui.API.TDKv1.ControllerAPI/RemoveAction", - Controller__V1__pb2.Request_RemoveAction.SerializeToString, - Controller__V1__pb2.Response_Void.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - _registered_method=True, - ) - - @staticmethod - def RemoveAllActions( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/Askui.API.TDKv1.ControllerAPI/RemoveAllActions", - Controller__V1__pb2.Request_RemoveAllActions.SerializeToString, - Controller__V1__pb2.Response_Void.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - _registered_method=True, - ) - - @staticmethod - def CaptureScreen( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/Askui.API.TDKv1.ControllerAPI/CaptureScreen", - Controller__V1__pb2.Request_CaptureScreen.SerializeToString, - Controller__V1__pb2.Response_CaptureScreen.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - _registered_method=True, - ) - - @staticmethod - def SetTestConfiguration( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/Askui.API.TDKv1.ControllerAPI/SetTestConfiguration", - Controller__V1__pb2.Reuqest_SetTestConfiguration.SerializeToString, - Controller__V1__pb2.Response_Void.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - _registered_method=True, - ) - - @staticmethod - def SetMouseDelay( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/Askui.API.TDKv1.ControllerAPI/SetMouseDelay", - Controller__V1__pb2.Request_SetMouseDelay.SerializeToString, - Controller__V1__pb2.Response_Void.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - _registered_method=True, - ) - - @staticmethod - def SetKeyboardDelay( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/Askui.API.TDKv1.ControllerAPI/SetKeyboardDelay", - Controller__V1__pb2.Request_SetKeyboardDelay.SerializeToString, - Controller__V1__pb2.Response_Void.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - _registered_method=True, - ) - - @staticmethod - def GetDisplayInformation( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/Askui.API.TDKv1.ControllerAPI/GetDisplayInformation", - Controller__V1__pb2.Request_Void.SerializeToString, - Controller__V1__pb2.Response_GetDisplayInformation.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - _registered_method=True, - ) - - @staticmethod - def GetMousePosition( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/Askui.API.TDKv1.ControllerAPI/GetMousePosition", - Controller__V1__pb2.Request_Void.SerializeToString, - Controller__V1__pb2.Response_GetMousePosition.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - _registered_method=True, - ) - - @staticmethod - def SetActiveDisplay( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/Askui.API.TDKv1.ControllerAPI/SetActiveDisplay", - Controller__V1__pb2.Request_SetActiveDisplay.SerializeToString, - Controller__V1__pb2.Response_Void.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - _registered_method=True, - ) - - @staticmethod - def GetColor( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/Askui.API.TDKv1.ControllerAPI/GetColor", - Controller__V1__pb2.Request_GetColor.SerializeToString, - Controller__V1__pb2.Response_GetColor.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - _registered_method=True, - ) - - @staticmethod - def GetPixelColor( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/Askui.API.TDKv1.ControllerAPI/GetPixelColor", - Controller__V1__pb2.Request_GetPixelColor.SerializeToString, - Controller__V1__pb2.Response_GetPixelColor.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - _registered_method=True, - ) - - @staticmethod - def SetDisplayLabel( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/Askui.API.TDKv1.ControllerAPI/SetDisplayLabel", - Controller__V1__pb2.Request_SetDisplayLabel.SerializeToString, - Controller__V1__pb2.Response_Void.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - _registered_method=True, - ) From b75c67ead2901173a111ffba8476e3a3f14b6b88 Mon Sep 17 00:00:00 2001 From: onur-askui <210008309+onur-askui@users.noreply.github.com> Date: Fri, 11 Jul 2025 16:37:11 +0200 Subject: [PATCH 02/21] feat: update proto file --- .../proto/Controller_V1.proto | 539 ++++++++++++++++++ 1 file changed, 539 insertions(+) create mode 100644 src/askui/tools/askui/askui_ui_controller_grpc/proto/Controller_V1.proto diff --git a/src/askui/tools/askui/askui_ui_controller_grpc/proto/Controller_V1.proto b/src/askui/tools/askui/askui_ui_controller_grpc/proto/Controller_V1.proto new file mode 100644 index 00000000..e8adc62a --- /dev/null +++ b/src/askui/tools/askui/askui_ui_controller_grpc/proto/Controller_V1.proto @@ -0,0 +1,539 @@ +syntax = "proto3"; + +package Askui.API.TDKv1; + +service ControllerAPI { + // General + rpc StartSession (Request_StartSession) returns (Response_StartSession) {} + rpc EndSession (Request_EndSession) returns (Response_Void) {} + + rpc Send (Request_Send) returns (Response_Send) {} + rpc Poll (Request_Poll) returns (Response_Poll) {} + + rpc StartExecution (Request_StartExecution) returns (Response_Void) {} + rpc StopExecution (Request_StopExecution) returns (Response_Void) {} + + // Run action and record it + rpc RunRecordedAction (Request_RunRecordedAction) returns (Response_RunRecordedAction) {} + + // Schedule an action + rpc ScheduleBatchedAction (Request_ScheduleBatchedAction) returns (Response_ScheduleBatchedAction) {} + + // Start and stop batched execution + rpc StartBatchRun (Request_StartBatchRun) returns (Response_Void) {} + rpc StopBatchRun(Request_StopBatchRun) returns (Response_Void) {} + + // Recorded or batched actions access + rpc GetActionCount (Request_GetActionCount) returns (Response_GetActionCount) {} + rpc GetAction (Request_GetAction) returns (Response_GetAction) {} + + // Modify actions batch + rpc RemoveAction (Request_RemoveAction) returns (Response_Void) {} + + // Clear all batched or recorded actions + rpc RemoveAllActions (Request_RemoveAllActions) returns (Response_Void) {} + + // Capturing + rpc CaptureScreen (Request_CaptureScreen) returns (Response_CaptureScreen) {} + + // Configuration + rpc SetTestConfiguration (Reuqest_SetTestConfiguration) returns (Response_Void) {} + rpc SetMouseDelay (Request_SetMouseDelay) returns (Response_Void) {} // TODO: TDKv2 should use push and pop instead. + rpc SetKeyboardDelay (Request_SetKeyboardDelay) returns (Response_Void) {} // TODO: TDKv2 should use push and pop instead. + + // Device Information + rpc GetDisplayInformation (Request_Void) returns (Response_GetDisplayInformation) {} + rpc GetMousePosition (Request_Void) returns (Response_GetMousePosition) {} + rpc GetProcessList (Request_GetProcessList) returns (Response_GetProcessList) {} + rpc GetWindowList (Request_GetWindowList) returns (Response_GetWindowList) {} + rpc GetAutomationTargetList (Request_Void) returns (Response_GetAutomationTargetList) {} + + // Device Configuration + rpc SetActiveDisplay (Request_SetActiveDisplay) returns (Response_Void) {} + rpc SetActiveWindow (Request_SetActiveWindow) returns (Response_Void) {} + rpc SetActiveAutomationTarget (Request_SetActiveAutomationTarget) returns (Response_Void) {} + + // Deprecated Utilities + rpc GetColor (Request_GetColor) returns (Response_GetColor) {} + rpc GetPixelColor (Request_GetPixelColor) returns (Response_GetPixelColor) {} + + rpc SetDisplayLabel(Request_SetDisplayLabel) returns (Response_Void) {} // TODO: Not yet implemented, supposded to be deleted if not needed. +} + +message Void {} + +message Request_Void {} +message Response_Void {} + +message Size2 { + uint32 width = 1; + uint32 height = 2; +} + +message Delta2 { + int32 x = 1; + int32 y = 2; +} + +message Coordinate2 { + int32 x = 1; + int32 y = 2; +} + +message Rectangle { + int32 left = 1; + int32 top = 2; + int32 right = 3; + int32 bottom = 4; +} + +message Bitmap { + uint32 width = 1; + uint32 height = 2; + uint32 lineWidth = 3; + uint32 bitsPerPixel = 4; + uint32 bytesPerPixel = 5; + bytes data = 6; +} + +message Color { + uint32 r = 1; + uint32 g = 2; + uint32 b = 3; +} + +message GUID { + uint64 highPart = 1; + uint64 lowPart = 2; +} + +message SessionInfo { + GUID sessionGUID = 1; + uint64 sessionID = 2; +} + +message CaptureArea { + Size2 size = 3; + Coordinate2 coordinate = 2; +} + +// Usage +// +// displayID: +// Value from 'DisplayInformation::displayID', use '0' if screenshots shall be taked from virtual sreen. +// +// captureArea: +// Defines either the area to capture on virtual screen or of the display if 'displayID'. +message CaptureParameters { + optional uint32 displayID = 1; + optional CaptureArea captureArea = 2; +} + +// +// Poll +enum PollEventID { + reserved 1; + + PollEventID_Undefined = 0; + //Any = 1; + PollEventID_ActionFinished = 2; +} + +message PollEventParameters_ActionFinished { + uint32 actionID = 1; +} + +message PollEventParameters { + oneof dataOf { + PollEventParameters_ActionFinished actionFinished = 1; + } +} + +// +// +enum MouseButton { + MouseButton_Undefined = 0; + + MouseButton_Left = 1; + MouseButton_Right = 2; + MouseButton_Middle = 3; +} + +// +// Action Parameters +enum ActionClassID { + ActionClassID_Undefined = 0; + + ActionClassID_Wait = 1; + + ActionClassID_MouseButton_Press = 8; + ActionClassID_MouseButton_Release = 9; + ActionClassID_MouseButton_PressAndRelease = 10; + ActionClassID_MouseWheelScroll = 11; + ActionClassID_MouseMove = 12; + ActionClassID_MouseMove_Delta = 13; + + ActionClassID_KeyboardKey_Press = 14; + ActionClassID_KeyboardKey_Release = 15; + ActionClassID_KeyboardKey_PressAndRelease = 16; + ActionClassID_KeyboardKeys_Press = 17; + ActionClassID_KeyboardKeys_Release = 18; + ActionClassID_KeyboardKeys_PressAndRelease = 19; + + ActionClassID_KeyboardType_Text = 20; + ActionClassID_KeyboardType_UnicodeText = 21; + + ActionClassID_RunCommand = 22; +} + +message ActionParameters_Wait { + uint32 milliseconds = 1; +} + +message ActionParameters_MouseButton_Press { + MouseButton mouseButton = 1; +} + +message ActionParameters_MouseButton_Release { + MouseButton mouseButton = 1; +} + +message ActionParameters_MouseButton_PressAndRelease { + MouseButton mouseButton = 1; + uint32 count = 2; +} + +enum MouseWheelDeltaType { + MouseWheelDelta_Undefined = 0; + MouseWheelDelta_Raw = 1; + MouseWheelDelta_Detent = 2; +} + +enum MouseWheelScrollDirection { + MouseWheelScrollDirection_Undefined = 0; + MouseWheelScrollDirection_Vertical = 1; + MouseWheelScrollDirection_Horizontal = 2; +} + +message ActionParameters_MouseWheelScroll { + MouseWheelScrollDirection direction = 1; + MouseWheelDeltaType deltaType = 2; + int32 delta = 3; + int32 milliseconds = 4; +} + +message ActionParameters_MouseMove { + Coordinate2 position = 1; + optional uint32 milliseconds = 2; +} + +message ActionParameters_MouseMove_Delta { + Delta2 delta = 1; + optional uint32 milliseconds = 2; +} + +message ActionParameters_KeyboardKey_Press { + string keyName = 1; + repeated string modifierKeyNames = 2; +} + +message ActionParameters_KeyboardKey_Release { + string keyName = 1; + repeated string modifierKeyNames = 2; +} + +message ActionParameters_KeyboardKey_PressAndRelease { + string keyName = 1; + repeated string modifierKeyNames = 2; +} + +message ActionParameters_KeyboardKeys_Press { + repeated string keyNames = 1; + repeated string modifierKeyNames = 2; +} + +message ActionParameters_KeyboardKeys_Release { + repeated string keyNames = 1; + repeated string modifierKeyNames = 2; +} + +message ActionParameters_KeyboardKeys_PressAndRelease { + repeated string keyNames = 1; + repeated string modifierKeyNames = 2; +} + +enum TypingSpeedValue { + TypingSpeedValue_Undefined = 0; + TypingSpeedValue_CharactersPerSecond = 1; + TypingSpeedValue_Seconds = 2; +} + +message ActionParameters_KeyboardType_Text { + string text = 1; + TypingSpeedValue typingSpeedValue = 2; + optional uint32 typingSpeed = 3; +} + +message ActionParameters_KeyboardType_UnicodeText { + bytes text = 1; + TypingSpeedValue typingSpeedValue = 2; + optional uint32 typingSpeed = 3; +} + +message ActionParameters_RunCommand { + string command = 1; + optional uint32 timeoutInMilliseconds = 2; +} + +message ActionParameters { + oneof dataOf { + Void none = 1; + ActionParameters_Wait wait = 2; + ActionParameters_MouseButton_Press mouseButtonPress = 3; + ActionParameters_MouseButton_Release mouseButtonRelease = 4; + ActionParameters_MouseButton_PressAndRelease mouseButtonPressAndRelease = 5; + ActionParameters_MouseWheelScroll mouseWheelScroll = 6; + ActionParameters_MouseMove mouseMove = 7; + ActionParameters_MouseMove_Delta mouseMoveDelta = 8; + ActionParameters_KeyboardKey_Press keyboardKeyPress = 9; + ActionParameters_KeyboardKey_Release keyboardKeyRelease = 10; + ActionParameters_KeyboardKey_PressAndRelease keyboardKeyPressAndRelease = 11; + ActionParameters_KeyboardKeys_Press keyboardKeysPress = 12; + ActionParameters_KeyboardKeys_Release keyboardKeysRelease = 13; + ActionParameters_KeyboardKeys_PressAndRelease keyboardKeysPressAndRelease = 14; + ActionParameters_KeyboardType_Text keyboardTypeText = 15; + ActionParameters_KeyboardType_UnicodeText keyboardTypeUnicodeText = 16; + ActionParameters_RunCommand runcommand = 17; + } +} + +// +// Request and Response Messages +message Request_StartSession { + string sessionGUID = 1; // "{62F7CE3F-D73B-4F96-826F-43D767DAB5C1}" + bool immediateExecution = 2; // true +} + +message Response_StartSession { + SessionInfo sessionInfo = 1; +} + +message Request_EndSession { + SessionInfo sessionInfo = 1; +} + +message Request_Send { + string message = 1; +} + +message Request_Poll { + SessionInfo sessionInfo = 1; + PollEventID pollEventID = 2; +} + +message Request_StartExecution { + SessionInfo sessionInfo = 1; +} + +message Request_StopExecution { + SessionInfo sessionInfo = 1; +} + +message Response_Send { + string message = 1; +} + +message Response_Poll { + PollEventID pollEventID = 1; + PollEventParameters pollEventParameters = 2; +} + +message Request_RunRecordedAction { + SessionInfo sessionInfo = 1; + ActionClassID actionClassID = 2; + ActionParameters actionParameters = 3; +} + +message Response_RunRecordedAction { + uint32 actionID = 1; + uint32 requiredMilliseconds = 2; +} + +message Request_ScheduleBatchedAction { + SessionInfo sessionInfo = 1; + ActionClassID actionClassID = 2; + ActionParameters actionParameters = 3; +} + +message Response_ScheduleBatchedAction { + uint32 actionID = 1; +} + +message Request_GetActionCount { + SessionInfo sessionInfo = 1; +} + +message Response_GetActionCount { + uint32 actionCount = 1; +} + +message Request_GetAction { + SessionInfo sessionInfo = 1; + uint32 actionIndex = 2; +} + +message Response_GetAction { + uint32 actionID = 1; + ActionClassID actionClassID = 2; + ActionParameters actionParameters = 3; +} + +message Request_RemoveAction { + SessionInfo sessionInfo = 1; + uint32 actionID = 2; +} + +message Request_RemoveAllActions { + SessionInfo sessionInfo = 1; +} + +message Request_StartBatchRun { + SessionInfo sessionInfo = 1; +} + +message Request_StopBatchRun { + SessionInfo sessionInfo = 1; +} + +message Request_CaptureScreen { + SessionInfo sessionInfo = 1; + optional CaptureParameters captureParameters = 2; +} + +message Response_CaptureScreen { + Bitmap bitmap = 1; +} + +message Response_GetContinuousCapturedScreen { + Bitmap bitmap = 1; +} + +message Reuqest_SetTestConfiguration { + SessionInfo sessionInfo = 1; + CaptureParameters defaultCaptureParameters = 2; + uint32 mouseDelayInMilliseconds = 3; + uint32 keyboardDelayInMilliseconds = 4; +} + +message Request_SetMouseDelay { + SessionInfo sessionInfo = 1; + uint32 delayInMilliseconds = 2; +} + +message Request_SetKeyboardDelay { + SessionInfo sessionInfo = 1; + uint32 delayInMilliseconds = 2; +} + +message DisplayInformation { + uint32 displayID = 1; + string name = 2; + Size2 sizeInPixels = 3; + Rectangle virtualScreenRectangle = 4; +} + +message Response_GetDisplayInformation { + repeated DisplayInformation displays = 1; + Rectangle virtualScreenRectangle = 2; +} + +message Response_GetMousePosition { + int32 x = 1; + int32 y = 2; +} + +message ProcessInfoExtended { + bool hasWindow = 1; +} + +message ProcessInfo { + uint64 ID = 1; + string name = 2; + optional ProcessInfoExtended extendedInfo = 3; +} + +message Request_GetProcessList { + bool getExtendedInfo = 1; +} + +message Response_GetProcessList { + repeated ProcessInfo processes = 1; +} + +message Request_GetWindowList { + uint64 processID = 1; +} + +message WindowInfo { + uint64 ID = 1; + string name = 2; +} + +message Response_GetWindowList { + repeated WindowInfo windows = 1; +} + +message Request_SetActiveDisplay { + uint32 displayID = 1; +} + +message Request_SetActiveWindow { + uint64 processID = 1; + uint64 windowID = 2; +} + +enum AutomationTargetType { + AutomationTarget_Local = 0; + AutomationTarget_Background = 1; + AutomationTarget_Companion = 2; +} + +message AutomationTarget { + uint64 ID = 1; + AutomationTargetType type = 2; + string name = 3; + bool active = 4; +} + +message Response_GetAutomationTargetList { + repeated AutomationTarget targets = 1; +} + +message Request_SetActiveAutomationTarget { + uint64 ID = 1; +} + +message Request_GetColor { + int32 x = 1; + int32 y = 2; + Bitmap bitmap = 3; +} + +message Response_GetColor { + Color color = 1; +} + +message Request_GetPixelColor { + int32 x = 1; + int32 y = 2; +} + +message Response_GetPixelColor { + Color color = 1; +} + +message Request_SetDisplayLabel { + SessionInfo sessionInfo = 1; + uint32 displayID = 2; + string label = 3; +} From 2329387e32924949868e762a4bddaa9ba108e937 Mon Sep 17 00:00:00 2001 From: onur-askui <210008309+onur-askui@users.noreply.github.com> Date: Fri, 11 Jul 2025 16:37:56 +0200 Subject: [PATCH 03/21] feat: introduce codegen and update references --- pyproject.toml | 2 + src/askui/tools/askui/askui_controller.py | 4 +- .../generated/Controller_V1_pb2.py | 208 +++ .../generated/Controller_V1_pb2.pyi | 736 +++++++++ .../generated/Controller_V1_pb2_grpc.py | 1313 +++++++++++++++++ .../askui/askui_ui_controller_grpc/readme.md | 19 + 6 files changed, 2280 insertions(+), 2 deletions(-) create mode 100644 src/askui/tools/askui/askui_ui_controller_grpc/generated/Controller_V1_pb2.py create mode 100644 src/askui/tools/askui/askui_ui_controller_grpc/generated/Controller_V1_pb2.pyi create mode 100644 src/askui/tools/askui/askui_ui_controller_grpc/generated/Controller_V1_pb2_grpc.py create mode 100644 src/askui/tools/askui/askui_ui_controller_grpc/readme.md diff --git a/pyproject.toml b/pyproject.toml index 9b1b5663..4327686f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,6 +56,8 @@ typecheck = "mypy" "typecheck:all" = "mypy src tests" "chat:api" = "uvicorn askui.chat.api.app:app --reload --port 9261" "mcp:dev" = "mcp dev src/askui/mcp/__init__.py" +"grpc:gen" = "python -m grpc_tools.protoc -I src/askui/tools/askui/askui_ui_controller_grpc/proto --python_out=src/askui/tools/askui/askui_ui_controller_grpc/generated --pyi_out=src/askui/tools/askui/askui_ui_controller_grpc/generated --grpc_python_out=src/askui/tools/askui/askui_ui_controller_grpc/generated src/askui/tools/askui/askui_ui_controller_grpc/proto/Controller_V1.proto" +"grpc:fix-import" = "bash -c \"sed -i.bak 's/^import Controller_V1_pb2 as Controller__V1__pb2$/from . import Controller_V1_pb2 as Controller__V1__pb2/' src/askui/tools/askui/askui_ui_controller_grpc/generated/Controller_V1_pb2_grpc.py && rm src/askui/tools/askui/askui_ui_controller_grpc/generated/Controller_V1_pb2_grpc.py.bak\"" [dependency-groups] test = [ diff --git a/src/askui/tools/askui/askui_controller.py b/src/askui/tools/askui/askui_controller.py index 7c385bbf..a723ef20 100644 --- a/src/askui/tools/askui/askui_controller.py +++ b/src/askui/tools/askui/askui_controller.py @@ -16,10 +16,10 @@ from askui.logger import logger from askui.reporting import Reporter from askui.tools.agent_os import AgentOs, ModifierKey, PcKey -from askui.tools.askui.askui_ui_controller_grpc import ( +from askui.tools.askui.askui_ui_controller_grpc.generated import ( Controller_V1_pb2 as controller_v1_pbs, ) -from askui.tools.askui.askui_ui_controller_grpc import ( +from askui.tools.askui.askui_ui_controller_grpc.generated import ( Controller_V1_pb2_grpc as controller_v1, ) from askui.utils.image_utils import draw_point_on_image diff --git a/src/askui/tools/askui/askui_ui_controller_grpc/generated/Controller_V1_pb2.py b/src/askui/tools/askui/askui_ui_controller_grpc/generated/Controller_V1_pb2.py new file mode 100644 index 00000000..ec91bee0 --- /dev/null +++ b/src/askui/tools/askui/askui_ui_controller_grpc/generated/Controller_V1_pb2.py @@ -0,0 +1,208 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: Controller_V1.proto +# Protobuf Python Version: 5.29.0 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 29, + 0, + '', + 'Controller_V1.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x13\x43ontroller_V1.proto\x12\x0f\x41skui.API.TDKv1\"\x06\n\x04Void\"\x0e\n\x0cRequest_Void\"\x0f\n\rResponse_Void\"&\n\x05Size2\x12\r\n\x05width\x18\x01 \x01(\r\x12\x0e\n\x06height\x18\x02 \x01(\r\"\x1e\n\x06\x44\x65lta2\x12\t\n\x01x\x18\x01 \x01(\x05\x12\t\n\x01y\x18\x02 \x01(\x05\"#\n\x0b\x43oordinate2\x12\t\n\x01x\x18\x01 \x01(\x05\x12\t\n\x01y\x18\x02 \x01(\x05\"E\n\tRectangle\x12\x0c\n\x04left\x18\x01 \x01(\x05\x12\x0b\n\x03top\x18\x02 \x01(\x05\x12\r\n\x05right\x18\x03 \x01(\x05\x12\x0e\n\x06\x62ottom\x18\x04 \x01(\x05\"u\n\x06\x42itmap\x12\r\n\x05width\x18\x01 \x01(\r\x12\x0e\n\x06height\x18\x02 \x01(\r\x12\x11\n\tlineWidth\x18\x03 \x01(\r\x12\x14\n\x0c\x62itsPerPixel\x18\x04 \x01(\r\x12\x15\n\rbytesPerPixel\x18\x05 \x01(\r\x12\x0c\n\x04\x64\x61ta\x18\x06 \x01(\x0c\"(\n\x05\x43olor\x12\t\n\x01r\x18\x01 \x01(\r\x12\t\n\x01g\x18\x02 \x01(\r\x12\t\n\x01\x62\x18\x03 \x01(\r\")\n\x04GUID\x12\x10\n\x08highPart\x18\x01 \x01(\x04\x12\x0f\n\x07lowPart\x18\x02 \x01(\x04\"L\n\x0bSessionInfo\x12*\n\x0bsessionGUID\x18\x01 \x01(\x0b\x32\x15.Askui.API.TDKv1.GUID\x12\x11\n\tsessionID\x18\x02 \x01(\x04\"e\n\x0b\x43\x61ptureArea\x12$\n\x04size\x18\x03 \x01(\x0b\x32\x16.Askui.API.TDKv1.Size2\x12\x30\n\ncoordinate\x18\x02 \x01(\x0b\x32\x1c.Askui.API.TDKv1.Coordinate2\"\x81\x01\n\x11\x43\x61ptureParameters\x12\x16\n\tdisplayID\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x36\n\x0b\x63\x61ptureArea\x18\x02 \x01(\x0b\x32\x1c.Askui.API.TDKv1.CaptureAreaH\x01\x88\x01\x01\x42\x0c\n\n_displayIDB\x0e\n\x0c_captureArea\"6\n\"PollEventParameters_ActionFinished\x12\x10\n\x08\x61\x63tionID\x18\x01 \x01(\r\"n\n\x13PollEventParameters\x12M\n\x0e\x61\x63tionFinished\x18\x01 \x01(\x0b\x32\x33.Askui.API.TDKv1.PollEventParameters_ActionFinishedH\x00\x42\x08\n\x06\x64\x61taOf\"-\n\x15\x41\x63tionParameters_Wait\x12\x14\n\x0cmilliseconds\x18\x01 \x01(\r\"W\n\"ActionParameters_MouseButton_Press\x12\x31\n\x0bmouseButton\x18\x01 \x01(\x0e\x32\x1c.Askui.API.TDKv1.MouseButton\"Y\n$ActionParameters_MouseButton_Release\x12\x31\n\x0bmouseButton\x18\x01 \x01(\x0e\x32\x1c.Askui.API.TDKv1.MouseButton\"p\n,ActionParameters_MouseButton_PressAndRelease\x12\x31\n\x0bmouseButton\x18\x01 \x01(\x0e\x32\x1c.Askui.API.TDKv1.MouseButton\x12\r\n\x05\x63ount\x18\x02 \x01(\r\"\xc0\x01\n!ActionParameters_MouseWheelScroll\x12=\n\tdirection\x18\x01 \x01(\x0e\x32*.Askui.API.TDKv1.MouseWheelScrollDirection\x12\x37\n\tdeltaType\x18\x02 \x01(\x0e\x32$.Askui.API.TDKv1.MouseWheelDeltaType\x12\r\n\x05\x64\x65lta\x18\x03 \x01(\x05\x12\x14\n\x0cmilliseconds\x18\x04 \x01(\x05\"x\n\x1a\x41\x63tionParameters_MouseMove\x12.\n\x08position\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.Coordinate2\x12\x19\n\x0cmilliseconds\x18\x02 \x01(\rH\x00\x88\x01\x01\x42\x0f\n\r_milliseconds\"v\n ActionParameters_MouseMove_Delta\x12&\n\x05\x64\x65lta\x18\x01 \x01(\x0b\x32\x17.Askui.API.TDKv1.Delta2\x12\x19\n\x0cmilliseconds\x18\x02 \x01(\rH\x00\x88\x01\x01\x42\x0f\n\r_milliseconds\"O\n\"ActionParameters_KeyboardKey_Press\x12\x0f\n\x07keyName\x18\x01 \x01(\t\x12\x18\n\x10modifierKeyNames\x18\x02 \x03(\t\"Q\n$ActionParameters_KeyboardKey_Release\x12\x0f\n\x07keyName\x18\x01 \x01(\t\x12\x18\n\x10modifierKeyNames\x18\x02 \x03(\t\"Y\n,ActionParameters_KeyboardKey_PressAndRelease\x12\x0f\n\x07keyName\x18\x01 \x01(\t\x12\x18\n\x10modifierKeyNames\x18\x02 \x03(\t\"Q\n#ActionParameters_KeyboardKeys_Press\x12\x10\n\x08keyNames\x18\x01 \x03(\t\x12\x18\n\x10modifierKeyNames\x18\x02 \x03(\t\"S\n%ActionParameters_KeyboardKeys_Release\x12\x10\n\x08keyNames\x18\x01 \x03(\t\x12\x18\n\x10modifierKeyNames\x18\x02 \x03(\t\"[\n-ActionParameters_KeyboardKeys_PressAndRelease\x12\x10\n\x08keyNames\x18\x01 \x03(\t\x12\x18\n\x10modifierKeyNames\x18\x02 \x03(\t\"\x99\x01\n\"ActionParameters_KeyboardType_Text\x12\x0c\n\x04text\x18\x01 \x01(\t\x12;\n\x10typingSpeedValue\x18\x02 \x01(\x0e\x32!.Askui.API.TDKv1.TypingSpeedValue\x12\x18\n\x0btypingSpeed\x18\x03 \x01(\rH\x00\x88\x01\x01\x42\x0e\n\x0c_typingSpeed\"\xa0\x01\n)ActionParameters_KeyboardType_UnicodeText\x12\x0c\n\x04text\x18\x01 \x01(\x0c\x12;\n\x10typingSpeedValue\x18\x02 \x01(\x0e\x32!.Askui.API.TDKv1.TypingSpeedValue\x12\x18\n\x0btypingSpeed\x18\x03 \x01(\rH\x00\x88\x01\x01\x42\x0e\n\x0c_typingSpeed\"l\n\x1b\x41\x63tionParameters_RunCommand\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\t\x12\"\n\x15timeoutInMilliseconds\x18\x02 \x01(\rH\x00\x88\x01\x01\x42\x18\n\x16_timeoutInMilliseconds\"\xf5\n\n\x10\x41\x63tionParameters\x12%\n\x04none\x18\x01 \x01(\x0b\x32\x15.Askui.API.TDKv1.VoidH\x00\x12\x36\n\x04wait\x18\x02 \x01(\x0b\x32&.Askui.API.TDKv1.ActionParameters_WaitH\x00\x12O\n\x10mouseButtonPress\x18\x03 \x01(\x0b\x32\x33.Askui.API.TDKv1.ActionParameters_MouseButton_PressH\x00\x12S\n\x12mouseButtonRelease\x18\x04 \x01(\x0b\x32\x35.Askui.API.TDKv1.ActionParameters_MouseButton_ReleaseH\x00\x12\x63\n\x1amouseButtonPressAndRelease\x18\x05 \x01(\x0b\x32=.Askui.API.TDKv1.ActionParameters_MouseButton_PressAndReleaseH\x00\x12N\n\x10mouseWheelScroll\x18\x06 \x01(\x0b\x32\x32.Askui.API.TDKv1.ActionParameters_MouseWheelScrollH\x00\x12@\n\tmouseMove\x18\x07 \x01(\x0b\x32+.Askui.API.TDKv1.ActionParameters_MouseMoveH\x00\x12K\n\x0emouseMoveDelta\x18\x08 \x01(\x0b\x32\x31.Askui.API.TDKv1.ActionParameters_MouseMove_DeltaH\x00\x12O\n\x10keyboardKeyPress\x18\t \x01(\x0b\x32\x33.Askui.API.TDKv1.ActionParameters_KeyboardKey_PressH\x00\x12S\n\x12keyboardKeyRelease\x18\n \x01(\x0b\x32\x35.Askui.API.TDKv1.ActionParameters_KeyboardKey_ReleaseH\x00\x12\x63\n\x1akeyboardKeyPressAndRelease\x18\x0b \x01(\x0b\x32=.Askui.API.TDKv1.ActionParameters_KeyboardKey_PressAndReleaseH\x00\x12Q\n\x11keyboardKeysPress\x18\x0c \x01(\x0b\x32\x34.Askui.API.TDKv1.ActionParameters_KeyboardKeys_PressH\x00\x12U\n\x13keyboardKeysRelease\x18\r \x01(\x0b\x32\x36.Askui.API.TDKv1.ActionParameters_KeyboardKeys_ReleaseH\x00\x12\x65\n\x1bkeyboardKeysPressAndRelease\x18\x0e \x01(\x0b\x32>.Askui.API.TDKv1.ActionParameters_KeyboardKeys_PressAndReleaseH\x00\x12O\n\x10keyboardTypeText\x18\x0f \x01(\x0b\x32\x33.Askui.API.TDKv1.ActionParameters_KeyboardType_TextH\x00\x12]\n\x17keyboardTypeUnicodeText\x18\x10 \x01(\x0b\x32:.Askui.API.TDKv1.ActionParameters_KeyboardType_UnicodeTextH\x00\x12\x42\n\nruncommand\x18\x11 \x01(\x0b\x32,.Askui.API.TDKv1.ActionParameters_RunCommandH\x00\x42\x08\n\x06\x64\x61taOf\"G\n\x14Request_StartSession\x12\x13\n\x0bsessionGUID\x18\x01 \x01(\t\x12\x1a\n\x12immediateExecution\x18\x02 \x01(\x08\"J\n\x15Response_StartSession\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\"G\n\x12Request_EndSession\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\"\x1f\n\x0cRequest_Send\x12\x0f\n\x07message\x18\x01 \x01(\t\"t\n\x0cRequest_Poll\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\x12\x31\n\x0bpollEventID\x18\x02 \x01(\x0e\x32\x1c.Askui.API.TDKv1.PollEventID\"K\n\x16Request_StartExecution\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\"J\n\x15Request_StopExecution\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\" \n\rResponse_Send\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x85\x01\n\rResponse_Poll\x12\x31\n\x0bpollEventID\x18\x01 \x01(\x0e\x32\x1c.Askui.API.TDKv1.PollEventID\x12\x41\n\x13pollEventParameters\x18\x02 \x01(\x0b\x32$.Askui.API.TDKv1.PollEventParameters\"\xc2\x01\n\x19Request_RunRecordedAction\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\x12\x35\n\ractionClassID\x18\x02 \x01(\x0e\x32\x1e.Askui.API.TDKv1.ActionClassID\x12;\n\x10\x61\x63tionParameters\x18\x03 \x01(\x0b\x32!.Askui.API.TDKv1.ActionParameters\"L\n\x1aResponse_RunRecordedAction\x12\x10\n\x08\x61\x63tionID\x18\x01 \x01(\r\x12\x1c\n\x14requiredMilliseconds\x18\x02 \x01(\r\"\xc6\x01\n\x1dRequest_ScheduleBatchedAction\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\x12\x35\n\ractionClassID\x18\x02 \x01(\x0e\x32\x1e.Askui.API.TDKv1.ActionClassID\x12;\n\x10\x61\x63tionParameters\x18\x03 \x01(\x0b\x32!.Askui.API.TDKv1.ActionParameters\"2\n\x1eResponse_ScheduleBatchedAction\x12\x10\n\x08\x61\x63tionID\x18\x01 \x01(\r\"K\n\x16Request_GetActionCount\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\".\n\x17Response_GetActionCount\x12\x13\n\x0b\x61\x63tionCount\x18\x01 \x01(\r\"[\n\x11Request_GetAction\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\x12\x13\n\x0b\x61\x63tionIndex\x18\x02 \x01(\r\"\x9a\x01\n\x12Response_GetAction\x12\x10\n\x08\x61\x63tionID\x18\x01 \x01(\r\x12\x35\n\ractionClassID\x18\x02 \x01(\x0e\x32\x1e.Askui.API.TDKv1.ActionClassID\x12;\n\x10\x61\x63tionParameters\x18\x03 \x01(\x0b\x32!.Askui.API.TDKv1.ActionParameters\"[\n\x14Request_RemoveAction\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\x12\x10\n\x08\x61\x63tionID\x18\x02 \x01(\r\"M\n\x18Request_RemoveAllActions\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\"J\n\x15Request_StartBatchRun\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\"I\n\x14Request_StopBatchRun\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\"\xa4\x01\n\x15Request_CaptureScreen\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\x12\x42\n\x11\x63\x61ptureParameters\x18\x02 \x01(\x0b\x32\".Askui.API.TDKv1.CaptureParametersH\x00\x88\x01\x01\x42\x14\n\x12_captureParameters\"A\n\x16Response_CaptureScreen\x12\'\n\x06\x62itmap\x18\x01 \x01(\x0b\x32\x17.Askui.API.TDKv1.Bitmap\"O\n$Response_GetContinuousCapturedScreen\x12\'\n\x06\x62itmap\x18\x01 \x01(\x0b\x32\x17.Askui.API.TDKv1.Bitmap\"\xde\x01\n\x1cReuqest_SetTestConfiguration\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\x12\x44\n\x18\x64\x65\x66\x61ultCaptureParameters\x18\x02 \x01(\x0b\x32\".Askui.API.TDKv1.CaptureParameters\x12 \n\x18mouseDelayInMilliseconds\x18\x03 \x01(\r\x12#\n\x1bkeyboardDelayInMilliseconds\x18\x04 \x01(\r\"g\n\x15Request_SetMouseDelay\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\x12\x1b\n\x13\x64\x65layInMilliseconds\x18\x02 \x01(\r\"j\n\x18Request_SetKeyboardDelay\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\x12\x1b\n\x13\x64\x65layInMilliseconds\x18\x02 \x01(\r\"\x9f\x01\n\x12\x44isplayInformation\x12\x11\n\tdisplayID\x18\x01 \x01(\r\x12\x0c\n\x04name\x18\x02 \x01(\t\x12,\n\x0csizeInPixels\x18\x03 \x01(\x0b\x32\x16.Askui.API.TDKv1.Size2\x12:\n\x16virtualScreenRectangle\x18\x04 \x01(\x0b\x32\x1a.Askui.API.TDKv1.Rectangle\"\x93\x01\n\x1eResponse_GetDisplayInformation\x12\x35\n\x08\x64isplays\x18\x01 \x03(\x0b\x32#.Askui.API.TDKv1.DisplayInformation\x12:\n\x16virtualScreenRectangle\x18\x02 \x01(\x0b\x32\x1a.Askui.API.TDKv1.Rectangle\"1\n\x19Response_GetMousePosition\x12\t\n\x01x\x18\x01 \x01(\x05\x12\t\n\x01y\x18\x02 \x01(\x05\"(\n\x13ProcessInfoExtended\x12\x11\n\thasWindow\x18\x01 \x01(\x08\"y\n\x0bProcessInfo\x12\n\n\x02ID\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\x12?\n\x0c\x65xtendedInfo\x18\x03 \x01(\x0b\x32$.Askui.API.TDKv1.ProcessInfoExtendedH\x00\x88\x01\x01\x42\x0f\n\r_extendedInfo\"1\n\x16Request_GetProcessList\x12\x17\n\x0fgetExtendedInfo\x18\x01 \x01(\x08\"J\n\x17Response_GetProcessList\x12/\n\tprocesses\x18\x01 \x03(\x0b\x32\x1c.Askui.API.TDKv1.ProcessInfo\"*\n\x15Request_GetWindowList\x12\x11\n\tprocessID\x18\x01 \x01(\x04\"&\n\nWindowInfo\x12\n\n\x02ID\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\"F\n\x16Response_GetWindowList\x12,\n\x07windows\x18\x01 \x03(\x0b\x32\x1b.Askui.API.TDKv1.WindowInfo\"-\n\x18Request_SetActiveDisplay\x12\x11\n\tdisplayID\x18\x01 \x01(\r\">\n\x17Request_SetActiveWindow\x12\x11\n\tprocessID\x18\x01 \x01(\x04\x12\x10\n\x08windowID\x18\x02 \x01(\x04\"q\n\x10\x41utomationTarget\x12\n\n\x02ID\x18\x01 \x01(\x04\x12\x33\n\x04type\x18\x02 \x01(\x0e\x32%.Askui.API.TDKv1.AutomationTargetType\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\"V\n Response_GetAutomationTargetList\x12\x32\n\x07targets\x18\x01 \x03(\x0b\x32!.Askui.API.TDKv1.AutomationTarget\"/\n!Request_SetActiveAutomationTarget\x12\n\n\x02ID\x18\x01 \x01(\x04\"Q\n\x10Request_GetColor\x12\t\n\x01x\x18\x01 \x01(\x05\x12\t\n\x01y\x18\x02 \x01(\x05\x12\'\n\x06\x62itmap\x18\x03 \x01(\x0b\x32\x17.Askui.API.TDKv1.Bitmap\":\n\x11Response_GetColor\x12%\n\x05\x63olor\x18\x01 \x01(\x0b\x32\x16.Askui.API.TDKv1.Color\"-\n\x15Request_GetPixelColor\x12\t\n\x01x\x18\x01 \x01(\x05\x12\t\n\x01y\x18\x02 \x01(\x05\"?\n\x16Response_GetPixelColor\x12%\n\x05\x63olor\x18\x01 \x01(\x0b\x32\x16.Askui.API.TDKv1.Color\"n\n\x17Request_SetDisplayLabel\x12\x31\n\x0bsessionInfo\x18\x01 \x01(\x0b\x32\x1c.Askui.API.TDKv1.SessionInfo\x12\x11\n\tdisplayID\x18\x02 \x01(\r\x12\r\n\x05label\x18\x03 \x01(\t*N\n\x0bPollEventID\x12\x19\n\x15PollEventID_Undefined\x10\x00\x12\x1e\n\x1aPollEventID_ActionFinished\x10\x02\"\x04\x08\x01\x10\x01*m\n\x0bMouseButton\x12\x19\n\x15MouseButton_Undefined\x10\x00\x12\x14\n\x10MouseButton_Left\x10\x01\x12\x15\n\x11MouseButton_Right\x10\x02\x12\x16\n\x12MouseButton_Middle\x10\x03*\x8b\x05\n\rActionClassID\x12\x1b\n\x17\x41\x63tionClassID_Undefined\x10\x00\x12\x16\n\x12\x41\x63tionClassID_Wait\x10\x01\x12#\n\x1f\x41\x63tionClassID_MouseButton_Press\x10\x08\x12%\n!ActionClassID_MouseButton_Release\x10\t\x12-\n)ActionClassID_MouseButton_PressAndRelease\x10\n\x12\"\n\x1e\x41\x63tionClassID_MouseWheelScroll\x10\x0b\x12\x1b\n\x17\x41\x63tionClassID_MouseMove\x10\x0c\x12!\n\x1d\x41\x63tionClassID_MouseMove_Delta\x10\r\x12#\n\x1f\x41\x63tionClassID_KeyboardKey_Press\x10\x0e\x12%\n!ActionClassID_KeyboardKey_Release\x10\x0f\x12-\n)ActionClassID_KeyboardKey_PressAndRelease\x10\x10\x12$\n ActionClassID_KeyboardKeys_Press\x10\x11\x12&\n\"ActionClassID_KeyboardKeys_Release\x10\x12\x12.\n*ActionClassID_KeyboardKeys_PressAndRelease\x10\x13\x12#\n\x1f\x41\x63tionClassID_KeyboardType_Text\x10\x14\x12*\n&ActionClassID_KeyboardType_UnicodeText\x10\x15\x12\x1c\n\x18\x41\x63tionClassID_RunCommand\x10\x16*i\n\x13MouseWheelDeltaType\x12\x1d\n\x19MouseWheelDelta_Undefined\x10\x00\x12\x17\n\x13MouseWheelDelta_Raw\x10\x01\x12\x1a\n\x16MouseWheelDelta_Detent\x10\x02*\x96\x01\n\x19MouseWheelScrollDirection\x12\'\n#MouseWheelScrollDirection_Undefined\x10\x00\x12&\n\"MouseWheelScrollDirection_Vertical\x10\x01\x12(\n$MouseWheelScrollDirection_Horizontal\x10\x02*z\n\x10TypingSpeedValue\x12\x1e\n\x1aTypingSpeedValue_Undefined\x10\x00\x12(\n$TypingSpeedValue_CharactersPerSecond\x10\x01\x12\x1c\n\x18TypingSpeedValue_Seconds\x10\x02*s\n\x14\x41utomationTargetType\x12\x1a\n\x16\x41utomationTarget_Local\x10\x00\x12\x1f\n\x1b\x41utomationTarget_Background\x10\x01\x12\x1e\n\x1a\x41utomationTarget_Companion\x10\x02\x32\x82\x16\n\rControllerAPI\x12_\n\x0cStartSession\x12%.Askui.API.TDKv1.Request_StartSession\x1a&.Askui.API.TDKv1.Response_StartSession\"\x00\x12S\n\nEndSession\x12#.Askui.API.TDKv1.Request_EndSession\x1a\x1e.Askui.API.TDKv1.Response_Void\"\x00\x12G\n\x04Send\x12\x1d.Askui.API.TDKv1.Request_Send\x1a\x1e.Askui.API.TDKv1.Response_Send\"\x00\x12G\n\x04Poll\x12\x1d.Askui.API.TDKv1.Request_Poll\x1a\x1e.Askui.API.TDKv1.Response_Poll\"\x00\x12[\n\x0eStartExecution\x12\'.Askui.API.TDKv1.Request_StartExecution\x1a\x1e.Askui.API.TDKv1.Response_Void\"\x00\x12Y\n\rStopExecution\x12&.Askui.API.TDKv1.Request_StopExecution\x1a\x1e.Askui.API.TDKv1.Response_Void\"\x00\x12n\n\x11RunRecordedAction\x12*.Askui.API.TDKv1.Request_RunRecordedAction\x1a+.Askui.API.TDKv1.Response_RunRecordedAction\"\x00\x12z\n\x15ScheduleBatchedAction\x12..Askui.API.TDKv1.Request_ScheduleBatchedAction\x1a/.Askui.API.TDKv1.Response_ScheduleBatchedAction\"\x00\x12Y\n\rStartBatchRun\x12&.Askui.API.TDKv1.Request_StartBatchRun\x1a\x1e.Askui.API.TDKv1.Response_Void\"\x00\x12W\n\x0cStopBatchRun\x12%.Askui.API.TDKv1.Request_StopBatchRun\x1a\x1e.Askui.API.TDKv1.Response_Void\"\x00\x12\x65\n\x0eGetActionCount\x12\'.Askui.API.TDKv1.Request_GetActionCount\x1a(.Askui.API.TDKv1.Response_GetActionCount\"\x00\x12V\n\tGetAction\x12\".Askui.API.TDKv1.Request_GetAction\x1a#.Askui.API.TDKv1.Response_GetAction\"\x00\x12W\n\x0cRemoveAction\x12%.Askui.API.TDKv1.Request_RemoveAction\x1a\x1e.Askui.API.TDKv1.Response_Void\"\x00\x12_\n\x10RemoveAllActions\x12).Askui.API.TDKv1.Request_RemoveAllActions\x1a\x1e.Askui.API.TDKv1.Response_Void\"\x00\x12\x62\n\rCaptureScreen\x12&.Askui.API.TDKv1.Request_CaptureScreen\x1a\'.Askui.API.TDKv1.Response_CaptureScreen\"\x00\x12g\n\x14SetTestConfiguration\x12-.Askui.API.TDKv1.Reuqest_SetTestConfiguration\x1a\x1e.Askui.API.TDKv1.Response_Void\"\x00\x12Y\n\rSetMouseDelay\x12&.Askui.API.TDKv1.Request_SetMouseDelay\x1a\x1e.Askui.API.TDKv1.Response_Void\"\x00\x12_\n\x10SetKeyboardDelay\x12).Askui.API.TDKv1.Request_SetKeyboardDelay\x1a\x1e.Askui.API.TDKv1.Response_Void\"\x00\x12i\n\x15GetDisplayInformation\x12\x1d.Askui.API.TDKv1.Request_Void\x1a/.Askui.API.TDKv1.Response_GetDisplayInformation\"\x00\x12_\n\x10GetMousePosition\x12\x1d.Askui.API.TDKv1.Request_Void\x1a*.Askui.API.TDKv1.Response_GetMousePosition\"\x00\x12\x65\n\x0eGetProcessList\x12\'.Askui.API.TDKv1.Request_GetProcessList\x1a(.Askui.API.TDKv1.Response_GetProcessList\"\x00\x12\x62\n\rGetWindowList\x12&.Askui.API.TDKv1.Request_GetWindowList\x1a\'.Askui.API.TDKv1.Response_GetWindowList\"\x00\x12m\n\x17GetAutomationTargetList\x12\x1d.Askui.API.TDKv1.Request_Void\x1a\x31.Askui.API.TDKv1.Response_GetAutomationTargetList\"\x00\x12_\n\x10SetActiveDisplay\x12).Askui.API.TDKv1.Request_SetActiveDisplay\x1a\x1e.Askui.API.TDKv1.Response_Void\"\x00\x12]\n\x0fSetActiveWindow\x12(.Askui.API.TDKv1.Request_SetActiveWindow\x1a\x1e.Askui.API.TDKv1.Response_Void\"\x00\x12q\n\x19SetActiveAutomationTarget\x12\x32.Askui.API.TDKv1.Request_SetActiveAutomationTarget\x1a\x1e.Askui.API.TDKv1.Response_Void\"\x00\x12S\n\x08GetColor\x12!.Askui.API.TDKv1.Request_GetColor\x1a\".Askui.API.TDKv1.Response_GetColor\"\x00\x12\x62\n\rGetPixelColor\x12&.Askui.API.TDKv1.Request_GetPixelColor\x1a\'.Askui.API.TDKv1.Response_GetPixelColor\"\x00\x12]\n\x0fSetDisplayLabel\x12(.Askui.API.TDKv1.Request_SetDisplayLabel\x1a\x1e.Askui.API.TDKv1.Response_Void\"\x00\x62\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'Controller_V1_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + DESCRIPTOR._loaded_options = None + _globals['_POLLEVENTID']._serialized_start=8285 + _globals['_POLLEVENTID']._serialized_end=8363 + _globals['_MOUSEBUTTON']._serialized_start=8365 + _globals['_MOUSEBUTTON']._serialized_end=8474 + _globals['_ACTIONCLASSID']._serialized_start=8477 + _globals['_ACTIONCLASSID']._serialized_end=9128 + _globals['_MOUSEWHEELDELTATYPE']._serialized_start=9130 + _globals['_MOUSEWHEELDELTATYPE']._serialized_end=9235 + _globals['_MOUSEWHEELSCROLLDIRECTION']._serialized_start=9238 + _globals['_MOUSEWHEELSCROLLDIRECTION']._serialized_end=9388 + _globals['_TYPINGSPEEDVALUE']._serialized_start=9390 + _globals['_TYPINGSPEEDVALUE']._serialized_end=9512 + _globals['_AUTOMATIONTARGETTYPE']._serialized_start=9514 + _globals['_AUTOMATIONTARGETTYPE']._serialized_end=9629 + _globals['_VOID']._serialized_start=40 + _globals['_VOID']._serialized_end=46 + _globals['_REQUEST_VOID']._serialized_start=48 + _globals['_REQUEST_VOID']._serialized_end=62 + _globals['_RESPONSE_VOID']._serialized_start=64 + _globals['_RESPONSE_VOID']._serialized_end=79 + _globals['_SIZE2']._serialized_start=81 + _globals['_SIZE2']._serialized_end=119 + _globals['_DELTA2']._serialized_start=121 + _globals['_DELTA2']._serialized_end=151 + _globals['_COORDINATE2']._serialized_start=153 + _globals['_COORDINATE2']._serialized_end=188 + _globals['_RECTANGLE']._serialized_start=190 + _globals['_RECTANGLE']._serialized_end=259 + _globals['_BITMAP']._serialized_start=261 + _globals['_BITMAP']._serialized_end=378 + _globals['_COLOR']._serialized_start=380 + _globals['_COLOR']._serialized_end=420 + _globals['_GUID']._serialized_start=422 + _globals['_GUID']._serialized_end=463 + _globals['_SESSIONINFO']._serialized_start=465 + _globals['_SESSIONINFO']._serialized_end=541 + _globals['_CAPTUREAREA']._serialized_start=543 + _globals['_CAPTUREAREA']._serialized_end=644 + _globals['_CAPTUREPARAMETERS']._serialized_start=647 + _globals['_CAPTUREPARAMETERS']._serialized_end=776 + _globals['_POLLEVENTPARAMETERS_ACTIONFINISHED']._serialized_start=778 + _globals['_POLLEVENTPARAMETERS_ACTIONFINISHED']._serialized_end=832 + _globals['_POLLEVENTPARAMETERS']._serialized_start=834 + _globals['_POLLEVENTPARAMETERS']._serialized_end=944 + _globals['_ACTIONPARAMETERS_WAIT']._serialized_start=946 + _globals['_ACTIONPARAMETERS_WAIT']._serialized_end=991 + _globals['_ACTIONPARAMETERS_MOUSEBUTTON_PRESS']._serialized_start=993 + _globals['_ACTIONPARAMETERS_MOUSEBUTTON_PRESS']._serialized_end=1080 + _globals['_ACTIONPARAMETERS_MOUSEBUTTON_RELEASE']._serialized_start=1082 + _globals['_ACTIONPARAMETERS_MOUSEBUTTON_RELEASE']._serialized_end=1171 + _globals['_ACTIONPARAMETERS_MOUSEBUTTON_PRESSANDRELEASE']._serialized_start=1173 + _globals['_ACTIONPARAMETERS_MOUSEBUTTON_PRESSANDRELEASE']._serialized_end=1285 + _globals['_ACTIONPARAMETERS_MOUSEWHEELSCROLL']._serialized_start=1288 + _globals['_ACTIONPARAMETERS_MOUSEWHEELSCROLL']._serialized_end=1480 + _globals['_ACTIONPARAMETERS_MOUSEMOVE']._serialized_start=1482 + _globals['_ACTIONPARAMETERS_MOUSEMOVE']._serialized_end=1602 + _globals['_ACTIONPARAMETERS_MOUSEMOVE_DELTA']._serialized_start=1604 + _globals['_ACTIONPARAMETERS_MOUSEMOVE_DELTA']._serialized_end=1722 + _globals['_ACTIONPARAMETERS_KEYBOARDKEY_PRESS']._serialized_start=1724 + _globals['_ACTIONPARAMETERS_KEYBOARDKEY_PRESS']._serialized_end=1803 + _globals['_ACTIONPARAMETERS_KEYBOARDKEY_RELEASE']._serialized_start=1805 + _globals['_ACTIONPARAMETERS_KEYBOARDKEY_RELEASE']._serialized_end=1886 + _globals['_ACTIONPARAMETERS_KEYBOARDKEY_PRESSANDRELEASE']._serialized_start=1888 + _globals['_ACTIONPARAMETERS_KEYBOARDKEY_PRESSANDRELEASE']._serialized_end=1977 + _globals['_ACTIONPARAMETERS_KEYBOARDKEYS_PRESS']._serialized_start=1979 + _globals['_ACTIONPARAMETERS_KEYBOARDKEYS_PRESS']._serialized_end=2060 + _globals['_ACTIONPARAMETERS_KEYBOARDKEYS_RELEASE']._serialized_start=2062 + _globals['_ACTIONPARAMETERS_KEYBOARDKEYS_RELEASE']._serialized_end=2145 + _globals['_ACTIONPARAMETERS_KEYBOARDKEYS_PRESSANDRELEASE']._serialized_start=2147 + _globals['_ACTIONPARAMETERS_KEYBOARDKEYS_PRESSANDRELEASE']._serialized_end=2238 + _globals['_ACTIONPARAMETERS_KEYBOARDTYPE_TEXT']._serialized_start=2241 + _globals['_ACTIONPARAMETERS_KEYBOARDTYPE_TEXT']._serialized_end=2394 + _globals['_ACTIONPARAMETERS_KEYBOARDTYPE_UNICODETEXT']._serialized_start=2397 + _globals['_ACTIONPARAMETERS_KEYBOARDTYPE_UNICODETEXT']._serialized_end=2557 + _globals['_ACTIONPARAMETERS_RUNCOMMAND']._serialized_start=2559 + _globals['_ACTIONPARAMETERS_RUNCOMMAND']._serialized_end=2667 + _globals['_ACTIONPARAMETERS']._serialized_start=2670 + _globals['_ACTIONPARAMETERS']._serialized_end=4067 + _globals['_REQUEST_STARTSESSION']._serialized_start=4069 + _globals['_REQUEST_STARTSESSION']._serialized_end=4140 + _globals['_RESPONSE_STARTSESSION']._serialized_start=4142 + _globals['_RESPONSE_STARTSESSION']._serialized_end=4216 + _globals['_REQUEST_ENDSESSION']._serialized_start=4218 + _globals['_REQUEST_ENDSESSION']._serialized_end=4289 + _globals['_REQUEST_SEND']._serialized_start=4291 + _globals['_REQUEST_SEND']._serialized_end=4322 + _globals['_REQUEST_POLL']._serialized_start=4324 + _globals['_REQUEST_POLL']._serialized_end=4440 + _globals['_REQUEST_STARTEXECUTION']._serialized_start=4442 + _globals['_REQUEST_STARTEXECUTION']._serialized_end=4517 + _globals['_REQUEST_STOPEXECUTION']._serialized_start=4519 + _globals['_REQUEST_STOPEXECUTION']._serialized_end=4593 + _globals['_RESPONSE_SEND']._serialized_start=4595 + _globals['_RESPONSE_SEND']._serialized_end=4627 + _globals['_RESPONSE_POLL']._serialized_start=4630 + _globals['_RESPONSE_POLL']._serialized_end=4763 + _globals['_REQUEST_RUNRECORDEDACTION']._serialized_start=4766 + _globals['_REQUEST_RUNRECORDEDACTION']._serialized_end=4960 + _globals['_RESPONSE_RUNRECORDEDACTION']._serialized_start=4962 + _globals['_RESPONSE_RUNRECORDEDACTION']._serialized_end=5038 + _globals['_REQUEST_SCHEDULEBATCHEDACTION']._serialized_start=5041 + _globals['_REQUEST_SCHEDULEBATCHEDACTION']._serialized_end=5239 + _globals['_RESPONSE_SCHEDULEBATCHEDACTION']._serialized_start=5241 + _globals['_RESPONSE_SCHEDULEBATCHEDACTION']._serialized_end=5291 + _globals['_REQUEST_GETACTIONCOUNT']._serialized_start=5293 + _globals['_REQUEST_GETACTIONCOUNT']._serialized_end=5368 + _globals['_RESPONSE_GETACTIONCOUNT']._serialized_start=5370 + _globals['_RESPONSE_GETACTIONCOUNT']._serialized_end=5416 + _globals['_REQUEST_GETACTION']._serialized_start=5418 + _globals['_REQUEST_GETACTION']._serialized_end=5509 + _globals['_RESPONSE_GETACTION']._serialized_start=5512 + _globals['_RESPONSE_GETACTION']._serialized_end=5666 + _globals['_REQUEST_REMOVEACTION']._serialized_start=5668 + _globals['_REQUEST_REMOVEACTION']._serialized_end=5759 + _globals['_REQUEST_REMOVEALLACTIONS']._serialized_start=5761 + _globals['_REQUEST_REMOVEALLACTIONS']._serialized_end=5838 + _globals['_REQUEST_STARTBATCHRUN']._serialized_start=5840 + _globals['_REQUEST_STARTBATCHRUN']._serialized_end=5914 + _globals['_REQUEST_STOPBATCHRUN']._serialized_start=5916 + _globals['_REQUEST_STOPBATCHRUN']._serialized_end=5989 + _globals['_REQUEST_CAPTURESCREEN']._serialized_start=5992 + _globals['_REQUEST_CAPTURESCREEN']._serialized_end=6156 + _globals['_RESPONSE_CAPTURESCREEN']._serialized_start=6158 + _globals['_RESPONSE_CAPTURESCREEN']._serialized_end=6223 + _globals['_RESPONSE_GETCONTINUOUSCAPTUREDSCREEN']._serialized_start=6225 + _globals['_RESPONSE_GETCONTINUOUSCAPTUREDSCREEN']._serialized_end=6304 + _globals['_REUQEST_SETTESTCONFIGURATION']._serialized_start=6307 + _globals['_REUQEST_SETTESTCONFIGURATION']._serialized_end=6529 + _globals['_REQUEST_SETMOUSEDELAY']._serialized_start=6531 + _globals['_REQUEST_SETMOUSEDELAY']._serialized_end=6634 + _globals['_REQUEST_SETKEYBOARDDELAY']._serialized_start=6636 + _globals['_REQUEST_SETKEYBOARDDELAY']._serialized_end=6742 + _globals['_DISPLAYINFORMATION']._serialized_start=6745 + _globals['_DISPLAYINFORMATION']._serialized_end=6904 + _globals['_RESPONSE_GETDISPLAYINFORMATION']._serialized_start=6907 + _globals['_RESPONSE_GETDISPLAYINFORMATION']._serialized_end=7054 + _globals['_RESPONSE_GETMOUSEPOSITION']._serialized_start=7056 + _globals['_RESPONSE_GETMOUSEPOSITION']._serialized_end=7105 + _globals['_PROCESSINFOEXTENDED']._serialized_start=7107 + _globals['_PROCESSINFOEXTENDED']._serialized_end=7147 + _globals['_PROCESSINFO']._serialized_start=7149 + _globals['_PROCESSINFO']._serialized_end=7270 + _globals['_REQUEST_GETPROCESSLIST']._serialized_start=7272 + _globals['_REQUEST_GETPROCESSLIST']._serialized_end=7321 + _globals['_RESPONSE_GETPROCESSLIST']._serialized_start=7323 + _globals['_RESPONSE_GETPROCESSLIST']._serialized_end=7397 + _globals['_REQUEST_GETWINDOWLIST']._serialized_start=7399 + _globals['_REQUEST_GETWINDOWLIST']._serialized_end=7441 + _globals['_WINDOWINFO']._serialized_start=7443 + _globals['_WINDOWINFO']._serialized_end=7481 + _globals['_RESPONSE_GETWINDOWLIST']._serialized_start=7483 + _globals['_RESPONSE_GETWINDOWLIST']._serialized_end=7553 + _globals['_REQUEST_SETACTIVEDISPLAY']._serialized_start=7555 + _globals['_REQUEST_SETACTIVEDISPLAY']._serialized_end=7600 + _globals['_REQUEST_SETACTIVEWINDOW']._serialized_start=7602 + _globals['_REQUEST_SETACTIVEWINDOW']._serialized_end=7664 + _globals['_AUTOMATIONTARGET']._serialized_start=7666 + _globals['_AUTOMATIONTARGET']._serialized_end=7779 + _globals['_RESPONSE_GETAUTOMATIONTARGETLIST']._serialized_start=7781 + _globals['_RESPONSE_GETAUTOMATIONTARGETLIST']._serialized_end=7867 + _globals['_REQUEST_SETACTIVEAUTOMATIONTARGET']._serialized_start=7869 + _globals['_REQUEST_SETACTIVEAUTOMATIONTARGET']._serialized_end=7916 + _globals['_REQUEST_GETCOLOR']._serialized_start=7918 + _globals['_REQUEST_GETCOLOR']._serialized_end=7999 + _globals['_RESPONSE_GETCOLOR']._serialized_start=8001 + _globals['_RESPONSE_GETCOLOR']._serialized_end=8059 + _globals['_REQUEST_GETPIXELCOLOR']._serialized_start=8061 + _globals['_REQUEST_GETPIXELCOLOR']._serialized_end=8106 + _globals['_RESPONSE_GETPIXELCOLOR']._serialized_start=8108 + _globals['_RESPONSE_GETPIXELCOLOR']._serialized_end=8171 + _globals['_REQUEST_SETDISPLAYLABEL']._serialized_start=8173 + _globals['_REQUEST_SETDISPLAYLABEL']._serialized_end=8283 + _globals['_CONTROLLERAPI']._serialized_start=9632 + _globals['_CONTROLLERAPI']._serialized_end=12450 +# @@protoc_insertion_point(module_scope) diff --git a/src/askui/tools/askui/askui_ui_controller_grpc/generated/Controller_V1_pb2.pyi b/src/askui/tools/askui/askui_ui_controller_grpc/generated/Controller_V1_pb2.pyi new file mode 100644 index 00000000..409383f9 --- /dev/null +++ b/src/askui/tools/askui/askui_ui_controller_grpc/generated/Controller_V1_pb2.pyi @@ -0,0 +1,736 @@ +from google.protobuf.internal import containers as _containers +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union + +DESCRIPTOR: _descriptor.FileDescriptor + +class PollEventID(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + PollEventID_Undefined: _ClassVar[PollEventID] + PollEventID_ActionFinished: _ClassVar[PollEventID] + +class MouseButton(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + MouseButton_Undefined: _ClassVar[MouseButton] + MouseButton_Left: _ClassVar[MouseButton] + MouseButton_Right: _ClassVar[MouseButton] + MouseButton_Middle: _ClassVar[MouseButton] + +class ActionClassID(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + ActionClassID_Undefined: _ClassVar[ActionClassID] + ActionClassID_Wait: _ClassVar[ActionClassID] + ActionClassID_MouseButton_Press: _ClassVar[ActionClassID] + ActionClassID_MouseButton_Release: _ClassVar[ActionClassID] + ActionClassID_MouseButton_PressAndRelease: _ClassVar[ActionClassID] + ActionClassID_MouseWheelScroll: _ClassVar[ActionClassID] + ActionClassID_MouseMove: _ClassVar[ActionClassID] + ActionClassID_MouseMove_Delta: _ClassVar[ActionClassID] + ActionClassID_KeyboardKey_Press: _ClassVar[ActionClassID] + ActionClassID_KeyboardKey_Release: _ClassVar[ActionClassID] + ActionClassID_KeyboardKey_PressAndRelease: _ClassVar[ActionClassID] + ActionClassID_KeyboardKeys_Press: _ClassVar[ActionClassID] + ActionClassID_KeyboardKeys_Release: _ClassVar[ActionClassID] + ActionClassID_KeyboardKeys_PressAndRelease: _ClassVar[ActionClassID] + ActionClassID_KeyboardType_Text: _ClassVar[ActionClassID] + ActionClassID_KeyboardType_UnicodeText: _ClassVar[ActionClassID] + ActionClassID_RunCommand: _ClassVar[ActionClassID] + +class MouseWheelDeltaType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + MouseWheelDelta_Undefined: _ClassVar[MouseWheelDeltaType] + MouseWheelDelta_Raw: _ClassVar[MouseWheelDeltaType] + MouseWheelDelta_Detent: _ClassVar[MouseWheelDeltaType] + +class MouseWheelScrollDirection(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + MouseWheelScrollDirection_Undefined: _ClassVar[MouseWheelScrollDirection] + MouseWheelScrollDirection_Vertical: _ClassVar[MouseWheelScrollDirection] + MouseWheelScrollDirection_Horizontal: _ClassVar[MouseWheelScrollDirection] + +class TypingSpeedValue(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + TypingSpeedValue_Undefined: _ClassVar[TypingSpeedValue] + TypingSpeedValue_CharactersPerSecond: _ClassVar[TypingSpeedValue] + TypingSpeedValue_Seconds: _ClassVar[TypingSpeedValue] + +class AutomationTargetType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + AutomationTarget_Local: _ClassVar[AutomationTargetType] + AutomationTarget_Background: _ClassVar[AutomationTargetType] + AutomationTarget_Companion: _ClassVar[AutomationTargetType] +PollEventID_Undefined: PollEventID +PollEventID_ActionFinished: PollEventID +MouseButton_Undefined: MouseButton +MouseButton_Left: MouseButton +MouseButton_Right: MouseButton +MouseButton_Middle: MouseButton +ActionClassID_Undefined: ActionClassID +ActionClassID_Wait: ActionClassID +ActionClassID_MouseButton_Press: ActionClassID +ActionClassID_MouseButton_Release: ActionClassID +ActionClassID_MouseButton_PressAndRelease: ActionClassID +ActionClassID_MouseWheelScroll: ActionClassID +ActionClassID_MouseMove: ActionClassID +ActionClassID_MouseMove_Delta: ActionClassID +ActionClassID_KeyboardKey_Press: ActionClassID +ActionClassID_KeyboardKey_Release: ActionClassID +ActionClassID_KeyboardKey_PressAndRelease: ActionClassID +ActionClassID_KeyboardKeys_Press: ActionClassID +ActionClassID_KeyboardKeys_Release: ActionClassID +ActionClassID_KeyboardKeys_PressAndRelease: ActionClassID +ActionClassID_KeyboardType_Text: ActionClassID +ActionClassID_KeyboardType_UnicodeText: ActionClassID +ActionClassID_RunCommand: ActionClassID +MouseWheelDelta_Undefined: MouseWheelDeltaType +MouseWheelDelta_Raw: MouseWheelDeltaType +MouseWheelDelta_Detent: MouseWheelDeltaType +MouseWheelScrollDirection_Undefined: MouseWheelScrollDirection +MouseWheelScrollDirection_Vertical: MouseWheelScrollDirection +MouseWheelScrollDirection_Horizontal: MouseWheelScrollDirection +TypingSpeedValue_Undefined: TypingSpeedValue +TypingSpeedValue_CharactersPerSecond: TypingSpeedValue +TypingSpeedValue_Seconds: TypingSpeedValue +AutomationTarget_Local: AutomationTargetType +AutomationTarget_Background: AutomationTargetType +AutomationTarget_Companion: AutomationTargetType + +class Void(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class Request_Void(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class Response_Void(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class Size2(_message.Message): + __slots__ = ("width", "height") + WIDTH_FIELD_NUMBER: _ClassVar[int] + HEIGHT_FIELD_NUMBER: _ClassVar[int] + width: int + height: int + def __init__(self, width: _Optional[int] = ..., height: _Optional[int] = ...) -> None: ... + +class Delta2(_message.Message): + __slots__ = ("x", "y") + X_FIELD_NUMBER: _ClassVar[int] + Y_FIELD_NUMBER: _ClassVar[int] + x: int + y: int + def __init__(self, x: _Optional[int] = ..., y: _Optional[int] = ...) -> None: ... + +class Coordinate2(_message.Message): + __slots__ = ("x", "y") + X_FIELD_NUMBER: _ClassVar[int] + Y_FIELD_NUMBER: _ClassVar[int] + x: int + y: int + def __init__(self, x: _Optional[int] = ..., y: _Optional[int] = ...) -> None: ... + +class Rectangle(_message.Message): + __slots__ = ("left", "top", "right", "bottom") + LEFT_FIELD_NUMBER: _ClassVar[int] + TOP_FIELD_NUMBER: _ClassVar[int] + RIGHT_FIELD_NUMBER: _ClassVar[int] + BOTTOM_FIELD_NUMBER: _ClassVar[int] + left: int + top: int + right: int + bottom: int + def __init__(self, left: _Optional[int] = ..., top: _Optional[int] = ..., right: _Optional[int] = ..., bottom: _Optional[int] = ...) -> None: ... + +class Bitmap(_message.Message): + __slots__ = ("width", "height", "lineWidth", "bitsPerPixel", "bytesPerPixel", "data") + WIDTH_FIELD_NUMBER: _ClassVar[int] + HEIGHT_FIELD_NUMBER: _ClassVar[int] + LINEWIDTH_FIELD_NUMBER: _ClassVar[int] + BITSPERPIXEL_FIELD_NUMBER: _ClassVar[int] + BYTESPERPIXEL_FIELD_NUMBER: _ClassVar[int] + DATA_FIELD_NUMBER: _ClassVar[int] + width: int + height: int + lineWidth: int + bitsPerPixel: int + bytesPerPixel: int + data: bytes + def __init__(self, width: _Optional[int] = ..., height: _Optional[int] = ..., lineWidth: _Optional[int] = ..., bitsPerPixel: _Optional[int] = ..., bytesPerPixel: _Optional[int] = ..., data: _Optional[bytes] = ...) -> None: ... + +class Color(_message.Message): + __slots__ = ("r", "g", "b") + R_FIELD_NUMBER: _ClassVar[int] + G_FIELD_NUMBER: _ClassVar[int] + B_FIELD_NUMBER: _ClassVar[int] + r: int + g: int + b: int + def __init__(self, r: _Optional[int] = ..., g: _Optional[int] = ..., b: _Optional[int] = ...) -> None: ... + +class GUID(_message.Message): + __slots__ = ("highPart", "lowPart") + HIGHPART_FIELD_NUMBER: _ClassVar[int] + LOWPART_FIELD_NUMBER: _ClassVar[int] + highPart: int + lowPart: int + def __init__(self, highPart: _Optional[int] = ..., lowPart: _Optional[int] = ...) -> None: ... + +class SessionInfo(_message.Message): + __slots__ = ("sessionGUID", "sessionID") + SESSIONGUID_FIELD_NUMBER: _ClassVar[int] + SESSIONID_FIELD_NUMBER: _ClassVar[int] + sessionGUID: GUID + sessionID: int + def __init__(self, sessionGUID: _Optional[_Union[GUID, _Mapping]] = ..., sessionID: _Optional[int] = ...) -> None: ... + +class CaptureArea(_message.Message): + __slots__ = ("size", "coordinate") + SIZE_FIELD_NUMBER: _ClassVar[int] + COORDINATE_FIELD_NUMBER: _ClassVar[int] + size: Size2 + coordinate: Coordinate2 + def __init__(self, size: _Optional[_Union[Size2, _Mapping]] = ..., coordinate: _Optional[_Union[Coordinate2, _Mapping]] = ...) -> None: ... + +class CaptureParameters(_message.Message): + __slots__ = ("displayID", "captureArea") + DISPLAYID_FIELD_NUMBER: _ClassVar[int] + CAPTUREAREA_FIELD_NUMBER: _ClassVar[int] + displayID: int + captureArea: CaptureArea + def __init__(self, displayID: _Optional[int] = ..., captureArea: _Optional[_Union[CaptureArea, _Mapping]] = ...) -> None: ... + +class PollEventParameters_ActionFinished(_message.Message): + __slots__ = ("actionID",) + ACTIONID_FIELD_NUMBER: _ClassVar[int] + actionID: int + def __init__(self, actionID: _Optional[int] = ...) -> None: ... + +class PollEventParameters(_message.Message): + __slots__ = ("actionFinished",) + ACTIONFINISHED_FIELD_NUMBER: _ClassVar[int] + actionFinished: PollEventParameters_ActionFinished + def __init__(self, actionFinished: _Optional[_Union[PollEventParameters_ActionFinished, _Mapping]] = ...) -> None: ... + +class ActionParameters_Wait(_message.Message): + __slots__ = ("milliseconds",) + MILLISECONDS_FIELD_NUMBER: _ClassVar[int] + milliseconds: int + def __init__(self, milliseconds: _Optional[int] = ...) -> None: ... + +class ActionParameters_MouseButton_Press(_message.Message): + __slots__ = ("mouseButton",) + MOUSEBUTTON_FIELD_NUMBER: _ClassVar[int] + mouseButton: MouseButton + def __init__(self, mouseButton: _Optional[_Union[MouseButton, str]] = ...) -> None: ... + +class ActionParameters_MouseButton_Release(_message.Message): + __slots__ = ("mouseButton",) + MOUSEBUTTON_FIELD_NUMBER: _ClassVar[int] + mouseButton: MouseButton + def __init__(self, mouseButton: _Optional[_Union[MouseButton, str]] = ...) -> None: ... + +class ActionParameters_MouseButton_PressAndRelease(_message.Message): + __slots__ = ("mouseButton", "count") + MOUSEBUTTON_FIELD_NUMBER: _ClassVar[int] + COUNT_FIELD_NUMBER: _ClassVar[int] + mouseButton: MouseButton + count: int + def __init__(self, mouseButton: _Optional[_Union[MouseButton, str]] = ..., count: _Optional[int] = ...) -> None: ... + +class ActionParameters_MouseWheelScroll(_message.Message): + __slots__ = ("direction", "deltaType", "delta", "milliseconds") + DIRECTION_FIELD_NUMBER: _ClassVar[int] + DELTATYPE_FIELD_NUMBER: _ClassVar[int] + DELTA_FIELD_NUMBER: _ClassVar[int] + MILLISECONDS_FIELD_NUMBER: _ClassVar[int] + direction: MouseWheelScrollDirection + deltaType: MouseWheelDeltaType + delta: int + milliseconds: int + def __init__(self, direction: _Optional[_Union[MouseWheelScrollDirection, str]] = ..., deltaType: _Optional[_Union[MouseWheelDeltaType, str]] = ..., delta: _Optional[int] = ..., milliseconds: _Optional[int] = ...) -> None: ... + +class ActionParameters_MouseMove(_message.Message): + __slots__ = ("position", "milliseconds") + POSITION_FIELD_NUMBER: _ClassVar[int] + MILLISECONDS_FIELD_NUMBER: _ClassVar[int] + position: Coordinate2 + milliseconds: int + def __init__(self, position: _Optional[_Union[Coordinate2, _Mapping]] = ..., milliseconds: _Optional[int] = ...) -> None: ... + +class ActionParameters_MouseMove_Delta(_message.Message): + __slots__ = ("delta", "milliseconds") + DELTA_FIELD_NUMBER: _ClassVar[int] + MILLISECONDS_FIELD_NUMBER: _ClassVar[int] + delta: Delta2 + milliseconds: int + def __init__(self, delta: _Optional[_Union[Delta2, _Mapping]] = ..., milliseconds: _Optional[int] = ...) -> None: ... + +class ActionParameters_KeyboardKey_Press(_message.Message): + __slots__ = ("keyName", "modifierKeyNames") + KEYNAME_FIELD_NUMBER: _ClassVar[int] + MODIFIERKEYNAMES_FIELD_NUMBER: _ClassVar[int] + keyName: str + modifierKeyNames: _containers.RepeatedScalarFieldContainer[str] + def __init__(self, keyName: _Optional[str] = ..., modifierKeyNames: _Optional[_Iterable[str]] = ...) -> None: ... + +class ActionParameters_KeyboardKey_Release(_message.Message): + __slots__ = ("keyName", "modifierKeyNames") + KEYNAME_FIELD_NUMBER: _ClassVar[int] + MODIFIERKEYNAMES_FIELD_NUMBER: _ClassVar[int] + keyName: str + modifierKeyNames: _containers.RepeatedScalarFieldContainer[str] + def __init__(self, keyName: _Optional[str] = ..., modifierKeyNames: _Optional[_Iterable[str]] = ...) -> None: ... + +class ActionParameters_KeyboardKey_PressAndRelease(_message.Message): + __slots__ = ("keyName", "modifierKeyNames") + KEYNAME_FIELD_NUMBER: _ClassVar[int] + MODIFIERKEYNAMES_FIELD_NUMBER: _ClassVar[int] + keyName: str + modifierKeyNames: _containers.RepeatedScalarFieldContainer[str] + def __init__(self, keyName: _Optional[str] = ..., modifierKeyNames: _Optional[_Iterable[str]] = ...) -> None: ... + +class ActionParameters_KeyboardKeys_Press(_message.Message): + __slots__ = ("keyNames", "modifierKeyNames") + KEYNAMES_FIELD_NUMBER: _ClassVar[int] + MODIFIERKEYNAMES_FIELD_NUMBER: _ClassVar[int] + keyNames: _containers.RepeatedScalarFieldContainer[str] + modifierKeyNames: _containers.RepeatedScalarFieldContainer[str] + def __init__(self, keyNames: _Optional[_Iterable[str]] = ..., modifierKeyNames: _Optional[_Iterable[str]] = ...) -> None: ... + +class ActionParameters_KeyboardKeys_Release(_message.Message): + __slots__ = ("keyNames", "modifierKeyNames") + KEYNAMES_FIELD_NUMBER: _ClassVar[int] + MODIFIERKEYNAMES_FIELD_NUMBER: _ClassVar[int] + keyNames: _containers.RepeatedScalarFieldContainer[str] + modifierKeyNames: _containers.RepeatedScalarFieldContainer[str] + def __init__(self, keyNames: _Optional[_Iterable[str]] = ..., modifierKeyNames: _Optional[_Iterable[str]] = ...) -> None: ... + +class ActionParameters_KeyboardKeys_PressAndRelease(_message.Message): + __slots__ = ("keyNames", "modifierKeyNames") + KEYNAMES_FIELD_NUMBER: _ClassVar[int] + MODIFIERKEYNAMES_FIELD_NUMBER: _ClassVar[int] + keyNames: _containers.RepeatedScalarFieldContainer[str] + modifierKeyNames: _containers.RepeatedScalarFieldContainer[str] + def __init__(self, keyNames: _Optional[_Iterable[str]] = ..., modifierKeyNames: _Optional[_Iterable[str]] = ...) -> None: ... + +class ActionParameters_KeyboardType_Text(_message.Message): + __slots__ = ("text", "typingSpeedValue", "typingSpeed") + TEXT_FIELD_NUMBER: _ClassVar[int] + TYPINGSPEEDVALUE_FIELD_NUMBER: _ClassVar[int] + TYPINGSPEED_FIELD_NUMBER: _ClassVar[int] + text: str + typingSpeedValue: TypingSpeedValue + typingSpeed: int + def __init__(self, text: _Optional[str] = ..., typingSpeedValue: _Optional[_Union[TypingSpeedValue, str]] = ..., typingSpeed: _Optional[int] = ...) -> None: ... + +class ActionParameters_KeyboardType_UnicodeText(_message.Message): + __slots__ = ("text", "typingSpeedValue", "typingSpeed") + TEXT_FIELD_NUMBER: _ClassVar[int] + TYPINGSPEEDVALUE_FIELD_NUMBER: _ClassVar[int] + TYPINGSPEED_FIELD_NUMBER: _ClassVar[int] + text: bytes + typingSpeedValue: TypingSpeedValue + typingSpeed: int + def __init__(self, text: _Optional[bytes] = ..., typingSpeedValue: _Optional[_Union[TypingSpeedValue, str]] = ..., typingSpeed: _Optional[int] = ...) -> None: ... + +class ActionParameters_RunCommand(_message.Message): + __slots__ = ("command", "timeoutInMilliseconds") + COMMAND_FIELD_NUMBER: _ClassVar[int] + TIMEOUTINMILLISECONDS_FIELD_NUMBER: _ClassVar[int] + command: str + timeoutInMilliseconds: int + def __init__(self, command: _Optional[str] = ..., timeoutInMilliseconds: _Optional[int] = ...) -> None: ... + +class ActionParameters(_message.Message): + __slots__ = ("none", "wait", "mouseButtonPress", "mouseButtonRelease", "mouseButtonPressAndRelease", "mouseWheelScroll", "mouseMove", "mouseMoveDelta", "keyboardKeyPress", "keyboardKeyRelease", "keyboardKeyPressAndRelease", "keyboardKeysPress", "keyboardKeysRelease", "keyboardKeysPressAndRelease", "keyboardTypeText", "keyboardTypeUnicodeText", "runcommand") + NONE_FIELD_NUMBER: _ClassVar[int] + WAIT_FIELD_NUMBER: _ClassVar[int] + MOUSEBUTTONPRESS_FIELD_NUMBER: _ClassVar[int] + MOUSEBUTTONRELEASE_FIELD_NUMBER: _ClassVar[int] + MOUSEBUTTONPRESSANDRELEASE_FIELD_NUMBER: _ClassVar[int] + MOUSEWHEELSCROLL_FIELD_NUMBER: _ClassVar[int] + MOUSEMOVE_FIELD_NUMBER: _ClassVar[int] + MOUSEMOVEDELTA_FIELD_NUMBER: _ClassVar[int] + KEYBOARDKEYPRESS_FIELD_NUMBER: _ClassVar[int] + KEYBOARDKEYRELEASE_FIELD_NUMBER: _ClassVar[int] + KEYBOARDKEYPRESSANDRELEASE_FIELD_NUMBER: _ClassVar[int] + KEYBOARDKEYSPRESS_FIELD_NUMBER: _ClassVar[int] + KEYBOARDKEYSRELEASE_FIELD_NUMBER: _ClassVar[int] + KEYBOARDKEYSPRESSANDRELEASE_FIELD_NUMBER: _ClassVar[int] + KEYBOARDTYPETEXT_FIELD_NUMBER: _ClassVar[int] + KEYBOARDTYPEUNICODETEXT_FIELD_NUMBER: _ClassVar[int] + RUNCOMMAND_FIELD_NUMBER: _ClassVar[int] + none: Void + wait: ActionParameters_Wait + mouseButtonPress: ActionParameters_MouseButton_Press + mouseButtonRelease: ActionParameters_MouseButton_Release + mouseButtonPressAndRelease: ActionParameters_MouseButton_PressAndRelease + mouseWheelScroll: ActionParameters_MouseWheelScroll + mouseMove: ActionParameters_MouseMove + mouseMoveDelta: ActionParameters_MouseMove_Delta + keyboardKeyPress: ActionParameters_KeyboardKey_Press + keyboardKeyRelease: ActionParameters_KeyboardKey_Release + keyboardKeyPressAndRelease: ActionParameters_KeyboardKey_PressAndRelease + keyboardKeysPress: ActionParameters_KeyboardKeys_Press + keyboardKeysRelease: ActionParameters_KeyboardKeys_Release + keyboardKeysPressAndRelease: ActionParameters_KeyboardKeys_PressAndRelease + keyboardTypeText: ActionParameters_KeyboardType_Text + keyboardTypeUnicodeText: ActionParameters_KeyboardType_UnicodeText + runcommand: ActionParameters_RunCommand + def __init__(self, none: _Optional[_Union[Void, _Mapping]] = ..., wait: _Optional[_Union[ActionParameters_Wait, _Mapping]] = ..., mouseButtonPress: _Optional[_Union[ActionParameters_MouseButton_Press, _Mapping]] = ..., mouseButtonRelease: _Optional[_Union[ActionParameters_MouseButton_Release, _Mapping]] = ..., mouseButtonPressAndRelease: _Optional[_Union[ActionParameters_MouseButton_PressAndRelease, _Mapping]] = ..., mouseWheelScroll: _Optional[_Union[ActionParameters_MouseWheelScroll, _Mapping]] = ..., mouseMove: _Optional[_Union[ActionParameters_MouseMove, _Mapping]] = ..., mouseMoveDelta: _Optional[_Union[ActionParameters_MouseMove_Delta, _Mapping]] = ..., keyboardKeyPress: _Optional[_Union[ActionParameters_KeyboardKey_Press, _Mapping]] = ..., keyboardKeyRelease: _Optional[_Union[ActionParameters_KeyboardKey_Release, _Mapping]] = ..., keyboardKeyPressAndRelease: _Optional[_Union[ActionParameters_KeyboardKey_PressAndRelease, _Mapping]] = ..., keyboardKeysPress: _Optional[_Union[ActionParameters_KeyboardKeys_Press, _Mapping]] = ..., keyboardKeysRelease: _Optional[_Union[ActionParameters_KeyboardKeys_Release, _Mapping]] = ..., keyboardKeysPressAndRelease: _Optional[_Union[ActionParameters_KeyboardKeys_PressAndRelease, _Mapping]] = ..., keyboardTypeText: _Optional[_Union[ActionParameters_KeyboardType_Text, _Mapping]] = ..., keyboardTypeUnicodeText: _Optional[_Union[ActionParameters_KeyboardType_UnicodeText, _Mapping]] = ..., runcommand: _Optional[_Union[ActionParameters_RunCommand, _Mapping]] = ...) -> None: ... + +class Request_StartSession(_message.Message): + __slots__ = ("sessionGUID", "immediateExecution") + SESSIONGUID_FIELD_NUMBER: _ClassVar[int] + IMMEDIATEEXECUTION_FIELD_NUMBER: _ClassVar[int] + sessionGUID: str + immediateExecution: bool + def __init__(self, sessionGUID: _Optional[str] = ..., immediateExecution: bool = ...) -> None: ... + +class Response_StartSession(_message.Message): + __slots__ = ("sessionInfo",) + SESSIONINFO_FIELD_NUMBER: _ClassVar[int] + sessionInfo: SessionInfo + def __init__(self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ...) -> None: ... + +class Request_EndSession(_message.Message): + __slots__ = ("sessionInfo",) + SESSIONINFO_FIELD_NUMBER: _ClassVar[int] + sessionInfo: SessionInfo + def __init__(self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ...) -> None: ... + +class Request_Send(_message.Message): + __slots__ = ("message",) + MESSAGE_FIELD_NUMBER: _ClassVar[int] + message: str + def __init__(self, message: _Optional[str] = ...) -> None: ... + +class Request_Poll(_message.Message): + __slots__ = ("sessionInfo", "pollEventID") + SESSIONINFO_FIELD_NUMBER: _ClassVar[int] + POLLEVENTID_FIELD_NUMBER: _ClassVar[int] + sessionInfo: SessionInfo + pollEventID: PollEventID + def __init__(self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ..., pollEventID: _Optional[_Union[PollEventID, str]] = ...) -> None: ... + +class Request_StartExecution(_message.Message): + __slots__ = ("sessionInfo",) + SESSIONINFO_FIELD_NUMBER: _ClassVar[int] + sessionInfo: SessionInfo + def __init__(self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ...) -> None: ... + +class Request_StopExecution(_message.Message): + __slots__ = ("sessionInfo",) + SESSIONINFO_FIELD_NUMBER: _ClassVar[int] + sessionInfo: SessionInfo + def __init__(self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ...) -> None: ... + +class Response_Send(_message.Message): + __slots__ = ("message",) + MESSAGE_FIELD_NUMBER: _ClassVar[int] + message: str + def __init__(self, message: _Optional[str] = ...) -> None: ... + +class Response_Poll(_message.Message): + __slots__ = ("pollEventID", "pollEventParameters") + POLLEVENTID_FIELD_NUMBER: _ClassVar[int] + POLLEVENTPARAMETERS_FIELD_NUMBER: _ClassVar[int] + pollEventID: PollEventID + pollEventParameters: PollEventParameters + def __init__(self, pollEventID: _Optional[_Union[PollEventID, str]] = ..., pollEventParameters: _Optional[_Union[PollEventParameters, _Mapping]] = ...) -> None: ... + +class Request_RunRecordedAction(_message.Message): + __slots__ = ("sessionInfo", "actionClassID", "actionParameters") + SESSIONINFO_FIELD_NUMBER: _ClassVar[int] + ACTIONCLASSID_FIELD_NUMBER: _ClassVar[int] + ACTIONPARAMETERS_FIELD_NUMBER: _ClassVar[int] + sessionInfo: SessionInfo + actionClassID: ActionClassID + actionParameters: ActionParameters + def __init__(self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ..., actionClassID: _Optional[_Union[ActionClassID, str]] = ..., actionParameters: _Optional[_Union[ActionParameters, _Mapping]] = ...) -> None: ... + +class Response_RunRecordedAction(_message.Message): + __slots__ = ("actionID", "requiredMilliseconds") + ACTIONID_FIELD_NUMBER: _ClassVar[int] + REQUIREDMILLISECONDS_FIELD_NUMBER: _ClassVar[int] + actionID: int + requiredMilliseconds: int + def __init__(self, actionID: _Optional[int] = ..., requiredMilliseconds: _Optional[int] = ...) -> None: ... + +class Request_ScheduleBatchedAction(_message.Message): + __slots__ = ("sessionInfo", "actionClassID", "actionParameters") + SESSIONINFO_FIELD_NUMBER: _ClassVar[int] + ACTIONCLASSID_FIELD_NUMBER: _ClassVar[int] + ACTIONPARAMETERS_FIELD_NUMBER: _ClassVar[int] + sessionInfo: SessionInfo + actionClassID: ActionClassID + actionParameters: ActionParameters + def __init__(self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ..., actionClassID: _Optional[_Union[ActionClassID, str]] = ..., actionParameters: _Optional[_Union[ActionParameters, _Mapping]] = ...) -> None: ... + +class Response_ScheduleBatchedAction(_message.Message): + __slots__ = ("actionID",) + ACTIONID_FIELD_NUMBER: _ClassVar[int] + actionID: int + def __init__(self, actionID: _Optional[int] = ...) -> None: ... + +class Request_GetActionCount(_message.Message): + __slots__ = ("sessionInfo",) + SESSIONINFO_FIELD_NUMBER: _ClassVar[int] + sessionInfo: SessionInfo + def __init__(self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ...) -> None: ... + +class Response_GetActionCount(_message.Message): + __slots__ = ("actionCount",) + ACTIONCOUNT_FIELD_NUMBER: _ClassVar[int] + actionCount: int + def __init__(self, actionCount: _Optional[int] = ...) -> None: ... + +class Request_GetAction(_message.Message): + __slots__ = ("sessionInfo", "actionIndex") + SESSIONINFO_FIELD_NUMBER: _ClassVar[int] + ACTIONINDEX_FIELD_NUMBER: _ClassVar[int] + sessionInfo: SessionInfo + actionIndex: int + def __init__(self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ..., actionIndex: _Optional[int] = ...) -> None: ... + +class Response_GetAction(_message.Message): + __slots__ = ("actionID", "actionClassID", "actionParameters") + ACTIONID_FIELD_NUMBER: _ClassVar[int] + ACTIONCLASSID_FIELD_NUMBER: _ClassVar[int] + ACTIONPARAMETERS_FIELD_NUMBER: _ClassVar[int] + actionID: int + actionClassID: ActionClassID + actionParameters: ActionParameters + def __init__(self, actionID: _Optional[int] = ..., actionClassID: _Optional[_Union[ActionClassID, str]] = ..., actionParameters: _Optional[_Union[ActionParameters, _Mapping]] = ...) -> None: ... + +class Request_RemoveAction(_message.Message): + __slots__ = ("sessionInfo", "actionID") + SESSIONINFO_FIELD_NUMBER: _ClassVar[int] + ACTIONID_FIELD_NUMBER: _ClassVar[int] + sessionInfo: SessionInfo + actionID: int + def __init__(self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ..., actionID: _Optional[int] = ...) -> None: ... + +class Request_RemoveAllActions(_message.Message): + __slots__ = ("sessionInfo",) + SESSIONINFO_FIELD_NUMBER: _ClassVar[int] + sessionInfo: SessionInfo + def __init__(self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ...) -> None: ... + +class Request_StartBatchRun(_message.Message): + __slots__ = ("sessionInfo",) + SESSIONINFO_FIELD_NUMBER: _ClassVar[int] + sessionInfo: SessionInfo + def __init__(self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ...) -> None: ... + +class Request_StopBatchRun(_message.Message): + __slots__ = ("sessionInfo",) + SESSIONINFO_FIELD_NUMBER: _ClassVar[int] + sessionInfo: SessionInfo + def __init__(self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ...) -> None: ... + +class Request_CaptureScreen(_message.Message): + __slots__ = ("sessionInfo", "captureParameters") + SESSIONINFO_FIELD_NUMBER: _ClassVar[int] + CAPTUREPARAMETERS_FIELD_NUMBER: _ClassVar[int] + sessionInfo: SessionInfo + captureParameters: CaptureParameters + def __init__(self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ..., captureParameters: _Optional[_Union[CaptureParameters, _Mapping]] = ...) -> None: ... + +class Response_CaptureScreen(_message.Message): + __slots__ = ("bitmap",) + BITMAP_FIELD_NUMBER: _ClassVar[int] + bitmap: Bitmap + def __init__(self, bitmap: _Optional[_Union[Bitmap, _Mapping]] = ...) -> None: ... + +class Response_GetContinuousCapturedScreen(_message.Message): + __slots__ = ("bitmap",) + BITMAP_FIELD_NUMBER: _ClassVar[int] + bitmap: Bitmap + def __init__(self, bitmap: _Optional[_Union[Bitmap, _Mapping]] = ...) -> None: ... + +class Reuqest_SetTestConfiguration(_message.Message): + __slots__ = ("sessionInfo", "defaultCaptureParameters", "mouseDelayInMilliseconds", "keyboardDelayInMilliseconds") + SESSIONINFO_FIELD_NUMBER: _ClassVar[int] + DEFAULTCAPTUREPARAMETERS_FIELD_NUMBER: _ClassVar[int] + MOUSEDELAYINMILLISECONDS_FIELD_NUMBER: _ClassVar[int] + KEYBOARDDELAYINMILLISECONDS_FIELD_NUMBER: _ClassVar[int] + sessionInfo: SessionInfo + defaultCaptureParameters: CaptureParameters + mouseDelayInMilliseconds: int + keyboardDelayInMilliseconds: int + def __init__(self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ..., defaultCaptureParameters: _Optional[_Union[CaptureParameters, _Mapping]] = ..., mouseDelayInMilliseconds: _Optional[int] = ..., keyboardDelayInMilliseconds: _Optional[int] = ...) -> None: ... + +class Request_SetMouseDelay(_message.Message): + __slots__ = ("sessionInfo", "delayInMilliseconds") + SESSIONINFO_FIELD_NUMBER: _ClassVar[int] + DELAYINMILLISECONDS_FIELD_NUMBER: _ClassVar[int] + sessionInfo: SessionInfo + delayInMilliseconds: int + def __init__(self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ..., delayInMilliseconds: _Optional[int] = ...) -> None: ... + +class Request_SetKeyboardDelay(_message.Message): + __slots__ = ("sessionInfo", "delayInMilliseconds") + SESSIONINFO_FIELD_NUMBER: _ClassVar[int] + DELAYINMILLISECONDS_FIELD_NUMBER: _ClassVar[int] + sessionInfo: SessionInfo + delayInMilliseconds: int + def __init__(self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ..., delayInMilliseconds: _Optional[int] = ...) -> None: ... + +class DisplayInformation(_message.Message): + __slots__ = ("displayID", "name", "sizeInPixels", "virtualScreenRectangle") + DISPLAYID_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + SIZEINPIXELS_FIELD_NUMBER: _ClassVar[int] + VIRTUALSCREENRECTANGLE_FIELD_NUMBER: _ClassVar[int] + displayID: int + name: str + sizeInPixels: Size2 + virtualScreenRectangle: Rectangle + def __init__(self, displayID: _Optional[int] = ..., name: _Optional[str] = ..., sizeInPixels: _Optional[_Union[Size2, _Mapping]] = ..., virtualScreenRectangle: _Optional[_Union[Rectangle, _Mapping]] = ...) -> None: ... + +class Response_GetDisplayInformation(_message.Message): + __slots__ = ("displays", "virtualScreenRectangle") + DISPLAYS_FIELD_NUMBER: _ClassVar[int] + VIRTUALSCREENRECTANGLE_FIELD_NUMBER: _ClassVar[int] + displays: _containers.RepeatedCompositeFieldContainer[DisplayInformation] + virtualScreenRectangle: Rectangle + def __init__(self, displays: _Optional[_Iterable[_Union[DisplayInformation, _Mapping]]] = ..., virtualScreenRectangle: _Optional[_Union[Rectangle, _Mapping]] = ...) -> None: ... + +class Response_GetMousePosition(_message.Message): + __slots__ = ("x", "y") + X_FIELD_NUMBER: _ClassVar[int] + Y_FIELD_NUMBER: _ClassVar[int] + x: int + y: int + def __init__(self, x: _Optional[int] = ..., y: _Optional[int] = ...) -> None: ... + +class ProcessInfoExtended(_message.Message): + __slots__ = ("hasWindow",) + HASWINDOW_FIELD_NUMBER: _ClassVar[int] + hasWindow: bool + def __init__(self, hasWindow: bool = ...) -> None: ... + +class ProcessInfo(_message.Message): + __slots__ = ("ID", "name", "extendedInfo") + ID_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + EXTENDEDINFO_FIELD_NUMBER: _ClassVar[int] + ID: int + name: str + extendedInfo: ProcessInfoExtended + def __init__(self, ID: _Optional[int] = ..., name: _Optional[str] = ..., extendedInfo: _Optional[_Union[ProcessInfoExtended, _Mapping]] = ...) -> None: ... + +class Request_GetProcessList(_message.Message): + __slots__ = ("getExtendedInfo",) + GETEXTENDEDINFO_FIELD_NUMBER: _ClassVar[int] + getExtendedInfo: bool + def __init__(self, getExtendedInfo: bool = ...) -> None: ... + +class Response_GetProcessList(_message.Message): + __slots__ = ("processes",) + PROCESSES_FIELD_NUMBER: _ClassVar[int] + processes: _containers.RepeatedCompositeFieldContainer[ProcessInfo] + def __init__(self, processes: _Optional[_Iterable[_Union[ProcessInfo, _Mapping]]] = ...) -> None: ... + +class Request_GetWindowList(_message.Message): + __slots__ = ("processID",) + PROCESSID_FIELD_NUMBER: _ClassVar[int] + processID: int + def __init__(self, processID: _Optional[int] = ...) -> None: ... + +class WindowInfo(_message.Message): + __slots__ = ("ID", "name") + ID_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + ID: int + name: str + def __init__(self, ID: _Optional[int] = ..., name: _Optional[str] = ...) -> None: ... + +class Response_GetWindowList(_message.Message): + __slots__ = ("windows",) + WINDOWS_FIELD_NUMBER: _ClassVar[int] + windows: _containers.RepeatedCompositeFieldContainer[WindowInfo] + def __init__(self, windows: _Optional[_Iterable[_Union[WindowInfo, _Mapping]]] = ...) -> None: ... + +class Request_SetActiveDisplay(_message.Message): + __slots__ = ("displayID",) + DISPLAYID_FIELD_NUMBER: _ClassVar[int] + displayID: int + def __init__(self, displayID: _Optional[int] = ...) -> None: ... + +class Request_SetActiveWindow(_message.Message): + __slots__ = ("processID", "windowID") + PROCESSID_FIELD_NUMBER: _ClassVar[int] + WINDOWID_FIELD_NUMBER: _ClassVar[int] + processID: int + windowID: int + def __init__(self, processID: _Optional[int] = ..., windowID: _Optional[int] = ...) -> None: ... + +class AutomationTarget(_message.Message): + __slots__ = ("ID", "type", "name", "active") + ID_FIELD_NUMBER: _ClassVar[int] + TYPE_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + ACTIVE_FIELD_NUMBER: _ClassVar[int] + ID: int + type: AutomationTargetType + name: str + active: bool + def __init__(self, ID: _Optional[int] = ..., type: _Optional[_Union[AutomationTargetType, str]] = ..., name: _Optional[str] = ..., active: bool = ...) -> None: ... + +class Response_GetAutomationTargetList(_message.Message): + __slots__ = ("targets",) + TARGETS_FIELD_NUMBER: _ClassVar[int] + targets: _containers.RepeatedCompositeFieldContainer[AutomationTarget] + def __init__(self, targets: _Optional[_Iterable[_Union[AutomationTarget, _Mapping]]] = ...) -> None: ... + +class Request_SetActiveAutomationTarget(_message.Message): + __slots__ = ("ID",) + ID_FIELD_NUMBER: _ClassVar[int] + ID: int + def __init__(self, ID: _Optional[int] = ...) -> None: ... + +class Request_GetColor(_message.Message): + __slots__ = ("x", "y", "bitmap") + X_FIELD_NUMBER: _ClassVar[int] + Y_FIELD_NUMBER: _ClassVar[int] + BITMAP_FIELD_NUMBER: _ClassVar[int] + x: int + y: int + bitmap: Bitmap + def __init__(self, x: _Optional[int] = ..., y: _Optional[int] = ..., bitmap: _Optional[_Union[Bitmap, _Mapping]] = ...) -> None: ... + +class Response_GetColor(_message.Message): + __slots__ = ("color",) + COLOR_FIELD_NUMBER: _ClassVar[int] + color: Color + def __init__(self, color: _Optional[_Union[Color, _Mapping]] = ...) -> None: ... + +class Request_GetPixelColor(_message.Message): + __slots__ = ("x", "y") + X_FIELD_NUMBER: _ClassVar[int] + Y_FIELD_NUMBER: _ClassVar[int] + x: int + y: int + def __init__(self, x: _Optional[int] = ..., y: _Optional[int] = ...) -> None: ... + +class Response_GetPixelColor(_message.Message): + __slots__ = ("color",) + COLOR_FIELD_NUMBER: _ClassVar[int] + color: Color + def __init__(self, color: _Optional[_Union[Color, _Mapping]] = ...) -> None: ... + +class Request_SetDisplayLabel(_message.Message): + __slots__ = ("sessionInfo", "displayID", "label") + SESSIONINFO_FIELD_NUMBER: _ClassVar[int] + DISPLAYID_FIELD_NUMBER: _ClassVar[int] + LABEL_FIELD_NUMBER: _ClassVar[int] + sessionInfo: SessionInfo + displayID: int + label: str + def __init__(self, sessionInfo: _Optional[_Union[SessionInfo, _Mapping]] = ..., displayID: _Optional[int] = ..., label: _Optional[str] = ...) -> None: ... diff --git a/src/askui/tools/askui/askui_ui_controller_grpc/generated/Controller_V1_pb2_grpc.py b/src/askui/tools/askui/askui_ui_controller_grpc/generated/Controller_V1_pb2_grpc.py new file mode 100644 index 00000000..5e36a40c --- /dev/null +++ b/src/askui/tools/askui/askui_ui_controller_grpc/generated/Controller_V1_pb2_grpc.py @@ -0,0 +1,1313 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + +from . import Controller_V1_pb2 as Controller__V1__pb2 + +GRPC_GENERATED_VERSION = '1.71.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + f' but the generated code in Controller_V1_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) + + +class ControllerAPIStub(object): + """Missing associated documentation comment in .proto file.""" + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.StartSession = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/StartSession', + request_serializer=Controller__V1__pb2.Request_StartSession.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_StartSession.FromString, + _registered_method=True) + self.EndSession = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/EndSession', + request_serializer=Controller__V1__pb2.Request_EndSession.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_Void.FromString, + _registered_method=True) + self.Send = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/Send', + request_serializer=Controller__V1__pb2.Request_Send.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_Send.FromString, + _registered_method=True) + self.Poll = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/Poll', + request_serializer=Controller__V1__pb2.Request_Poll.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_Poll.FromString, + _registered_method=True) + self.StartExecution = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/StartExecution', + request_serializer=Controller__V1__pb2.Request_StartExecution.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_Void.FromString, + _registered_method=True) + self.StopExecution = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/StopExecution', + request_serializer=Controller__V1__pb2.Request_StopExecution.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_Void.FromString, + _registered_method=True) + self.RunRecordedAction = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/RunRecordedAction', + request_serializer=Controller__V1__pb2.Request_RunRecordedAction.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_RunRecordedAction.FromString, + _registered_method=True) + self.ScheduleBatchedAction = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/ScheduleBatchedAction', + request_serializer=Controller__V1__pb2.Request_ScheduleBatchedAction.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_ScheduleBatchedAction.FromString, + _registered_method=True) + self.StartBatchRun = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/StartBatchRun', + request_serializer=Controller__V1__pb2.Request_StartBatchRun.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_Void.FromString, + _registered_method=True) + self.StopBatchRun = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/StopBatchRun', + request_serializer=Controller__V1__pb2.Request_StopBatchRun.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_Void.FromString, + _registered_method=True) + self.GetActionCount = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/GetActionCount', + request_serializer=Controller__V1__pb2.Request_GetActionCount.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_GetActionCount.FromString, + _registered_method=True) + self.GetAction = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/GetAction', + request_serializer=Controller__V1__pb2.Request_GetAction.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_GetAction.FromString, + _registered_method=True) + self.RemoveAction = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/RemoveAction', + request_serializer=Controller__V1__pb2.Request_RemoveAction.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_Void.FromString, + _registered_method=True) + self.RemoveAllActions = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/RemoveAllActions', + request_serializer=Controller__V1__pb2.Request_RemoveAllActions.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_Void.FromString, + _registered_method=True) + self.CaptureScreen = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/CaptureScreen', + request_serializer=Controller__V1__pb2.Request_CaptureScreen.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_CaptureScreen.FromString, + _registered_method=True) + self.SetTestConfiguration = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/SetTestConfiguration', + request_serializer=Controller__V1__pb2.Reuqest_SetTestConfiguration.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_Void.FromString, + _registered_method=True) + self.SetMouseDelay = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/SetMouseDelay', + request_serializer=Controller__V1__pb2.Request_SetMouseDelay.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_Void.FromString, + _registered_method=True) + self.SetKeyboardDelay = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/SetKeyboardDelay', + request_serializer=Controller__V1__pb2.Request_SetKeyboardDelay.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_Void.FromString, + _registered_method=True) + self.GetDisplayInformation = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/GetDisplayInformation', + request_serializer=Controller__V1__pb2.Request_Void.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_GetDisplayInformation.FromString, + _registered_method=True) + self.GetMousePosition = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/GetMousePosition', + request_serializer=Controller__V1__pb2.Request_Void.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_GetMousePosition.FromString, + _registered_method=True) + self.GetProcessList = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/GetProcessList', + request_serializer=Controller__V1__pb2.Request_GetProcessList.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_GetProcessList.FromString, + _registered_method=True) + self.GetWindowList = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/GetWindowList', + request_serializer=Controller__V1__pb2.Request_GetWindowList.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_GetWindowList.FromString, + _registered_method=True) + self.GetAutomationTargetList = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/GetAutomationTargetList', + request_serializer=Controller__V1__pb2.Request_Void.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_GetAutomationTargetList.FromString, + _registered_method=True) + self.SetActiveDisplay = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/SetActiveDisplay', + request_serializer=Controller__V1__pb2.Request_SetActiveDisplay.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_Void.FromString, + _registered_method=True) + self.SetActiveWindow = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/SetActiveWindow', + request_serializer=Controller__V1__pb2.Request_SetActiveWindow.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_Void.FromString, + _registered_method=True) + self.SetActiveAutomationTarget = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/SetActiveAutomationTarget', + request_serializer=Controller__V1__pb2.Request_SetActiveAutomationTarget.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_Void.FromString, + _registered_method=True) + self.GetColor = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/GetColor', + request_serializer=Controller__V1__pb2.Request_GetColor.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_GetColor.FromString, + _registered_method=True) + self.GetPixelColor = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/GetPixelColor', + request_serializer=Controller__V1__pb2.Request_GetPixelColor.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_GetPixelColor.FromString, + _registered_method=True) + self.SetDisplayLabel = channel.unary_unary( + '/Askui.API.TDKv1.ControllerAPI/SetDisplayLabel', + request_serializer=Controller__V1__pb2.Request_SetDisplayLabel.SerializeToString, + response_deserializer=Controller__V1__pb2.Response_Void.FromString, + _registered_method=True) + + +class ControllerAPIServicer(object): + """Missing associated documentation comment in .proto file.""" + + def StartSession(self, request, context): + """General + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def EndSession(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Send(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Poll(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def StartExecution(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def StopExecution(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RunRecordedAction(self, request, context): + """Run action and record it + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ScheduleBatchedAction(self, request, context): + """Schedule an action + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def StartBatchRun(self, request, context): + """Start and stop batched execution + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def StopBatchRun(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetActionCount(self, request, context): + """Recorded or batched actions access + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetAction(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RemoveAction(self, request, context): + """Modify actions batch + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RemoveAllActions(self, request, context): + """Clear all batched or recorded actions + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CaptureScreen(self, request, context): + """Capturing + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetTestConfiguration(self, request, context): + """Configuration + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetMouseDelay(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetKeyboardDelay(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetDisplayInformation(self, request, context): + """Device Information + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetMousePosition(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetProcessList(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetWindowList(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetAutomationTargetList(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetActiveDisplay(self, request, context): + """Device Configuration + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetActiveWindow(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetActiveAutomationTarget(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetColor(self, request, context): + """Deprecated Utilities + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetPixelColor(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetDisplayLabel(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_ControllerAPIServicer_to_server(servicer, server): + rpc_method_handlers = { + 'StartSession': grpc.unary_unary_rpc_method_handler( + servicer.StartSession, + request_deserializer=Controller__V1__pb2.Request_StartSession.FromString, + response_serializer=Controller__V1__pb2.Response_StartSession.SerializeToString, + ), + 'EndSession': grpc.unary_unary_rpc_method_handler( + servicer.EndSession, + request_deserializer=Controller__V1__pb2.Request_EndSession.FromString, + response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, + ), + 'Send': grpc.unary_unary_rpc_method_handler( + servicer.Send, + request_deserializer=Controller__V1__pb2.Request_Send.FromString, + response_serializer=Controller__V1__pb2.Response_Send.SerializeToString, + ), + 'Poll': grpc.unary_unary_rpc_method_handler( + servicer.Poll, + request_deserializer=Controller__V1__pb2.Request_Poll.FromString, + response_serializer=Controller__V1__pb2.Response_Poll.SerializeToString, + ), + 'StartExecution': grpc.unary_unary_rpc_method_handler( + servicer.StartExecution, + request_deserializer=Controller__V1__pb2.Request_StartExecution.FromString, + response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, + ), + 'StopExecution': grpc.unary_unary_rpc_method_handler( + servicer.StopExecution, + request_deserializer=Controller__V1__pb2.Request_StopExecution.FromString, + response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, + ), + 'RunRecordedAction': grpc.unary_unary_rpc_method_handler( + servicer.RunRecordedAction, + request_deserializer=Controller__V1__pb2.Request_RunRecordedAction.FromString, + response_serializer=Controller__V1__pb2.Response_RunRecordedAction.SerializeToString, + ), + 'ScheduleBatchedAction': grpc.unary_unary_rpc_method_handler( + servicer.ScheduleBatchedAction, + request_deserializer=Controller__V1__pb2.Request_ScheduleBatchedAction.FromString, + response_serializer=Controller__V1__pb2.Response_ScheduleBatchedAction.SerializeToString, + ), + 'StartBatchRun': grpc.unary_unary_rpc_method_handler( + servicer.StartBatchRun, + request_deserializer=Controller__V1__pb2.Request_StartBatchRun.FromString, + response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, + ), + 'StopBatchRun': grpc.unary_unary_rpc_method_handler( + servicer.StopBatchRun, + request_deserializer=Controller__V1__pb2.Request_StopBatchRun.FromString, + response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, + ), + 'GetActionCount': grpc.unary_unary_rpc_method_handler( + servicer.GetActionCount, + request_deserializer=Controller__V1__pb2.Request_GetActionCount.FromString, + response_serializer=Controller__V1__pb2.Response_GetActionCount.SerializeToString, + ), + 'GetAction': grpc.unary_unary_rpc_method_handler( + servicer.GetAction, + request_deserializer=Controller__V1__pb2.Request_GetAction.FromString, + response_serializer=Controller__V1__pb2.Response_GetAction.SerializeToString, + ), + 'RemoveAction': grpc.unary_unary_rpc_method_handler( + servicer.RemoveAction, + request_deserializer=Controller__V1__pb2.Request_RemoveAction.FromString, + response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, + ), + 'RemoveAllActions': grpc.unary_unary_rpc_method_handler( + servicer.RemoveAllActions, + request_deserializer=Controller__V1__pb2.Request_RemoveAllActions.FromString, + response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, + ), + 'CaptureScreen': grpc.unary_unary_rpc_method_handler( + servicer.CaptureScreen, + request_deserializer=Controller__V1__pb2.Request_CaptureScreen.FromString, + response_serializer=Controller__V1__pb2.Response_CaptureScreen.SerializeToString, + ), + 'SetTestConfiguration': grpc.unary_unary_rpc_method_handler( + servicer.SetTestConfiguration, + request_deserializer=Controller__V1__pb2.Reuqest_SetTestConfiguration.FromString, + response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, + ), + 'SetMouseDelay': grpc.unary_unary_rpc_method_handler( + servicer.SetMouseDelay, + request_deserializer=Controller__V1__pb2.Request_SetMouseDelay.FromString, + response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, + ), + 'SetKeyboardDelay': grpc.unary_unary_rpc_method_handler( + servicer.SetKeyboardDelay, + request_deserializer=Controller__V1__pb2.Request_SetKeyboardDelay.FromString, + response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, + ), + 'GetDisplayInformation': grpc.unary_unary_rpc_method_handler( + servicer.GetDisplayInformation, + request_deserializer=Controller__V1__pb2.Request_Void.FromString, + response_serializer=Controller__V1__pb2.Response_GetDisplayInformation.SerializeToString, + ), + 'GetMousePosition': grpc.unary_unary_rpc_method_handler( + servicer.GetMousePosition, + request_deserializer=Controller__V1__pb2.Request_Void.FromString, + response_serializer=Controller__V1__pb2.Response_GetMousePosition.SerializeToString, + ), + 'GetProcessList': grpc.unary_unary_rpc_method_handler( + servicer.GetProcessList, + request_deserializer=Controller__V1__pb2.Request_GetProcessList.FromString, + response_serializer=Controller__V1__pb2.Response_GetProcessList.SerializeToString, + ), + 'GetWindowList': grpc.unary_unary_rpc_method_handler( + servicer.GetWindowList, + request_deserializer=Controller__V1__pb2.Request_GetWindowList.FromString, + response_serializer=Controller__V1__pb2.Response_GetWindowList.SerializeToString, + ), + 'GetAutomationTargetList': grpc.unary_unary_rpc_method_handler( + servicer.GetAutomationTargetList, + request_deserializer=Controller__V1__pb2.Request_Void.FromString, + response_serializer=Controller__V1__pb2.Response_GetAutomationTargetList.SerializeToString, + ), + 'SetActiveDisplay': grpc.unary_unary_rpc_method_handler( + servicer.SetActiveDisplay, + request_deserializer=Controller__V1__pb2.Request_SetActiveDisplay.FromString, + response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, + ), + 'SetActiveWindow': grpc.unary_unary_rpc_method_handler( + servicer.SetActiveWindow, + request_deserializer=Controller__V1__pb2.Request_SetActiveWindow.FromString, + response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, + ), + 'SetActiveAutomationTarget': grpc.unary_unary_rpc_method_handler( + servicer.SetActiveAutomationTarget, + request_deserializer=Controller__V1__pb2.Request_SetActiveAutomationTarget.FromString, + response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, + ), + 'GetColor': grpc.unary_unary_rpc_method_handler( + servicer.GetColor, + request_deserializer=Controller__V1__pb2.Request_GetColor.FromString, + response_serializer=Controller__V1__pb2.Response_GetColor.SerializeToString, + ), + 'GetPixelColor': grpc.unary_unary_rpc_method_handler( + servicer.GetPixelColor, + request_deserializer=Controller__V1__pb2.Request_GetPixelColor.FromString, + response_serializer=Controller__V1__pb2.Response_GetPixelColor.SerializeToString, + ), + 'SetDisplayLabel': grpc.unary_unary_rpc_method_handler( + servicer.SetDisplayLabel, + request_deserializer=Controller__V1__pb2.Request_SetDisplayLabel.FromString, + response_serializer=Controller__V1__pb2.Response_Void.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'Askui.API.TDKv1.ControllerAPI', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + server.add_registered_method_handlers('Askui.API.TDKv1.ControllerAPI', rpc_method_handlers) + + + # This class is part of an EXPERIMENTAL API. +class ControllerAPI(object): + """Missing associated documentation comment in .proto file.""" + + @staticmethod + def StartSession(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/StartSession', + Controller__V1__pb2.Request_StartSession.SerializeToString, + Controller__V1__pb2.Response_StartSession.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def EndSession(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/EndSession', + Controller__V1__pb2.Request_EndSession.SerializeToString, + Controller__V1__pb2.Response_Void.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def Send(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/Send', + Controller__V1__pb2.Request_Send.SerializeToString, + Controller__V1__pb2.Response_Send.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def Poll(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/Poll', + Controller__V1__pb2.Request_Poll.SerializeToString, + Controller__V1__pb2.Response_Poll.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def StartExecution(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/StartExecution', + Controller__V1__pb2.Request_StartExecution.SerializeToString, + Controller__V1__pb2.Response_Void.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def StopExecution(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/StopExecution', + Controller__V1__pb2.Request_StopExecution.SerializeToString, + Controller__V1__pb2.Response_Void.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def RunRecordedAction(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/RunRecordedAction', + Controller__V1__pb2.Request_RunRecordedAction.SerializeToString, + Controller__V1__pb2.Response_RunRecordedAction.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ScheduleBatchedAction(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/ScheduleBatchedAction', + Controller__V1__pb2.Request_ScheduleBatchedAction.SerializeToString, + Controller__V1__pb2.Response_ScheduleBatchedAction.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def StartBatchRun(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/StartBatchRun', + Controller__V1__pb2.Request_StartBatchRun.SerializeToString, + Controller__V1__pb2.Response_Void.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def StopBatchRun(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/StopBatchRun', + Controller__V1__pb2.Request_StopBatchRun.SerializeToString, + Controller__V1__pb2.Response_Void.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetActionCount(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/GetActionCount', + Controller__V1__pb2.Request_GetActionCount.SerializeToString, + Controller__V1__pb2.Response_GetActionCount.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetAction(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/GetAction', + Controller__V1__pb2.Request_GetAction.SerializeToString, + Controller__V1__pb2.Response_GetAction.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def RemoveAction(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/RemoveAction', + Controller__V1__pb2.Request_RemoveAction.SerializeToString, + Controller__V1__pb2.Response_Void.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def RemoveAllActions(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/RemoveAllActions', + Controller__V1__pb2.Request_RemoveAllActions.SerializeToString, + Controller__V1__pb2.Response_Void.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def CaptureScreen(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/CaptureScreen', + Controller__V1__pb2.Request_CaptureScreen.SerializeToString, + Controller__V1__pb2.Response_CaptureScreen.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def SetTestConfiguration(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/SetTestConfiguration', + Controller__V1__pb2.Reuqest_SetTestConfiguration.SerializeToString, + Controller__V1__pb2.Response_Void.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def SetMouseDelay(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/SetMouseDelay', + Controller__V1__pb2.Request_SetMouseDelay.SerializeToString, + Controller__V1__pb2.Response_Void.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def SetKeyboardDelay(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/SetKeyboardDelay', + Controller__V1__pb2.Request_SetKeyboardDelay.SerializeToString, + Controller__V1__pb2.Response_Void.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetDisplayInformation(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/GetDisplayInformation', + Controller__V1__pb2.Request_Void.SerializeToString, + Controller__V1__pb2.Response_GetDisplayInformation.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetMousePosition(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/GetMousePosition', + Controller__V1__pb2.Request_Void.SerializeToString, + Controller__V1__pb2.Response_GetMousePosition.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetProcessList(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/GetProcessList', + Controller__V1__pb2.Request_GetProcessList.SerializeToString, + Controller__V1__pb2.Response_GetProcessList.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetWindowList(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/GetWindowList', + Controller__V1__pb2.Request_GetWindowList.SerializeToString, + Controller__V1__pb2.Response_GetWindowList.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetAutomationTargetList(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/GetAutomationTargetList', + Controller__V1__pb2.Request_Void.SerializeToString, + Controller__V1__pb2.Response_GetAutomationTargetList.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def SetActiveDisplay(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/SetActiveDisplay', + Controller__V1__pb2.Request_SetActiveDisplay.SerializeToString, + Controller__V1__pb2.Response_Void.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def SetActiveWindow(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/SetActiveWindow', + Controller__V1__pb2.Request_SetActiveWindow.SerializeToString, + Controller__V1__pb2.Response_Void.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def SetActiveAutomationTarget(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/SetActiveAutomationTarget', + Controller__V1__pb2.Request_SetActiveAutomationTarget.SerializeToString, + Controller__V1__pb2.Response_Void.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetColor(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/GetColor', + Controller__V1__pb2.Request_GetColor.SerializeToString, + Controller__V1__pb2.Response_GetColor.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetPixelColor(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/GetPixelColor', + Controller__V1__pb2.Request_GetPixelColor.SerializeToString, + Controller__V1__pb2.Response_GetPixelColor.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def SetDisplayLabel(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/Askui.API.TDKv1.ControllerAPI/SetDisplayLabel', + Controller__V1__pb2.Request_SetDisplayLabel.SerializeToString, + Controller__V1__pb2.Response_Void.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) diff --git a/src/askui/tools/askui/askui_ui_controller_grpc/readme.md b/src/askui/tools/askui/askui_ui_controller_grpc/readme.md new file mode 100644 index 00000000..294c4aa9 --- /dev/null +++ b/src/askui/tools/askui/askui_ui_controller_grpc/readme.md @@ -0,0 +1,19 @@ +## 1) Generate code +```bash +python -m grpc_tools.protoc \ +-I src/askui/tools/askui/askui_ui_controller_grpc/proto \ +--python_out=src/askui/tools/askui/askui_ui_controller_grpc/generated \ +--pyi_out=src/askui/tools/askui/askui_ui_controller_grpc/generated \ +--grpc_python_out=src/askui/tools/askui/askui_ui_controller_grpc/generated \ +src/askui/tools/askui/askui_ui_controller_grpc/proto/* +``` + + +## 2) Fix import +Because of [this issue](https://github.com/protocolbuffers/protobuf/issues/1491) following change is required in `Controller_V1_pb2_grpc.py` after generating the code. + +```diff +- import Controller_V1_pb2 as Controller__V1__pb2 ++ from . import Controller_V1_pb2 as Controller__V1__pb2 +``` + From ffbd2269d757b50e8f92b30987fb54f2eeb87840 Mon Sep 17 00:00:00 2001 From: onur-askui <210008309+onur-askui@users.noreply.github.com> Date: Tue, 15 Jul 2025 09:00:35 +0200 Subject: [PATCH 04/21] feat: feat update `askui_controller` --- src/askui/tools/askui/askui_controller.py | 485 ++++++++++++++++++++++ 1 file changed, 485 insertions(+) diff --git a/src/askui/tools/askui/askui_controller.py b/src/askui/tools/askui/askui_controller.py index a723ef20..824b55e8 100644 --- a/src/askui/tools/askui/askui_controller.py +++ b/src/askui/tools/askui/askui_controller.py @@ -404,6 +404,7 @@ def screenshot(self, report: bool = True) -> Image.Image: Returns: Image.Image: A PIL Image object containing the screenshot. + """ assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( "Stub is not initialized" @@ -724,3 +725,487 @@ def run_command(self, command: str, timeout_ms: int = 30000) -> None: ) ), ) + + @telemetry.record_call() + def get_display_information( + self, + ) -> controller_v1_pbs.Response_GetDisplayInformation: + """ + Get information about all available displays and virtual screen. + + Returns: + controller_v1_pbs.Response_GetDisplayInformation: + - displays: List of DisplayInformation objects + - virtualScreenRectangle: Overall virtual screen bounds + + Raises: + AssertionError: If the gRPC stub is not initialized. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + + self._reporter.add_message("AgentOS", "get_display_information()") + + response: controller_v1_pbs.Response_GetDisplayInformation = ( + self._stub.GetDisplayInformation(controller_v1_pbs.Request_Void()) + ) + + return response + + @telemetry.record_call() + def get_mouse_position(self) -> controller_v1_pbs.Response_GetMousePosition: + """ + Get the current mouse cursor position. + + Returns: + controller_v1_pbs.Response_GetMousePosition: Mouse position containing: + - x: Horizontal coordinate + - y: Vertical coordinate + + Raises: + AssertionError: If the gRPC stub is not initialized. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + + self._reporter.add_message("AgentOS", "get_mouse_position()") + + response: controller_v1_pbs.Response_GetMousePosition = ( + self._stub.GetMousePosition(controller_v1_pbs.Request_Void()) + ) + + return response + + @telemetry.record_call() + def get_process_list( + self, get_extended_info: bool = False + ) -> controller_v1_pbs.Response_GetProcessList: + """ + Get a list of running processes. + + Args: + get_extended_info (bool, optional): Whether to include + extended process information. + Defaults to False. + + Returns: + controller_v1_pbs.Response_GetProcessList: Process list response containing: + - processes: List of ProcessInfo objects + + Raises: + AssertionError: If the gRPC stub is not initialized. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + + self._reporter.add_message("AgentOS", f"get_process_list({get_extended_info})") + + response: controller_v1_pbs.Response_GetProcessList = self._stub.GetProcessList( + controller_v1_pbs.Request_GetProcessList(getExtendedInfo=get_extended_info) + ) + + return response + + @telemetry.record_call() + def get_window_list( + self, process_id: int + ) -> controller_v1_pbs.Response_GetWindowList: + """ + Get a list of windows for a specific process. + + Args: + process_id (int): The ID of the process to get windows for. + + Returns: + controller_v1_pbs.Response_GetWindowList: Window list response containing: + - windows: List of WindowInfo objects with ID and name + + Raises: + AssertionError: If the gRPC stub is not initialized. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + + self._reporter.add_message("AgentOS", f"get_window_list({process_id})") + + response: controller_v1_pbs.Response_GetWindowList = self._stub.GetWindowList( + controller_v1_pbs.Request_GetWindowList(processID=process_id) + ) + + return response + + @telemetry.record_call() + def get_automation_target_list( + self, + ) -> controller_v1_pbs.Response_GetAutomationTargetList: + """ + Get a list of available automation targets. + + Returns: + controller_v1_pbs.Response_GetAutomationTargetList: + Automation target list response: + - targets: List of AutomationTarget objects + + Raises: + AssertionError: If the gRPC stub is not initialized. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + + self._reporter.add_message("AgentOS", "get_automation_target_list()") + + response: controller_v1_pbs.Response_GetAutomationTargetList = ( + self._stub.GetAutomationTargetList(controller_v1_pbs.Request_Void()) + ) + + return response + + @telemetry.record_call() + def set_test_configuration( + self, + default_capture_parameters: controller_v1_pbs.CaptureParameters | None = None, + mouse_delay_ms: int = 0, + keyboard_delay_ms: int = 0, + ) -> None: + """ + Configure test settings including default capture parameters and delays. + + Args: + default_capture_parameters + (controller_v1_pbs.CaptureParameters | None, optional): + Default capture parameters with displayID and captureArea. + Defaults to None. + mouse_delay_ms (int, optional): Mouse delay in milliseconds. Defaults to 0. + keyboard_delay_ms (int, optional): Keyboard delay in milliseconds. + Defaults to 0. + + Raises: + AssertionError: If the gRPC stub is not initialized. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + + self._reporter.add_message( + "AgentOS", + f"set_test_configuration(" + f"{default_capture_parameters}, " + f"{mouse_delay_ms}, " + f"{keyboard_delay_ms})", + ) + + # Use provided capture parameters or create empty one + capture_params = ( + default_capture_parameters or controller_v1_pbs.CaptureParameters() + ) + + self._stub.SetTestConfiguration( + controller_v1_pbs.Reuqest_SetTestConfiguration( + sessionInfo=self._session_info, + defaultCaptureParameters=capture_params, + mouseDelayInMilliseconds=mouse_delay_ms, + keyboardDelayInMilliseconds=keyboard_delay_ms, + ) + ) + + @telemetry.record_call() + def set_mouse_delay(self, delay_ms: int) -> None: + """ + Configure mouse action delay. + + Args: + delay_ms (int): The delay in milliseconds to set for mouse actions. + + Raises: + AssertionError: If the gRPC stub is not initialized. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + + self._reporter.add_message("AgentOS", f"set_mouse_delay({delay_ms})") + + self._stub.SetMouseDelay( + controller_v1_pbs.Request_SetMouseDelay( + sessionInfo=self._session_info, delayInMilliseconds=delay_ms + ) + ) + + @telemetry.record_call() + def set_keyboard_delay(self, delay_ms: int) -> None: + """ + Configure keyboard action delay. + + Args: + delay_ms (int): The delay in milliseconds to set for keyboard actions. + + Raises: + AssertionError: If the gRPC stub is not initialized. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + + self._reporter.add_message("AgentOS", f"set_keyboard_delay({delay_ms})") + + self._stub.SetKeyboardDelay( + controller_v1_pbs.Request_SetKeyboardDelay( + sessionInfo=self._session_info, delayInMilliseconds=delay_ms + ) + ) + + @telemetry.record_call() + def set_active_window(self, process_id: int, window_id: int) -> None: + """ + Set the active window for automation. + + Args: + process_id (int): The ID of the process that owns the window. + window_id (int): The ID of the window to set as active. + + Raises: + AssertionError: If the gRPC stub is not initialized. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + + self._reporter.add_message( + "AgentOS", f"set_active_window({process_id}, {window_id})" + ) + + self._stub.SetActiveWindow( + controller_v1_pbs.Request_SetActiveWindow( + processID=process_id, windowID=window_id + ) + ) + + @telemetry.record_call() + def set_active_automation_target(self, target_id: int) -> None: + """ + Set the active automation target. + + Args: + target_id (int): The ID of the automation target to set as active. + + Raises: + AssertionError: If the gRPC stub is not initialized. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + + self._reporter.add_message( + "AgentOS", f"set_active_automation_target({target_id})" + ) + + self._stub.SetActiveAutomationTarget( + controller_v1_pbs.Request_SetActiveAutomationTarget(ID=target_id) + ) + + @telemetry.record_call() + def schedule_batched_action( + self, + action_class_id: controller_v1_pbs.ActionClassID, + action_parameters: controller_v1_pbs.ActionParameters, + ) -> controller_v1_pbs.Response_ScheduleBatchedAction: + """ + Schedule an action for batch execution. + + Args: + action_class_id (controller_v1_pbs.ActionClassID): The class ID + of the action to schedule. + action_parameters (controller_v1_pbs.ActionParameters): + Parameters for the action. + + Returns: + controller_v1_pbs.Response_ScheduleBatchedAction: Response containing + the scheduled action ID. + + Raises: + AssertionError: If the gRPC stub is not initialized. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + + self._reporter.add_message( + "AgentOS", + f"schedule_batched_action({action_class_id}, {action_parameters})", + ) + + response: controller_v1_pbs.Response_ScheduleBatchedAction = ( + self._stub.ScheduleBatchedAction( + controller_v1_pbs.Request_ScheduleBatchedAction( + sessionInfo=self._session_info, + actionClassID=action_class_id, + actionParameters=action_parameters, + ) + ) + ) + + return response + + @telemetry.record_call() + def start_batch_run(self) -> None: + """ + Start executing batched actions. + + Raises: + AssertionError: If the gRPC stub is not initialized. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + + self._reporter.add_message("AgentOS", "start_batch_run()") + + self._stub.StartBatchRun( + controller_v1_pbs.Request_StartBatchRun(sessionInfo=self._session_info) + ) + + @telemetry.record_call() + def stop_batch_run(self) -> None: + """ + Stop executing batched actions. + + Raises: + AssertionError: If the gRPC stub is not initialized. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + + self._reporter.add_message("AgentOS", "stop_batch_run()") + + self._stub.StopBatchRun( + controller_v1_pbs.Request_StopBatchRun(sessionInfo=self._session_info) + ) + + @telemetry.record_call() + def get_action_count(self) -> controller_v1_pbs.Response_GetActionCount: + """ + Get the count of recorded or batched actions. + + Returns: + controller_v1_pbs.Response_GetActionCount: Response + containing the action count. + + Raises: + AssertionError: If the gRPC stub is not initialized. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + + self._reporter.add_message("AgentOS", "get_action_count()") + + response: controller_v1_pbs.Response_GetActionCount = self._stub.GetActionCount( + controller_v1_pbs.Request_GetActionCount(sessionInfo=self._session_info) + ) + + return response + + @telemetry.record_call() + def get_action(self, action_index: int) -> controller_v1_pbs.Response_GetAction: + """ + Get a specific action by its index. + + Args: + action_index (int): The index of the action to retrieve. + + Returns: + controller_v1_pbs.Response_GetAction: Action information containing: + - actionID: The action ID + - actionClassID: The action class ID + - actionParameters: The action parameters + + Raises: + AssertionError: If the gRPC stub is not initialized. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + + self._reporter.add_message("AgentOS", f"get_action({action_index})") + + response: controller_v1_pbs.Response_GetAction = self._stub.GetAction( + controller_v1_pbs.Request_GetAction( + sessionInfo=self._session_info, actionIndex=action_index + ) + ) + + return response + + @telemetry.record_call() + def remove_action(self, action_id: int) -> None: + """ + Remove a specific action by its ID. + + Args: + action_id (int): The ID of the action to remove. + + Raises: + AssertionError: If the gRPC stub is not initialized. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + + self._reporter.add_message("AgentOS", f"remove_action({action_id})") + + self._stub.RemoveAction( + controller_v1_pbs.Request_RemoveAction( + sessionInfo=self._session_info, actionID=action_id + ) + ) + + @telemetry.record_call() + def remove_all_actions(self) -> None: + """ + Clear all recorded or batched actions. + + Raises: + AssertionError: If the gRPC stub is not initialized. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + + self._reporter.add_message("AgentOS", "remove_all_actions()") + + self._stub.RemoveAllActions( + controller_v1_pbs.Request_RemoveAllActions(sessionInfo=self._session_info) + ) + + @telemetry.record_call(exclude={"message"}) + def send_message(self, message: str) -> controller_v1_pbs.Response_Send: + """ + Send a general message to the controller. + + Args: + message (str): The message to send to the controller. + + Returns: + controller_v1_pbs.Response_Send: Response containing + the message from the controller. + + Raises: + AssertionError: If the gRPC stub is not initialized. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + + self._reporter.add_message("AgentOS", f'send_message("{message}")') + + response: controller_v1_pbs.Response_Send = self._stub.Send( + controller_v1_pbs.Request_Send(message=message) + ) + + return response From 3b42d89ca0eea0598d00ce16da9e98265b5368c4 Mon Sep 17 00:00:00 2001 From: onur-askui <210008309+onur-askui@users.noreply.github.com> Date: Tue, 15 Jul 2025 09:01:00 +0200 Subject: [PATCH 05/21] feat: introduce basic tests --- .../tools/askui/test_askui_controller.py | 163 ++++++++++++++++++ 1 file changed, 163 insertions(+) diff --git a/tests/integration/tools/askui/test_askui_controller.py b/tests/integration/tools/askui/test_askui_controller.py index 76a51105..fb940a18 100644 --- a/tests/integration/tools/askui/test_askui_controller.py +++ b/tests/integration/tools/askui/test_askui_controller.py @@ -1,6 +1,8 @@ from pathlib import Path +from typing import Literal import pytest +from PIL import Image from askui.reporting import CompositeReporter from askui.tools.askui.askui_controller import ( @@ -39,3 +41,164 @@ def test_actions(controller_client: AskUiControllerClient) -> None: controller_client.screenshot() controller_client.mouse_move(0, 0) controller_client.click() + + +@pytest.mark.parametrize("button", ["left", "right", "middle"]) +def test_click_all_buttons( + controller_client: AskUiControllerClient, button: Literal["left", "middle", "right"] +) -> None: + """Test clicking each mouse button""" + with controller_client: + controller_client.click(button=button) + + +def test_mouse_multiple_clicks(controller_client: AskUiControllerClient) -> None: + """Test click count parameter""" + with controller_client: + controller_client.click(count=3) + + +@pytest.mark.parametrize("button", ["left", "right", "middle"]) +def test_mouse_press_hold_release( + controller_client: AskUiControllerClient, button: Literal["left", "middle", "right"] +) -> None: + """Test mouse_down() and mouse_up() operations""" + with controller_client: + controller_client.mouse_down(button=button) + controller_client.mouse_up(button=button) + + +@pytest.mark.parametrize("x,y", [(0, 0), (100, 100), (500, 300)]) +def test_mouse_move_coordinates( + controller_client: AskUiControllerClient, x: int, y: int +) -> None: + """Test mouse movement to various coordinates""" + with controller_client: + controller_client.mouse_move(x, y) + + +def test_mouse_scroll_directions(controller_client: AskUiControllerClient) -> None: + """Test horizontal and vertical scrolling""" + with controller_client: + controller_client.mouse_scroll(0, 5) # Vertical scroll + controller_client.mouse_scroll(5, 0) # Horizontal scroll + controller_client.mouse_scroll(3, -2) # Combined scroll + + +def test_type_text_basic(controller_client: AskUiControllerClient) -> None: + """Test typing simple text""" + with controller_client: + controller_client.type("Hello World") + + +def test_type_text_with_speed(controller_client: AskUiControllerClient) -> None: + """Test typing with custom speed""" + with controller_client: + controller_client.type("Fast typing", typing_speed=100) + controller_client.type("Slow typing", typing_speed=10) + + +def test_keyboard_tap_with_modifiers(controller_client: AskUiControllerClient) -> None: + """Test key combination like Ctrl+C""" + with controller_client: + controller_client.keyboard_tap("c", modifier_keys=["command"]) + controller_client.keyboard_tap("v", modifier_keys=["command"]) + + +def test_keyboard_tap_multiple(controller_client: AskUiControllerClient) -> None: + """Test multiple key taps""" + with controller_client: + controller_client.keyboard_tap("escape", count=3) + + +def test_keyboard_press_hold_release(controller_client: AskUiControllerClient) -> None: + """Test keyboard_pressed() and keyboard_release()""" + with controller_client: + controller_client.keyboard_pressed("escape") + controller_client.keyboard_release("escape") + + +def test_screenshot_basic(controller_client: AskUiControllerClient) -> None: + """Test taking screenshots with different report settings""" + with controller_client: + image_with_report = controller_client.screenshot() + assert isinstance(image_with_report, Image.Image) + + +def test_get_display_information(controller_client: AskUiControllerClient) -> None: + """Test retrieving display information""" + with controller_client: + display_info = controller_client.get_display_information() + assert display_info is not None + + +def test_get_mouse_position(controller_client: AskUiControllerClient) -> None: + """Test getting current mouse coordinates""" + with controller_client: + position = controller_client.get_mouse_position() + assert position is not None + assert hasattr(position, "x") + assert hasattr(position, "y") + + +def test_get_process_list(controller_client: AskUiControllerClient) -> None: + """Test retrieving running processes""" + with controller_client: + processes = controller_client.get_process_list() + assert processes is not None + + processes_extended = controller_client.get_process_list(get_extended_info=True) + assert processes_extended is not None + + +def test_get_automation_target_list(controller_client: AskUiControllerClient) -> None: + """Test retrieving automation targets""" + with controller_client: + targets = controller_client.get_automation_target_list() + assert targets is not None + + +def test_set_display(controller_client: AskUiControllerClient) -> None: + """Test changing active display""" + with controller_client: + controller_client.set_display(1) + + +def test_set_mouse_delay(controller_client: AskUiControllerClient) -> None: + """Test configuring mouse action delay""" + with controller_client: + controller_client.set_mouse_delay(100) + + +def test_set_keyboard_delay(controller_client: AskUiControllerClient) -> None: + """Test configuring keyboard action delay""" + with controller_client: + controller_client.set_keyboard_delay(50) + + +def test_run_command(controller_client: AskUiControllerClient) -> None: + """Test executing shell commands""" + with controller_client: + controller_client.run_command("echo test") + + +def test_get_action_count(controller_client: AskUiControllerClient) -> None: + """Test getting count of batched actions""" + with controller_client: + count = controller_client.get_action_count() + assert count is not None + + +def test_operations_before_connect() -> None: + """Test calling methods before connect() raises appropriate errors""" + client = AskUiControllerClient(reporter=CompositeReporter(), display=1) + + with pytest.raises(AssertionError, match="Stub is not initialized"): + client.screenshot() + + +def test_invalid_coordinates(controller_client: AskUiControllerClient) -> None: + """Test mouse operations with potentially problematic coordinates""" + with controller_client: + controller_client.mouse_move(-1, -1) + controller_client.mouse_move(9999, 9999) From 0093c92775801d20d39e2c335664e0a1b059b76a Mon Sep 17 00:00:00 2001 From: onur-askui <210008309+onur-askui@users.noreply.github.com> Date: Tue, 15 Jul 2025 09:09:20 +0200 Subject: [PATCH 06/21] chore: remove readme --- .../askui/askui_ui_controller_grpc/readme.md | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 src/askui/tools/askui/askui_ui_controller_grpc/readme.md diff --git a/src/askui/tools/askui/askui_ui_controller_grpc/readme.md b/src/askui/tools/askui/askui_ui_controller_grpc/readme.md deleted file mode 100644 index 294c4aa9..00000000 --- a/src/askui/tools/askui/askui_ui_controller_grpc/readme.md +++ /dev/null @@ -1,19 +0,0 @@ -## 1) Generate code -```bash -python -m grpc_tools.protoc \ --I src/askui/tools/askui/askui_ui_controller_grpc/proto \ ---python_out=src/askui/tools/askui/askui_ui_controller_grpc/generated \ ---pyi_out=src/askui/tools/askui/askui_ui_controller_grpc/generated \ ---grpc_python_out=src/askui/tools/askui/askui_ui_controller_grpc/generated \ -src/askui/tools/askui/askui_ui_controller_grpc/proto/* -``` - - -## 2) Fix import -Because of [this issue](https://github.com/protocolbuffers/protobuf/issues/1491) following change is required in `Controller_V1_pb2_grpc.py` after generating the code. - -```diff -- import Controller_V1_pb2 as Controller__V1__pb2 -+ from . import Controller_V1_pb2 as Controller__V1__pb2 -``` - From 7b3a9ba08d7c98335d9b65ae3b7c5b237cd0f64b Mon Sep 17 00:00:00 2001 From: onur-askui <210008309+onur-askui@users.noreply.github.com> Date: Tue, 15 Jul 2025 09:09:55 +0200 Subject: [PATCH 07/21] chore: merge grpc:gen and grpc:fix-import --- pyproject.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4327686f..90c316f6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,8 +56,7 @@ typecheck = "mypy" "typecheck:all" = "mypy src tests" "chat:api" = "uvicorn askui.chat.api.app:app --reload --port 9261" "mcp:dev" = "mcp dev src/askui/mcp/__init__.py" -"grpc:gen" = "python -m grpc_tools.protoc -I src/askui/tools/askui/askui_ui_controller_grpc/proto --python_out=src/askui/tools/askui/askui_ui_controller_grpc/generated --pyi_out=src/askui/tools/askui/askui_ui_controller_grpc/generated --grpc_python_out=src/askui/tools/askui/askui_ui_controller_grpc/generated src/askui/tools/askui/askui_ui_controller_grpc/proto/Controller_V1.proto" -"grpc:fix-import" = "bash -c \"sed -i.bak 's/^import Controller_V1_pb2 as Controller__V1__pb2$/from . import Controller_V1_pb2 as Controller__V1__pb2/' src/askui/tools/askui/askui_ui_controller_grpc/generated/Controller_V1_pb2_grpc.py && rm src/askui/tools/askui/askui_ui_controller_grpc/generated/Controller_V1_pb2_grpc.py.bak\"" +"grpc:gen" = "bash -c \"python -m grpc_tools.protoc -I src/askui/tools/askui/askui_ui_controller_grpc/proto --python_out=src/askui/tools/askui/askui_ui_controller_grpc/generated --pyi_out=src/askui/tools/askui/askui_ui_controller_grpc/generated --grpc_python_out=src/askui/tools/askui/askui_ui_controller_grpc/generated src/askui/tools/askui/askui_ui_controller_grpc/proto/Controller_V1.proto && sed -i.bak 's/^import Controller_V1_pb2 as Controller__V1__pb2$/from . import Controller_V1_pb2 as Controller__V1__pb2/' src/askui/tools/askui/askui_ui_controller_grpc/generated/Controller_V1_pb2_grpc.py && rm src/askui/tools/askui/askui_ui_controller_grpc/generated/Controller_V1_pb2_grpc.py.bak\"" [dependency-groups] test = [ From 7f960918edc3a49ad28fea81ed64a9ac424f5a22 Mon Sep 17 00:00:00 2001 From: onur-askui <210008309+onur-askui@users.noreply.github.com> Date: Tue, 15 Jul 2025 09:26:04 +0200 Subject: [PATCH 08/21] chore: ignore formatting for generated code --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 90c316f6..756c6fb2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -134,6 +134,7 @@ exclude = [ "dist", "node_modules", "venv", + "generated" ] # Same as Black. From 80d15c1d85ee2bdbdd6ec851f39ca9e0dc7e5811 Mon Sep 17 00:00:00 2001 From: onur-askui <210008309+onur-askui@users.noreply.github.com> Date: Fri, 18 Jul 2025 15:38:15 +0200 Subject: [PATCH 09/21] chore: extract grpc generation to dedicated script --- pyproject.toml | 2 +- scripts/grpc-gen.sh | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 scripts/grpc-gen.sh diff --git a/pyproject.toml b/pyproject.toml index 756c6fb2..11b3a193 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,7 +56,7 @@ typecheck = "mypy" "typecheck:all" = "mypy src tests" "chat:api" = "uvicorn askui.chat.api.app:app --reload --port 9261" "mcp:dev" = "mcp dev src/askui/mcp/__init__.py" -"grpc:gen" = "bash -c \"python -m grpc_tools.protoc -I src/askui/tools/askui/askui_ui_controller_grpc/proto --python_out=src/askui/tools/askui/askui_ui_controller_grpc/generated --pyi_out=src/askui/tools/askui/askui_ui_controller_grpc/generated --grpc_python_out=src/askui/tools/askui/askui_ui_controller_grpc/generated src/askui/tools/askui/askui_ui_controller_grpc/proto/Controller_V1.proto && sed -i.bak 's/^import Controller_V1_pb2 as Controller__V1__pb2$/from . import Controller_V1_pb2 as Controller__V1__pb2/' src/askui/tools/askui/askui_ui_controller_grpc/generated/Controller_V1_pb2_grpc.py && rm src/askui/tools/askui/askui_ui_controller_grpc/generated/Controller_V1_pb2_grpc.py.bak\"" +"grpc:gen" = "bash scripts/grpc-gen.sh" [dependency-groups] test = [ diff --git a/scripts/grpc-gen.sh b/scripts/grpc-gen.sh new file mode 100644 index 00000000..7d5d519a --- /dev/null +++ b/scripts/grpc-gen.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# Define paths +PROTO_DIR="src/askui/tools/askui/askui_ui_controller_grpc/proto" +OUTPUT_DIR="src/askui/tools/askui/askui_ui_controller_grpc/generated" +PROTO_FILE="Controller_V1.proto" +GRPC_FILE="Controller_V1_pb2_grpc.py" + +# Generate Python gRPC code from proto file +python -m grpc_tools.protoc \ + -I "$PROTO_DIR" \ + --python_out="$OUTPUT_DIR" \ + --pyi_out="$OUTPUT_DIR" \ + --grpc_python_out="$OUTPUT_DIR" \ + "$PROTO_DIR/$PROTO_FILE" + +# Fix import in generated gRPC file to use relative import +# https://github.com/protocolbuffers/protobuf/issues/1491 +sed -i.bak \ + 's/^import Controller_V1_pb2 as Controller__V1__pb2$/from . import Controller_V1_pb2 as Controller__V1__pb2/' \ + "$OUTPUT_DIR/$GRPC_FILE" + +# Remove backup file +rm "$OUTPUT_DIR/$GRPC_FILE.bak" From 7fc75eba25b58f6e6daf9d4387dfdf16ad7b7b45 Mon Sep 17 00:00:00 2001 From: onur-askui <210008309+onur-askui@users.noreply.github.com> Date: Fri, 18 Jul 2025 15:58:28 +0200 Subject: [PATCH 10/21] chore: specify generated path to exclude --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 11b3a193..aefd1bc4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -134,7 +134,7 @@ exclude = [ "dist", "node_modules", "venv", - "generated" + "src/askui/tools/askui/askui_ui_controller_grpc/generated" ] # Same as Black. From 82c2a66c72db087c7624ab56006456bf56bfb4af Mon Sep 17 00:00:00 2001 From: onur-askui <210008309+onur-askui@users.noreply.github.com> Date: Fri, 18 Jul 2025 16:15:11 +0200 Subject: [PATCH 11/21] format: use backtick for default parameters in docstring --- src/askui/tools/askui/askui_controller.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/askui/tools/askui/askui_controller.py b/src/askui/tools/askui/askui_controller.py index 824b55e8..7021047e 100644 --- a/src/askui/tools/askui/askui_controller.py +++ b/src/askui/tools/askui/askui_controller.py @@ -788,7 +788,7 @@ def get_process_list( Args: get_extended_info (bool, optional): Whether to include extended process information. - Defaults to False. + Defaults to `False`. Returns: controller_v1_pbs.Response_GetProcessList: Process list response containing: @@ -879,10 +879,11 @@ def set_test_configuration( default_capture_parameters (controller_v1_pbs.CaptureParameters | None, optional): Default capture parameters with displayID and captureArea. - Defaults to None. - mouse_delay_ms (int, optional): Mouse delay in milliseconds. Defaults to 0. + Defaults to `None`. + mouse_delay_ms (int, optional): Mouse delay in milliseconds. + Defaults to `0`. keyboard_delay_ms (int, optional): Keyboard delay in milliseconds. - Defaults to 0. + Defaults to `0`. Raises: AssertionError: If the gRPC stub is not initialized. From 457917d79d3698cddd10a9e9701cd676b2e8d9ff Mon Sep 17 00:00:00 2001 From: onur-askui <210008309+onur-askui@users.noreply.github.com> Date: Fri, 18 Jul 2025 09:05:34 +0200 Subject: [PATCH 12/21] feat: introduce controller json schema and codegen --- pdm.lock | 233 ++++++++++-- pyproject.toml | 2 + .../generated/AgentOS_Send_Request_2501.py | 169 +++++++++ .../generated/AgentOS_Send_Response_2501.py | 108 ++++++ .../generated/__init__.py | 3 + .../AgentOS-Send-Request-2501.json | 354 ++++++++++++++++++ .../AgentOS-Send-Response-2501.json | 149 ++++++++ 7 files changed, 979 insertions(+), 39 deletions(-) create mode 100644 src/askui/tools/askui/askui_ui_controller_grpc/generated/AgentOS_Send_Request_2501.py create mode 100644 src/askui/tools/askui/askui_ui_controller_grpc/generated/AgentOS_Send_Response_2501.py create mode 100644 src/askui/tools/askui/askui_ui_controller_grpc/generated/__init__.py create mode 100644 src/askui/tools/askui/askui_ui_controller_grpc/json_schema/AgentOS-Send-Request-2501.json create mode 100644 src/askui/tools/askui/askui_ui_controller_grpc/json_schema/AgentOS-Send-Response-2501.json diff --git a/pdm.lock b/pdm.lock index 88c11d9a..c8bac19f 100644 --- a/pdm.lock +++ b/pdm.lock @@ -2,10 +2,10 @@ # It is not intended for manual editing. [metadata] -groups = ["default", "android", "chat", "pynput", "test", "web"] +groups = ["default", "all", "android", "chat", "pynput", "test", "web"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:cddcbf34746f07954e7be404593f3972cacc6c15aae3dcc3576937f46bf64a0a" +content_hash = "sha256:a17b63cf447ef196e93e13e3b91aad997a988f9c4cb72b3c4f74e0c1e5db7488" [[metadata.targets]] requires_python = ">=3.10" @@ -15,7 +15,7 @@ name = "annotated-types" version = "0.7.0" requires_python = ">=3.8" summary = "Reusable constraint types to use with typing.Annotated" -groups = ["default", "chat"] +groups = ["default", "all", "chat"] dependencies = [ "typing-extensions>=4.0.0; python_version < \"3.9\"", ] @@ -49,7 +49,7 @@ name = "anyio" version = "4.9.0" requires_python = ">=3.9" summary = "High level compatibility layer for multiple asynchronous event loop implementations" -groups = ["default", "chat"] +groups = ["default", "all", "chat"] dependencies = [ "exceptiongroup>=1.0.2; python_version < \"3.11\"", "idna>=2.8", @@ -61,6 +61,17 @@ files = [ {file = "anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028"}, ] +[[package]] +name = "argcomplete" +version = "3.6.2" +requires_python = ">=3.8" +summary = "Bash tab completion for argparse" +groups = ["default"] +files = [ + {file = "argcomplete-3.6.2-py3-none-any.whl", hash = "sha256:65b3133a29ad53fb42c48cf5114752c7ab66c1c38544fdf6460f450c09b42591"}, + {file = "argcomplete-3.6.2.tar.gz", hash = "sha256:d0519b1bc867f5f4f4713c41ad0aba73a4a5f007449716b16f385f2166dc6adf"}, +] + [[package]] name = "backoff" version = "2.2.1" @@ -72,6 +83,42 @@ files = [ {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, ] +[[package]] +name = "black" +version = "25.1.0" +requires_python = ">=3.9" +summary = "The uncompromising code formatter." +groups = ["default"] +dependencies = [ + "click>=8.0.0", + "mypy-extensions>=0.4.3", + "packaging>=22.0", + "pathspec>=0.9.0", + "platformdirs>=2", + "tomli>=1.1.0; python_version < \"3.11\"", + "typing-extensions>=4.0.1; python_version < \"3.11\"", +] +files = [ + {file = "black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32"}, + {file = "black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da"}, + {file = "black-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7"}, + {file = "black-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9"}, + {file = "black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0"}, + {file = "black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299"}, + {file = "black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096"}, + {file = "black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2"}, + {file = "black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b"}, + {file = "black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc"}, + {file = "black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f"}, + {file = "black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba"}, + {file = "black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f"}, + {file = "black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3"}, + {file = "black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171"}, + {file = "black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18"}, + {file = "black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717"}, + {file = "black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666"}, +] + [[package]] name = "certifi" version = "2025.1.31" @@ -151,7 +198,7 @@ name = "click" version = "8.1.8" requires_python = ">=3.7" summary = "Composable command line interface toolkit" -groups = ["chat"] +groups = ["default", "all", "chat"] dependencies = [ "colorama; platform_system == \"Windows\"", "importlib-metadata; python_version < \"3.8\"", @@ -166,7 +213,7 @@ name = "colorama" version = "0.4.6" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" summary = "Cross-platform colored terminal text." -groups = ["default", "chat", "test"] +groups = ["default", "all", "chat", "test"] marker = "sys_platform == \"win32\" or platform_system == \"Windows\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, @@ -302,6 +349,29 @@ files = [ {file = "coverage-7.8.0.tar.gz", hash = "sha256:7a3d62b3b03b4b6fd41a085f3574874cf946cb4604d2b4d3e8dca8cd570ca501"}, ] +[[package]] +name = "datamodel-code-generator" +version = "0.31.2" +requires_python = ">=3.9" +summary = "Datamodel Code Generator" +groups = ["default"] +dependencies = [ + "argcomplete<4,>=2.10.1", + "black>=19.10b0", + "genson<2,>=1.2.1", + "inflect<8,>=4.1", + "isort<7,>=4.3.21", + "jinja2<4,>=2.10.1", + "packaging", + "pydantic>=1.5", + "pyyaml>=6.0.1", + "tomli<3,>=2.2.1; python_version <= \"3.11\"", +] +files = [ + {file = "datamodel_code_generator-0.31.2-py3-none-any.whl", hash = "sha256:78f200a9e673ee4d041e96e82a835273baf4ce15e446d46501c0433d82af3ef5"}, + {file = "datamodel_code_generator-0.31.2.tar.gz", hash = "sha256:47887b8aa6fd69865e07e2893c1e76e34dae753b9a97f1020357af8337bc4cdb"}, +] + [[package]] name = "distro" version = "1.9.0" @@ -318,7 +388,7 @@ name = "evdev" version = "1.9.2" requires_python = ">=3.8" summary = "Bindings to the Linux input handling subsystem" -groups = ["chat", "pynput"] +groups = ["all", "chat", "pynput"] marker = "\"linux\" in sys_platform" files = [ {file = "evdev-1.9.2.tar.gz", hash = "sha256:5d3278892ce1f92a74d6bf888cc8525d9f68af85dbe336c95d1c87fb8f423069"}, @@ -329,7 +399,7 @@ name = "exceptiongroup" version = "1.2.2" requires_python = ">=3.7" summary = "Backport of PEP 654 (exception groups)" -groups = ["default", "chat", "test"] +groups = ["default", "all", "chat", "test"] marker = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, @@ -352,7 +422,7 @@ name = "fastapi" version = "0.115.12" requires_python = ">=3.8" summary = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" -groups = ["chat"] +groups = ["all", "chat"] dependencies = [ "pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0,>=1.7.4", "starlette<0.47.0,>=0.40.0", @@ -385,6 +455,16 @@ files = [ {file = "fsspec-2025.3.2.tar.gz", hash = "sha256:e52c77ef398680bbd6a98c0e628fbc469491282981209907bbc8aea76a04fdc6"}, ] +[[package]] +name = "genson" +version = "1.3.0" +summary = "GenSON is a powerful, user-friendly JSON Schema generator." +groups = ["default"] +files = [ + {file = "genson-1.3.0-py3-none-any.whl", hash = "sha256:468feccd00274cc7e4c09e84b08704270ba8d95232aa280f65b986139cec67f7"}, + {file = "genson-1.3.0.tar.gz", hash = "sha256:e02db9ac2e3fd29e65b5286f7135762e2cd8a986537c075b06fc5f1517308e37"}, +] + [[package]] name = "gradio-client" version = "1.8.0" @@ -409,7 +489,7 @@ name = "greenlet" version = "3.2.3" requires_python = ">=3.9" summary = "Lightweight in-process concurrent programming" -groups = ["chat", "test", "web"] +groups = ["all", "chat", "test", "web"] files = [ {file = "greenlet-3.2.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:1afd685acd5597349ee6d7a88a8bec83ce13c106ac78c196ee9dde7c04fe87be"}, {file = "greenlet-3.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:761917cac215c61e9dc7324b2606107b3b292a8349bdebb31503ab4de3f559ac"}, @@ -581,7 +661,7 @@ name = "h11" version = "0.14.0" requires_python = ">=3.7" summary = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -groups = ["default", "chat"] +groups = ["default", "all", "chat"] dependencies = [ "typing-extensions; python_version < \"3.8\"", ] @@ -647,12 +727,28 @@ name = "idna" version = "3.10" requires_python = ">=3.6" summary = "Internationalized Domain Names in Applications (IDNA)" -groups = ["default", "chat"] +groups = ["default", "all", "chat"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[[package]] +name = "inflect" +version = "7.5.0" +requires_python = ">=3.9" +summary = "Correctly generate plurals, singular nouns, ordinals, indefinite articles" +groups = ["default"] +dependencies = [ + "more-itertools>=8.5.0", + "typeguard>=4.0.1", + "typing-extensions; python_version < \"3.9\"", +] +files = [ + {file = "inflect-7.5.0-py3-none-any.whl", hash = "sha256:2aea70e5e70c35d8350b8097396ec155ffd68def678c7ff97f51aa69c1d92344"}, + {file = "inflect-7.5.0.tar.gz", hash = "sha256:faf19801c3742ed5a05a8ce388e0d8fe1a07f8d095c82201eb904f5d27ad571f"}, +] + [[package]] name = "iniconfig" version = "2.1.0" @@ -664,6 +760,17 @@ files = [ {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, ] +[[package]] +name = "isort" +version = "6.0.1" +requires_python = ">=3.9.0" +summary = "A Python utility / library to sort Python imports." +groups = ["default"] +files = [ + {file = "isort-6.0.1-py3-none-any.whl", hash = "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615"}, + {file = "isort-6.0.1.tar.gz", hash = "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450"}, +] + [[package]] name = "jinja2" version = "3.1.6" @@ -824,12 +931,23 @@ files = [ {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] +[[package]] +name = "more-itertools" +version = "10.7.0" +requires_python = ">=3.9" +summary = "More routines for operating on iterables, beyond itertools" +groups = ["default"] +files = [ + {file = "more_itertools-10.7.0-py3-none-any.whl", hash = "sha256:d43980384673cb07d2f7d2d918c616b30c659c089ee23953f601d6609c67510e"}, + {file = "more_itertools-10.7.0.tar.gz", hash = "sha256:9fddd5403be01a94b204faadcff459ec3568cf110265d3c54323e1e866ad29d3"}, +] + [[package]] name = "mss" version = "10.0.0" requires_python = ">=3.9" summary = "An ultra fast cross-platform multiple screenshots module in pure python using ctypes." -groups = ["chat", "pynput"] +groups = ["all", "chat", "pynput"] files = [ {file = "mss-10.0.0-py3-none-any.whl", hash = "sha256:82cf6460a53d09e79b7b6d871163c982e6c7e9649c426e7b7591b74956d5cb64"}, {file = "mss-10.0.0.tar.gz", hash = "sha256:d903e0d51262bf0f8782841cf16eaa6d7e3e1f12eae35ab41c2e318837c6637f"}, @@ -880,7 +998,7 @@ name = "mypy-extensions" version = "1.0.0" requires_python = ">=3.5" summary = "Type system extensions for programs checked with the mypy type checker." -groups = ["test"] +groups = ["default", "test"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, @@ -918,6 +1036,17 @@ files = [ {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] +[[package]] +name = "pathspec" +version = "0.12.1" +requires_python = ">=3.8" +summary = "Utility library for gitignore style pattern matching of file paths." +groups = ["default"] +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + [[package]] name = "pillow" version = "11.1.0" @@ -987,12 +1116,23 @@ files = [ {file = "pillow-11.1.0.tar.gz", hash = "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20"}, ] +[[package]] +name = "platformdirs" +version = "4.3.8" +requires_python = ">=3.9" +summary = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +groups = ["default"] +files = [ + {file = "platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4"}, + {file = "platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc"}, +] + [[package]] name = "playwright" version = "1.53.0" requires_python = ">=3.9" summary = "A high-level API to automate web browsers" -groups = ["chat", "test", "web"] +groups = ["all", "chat", "test", "web"] dependencies = [ "greenlet<4.0.0,>=3.1.1", "pyee<14,>=13", @@ -1039,7 +1179,7 @@ files = [ name = "pure-python-adb" version = "0.3.0.dev0" summary = "Pure python implementation of the adb client" -groups = ["android", "chat"] +groups = ["all", "android", "chat"] files = [ {file = "pure-python-adb-0.3.0.dev0.tar.gz", hash = "sha256:0ecc89d780160cfe03260ba26df2c471a05263b2cad0318363573ee8043fb94d"}, ] @@ -1062,7 +1202,7 @@ name = "pydantic" version = "2.11.2" requires_python = ">=3.9" summary = "Data validation using Python type hints" -groups = ["default", "chat"] +groups = ["default", "all", "chat"] dependencies = [ "annotated-types>=0.6.0", "pydantic-core==2.33.1", @@ -1079,7 +1219,7 @@ name = "pydantic-core" version = "2.33.1" requires_python = ">=3.9" summary = "Core functionality for Pydantic validation and serialization" -groups = ["default", "chat"] +groups = ["default", "all", "chat"] dependencies = [ "typing-extensions!=4.7.0,>=4.6.0", ] @@ -1184,7 +1324,7 @@ name = "pyee" version = "13.0.0" requires_python = ">=3.8" summary = "A rough port of Node.js's EventEmitter to Python with a few tricks of its own" -groups = ["chat", "test", "web"] +groups = ["all", "chat", "test", "web"] dependencies = [ "typing-extensions", ] @@ -1219,7 +1359,7 @@ files = [ name = "pynput" version = "1.8.1" summary = "Monitor and control user input devices" -groups = ["chat", "pynput"] +groups = ["all", "chat", "pynput"] dependencies = [ "enum34; python_version == \"2.7\"", "evdev>=1.3; \"linux\" in sys_platform", @@ -1238,7 +1378,7 @@ name = "pyobjc-core" version = "11.0" requires_python = ">=3.8" summary = "Python<->ObjC Interoperability Module" -groups = ["chat", "pynput"] +groups = ["all", "chat", "pynput"] marker = "sys_platform == \"darwin\"" files = [ {file = "pyobjc_core-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:10866b3a734d47caf48e456eea0d4815c2c9b21856157db5917b61dee06893a1"}, @@ -1254,7 +1394,7 @@ name = "pyobjc-framework-applicationservices" version = "11.0" requires_python = ">=3.9" summary = "Wrappers for the framework ApplicationServices on macOS" -groups = ["chat", "pynput"] +groups = ["all", "chat", "pynput"] marker = "sys_platform == \"darwin\"" dependencies = [ "pyobjc-core>=11.0", @@ -1276,7 +1416,7 @@ name = "pyobjc-framework-cocoa" version = "11.0" requires_python = ">=3.9" summary = "Wrappers for the Cocoa frameworks on macOS" -groups = ["chat", "pynput"] +groups = ["all", "chat", "pynput"] marker = "sys_platform == \"darwin\"" dependencies = [ "pyobjc-core>=11.0", @@ -1295,7 +1435,7 @@ name = "pyobjc-framework-coretext" version = "11.0" requires_python = ">=3.9" summary = "Wrappers for the framework CoreText on macOS" -groups = ["chat", "pynput"] +groups = ["all", "chat", "pynput"] marker = "sys_platform == \"darwin\"" dependencies = [ "pyobjc-core>=11.0", @@ -1316,7 +1456,7 @@ name = "pyobjc-framework-quartz" version = "11.0" requires_python = ">=3.9" summary = "Wrappers for the Quartz frameworks on macOS" -groups = ["chat", "pynput"] +groups = ["all", "chat", "pynput"] marker = "sys_platform == \"darwin\"" dependencies = [ "pyobjc-core>=11.0", @@ -1446,7 +1586,7 @@ files = [ name = "python-xlib" version = "0.33" summary = "Python X Library" -groups = ["chat", "pynput"] +groups = ["all", "chat", "pynput"] marker = "\"linux\" in sys_platform" dependencies = [ "six>=1.10.0", @@ -1595,7 +1735,7 @@ name = "six" version = "1.17.0" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" summary = "Python 2 and 3 compatibility utilities" -groups = ["default", "chat", "pynput"] +groups = ["default", "all", "chat", "pynput"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -1606,7 +1746,7 @@ name = "sniffio" version = "1.3.1" requires_python = ">=3.7" summary = "Sniff out which async library your code is running under" -groups = ["default", "chat"] +groups = ["default", "all", "chat"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -1617,7 +1757,7 @@ name = "starlette" version = "0.46.2" requires_python = ">=3.9" summary = "The little ASGI library that shines." -groups = ["chat"] +groups = ["all", "chat"] dependencies = [ "anyio<5,>=3.6.2", "typing-extensions>=3.10.0; python_version < \"3.10\"", @@ -1643,8 +1783,8 @@ name = "tomli" version = "2.2.1" requires_python = ">=3.8" summary = "A lil' TOML parser" -groups = ["test"] -marker = "python_version < \"3.11\"" +groups = ["default", "test"] +marker = "python_version <= \"3.11\"" files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, @@ -1694,6 +1834,21 @@ files = [ {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, ] +[[package]] +name = "typeguard" +version = "4.4.4" +requires_python = ">=3.9" +summary = "Run-time type checker for Python" +groups = ["default"] +dependencies = [ + "importlib-metadata>=3.6; python_version < \"3.10\"", + "typing-extensions>=4.14.0", +] +files = [ + {file = "typeguard-4.4.4-py3-none-any.whl", hash = "sha256:b5f562281b6bfa1f5492470464730ef001646128b180769880468bd84b68b09e"}, + {file = "typeguard-4.4.4.tar.gz", hash = "sha256:3a7fd2dffb705d4d0efaed4306a704c89b9dee850b688f060a8b1615a79e5f74"}, +] + [[package]] name = "types-pillow" version = "10.2.0.20240822" @@ -1765,13 +1920,13 @@ files = [ [[package]] name = "typing-extensions" -version = "4.13.1" -requires_python = ">=3.8" -summary = "Backported and Experimental Type Hints for Python 3.8+" -groups = ["default", "chat", "test", "web"] +version = "4.14.1" +requires_python = ">=3.9" +summary = "Backported and Experimental Type Hints for Python 3.9+" +groups = ["default", "all", "chat", "test", "web"] files = [ - {file = "typing_extensions-4.13.1-py3-none-any.whl", hash = "sha256:4b6cf02909eb5495cfbc3f6e8fd49217e6cc7944e145cdda8caa3734777f9e69"}, - {file = "typing_extensions-4.13.1.tar.gz", hash = "sha256:98795af00fb9640edec5b8e31fc647597b4691f099ad75f469a2616be1a76dff"}, + {file = "typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76"}, + {file = "typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36"}, ] [[package]] @@ -1779,7 +1934,7 @@ name = "typing-inspection" version = "0.4.0" requires_python = ">=3.9" summary = "Runtime typing introspection tools" -groups = ["default", "chat"] +groups = ["default", "all", "chat"] dependencies = [ "typing-extensions>=4.12.0", ] @@ -1804,7 +1959,7 @@ name = "uvicorn" version = "0.34.3" requires_python = ">=3.9" summary = "The lightning-fast ASGI server." -groups = ["chat"] +groups = ["all", "chat"] dependencies = [ "click>=7.0", "h11>=0.8", diff --git a/pyproject.toml b/pyproject.toml index aefd1bc4..91bd59a5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,6 +22,7 @@ dependencies = [ "rich>=13.9.4", "segment-analytics-python>=2.3.4", "tenacity>=9.1.2", + "datamodel-code-generator>=0.31.2", ] requires-python = ">=3.10" readme = "README.md" @@ -57,6 +58,7 @@ typecheck = "mypy" "chat:api" = "uvicorn askui.chat.api.app:app --reload --port 9261" "mcp:dev" = "mcp dev src/askui/mcp/__init__.py" "grpc:gen" = "bash scripts/grpc-gen.sh" +"json:gen" = "datamodel-codegen --output-model-type pydantic_v2.BaseModel --input src/askui/tools/askui/askui_ui_controller_grpc/json_schema/ --input-file-type jsonschema --output src/askui/tools/askui/askui_ui_controller_grpc/generated/" [dependency-groups] test = [ diff --git a/src/askui/tools/askui/askui_ui_controller_grpc/generated/AgentOS_Send_Request_2501.py b/src/askui/tools/askui/askui_ui_controller_grpc/generated/AgentOS_Send_Request_2501.py new file mode 100644 index 00000000..ff4393bb --- /dev/null +++ b/src/askui/tools/askui/askui_ui_controller_grpc/generated/AgentOS_Send_Request_2501.py @@ -0,0 +1,169 @@ +# generated by datamodel-codegen: +# filename: AgentOS-Send-Request-2501.json +# timestamp: 2025-07-15T14:07:45+00:00 + +from __future__ import annotations + +from enum import Enum +from typing import List, Optional, Union + +from pydantic import BaseModel, ConfigDict, Field, RootModel, confloat, constr, conint + + +class Name(Enum): + GetMousePosition = 'GetMousePosition' + + +class Command(BaseModel): + name: Name + parameters: Optional[List] = None + + +class Name1(Enum): + SetMousePosition = 'SetMousePosition' + + +class Command1(BaseModel): + name: Name1 + parameters: List = Field(..., max_length=1, min_length=1) + + +class Name2(Enum): + AddRenderObject = 'AddRenderObject' + + +class Command2(BaseModel): + name: Name2 + parameters: List + + +class Name3(Enum): + UpdateRenderObject = 'UpdateRenderObject' + + +class Command3(BaseModel): + name: Name3 + parameters: List + + +class Name4(Enum): + DeleteRenderObject = 'DeleteRenderObject' + + +class Command4(BaseModel): + name: Name4 + parameters: List + + +class Name5(Enum): + ClearRenderObjects = 'ClearRenderObjects' + + +class Command5(BaseModel): + name: Name5 + parameters: Optional[List] = None + + +class Guid( + RootModel[ + constr( + pattern=r'^\{[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\}$' + ) + ] +): + root: constr( + pattern=r'^\{[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\}$' + ) + + +class Length(RootModel[Union[constr(pattern=r'^(\d+(\.\d+)?(px|%)|auto)$'), int, float]]): + root: Union[constr(pattern=r'^(\d+(\.\d+)?(px|%)|auto)$'), int, float] + + +class Color( + RootModel[ + Union[ + constr(pattern=r'^#([0-9a-fA-F]{6})$'), + constr(pattern=r'^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$'), + ] + ] +): + root: Union[ + constr(pattern=r'^#([0-9a-fA-F]{6})$'), + constr(pattern=r'^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$'), + ] + + +class Location2(BaseModel): + model_config = ConfigDict( + extra='forbid', + ) + x: Length + y: Length + + +class RenderObjectType(Enum): + Quad = 'Quad' + Line = 'Line' + Texture = 'Texture' + Image = 'Image' + + +class RenderObjectId(RootModel[conint(ge=0, le=18446744073709551615)]): + root: conint(ge=0, le=18446744073709551615) + + +class RenderObjectStyle(BaseModel): + model_config = ConfigDict( + extra='forbid', + ) + top: Optional[Length] = None + left: Optional[Length] = None + bottom: Optional[Length] = None + right: Optional[Length] = None + width: Optional[Length] = None + height: Optional[Length] = None + color: Optional[Color] = None + font_size: Optional[Length] = Field(None, alias='font-size') + opacity: Optional[confloat(ge=0.0, le=1.0)] = None + visible: Optional[bool] = None + line_width: Optional[Length] = Field(None, alias='line-width') + + +class RenderLinePoints(RootModel[List[Location2]]): + root: List[Location2] = Field(..., max_length=64, min_length=2) + + +class RenderImage( + RootModel[ + constr( + pattern=r'^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$' + ) + ] +): + root: constr( + pattern=r'^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$' + ) = Field(..., description='A Base64-encoded image') + + +class RenderText(RootModel[constr(pattern=r'^[\u0020-\u007F]*$')]): + root: constr(pattern=r'^[\u0020-\u007F]*$') + + +class Header(BaseModel): + model_config = ConfigDict( + extra='forbid', + ) + authentication: Guid + + +class Message(BaseModel): + model_config = ConfigDict( + extra='forbid', + ) + header: Header + command: Union[Command, Command1, Command2, Command3, Command4, Command5] + + +class AskuiAgentosSendRequestSchema(BaseModel): + message: Message diff --git a/src/askui/tools/askui/askui_ui_controller_grpc/generated/AgentOS_Send_Response_2501.py b/src/askui/tools/askui/askui_ui_controller_grpc/generated/AgentOS_Send_Response_2501.py new file mode 100644 index 00000000..0ec62635 --- /dev/null +++ b/src/askui/tools/askui/askui_ui_controller_grpc/generated/AgentOS_Send_Response_2501.py @@ -0,0 +1,108 @@ +# generated by datamodel-codegen: +# filename: AgentOS-Send-Response-2501.json +# timestamp: 2025-07-15T14:07:45+00:00 + +from __future__ import annotations + +from enum import Enum +from typing import Union + +from pydantic import BaseModel, ConfigDict, RootModel, conint, constr + + +class Name(Enum): + GetMousePosition = 'GetMousePosition' + + +class Name7(Enum): + SetMousePosition = 'SetMousePosition' + + +class Name8(Enum): + AddRenderObject = 'AddRenderObject' + + +class Name9(Enum): + UpdateRenderObject = 'UpdateRenderObject' + + +class Name10(Enum): + DeleteRenderObject = 'DeleteRenderObject' + + +class Name11(Enum): + ClearRenderObjects = 'ClearRenderObjects' + + +class Length(RootModel[Union[constr(pattern=r'^(\d+(\.\d+)?(px|%)|auto)$'), int, float]]): + root: Union[constr(pattern=r'^(\d+(\.\d+)?(px|%)|auto)$'), int, float] + + +class Location2(BaseModel): + model_config = ConfigDict( + extra='forbid', + ) + x: Length + y: Length + + +class RenderObjectId(RootModel[conint(ge=0, le=18446744073709551615)]): + root: conint(ge=0, le=18446744073709551615) + + +class ActionId(RootModel[conint(ge=0, le=2147483647)]): + root: conint(ge=0, le=2147483647) + + +class Response(BaseModel): + model_config = ConfigDict( + extra='forbid', + ) + position: Location2 + + +class Command(BaseModel): + name: Name + actionId: ActionId + response: Response + + +class Command7(BaseModel): + name: Name7 + actionId: ActionId + + +class Response1(BaseModel): + model_config = ConfigDict( + extra='forbid', + ) + id: RenderObjectId + + +class Command8(BaseModel): + name: Name8 + actionId: ActionId + response: Response1 + + +class Command9(BaseModel): + name: Name9 + actionId: ActionId + + +class Command10(BaseModel): + name: Name10 + actionId: ActionId + + +class Command11(BaseModel): + name: Name11 + actionId: ActionId + + +class Message(BaseModel): + command: Union[Command, Command7, Command8, Command9, Command10, Command11] + + +class AskuiAgentosSendResponseSchema(BaseModel): + message: Message diff --git a/src/askui/tools/askui/askui_ui_controller_grpc/generated/__init__.py b/src/askui/tools/askui/askui_ui_controller_grpc/generated/__init__.py new file mode 100644 index 00000000..9d9728fc --- /dev/null +++ b/src/askui/tools/askui/askui_ui_controller_grpc/generated/__init__.py @@ -0,0 +1,3 @@ +# generated by datamodel-codegen: +# filename: json_schema +# timestamp: 2025-07-15T14:07:45+00:00 diff --git a/src/askui/tools/askui/askui_ui_controller_grpc/json_schema/AgentOS-Send-Request-2501.json b/src/askui/tools/askui/askui_ui_controller_grpc/json_schema/AgentOS-Send-Request-2501.json new file mode 100644 index 00000000..4151888f --- /dev/null +++ b/src/askui/tools/askui/askui_ui_controller_grpc/json_schema/AgentOS-Send-Request-2501.json @@ -0,0 +1,354 @@ +{ + "title": "AskUI AgentOS Send Request Schema", + "description": "Defines the schema for the controller gRPC API Send request.", + "type": "object", + "definitions": { + "guid": { + "type": "string", + "pattern": "^\\{[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\\}$" + }, + "length": { + "anyOf": [ + { + "type": "string", + "pattern": "^(\\d+(\\.\\d+)?(px|%)|auto)$", + "default": "0px" + }, + { + "type": "number", + "default": 0.0 + } + ] + }, + "color": { + "type": "string", + "anyOf": [ + { + "pattern": "^#([0-9a-fA-F]{6})$" + }, + { + "pattern": "^rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)$" + } + ] + }, + "location2": { + "type": "object", + "additionalProperties": false, + "properties": { + "x": { + "$ref": "#/definitions/length" + }, + "y": { + "$ref": "#/definitions/length" + } + }, + "required": ["x", "y"] + }, + "renderObjectType": { + "type": "string", + "enum": ["Quad", "Line", "Texture", "Image"] + }, + "renderObjectId": { + "type": "number", + "minimum": 0, + "maximum": 18446744073709551615 + }, + "renderObjectStyle": { + "type": "object", + "properties": { + "top": { + "$ref": "#/definitions/length" + }, + "left": { + "$ref": "#/definitions/length" + }, + "bottom": { + "$ref": "#/definitions/length" + }, + "right": { + "$ref": "#/definitions/length" + }, + "width": { + "$ref": "#/definitions/length" + }, + "height": { + "$ref": "#/definitions/length" + }, + "color": { + "$ref": "#/definitions/color" + }, + "font-size": { + "$ref": "#/definitions/length" + }, + "opacity": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "visible": { + "type": "boolean" + }, + "line-width": { + "$ref": "#/definitions/length" + } + }, + "additionalProperties": false + }, + "renderLinePoints": { + "type": "array", + "minItems": 2, + "maxItems": 64, + "items": { + "$ref": "#/definitions/location2" + } + }, + "renderImage": { + "type": "string", + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "description": "A Base64-encoded image" + }, + "renderText": { + "type": "string", + "pattern": "^[\\u0020-\\u007F]*$" + } + }, + "properties": { + "message": { + "type": "object", + "additionalProperties": false, + "properties": { + "header": { + "type": "object", + "additionalProperties": false, + "properties": { + "authentication": { + "$ref": "#/definitions/guid" + } + }, + "required": ["authentication"] + }, + "command": { + "type": "object", + "oneOf": [ + { + "properties": { + "name": { + "type": "string", + "enum": ["GetMousePosition"] + }, + "parameters": { + "type": "array" + } + }, + "required": ["name"] + }, + { + "properties": { + "name": { + "type": "string", + "enum": ["SetMousePosition"] + }, + "parameters": { + "type": "array", + "prefixItems": [ + { + "$ref": "#/definitions/location2" + } + ], + "minItems": 1, + "maxItems": 1 + } + }, + "required": ["name", "parameters"] + }, + { + "properties": { + "name": { + "type": "string", + "enum": ["AddRenderObject"] + }, + "parameters": { + "type": "array", + "anyOf": [ + { + "prefixItems": [ + { + "type": "string", + "enum": ["Quad"] + }, + { + "$ref": "#/definitions/renderObjectStyle" + } + ], + "minItems": 2, + "maxItems": 2 + }, + { + "prefixItems": [ + { + "type": "string", + "enum": ["Line"] + }, + { + "$ref": "#/definitions/renderObjectStyle" + }, + { + "$ref": "#/definitions/renderLinePoints" + } + ], + "minItems": 3, + "maxItems": 3 + }, + { + "prefixItems": [ + { + "type": "string", + "enum": ["Image"] + }, + { + "$ref": "#/definitions/renderObjectStyle" + }, + { + "$ref": "#/definitions/renderImage" + } + ], + "minItems": 3, + "maxItems": 3 + }, + { + "prefixItems": [ + { + "type": "string", + "enum": ["Text"] + }, + { + "$ref": "#/definitions/renderObjectStyle" + }, + { + "$ref": "#/definitions/renderText" + } + ], + "minItems": 3, + "maxItems": 3 + } + ] + } + }, + "required": ["name", "parameters"] + }, + { + "properties": { + "name": { + "type": "string", + "enum": ["UpdateRenderObject"] + }, + "parameters": { + "type": "array", + "anyOf": [ + { + "prefixItems": [ + { + "$ref": "#/definitions/renderObjectId" + }, + { + "$ref": "#/definitions/renderObjectStyle" + } + ], + "minItems": 2, + "maxItems": 2 + }, + { + "prefixItems": [ + { + "$ref": "#/definitions/renderObjectId" + }, + { + "$ref": "#/definitions/renderObjectStyle" + }, + { + "$ref": "#/definitions/renderLinePoints" + } + ], + "minItems": 3, + "maxItems": 3 + }, + { + "prefixItems": [ + { + "type": "string", + "enum": ["Image"] + }, + { + "$ref": "#/definitions/renderObjectStyle" + }, + { + "$ref": "#/definitions/renderImage" + } + ], + "minItems": 3, + "maxItems": 3 + }, + { + "prefixItems": [ + { + "type": "string", + "enum": ["Text"] + }, + { + "$ref": "#/definitions/renderObjectStyle" + }, + { + "$ref": "#/definitions/renderText" + } + ], + "minItems": 3, + "maxItems": 3 + } + ] + } + }, + "required": ["name", "parameters"] + }, + { + "properties": { + "name": { + "type": "string", + "enum": ["DeleteRenderObject"] + }, + "parameters": { + "type": "array", + "anyOf": [ + { + "prefixItems": [ + { + "$ref": "#/definitions/renderObjectId" + } + ], + "minItems": 1, + "maxItems": 1 + } + ] + } + }, + "required": ["name", "parameters"] + }, + { + "properties": { + "name": { + "type": "string", + "enum": ["ClearRenderObjects"] + }, + "parameters": { + "type": "array" + } + }, + "required": ["name"] + } + ] + } + }, + "required": ["header", "command"] + } + }, + "required": ["message"] +} diff --git a/src/askui/tools/askui/askui_ui_controller_grpc/json_schema/AgentOS-Send-Response-2501.json b/src/askui/tools/askui/askui_ui_controller_grpc/json_schema/AgentOS-Send-Response-2501.json new file mode 100644 index 00000000..864551a8 --- /dev/null +++ b/src/askui/tools/askui/askui_ui_controller_grpc/json_schema/AgentOS-Send-Response-2501.json @@ -0,0 +1,149 @@ +{ + "title": "AskUI AgentOS Send Response Schema", + "description": "Defines the schema for the controller gRPC API Send response.", + "type": "object", + "definitions": { + "length": { + "anyOf": [ + { + "type": "string", + "pattern": "^(\\d+(\\.\\d+)?(px|%)|auto)$", + "default": "0px" + }, + { + "type": "number", + "default": 0.0 + } + ] + }, + "location2": { + "type": "object", + "additionalProperties": false, + "properties": { + "x": { + "$ref": "#/definitions/length" + }, + "y": { + "$ref": "#/definitions/length" + } + }, + "required": ["x", "y"] + }, + "renderObjectId": { + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + }, + "actionId": { + "type": "integer", + "minimum": 0, + "maximum": 2147483647 + } + }, + "properties": { + "message": { + "type": "object", + "properties": { + "command": { + "type": "object", + "oneOf": [ + { + "properties": { + "name": { + "type": "string", + "enum": ["GetMousePosition"] + }, + "actionId": { + "$ref": "#/definitions/actionId" + }, + "response": { + "type": "object", + "additionalProperties": false, + "properties": { + "position": { + "$ref": "#/definitions/location2" + } + }, + "required": ["position"] + } + }, + "required": ["name", "actionId", "response"] + }, + { + "properties": { + "name": { + "type": "string", + "enum": ["SetMousePosition"] + }, + "actionId": { + "$ref": "#/definitions/actionId" + } + }, + "required": ["name", "actionId"] + }, + { + "properties": { + "name": { + "type": "string", + "enum": ["AddRenderObject"] + }, + "actionId": { + "$ref": "#/definitions/actionId" + }, + "response": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "$ref": "#/definitions/renderObjectId" + } + }, + "required": ["id"] + } + }, + "required": ["name", "actionId", "response"] + }, + { + "properties": { + "name": { + "type": "string", + "enum": ["UpdateRenderObject"] + }, + "actionId": { + "$ref": "#/definitions/actionId" + } + }, + "required": ["name", "actionId"] + }, + { + "properties": { + "name": { + "type": "string", + "enum": ["DeleteRenderObject"] + }, + "actionId": { + "$ref": "#/definitions/actionId" + } + }, + "required": ["name", "actionId"] + }, + { + "properties": { + "name": { + "type": "string", + "enum": ["ClearRenderObjects"] + }, + "actionId": { + "$ref": "#/definitions/actionId" + } + }, + "required": ["name", "actionId"] + } + ] + } + }, + "required": ["command"] + } + }, + "required": ["message"] +} From b4613e3577039d6c333996445d88e37643c7ba7f Mon Sep 17 00:00:00 2001 From: onur-askui <210008309+onur-askui@users.noreply.github.com> Date: Fri, 18 Jul 2025 09:07:18 +0200 Subject: [PATCH 13/21] feat: introduce helper functions for json api --- src/askui/tools/askui/command_helpers.py | 200 +++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 src/askui/tools/askui/command_helpers.py diff --git a/src/askui/tools/askui/command_helpers.py b/src/askui/tools/askui/command_helpers.py new file mode 100644 index 00000000..6597b4b8 --- /dev/null +++ b/src/askui/tools/askui/command_helpers.py @@ -0,0 +1,200 @@ +from pydantic import Field, constr +from typing_extensions import Annotated, Union + +from askui.tools.agent_os import Coordinate +from askui.tools.askui.askui_ui_controller_grpc.generated.AgentOS_Send_Request_2501 import ( # noqa: E501 + AskuiAgentosSendRequestSchema, + Command, + Command1, + Command2, + Command3, + Command4, + Command5, + Guid, + Header, + Length, + Location2, + Message, + Name, + Name1, + Name2, + Name3, + Name4, + Name5, + RenderImage, + RenderLinePoints, + RenderObjectId, + RenderObjectStyle, + RenderText, +) + +LengthType = Union[ + Annotated[str, constr(pattern=r"^(\d+(\.\d+)?(px|%)|auto)$")], int, float +] + +ColorType = Union[ + Annotated[str, constr(pattern=r"^#([0-9a-fA-F]{6})$")], # Hex color like #RRGGBB + Annotated[ + str, constr(pattern=r"^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$") + ], # RGB color like rgb(255, 0, 128) +] + + +def create_style( + top: LengthType | None = None, + left: LengthType | None = None, + bottom: LengthType | None = None, + right: LengthType | None = None, + width: LengthType | None = None, + height: LengthType | None = None, + color: ColorType | None = None, + opacity: Annotated[float, Field(ge=0.0, le=1.0)] | None = None, + visible: bool | None = None, + font_size: LengthType | None = None, + line_width: LengthType | None = None, +) -> RenderObjectStyle: + """Create a style object with the specified properties.""" + + return RenderObjectStyle.model_validate( + { + "top": top, + "left": left, + "bottom": bottom, + "right": right, + "width": width, + "height": height, + "color": color, + "opacity": opacity, + "visible": visible, + "font-size": font_size, + "line-width": line_width, + } + ) + + +def create_get_mouse_position_command( + session_guid: str, +) -> AskuiAgentosSendRequestSchema: + command = Command(name=Name.GetMousePosition) + + header = Header(authentication=Guid(root=session_guid)) + message = Message(header=header, command=command) + return AskuiAgentosSendRequestSchema(message=message) + + +def create_set_mouse_position_command( + x: int, y: int, session_guid: str +) -> AskuiAgentosSendRequestSchema: + location = Location2(x=Length(root=x), y=Length(root=y)) + command = Command1(name=Name1.SetMousePosition, parameters=[location]) + + header = Header(authentication=Guid(root=session_guid)) + message = Message(header=header, command=command) + return AskuiAgentosSendRequestSchema(message=message) + + +def create_quad_command( + style: RenderObjectStyle, session_guid: str +) -> AskuiAgentosSendRequestSchema: + renderStyle = RenderObjectStyle(**style.model_dump(exclude_none=True)) + command = Command2(name=Name2.AddRenderObject, parameters=["Quad", renderStyle]) + + header = Header(authentication=Guid(root=session_guid)) + message = Message(header=header, command=command) + + return AskuiAgentosSendRequestSchema(message=message) + + +def create_line_command( + style: RenderObjectStyle, points: list[Coordinate], session_guid: str +) -> AskuiAgentosSendRequestSchema: + command = Command2( + name=Name2.AddRenderObject, + parameters=["Line", style, create_render_line_points(points)], + ) + + header = Header(authentication=Guid(root=session_guid)) + message = Message(header=header, command=command) + + return AskuiAgentosSendRequestSchema(message=message) + + +def create_image_command( + style: RenderObjectStyle, image_data: str, session_guid: str +) -> AskuiAgentosSendRequestSchema: + image_obj = create_render_image(image_data) + command = Command2( + name=Name2.AddRenderObject, parameters=["Image", style, image_obj] + ) + + header = Header(authentication=Guid(root=session_guid)) + message = Message(header=header, command=command) + + return AskuiAgentosSendRequestSchema(message=message) + + +def create_text_command( + style: RenderObjectStyle, text_content: RenderText, session_guid: str +) -> AskuiAgentosSendRequestSchema: + command = Command2( + name=Name2.AddRenderObject, parameters=["Text", style, text_content] + ) + + header = Header(authentication=Guid(root=session_guid)) + message = Message(header=header, command=command) + + return AskuiAgentosSendRequestSchema(message=message) + + +def create_render_line_points(points: list[Coordinate]) -> RenderLinePoints: + location_points = [ + Location2(x=Length(root=point.x), y=Length(root=point.y)) for point in points + ] + + return RenderLinePoints(location_points) + + +def create_render_image(base64_data: str) -> RenderImage: + return RenderImage(root=base64_data) + + +def create_render_text(text: str) -> RenderText: + return RenderText(root=text) + + +def create_render_object_id(object_id: int) -> RenderObjectId: + return RenderObjectId(root=object_id) + + +def create_update_render_object_command( + object_id: int, style: RenderObjectStyle, session_guid: str +) -> AskuiAgentosSendRequestSchema: + command = Command3(name=Name3.UpdateRenderObject, parameters=[object_id, style]) + + header = Header(authentication=Guid(root=session_guid)) + message = Message(header=header, command=command) + + return AskuiAgentosSendRequestSchema(message=message) + + +def create_delete_render_object_command( + object_id: int, session_guid: str +) -> AskuiAgentosSendRequestSchema: + render_object_id = create_render_object_id(object_id) + command = Command4(name=Name4.DeleteRenderObject, parameters=[render_object_id]) + + header = Header(authentication=Guid(root=session_guid)) + message = Message(header=header, command=command) + + return AskuiAgentosSendRequestSchema(message=message) + + +def create_clear_render_objects_command( + session_guid: str, +) -> AskuiAgentosSendRequestSchema: + command = Command5(name=Name5.ClearRenderObjects, parameters=[]) + + header = Header(authentication=Guid(root=session_guid)) + message = Message(header=header, command=command) + + return AskuiAgentosSendRequestSchema(message=message) From a8828ea1e3e35f748d45ba66cfc8515100268b8e Mon Sep 17 00:00:00 2001 From: onur-askui <210008309+onur-askui@users.noreply.github.com> Date: Fri, 18 Jul 2025 09:08:31 +0200 Subject: [PATCH 14/21] feat: update controller to support new commands --- src/askui/tools/__init__.py | 5 +- src/askui/tools/agent_os.py | 115 ++++++++- src/askui/tools/askui/askui_controller.py | 294 ++++++++++++++++------ 3 files changed, 334 insertions(+), 80 deletions(-) diff --git a/src/askui/tools/__init__.py b/src/askui/tools/__init__.py index e6232162..57c6fb4c 100644 --- a/src/askui/tools/__init__.py +++ b/src/askui/tools/__init__.py @@ -1,9 +1,12 @@ -from .agent_os import AgentOs, ModifierKey, PcKey +from .agent_os import AgentOs, Coordinate, ModifierKey, PcKey from .toolbox import AgentToolbox +from .askui.command_helpers import create_style __all__ = [ "AgentOs", "AgentToolbox", "ModifierKey", "PcKey", + "Coordinate", + "create_style", ] diff --git a/src/askui/tools/agent_os.py b/src/askui/tools/agent_os.py index bd845130..2953f44f 100644 --- a/src/askui/tools/agent_os.py +++ b/src/askui/tools/agent_os.py @@ -1,9 +1,15 @@ from abc import ABC, abstractmethod -from typing import Literal +from typing import TYPE_CHECKING, Literal from PIL import Image from pydantic import BaseModel +if TYPE_CHECKING: + from askui.tools.askui.askui_ui_controller_grpc.generated.AgentOS_Send_Request_2501 import ( # noqa: E501 + RenderObjectStyle, + ) + + ModifierKey = Literal[ "command", "alt", @@ -148,6 +154,11 @@ class ClickEvent(BaseModel): timestamp: float +class Coordinate(BaseModel): + x: int + y: int + + InputEvent = ClickEvent @@ -359,3 +370,105 @@ def stop_listening(self) -> None: change in the future. """ raise NotImplementedError + + def get_mouse_position(self) -> Coordinate: + """ + Get the current mouse cursor position. + + Returns: + The current mouse position data. + """ + raise NotImplementedError + + def set_mouse_position(self, x: int, y: int) -> None: + """ + Set the mouse cursor position to specific coordinates. + + Args: + x (int): The horizontal coordinate (in pixels) to set the cursor to. + y (int): The vertical coordinate (in pixels) to set the cursor to. + + """ + raise NotImplementedError + + def render_quad(self, style: "RenderObjectStyle") -> int: + """ + Render a quad object to the display. + + Args: + style (RenderObjectStyle): The style properties for the quad. + + Returns: + Response containing the render object ID. + """ + raise NotImplementedError + + def render_line(self, style: "RenderObjectStyle", points: list[Coordinate]) -> int: + """ + Render a line object to the display. + + Args: + style: The style properties for the line. + points (list[Coordinate]): The points defining the line. + + Returns: + Response containing the render object ID. + """ + raise NotImplementedError + + def render_image(self, style: "RenderObjectStyle", image_data: str) -> int: + """ + Render an image object to the display. + + Args: + style: The style properties for the image. + image_data (str): The image data to display. + + Returns: + Response containing the render object ID. + """ + raise NotImplementedError + + def render_text(self, style: "RenderObjectStyle", content: str) -> int: + """ + Render a text object to the display. + + Args: + style: The style properties for the text. + text_content (str): The text content to display. + + Returns: + Response containing the render object ID. + """ + raise NotImplementedError + + def update_render_object(self, object_id: int, style: "RenderObjectStyle") -> None: + """ + Update styling properties of an existing render object. + + Args: + object_id (int): The ID of the render object to update. + style: The new style properties. + """ + raise NotImplementedError + + def delete_render_object(self, object_id: int) -> None: + """ + Delete an existing render object from the display. + + Args: + object_id (int): The ID of the render object to delete. + + Returns: + Response confirming the deletion. + """ + raise NotImplementedError + + def clear_render_objects(self) -> None: + """ + Clear all render objects from the display. + + Returns: + Response confirming the clearing. + """ + raise NotImplementedError diff --git a/src/askui/tools/askui/askui_controller.py b/src/askui/tools/askui/askui_controller.py index 7021047e..939e1563 100644 --- a/src/askui/tools/askui/askui_controller.py +++ b/src/askui/tools/askui/askui_controller.py @@ -15,13 +15,31 @@ from askui.container import telemetry from askui.logger import logger from askui.reporting import Reporter -from askui.tools.agent_os import AgentOs, ModifierKey, PcKey +from askui.tools.agent_os import AgentOs, Coordinate, ModifierKey, PcKey from askui.tools.askui.askui_ui_controller_grpc.generated import ( Controller_V1_pb2 as controller_v1_pbs, ) from askui.tools.askui.askui_ui_controller_grpc.generated import ( Controller_V1_pb2_grpc as controller_v1, ) +from askui.tools.askui.askui_ui_controller_grpc.generated.AgentOS_Send_Request_2501 import ( + RenderObjectStyle, # noqa: E501 +) +from askui.tools.askui.askui_ui_controller_grpc.generated.AgentOS_Send_Response_2501 import ( + AskuiAgentosSendResponseSchema, # noqa: E501; noqa: E501 +) +from askui.tools.askui.command_helpers import ( + create_clear_render_objects_command, + create_delete_render_object_command, + create_get_mouse_position_command, + create_image_command, + create_line_command, + create_quad_command, + create_render_text, + create_set_mouse_position_command, + create_text_command, + create_update_render_object_command, +) from askui.utils.image_utils import draw_point_on_image from ..utils import process_exists, wait_for_port @@ -248,6 +266,7 @@ def __init__( self._display = display self._reporter = reporter self._controller_server = controller_server or AskUiControllerServer() + self._session_guid = "{" + str(uuid.uuid4()) + "}" @telemetry.record_call() @override @@ -363,7 +382,7 @@ def _start_session(self) -> None: ) response = self._stub.StartSession( controller_v1_pbs.Request_StartSession( - sessionGUID="{" + str(uuid.uuid4()) + "}", immediateExecution=True + sessionGUID=self._session_guid, immediateExecution=True ) ) self._session_info = response.sessionInfo @@ -737,9 +756,6 @@ def get_display_information( controller_v1_pbs.Response_GetDisplayInformation: - displays: List of DisplayInformation objects - virtualScreenRectangle: Overall virtual screen bounds - - Raises: - AssertionError: If the gRPC stub is not initialized. """ assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( "Stub is not initialized" @@ -753,31 +769,6 @@ def get_display_information( return response - @telemetry.record_call() - def get_mouse_position(self) -> controller_v1_pbs.Response_GetMousePosition: - """ - Get the current mouse cursor position. - - Returns: - controller_v1_pbs.Response_GetMousePosition: Mouse position containing: - - x: Horizontal coordinate - - y: Vertical coordinate - - Raises: - AssertionError: If the gRPC stub is not initialized. - """ - assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( - "Stub is not initialized" - ) - - self._reporter.add_message("AgentOS", "get_mouse_position()") - - response: controller_v1_pbs.Response_GetMousePosition = ( - self._stub.GetMousePosition(controller_v1_pbs.Request_Void()) - ) - - return response - @telemetry.record_call() def get_process_list( self, get_extended_info: bool = False @@ -793,9 +784,6 @@ def get_process_list( Returns: controller_v1_pbs.Response_GetProcessList: Process list response containing: - processes: List of ProcessInfo objects - - Raises: - AssertionError: If the gRPC stub is not initialized. """ assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( "Stub is not initialized" @@ -822,9 +810,6 @@ def get_window_list( Returns: controller_v1_pbs.Response_GetWindowList: Window list response containing: - windows: List of WindowInfo objects with ID and name - - Raises: - AssertionError: If the gRPC stub is not initialized. """ assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( "Stub is not initialized" @@ -849,9 +834,6 @@ def get_automation_target_list( controller_v1_pbs.Response_GetAutomationTargetList: Automation target list response: - targets: List of AutomationTarget objects - - Raises: - AssertionError: If the gRPC stub is not initialized. """ assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( "Stub is not initialized" @@ -884,9 +866,6 @@ def set_test_configuration( Defaults to `0`. keyboard_delay_ms (int, optional): Keyboard delay in milliseconds. Defaults to `0`. - - Raises: - AssertionError: If the gRPC stub is not initialized. """ assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( "Stub is not initialized" @@ -921,9 +900,6 @@ def set_mouse_delay(self, delay_ms: int) -> None: Args: delay_ms (int): The delay in milliseconds to set for mouse actions. - - Raises: - AssertionError: If the gRPC stub is not initialized. """ assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( "Stub is not initialized" @@ -944,9 +920,6 @@ def set_keyboard_delay(self, delay_ms: int) -> None: Args: delay_ms (int): The delay in milliseconds to set for keyboard actions. - - Raises: - AssertionError: If the gRPC stub is not initialized. """ assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( "Stub is not initialized" @@ -968,9 +941,6 @@ def set_active_window(self, process_id: int, window_id: int) -> None: Args: process_id (int): The ID of the process that owns the window. window_id (int): The ID of the window to set as active. - - Raises: - AssertionError: If the gRPC stub is not initialized. """ assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( "Stub is not initialized" @@ -993,9 +963,6 @@ def set_active_automation_target(self, target_id: int) -> None: Args: target_id (int): The ID of the automation target to set as active. - - Raises: - AssertionError: If the gRPC stub is not initialized. """ assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( "Stub is not initialized" @@ -1027,9 +994,6 @@ def schedule_batched_action( Returns: controller_v1_pbs.Response_ScheduleBatchedAction: Response containing the scheduled action ID. - - Raises: - AssertionError: If the gRPC stub is not initialized. """ assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( "Stub is not initialized" @@ -1056,9 +1020,6 @@ def schedule_batched_action( def start_batch_run(self) -> None: """ Start executing batched actions. - - Raises: - AssertionError: If the gRPC stub is not initialized. """ assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( "Stub is not initialized" @@ -1074,9 +1035,6 @@ def start_batch_run(self) -> None: def stop_batch_run(self) -> None: """ Stop executing batched actions. - - Raises: - AssertionError: If the gRPC stub is not initialized. """ assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( "Stub is not initialized" @@ -1096,9 +1054,6 @@ def get_action_count(self) -> controller_v1_pbs.Response_GetActionCount: Returns: controller_v1_pbs.Response_GetActionCount: Response containing the action count. - - Raises: - AssertionError: If the gRPC stub is not initialized. """ assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( "Stub is not initialized" @@ -1125,9 +1080,6 @@ def get_action(self, action_index: int) -> controller_v1_pbs.Response_GetAction: - actionID: The action ID - actionClassID: The action class ID - actionParameters: The action parameters - - Raises: - AssertionError: If the gRPC stub is not initialized. """ assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( "Stub is not initialized" @@ -1150,9 +1102,6 @@ def remove_action(self, action_id: int) -> None: Args: action_id (int): The ID of the action to remove. - - Raises: - AssertionError: If the gRPC stub is not initialized. """ assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( "Stub is not initialized" @@ -1170,9 +1119,6 @@ def remove_action(self, action_id: int) -> None: def remove_all_actions(self) -> None: """ Clear all recorded or batched actions. - - Raises: - AssertionError: If the gRPC stub is not initialized. """ assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( "Stub is not initialized" @@ -1195,9 +1141,6 @@ def send_message(self, message: str) -> controller_v1_pbs.Response_Send: Returns: controller_v1_pbs.Response_Send: Response containing the message from the controller. - - Raises: - AssertionError: If the gRPC stub is not initialized. """ assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( "Stub is not initialized" @@ -1210,3 +1153,198 @@ def send_message(self, message: str) -> controller_v1_pbs.Response_Send: ) return response + + @telemetry.record_call() + def get_mouse_position(self) -> Coordinate: + """ + Get the mouse cursor position + + Returns: + Coordinate: Response containing the result of the mouse position change. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + req_json = create_get_mouse_position_command( + self._session_guid + ).model_dump_json(exclude_unset=True) + self._reporter.add_message("AgentOS", "get_mouse_position()") + res = self.send_message(req_json) + parsed_res = AskuiAgentosSendResponseSchema.model_validate_json(res.message) + return Coordinate( + x=parsed_res.message.command.response.position.x.root, # type: ignore[union-attr] + y=parsed_res.message.command.response.position.y.root, # type: ignore[union-attr] + ) + + @telemetry.record_call() + def set_mouse_position(self, x: int, y: int) -> None: + """ + Set the mouse cursor position to specific coordinates. + + Args: + x (int): The horizontal coordinate (in pixels) to set the cursor to. + y (int): The vertical coordinate (in pixels) to set the cursor to. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + req_json = create_set_mouse_position_command( + x, y, self._session_guid + ).model_dump_json(exclude_unset=True) + self._reporter.add_message("AgentOS", f"set_mouse_position({x},{y})") + self.send_message(req_json) + + @telemetry.record_call() + def render_quad(self, style: RenderObjectStyle) -> int: + """ + Render a quad object to the display. + + Args: + style (RenderObjectStyle): The style properties for the quad. + + Returns: + int: Object ID. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + self._reporter.add_message("AgentOS", f"render_quad({style})") + req_json = create_quad_command(style, self._session_guid).model_dump_json( + exclude_unset=True, by_alias=True + ) + res = self.send_message(req_json) + parsed_response = AskuiAgentosSendResponseSchema.model_validate_json( + res.message + ) + return int(parsed_response.message.command.response.id.root) # type: ignore[union-attr] + + @telemetry.record_call() + def render_line(self, style: RenderObjectStyle, points: list[Coordinate]) -> int: + """ + Render a line object to the display. + + Args: + style (RenderObjectStyle): The style properties for the line. + points (list[Coordinates]): The points defining the line. + + Returns: + int: Object ID. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + self._reporter.add_message("AgentOS", f"render_line({style}, {points})") + req = create_line_command(style, points, self._session_guid).model_dump_json( + exclude_unset=True, by_alias=True + ) + res = self.send_message(req) + parsed_response = AskuiAgentosSendResponseSchema.model_validate_json( + res.message + ) + return int(parsed_response.message.command.response.id.root) # type: ignore[union-attr] + + @telemetry.record_call(exclude={"image_data"}) + def render_image(self, style: RenderObjectStyle, image_data: str) -> int: + """ + Render an image object to the display. + + Args: + style (RenderObjectStyle): The style properties for the image. + image_data (str): The base64-encoded image data. + + Returns: + int: Object ID. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + self._reporter.add_message("AgentOS", f"render_image({style}, [image_data])") + req = create_image_command( + style, image_data, self._session_guid + ).model_dump_json(exclude_unset=True, by_alias=True) + res = self.send_message(req) + + parsed_response = AskuiAgentosSendResponseSchema.model_validate_json( + res.message + ) + return int(parsed_response.message.command.response.id.root) # type: ignore[union-attr] + + @telemetry.record_call() + def render_text(self, style: RenderObjectStyle, content: str) -> int: + """ + Render a text object to the display. + + Args: + style (RenderObjectStyle): The style properties for the text. + content (str): The text content to display. + + Returns: + int: Object ID. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + self._reporter.add_message("AgentOS", f"render_text({style}, {content})") + text_obj = create_render_text(content) + req = create_text_command(style, text_obj, self._session_guid).model_dump_json( + exclude_unset=True, by_alias=True + ) + res = self.send_message(req) + parsed_response = AskuiAgentosSendResponseSchema.model_validate_json( + res.message + ) + return int(parsed_response.message.command.response.id.root) # type: ignore[union-attr] + + @telemetry.record_call() + def update_render_object(self, object_id: int, style: RenderObjectStyle) -> None: + """ + Update styling properties of an existing render object. + + Args: + object_id (float): The ID of the render object to update. + style (RenderObjectStyle): The new style properties. + + Returns: + int: Object ID. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + self._reporter.add_message( + "AgentOS", f"update_render_object({object_id}, {style})" + ) + req = create_update_render_object_command( + object_id, style, self._session_guid + ).model_dump_json(exclude_unset=True, by_alias=True) + self.send_message(req) + + @telemetry.record_call() + def delete_render_object(self, object_id: int) -> None: + """ + Delete an existing render object from the display. + + Args: + object_id (RenderObjectId): The ID of the render object to delete. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + self._reporter.add_message("AgentOS", f"delete_render_object({object_id})") + req = create_delete_render_object_command( + object_id, self._session_guid + ).model_dump_json(exclude_unset=True, by_alias=True) + self.send_message(req) + + @telemetry.record_call() + def clear_render_objects(self) -> None: + """ + Clear all render objects from the display. + """ + assert isinstance(self._stub, controller_v1.ControllerAPIStub), ( + "Stub is not initialized" + ) + self._reporter.add_message("AgentOS", "clear_render_objects()") + req = create_clear_render_objects_command(self._session_guid).model_dump_json( + exclude_unset=True, by_alias=True + ) + self.send_message(req) From dfcecc8488bfc32aea48ec146d971d3d0aa488c7 Mon Sep 17 00:00:00 2001 From: onur-askui <210008309+onur-askui@users.noreply.github.com> Date: Fri, 18 Jul 2025 09:10:17 +0200 Subject: [PATCH 15/21] test: add tests for newly added controller commands --- tests/conftest.py | 7 + tests/fixtures/images/logo.bmp | Bin 0 -> 634938 bytes .../tools/askui/test_askui_controller.py | 197 +++++++++++++++++- 3 files changed, 194 insertions(+), 10 deletions(-) create mode 100644 tests/fixtures/images/logo.bmp diff --git a/tests/conftest.py b/tests/conftest.py index 83e27bce..e84c3007 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -67,3 +67,10 @@ def disable_telemetry() -> None: from askui.container import telemetry telemetry.set_processors([]) + + +@pytest.fixture +def askui_logo_bmp(path_fixtures: pathlib.Path) -> Image.Image: + """Fixture providing askui logo as BMP.""" + screenshot_path = path_fixtures / "images" / "logo.bmp" + return Image.open(screenshot_path) diff --git a/tests/fixtures/images/logo.bmp b/tests/fixtures/images/logo.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5b6a07b437a3b0dfce5c963f938848ee95077c07 GIT binary patch literal 634938 zcmeI5O{iQ)dWJnD1SZ=M$ZD2G2{Vgp-7!IC@Mt86)ZORwC~##E!di$KOTq?Sf^!EE zGz=GEV+$sh(L!Fx0z>45q(~q!!CJ*D8v@$NEAO za6KHIKBs=3`o6cTtG=rGRdwL*k6&v3_ksTVH~sfNKN|h_qnG}!x&6}J{~Ue({XfS4 z_xz=oMt{wn=fC==fBu(0e)+%qj{Vn9{`M!AzWdSs{rmssx4-@E%lhxHu3fwK<6r#s zH-EA3pwy~o%4UtjG%ygazGJ-Bh9y0WRidh1m4clP-3 zWVPV0K7ZoHlb6ouExq0(a%Wo!HYq>3nP8PE5(FRs0p|opLMrte>1QLG2VeX3%liWS zDWm$_aY=C_!jj*Im(gD5?Ms3XfPhy5O{ekEC;cx!8rIDR!?&w<-WYBi86G?^ zJn(7&A?=XGaR1uy$m=R(b#|k=^p=XP!mA4UIyn0D*3oAVyb>dE2tWV=3kXPv)F)Ku za5y~NLElWgqN=Has%E3Q&%fXg0uX?JZvqY?wFkMvgk zTPD#Q+8#+kAa4Tdo=IALt5bgI*Qbxsv(4Kzs2v1WA)tt+W&$fzJXL-gJF1a-w)Lem z5?h9CSFuLkg+Mk0UPvng0KnLv7rUXYwW>GmtT$GZ27)D*|#T?Yf`0Zcw|W2q=fvV1!i@_hdk1xgKt}>Q_q45Rb?J-_r!Gn~sB8xUT8&$6y{RM1 zS&G}y-S!%$BiYOd&~fdcGrS@KbZaw{0;=PlfWig{$|^f-VD&Ex1s)t_<3zfq5ZH}C zeR8n6i;)5Zbb6!v4!~{}OD+(wLZFGuVo5ALSa$^UgQ)lTQ!DmQIU(Sc0C8FLJUtQ6 zw5eCqC2sSZ4@J)a)T7QmA$_Wx^y04sF=x*%M zw?O5Q{`VUlumbms1Oid9$vHKFZ%jcCi&LUo>V3^d4Vle87h?kfuWdGEr89b?!v*VnhPfjSCJP zfutbdl>h;>5w(J>I}l)ffmcBwaUTR&c-z6#c_jjYoqILM8ZrQDlR&dhfqfCp4o*gp zyWp(Yf51ooiZnwKXohE*1q&`6CCKCIbwpr8N&$KKBfu=!>S{m=&I$Cs{cO0-*<1Vk zIX)?eB%oEdGHK^-LV^(JOh7x&hjan*f`D%V9H!7&4S3Nx0ipsMqJ_wn-n6oD;XUflKx?WTszBC|dS5Jg~D6DYZJ0^0b=rU=T1t3)(H^MRjeL5uef5ct-Ax|hky?PoCxMzZOTlLm0UjDvrU>B_p2_R))xJP zhnIEk(jNqd#q&XtMAvK01E^<+|*5Kf4 zIF2U*`sF^jy&bEGrL+tkcxqWC+sG^%8npY;kL3a>m!K9)G$3J0F!sfItFI z8f&6Iqd7QF)h{_&!VF4N(Z%)En$42k!BgF}%5^dJbUsy4JwYfrS-Dj@O-xB563~L6 zk{!WU-PhN8-`$GXtjlHn^cG7_d{{zn$u-f-wHi@UCJ5;C!~QRQSXaqu*5@|NEv{tg zv=57|`v;GvH{FSnha8p1e#ziw$*YyP@u(A zc1>cktZvINYzg~;hj&=%?_0<4*J?moX(q?Y|r zf=TaS#K66gu$6&{P^*;-$(mU&z7ub|!bxFtd(HYUAEv@q-fpcl!PHpN<=k;Hh$Wb3 zs7!u2w-!RV<{4Wa_X*Z=?lMX+o2jl@Bd06t!(iC_aMsfDxWi%(jqF_=;(^Z(SQ1gDSrFqOj76jk%K(P9==2Z$Hm z&_1ePpB%82K{oC~G^`IFQJR^>Yt1uw#c_E8Sa`B*emKwMY~3ds){`S=KN34>=X_0j zvLe>lPMVp?>t_#GGwaJcN;Ww3T zn=*QKb$!Sa%)*l`@cTNtF}o@Nvt9n2w?4b!s+p{$qbmF3S$N9Kd|B~=ACyz)$go4K z>m6dpQc&RUJI<~hx4!cWc9;EucC9c26*3(TW^(QblL?wWw5yvPs>+iDxOPi`O$@r3 zWvsV2=D@A}&!#pgDR66K#)F#|XE|`kA%UVIRbpwQlYE=qm6@LKHcBw^ss5inaMD)GPtHEwQpDJc1=Tv)1eUPXDV+j_zu2(yFp^j3hWkpgwoJeT(p96as8u zIAye+{)xtV0!y;l@8lLm7#(IxCpL_e>c}34t!5%APALjwT5J@PvOCa;4dVsM1&s}c zy1BI)}M>IAV>H;%j2k$gBmQHL)XY4)tBuz8$S1QH|LK+xdS$~$?Ib}Mr zAzh%rIWIIeq=C_u?W}~JUZfKn(*Bi~HjVVul*uNG#)h^r_B>2!Q7xU=(Dr}-{ba?^ zQ^C;Kz&2LYK^vZo)>X1}Vgnn$vg_a8cGY}V(m`V*nAz9GEpt7@|9!thu^eppllvPW20D_PEyOpgiKb1BN09C{W8z3 z>eI(e8q5ll2x#m)WAJ^SjbbAD8ryXEHt%`q50AVavE8F&jmFM12H*D!491RP;k#za zw#mNDdv5wa`{}MNlJQM6cCIma{xMbHX2t3FQFZ=Atac|~g>$512?0ui#>TSw`rJl< z_9cs532^LeEVEa>rOo-Gv9XLzZoaGgbJI5g!eV3D{3zejRy(4x5$%m*Xnf1*uIcM& z)QF8v)*?{UZ~+<{(dJA0(X^}Lg}%wr-kv8K+Bj5EmXF4^F$rJKtgrQU?u8ba6(apI zD5|C!eYIu++GVI}<@|_4W8<17yB!ABZPw4mHTZGvgO4`@H+`(^(AaUKN4a2&n2?q~ zxc`2XRwmO~0>k}l{WA8TLt|%KKkyya)drK<;rd$O#wEK21QcLU!iWJHyTAs*d{kN} zOE5*9%7~DyF!sDuE+tHUp|MMugr|p#3T2s+zF_|(WXqHFu9$50U0F1CMGJBAdI{g= z!L)Suj0o9EHS8h#-*ITH6Omjok?hTEcijsZMaDqEiYDsy^}J&Y&{(g=(?0P+=2&Bi zt$r!AZwsCbPhgO5i~$-O-kf&Lk>LW5^2Uv1_~USXqcoj`$31shB2F#xv&_)xyAa|oCQQe4p|R=M(x@a^ zhOao3&83neq98T%?p7X+8`zzyKx4Z#y2rOzjNoX+1Q7)ut+d^;0=EUwuM&$RX=tol zGjNic-LLGWI+?y7uC8o4X$}%eihza=Y=s=4u}Rs_s4x---}+NR`V7VW84QP8!{9A{_GN;46TAU}F57ck2j?Q`2{-;zrV+4nt!Xw_~hN9f*vhQB9*IVK6q9 z=?2bM@m-0FEgBoxBwA)?=%-McBFtcHOH0e?F@+y!(+_oS8}~_OnHU<5Tok;7f{YY%JC|{gqcJ6BJXT5P`l``<|t^`d_i%W)*`mtx{AT0kS2p<#yQ`n>d2>aL z9XGDN@0wPiXX`FthAq3t*0t=#aCm4>%eVf3Mj8X}v)cdff2Tv+!E9V=so(RrOor$n1EtF^RpjK?kD(#+jM9d z72InICXB|8?7ta3Kxy}Ckx6}!T#TiIi!VKf2S1x-UQe#I3 zfYP>aBdr7p?={wQ)WVtegwuag%YPDY5se$rcUoXb;Wc(-FzReDY`&mfMjuHo68EnJ zi(rk1T;>C@G*)f&VmgfRocW^%)rW7-8Z&nm6R6H^Qlw*>e%i);5)2EM2&r69y@pSi?}|2LVGwktXCdMRqwo!loOdKOdhKa zjjr;OFX!QU4r>u#WB(kB(!c+n!+PbBl;pyMtR+>*40hZ~d6H|7wtn`2F~BMDNk?PV zb~;O)P>{(6lDY0-(trMj;;}IS?Pxd2(A>2KHpg|bc+o@}FaS6)0GO1<%A(Xj%u$YI zL7Pch^s=~R9@DdUp>Ngn4^P>%ee(;STg8@A)7Vk-v5Eb-P4~2C9+)Jcv!Tc6EMBCu zl53J`hwH4OJ0?1%9gHeXja8engk;p3>>|6AgKKKLgBK+7is50{nK3Ix4KXk~va4h@ zR-V-i>=eKCL^d6prKGa+!*+kA<}pez*>HB-!tHl%${O3qZ1GD-WT=yN%k^Rcc1M}A z{4!->g5)}JjU72u$zwYlp14?4r#>}$0)pmwrz(=iKlM}8ZJ*F$Y9=&R_GY(#vZ7UR z8p2X)qy4E?1Rmw}EIYBIhNCNMMPt=o^~pgL`;VJxu05Qkl(YTA7T0p-G}X0BOKG^T z&j0A21u9`kV~;+)rIX4R)FsQ0G!?Ro-Ofzo^2~^UIU6XUeG4Bku%xly3rm5MmFQ|AB^{>yD_G%8YHY&$Z#!(b0=q`zpHvn#wltY# z8A3~E*UZt_u&rE_a@57nJu5BZyqrcgwkVm+c+$D0c(#1ZVrNNXl`U&${V}56w8j>)CR)ZB-9bzg zU~uEY*sx7p6cw0PY;=KXjg{l8;j-V;fTdn772e!rsJ;|hRxOXm$~?i=y2i@(EY5T+ z)yqO-TPlpXHP@xhW|q0;D+7&{1Dfl=ET^%T&a@Pn!XGoYSwRNdaW7?Z<_2??^3!<_ z=b^EU%;r1)#g+vv9od$~maxKWs^PN#$+@e{W}~qg56q&mQ?5GipY>Tw8^Y*l?|Bu; z_P$P3EbsW~Y&2G8+57gh;V=Gi*RK-OH|x{KvUNJA8!y;euvuofh{a8NR#cCiG*&`1 zxc2UfKoWets0g1`zD>~BRp^CzH~T1{SpmsRW3!CGLt|UIzb%a|bNSxz$m_Ezl=q#? zG*-@-UwjA}i^jGjkp5#5oV*ovws!exY<`npXlzUApdZ^3RK&;7*og2QW}Vr}Xf(E^ zZJ@C&K}CEFjg1K3ZPqyrt)sCmZ3B&M2`b`aXlz9IZnM^2RkH&lM(?1pEo}phZ3!yk zV`ywd_|CJo<#7x2AB}Bk8@5`!%q=U?*p|j@;<0SvxX{>^_GU|COWSm7)QD(oOJlb3 zSRQd)XlzS+(}K7KKL=9#sKm9j&%Z!pTN<;O$9C>!5c8~M_-24RT^qY>t!?cIQx6X> zTfq#TM`JT+#HlJ|u+#HrR zmd#^mY&K0fSrO|?5+ogy)!}*`0drfm7dY*O#?G@|>-SABN#LxRmgZ+pV|5&M%c^Db z7#f>RQ%+UHbbvvDy`8D%Yxz%mKUj43chp(J@VTS0;hBfY(R8eAnVUIxFbs=}`(&9N zYHIftG}dn0?OAeL0qT>%oM`NxjXQe4Vhl-XtG&?Jmd0%HF?&BGU*0!T+A=qD?qFm6 z$JZynn@n7nHV}lyb}(!!uh<fh(W{Xc69WJnlI#!u22I&oM{yrA2@cE*#;h6``QQH^n zUmJHJOkC)!(CT-%Pv~@sBwdU-@7MCGR+F|ySUuf*C(PnnX+)9M(ozA&|O-h!zYmFH6cJ4W6 zl1_qXY&vb>t0d1J*z!AH9E`_kEx@8^H(O0SRoc8~Inme!rkl-2hK@y0G;cQ8gH^=h zGK49a9ppPOi^c|Xgoqg#T2ZS5A0vV?nsvQ#WJTFq?GVR)4%ibJ(_;xxi zxME3$>#t-OBDv{o6&XVRzf^{VzY7Csuav%VP70n?+;YT6?moSqUwW zTqMgd*@Br{%GXl)wLBq%Q-{#lWF5zC!8Fd<(y-$`)_Z*2ZN*DS&D>JHrEE;5Yq~>= z#+KlNs-u-1@Ot0n7P=G0z?M=ia}O)n!0twfXlxi4h@Oj;X_2GP9zgja@^w~t zjnG;gIzVGBI#h=;Ycs3PwjJ!ndU&`))p$h&s;yJOnkjBZ=9CtVEyP1j>@u47-XLBr z&C2f-SNg0Il&lQWqOo2rKb^!)Xe_&PcQzR7yU2FaUiE3UPCW5-VQ6e;tG4x`361T4 z^QkSWNtIUH>2y=74BpaqZNrTtS|C6*4*o=vU7|ixH1N@TdcR-pZ) zTxB#i<<=>sZ0npw`-LlwwX%t2DYpIcJ~XzRwobOD492<=Sfx|iqS|DwdR#Cxc8r3H zSOjuC^x2_uwofYWy<}sV=qmZ5v8&MIT_*&3Pd;z2Aw0P!0WB$Y(k>+8ga8`r1S5%b zCZG+J_7n{sSc(AA1)Z(Y$BSsJ52~cuo&XUAOX+9Jhpik#+}=*?K8eQKZMz&wPDH_T zXAuRH@>|Z9-RXM)8k>F_Wn4lw<(?Eqhu0>Ky~x;vOxpkO4n3>SDe;C8##ps|TGM1jR%pkS)!>Gq!t7bN0SXlx=4 zQD89`C~zyPv#Bv$kb+yGu_?4diDh7*z~?~0NN*V~NWrtv*c4i!z%o>q&dm0^xZ{=p zixE=rEHpNSRw%Fx3>3JP(|M_}7$LfIp|R1Mpu_^O^uYf>!AN!cx3^0)uy!;4VaTAd zVK|e^B!T|@_vZDxxbK_*hkQ-iUifP?Hazpfb7Z$z=PJ55L3Wgl>v3poT>b^-&Tg@b zCDHw-JNF3Uis)!)Y()4aW=+UesFB!7ttN;oqOYN`5#bk@H6dG*(iiNS!x19-8X6lB zet}sNvK35Mr!pdlE0(*Vv9ZV(n6KP?%JKPUFaq^i4xrf=#p%%4DA>!)v^swxn52-= z6ah^&mT7g-YmLT6Z-R0PP+i%aa(w<7j6naZtL0c)QZ+?mlWLB<3)B1RYA{J5qiF&= zck{NcWNU}UCfhW*6-?`ApFNm%{1|~u#g>6}wNZQujg5l6z)S}>FBU6q=~SFR+3>E1 z#)fBJV2-SxO+;qd?J&Iep|Rna7nmbqv59D`ioq5!fgKQy4Gg@%?C8X%Bd{t7=X?eB zK{Pfn@B*`=6PuLAHeK0+2MV;qSXD-2W05Z;Upld=39QP)ZigYg4~-2;yTH8Y#3rb* zbY(+&A{rZ#c4>LhiA_^r>B@%mL^L)e?b7n16Pv8Y(v=P7jA(2y)TL!aCpKk)RoV0n zSei{nsjqg5NZb;f7mv*`!dM!eSm&neJi+?h@i4|vaxQ3W$*u3N?sQ_E>!Ftfckb5p zA%A8-$|6wUDa`#peL&NDB_Oxe;U-=*fjwkg6W|ycufEV|?9Jbo<_m0A?ANGtDk1{w zS_!>6srL2tYZ5QVIe;LMN)5`}Hd$3p1b&vqDA1z33SfZ5^_|GdFMrNhT|6D25tGV7 zRrbfT^prW;+f)yB?3k?l^5?nrxs5UBLM}Kw&YwAH9HtN}%CDNk{cHXVqvVu_^`ZQ% zWpRz_jUy$uxWBq{?CfI0OZ?O7(p&y)qvVu_2VPCQ>75sk?`uy6Uv0hVys=0y7yvlR!-KEoYFcz+-CIlUKYViah4%Gg#K5`ND8Vd8WmPF3tO`%F|IPLG-pZ3k2{2;d z+|AXM%`J{==iYFg%`O~o;7K&BQO)d7Yz5{y*O|f-tnwOUQ*{b&Q0LVr8n%N{*?ooG zWu1GF63k|@n5i!J=D{%sX5+&<>pW|0o%>NHBL*5JIQW`#IE5#eaqvlJ2`b@5eh)f# zd>smG-ExQ}aBdZYyvC8NTX@Lw_t=%o!>MG0k2ga$qT9Txk2jqwOyLPCTC%ru&uuf2 znk53-%Ao(t!o9$G^|ipi_w8qv%;5PKDzFaFagL(!1c&`!vMGTrNAOYF{#REEcLX2R zAFjW0^yw`h?d2uSr?-gI@?i$-zwO0b4Njj8hlhL^Sm9|JI=hxLXMNZz8^0j1V*-S7 z`EW6%X=43Xb>o7k>X)2sGYtFW=Geu!fI#o@^^!fpU)>X*0%MZPQ`56%7Ezrgz?n^+ z+^zcEsT60Hckb0&r#w};@MKvtJ1Z~T84+MB15e_hsQ#o@foXRI78-bJYocM1)5Qd; zbH_c|9?9y5c?um`#s~bFBAXH{mKQ!10Tw3sb3mmWw?nHrIJ&R?+Lz@9NN7s}gc6`%jX;7h z#+*|w&EiT9efF@S!K56i^HZNcF}SkX|MH_IobuTNCnlt%`VTK_c3aD1mBnO^TstRV zap|-ZGb0fv1c)?n?ve`<)Cyb;BS;(dJ7U?{F%3R^FRI6t$bu~R$SnbVKRR(V5-FKL zeRAN|EJ>{;0nJa<7f)-VN`I2j>A&xLs#*rCHJdFHka6W@q*FM7iUmQQ2WIoooT6$Wrzl(&sJ>eQtW79NK&b3u0vQ~5;Z`3=ZFK_8 z+61;hq&EuzEhHHpUUo)ubq6Gc5(pr(i~BZwS^@zCwgjz$axn%QU3p3?00CW7Zpc4#B|w-~Y2ubn zeHDYvDzIFIg?fpA%$u`i(-E9vOTwN8$WfLA*o&Z8O-r!i?9i2^$dp_unRJ4VMv;mo zpp6jOZ?#UVAhb?590=CUm! zfo(QRfBpr35J;1NLT7a}=dy;)^AJdZ070;6stTo=B~V>DlY+}o1_-n#Kor5OBXcKZ z0y_7ky?OH_1mY5qxu)z*lnnyA5?~fAu5OTf8v@L5?drVTv_hbn1!LFQ@@9_Oh+7KJ zG~2u|!^H%jeF8cWtnMF7!KWw#1V#jg{e!))u3G7fGCQCtD@4EUma`6xT_E6 zB25U4324CrN}IkIIxnGuvefirGvERO5b#O>rFAZ1$tK9$mRDCIaR@9RfYK%_j7|!M zx-Kw&K7v3n0w}E$K}#wT4F_pE_h2SOMi79&o&-?Zq(riFVXCcDYRWyEn+G5OfhYt9 zH!l)N+gabDzu4z2n09M(qBs|sLf{2~XAg9&^We()>ih{-<3^Xw#RX6U)n_-fny)#D zo3mmOSO^#-pdX&v2At0AVyz4OshUG$0xTt%tBg=avv%Sfu#sEJ=@dATxm`@ z>1anR1_YL}G#-XP$pjQuG>SuD7-7NJgy2Y8n>c|dH%qn_>J9-2tU^HDGwr&spd<8l zq_;v*UD>49x{6WpE(9PjOJFo?+vx3)*BA8eviwL@MptJ|f;$j^fF}a|Z>|sSY&S6p z!^2sMsw$(X^G5aI+bXsSuPXE&eZu(a-i>Z>T{)G4K*j``NwkNT)%Ddc zZuNdORV0ZEqrHugo~)FqvQ_~!j!M5YV@soI5P-lW0co%PnrXE=+s)sN3sORDV$~n60_fO^-A;N_bMte9|dT>t<8 literal 0 HcmV?d00001 diff --git a/tests/integration/tools/askui/test_askui_controller.py b/tests/integration/tools/askui/test_askui_controller.py index fb940a18..28fbe87f 100644 --- a/tests/integration/tools/askui/test_askui_controller.py +++ b/tests/integration/tools/askui/test_askui_controller.py @@ -1,3 +1,5 @@ +import base64 +import io from pathlib import Path from typing import Literal @@ -5,10 +7,14 @@ from PIL import Image from askui.reporting import CompositeReporter +from askui.tools.agent_os import Coordinate from askui.tools.askui.askui_controller import ( AskUiControllerClient, AskUiControllerServer, ) +from askui.tools.askui.command_helpers import ( + create_style, +) @pytest.fixture @@ -132,15 +138,6 @@ def test_get_display_information(controller_client: AskUiControllerClient) -> No assert display_info is not None -def test_get_mouse_position(controller_client: AskUiControllerClient) -> None: - """Test getting current mouse coordinates""" - with controller_client: - position = controller_client.get_mouse_position() - assert position is not None - assert hasattr(position, "x") - assert hasattr(position, "y") - - def test_get_process_list(controller_client: AskUiControllerClient) -> None: """Test retrieving running processes""" with controller_client: @@ -179,7 +176,7 @@ def test_set_keyboard_delay(controller_client: AskUiControllerClient) -> None: def test_run_command(controller_client: AskUiControllerClient) -> None: """Test executing shell commands""" with controller_client: - controller_client.run_command("echo test") + controller_client.run_command("echo test", 0) def test_get_action_count(controller_client: AskUiControllerClient) -> None: @@ -202,3 +199,183 @@ def test_invalid_coordinates(controller_client: AskUiControllerClient) -> None: with controller_client: controller_client.mouse_move(-1, -1) controller_client.mouse_move(9999, 9999) + + +def test_set_mouse_position(controller_client: AskUiControllerClient) -> None: + with controller_client: + controller_client.set_mouse_position(100, 100) + + +def test_get_mouse_position(controller_client: AskUiControllerClient) -> None: + """Test getting current mouse coordinates""" + with controller_client: + position = controller_client.get_mouse_position() + assert position is not None + assert hasattr(position, "x") + assert hasattr(position, "y") + + +def test_render_quad(controller_client: AskUiControllerClient) -> None: + """Test adding a quad render object to the display""" + with controller_client: + style = create_style( + width=0.9, + height=100, + top="200px", + left="10%", + color="#ff0000", + opacity=1, + ) + + response = controller_client.render_quad(style) + + assert response is not None + + +def test_render_line(controller_client: AskUiControllerClient) -> None: + """Test rendering a line object to the display""" + with controller_client: + style = create_style( + color="#00ff00", + line_width=4, + opacity=0.8, + ) + points = [Coordinate(x=100, y=100), Coordinate(x=500, y=500)] + + response = controller_client.render_line(style, points) + assert response is not None + + +def test_render_image( + controller_client: AskUiControllerClient, + askui_logo_bmp: Image.Image, +) -> None: + """Test rendering an image object to the display""" + with controller_client: + style = create_style( + width=200, + height=200, + top=200, + left=200, + opacity=0.9, + ) + + img_buffer = io.BytesIO() + askui_logo_bmp.save(img_buffer, format="BMP") + img_bytes = img_buffer.getvalue() + base64_image = base64.b64encode(img_bytes).decode("utf-8") + + response = controller_client.render_image(style, base64_image) + assert response is not None + + +def test_render_text(controller_client: AskUiControllerClient) -> None: + """Test rendering a text object to the display""" + with controller_client: + style = create_style( + width=300, + height=50, + top=100, + left=100, + color="#0000ff", + font_size=33, + opacity=0.9, + ) + + response = controller_client.render_text(style, "Hello World!") + assert response is not None + + +def test_update_render_object(controller_client: AskUiControllerClient) -> None: + """Test updating an existing render object""" + with controller_client: + style = create_style( + width=0.9, + height=100, + top="200px", + left="10%", + color="#ff0000", + opacity=1, + ) + + object_id = controller_client.render_quad(style) + assert object_id is not None + + update_style = create_style( + width=0.5, + height=100, + top="200px", + left="10%", + color="#ff0000", + opacity=1, + ) + + controller_client.update_render_object(object_id, update_style) + + +def test_update_text_object(controller_client: AskUiControllerClient) -> None: + """Test updating an existing render object""" + with controller_client: + style = create_style( + width=300, + height=50, + top=100, + left=100, + color="#0000ff", + font_size=33, + opacity=0.9, + ) + + object_id = controller_client.render_text(style, "Hello World!") + assert object_id is not None + + update_style = create_style( + width=0.5, + height=100, + top="200px", + left="10%", + color="#ff0000", + opacity=1, + ) + + controller_client.update_render_object(object_id, update_style) + + +def test_delete_render_object(controller_client: AskUiControllerClient) -> None: + """Test deleting an existing render object""" + with controller_client: + style = create_style( + width=1.0, + height=100, + color="#ff0000", + top=100, + left=0, + ) + quad_id = controller_client.render_quad(style) + assert quad_id is not None + + controller_client.delete_render_object(quad_id) + + +def test_clear_render_objects(controller_client: AskUiControllerClient) -> None: + """Test clearing all render objects""" + with controller_client: + style1 = create_style( + width=100, + height=50, + color="#ff0000", + top=100, + left=100, + ) + style2 = create_style( + width=200, + height=100, + color="#00ff00", + top=200, + left=200, + ) + + controller_client.render_quad(style1) + controller_client.render_quad(style2) + + controller_client.clear_render_objects() From 1fde246a6505e3d12d9195d11d0c13cff655f7af Mon Sep 17 00:00:00 2001 From: onur-askui <210008309+onur-askui@users.noreply.github.com> Date: Fri, 18 Jul 2025 09:11:39 +0200 Subject: [PATCH 16/21] style: reorganise imports --- src/askui/tools/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/askui/tools/__init__.py b/src/askui/tools/__init__.py index 57c6fb4c..24510a63 100644 --- a/src/askui/tools/__init__.py +++ b/src/askui/tools/__init__.py @@ -1,6 +1,6 @@ from .agent_os import AgentOs, Coordinate, ModifierKey, PcKey -from .toolbox import AgentToolbox from .askui.command_helpers import create_style +from .toolbox import AgentToolbox __all__ = [ "AgentOs", From eede6cf91354a7365ceaf8e59473305dccfa7a89 Mon Sep 17 00:00:00 2001 From: onur-askui <210008309+onur-askui@users.noreply.github.com> Date: Fri, 18 Jul 2025 09:18:27 +0200 Subject: [PATCH 17/21] style: update docstring for style annotations --- src/askui/tools/agent_os.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/askui/tools/agent_os.py b/src/askui/tools/agent_os.py index 2953f44f..00b8902a 100644 --- a/src/askui/tools/agent_os.py +++ b/src/askui/tools/agent_os.py @@ -408,7 +408,7 @@ def render_line(self, style: "RenderObjectStyle", points: list[Coordinate]) -> i Render a line object to the display. Args: - style: The style properties for the line. + style (RenderObjectStyle): The style properties for the line. points (list[Coordinate]): The points defining the line. Returns: @@ -421,7 +421,7 @@ def render_image(self, style: "RenderObjectStyle", image_data: str) -> int: Render an image object to the display. Args: - style: The style properties for the image. + style (RenderObjectStyle): The style properties for the image. image_data (str): The image data to display. Returns: @@ -434,7 +434,7 @@ def render_text(self, style: "RenderObjectStyle", content: str) -> int: Render a text object to the display. Args: - style: The style properties for the text. + style (RenderObjectStyle): The style properties for the text. text_content (str): The text content to display. Returns: @@ -448,7 +448,7 @@ def update_render_object(self, object_id: int, style: "RenderObjectStyle") -> No Args: object_id (int): The ID of the render object to update. - style: The new style properties. + style (RenderObjectStyle): The new style properties. """ raise NotImplementedError From cf60fa7e1d14cb43e0fe4f598e01a33a9944ef4c Mon Sep 17 00:00:00 2001 From: onur-askui <210008309+onur-askui@users.noreply.github.com> Date: Mon, 21 Jul 2025 10:05:55 +0200 Subject: [PATCH 18/21] chore: create a dev dep group and move dev deps --- pdm.lock | 996 ++++++++++++++++++++++++++++++++++++++----------- pyproject.toml | 6 +- 2 files changed, 772 insertions(+), 230 deletions(-) diff --git a/pdm.lock b/pdm.lock index c8bac19f..24c09d56 100644 --- a/pdm.lock +++ b/pdm.lock @@ -2,10 +2,10 @@ # It is not intended for manual editing. [metadata] -groups = ["default", "all", "android", "chat", "pynput", "test", "web"] +groups = ["default", "all", "android", "chat", "dev", "mcp", "pynput", "test", "web"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:a17b63cf447ef196e93e13e3b91aad997a988f9c4cb72b3c4f74e0c1e5db7488" +content_hash = "sha256:c4c815df35c7f817156b1db01cf65a70559e024220543b4e15b8b64f1669c070" [[metadata.targets]] requires_python = ">=3.10" @@ -15,7 +15,7 @@ name = "annotated-types" version = "0.7.0" requires_python = ">=3.8" summary = "Reusable constraint types to use with typing.Annotated" -groups = ["default", "all", "chat"] +groups = ["default", "all", "chat", "dev", "mcp"] dependencies = [ "typing-extensions>=4.0.0; python_version < \"3.9\"", ] @@ -49,7 +49,7 @@ name = "anyio" version = "4.9.0" requires_python = ">=3.9" summary = "High level compatibility layer for multiple asynchronous event loop implementations" -groups = ["default", "all", "chat"] +groups = ["default", "all", "chat", "mcp"] dependencies = [ "exceptiongroup>=1.0.2; python_version < \"3.11\"", "idna>=2.8", @@ -66,12 +66,37 @@ name = "argcomplete" version = "3.6.2" requires_python = ">=3.8" summary = "Bash tab completion for argparse" -groups = ["default"] +groups = ["dev"] files = [ {file = "argcomplete-3.6.2-py3-none-any.whl", hash = "sha256:65b3133a29ad53fb42c48cf5114752c7ab66c1c38544fdf6460f450c09b42591"}, {file = "argcomplete-3.6.2.tar.gz", hash = "sha256:d0519b1bc867f5f4f4713c41ad0aba73a4a5f007449716b16f385f2166dc6adf"}, ] +[[package]] +name = "attrs" +version = "25.3.0" +requires_python = ">=3.8" +summary = "Classes Without Boilerplate" +groups = ["all", "mcp"] +files = [ + {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"}, + {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"}, +] + +[[package]] +name = "authlib" +version = "1.6.1" +requires_python = ">=3.9" +summary = "The ultimate Python library in building OAuth and OpenID Connect servers and clients." +groups = ["all", "mcp"] +dependencies = [ + "cryptography", +] +files = [ + {file = "authlib-1.6.1-py2.py3-none-any.whl", hash = "sha256:e9d2031c34c6309373ab845afc24168fe9e93dc52d252631f52642f21f5ed06e"}, + {file = "authlib-1.6.1.tar.gz", hash = "sha256:4dffdbb1460ba6ec8c17981a4c67af7d8af131231b5a36a88a1e8c80c111cdfd"}, +] + [[package]] name = "backoff" version = "2.2.1" @@ -88,7 +113,7 @@ name = "black" version = "25.1.0" requires_python = ">=3.9" summary = "The uncompromising code formatter." -groups = ["default"] +groups = ["dev"] dependencies = [ "click>=8.0.0", "mypy-extensions>=0.4.3", @@ -124,12 +149,72 @@ name = "certifi" version = "2025.1.31" requires_python = ">=3.6" summary = "Python package for providing Mozilla's CA Bundle." -groups = ["default"] +groups = ["default", "all", "mcp"] files = [ {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, ] +[[package]] +name = "cffi" +version = "1.17.1" +requires_python = ">=3.8" +summary = "Foreign Function Interface for Python calling C code." +groups = ["all", "mcp"] +marker = "platform_python_implementation != \"PyPy\"" +dependencies = [ + "pycparser", +] +files = [ + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, +] + [[package]] name = "charset-normalizer" version = "3.4.1" @@ -198,7 +283,7 @@ name = "click" version = "8.1.8" requires_python = ">=3.7" summary = "Composable command line interface toolkit" -groups = ["default", "all", "chat"] +groups = ["all", "chat", "dev", "mcp"] dependencies = [ "colorama; platform_system == \"Windows\"", "importlib-metadata; python_version < \"3.8\"", @@ -213,7 +298,7 @@ name = "colorama" version = "0.4.6" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" summary = "Cross-platform colored terminal text." -groups = ["default", "all", "chat", "test"] +groups = ["default", "all", "chat", "dev", "mcp", "test"] marker = "sys_platform == \"win32\" or platform_system == \"Windows\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, @@ -349,12 +434,80 @@ files = [ {file = "coverage-7.8.0.tar.gz", hash = "sha256:7a3d62b3b03b4b6fd41a085f3574874cf946cb4604d2b4d3e8dca8cd570ca501"}, ] +[[package]] +name = "cryptography" +version = "45.0.5" +requires_python = "!=3.9.0,!=3.9.1,>=3.7" +summary = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +groups = ["all", "mcp"] +dependencies = [ + "cffi>=1.14; platform_python_implementation != \"PyPy\"", +] +files = [ + {file = "cryptography-45.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:101ee65078f6dd3e5a028d4f19c07ffa4dd22cce6a20eaa160f8b5219911e7d8"}, + {file = "cryptography-45.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3a264aae5f7fbb089dbc01e0242d3b67dffe3e6292e1f5182122bdf58e65215d"}, + {file = "cryptography-45.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e74d30ec9c7cb2f404af331d5b4099a9b322a8a6b25c4632755c8757345baac5"}, + {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3af26738f2db354aafe492fb3869e955b12b2ef2e16908c8b9cb928128d42c57"}, + {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e6c00130ed423201c5bc5544c23359141660b07999ad82e34e7bb8f882bb78e0"}, + {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:dd420e577921c8c2d31289536c386aaa30140b473835e97f83bc71ea9d2baf2d"}, + {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:d05a38884db2ba215218745f0781775806bde4f32e07b135348355fe8e4991d9"}, + {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:ad0caded895a00261a5b4aa9af828baede54638754b51955a0ac75576b831b27"}, + {file = "cryptography-45.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9024beb59aca9d31d36fcdc1604dd9bbeed0a55bface9f1908df19178e2f116e"}, + {file = "cryptography-45.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:91098f02ca81579c85f66df8a588c78f331ca19089763d733e34ad359f474174"}, + {file = "cryptography-45.0.5-cp311-abi3-win32.whl", hash = "sha256:926c3ea71a6043921050eaa639137e13dbe7b4ab25800932a8498364fc1abec9"}, + {file = "cryptography-45.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:b85980d1e345fe769cfc57c57db2b59cff5464ee0c045d52c0df087e926fbe63"}, + {file = "cryptography-45.0.5-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f3562c2f23c612f2e4a6964a61d942f891d29ee320edb62ff48ffb99f3de9ae8"}, + {file = "cryptography-45.0.5-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3fcfbefc4a7f332dece7272a88e410f611e79458fab97b5efe14e54fe476f4fd"}, + {file = "cryptography-45.0.5-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:460f8c39ba66af7db0545a8c6f2eabcbc5a5528fc1cf6c3fa9a1e44cec33385e"}, + {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:9b4cf6318915dccfe218e69bbec417fdd7c7185aa7aab139a2c0beb7468c89f0"}, + {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2089cc8f70a6e454601525e5bf2779e665d7865af002a5dec8d14e561002e135"}, + {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0027d566d65a38497bc37e0dd7c2f8ceda73597d2ac9ba93810204f56f52ebc7"}, + {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:be97d3a19c16a9be00edf79dca949c8fa7eff621763666a145f9f9535a5d7f42"}, + {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:7760c1c2e1a7084153a0f68fab76e754083b126a47d0117c9ed15e69e2103492"}, + {file = "cryptography-45.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6ff8728d8d890b3dda5765276d1bc6fb099252915a2cd3aff960c4c195745dd0"}, + {file = "cryptography-45.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7259038202a47fdecee7e62e0fd0b0738b6daa335354396c6ddebdbe1206af2a"}, + {file = "cryptography-45.0.5-cp37-abi3-win32.whl", hash = "sha256:1e1da5accc0c750056c556a93c3e9cb828970206c68867712ca5805e46dc806f"}, + {file = "cryptography-45.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:90cb0a7bb35959f37e23303b7eed0a32280510030daba3f7fdfbb65defde6a97"}, + {file = "cryptography-45.0.5-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:206210d03c1193f4e1ff681d22885181d47efa1ab3018766a7b32a7b3d6e6afd"}, + {file = "cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c648025b6840fe62e57107e0a25f604db740e728bd67da4f6f060f03017d5097"}, + {file = "cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b8fa8b0a35a9982a3c60ec79905ba5bb090fc0b9addcfd3dc2dd04267e45f25e"}, + {file = "cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:14d96584701a887763384f3c47f0ca7c1cce322aa1c31172680eb596b890ec30"}, + {file = "cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:57c816dfbd1659a367831baca4b775b2a5b43c003daf52e9d57e1d30bc2e1b0e"}, + {file = "cryptography-45.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b9e38e0a83cd51e07f5a48ff9691cae95a79bea28fe4ded168a8e5c6c77e819d"}, + {file = "cryptography-45.0.5-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8c4a6ff8a30e9e3d38ac0539e9a9e02540ab3f827a3394f8852432f6b0ea152e"}, + {file = "cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bd4c45986472694e5121084c6ebbd112aa919a25e783b87eb95953c9573906d6"}, + {file = "cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:982518cd64c54fcada9d7e5cf28eabd3ee76bd03ab18e08a48cad7e8b6f31b18"}, + {file = "cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:12e55281d993a793b0e883066f590c1ae1e802e3acb67f8b442e721e475e6463"}, + {file = "cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:5aa1e32983d4443e310f726ee4b071ab7569f58eedfdd65e9675484a4eb67bd1"}, + {file = "cryptography-45.0.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:e357286c1b76403dd384d938f93c46b2b058ed4dfcdce64a770f0537ed3feb6f"}, + {file = "cryptography-45.0.5.tar.gz", hash = "sha256:72e76caa004ab63accdf26023fccd1d087f6d90ec6048ff33ad0445abf7f605a"}, +] + +[[package]] +name = "cyclopts" +version = "3.22.2" +requires_python = ">=3.9" +summary = "Intuitive, easy CLIs based on type hints." +groups = ["all", "mcp"] +dependencies = [ + "attrs>=23.1.0", + "docstring-parser>=0.15; python_version < \"4.0\"", + "importlib-metadata>=4.4; python_version < \"3.10\"", + "rich-rst<2.0.0,>=1.3.1", + "rich>=13.6.0", + "typing-extensions>=4.8.0; python_version < \"3.11\"", +] +files = [ + {file = "cyclopts-3.22.2-py3-none-any.whl", hash = "sha256:6681b0815fa2de2bccc364468fd25b15aa9617cb505c0b16ca62e2b18a57619e"}, + {file = "cyclopts-3.22.2.tar.gz", hash = "sha256:d3495231af6ae86479579777d212ddf77b113200f828badeaf401162ed87227d"}, +] + [[package]] name = "datamodel-code-generator" version = "0.31.2" requires_python = ">=3.9" summary = "Datamodel Code Generator" -groups = ["default"] +groups = ["dev"] dependencies = [ "argcomplete<4,>=2.10.1", "black>=19.10b0", @@ -383,6 +536,55 @@ files = [ {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, ] +[[package]] +name = "dnspython" +version = "2.7.0" +requires_python = ">=3.9" +summary = "DNS toolkit" +groups = ["all", "mcp"] +files = [ + {file = "dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86"}, + {file = "dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1"}, +] + +[[package]] +name = "docstring-parser" +version = "0.17.0" +requires_python = ">=3.8" +summary = "Parse Python docstrings in reST, Google and Numpydoc format" +groups = ["all", "mcp"] +marker = "python_version < \"4.0\"" +files = [ + {file = "docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708"}, + {file = "docstring_parser-0.17.0.tar.gz", hash = "sha256:583de4a309722b3315439bb31d64ba3eebada841f2e2cee23b99df001434c912"}, +] + +[[package]] +name = "docutils" +version = "0.21.2" +requires_python = ">=3.9" +summary = "Docutils -- Python Documentation Utilities" +groups = ["all", "mcp"] +files = [ + {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, + {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, +] + +[[package]] +name = "email-validator" +version = "2.2.0" +requires_python = ">=3.8" +summary = "A robust email address syntax and deliverability validation library." +groups = ["all", "mcp"] +dependencies = [ + "dnspython>=2.0.0", + "idna>=2.0.0", +] +files = [ + {file = "email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631"}, + {file = "email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7"}, +] + [[package]] name = "evdev" version = "1.9.2" @@ -399,8 +601,7 @@ name = "exceptiongroup" version = "1.2.2" requires_python = ">=3.7" summary = "Backport of PEP 654 (exception groups)" -groups = ["default", "all", "chat", "test"] -marker = "python_version < \"3.11\"" +groups = ["default", "all", "chat", "mcp", "test"] files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -433,6 +634,29 @@ files = [ {file = "fastapi-0.115.12.tar.gz", hash = "sha256:1e2c2a2646905f9e83d32f04a3f86aff4a286669c6c950ca95b5fd68c2602681"}, ] +[[package]] +name = "fastmcp" +version = "2.10.6" +requires_python = ">=3.10" +summary = "The fast, Pythonic way to build MCP servers and clients." +groups = ["all", "mcp"] +dependencies = [ + "authlib>=1.5.2", + "cyclopts>=3.0.0", + "exceptiongroup>=1.2.2", + "httpx>=0.28.1", + "mcp>=1.10.0", + "openapi-pydantic>=0.5.1", + "pydantic[email]>=2.11.7", + "pyperclip>=1.9.0", + "python-dotenv>=1.1.0", + "rich>=13.9.4", +] +files = [ + {file = "fastmcp-2.10.6-py3-none-any.whl", hash = "sha256:9782416a8848cc0f4cfcc578e5c17834da620bef8ecf4d0daabf5dd1272411a2"}, + {file = "fastmcp-2.10.6.tar.gz", hash = "sha256:5a7b3301f9f1b64610430caef743ac70175c4b812e1949f037e4db65b0a42c5a"}, +] + [[package]] name = "filelock" version = "3.18.0" @@ -459,7 +683,7 @@ files = [ name = "genson" version = "1.3.0" summary = "GenSON is a powerful, user-friendly JSON Schema generator." -groups = ["default"] +groups = ["dev"] files = [ {file = "genson-1.3.0-py3-none-any.whl", hash = "sha256:468feccd00274cc7e4c09e84b08704270ba8d95232aa280f65b986139cec67f7"}, {file = "genson-1.3.0.tar.gz", hash = "sha256:e02db9ac2e3fd29e65b5286f7135762e2cd8a986537c075b06fc5f1517308e37"}, @@ -553,107 +777,107 @@ files = [ [[package]] name = "grpcio" -version = "1.71.0" +version = "1.73.1" requires_python = ">=3.9" summary = "HTTP/2-based RPC framework" -groups = ["default", "test"] -files = [ - {file = "grpcio-1.71.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:c200cb6f2393468142eb50ab19613229dcc7829b5ccee8b658a36005f6669fdd"}, - {file = "grpcio-1.71.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:b2266862c5ad664a380fbbcdbdb8289d71464c42a8c29053820ee78ba0119e5d"}, - {file = "grpcio-1.71.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:0ab8b2864396663a5b0b0d6d79495657ae85fa37dcb6498a2669d067c65c11ea"}, - {file = "grpcio-1.71.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c30f393f9d5ff00a71bb56de4aa75b8fe91b161aeb61d39528db6b768d7eac69"}, - {file = "grpcio-1.71.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f250ff44843d9a0615e350c77f890082102a0318d66a99540f54769c8766ab73"}, - {file = "grpcio-1.71.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e6d8de076528f7c43a2f576bc311799f89d795aa6c9b637377cc2b1616473804"}, - {file = "grpcio-1.71.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9b91879d6da1605811ebc60d21ab6a7e4bae6c35f6b63a061d61eb818c8168f6"}, - {file = "grpcio-1.71.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f71574afdf944e6652203cd1badcda195b2a27d9c83e6d88dc1ce3cfb73b31a5"}, - {file = "grpcio-1.71.0-cp310-cp310-win32.whl", hash = "sha256:8997d6785e93308f277884ee6899ba63baafa0dfb4729748200fcc537858a509"}, - {file = "grpcio-1.71.0-cp310-cp310-win_amd64.whl", hash = "sha256:7d6ac9481d9d0d129224f6d5934d5832c4b1cddb96b59e7eba8416868909786a"}, - {file = "grpcio-1.71.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:d6aa986318c36508dc1d5001a3ff169a15b99b9f96ef5e98e13522c506b37eef"}, - {file = "grpcio-1.71.0-cp311-cp311-macosx_10_14_universal2.whl", hash = "sha256:d2c170247315f2d7e5798a22358e982ad6eeb68fa20cf7a820bb74c11f0736e7"}, - {file = "grpcio-1.71.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:e6f83a583ed0a5b08c5bc7a3fe860bb3c2eac1f03f1f63e0bc2091325605d2b7"}, - {file = "grpcio-1.71.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4be74ddeeb92cc87190e0e376dbc8fc7736dbb6d3d454f2fa1f5be1dee26b9d7"}, - {file = "grpcio-1.71.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dd0dfbe4d5eb1fcfec9490ca13f82b089a309dc3678e2edabc144051270a66e"}, - {file = "grpcio-1.71.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a2242d6950dc892afdf9e951ed7ff89473aaf744b7d5727ad56bdaace363722b"}, - {file = "grpcio-1.71.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0fa05ee31a20456b13ae49ad2e5d585265f71dd19fbd9ef983c28f926d45d0a7"}, - {file = "grpcio-1.71.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3d081e859fb1ebe176de33fc3adb26c7d46b8812f906042705346b314bde32c3"}, - {file = "grpcio-1.71.0-cp311-cp311-win32.whl", hash = "sha256:d6de81c9c00c8a23047136b11794b3584cdc1460ed7cbc10eada50614baa1444"}, - {file = "grpcio-1.71.0-cp311-cp311-win_amd64.whl", hash = "sha256:24e867651fc67717b6f896d5f0cac0ec863a8b5fb7d6441c2ab428f52c651c6b"}, - {file = "grpcio-1.71.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:0ff35c8d807c1c7531d3002be03221ff9ae15712b53ab46e2a0b4bb271f38537"}, - {file = "grpcio-1.71.0-cp312-cp312-macosx_10_14_universal2.whl", hash = "sha256:b78a99cd1ece4be92ab7c07765a0b038194ded2e0a26fd654591ee136088d8d7"}, - {file = "grpcio-1.71.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:dc1a1231ed23caac1de9f943d031f1bc38d0f69d2a3b243ea0d664fc1fbd7fec"}, - {file = "grpcio-1.71.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6beeea5566092c5e3c4896c6d1d307fb46b1d4bdf3e70c8340b190a69198594"}, - {file = "grpcio-1.71.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5170929109450a2c031cfe87d6716f2fae39695ad5335d9106ae88cc32dc84c"}, - {file = "grpcio-1.71.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5b08d03ace7aca7b2fadd4baf291139b4a5f058805a8327bfe9aece7253b6d67"}, - {file = "grpcio-1.71.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f903017db76bf9cc2b2d8bdd37bf04b505bbccad6be8a81e1542206875d0e9db"}, - {file = "grpcio-1.71.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:469f42a0b410883185eab4689060a20488a1a0a00f8bbb3cbc1061197b4c5a79"}, - {file = "grpcio-1.71.0-cp312-cp312-win32.whl", hash = "sha256:ad9f30838550695b5eb302add33f21f7301b882937460dd24f24b3cc5a95067a"}, - {file = "grpcio-1.71.0-cp312-cp312-win_amd64.whl", hash = "sha256:652350609332de6dac4ece254e5d7e1ff834e203d6afb769601f286886f6f3a8"}, - {file = "grpcio-1.71.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:cebc1b34ba40a312ab480ccdb396ff3c529377a2fce72c45a741f7215bfe8379"}, - {file = "grpcio-1.71.0-cp313-cp313-macosx_10_14_universal2.whl", hash = "sha256:85da336e3649a3d2171e82f696b5cad2c6231fdd5bad52616476235681bee5b3"}, - {file = "grpcio-1.71.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:f9a412f55bb6e8f3bb000e020dbc1e709627dcb3a56f6431fa7076b4c1aab0db"}, - {file = "grpcio-1.71.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47be9584729534660416f6d2a3108aaeac1122f6b5bdbf9fd823e11fe6fbaa29"}, - {file = "grpcio-1.71.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9c80ac6091c916db81131d50926a93ab162a7e97e4428ffc186b6e80d6dda4"}, - {file = "grpcio-1.71.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:789d5e2a3a15419374b7b45cd680b1e83bbc1e52b9086e49308e2c0b5bbae6e3"}, - {file = "grpcio-1.71.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:1be857615e26a86d7363e8a163fade914595c81fec962b3d514a4b1e8760467b"}, - {file = "grpcio-1.71.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:a76d39b5fafd79ed604c4be0a869ec3581a172a707e2a8d7a4858cb05a5a7637"}, - {file = "grpcio-1.71.0-cp313-cp313-win32.whl", hash = "sha256:74258dce215cb1995083daa17b379a1a5a87d275387b7ffe137f1d5131e2cfbb"}, - {file = "grpcio-1.71.0-cp313-cp313-win_amd64.whl", hash = "sha256:22c3bc8d488c039a199f7a003a38cb7635db6656fa96437a8accde8322ce2366"}, - {file = "grpcio-1.71.0.tar.gz", hash = "sha256:2b85f7820475ad3edec209d3d89a7909ada16caab05d3f2e08a7e8ae3200a55c"}, +groups = ["default", "dev", "test"] +files = [ + {file = "grpcio-1.73.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:2d70f4ddd0a823436c2624640570ed6097e40935c9194482475fe8e3d9754d55"}, + {file = "grpcio-1.73.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:3841a8a5a66830261ab6a3c2a3dc539ed84e4ab019165f77b3eeb9f0ba621f26"}, + {file = "grpcio-1.73.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:628c30f8e77e0258ab788750ec92059fc3d6628590fb4b7cea8c102503623ed7"}, + {file = "grpcio-1.73.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:67a0468256c9db6d5ecb1fde4bf409d016f42cef649323f0a08a72f352d1358b"}, + {file = "grpcio-1.73.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68b84d65bbdebd5926eb5c53b0b9ec3b3f83408a30e4c20c373c5337b4219ec5"}, + {file = "grpcio-1.73.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c54796ca22b8349cc594d18b01099e39f2b7ffb586ad83217655781a350ce4da"}, + {file = "grpcio-1.73.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:75fc8e543962ece2f7ecd32ada2d44c0c8570ae73ec92869f9af8b944863116d"}, + {file = "grpcio-1.73.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6a6037891cd2b1dd1406b388660522e1565ed340b1fea2955b0234bdd941a862"}, + {file = "grpcio-1.73.1-cp310-cp310-win32.whl", hash = "sha256:cce7265b9617168c2d08ae570fcc2af4eaf72e84f8c710ca657cc546115263af"}, + {file = "grpcio-1.73.1-cp310-cp310-win_amd64.whl", hash = "sha256:6a2b372e65fad38842050943f42ce8fee00c6f2e8ea4f7754ba7478d26a356ee"}, + {file = "grpcio-1.73.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:ba2cea9f7ae4bc21f42015f0ec98f69ae4179848ad744b210e7685112fa507a1"}, + {file = "grpcio-1.73.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:d74c3f4f37b79e746271aa6cdb3a1d7e4432aea38735542b23adcabaaee0c097"}, + {file = "grpcio-1.73.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:5b9b1805a7d61c9e90541cbe8dfe0a593dfc8c5c3a43fe623701b6a01b01d710"}, + {file = "grpcio-1.73.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3215f69a0670a8cfa2ab53236d9e8026bfb7ead5d4baabe7d7dc11d30fda967"}, + {file = "grpcio-1.73.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc5eccfd9577a5dc7d5612b2ba90cca4ad14c6d949216c68585fdec9848befb1"}, + {file = "grpcio-1.73.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dc7d7fd520614fce2e6455ba89791458020a39716951c7c07694f9dbae28e9c0"}, + {file = "grpcio-1.73.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:105492124828911f85127e4825d1c1234b032cb9d238567876b5515d01151379"}, + {file = "grpcio-1.73.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:610e19b04f452ba6f402ac9aa94eb3d21fbc94553368008af634812c4a85a99e"}, + {file = "grpcio-1.73.1-cp311-cp311-win32.whl", hash = "sha256:d60588ab6ba0ac753761ee0e5b30a29398306401bfbceffe7d68ebb21193f9d4"}, + {file = "grpcio-1.73.1-cp311-cp311-win_amd64.whl", hash = "sha256:6957025a4608bb0a5ff42abd75bfbb2ed99eda29d5992ef31d691ab54b753643"}, + {file = "grpcio-1.73.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:921b25618b084e75d424a9f8e6403bfeb7abef074bb6c3174701e0f2542debcf"}, + {file = "grpcio-1.73.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:277b426a0ed341e8447fbf6c1d6b68c952adddf585ea4685aa563de0f03df887"}, + {file = "grpcio-1.73.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:96c112333309493c10e118d92f04594f9055774757f5d101b39f8150f8c25582"}, + {file = "grpcio-1.73.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f48e862aed925ae987eb7084409a80985de75243389dc9d9c271dd711e589918"}, + {file = "grpcio-1.73.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83a6c2cce218e28f5040429835fa34a29319071079e3169f9543c3fbeff166d2"}, + {file = "grpcio-1.73.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:65b0458a10b100d815a8426b1442bd17001fdb77ea13665b2f7dc9e8587fdc6b"}, + {file = "grpcio-1.73.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:0a9f3ea8dce9eae9d7cb36827200133a72b37a63896e0e61a9d5ec7d61a59ab1"}, + {file = "grpcio-1.73.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:de18769aea47f18e782bf6819a37c1c528914bfd5683b8782b9da356506190c8"}, + {file = "grpcio-1.73.1-cp312-cp312-win32.whl", hash = "sha256:24e06a5319e33041e322d32c62b1e728f18ab8c9dbc91729a3d9f9e3ed336642"}, + {file = "grpcio-1.73.1-cp312-cp312-win_amd64.whl", hash = "sha256:303c8135d8ab176f8038c14cc10d698ae1db9c480f2b2823f7a987aa2a4c5646"}, + {file = "grpcio-1.73.1-cp313-cp313-linux_armv7l.whl", hash = "sha256:b310824ab5092cf74750ebd8a8a8981c1810cb2b363210e70d06ef37ad80d4f9"}, + {file = "grpcio-1.73.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:8f5a6df3fba31a3485096ac85b2e34b9666ffb0590df0cd044f58694e6a1f6b5"}, + {file = "grpcio-1.73.1-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:052e28fe9c41357da42250a91926a3e2f74c046575c070b69659467ca5aa976b"}, + {file = "grpcio-1.73.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c0bf15f629b1497436596b1cbddddfa3234273490229ca29561209778ebe182"}, + {file = "grpcio-1.73.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ab860d5bfa788c5a021fba264802e2593688cd965d1374d31d2b1a34cacd854"}, + {file = "grpcio-1.73.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:ad1d958c31cc91ab050bd8a91355480b8e0683e21176522bacea225ce51163f2"}, + {file = "grpcio-1.73.1-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f43ffb3bd415c57224c7427bfb9e6c46a0b6e998754bfa0d00f408e1873dcbb5"}, + {file = "grpcio-1.73.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:686231cdd03a8a8055f798b2b54b19428cdf18fa1549bee92249b43607c42668"}, + {file = "grpcio-1.73.1-cp313-cp313-win32.whl", hash = "sha256:89018866a096e2ce21e05eabed1567479713ebe57b1db7cbb0f1e3b896793ba4"}, + {file = "grpcio-1.73.1-cp313-cp313-win_amd64.whl", hash = "sha256:4a68f8c9966b94dff693670a5cf2b54888a48a5011c5d9ce2295a1a1465ee84f"}, + {file = "grpcio-1.73.1.tar.gz", hash = "sha256:7fce2cd1c0c1116cf3850564ebfc3264fba75d3c74a7414373f1238ea365ef87"}, ] [[package]] name = "grpcio-tools" -version = "1.71.0" +version = "1.73.1" requires_python = ">=3.9" summary = "Protobuf code generator for gRPC" -groups = ["default"] +groups = ["dev"] dependencies = [ - "grpcio>=1.71.0", - "protobuf<6.0dev,>=5.26.1", + "grpcio>=1.73.1", + "protobuf<7.0.0,>=6.30.0", "setuptools", ] files = [ - {file = "grpcio_tools-1.71.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:f4ad7f0d756546902597053d70b3af2606fbd70d7972876cd75c1e241d22ae00"}, - {file = "grpcio_tools-1.71.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:64bdb291df61cf570b5256777ad5fe2b1db6d67bc46e55dc56a0a862722ae329"}, - {file = "grpcio_tools-1.71.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:8dd9795e982d77a4b496f7278b943c2563d9afde2069cdee78c111a40cc4d675"}, - {file = "grpcio_tools-1.71.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1b5860c41a36b26fec4f52998f1a451d0525a5c9a4fb06b6ea3e9211abdb925"}, - {file = "grpcio_tools-1.71.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3059c14035e5dc03d462f261e5900b9a077fd1a36976c3865b8507474520bad4"}, - {file = "grpcio_tools-1.71.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f360981b215b1d5aff9235b37e7e1826246e35bbac32a53e41d4e990a37b8f4c"}, - {file = "grpcio_tools-1.71.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bfe3888c3bbe16a5aa39409bc38744a31c0c3d2daa2b0095978c56e106c85b42"}, - {file = "grpcio_tools-1.71.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:145985c0bf12131f0a1503e65763e0f060473f7f3928ed1ff3fb0e8aad5bc8ac"}, - {file = "grpcio_tools-1.71.0-cp310-cp310-win32.whl", hash = "sha256:82c430edd939bb863550ee0fecf067d78feff828908a1b529bbe33cc57f2419c"}, - {file = "grpcio_tools-1.71.0-cp310-cp310-win_amd64.whl", hash = "sha256:83e90724e3f02415c628e4ead1d6ffe063820aaaa078d9a39176793df958cd5a"}, - {file = "grpcio_tools-1.71.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:1f19b16b49afa5d21473f49c0966dd430c88d089cd52ac02404d8cef67134efb"}, - {file = "grpcio_tools-1.71.0-cp311-cp311-macosx_10_14_universal2.whl", hash = "sha256:459c8f5e00e390aecd5b89de67deb3ec7188a274bc6cb50e43cef35ab3a3f45d"}, - {file = "grpcio_tools-1.71.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:edab7e6518de01196be37f96cb1e138c3819986bf5e2a6c9e1519b4d716b2f5a"}, - {file = "grpcio_tools-1.71.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8b93b9f6adc7491d4c10144c0643409db298e5e63c997106a804f6f0248dbaf4"}, - {file = "grpcio_tools-1.71.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ae5f2efa9e644c10bf1021600bfc099dfbd8e02b184d2d25dc31fcd6c2bc59e"}, - {file = "grpcio_tools-1.71.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:65aa082f4435571d65d5ce07fc444f23c3eff4f3e34abef599ef8c9e1f6f360f"}, - {file = "grpcio_tools-1.71.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1331e726e08b7bdcbf2075fcf4b47dff07842b04845e6e220a08a4663e232d7f"}, - {file = "grpcio_tools-1.71.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6693a7d3ba138b0e693b3d1f687cdd9db9e68976c3fa2b951c17a072fea8b583"}, - {file = "grpcio_tools-1.71.0-cp311-cp311-win32.whl", hash = "sha256:6d11ed3ff7b6023b5c72a8654975324bb98c1092426ba5b481af406ff559df00"}, - {file = "grpcio_tools-1.71.0-cp311-cp311-win_amd64.whl", hash = "sha256:072b2a5805ac97e4623b3aa8f7818275f3fb087f4aa131b0fce00471065f6eaa"}, - {file = "grpcio_tools-1.71.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:61c0409d5bdac57a7bd0ce0ab01c1c916728fe4c8a03d77a25135ad481eb505c"}, - {file = "grpcio_tools-1.71.0-cp312-cp312-macosx_10_14_universal2.whl", hash = "sha256:28784f39921d061d2164a9dcda5164a69d07bf29f91f0ea50b505958292312c9"}, - {file = "grpcio_tools-1.71.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:192808cf553cedca73f0479cc61d5684ad61f24db7a5f3c4dfe1500342425866"}, - {file = "grpcio_tools-1.71.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:989ee9da61098230d3d4c8f8f8e27c2de796f1ff21b1c90110e636d9acd9432b"}, - {file = "grpcio_tools-1.71.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:541a756276c8a55dec991f6c0106ae20c8c8f5ce8d0bdbfcb01e2338d1a8192b"}, - {file = "grpcio_tools-1.71.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:870c0097700d13c403e5517cb7750ab5b4a791ce3e71791c411a38c5468b64bd"}, - {file = "grpcio_tools-1.71.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:abd57f615e88bf93c3c6fd31f923106e3beb12f8cd2df95b0d256fa07a7a0a57"}, - {file = "grpcio_tools-1.71.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:753270e2d06d37e6d7af8967d1d059ec635ad215882041a36294f4e2fd502b2e"}, - {file = "grpcio_tools-1.71.0-cp312-cp312-win32.whl", hash = "sha256:0e647794bd7138b8c215e86277a9711a95cf6a03ff6f9e555d54fdf7378b9f9d"}, - {file = "grpcio_tools-1.71.0-cp312-cp312-win_amd64.whl", hash = "sha256:48debc879570972d28bfe98e4970eff25bb26da3f383e0e49829b2d2cd35ad87"}, - {file = "grpcio_tools-1.71.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:9a78d07d6c301a25ef5ede962920a522556a1dfee1ccc05795994ceb867f766c"}, - {file = "grpcio_tools-1.71.0-cp313-cp313-macosx_10_14_universal2.whl", hash = "sha256:580ac88141c9815557e63c9c04f5b1cdb19b4db8d0cb792b573354bde1ee8b12"}, - {file = "grpcio_tools-1.71.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:f7c678e68ece0ae908ecae1c4314a0c2c7f83e26e281738b9609860cc2c82d96"}, - {file = "grpcio_tools-1.71.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56ecd6cc89b5e5eed1de5eb9cafce86c9c9043ee3840888cc464d16200290b53"}, - {file = "grpcio_tools-1.71.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e52a041afc20ab2431d756b6295d727bd7adee813b21b06a3483f4a7a15ea15f"}, - {file = "grpcio_tools-1.71.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2a1712f12102b60c8d92779b89d0504e0d6f3a59f2b933e5622b8583f5c02992"}, - {file = "grpcio_tools-1.71.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:41878cb7a75477e62fdd45e7e9155b3af1b7a5332844021e2511deaf99ac9e6c"}, - {file = "grpcio_tools-1.71.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:682e958b476049ccc14c71bedf3f979bced01f6e0c04852efc5887841a32ad6b"}, - {file = "grpcio_tools-1.71.0-cp313-cp313-win32.whl", hash = "sha256:0ccfb837152b7b858b9f26bb110b3ae8c46675d56130f6c2f03605c4f129be13"}, - {file = "grpcio_tools-1.71.0-cp313-cp313-win_amd64.whl", hash = "sha256:ffff9bc5eacb34dd26b487194f7d44a3e64e752fc2cf049d798021bf25053b87"}, - {file = "grpcio_tools-1.71.0.tar.gz", hash = "sha256:38dba8e0d5e0fb23a034e09644fdc6ed862be2371887eee54901999e8f6792a8"}, + {file = "grpcio_tools-1.73.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:0731b21a7f3988a9f8c244ffe3940a0579e5b5f2a99d08448459e0b49350d47a"}, + {file = "grpcio_tools-1.73.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:15e47b19b70ce6100e9843570e16b0561045c37b5e9d390f1cb54292c99b51b6"}, + {file = "grpcio_tools-1.73.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:fbe6cd3e863928b5c127d4956c60e44101f495ddcb69738290db6ef497ce505c"}, + {file = "grpcio_tools-1.73.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71c35a6b4d125bec877daefaf7dedb566d37ed4e903a45b74e491683e006afa4"}, + {file = "grpcio_tools-1.73.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9486235da85a80accaeaab5829c09e19b70ee96ff100d3f7b342ec9344d96134"}, + {file = "grpcio_tools-1.73.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:86dfd562a9ebb74849aca345237cf87c2732067e410752ff809b8bfdf7aa5f49"}, + {file = "grpcio_tools-1.73.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bde8101bc7a60de6297916a468bf7900be6e2c0f9965a1a6591aa06bd02e2df3"}, + {file = "grpcio_tools-1.73.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b41e2417003b34bf672aa4ec5a48e22d9fc28f7de5f25d9a01fb1e3dcc86af6a"}, + {file = "grpcio_tools-1.73.1-cp310-cp310-win32.whl", hash = "sha256:bb05d02ca7d603260555cc0bbec616b116f741561d5b5c78a65bc3fae5982d5e"}, + {file = "grpcio_tools-1.73.1-cp310-cp310-win_amd64.whl", hash = "sha256:5f0cd287545c9430e3e395181ee11ca9b7bef4c41b1c28afa9174ea5a868dcda"}, + {file = "grpcio_tools-1.73.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:2bc4a46177df43853b070a4b6b6106d9829a639bc8b9516a005a879d3e5da0f9"}, + {file = "grpcio_tools-1.73.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:448b38ec72ed62c932d48e49e0facbb51e8045065dabf3bb63149810971a51e7"}, + {file = "grpcio_tools-1.73.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:249be7616b323b8af72a02bd218bfbba388010e6ccb471c57d42e49b620686f7"}, + {file = "grpcio_tools-1.73.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:129dd1e46386da74d78d588c5a7f5c51d8dc2ec40fea95f9a012f655767fd5f3"}, + {file = "grpcio_tools-1.73.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d53cd62c30fbd9597c05066a45e5750a11ec566c5fe0d17878e169bd2c66157"}, + {file = "grpcio_tools-1.73.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d8f4e2ee735dc6033b6f3379584759cc95259581c9bc58db5dd0e69cc71310f1"}, + {file = "grpcio_tools-1.73.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b2795d85da34846bbe6693f0da4c1f9bfa8a77e6cbd85cb83eb1231f1315a2ae"}, + {file = "grpcio_tools-1.73.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:40834bf3551a6936151f4ba7eba4a37c8ff66eacb0bb5affa4630afbe78f061d"}, + {file = "grpcio_tools-1.73.1-cp311-cp311-win32.whl", hash = "sha256:0b809d936463fabeda6999eb681b5d4869dd8e5fe4d2fb9dbfee0d2a4c0ce67a"}, + {file = "grpcio_tools-1.73.1-cp311-cp311-win_amd64.whl", hash = "sha256:e0257401088f29315fe0ad7f388ad061cf5b57a89e9abf039f8d9c7a54e9580d"}, + {file = "grpcio_tools-1.73.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:23af3de80c89ee803d0143c6293f8e979a851f0414702b5de973e205fca69db2"}, + {file = "grpcio_tools-1.73.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:fbf17ad6fff6c9002d28bc3632216eafb59631308b05c4cf80e72d21c33f7dc9"}, + {file = "grpcio_tools-1.73.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:aa05ecd0b2ca583862d107eea4d9480a2d89987ae46bc02944cc450a122f833b"}, + {file = "grpcio_tools-1.73.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:664fbec02f93d14bb74c442e06ba20a4448a20236ed3d6ac5d2c4ef82a33a8b4"}, + {file = "grpcio_tools-1.73.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60aa528d7576c932f43172723188f53aaa7bdb307e52d22f2e5ab831a3667693"}, + {file = "grpcio_tools-1.73.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3893517010bcdb8cb4949715786bc5953fe7df6b575f8b1725531ed492b1080c"}, + {file = "grpcio_tools-1.73.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:654083a2d4e83679d4fb6ac46a2748c1b57ecf45be5cbe88d88a1a4aef6b3281"}, + {file = "grpcio_tools-1.73.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cd8b1077849acd69923b08a8e5221050e5201eb65907487ee6d69aa06b583b46"}, + {file = "grpcio_tools-1.73.1-cp312-cp312-win32.whl", hash = "sha256:0273f64c8db4a52a3a99fd34c83a1a1723bd3ac6806d3054a93f08044609fa65"}, + {file = "grpcio_tools-1.73.1-cp312-cp312-win_amd64.whl", hash = "sha256:0626266b0df489d6e8bdd4178b1c78cac9963fde4c5ba6b205b329e46696b334"}, + {file = "grpcio_tools-1.73.1-cp313-cp313-linux_armv7l.whl", hash = "sha256:4687200e18d316ef1e28824bf9c62c2c6a3a2aacf4e0d292306258ef05955587"}, + {file = "grpcio_tools-1.73.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:b86daf2dba207aace486cf5752c9c5d35864cd67f1df1429f7341af3984dadc7"}, + {file = "grpcio_tools-1.73.1-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:44ec622d210740ed6c4300ea51fc43faaa0c58f4e2c4b03e2fe5a452b8e440ce"}, + {file = "grpcio_tools-1.73.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ceac9073030012596cb7923643552329e48fb911eea3225624b8ef34bae92e1"}, + {file = "grpcio_tools-1.73.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43329b47e982798c9eb18f652fc10fef5d22f9df51001a10f1ece01d9d203c04"}, + {file = "grpcio_tools-1.73.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:f0afb000ff67f7665f3eedd797c23b403a6bdae829d6e610944aeb6959193698"}, + {file = "grpcio_tools-1.73.1-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:40c5def66b69c8c8f8a6af8d47a5e6b5825055c7ef7cf2b1b58c57ddc86bf3be"}, + {file = "grpcio_tools-1.73.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:9a0eb7d88c9f1992afb3021e45721971e49d612b03fa5d38cce6e4369509f32c"}, + {file = "grpcio_tools-1.73.1-cp313-cp313-win32.whl", hash = "sha256:34480c6964d16b7fa0012b9fc574efa9e2f71c80f8bc9da0887c300abb7130f3"}, + {file = "grpcio_tools-1.73.1-cp313-cp313-win_amd64.whl", hash = "sha256:2b005373ad23dc0f25d8d6ec6d219fc3a6831b8d0f487be8f9bb2315307ba1c1"}, + {file = "grpcio_tools-1.73.1.tar.gz", hash = "sha256:6e06adec3b0870f5947953b0ef8dbdf2cebcdff61fb1fe08120cc7483c7978aa"}, ] [[package]] @@ -661,7 +885,7 @@ name = "h11" version = "0.14.0" requires_python = ">=3.7" summary = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -groups = ["default", "all", "chat"] +groups = ["default", "all", "chat", "mcp"] dependencies = [ "typing-extensions; python_version < \"3.8\"", ] @@ -675,7 +899,7 @@ name = "httpcore" version = "1.0.7" requires_python = ">=3.8" summary = "A minimal low-level HTTP client." -groups = ["default"] +groups = ["default", "all", "mcp"] dependencies = [ "certifi", "h11<0.15,>=0.13", @@ -690,7 +914,7 @@ name = "httpx" version = "0.28.1" requires_python = ">=3.8" summary = "The next generation HTTP client." -groups = ["default"] +groups = ["default", "all", "mcp"] dependencies = [ "anyio", "certifi", @@ -702,6 +926,17 @@ files = [ {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, ] +[[package]] +name = "httpx-sse" +version = "0.4.1" +requires_python = ">=3.9" +summary = "Consume Server-Sent Event (SSE) messages with HTTPX." +groups = ["all", "mcp"] +files = [ + {file = "httpx_sse-0.4.1-py3-none-any.whl", hash = "sha256:cba42174344c3a5b06f255ce65b350880f962d99ead85e776f23c6618a377a37"}, + {file = "httpx_sse-0.4.1.tar.gz", hash = "sha256:8f44d34414bc7b21bf3602713005c5df4917884f76072479b21f68befa4ea26e"}, +] + [[package]] name = "huggingface-hub" version = "0.30.1" @@ -727,7 +962,7 @@ name = "idna" version = "3.10" requires_python = ">=3.6" summary = "Internationalized Domain Names in Applications (IDNA)" -groups = ["default", "all", "chat"] +groups = ["default", "all", "chat", "mcp"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -738,7 +973,7 @@ name = "inflect" version = "7.5.0" requires_python = ">=3.9" summary = "Correctly generate plurals, singular nouns, ordinals, indefinite articles" -groups = ["default"] +groups = ["dev"] dependencies = [ "more-itertools>=8.5.0", "typeguard>=4.0.1", @@ -765,7 +1000,7 @@ name = "isort" version = "6.0.1" requires_python = ">=3.9.0" summary = "A Python utility / library to sort Python imports." -groups = ["default"] +groups = ["dev"] files = [ {file = "isort-6.0.1-py3-none-any.whl", hash = "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615"}, {file = "isort-6.0.1.tar.gz", hash = "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450"}, @@ -776,7 +1011,7 @@ name = "jinja2" version = "3.1.6" requires_python = ">=3.7" summary = "A very fast and expressive template engine." -groups = ["default"] +groups = ["default", "dev"] dependencies = [ "MarkupSafe>=2.0", ] @@ -846,12 +1081,43 @@ files = [ {file = "jiter-0.9.0.tar.gz", hash = "sha256:aadba0964deb424daa24492abc3d229c60c4a31bfee205aedbf1acc7639d7893"}, ] +[[package]] +name = "jsonschema" +version = "4.25.0" +requires_python = ">=3.9" +summary = "An implementation of JSON Schema validation for Python" +groups = ["all", "mcp"] +dependencies = [ + "attrs>=22.2.0", + "jsonschema-specifications>=2023.03.6", + "referencing>=0.28.4", + "rpds-py>=0.7.1", +] +files = [ + {file = "jsonschema-4.25.0-py3-none-any.whl", hash = "sha256:24c2e8da302de79c8b9382fee3e76b355e44d2a4364bb207159ce10b517bd716"}, + {file = "jsonschema-4.25.0.tar.gz", hash = "sha256:e63acf5c11762c0e6672ffb61482bdf57f0876684d8d249c0fe2d730d48bc55f"}, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.4.1" +requires_python = ">=3.9" +summary = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +groups = ["all", "mcp"] +dependencies = [ + "referencing>=0.31.0", +] +files = [ + {file = "jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af"}, + {file = "jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608"}, +] + [[package]] name = "markdown-it-py" version = "3.0.0" requires_python = ">=3.8" summary = "Python port of markdown-it. Markdown parsing, done right!" -groups = ["default"] +groups = ["default", "all", "mcp"] dependencies = [ "mdurl~=0.1", ] @@ -865,7 +1131,7 @@ name = "markupsafe" version = "3.0.2" requires_python = ">=3.9" summary = "Safely add untrusted strings to HTML/XML markup." -groups = ["default"] +groups = ["default", "dev"] files = [ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, @@ -920,12 +1186,36 @@ files = [ {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, ] +[[package]] +name = "mcp" +version = "1.12.0" +requires_python = ">=3.10" +summary = "Model Context Protocol SDK" +groups = ["all", "mcp"] +dependencies = [ + "anyio>=4.5", + "httpx-sse>=0.4", + "httpx>=0.27", + "jsonschema>=4.20.0", + "pydantic-settings>=2.5.2", + "pydantic<3.0.0,>=2.8.0", + "python-multipart>=0.0.9", + "pywin32>=310; sys_platform == \"win32\"", + "sse-starlette>=1.6.1", + "starlette>=0.27", + "uvicorn>=0.23.1; sys_platform != \"emscripten\"", +] +files = [ + {file = "mcp-1.12.0-py3-none-any.whl", hash = "sha256:19a498b2bf273283e463b4dd1ed83f791fbba5c25bfa16b8b34cfd5571673e7f"}, + {file = "mcp-1.12.0.tar.gz", hash = "sha256:853f6b17a3f31ea6e2f278c2ec7d3b38457bc80c7c2c675260dd7f04a6fd0e70"}, +] + [[package]] name = "mdurl" version = "0.1.2" requires_python = ">=3.7" summary = "Markdown URL utilities" -groups = ["default"] +groups = ["default", "all", "mcp"] files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -936,7 +1226,7 @@ name = "more-itertools" version = "10.7.0" requires_python = ">=3.9" summary = "More routines for operating on iterables, beyond itertools" -groups = ["default"] +groups = ["dev"] files = [ {file = "more_itertools-10.7.0-py3-none-any.whl", hash = "sha256:d43980384673cb07d2f7d2d918c616b30c659c089ee23953f601d6609c67510e"}, {file = "more_itertools-10.7.0.tar.gz", hash = "sha256:9fddd5403be01a94b204faadcff459ec3568cf110265d3c54323e1e866ad29d3"}, @@ -998,7 +1288,7 @@ name = "mypy-extensions" version = "1.0.0" requires_python = ">=3.5" summary = "Type system extensions for programs checked with the mypy type checker." -groups = ["default", "test"] +groups = ["dev", "test"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, @@ -1025,12 +1315,26 @@ files = [ {file = "openai-1.85.0.tar.gz", hash = "sha256:6ba76e4ebc5725f71f2f6126c7cb5169ca8de60dd5aa61f350f9448ad162c913"}, ] +[[package]] +name = "openapi-pydantic" +version = "0.5.1" +requires_python = "<4.0,>=3.8" +summary = "Pydantic OpenAPI schema implementation" +groups = ["all", "mcp"] +dependencies = [ + "pydantic>=1.8", +] +files = [ + {file = "openapi_pydantic-0.5.1-py3-none-any.whl", hash = "sha256:a3a09ef4586f5bd760a8df7f43028b60cafb6d9f61de2acba9574766255ab146"}, + {file = "openapi_pydantic-0.5.1.tar.gz", hash = "sha256:ff6835af6bde7a459fb93eb93bb92b8749b754fc6e51b2f1590a19dc3005ee0d"}, +] + [[package]] name = "packaging" version = "24.2" requires_python = ">=3.8" summary = "Core utilities for Python packages" -groups = ["default", "test"] +groups = ["default", "dev", "test"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -1041,7 +1345,7 @@ name = "pathspec" version = "0.12.1" requires_python = ">=3.8" summary = "Utility library for gitignore style pattern matching of file paths." -groups = ["default"] +groups = ["dev"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -1121,7 +1425,7 @@ name = "platformdirs" version = "4.3.8" requires_python = ">=3.9" summary = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -groups = ["default"] +groups = ["dev"] files = [ {file = "platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4"}, {file = "platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc"}, @@ -1161,18 +1465,18 @@ files = [ [[package]] name = "protobuf" -version = "5.29.4" -requires_python = ">=3.8" +version = "6.31.1" +requires_python = ">=3.9" summary = "" -groups = ["default"] +groups = ["dev"] files = [ - {file = "protobuf-5.29.4-cp310-abi3-win32.whl", hash = "sha256:13eb236f8eb9ec34e63fc8b1d6efd2777d062fa6aaa68268fb67cf77f6839ad7"}, - {file = "protobuf-5.29.4-cp310-abi3-win_amd64.whl", hash = "sha256:bcefcdf3976233f8a502d265eb65ea740c989bacc6c30a58290ed0e519eb4b8d"}, - {file = "protobuf-5.29.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:307ecba1d852ec237e9ba668e087326a67564ef83e45a0189a772ede9e854dd0"}, - {file = "protobuf-5.29.4-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:aec4962f9ea93c431d5714ed1be1c93f13e1a8618e70035ba2b0564d9e633f2e"}, - {file = "protobuf-5.29.4-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:d7d3f7d1d5a66ed4942d4fefb12ac4b14a29028b209d4bfb25c68ae172059922"}, - {file = "protobuf-5.29.4-py3-none-any.whl", hash = "sha256:3fde11b505e1597f71b875ef2fc52062b6a9740e5f7c8997ce878b6009145862"}, - {file = "protobuf-5.29.4.tar.gz", hash = "sha256:4f1dfcd7997b31ef8f53ec82781ff434a28bf71d9102ddde14d076adcfc78c99"}, + {file = "protobuf-6.31.1-cp310-abi3-win32.whl", hash = "sha256:7fa17d5a29c2e04b7d90e5e32388b8bfd0e7107cd8e616feef7ed3fa6bdab5c9"}, + {file = "protobuf-6.31.1-cp310-abi3-win_amd64.whl", hash = "sha256:426f59d2964864a1a366254fa703b8632dcec0790d8862d30034d8245e1cd447"}, + {file = "protobuf-6.31.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:6f1227473dc43d44ed644425268eb7c2e488ae245d51c6866d19fe158e207402"}, + {file = "protobuf-6.31.1-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:a40fc12b84c154884d7d4c4ebd675d5b3b5283e155f324049ae396b95ddebc39"}, + {file = "protobuf-6.31.1-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:4ee898bf66f7a8b0bd21bce523814e6fbd8c6add948045ce958b73af7e8878c6"}, + {file = "protobuf-6.31.1-py3-none-any.whl", hash = "sha256:720a6c7e6b77288b85063569baae8536671b39f15cc22037ec7045658d80489e"}, + {file = "protobuf-6.31.1.tar.gz", hash = "sha256:d8cac4c982f0b957a4dc73a80e2ea24fab08e679c0de9deb835f4a12d69aca9a"}, ] [[package]] @@ -1197,110 +1501,122 @@ files = [ {file = "py_machineid-0.7.0-py3-none-any.whl", hash = "sha256:3dacc322b0511383d79f1e817a2710b19bcfb820a4c7cea34aaa329775fef468"}, ] +[[package]] +name = "pycparser" +version = "2.22" +requires_python = ">=3.8" +summary = "C parser in Python" +groups = ["all", "mcp"] +marker = "platform_python_implementation != \"PyPy\"" +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + [[package]] name = "pydantic" -version = "2.11.2" +version = "2.11.7" requires_python = ">=3.9" summary = "Data validation using Python type hints" -groups = ["default", "all", "chat"] +groups = ["default", "all", "chat", "dev", "mcp"] dependencies = [ "annotated-types>=0.6.0", - "pydantic-core==2.33.1", + "pydantic-core==2.33.2", "typing-extensions>=4.12.2", "typing-inspection>=0.4.0", ] files = [ - {file = "pydantic-2.11.2-py3-none-any.whl", hash = "sha256:7f17d25846bcdf89b670a86cdfe7b29a9f1c9ca23dee154221c9aa81845cfca7"}, - {file = "pydantic-2.11.2.tar.gz", hash = "sha256:2138628e050bd7a1e70b91d4bf4a91167f4ad76fdb83209b107c8d84b854917e"}, + {file = "pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b"}, + {file = "pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db"}, ] [[package]] name = "pydantic-core" -version = "2.33.1" +version = "2.33.2" requires_python = ">=3.9" summary = "Core functionality for Pydantic validation and serialization" -groups = ["default", "all", "chat"] +groups = ["default", "all", "chat", "dev", "mcp"] dependencies = [ "typing-extensions!=4.7.0,>=4.6.0", ] files = [ - {file = "pydantic_core-2.33.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3077cfdb6125cc8dab61b155fdd714663e401f0e6883f9632118ec12cf42df26"}, - {file = "pydantic_core-2.33.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ffab8b2908d152e74862d276cf5017c81a2f3719f14e8e3e8d6b83fda863927"}, - {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5183e4f6a2d468787243ebcd70cf4098c247e60d73fb7d68d5bc1e1beaa0c4db"}, - {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:398a38d323f37714023be1e0285765f0a27243a8b1506b7b7de87b647b517e48"}, - {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87d3776f0001b43acebfa86f8c64019c043b55cc5a6a2e313d728b5c95b46969"}, - {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c566dd9c5f63d22226409553531f89de0cac55397f2ab8d97d6f06cfce6d947e"}, - {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0d5f3acc81452c56895e90643a625302bd6be351e7010664151cc55b7b97f89"}, - {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d3a07fadec2a13274a8d861d3d37c61e97a816beae717efccaa4b36dfcaadcde"}, - {file = "pydantic_core-2.33.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f99aeda58dce827f76963ee87a0ebe75e648c72ff9ba1174a253f6744f518f65"}, - {file = "pydantic_core-2.33.1-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:902dbc832141aa0ec374f4310f1e4e7febeebc3256f00dc359a9ac3f264a45dc"}, - {file = "pydantic_core-2.33.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fe44d56aa0b00d66640aa84a3cbe80b7a3ccdc6f0b1ca71090696a6d4777c091"}, - {file = "pydantic_core-2.33.1-cp310-cp310-win32.whl", hash = "sha256:ed3eb16d51257c763539bde21e011092f127a2202692afaeaccb50db55a31383"}, - {file = "pydantic_core-2.33.1-cp310-cp310-win_amd64.whl", hash = "sha256:694ad99a7f6718c1a498dc170ca430687a39894a60327f548e02a9c7ee4b6504"}, - {file = "pydantic_core-2.33.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6e966fc3caaf9f1d96b349b0341c70c8d6573bf1bac7261f7b0ba88f96c56c24"}, - {file = "pydantic_core-2.33.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bfd0adeee563d59c598ceabddf2c92eec77abcb3f4a391b19aa7366170bd9e30"}, - {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91815221101ad3c6b507804178a7bb5cb7b2ead9ecd600041669c8d805ebd595"}, - {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9fea9c1869bb4742d174a57b4700c6dadea951df8b06de40c2fedb4f02931c2e"}, - {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d20eb4861329bb2484c021b9d9a977566ab16d84000a57e28061151c62b349a"}, - {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb935c5591573ae3201640579f30128ccc10739b45663f93c06796854405505"}, - {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c964fd24e6166420d18fb53996d8c9fd6eac9bf5ae3ec3d03015be4414ce497f"}, - {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:681d65e9011f7392db5aa002b7423cc442d6a673c635668c227c6c8d0e5a4f77"}, - {file = "pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e100c52f7355a48413e2999bfb4e139d2977a904495441b374f3d4fb4a170961"}, - {file = "pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:048831bd363490be79acdd3232f74a0e9951b11b2b4cc058aeb72b22fdc3abe1"}, - {file = "pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bdc84017d28459c00db6f918a7272a5190bec3090058334e43a76afb279eac7c"}, - {file = "pydantic_core-2.33.1-cp311-cp311-win32.whl", hash = "sha256:32cd11c5914d1179df70406427097c7dcde19fddf1418c787540f4b730289896"}, - {file = "pydantic_core-2.33.1-cp311-cp311-win_amd64.whl", hash = "sha256:2ea62419ba8c397e7da28a9170a16219d310d2cf4970dbc65c32faf20d828c83"}, - {file = "pydantic_core-2.33.1-cp311-cp311-win_arm64.whl", hash = "sha256:fc903512177361e868bc1f5b80ac8c8a6e05fcdd574a5fb5ffeac5a9982b9e89"}, - {file = "pydantic_core-2.33.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8"}, - {file = "pydantic_core-2.33.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498"}, - {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939"}, - {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d"}, - {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e"}, - {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3"}, - {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d"}, - {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b"}, - {file = "pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39"}, - {file = "pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a"}, - {file = "pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db"}, - {file = "pydantic_core-2.33.1-cp312-cp312-win32.whl", hash = "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda"}, - {file = "pydantic_core-2.33.1-cp312-cp312-win_amd64.whl", hash = "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4"}, - {file = "pydantic_core-2.33.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea"}, - {file = "pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a"}, - {file = "pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266"}, - {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3"}, - {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a"}, - {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516"}, - {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764"}, - {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d"}, - {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4"}, - {file = "pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde"}, - {file = "pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e"}, - {file = "pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd"}, - {file = "pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f"}, - {file = "pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40"}, - {file = "pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523"}, - {file = "pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d"}, - {file = "pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c"}, - {file = "pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18"}, - {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c834f54f8f4640fd7e4b193f80eb25a0602bba9e19b3cd2fc7ffe8199f5ae02"}, - {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:049e0de24cf23766f12cc5cc71d8abc07d4a9deb9061b334b62093dedc7cb068"}, - {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a28239037b3d6f16916a4c831a5a0eadf856bdd6d2e92c10a0da3a59eadcf3e"}, - {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d3da303ab5f378a268fa7d45f37d7d85c3ec19769f28d2cc0c61826a8de21fe"}, - {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:25626fb37b3c543818c14821afe0fd3830bc327a43953bc88db924b68c5723f1"}, - {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3ab2d36e20fbfcce8f02d73c33a8a7362980cff717926bbae030b93ae46b56c7"}, - {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:2f9284e11c751b003fd4215ad92d325d92c9cb19ee6729ebd87e3250072cdcde"}, - {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:048c01eee07d37cbd066fc512b9d8b5ea88ceeb4e629ab94b3e56965ad655add"}, - {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5ccd429694cf26af7997595d627dd2637e7932214486f55b8a357edaac9dae8c"}, - {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3a371dc00282c4b84246509a5ddc808e61b9864aa1eae9ecc92bb1268b82db4a"}, - {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f59295ecc75a1788af8ba92f2e8c6eeaa5a94c22fc4d151e8d9638814f85c8fc"}, - {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08530b8ac922003033f399128505f513e30ca770527cc8bbacf75a84fcc2c74b"}, - {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae370459da6a5466978c0eacf90690cb57ec9d533f8e63e564ef3822bfa04fe"}, - {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e3de2777e3b9f4d603112f78006f4ae0acb936e95f06da6cb1a45fbad6bdb4b5"}, - {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3a64e81e8cba118e108d7126362ea30e021291b7805d47e4896e52c791be2761"}, - {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:52928d8c1b6bda03cc6d811e8923dffc87a2d3c8b3bfd2ce16471c7147a24850"}, - {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1b30d92c9412beb5ac6b10a3eb7ef92ccb14e3f2a8d7732e2d739f58b3aa7544"}, - {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5"}, - {file = "pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df"}, + {file = "pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8"}, + {file = "pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b"}, + {file = "pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22"}, + {file = "pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640"}, + {file = "pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7"}, + {file = "pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65"}, + {file = "pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc"}, + {file = "pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab"}, + {file = "pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f"}, + {file = "pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1"}, + {file = "pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc"}, ] [[package]] @@ -1308,7 +1624,7 @@ name = "pydantic-settings" version = "2.9.1" requires_python = ">=3.9" summary = "Settings management using Pydantic" -groups = ["default"] +groups = ["default", "all", "mcp"] dependencies = [ "pydantic>=2.7.0", "python-dotenv>=0.21.0", @@ -1319,6 +1635,22 @@ files = [ {file = "pydantic_settings-2.9.1.tar.gz", hash = "sha256:c509bf79d27563add44e8446233359004ed85066cd096d8b510f715e6ef5d268"}, ] +[[package]] +name = "pydantic" +version = "2.11.7" +extras = ["email"] +requires_python = ">=3.9" +summary = "Data validation using Python type hints" +groups = ["all", "mcp"] +dependencies = [ + "email-validator>=2.0.0", + "pydantic==2.11.7", +] +files = [ + {file = "pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b"}, + {file = "pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db"}, +] + [[package]] name = "pyee" version = "13.0.0" @@ -1338,7 +1670,7 @@ name = "pygments" version = "2.19.1" requires_python = ">=3.8" summary = "Pygments is a syntax highlighting package written in Python." -groups = ["default"] +groups = ["default", "all", "mcp"] files = [ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, @@ -1475,7 +1807,7 @@ files = [ name = "pyperclip" version = "1.9.0" summary = "A cross-platform clipboard module for Python. (Only handles plain text for now.)" -groups = ["default"] +groups = ["default", "all", "mcp"] files = [ {file = "pyperclip-1.9.0.tar.gz", hash = "sha256:b7de0142ddc81bfc5c7507eea19da920b92252b548b96186caf94a5e2527d310"}, ] @@ -1576,12 +1908,23 @@ name = "python-dotenv" version = "1.1.0" requires_python = ">=3.9" summary = "Read key-value pairs from a .env file and set them as environment variables" -groups = ["default"] +groups = ["default", "all", "mcp"] files = [ {file = "python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d"}, {file = "python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5"}, ] +[[package]] +name = "python-multipart" +version = "0.0.20" +requires_python = ">=3.8" +summary = "A streaming multipart parser for Python" +groups = ["all", "mcp"] +files = [ + {file = "python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104"}, + {file = "python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13"}, +] + [[package]] name = "python-xlib" version = "0.33" @@ -1596,12 +1939,36 @@ files = [ {file = "python_xlib-0.33-py2.py3-none-any.whl", hash = "sha256:c3534038d42e0df2f1392a1b30a15a4ff5fdc2b86cfa94f072bf11b10a164398"}, ] +[[package]] +name = "pywin32" +version = "311" +summary = "Python for Window Extensions" +groups = ["all", "mcp"] +marker = "sys_platform == \"win32\"" +files = [ + {file = "pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3"}, + {file = "pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b"}, + {file = "pywin32-311-cp310-cp310-win_arm64.whl", hash = "sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b"}, + {file = "pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151"}, + {file = "pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503"}, + {file = "pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2"}, + {file = "pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31"}, + {file = "pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067"}, + {file = "pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852"}, + {file = "pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d"}, + {file = "pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d"}, + {file = "pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a"}, + {file = "pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee"}, + {file = "pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87"}, + {file = "pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42"}, +] + [[package]] name = "pyyaml" version = "6.0.2" requires_python = ">=3.8" summary = "YAML parser and emitter for Python" -groups = ["default"] +groups = ["default", "dev"] files = [ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, @@ -1642,6 +2009,22 @@ files = [ {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] +[[package]] +name = "referencing" +version = "0.36.2" +requires_python = ">=3.9" +summary = "JSON Referencing + Python" +groups = ["all", "mcp"] +dependencies = [ + "attrs>=22.2.0", + "rpds-py>=0.7.0", + "typing-extensions>=4.4.0; python_version < \"3.13\"", +] +files = [ + {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, + {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, +] + [[package]] name = "requests" version = "2.32.3" @@ -1664,7 +2047,7 @@ name = "rich" version = "14.0.0" requires_python = ">=3.8.0" summary = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -groups = ["default"] +groups = ["default", "all", "mcp"] dependencies = [ "markdown-it-py>=2.2.0", "pygments<3.0.0,>=2.13.0", @@ -1675,6 +2058,149 @@ files = [ {file = "rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725"}, ] +[[package]] +name = "rich-rst" +version = "1.3.1" +requires_python = ">=3.6" +summary = "A beautiful reStructuredText renderer for rich" +groups = ["all", "mcp"] +dependencies = [ + "docutils", + "rich>=12.0.0", +] +files = [ + {file = "rich_rst-1.3.1-py3-none-any.whl", hash = "sha256:498a74e3896507ab04492d326e794c3ef76e7cda078703aa592d1853d91098c1"}, + {file = "rich_rst-1.3.1.tar.gz", hash = "sha256:fad46e3ba42785ea8c1785e2ceaa56e0ffa32dbe5410dec432f37e4107c4f383"}, +] + +[[package]] +name = "rpds-py" +version = "0.26.0" +requires_python = ">=3.9" +summary = "Python bindings to Rust's persistent data structures (rpds)" +groups = ["all", "mcp"] +files = [ + {file = "rpds_py-0.26.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4c70c70f9169692b36307a95f3d8c0a9fcd79f7b4a383aad5eaa0e9718b79b37"}, + {file = "rpds_py-0.26.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:777c62479d12395bfb932944e61e915741e364c843afc3196b694db3d669fcd0"}, + {file = "rpds_py-0.26.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec671691e72dff75817386aa02d81e708b5a7ec0dec6669ec05213ff6b77e1bd"}, + {file = "rpds_py-0.26.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6a1cb5d6ce81379401bbb7f6dbe3d56de537fb8235979843f0d53bc2e9815a79"}, + {file = "rpds_py-0.26.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f789e32fa1fb6a7bf890e0124e7b42d1e60d28ebff57fe806719abb75f0e9a3"}, + {file = "rpds_py-0.26.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c55b0a669976cf258afd718de3d9ad1b7d1fe0a91cd1ab36f38b03d4d4aeaaf"}, + {file = "rpds_py-0.26.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c70d9ec912802ecfd6cd390dadb34a9578b04f9bcb8e863d0a7598ba5e9e7ccc"}, + {file = "rpds_py-0.26.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3021933c2cb7def39d927b9862292e0f4c75a13d7de70eb0ab06efed4c508c19"}, + {file = "rpds_py-0.26.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8a7898b6ca3b7d6659e55cdac825a2e58c638cbf335cde41f4619e290dd0ad11"}, + {file = "rpds_py-0.26.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:12bff2ad9447188377f1b2794772f91fe68bb4bbfa5a39d7941fbebdbf8c500f"}, + {file = "rpds_py-0.26.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:191aa858f7d4902e975d4cf2f2d9243816c91e9605070aeb09c0a800d187e323"}, + {file = "rpds_py-0.26.0-cp310-cp310-win32.whl", hash = "sha256:b37a04d9f52cb76b6b78f35109b513f6519efb481d8ca4c321f6a3b9580b3f45"}, + {file = "rpds_py-0.26.0-cp310-cp310-win_amd64.whl", hash = "sha256:38721d4c9edd3eb6670437d8d5e2070063f305bfa2d5aa4278c51cedcd508a84"}, + {file = "rpds_py-0.26.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:9e8cb77286025bdb21be2941d64ac6ca016130bfdcd228739e8ab137eb4406ed"}, + {file = "rpds_py-0.26.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5e09330b21d98adc8ccb2dbb9fc6cb434e8908d4c119aeaa772cb1caab5440a0"}, + {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9c1b92b774b2e68d11193dc39620d62fd8ab33f0a3c77ecdabe19c179cdbc1"}, + {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:824e6d3503ab990d7090768e4dfd9e840837bae057f212ff9f4f05ec6d1975e7"}, + {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ad7fd2258228bf288f2331f0a6148ad0186b2e3643055ed0db30990e59817a6"}, + {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0dc23bbb3e06ec1ea72d515fb572c1fea59695aefbffb106501138762e1e915e"}, + {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d80bf832ac7b1920ee29a426cdca335f96a2b5caa839811803e999b41ba9030d"}, + {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0919f38f5542c0a87e7b4afcafab6fd2c15386632d249e9a087498571250abe3"}, + {file = "rpds_py-0.26.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d422b945683e409000c888e384546dbab9009bb92f7c0b456e217988cf316107"}, + {file = "rpds_py-0.26.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:77a7711fa562ba2da1aa757e11024ad6d93bad6ad7ede5afb9af144623e5f76a"}, + {file = "rpds_py-0.26.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238e8c8610cb7c29460e37184f6799547f7e09e6a9bdbdab4e8edb90986a2318"}, + {file = "rpds_py-0.26.0-cp311-cp311-win32.whl", hash = "sha256:893b022bfbdf26d7bedb083efeea624e8550ca6eb98bf7fea30211ce95b9201a"}, + {file = "rpds_py-0.26.0-cp311-cp311-win_amd64.whl", hash = "sha256:87a5531de9f71aceb8af041d72fc4cab4943648d91875ed56d2e629bef6d4c03"}, + {file = "rpds_py-0.26.0-cp311-cp311-win_arm64.whl", hash = "sha256:de2713f48c1ad57f89ac25b3cb7daed2156d8e822cf0eca9b96a6f990718cc41"}, + {file = "rpds_py-0.26.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:894514d47e012e794f1350f076c427d2347ebf82f9b958d554d12819849a369d"}, + {file = "rpds_py-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc921b96fa95a097add244da36a1d9e4f3039160d1d30f1b35837bf108c21136"}, + {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1157659470aa42a75448b6e943c895be8c70531c43cb78b9ba990778955582"}, + {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:521ccf56f45bb3a791182dc6b88ae5f8fa079dd705ee42138c76deb1238e554e"}, + {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9def736773fd56b305c0eef698be5192c77bfa30d55a0e5885f80126c4831a15"}, + {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdad4ea3b4513b475e027be79e5a0ceac8ee1c113a1a11e5edc3c30c29f964d8"}, + {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82b165b07f416bdccf5c84546a484cc8f15137ca38325403864bfdf2b5b72f6a"}, + {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d04cab0a54b9dba4d278fe955a1390da3cf71f57feb78ddc7cb67cbe0bd30323"}, + {file = "rpds_py-0.26.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:79061ba1a11b6a12743a2b0f72a46aa2758613d454aa6ba4f5a265cc48850158"}, + {file = "rpds_py-0.26.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f405c93675d8d4c5ac87364bb38d06c988e11028a64b52a47158a355079661f3"}, + {file = "rpds_py-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dafd4c44b74aa4bed4b250f1aed165b8ef5de743bcca3b88fc9619b6087093d2"}, + {file = "rpds_py-0.26.0-cp312-cp312-win32.whl", hash = "sha256:3da5852aad63fa0c6f836f3359647870e21ea96cf433eb393ffa45263a170d44"}, + {file = "rpds_py-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf47cfdabc2194a669dcf7a8dbba62e37a04c5041d2125fae0233b720da6f05c"}, + {file = "rpds_py-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:20ab1ae4fa534f73647aad289003f1104092890849e0266271351922ed5574f8"}, + {file = "rpds_py-0.26.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:696764a5be111b036256c0b18cd29783fab22154690fc698062fc1b0084b511d"}, + {file = "rpds_py-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6c15d2080a63aaed876e228efe4f814bc7889c63b1e112ad46fdc8b368b9e1"}, + {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390e3170babf42462739a93321e657444f0862c6d722a291accc46f9d21ed04e"}, + {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7da84c2c74c0f5bc97d853d9e17bb83e2dcafcff0dc48286916001cc114379a1"}, + {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c5fe114a6dd480a510b6d3661d09d67d1622c4bf20660a474507aaee7eeeee9"}, + {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3100b3090269f3a7ea727b06a6080d4eb7439dca4c0e91a07c5d133bb1727ea7"}, + {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c03c9b0c64afd0320ae57de4c982801271c0c211aa2d37f3003ff5feb75bb04"}, + {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5963b72ccd199ade6ee493723d18a3f21ba7d5b957017607f815788cef50eaf1"}, + {file = "rpds_py-0.26.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da4e873860ad5bab3291438525cae80169daecbfafe5657f7f5fb4d6b3f96b9"}, + {file = "rpds_py-0.26.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5afaddaa8e8c7f1f7b4c5c725c0070b6eed0228f705b90a1732a48e84350f4e9"}, + {file = "rpds_py-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4916dc96489616a6f9667e7526af8fa693c0fdb4f3acb0e5d9f4400eb06a47ba"}, + {file = "rpds_py-0.26.0-cp313-cp313-win32.whl", hash = "sha256:2a343f91b17097c546b93f7999976fd6c9d5900617aa848c81d794e062ab302b"}, + {file = "rpds_py-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:0a0b60701f2300c81b2ac88a5fb893ccfa408e1c4a555a77f908a2596eb875a5"}, + {file = "rpds_py-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:257d011919f133a4746958257f2c75238e3ff54255acd5e3e11f3ff41fd14256"}, + {file = "rpds_py-0.26.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:529c8156d7506fba5740e05da8795688f87119cce330c244519cf706a4a3d618"}, + {file = "rpds_py-0.26.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f53ec51f9d24e9638a40cabb95078ade8c99251945dad8d57bf4aabe86ecee35"}, + {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab504c4d654e4a29558eaa5bb8cea5fdc1703ea60a8099ffd9c758472cf913f"}, + {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd0641abca296bc1a00183fe44f7fced8807ed49d501f188faa642d0e4975b83"}, + {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b312fecc1d017b5327afa81d4da1480f51c68810963a7336d92203dbb3d4f1"}, + {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c741107203954f6fc34d3066d213d0a0c40f7bb5aafd698fb39888af277c70d8"}, + {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3e55a7db08dc9a6ed5fb7103019d2c1a38a349ac41901f9f66d7f95750942f"}, + {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e851920caab2dbcae311fd28f4313c6953993893eb5c1bb367ec69d9a39e7ed"}, + {file = "rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dfbf280da5f876d0b00c81f26bedce274e72a678c28845453885a9b3c22ae632"}, + {file = "rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1cc81d14ddfa53d7f3906694d35d54d9d3f850ef8e4e99ee68bc0d1e5fed9a9c"}, + {file = "rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dca83c498b4650a91efcf7b88d669b170256bf8017a5db6f3e06c2bf031f57e0"}, + {file = "rpds_py-0.26.0-cp313-cp313t-win32.whl", hash = "sha256:4d11382bcaf12f80b51d790dee295c56a159633a8e81e6323b16e55d81ae37e9"}, + {file = "rpds_py-0.26.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff110acded3c22c033e637dd8896e411c7d3a11289b2edf041f86663dbc791e9"}, + {file = "rpds_py-0.26.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:da619979df60a940cd434084355c514c25cf8eb4cf9a508510682f6c851a4f7a"}, + {file = "rpds_py-0.26.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ea89a2458a1a75f87caabefe789c87539ea4e43b40f18cff526052e35bbb4fdf"}, + {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feac1045b3327a45944e7dcbeb57530339f6b17baff154df51ef8b0da34c8c12"}, + {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b818a592bd69bfe437ee8368603d4a2d928c34cffcdf77c2e761a759ffd17d20"}, + {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a8b0dd8648709b62d9372fc00a57466f5fdeefed666afe3fea5a6c9539a0331"}, + {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d3498ad0df07d81112aa6ec6c95a7e7b1ae00929fb73e7ebee0f3faaeabad2f"}, + {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a4146ccb15be237fdef10f331c568e1b0e505f8c8c9ed5d67759dac58ac246"}, + {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a9a63785467b2d73635957d32a4f6e73d5e4df497a16a6392fa066b753e87387"}, + {file = "rpds_py-0.26.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:de4ed93a8c91debfd5a047be327b7cc8b0cc6afe32a716bbbc4aedca9e2a83af"}, + {file = "rpds_py-0.26.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:caf51943715b12af827696ec395bfa68f090a4c1a1d2509eb4e2cb69abbbdb33"}, + {file = "rpds_py-0.26.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4a59e5bc386de021f56337f757301b337d7ab58baa40174fb150accd480bc953"}, + {file = "rpds_py-0.26.0-cp314-cp314-win32.whl", hash = "sha256:92c8db839367ef16a662478f0a2fe13e15f2227da3c1430a782ad0f6ee009ec9"}, + {file = "rpds_py-0.26.0-cp314-cp314-win_amd64.whl", hash = "sha256:b0afb8cdd034150d4d9f53926226ed27ad15b7f465e93d7468caaf5eafae0d37"}, + {file = "rpds_py-0.26.0-cp314-cp314-win_arm64.whl", hash = "sha256:ca3f059f4ba485d90c8dc75cb5ca897e15325e4e609812ce57f896607c1c0867"}, + {file = "rpds_py-0.26.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:5afea17ab3a126006dc2f293b14ffc7ef3c85336cf451564a0515ed7648033da"}, + {file = "rpds_py-0.26.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:69f0c0a3df7fd3a7eec50a00396104bb9a843ea6d45fcc31c2d5243446ffd7a7"}, + {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:801a71f70f9813e82d2513c9a96532551fce1e278ec0c64610992c49c04c2dad"}, + {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df52098cde6d5e02fa75c1f6244f07971773adb4a26625edd5c18fee906fa84d"}, + {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bc596b30f86dc6f0929499c9e574601679d0341a0108c25b9b358a042f51bca"}, + {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9dfbe56b299cf5875b68eb6f0ebaadc9cac520a1989cac0db0765abfb3709c19"}, + {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac64f4b2bdb4ea622175c9ab7cf09444e412e22c0e02e906978b3b488af5fde8"}, + {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:181ef9b6bbf9845a264f9aa45c31836e9f3c1f13be565d0d010e964c661d1e2b"}, + {file = "rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:49028aa684c144ea502a8e847d23aed5e4c2ef7cadfa7d5eaafcb40864844b7a"}, + {file = "rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e5d524d68a474a9688336045bbf76cb0def88549c1b2ad9dbfec1fb7cfbe9170"}, + {file = "rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c1851f429b822831bd2edcbe0cfd12ee9ea77868f8d3daf267b189371671c80e"}, + {file = "rpds_py-0.26.0-cp314-cp314t-win32.whl", hash = "sha256:7bdb17009696214c3b66bb3590c6d62e14ac5935e53e929bcdbc5a495987a84f"}, + {file = "rpds_py-0.26.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f14440b9573a6f76b4ee4770c13f0b5921f71dde3b6fcb8dabbefd13b7fe05d7"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3c0909c5234543ada2515c05dc08595b08d621ba919629e94427e8e03539c958"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:c1fb0cda2abcc0ac62f64e2ea4b4e64c57dfd6b885e693095460c61bde7bb18e"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84d142d2d6cf9b31c12aa4878d82ed3b2324226270b89b676ac62ccd7df52d08"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a547e21c5610b7e9093d870be50682a6a6cf180d6da0f42c47c306073bfdbbf6"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35e9a70a0f335371275cdcd08bc5b8051ac494dd58bff3bbfb421038220dc871"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0dfa6115c6def37905344d56fb54c03afc49104e2ca473d5dedec0f6606913b4"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:313cfcd6af1a55a286a3c9a25f64af6d0e46cf60bc5798f1db152d97a216ff6f"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f7bf2496fa563c046d05e4d232d7b7fd61346e2402052064b773e5c378bf6f73"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:aa81873e2c8c5aa616ab8e017a481a96742fdf9313c40f14338ca7dbf50cb55f"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:68ffcf982715f5b5b7686bdd349ff75d422e8f22551000c24b30eaa1b7f7ae84"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6188de70e190847bb6db3dc3981cbadff87d27d6fe9b4f0e18726d55795cee9b"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1c962145c7473723df9722ba4c058de12eb5ebedcb4e27e7d902920aa3831ee8"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f61a9326f80ca59214d1cceb0a09bb2ece5b2563d4e0cd37bfd5515c28510674"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:183f857a53bcf4b1b42ef0f57ca553ab56bdd170e49d8091e96c51c3d69ca696"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:941c1cfdf4799d623cf3aa1d326a6b4fdb7a5799ee2687f3516738216d2262fb"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72a8d9564a717ee291f554eeb4bfeafe2309d5ec0aa6c475170bdab0f9ee8e88"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:511d15193cbe013619dd05414c35a7dedf2088fcee93c6bbb7c77859765bd4e8"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aea1f9741b603a8d8fedb0ed5502c2bc0accbc51f43e2ad1337fe7259c2b77a5"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4019a9d473c708cf2f16415688ef0b4639e07abaa569d72f74745bbeffafa2c7"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:093d63b4b0f52d98ebae33b8c50900d3d67e0666094b1be7a12fffd7f65de74b"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2abe21d8ba64cded53a2a677e149ceb76dcf44284202d737178afe7ba540c1eb"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:4feb7511c29f8442cbbc28149a92093d32e815a28aa2c50d333826ad2a20fdf0"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e99685fc95d386da368013e7fb4269dd39c30d99f812a8372d62f244f662709c"}, + {file = "rpds_py-0.26.0.tar.gz", hash = "sha256:20dae58a859b0906f0685642e591056f1e787f3a8b39c8e8749a45dc7d26bdb0"}, +] + [[package]] name = "ruff" version = "0.11.3" @@ -1721,13 +2247,13 @@ files = [ [[package]] name = "setuptools" -version = "78.1.0" +version = "80.9.0" requires_python = ">=3.9" summary = "Easily download, build, install, upgrade, and uninstall Python packages" -groups = ["default"] +groups = ["dev"] files = [ - {file = "setuptools-78.1.0-py3-none-any.whl", hash = "sha256:3e386e96793c8702ae83d17b853fb93d3e09ef82ec62722e61da5cd22376dcd8"}, - {file = "setuptools-78.1.0.tar.gz", hash = "sha256:18fd474d4a82a5f83dac888df697af65afa82dec7323d09c3e37d1f14288da54"}, + {file = "setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922"}, + {file = "setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c"}, ] [[package]] @@ -1746,18 +2272,32 @@ name = "sniffio" version = "1.3.1" requires_python = ">=3.7" summary = "Sniff out which async library your code is running under" -groups = ["default", "all", "chat"] +groups = ["default", "all", "chat", "mcp"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] +[[package]] +name = "sse-starlette" +version = "2.4.1" +requires_python = ">=3.9" +summary = "SSE plugin for Starlette" +groups = ["all", "mcp"] +dependencies = [ + "anyio>=4.7.0", +] +files = [ + {file = "sse_starlette-2.4.1-py3-none-any.whl", hash = "sha256:08b77ea898ab1a13a428b2b6f73cfe6d0e607a7b4e15b9bb23e4a37b087fd39a"}, + {file = "sse_starlette-2.4.1.tar.gz", hash = "sha256:7c8a800a1ca343e9165fc06bbda45c78e4c6166320707ae30b416c42da070926"}, +] + [[package]] name = "starlette" version = "0.46.2" requires_python = ">=3.9" summary = "The little ASGI library that shines." -groups = ["all", "chat"] +groups = ["all", "chat", "mcp"] dependencies = [ "anyio<5,>=3.6.2", "typing-extensions>=3.10.0; python_version < \"3.10\"", @@ -1783,7 +2323,7 @@ name = "tomli" version = "2.2.1" requires_python = ">=3.8" summary = "A lil' TOML parser" -groups = ["default", "test"] +groups = ["dev", "test"] marker = "python_version <= \"3.11\"" files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, @@ -1839,7 +2379,7 @@ name = "typeguard" version = "4.4.4" requires_python = ">=3.9" summary = "Run-time type checker for Python" -groups = ["default"] +groups = ["dev"] dependencies = [ "importlib-metadata>=3.6; python_version < \"3.10\"", "typing-extensions>=4.14.0", @@ -1923,7 +2463,7 @@ name = "typing-extensions" version = "4.14.1" requires_python = ">=3.9" summary = "Backported and Experimental Type Hints for Python 3.9+" -groups = ["default", "all", "chat", "test", "web"] +groups = ["default", "all", "chat", "dev", "mcp", "test", "web"] files = [ {file = "typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76"}, {file = "typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36"}, @@ -1934,7 +2474,7 @@ name = "typing-inspection" version = "0.4.0" requires_python = ">=3.9" summary = "Runtime typing introspection tools" -groups = ["default", "all", "chat"] +groups = ["default", "all", "chat", "dev", "mcp"] dependencies = [ "typing-extensions>=4.12.0", ] @@ -1959,7 +2499,7 @@ name = "uvicorn" version = "0.34.3" requires_python = ">=3.9" summary = "The lightning-fast ASGI server." -groups = ["all", "chat"] +groups = ["all", "chat", "mcp"] dependencies = [ "click>=7.0", "h11>=0.8", diff --git a/pyproject.toml b/pyproject.toml index 91bd59a5..fe290f13 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,6 @@ authors = [ dependencies = [ "anthropic>=0.54.0", "gradio-client>=1.4.3", - "grpcio-tools>=1.67.0", "grpcio>=1.67.0", "httpx>=0.28.1", "Jinja2>=3.1.4", @@ -22,7 +21,6 @@ dependencies = [ "rich>=13.9.4", "segment-analytics-python>=2.3.4", "tenacity>=9.1.2", - "datamodel-code-generator>=0.31.2", ] requires-python = ">=3.10" readme = "README.md" @@ -239,3 +237,7 @@ pynput = [ web = [ "playwright>=1.41.0", ] +dev = [ + "datamodel-code-generator>=0.31.2", + "grpcio-tools>=1.73.1", +] From 7d02bcc5d069c656100117052fec7da20cdee158 Mon Sep 17 00:00:00 2001 From: onur-askui <210008309+onur-askui@users.noreply.github.com> Date: Tue, 22 Jul 2025 10:27:51 +0200 Subject: [PATCH 19/21] refactor: remove wrapper functions for RenderImage and RenderText --- src/askui/tools/askui/askui_controller.py | 13 ++++++------- src/askui/tools/askui/command_helpers.py | 21 +++++---------------- 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/src/askui/tools/askui/askui_controller.py b/src/askui/tools/askui/askui_controller.py index 939e1563..f9cb8d6e 100644 --- a/src/askui/tools/askui/askui_controller.py +++ b/src/askui/tools/askui/askui_controller.py @@ -22,11 +22,11 @@ from askui.tools.askui.askui_ui_controller_grpc.generated import ( Controller_V1_pb2_grpc as controller_v1, ) -from askui.tools.askui.askui_ui_controller_grpc.generated.AgentOS_Send_Request_2501 import ( - RenderObjectStyle, # noqa: E501 +from askui.tools.askui.askui_ui_controller_grpc.generated.AgentOS_Send_Request_2501 import ( # noqa: E501 + RenderObjectStyle, ) -from askui.tools.askui.askui_ui_controller_grpc.generated.AgentOS_Send_Response_2501 import ( - AskuiAgentosSendResponseSchema, # noqa: E501; noqa: E501 +from askui.tools.askui.askui_ui_controller_grpc.generated.AgentOS_Send_Response_2501 import ( # noqa: E501 + AskuiAgentosSendResponseSchema, ) from askui.tools.askui.command_helpers import ( create_clear_render_objects_command, @@ -35,7 +35,6 @@ create_image_command, create_line_command, create_quad_command, - create_render_text, create_set_mouse_position_command, create_text_command, create_update_render_object_command, @@ -1285,8 +1284,8 @@ def render_text(self, style: RenderObjectStyle, content: str) -> int: "Stub is not initialized" ) self._reporter.add_message("AgentOS", f"render_text({style}, {content})") - text_obj = create_render_text(content) - req = create_text_command(style, text_obj, self._session_guid).model_dump_json( + + req = create_text_command(style, content, self._session_guid).model_dump_json( exclude_unset=True, by_alias=True ) res = self.send_message(req) diff --git a/src/askui/tools/askui/command_helpers.py b/src/askui/tools/askui/command_helpers.py index 6597b4b8..8e250ff5 100644 --- a/src/askui/tools/askui/command_helpers.py +++ b/src/askui/tools/askui/command_helpers.py @@ -122,10 +122,8 @@ def create_line_command( def create_image_command( style: RenderObjectStyle, image_data: str, session_guid: str ) -> AskuiAgentosSendRequestSchema: - image_obj = create_render_image(image_data) - command = Command2( - name=Name2.AddRenderObject, parameters=["Image", style, image_obj] - ) + image = RenderImage(root=image_data) + command = Command2(name=Name2.AddRenderObject, parameters=["Image", style, image]) header = Header(authentication=Guid(root=session_guid)) message = Message(header=header, command=command) @@ -134,11 +132,10 @@ def create_image_command( def create_text_command( - style: RenderObjectStyle, text_content: RenderText, session_guid: str + style: RenderObjectStyle, text_content: str, session_guid: str ) -> AskuiAgentosSendRequestSchema: - command = Command2( - name=Name2.AddRenderObject, parameters=["Text", style, text_content] - ) + text = RenderText(root=text_content) + command = Command2(name=Name2.AddRenderObject, parameters=["Text", style, text]) header = Header(authentication=Guid(root=session_guid)) message = Message(header=header, command=command) @@ -154,14 +151,6 @@ def create_render_line_points(points: list[Coordinate]) -> RenderLinePoints: return RenderLinePoints(location_points) -def create_render_image(base64_data: str) -> RenderImage: - return RenderImage(root=base64_data) - - -def create_render_text(text: str) -> RenderText: - return RenderText(root=text) - - def create_render_object_id(object_id: int) -> RenderObjectId: return RenderObjectId(root=object_id) From 7e2ee62ffd69f32b75afc7892d7f932adf30035e Mon Sep 17 00:00:00 2001 From: onur-askui <210008309+onur-askui@users.noreply.github.com> Date: Tue, 22 Jul 2025 11:28:07 +0200 Subject: [PATCH 20/21] refactor: fix type error --- src/askui/mcp/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/askui/mcp/__init__.py b/src/askui/mcp/__init__.py index f6878350..0019dca5 100644 --- a/src/askui/mcp/__init__.py +++ b/src/askui/mcp/__init__.py @@ -4,6 +4,7 @@ from typing import Any from fastmcp import FastMCP +from fastmcp.tools.tool import Tool from askui.agent import VisionAgent @@ -16,7 +17,7 @@ class AppContext: @asynccontextmanager async def mcp_lifespan(server: FastMCP[Any]) -> AsyncIterator[AppContext]: # noqa: ARG001 with VisionAgent(display=2) as vision_agent: - server.add_tool(vision_agent.click) + server.add_tool(Tool.from_function(vision_agent.click)) yield AppContext(vision_agent=vision_agent) From 0f81da4c7868d857598151630eef6d13427659cd Mon Sep 17 00:00:00 2001 From: danyalxahid-askui Date: Thu, 24 Jul 2025 10:41:36 +0200 Subject: [PATCH 21/21] feat: add GetCursorPositionTool to VisionAgent --- src/askui/agent.py | 11 +++++----- src/askui/tools/cursor_position_tool.py | 29 +++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 src/askui/tools/cursor_position_tool.py diff --git a/src/askui/agent.py b/src/askui/agent.py index 30dbce32..30c8a47d 100644 --- a/src/askui/agent.py +++ b/src/askui/agent.py @@ -10,14 +10,12 @@ from askui.agent_base import AgentBase from askui.container import telemetry from askui.locators.locators import Locator -from askui.models.shared.settings import ( - COMPUTER_USE_20241022_BETA_FLAG, - COMPUTER_USE_20250124_BETA_FLAG, - ActSettings, - MessageSettings, -) +from askui.models.shared.settings import (COMPUTER_USE_20241022_BETA_FLAG, + COMPUTER_USE_20250124_BETA_FLAG, + ActSettings, MessageSettings) from askui.models.shared.tools import Tool from askui.tools.computer import Computer20241022Tool, Computer20250124Tool +from askui.tools.cursor_position_tool import CursorPositionTool from askui.tools.exception_tool import ExceptionTool from .logger import logger @@ -115,6 +113,7 @@ def __init__( models=models, tools=[ ExceptionTool(), + CursorPositionTool(agent_os=self.tools.os), ] + (act_tools or []), agent_os=self.tools.os, diff --git a/src/askui/tools/cursor_position_tool.py b/src/askui/tools/cursor_position_tool.py new file mode 100644 index 00000000..5ad11616 --- /dev/null +++ b/src/askui/tools/cursor_position_tool.py @@ -0,0 +1,29 @@ +from askui.models.shared.tools import Tool +from askui.tools.agent_os import AgentOs, Coordinate + + +class CursorPositionTool(Tool): + """ + Tool to get the current mouse cursor position. + """ + + def __init__(self, agent_os: AgentOs): + super().__init__( + name="get_cursor_position", + description= + """ + Gets the current position of the mouse cursor. + Returns a JSON string with 'x' and 'y' coordinates, e.g. {"x": 100, "y": 200}. + """ + ) + self._agent_os: AgentOs = agent_os + + def __call__(self) -> str: + """ + Gets the current mouse cursor position. + + Returns: + str: A JSON string with 'x' and 'y' coordinates of the cursor, e.g. {"x": 100, "y": 200}. + """ + point: Coordinate = self._agent_os.get_mouse_position() + return point.model_dump_json()