stoobly-agent 1.8.1__py3-none-any.whl → 1.8.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
stoobly_agent/__init__.py CHANGED
@@ -1,2 +1,2 @@
1
1
  COMMAND = 'stoobly-agent'
2
- VERSION = '1.8.1'
2
+ VERSION = '1.8.3'
@@ -96,6 +96,7 @@ class ServiceBuilder(Builder):
96
96
  labels = [
97
97
  'traefik.enable=true',
98
98
  f"traefik.http.routers.{service_id}.rule=Host(`{SERVICE_HOSTNAME}`)",
99
+ f"traefik.http.routers.{service_id}.entrypoints={SERVICE_PORT}",
99
100
  f"traefik.http.services.{service_id}.loadbalancer.server.port={SERVICE_PORT}"
100
101
  ]
101
102
  volumes = []
@@ -81,7 +81,7 @@ def __with_traefik_config(service_paths: str, compose: dict, app_dir_path: str):
81
81
  if not config.hostname:
82
82
  continue
83
83
 
84
- entry_points[config.port] = {
84
+ entry_points[str(config.port)] = {
85
85
  'address': f":{config.port}"
86
86
  }
87
87
 
@@ -66,18 +66,23 @@ class ServiceConfig(Config):
66
66
  self.__hostname = v
67
67
 
68
68
  @property
69
- def port(self):
69
+ def port(self) -> int:
70
70
  if not self.__port:
71
71
  if self.scheme == 'https':
72
- return '443'
72
+ return 443
73
73
  elif self.scheme == 'http':
74
- return '80'
74
+ return 80
75
75
 
76
76
  return self.__port
77
77
 
78
78
  @port.setter
79
- def port(self, v):
80
- self.__port = v
79
+ def port(self, v: int):
80
+ if v == None:
81
+ self.__port = v
82
+ else:
83
+ v = int(v)
84
+ if v > 0 and v <= 65535:
85
+ self.__port = v
81
86
 
82
87
  @property
83
88
  def priority(self):
@@ -106,10 +111,10 @@ class ServiceConfig(Config):
106
111
  if not self.port:
107
112
  return _proxy_mode
108
113
 
109
- if self.scheme == 'http' and self.port == '80':
114
+ if self.scheme == 'http' and self.port == 80:
110
115
  return _proxy_mode
111
116
 
112
- if self.scheme == 'https' and self.port == '443':
117
+ if self.scheme == 'https' and self.port == 443:
113
118
  return _proxy_mode
114
119
 
115
120
  return f"{_proxy_mode}:{self.port}"
@@ -1,5 +1,8 @@
1
1
  services:
2
2
  stoobly_ui.base:
3
+ environment:
4
+ SERVICE_NAME: ${SERVICE_NAME}
5
+ WORKFLOW_NAME: ${WORKFLOW_NAME}
3
6
  extends:
4
7
  file: ../.docker-compose.base.yml
5
8
  service: context_base
@@ -6,6 +6,9 @@
6
6
  echo "Configuring intercept..."
7
7
  stoobly-agent intercept configure --mode mock --policy all
8
8
 
9
+ echo "Enabling intercept..."
10
+ stoobly-agent intercept enable
11
+
9
12
  entrypoint=$1
10
13
 
11
14
  if [ -e "$entrypoint" ]; then
@@ -6,6 +6,9 @@
6
6
  echo "Configuring intercept..."
7
7
  stoobly-agent intercept configure --mode mock --policy all
8
8
 
9
+ echo "Enabling intercept..."
10
+ stoobly-agent intercept enable
11
+
9
12
  entrypoint=$1
10
13
 
11
14
  if [ -e "$entrypoint" ]; then
@@ -129,7 +129,7 @@ def mkcert(**kwargs):
129
129
  @click.option('--env', multiple=True, help='Specify an environment variable.')
130
130
  @click.option('--force', is_flag=True, help='Overwrite maintained scaffolded service files.')
131
131
  @click.option('--hostname', help='Service hostname.')
132
- @click.option('--port', help='Service port.')
132
+ @click.option('--port', type=click.IntRange(1, 65535), help='Service port.')
133
133
  @click.option('--priority', default=5, type=click.FloatRange(1.0, 9.0), help='Determines the service run order. Lower values run first.')
134
134
  @click.option('--proxy-mode', help='''
135
135
  Proxy mode can be "regular", "transparent", "socks5",
@@ -212,7 +212,10 @@ def delete(**kwargs):
212
212
  help="Update a service config"
213
213
  )
214
214
  @click.option('--app-dir-path', default=current_working_dir, help='Path to application directory.')
215
- @click.option('--priority', help='Determines the service run order.')
215
+ @click.option('--hostname', help='Service hostname.')
216
+ @click.option('--port', type=click.IntRange(1, 65535), help='Service port.')
217
+ @click.option('--priority', default=5, type=click.FloatRange(1.0, 9.0), help='Determines the service run order. Lower values run first.')
218
+ @click.option('--scheme', type=click.Choice(['http', 'https']), help='Defaults to https if hostname is set.')
216
219
  @click.argument('service_name')
217
220
  def update(**kwargs):
218
221
  app = App(kwargs['app_dir_path'], DOCKER_NAMESPACE)
@@ -224,9 +227,18 @@ def update(**kwargs):
224
227
 
225
228
  service_config = ServiceConfig(service.dir_path)
226
229
 
230
+ if kwargs['hostname']:
231
+ service_config.hostname = kwargs['hostname']
232
+
227
233
  if kwargs['priority']:
228
234
  service_config.priority = kwargs['priority']
229
235
 
236
+ if kwargs['port']:
237
+ service_config.port = kwargs['port']
238
+
239
+ if kwargs['scheme']:
240
+ service_config.scheme = kwargs['scheme']
241
+
230
242
  service_config.write()
231
243
 
232
244
  @workflow.command(
@@ -11,7 +11,7 @@ class CustomNotFoundResponseBuilder():
11
11
 
12
12
  def build(self):
13
13
  self.__response.status_code = custom_response_codes.NOT_FOUND
14
- self.__response.raw = BytesIO('Request not found'.encode())
14
+ self.__response.raw = BytesIO('Request not found. To troubleshoot see https://docs.stoobly.com/guides/how-to-mock-apis/troubleshooting'.encode())
15
15
  self.__response.headers = {
16
16
  'Access-Control-Allow-Origin': '*',
17
17
  'Access-Control-Allow-Methods': 'GET, OPTIONS, POST, PATCH, PUT, DELETE',
@@ -5,6 +5,8 @@ import signal
5
5
 
6
6
  from mitmproxy.net import tls
7
7
 
8
+ from stoobly_agent.app.cli.scaffold.constants import SERVICE_NAME_ENV
9
+ from stoobly_agent.app.cli.scaffold.templates.constants import CORE_MOCK_UI_SERVICE_NAME
8
10
  from stoobly_agent.config.mitmproxy import MitmproxyConfig
9
11
 
10
12
  # Monkey patch for OpenSSL unsafe legacy renegotiation disabled
@@ -85,16 +87,29 @@ def __with_cli_options(config: MitmproxyConfig, cli_options: dict):
85
87
  config.set(tuple(options))
86
88
 
87
89
  def __commit_options(options: dict):
90
+ changed = False
91
+ service_name = os.environ.get(SERVICE_NAME_ENV)
88
92
  settings = Settings.instance()
89
93
 
90
- settings.proxy.intercept.active = not not options.get('intercept')
94
+ if not service_name or options.get('intercept'):
95
+ # In the case when service name is set,
96
+ # only update if intercept is explicitly enabled
97
+ intercept = not not options.get('intercept')
98
+ changed = settings.proxy.intercept.active != intercept
99
+ settings.proxy.intercept.active = intercept
91
100
 
92
- if options.get('proxy_host') and options.get('proxy_port'):
93
- settings.proxy.url = f"http://{options.get('proxy_host')}:{options.get('proxy_port')}"
101
+ if not service_name or service_name == CORE_MOCK_UI_SERVICE_NAME:
102
+ # Causes potentially unintended side effects when run as part of scaffold
103
+ # Defer to ui service for configuration in this case
104
+ if options.get('proxy_host') and options.get('proxy_port'):
105
+ settings.proxy.url = f"http://{options.get('proxy_host')}:{options.get('proxy_port')}"
94
106
 
95
- settings.ui.active = not options.get('headless')
107
+ settings.ui.active = not options.get('headless')
96
108
 
97
- settings.commit()
109
+ changed = True
110
+
111
+ if changed:
112
+ settings.commit()
98
113
 
99
114
  def __filter_options(options):
100
115
  '''
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: stoobly-agent
3
- Version: 1.8.1
3
+ Version: 1.8.3
4
4
  Summary: Record, mock, and test HTTP(s) requests. CLI agent for Stoobly
5
5
  License: Apache-2.0
6
6
  Author: Matt Le
@@ -1,4 +1,4 @@
1
- stoobly_agent/__init__.py,sha256=-pR52NA8t3qmcLZZmZyqkvCEMnoglpgGrKb6iyh9Ws8,44
1
+ stoobly_agent/__init__.py,sha256=J2JqrH2GFu96vjqCEMJ_KNcQvXZMEz3kpPg-23ehEjo,44
2
2
  stoobly_agent/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  stoobly_agent/app/api/__init__.py,sha256=ctkB8KR-eXO0SFhj602huHiyvQ3PslFWd8fkcufgrAI,1000
4
4
  stoobly_agent/app/api/application_http_request_handler.py,sha256=Vvz53yB0bR7J-QqMAkLlhcZrA4P64ZEN7w8cMbgl6o0,5261
@@ -81,8 +81,8 @@ stoobly_agent/app/cli/scaffold/docker/builder.py,sha256=uiGqhxBHEasZAqLzjKUGUs-1
81
81
  stoobly_agent/app/cli/scaffold/docker/constants.py,sha256=1khQdgTaQ89ykGRNdTQh_ejFOdjNFGaZ_3cOGda6y7Y,692
82
82
  stoobly_agent/app/cli/scaffold/docker/service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
83
  stoobly_agent/app/cli/scaffold/docker/service/build_decorator.py,sha256=ZU7z4bkvdS3OK5O4fJhlA9_PNwnFtZW6t7vNF7V5obQ,1003
84
- stoobly_agent/app/cli/scaffold/docker/service/builder.py,sha256=HJ4XOjno-Jecrlo2m0eZwNt2zvZreG32Zzo1AfT8Kq4,5786
85
- stoobly_agent/app/cli/scaffold/docker/service/configure_gateway.py,sha256=kKJDxbjV9cy5JIvnKKdVppdmlagvtTZ3z1j9-sS3Qic,3728
84
+ stoobly_agent/app/cli/scaffold/docker/service/builder.py,sha256=4cIMSYvgrkGWVuuYymiwlrR829O91qQl9ML8FhaDMj4,5857
85
+ stoobly_agent/app/cli/scaffold/docker/service/configure_gateway.py,sha256=avGKpxOTXtIvFguSAaihxQwRzUm6I7UfeZ9_WzvwXuA,3733
86
86
  stoobly_agent/app/cli/scaffold/docker/service/types.py,sha256=qB-yYHlu-PZDc0HYgTUvE5bWNpHxaSThC3JUG8okR1k,88
87
87
  stoobly_agent/app/cli/scaffold/docker/workflow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
88
  stoobly_agent/app/cli/scaffold/docker/workflow/build_decorator.py,sha256=VKD9hXbJGRIWHS5IeYXeX0-FQ0F43zG8VmsegL6eYwA,703
@@ -96,7 +96,7 @@ stoobly_agent/app/cli/scaffold/hosts_file_manager.py,sha256=zNX5wh6zXQ4J2BA0YYdD
96
96
  stoobly_agent/app/cli/scaffold/managed_services_docker_compose.py,sha256=-wLBXUi7DCWsfm5KzZzd_kdJKOTl1NT924XR7dyjbSY,574
97
97
  stoobly_agent/app/cli/scaffold/service.py,sha256=L9K6QE0k5KSEC8_fSwtdwwTSO_DsIpqSPW-AG7Bg76o,501
98
98
  stoobly_agent/app/cli/scaffold/service_command.py,sha256=9kIKiFC5Jo425VWYD4NDvUOdMP-pNyq2D5Ip1ZAPj3A,1054
99
- stoobly_agent/app/cli/scaffold/service_config.py,sha256=aM9x_LQVl9MJyO7yqzwiXWlbbNg9FJA-Tk9IwVINLok,3798
99
+ stoobly_agent/app/cli/scaffold/service_config.py,sha256=edL356wqpfJgFdeSrWof-CAUB1Tgi4nO1Jx9nkql9Qc,3903
100
100
  stoobly_agent/app/cli/scaffold/service_create_command.py,sha256=1B6TK3JDAjouikCV84WDrX7b0crdPMPIo1caMwhi-L8,2815
101
101
  stoobly_agent/app/cli/scaffold/service_delete_command.py,sha256=_nBDQjm8eL62MQpzSCxgUHlW04ZXKG8MDlN1BXxlqww,986
102
102
  stoobly_agent/app/cli/scaffold/service_docker_compose.py,sha256=OMUN1-ujQYIZXxDvS4XBf5C9wGalQULkwOiBBQPZbHY,820
@@ -142,15 +142,15 @@ stoobly_agent/app/cli/scaffold/templates/app/gateway/mock/.docker-compose.mock.y
142
142
  stoobly_agent/app/cli/scaffold/templates/app/gateway/record/.docker-compose.record.yml,sha256=eyLH2h33Peunus8M1sUKL9AALCG2ABhV_heiJKhvgwo,138
143
143
  stoobly_agent/app/cli/scaffold/templates/app/gateway/test/.docker-compose.test.yml,sha256=oJO6i0lsuQaQeIH80yoPZo3Vs0LzUAH2WRl853yLq6g,136
144
144
  stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/.config.yml,sha256=XnLQZMzzMMIwVycjyPN5QXsmRztkTFAna1kIHYuDfJQ,19
145
- stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/.docker-compose.base.yml,sha256=bxrtZqf3YtaJCukzScslh5PgWC5q8xkGIP1wKJf33LA,111
145
+ stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/.docker-compose.base.yml,sha256=bEmlH0ga_p3vsYZFagMGxvw47KscURmbYrfegMZb1CI,202
146
146
  stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/.docker-compose.exec.yml,sha256=JN89sU5uRf6YqHvN_O63K8rwQIAPJHbhFDLFmuUjKNM,304
147
147
  stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/mock/.docker-compose.mock.yml,sha256=FnCn64DjxyAiB2P_1JUwFmXslMR961nVZHkYiEXytlg,232
148
148
  stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/record/.docker-compose.record.yml,sha256=t34FNYZboJSfrKnIB2oJ3UuE_mJaW77-hcbSn3sfWec,235
149
- stoobly_agent/app/cli/scaffold/templates/build/services/build/mock/.configure,sha256=ZL-39jgiP8X01rE3DJ8rN-BxEy-srYxjj-CGJhQH278,276
149
+ stoobly_agent/app/cli/scaffold/templates/build/services/build/mock/.configure,sha256=SKvht2K_3tW08K24rl8_j0jMYOhq1k-GsVwhoHwjxYA,337
150
150
  stoobly_agent/app/cli/scaffold/templates/build/services/build/mock/.init,sha256=ecmyS6EZpa3op0CmO7bvd3pmAwRb0oLwj1qsTkee9_o,247
151
151
  stoobly_agent/app/cli/scaffold/templates/build/services/build/record/.configure,sha256=eXp9eKJ-TORE5B0zLW4-t43ogS3nxtj2SmSeDALbi1U,278
152
152
  stoobly_agent/app/cli/scaffold/templates/build/services/build/record/.init,sha256=ecmyS6EZpa3op0CmO7bvd3pmAwRb0oLwj1qsTkee9_o,247
153
- stoobly_agent/app/cli/scaffold/templates/build/services/build/test/.configure,sha256=ZL-39jgiP8X01rE3DJ8rN-BxEy-srYxjj-CGJhQH278,276
153
+ stoobly_agent/app/cli/scaffold/templates/build/services/build/test/.configure,sha256=SKvht2K_3tW08K24rl8_j0jMYOhq1k-GsVwhoHwjxYA,337
154
154
  stoobly_agent/app/cli/scaffold/templates/build/services/build/test/.init,sha256=ecmyS6EZpa3op0CmO7bvd3pmAwRb0oLwj1qsTkee9_o,247
155
155
  stoobly_agent/app/cli/scaffold/templates/build/services/entrypoint/mock/.configure,sha256=xWJGhCKQejtVLFAOEZMWnaCeGAc9tuqEh_WsG3xfA_0,184
156
156
  stoobly_agent/app/cli/scaffold/templates/build/services/entrypoint/mock/.init,sha256=AcM6SLUsZa6BOLDjxteDR_AXIco47GZNkWQCGPhPDAY,189
@@ -202,7 +202,7 @@ stoobly_agent/app/cli/scaffold/workflow_env.py,sha256=x8V5pJmIiklD3f2q2-qq-CORf4
202
202
  stoobly_agent/app/cli/scaffold/workflow_log_command.py,sha256=Bke4lMOMxuDUFuAx9nlXHbKgYMO4KAg9ASHvjz4aVWc,1372
203
203
  stoobly_agent/app/cli/scaffold/workflow_run_command.py,sha256=eF3aaK4OIZXYuSBEAeBnhAL7EZrS1G4mSYrJbEiXt2o,11082
204
204
  stoobly_agent/app/cli/scaffold/workflow_validate_command.py,sha256=Uo_yo6rVR1ZR7xpvsQvlH48AyMBVLRupd4G-bRjzm_Q,5584
205
- stoobly_agent/app/cli/scaffold_cli.py,sha256=g6LEBiL1Lz0IQwlohpz8LFkhoaQukRtnQHgjzwAiASs,29528
205
+ stoobly_agent/app/cli/scaffold_cli.py,sha256=zrXf2nUI5jRnf6x-j3kKmia8vH_AngjpweVnjdD_R3Q,30075
206
206
  stoobly_agent/app/cli/scenario_cli.py,sha256=3J1EiJOvunkfWrEkOsanw-XrKkOk78ij_GjBlE9p7CE,8229
207
207
  stoobly_agent/app/cli/snapshot_cli.py,sha256=cpCjxFYBuVwLuq_b2lIUu-5zWqupRlrp4xWgDytirSM,10047
208
208
  stoobly_agent/app/cli/trace_cli.py,sha256=K7E-vx3JUcqEDSWOdIOi_AieKNQz7dBfmRrVvKDkzFI,4605
@@ -324,7 +324,7 @@ stoobly_agent/app/proxy/mitmproxy/response_body_facade.py,sha256=vIu6cuCSiZDocvn
324
324
  stoobly_agent/app/proxy/mitmproxy/response_facade.py,sha256=0wCSzUULUhDDV93QXUgzMNxiiSZwcu-kUB2C5z1Ck0Y,4311
325
325
  stoobly_agent/app/proxy/mock/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
326
326
  stoobly_agent/app/proxy/mock/context.py,sha256=vDo5_3WBL73mVFnsmQWvcxvPg5nWtRJbigSrE3zGc-o,794
327
- stoobly_agent/app/proxy/mock/custom_not_found_response_builder.py,sha256=xHjA2CNhW5A4NyPkDzws6DY5YQeJqF6b3Y3k0iJKNss,611
327
+ stoobly_agent/app/proxy/mock/custom_not_found_response_builder.py,sha256=0KWB3KFxVrnJOKDaYxm5eoJEccw7IpJZRyUvBX61-8k,697
328
328
  stoobly_agent/app/proxy/mock/eval_fixtures_service.py,sha256=hc4VLnN50HBaWvFnrhQUJqdH-r3jBu9DHrpt8gbvkHY,3847
329
329
  stoobly_agent/app/proxy/mock/eval_request_service.py,sha256=A1tcE3wmrC1HwLpz0aRuRw-Nucn0dyHD_yHw5BeQEJU,8146
330
330
  stoobly_agent/app/proxy/mock/hashed_request_decorator.py,sha256=h1ma90fdaYI9LBWpMWMqWBz-RjNwI628O4VuS_uUBX4,5061
@@ -353,7 +353,7 @@ stoobly_agent/app/proxy/replay/replay_request_service.py,sha256=UuTPPef6jchrJSjV
353
353
  stoobly_agent/app/proxy/replay/replay_scenario_service.py,sha256=9jV-iO5EBg8geUblEtjjWRFIkom_Pqmo7P-lTc3S4Xw,2824
354
354
  stoobly_agent/app/proxy/replay/rewrite_params_service.py,sha256=jEHlT6_OHq_VBa09Hd6QaRyErv7tZnziDvW7m3Q8CQg,2234
355
355
  stoobly_agent/app/proxy/replay/trace_context.py,sha256=lKpnQWVCUTcMPE-SOi90za3U1yL0VeBlIgj_KP63VsE,10435
356
- stoobly_agent/app/proxy/run.py,sha256=SfzMsaY6Ugsg4XEkQeU25lTyiMC0GRDEiYR70GUUaN4,4145
356
+ stoobly_agent/app/proxy/run.py,sha256=RKq5vha8jQNlQaLGrijSg79AIDAmVoIGvCr9qZ0FDOo,4900
357
357
  stoobly_agent/app/proxy/settings.py,sha256=R0LkSa9HrkUXvCd-nur4syJePjbQZdlnAnOPpGnCx38,2172
358
358
  stoobly_agent/app/proxy/simulate_intercept_service.py,sha256=R-L2dh2dfYFebttWXU0NwyxFI_jP6Ud36oKPC-T8HiI,1942
359
359
  stoobly_agent/app/proxy/test/__init__.py,sha256=uW0Ab27oyH2odTeVRjcuUJF8A1FLbTT5sBMzhGZr1so,89
@@ -743,8 +743,8 @@ stoobly_agent/test/mock_data/scaffold/docker-compose-local-service.yml,sha256=1W
743
743
  stoobly_agent/test/mock_data/scaffold/index.html,sha256=qJwuYajKZ4ihWZrJQ3BNObV5kf1VGnnm_vqlPJzdqLE,258
744
744
  stoobly_agent/test/mock_data/uspto.yaml,sha256=6U5se7C3o-86J4m9xpOk9Npias399f5CbfWzR87WKwE,7835
745
745
  stoobly_agent/test/test_helper.py,sha256=m_oAI7tmRYCNZdKfNqISWhMv3e44tjeYViQ3nTUfnos,1007
746
- stoobly_agent-1.8.1.dist-info/LICENSE,sha256=o93sj12cdoEOsTCjPaPFsw3Xq0SXs3pPcY-9reE2sEw,548
747
- stoobly_agent-1.8.1.dist-info/METADATA,sha256=H5ERJq8XRbJ5SGJOsCaLlCu2sfEeQ92RF92cQfUg9js,3087
748
- stoobly_agent-1.8.1.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
749
- stoobly_agent-1.8.1.dist-info/entry_points.txt,sha256=aq5wix5oC8MDQtmyPGU0xaFrsjJg7WH28NmXh2sc3Z8,56
750
- stoobly_agent-1.8.1.dist-info/RECORD,,
746
+ stoobly_agent-1.8.3.dist-info/LICENSE,sha256=o93sj12cdoEOsTCjPaPFsw3Xq0SXs3pPcY-9reE2sEw,548
747
+ stoobly_agent-1.8.3.dist-info/METADATA,sha256=SanBD75sF3pN2uha2WNqODn0sk_nbx_0lPmFmfrIKNo,3087
748
+ stoobly_agent-1.8.3.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
749
+ stoobly_agent-1.8.3.dist-info/entry_points.txt,sha256=aq5wix5oC8MDQtmyPGU0xaFrsjJg7WH28NmXh2sc3Z8,56
750
+ stoobly_agent-1.8.3.dist-info/RECORD,,