praetorian-cli 2.2.7__py3-none-any.whl → 2.2.9__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.
@@ -64,19 +64,25 @@ class Chariot:
64
64
  import urllib3
65
65
  urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
66
66
 
67
- def _make_request(self, method: str, url: str, **kwargs) -> requests.Response:
67
+ def chariot_request(self, method: str, url: str, **kwargs) -> requests.Response:
68
68
  """
69
- Centralized method to make HTTP requests with proxy configuration.
70
- Automatically applies proxy settings and verify=False if proxy is defined.
69
+ Centralized method to make HTTP requests to the Chariot API with all global headers/parameters set.
70
+ """
71
+
72
+ self.add_beta_url_param(kwargs)
73
+
74
+ return self.request(method, url, self.keychain.headers(), **kwargs)
75
+
76
+ def request(self, method: str, url: str, headers: dict = None, **kwargs) -> requests.Response:
77
+ """
78
+ Centralized wrapper around requests.request, ensuring the HTTP proxy is respected.
71
79
  """
72
80
 
73
81
  if self.proxy:
74
82
  kwargs['proxies'] = {'http': self.proxy, 'https': self.proxy}
75
83
  kwargs['verify'] = False
76
-
77
- self.add_beta_url_param(kwargs)
78
84
 
79
- return requests.request(method, url, headers=self.keychain.headers(), **kwargs)
85
+ return requests.request(method, url, headers=headers, **kwargs)
80
86
 
81
87
  def add_beta_url_param(self, kwargs: dict):
82
88
  if 'params' in kwargs:
@@ -94,7 +100,7 @@ class Chariot:
94
100
 
95
101
  # The search is on data in DynamoDB, which uses DynamoDB's native offset format.
96
102
  for _ in range(pages):
97
- resp = self._make_request('GET', self.url('/my'), params=params)
103
+ resp = self.chariot_request('GET', self.url('/my'), params=params)
98
104
  process_failure(resp)
99
105
  resp = resp.json()
100
106
  extend(final_resp, resp)
@@ -121,7 +127,7 @@ class Chariot:
121
127
  final_resp = dict()
122
128
 
123
129
  while pages > 0:
124
- resp = self._make_request('POST', self.url('/my'), json=raw_query, params=params)
130
+ resp = self.chariot_request('POST', self.url('/my'), json=raw_query, params=params)
125
131
  if is_query_limit_failure(resp):
126
132
  # In this block, the data size is too large for the number of records requested in raw_query['limit'].
127
133
  # We need to halve the page size: LIMIT = LIMIT / 2
@@ -148,22 +154,22 @@ class Chariot:
148
154
  return final_resp
149
155
 
150
156
  def post(self, type: str, body: dict, params: dict = {}) -> dict:
151
- resp = self._make_request('POST', self.url(f'/{type}'), json=body, params=params)
157
+ resp = self.chariot_request('POST', self.url(f'/{type}'), json=body, params=params)
152
158
  process_failure(resp)
153
159
  return resp.json()
154
160
 
155
161
  def put(self, type: str, body: dict, params: dict = {}) -> dict:
156
- resp = self._make_request('PUT', self.url(f'/{type}'), json=body, params=params)
162
+ resp = self.chariot_request('PUT', self.url(f'/{type}'), json=body, params=params)
157
163
  process_failure(resp)
158
164
  return resp.json()
159
165
 
160
166
  def get(self, type: str, params: dict = {}) -> dict:
161
- resp = self._make_request('GET', self.url(f'/{type}'), params=params)
167
+ resp = self.chariot_request('GET', self.url(f'/{type}'), params=params)
162
168
  process_failure(resp)
163
169
  return resp.json()
164
170
 
165
171
  def delete(self, type: str, body: dict, params: dict) -> dict:
166
- resp = self._make_request('DELETE', self.url(f'/{type}'), json=body, params=params)
172
+ resp = self.chariot_request('DELETE', self.url(f'/{type}'), json=body, params=params)
167
173
  process_failure(resp)
168
174
  return resp.json()
169
175
 
@@ -183,12 +189,12 @@ class Chariot:
183
189
  return self.put(type, body, params)
184
190
 
185
191
  def link_account(self, username: str, value: str = '', config: dict = {}) -> dict:
186
- resp = self._make_request('POST', self.url(f'/account/{username}'), json=dict(config=config, value=value))
192
+ resp = self.chariot_request('POST', self.url(f'/account/{username}'), json=dict(config=config, value=value))
187
193
  process_failure(resp)
188
194
  return resp.json()
189
195
 
190
196
  def unlink(self, username: str, value: str = '', config: dict = {}) -> dict:
191
- resp = self._make_request('DELETE', self.url(f'/account/{username}'), json=dict(value=value, config=config))
197
+ resp = self.chariot_request('DELETE', self.url(f'/account/{username}'), json=dict(value=value, config=config))
192
198
  process_failure(resp)
193
199
  return resp.json()
194
200
 
@@ -202,7 +208,7 @@ class Chariot:
202
208
  def _upload(self, chariot_filepath: str, content: str) -> dict:
203
209
  # It is a two-step upload. The PUT request to the /file endpoint is to get a presigned URL for S3.
204
210
  # There is no data transfer.
205
- presigned_url = self._make_request('PUT', self.url('/file'), params=dict(name=chariot_filepath))
211
+ presigned_url = self.chariot_request('PUT', self.url('/file'), params=dict(name=chariot_filepath))
206
212
  process_failure(presigned_url)
207
213
  resp = requests.put(presigned_url.json()['url'], data=content)
208
214
  process_failure(resp)
@@ -213,12 +219,21 @@ class Chariot:
213
219
  if global_:
214
220
  params |= GLOBAL_FLAG
215
221
 
216
- resp = self._make_request('GET', self.url('/file'), params=params, allow_redirects=True)
222
+ resp = self.chariot_request('GET', self.url('/file'), params=params)
223
+ process_failure(resp)
224
+
225
+ data = resp.json()
226
+ url = data.get("url", None)
227
+ if not url:
228
+ message = f'Download request failed: response missing URL' + (f'\nBody: {resp.text}' if resp.text else '(empty)')
229
+ raise Exception(message)
230
+
231
+ resp = self.request('GET', url)
217
232
  process_failure(resp)
218
233
  return resp.content
219
234
 
220
235
  def count(self, params: dict) -> dict:
221
- resp = self._make_request('GET', self.url('/my/count'), params=params)
236
+ resp = self.chariot_request('GET', self.url('/my/count'), params=params)
222
237
  process_failure(resp)
223
238
  return resp.json()
224
239
 
@@ -227,11 +242,11 @@ class Chariot:
227
242
  return json.loads(self.download(f'enrichments/{type}/{filename}', True).decode('utf-8'))
228
243
 
229
244
  def purge(self):
230
- self._make_request('DELETE', self.url('/account/purge'))
245
+ self.chariot_request('DELETE', self.url('/account/purge'))
231
246
 
232
247
  def agent(self, agent: str, body: dict) -> dict:
233
248
  body = body | dict(agent=agent)
234
- resp = self._make_request('PUT', self.url('/agent'), json=body)
249
+ resp = self.chariot_request('PUT', self.url('/agent'), json=body)
235
250
  process_failure(resp)
236
251
  return resp.json()
237
252
 
@@ -40,6 +40,7 @@ class Credentials:
40
40
  :rtype: dict or str
41
41
  """
42
42
  request = {
43
+ 'Operation': 'get',
43
44
  'CredentialID': credential_id,
44
45
  'Category': category,
45
46
  'Type': type,
@@ -102,7 +102,17 @@ class Risks:
102
102
  if contains_filter:
103
103
  contains_filter_filter = Filter(field=Filter.Field.KEY, operator=Filter.Operator.CONTAINS, value=contains_filter)
104
104
  filters.append(contains_filter_filter)
105
- query = Query(Node([Node.Label.RISK], filters=filters), page=int(offset))
105
+
106
+ query = Query(
107
+ Node(
108
+ labels=[Node.Label.RISK],
109
+ filters=filters
110
+ )
111
+ )
112
+
113
+ if offset:
114
+ query.page = int(offset)
115
+
106
116
  return self.api.search.by_query(query, pages)
107
117
 
108
118
  def attributes(self, key):
@@ -65,13 +65,16 @@ class Keychain:
65
65
  error(f'Could not find the "{self.profile}" profile in {self.filepath}. Run "praetorian configure" to fix.')
66
66
 
67
67
  profile = self.config[self.profile]
68
- if 'api' not in profile or 'client_id' not in profile:
69
- error(f'Keychain profile "{self.profile}" is corrupted or incomplete. Run "praetorian configure" to fix.')
70
-
68
+
71
69
  self.load_env('username', 'PRAETORIAN_CLI_USERNAME', required=False)
72
70
  self.load_env('password', 'PRAETORIAN_CLI_PASSWORD', required=False)
73
71
  self.load_env(API_KEY_ID, 'PRAETORIAN_CLI_API_KEY_ID', required=False)
74
72
  self.load_env(API_KEY_SECRET, 'PRAETORIAN_CLI_API_KEY_SECRET', required=False)
73
+ self.load_env('api', 'PRAETORIAN_CLI_API', required=False)
74
+ self.load_env('client_id', 'PRAETORIAN_CLI_CLIENT_ID', required=False)
75
+
76
+ if 'api' not in profile or 'client_id' not in profile:
77
+ error(f'Keychain profile "{self.profile}" is corrupted or incomplete. Run "praetorian configure" to fix.')
75
78
 
76
79
  if self.account is None:
77
80
  self.account = self.config.get(self.profile, 'account', fallback=None)
@@ -212,7 +212,7 @@ def my_params_to_query(params: dict):
212
212
 
213
213
  field = Filter.Field(key.split(':')[0])
214
214
  value = key.split(':', 1)[1]
215
- operator = Filter.Operator.CONTAINS
215
+ operator = Filter.Operator.STARTS_WITH
216
216
 
217
217
  filter = Filter(field, operator, value)
218
218
 
@@ -23,7 +23,7 @@ class TestConversation:
23
23
  "mode": "query"
24
24
  }
25
25
 
26
- response = self.sdk._make_request("POST", url, json=payload)
26
+ response = self.sdk.chariot_request("POST", url, json=payload)
27
27
 
28
28
  # Should get successful response
29
29
  assert response.status_code == 200
@@ -45,7 +45,7 @@ class TestConversation:
45
45
  "mode": "query"
46
46
  }
47
47
 
48
- response = self.sdk._make_request("POST", url, json=initial_payload)
48
+ response = self.sdk.chariot_request("POST", url, json=initial_payload)
49
49
  assert response.status_code == 200
50
50
 
51
51
  result = response.json()
@@ -58,7 +58,7 @@ class TestConversation:
58
58
  "conversationId": conversation_id
59
59
  }
60
60
 
61
- response = self.sdk._make_request("POST", url, json=follow_up_payload)
61
+ response = self.sdk.chariot_request("POST", url, json=follow_up_payload)
62
62
 
63
63
  # Should get successful response
64
64
  assert response.status_code == 200
@@ -72,7 +72,7 @@ class TestConversation:
72
72
  "mode": "query"
73
73
  }
74
74
 
75
- response = self.sdk._make_request("POST", url, json=payload)
75
+ response = self.sdk.chariot_request("POST", url, json=payload)
76
76
  assert response.status_code == 200
77
77
 
78
78
  result = response.json()
@@ -100,7 +100,7 @@ class TestConversation:
100
100
  "mode": "query"
101
101
  }
102
102
 
103
- response = self.sdk._make_request("POST", url, json=payload)
103
+ response = self.sdk.chariot_request("POST", url, json=payload)
104
104
  assert response.status_code == 200
105
105
 
106
106
  # Wait a moment for conversation to be stored
@@ -123,7 +123,7 @@ class TestConversation:
123
123
  # Missing required "message" field
124
124
  }
125
125
 
126
- response = self.sdk._make_request("POST", url, json=malformed_payload)
126
+ response = self.sdk.chariot_request("POST", url, json=malformed_payload)
127
127
 
128
128
  # Should get a 4xx error for bad request
129
129
  assert response.status_code >= 400
@@ -138,7 +138,7 @@ class TestConversation:
138
138
  "mode": "query"
139
139
  }
140
140
 
141
- response = self.sdk._make_request("POST", url, json=query_payload)
141
+ response = self.sdk.chariot_request("POST", url, json=query_payload)
142
142
  assert response.status_code == 200
143
143
 
144
144
  result = response.json()
@@ -150,7 +150,7 @@ class TestConversation:
150
150
  "mode": "agent"
151
151
  }
152
152
 
153
- response = self.sdk._make_request("POST", url, json=agent_payload)
153
+ response = self.sdk.chariot_request("POST", url, json=agent_payload)
154
154
  assert response.status_code == 200
155
155
 
156
156
  result = response.json()
@@ -165,7 +165,7 @@ class TestConversation:
165
165
  "mode": "query"
166
166
  }
167
167
 
168
- response = self.sdk._make_request("POST", url, json=payload)
168
+ response = self.sdk.chariot_request("POST", url, json=payload)
169
169
  assert response.status_code == 200
170
170
 
171
171
  result = response.json()
@@ -296,7 +296,7 @@ class TestZCli:
296
296
  o = make_test_values(lambda: None)
297
297
  self.verify(f'add asset --dns "{o.webapp_name}" --name "{o.webapp_url}" --type webapplication')
298
298
  self.verify(f'get asset "{o.webapp_key}"', expected_stdout=[o.webapp_key, o.webapp_url, o.webapp_name, '"status"', '"A"'])
299
- self.verify(f'list assets -f "{o.webapp_name}"', expected_stdout=[o.webapp_key])
299
+ self.verify(f'list assets -f "{o.webapp_key}"', expected_stdout=[o.webapp_key])
300
300
  self.verify(f'delete asset "{o.webapp_key}"', ignore_stdout=True)
301
301
 
302
302
  def test_webpage_cli(self):
@@ -347,7 +347,7 @@ class ConversationApp(App):
347
347
  if self.conversation_id:
348
348
  payload["conversationId"] = self.conversation_id
349
349
 
350
- response = self.sdk._make_request("POST", url, json=payload)
350
+ response = self.sdk.chariot_request("POST", url, json=payload)
351
351
 
352
352
  if response.status_code == 200:
353
353
  result = response.json()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: praetorian-cli
3
- Version: 2.2.7
3
+ Version: 2.2.9
4
4
  Summary: For interacting with the Chariot API
5
5
  Home-page: https://github.com/praetorian-inc/praetorian-cli
6
6
  Author: Praetorian
@@ -25,8 +25,8 @@ praetorian_cli/scripts/utils.py,sha256=lGCf4trEpsfECa9U42pDJ-f48EimlS-hG6AjnKjNt
25
25
  praetorian_cli/scripts/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
26
  praetorian_cli/scripts/commands/nmap-example.py,sha256=varKTkHKG4DAs9Ssf0c6SygP9GfuCG01aFxhfvixLM0,2727
27
27
  praetorian_cli/sdk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
- praetorian_cli/sdk/chariot.py,sha256=Vs-_J6teHKgz0IEPcF4CQDLRvj5vKQB9spLvyQAoMZY,13364
29
- praetorian_cli/sdk/keychain.py,sha256=yWm4ohMHXD1I_hEDuuBh-F9EO-tssRLMb2xreDa65k4,7305
28
+ praetorian_cli/sdk/chariot.py,sha256=owN3nRg5Oh-p88PGOQ7DpHflkcMxBsE1xS1aAU_lOvA,13926
29
+ praetorian_cli/sdk/keychain.py,sha256=KCz2mOTv09jgg6mrZQooRg1VrnvF9W0_BjRlEQhbzqU,7468
30
30
  praetorian_cli/sdk/mcp_server.py,sha256=8UoTotD4UVl-tp1gqMjkOVpO__KeGCvy7mIpKXVc8Rg,8750
31
31
  praetorian_cli/sdk/entities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
32
  praetorian_cli/sdk/entities/accounts.py,sha256=DxVqUXMZu4m87Ryl2m0h4RkcJEqhGZmIGFsaFmJ97_A,4621
@@ -36,14 +36,14 @@ praetorian_cli/sdk/entities/assets.py,sha256=z8ErleQQ-BdnYkwPWOp2EQ8eJI4YB8qi45X
36
36
  praetorian_cli/sdk/entities/attributes.py,sha256=AyWsYyjUFNbHTCN7j-OYA7YD1Y0z_LmnlcME5y74je8,3573
37
37
  praetorian_cli/sdk/entities/capabilities.py,sha256=WeNlPrhVgLQPbpqYvS4nHmIX697ITpoZkJeLYxG5bmY,2808
38
38
  praetorian_cli/sdk/entities/configurations.py,sha256=y32_QYSS6MgGDyz0tEuJgG6jWCI4Vyzwyf0m4SVtVNw,4249
39
- praetorian_cli/sdk/entities/credentials.py,sha256=BfNBe_0P6-qtwJFicyrAeTWmWttDtaEnTo8nr3pqYoo,5108
39
+ praetorian_cli/sdk/entities/credentials.py,sha256=ndOqUJwk4FxO8vu85k9v34QmyoGTQeebhcJQd0NEcNU,5140
40
40
  praetorian_cli/sdk/entities/definitions.py,sha256=rpuNLM3DZxMr5YINYDD6ePWG1TEI1biZ4IqnjpDAEh0,3125
41
41
  praetorian_cli/sdk/entities/files.py,sha256=Gw9Yt_Cm2xR-Vu8vjaekMHbGldhe930WJjjeaJrBLxg,5822
42
42
  praetorian_cli/sdk/entities/integrations.py,sha256=NVaW_dWbnMkMIs-EYr2W7QAeamPVwLhmM2ppdMJmsK0,3176
43
43
  praetorian_cli/sdk/entities/jobs.py,sha256=JBkNgFzQEtV0XJSuKtAzCHOYa9rcVxgTkp-tAuS6CP0,8181
44
44
  praetorian_cli/sdk/entities/keys.py,sha256=PgoGa3xyLMzWrIIQ8zgi7bfZiUFFumPtMDo64GjhdjE,6089
45
45
  praetorian_cli/sdk/entities/preseeds.py,sha256=SeSY4K6diJMQzsjCBxYK3N9Lz0fUz3B_LMBOAAcBSLg,8890
46
- praetorian_cli/sdk/entities/risks.py,sha256=-qxJZh_V5GWwNNm1nvVFUoL3ig2d5n7AckouktfHLFI,6201
46
+ praetorian_cli/sdk/entities/risks.py,sha256=THNcPoCAGIqNhnH_AZvrQN7tdiOtF6n5V1tgeSomBpw,6317
47
47
  praetorian_cli/sdk/entities/scanners.py,sha256=QCr5QlBy4jfBh8HRvZt9CoZTgNqLNnKNrI4sdfJf0jE,423
48
48
  praetorian_cli/sdk/entities/schema.py,sha256=CPVws1CdRHyOAI7oT9A20WGOCZozTFqZnfo5ox3v0HQ,807
49
49
  praetorian_cli/sdk/entities/search.py,sha256=9vTy9HZY2BTlqf5Zwpdl8HCRIfSEvWDRij2_-rAp2Ng,16938
@@ -55,7 +55,7 @@ praetorian_cli/sdk/entities/webpage.py,sha256=FBS3HzuUJnQR9Blm_cBCd9efYAdc2wA2tU
55
55
  praetorian_cli/sdk/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
56
  praetorian_cli/sdk/model/aegis.py,sha256=KNeynkCJtaR5bIhv3-VNirjxq4i-6JhCZGTb5rmxkQ4,5344
57
57
  praetorian_cli/sdk/model/globals.py,sha256=8nQjs4KD3BR0CWAyE4YAgSCwse4Mtj4wADIGx1avf8M,2990
58
- praetorian_cli/sdk/model/query.py,sha256=lqYC_RJRBCSQRPmElmBH6VXcXS8Z8AriLpG7DYUkFhI,6523
58
+ praetorian_cli/sdk/model/query.py,sha256=MUzFaJ7FGvKgxm6_P-fLfCG9L3-qKPoOB5mJ59WwKNc,6526
59
59
  praetorian_cli/sdk/model/utils.py,sha256=G8cU7K2uG0-J0GanjcCrzDuUtKzDOucFWF6hGtfOsTM,781
60
60
  praetorian_cli/sdk/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
61
  praetorian_cli/sdk/test/pytest.ini,sha256=uM552lJOoxWRplXtonIeo2v7M2kHZmJKis7OgnvoLxg,213
@@ -65,7 +65,7 @@ praetorian_cli/sdk/test/test_asset.py,sha256=jcnSJxgnLhRgJ_cjkrlLQTlAYg3wruMsEIn
65
65
  praetorian_cli/sdk/test/test_attribute.py,sha256=AwD_w488rKhc1mxTBwSJcItmhcIYHJHX5DjgQYE3uPo,1169
66
66
  praetorian_cli/sdk/test/test_capabilities.py,sha256=HoAu_WFjqVkwciPgrLp5z0-UbkuqKdqD46jb_8o1PbM,407
67
67
  praetorian_cli/sdk/test/test_configuration.py,sha256=ysyWpt7iq_tNkdvLU8gULCuwbXVqt2HMXgZpWLnWccg,2174
68
- praetorian_cli/sdk/test/test_conversation.py,sha256=QsLQAdYMcg3xIET8RBgD81D4CqqS0D9cp7-sEuqApR0,6933
68
+ praetorian_cli/sdk/test/test_conversation.py,sha256=i1cBaRmFmtLcFLr85OtgE60DynUgWB7EqqjGU-NBWvc,6951
69
69
  praetorian_cli/sdk/test/test_definition.py,sha256=8ShZFXJYHJUPH5rfmF3LYk9NE8W4lJBNHE2DhyJgXaY,1016
70
70
  praetorian_cli/sdk/test/test_extend.py,sha256=bHTCwtW0jN1GvFocB_uMJcEj4_IXvCkr35yMWKESbTU,1778
71
71
  praetorian_cli/sdk/test/test_file.py,sha256=rRikM2ceMy5TEX7YOFMPB2dnCRqROE9w8qoqVeCs9HM,2133
@@ -79,7 +79,7 @@ praetorian_cli/sdk/test/test_seed.py,sha256=WfnEPZwMXHFtt4jyVT-1JitIW1zTrl7rwlX8
79
79
  praetorian_cli/sdk/test/test_setting.py,sha256=hdPQj71rjSYxa-PODG2D-kJd8C9gkAg1jQXnqYU4P6A,1326
80
80
  praetorian_cli/sdk/test/test_webhook.py,sha256=FQJY76QQ6Yg2iLCGpxgKiXGI8TtmB4zTpMIM2SpYKCc,2228
81
81
  praetorian_cli/sdk/test/test_webpage.py,sha256=jgKrsobD3ONibDIbbOT-yy7V_NmC5-LwEZmEYdYu0LI,1779
82
- praetorian_cli/sdk/test/test_z_cli.py,sha256=z2gcA9w7Qw6assGMLOrFG3jKmbGWSueSQL0g5zYMvQE,20670
82
+ praetorian_cli/sdk/test/test_z_cli.py,sha256=LKYYAcxTA06AXgVTF9pM_BXgMHVSC5srXd-qdUSuiMU,20669
83
83
  praetorian_cli/sdk/test/ui_mocks.py,sha256=kiqAPxaM-_T0NQ-HgOZupNiUoJa5mE2CsyK2cXWiPws,4146
84
84
  praetorian_cli/sdk/test/utils.py,sha256=svxMpzlaW4FRCij05cPgJFrTUEELVdt8G7SPKEdsgPo,3526
85
85
  praetorian_cli/ui/__init__.py,sha256=wEgkrgIaoOguH1VVp2FndaGIxWmZ5CfAynXtNtZ6iTo,81
@@ -95,10 +95,10 @@ praetorian_cli/ui/aegis/commands/list.py,sha256=puIiy0skYE59Q2hVSMsla1tKiYYAFTOa
95
95
  praetorian_cli/ui/aegis/commands/set.py,sha256=ODa9u_6yW2dbKVQBuV9YeiS_ty_R_Xk_vPz7YrW3OWs,1101
96
96
  praetorian_cli/ui/aegis/commands/ssh.py,sha256=KGsNlN0i-Cwp6gWyr-cjML9_L13oE7xFenysF2pC8Rc,3045
97
97
  praetorian_cli/ui/conversation/__init__.py,sha256=sNhNN_ZG1Va_7OLTaoXlIFL6ageKHWdufFVYw6F_aV8,90
98
- praetorian_cli/ui/conversation/textual_chat.py,sha256=bvTaBm_ZCPI4Z1HDn3e-GfH2z4JVLcuFh3SX0BHtcGE,24403
99
- praetorian_cli-2.2.7.dist-info/licenses/LICENSE,sha256=Zv97QripiVALv-WokW_Elsiz9vtOfbtNt1aLZhhk67I,1067
100
- praetorian_cli-2.2.7.dist-info/METADATA,sha256=nff-v7luWdwv9I7mkRi3Wy-QU7RKtB9fA_32O7iTqus,7751
101
- praetorian_cli-2.2.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
102
- praetorian_cli-2.2.7.dist-info/entry_points.txt,sha256=uJbDvZdkYaLiCh2DMvXPUGKFm2p5ZfzJCizUK3-PUEE,56
103
- praetorian_cli-2.2.7.dist-info/top_level.txt,sha256=QbUdRPGEj_TyHO-E7AD5BxFfR8ore37i273jP4Gn43c,15
104
- praetorian_cli-2.2.7.dist-info/RECORD,,
98
+ praetorian_cli/ui/conversation/textual_chat.py,sha256=gGgEs7HhNAto9rTVrGbz62mG10OqmtArI-aKxFLSfVs,24405
99
+ praetorian_cli-2.2.9.dist-info/licenses/LICENSE,sha256=Zv97QripiVALv-WokW_Elsiz9vtOfbtNt1aLZhhk67I,1067
100
+ praetorian_cli-2.2.9.dist-info/METADATA,sha256=qwh25lpiVbvDWDT1Re6QAmGawyRNxaL9fVPO0QoYs7o,7751
101
+ praetorian_cli-2.2.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
102
+ praetorian_cli-2.2.9.dist-info/entry_points.txt,sha256=uJbDvZdkYaLiCh2DMvXPUGKFm2p5ZfzJCizUK3-PUEE,56
103
+ praetorian_cli-2.2.9.dist-info/top_level.txt,sha256=QbUdRPGEj_TyHO-E7AD5BxFfR8ore37i273jP4Gn43c,15
104
+ praetorian_cli-2.2.9.dist-info/RECORD,,