praetorian-cli 2.2.10__tar.gz → 2.2.12__tar.gz

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.
Files changed (110) hide show
  1. {praetorian_cli-2.2.10/praetorian_cli.egg-info → praetorian_cli-2.2.12}/PKG-INFO +1 -1
  2. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/entities/risks.py +13 -6
  3. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/entities/webpage.py +1 -1
  4. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/model/globals.py +1 -0
  5. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/model/query.py +6 -0
  6. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/test_z_cli.py +1 -1
  7. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/ui/aegis/commands/set.py +3 -2
  8. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/ui/aegis/menu.py +5 -2
  9. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/ui/aegis/utils.py +12 -11
  10. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12/praetorian_cli.egg-info}/PKG-INFO +1 -1
  11. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/setup.cfg +1 -1
  12. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/LICENSE +0 -0
  13. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/MANIFEST.in +0 -0
  14. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/README.md +0 -0
  15. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/__init__.py +0 -0
  16. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/handlers/__init__.py +0 -0
  17. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/handlers/add.py +0 -0
  18. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/handlers/aegis.py +0 -0
  19. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/handlers/agent.py +0 -0
  20. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/handlers/chariot.py +0 -0
  21. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/handlers/cli_decorators.py +0 -0
  22. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/handlers/configure.py +0 -0
  23. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/handlers/delete.py +0 -0
  24. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/handlers/enrich.py +0 -0
  25. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/handlers/get.py +0 -0
  26. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/handlers/imports.py +0 -0
  27. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/handlers/link.py +0 -0
  28. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/handlers/list.py +0 -0
  29. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/handlers/script.py +0 -0
  30. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/handlers/search.py +0 -0
  31. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/handlers/ssh_utils.py +0 -0
  32. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/handlers/test.py +0 -0
  33. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/handlers/unlink.py +0 -0
  34. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/handlers/update.py +0 -0
  35. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/handlers/utils.py +0 -0
  36. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/main.py +0 -0
  37. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/scripts/__init__.py +0 -0
  38. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/scripts/commands/__init__.py +0 -0
  39. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/scripts/commands/nmap-example.py +0 -0
  40. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/scripts/utils.py +0 -0
  41. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/__init__.py +0 -0
  42. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/chariot.py +0 -0
  43. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/entities/__init__.py +0 -0
  44. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/entities/accounts.py +0 -0
  45. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/entities/aegis.py +0 -0
  46. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/entities/agents.py +0 -0
  47. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/entities/assets.py +0 -0
  48. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/entities/attributes.py +0 -0
  49. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/entities/capabilities.py +0 -0
  50. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/entities/configurations.py +0 -0
  51. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/entities/credentials.py +0 -0
  52. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/entities/definitions.py +0 -0
  53. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/entities/files.py +0 -0
  54. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/entities/integrations.py +0 -0
  55. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/entities/jobs.py +0 -0
  56. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/entities/keys.py +0 -0
  57. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/entities/preseeds.py +0 -0
  58. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/entities/scanners.py +0 -0
  59. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/entities/schema.py +0 -0
  60. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/entities/search.py +0 -0
  61. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/entities/seeds.py +0 -0
  62. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/entities/settings.py +0 -0
  63. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/entities/statistics.py +0 -0
  64. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/entities/webhook.py +0 -0
  65. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/keychain.py +0 -0
  66. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/mcp_server.py +0 -0
  67. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/model/__init__.py +0 -0
  68. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/model/aegis.py +0 -0
  69. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/model/utils.py +0 -0
  70. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/__init__.py +0 -0
  71. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/pytest.ini +0 -0
  72. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/test_account.py +0 -0
  73. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/test_agent.py +0 -0
  74. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/test_asset.py +0 -0
  75. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/test_attribute.py +0 -0
  76. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/test_capabilities.py +0 -0
  77. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/test_configuration.py +0 -0
  78. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/test_conversation.py +0 -0
  79. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/test_definition.py +0 -0
  80. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/test_extend.py +0 -0
  81. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/test_file.py +0 -0
  82. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/test_job.py +0 -0
  83. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/test_key.py +0 -0
  84. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/test_mcp.py +0 -0
  85. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/test_preseed.py +0 -0
  86. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/test_risk.py +0 -0
  87. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/test_search.py +0 -0
  88. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/test_seed.py +0 -0
  89. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/test_setting.py +0 -0
  90. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/test_webhook.py +0 -0
  91. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/test_webpage.py +0 -0
  92. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/ui_mocks.py +0 -0
  93. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/sdk/test/utils.py +0 -0
  94. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/ui/__init__.py +0 -0
  95. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/ui/aegis/__init__.py +0 -0
  96. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/ui/aegis/commands/__init__.py +0 -0
  97. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/ui/aegis/commands/help.py +0 -0
  98. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/ui/aegis/commands/info.py +0 -0
  99. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/ui/aegis/commands/job.py +0 -0
  100. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/ui/aegis/commands/list.py +0 -0
  101. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/ui/aegis/commands/ssh.py +0 -0
  102. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/ui/aegis/constants.py +0 -0
  103. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/ui/conversation/__init__.py +0 -0
  104. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli/ui/conversation/textual_chat.py +0 -0
  105. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli.egg-info/SOURCES.txt +0 -0
  106. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli.egg-info/dependency_links.txt +0 -0
  107. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli.egg-info/entry_points.txt +0 -0
  108. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli.egg-info/requires.txt +0 -0
  109. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/praetorian_cli.egg-info/top_level.txt +0 -0
  110. {praetorian_cli-2.2.10 → praetorian_cli-2.2.12}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: praetorian-cli
3
- Version: 2.2.10
3
+ Version: 2.2.12
4
4
  Summary: For interacting with the Chariot API
5
5
  Home-page: https://github.com/praetorian-inc/praetorian-cli
6
6
  Author: Praetorian
@@ -1,5 +1,5 @@
1
1
  from praetorian_cli.sdk.model.globals import Kind
2
- from praetorian_cli.sdk.model.query import Relationship, Node, Query, risk_of_key, ASSET_NODE, ATTRIBUTE_NODE, Filter
2
+ from praetorian_cli.sdk.model.query import Relationship, Node, Query, risk_of_key, ASSET_NODE, PORT_NODE, Filter, WEBPAGE_NODE
3
3
 
4
4
 
5
5
  class Risks:
@@ -132,7 +132,7 @@ class Risks:
132
132
  Get all assets affected by a risk.
133
133
 
134
134
  This method finds assets that are directly linked to the risk via HAS_VULNERABILITY
135
- relationships, as well as assets indirectly linked via attributes that have the risk.
135
+ relationships, as well as assets indirectly linked via ports that have the risk.
136
136
 
137
137
  :param key: The key of the risk to get affected assets for
138
138
  :type key: str
@@ -144,11 +144,18 @@ class Risks:
144
144
  query = Query(Node(ASSET_NODE, relationships=[to_this]))
145
145
  assets, _ = self.api.search.by_query(query)
146
146
 
147
- # assets indirectly linked to the risk via an attribute
148
- attributes = Node(ATTRIBUTE_NODE, relationships=[to_this])
149
- to_attributes = Relationship(Relationship.Label.HAS_ATTRIBUTE, target=attributes)
150
- query = Query(Node(ASSET_NODE, relationships=[to_attributes]))
147
+ # assets indirectly linked to the risk via a port
148
+ ports = Node(PORT_NODE, relationships=[to_this])
149
+ to_ports = Relationship(Relationship.Label.HAS_PORT, target=ports)
150
+ query = Query(Node(ASSET_NODE, relationships=[to_ports]))
151
151
  indirect_assets, _ = self.api.search.by_query(query)
152
152
 
153
+ # webpages linked to the risk
154
+ webpages = Node(WEBPAGE_NODE, relationships=[to_this])
155
+ to_webpages = Relationship(Relationship.Label.HAS_WEBPAGE, target=webpages)
156
+ query = Query(Node(ASSET_NODE, relationships=[to_webpages]))
157
+ web_assets, _ = self.api.search.by_query(query)
158
+
153
159
  assets.extend(indirect_assets)
160
+ assets.extend(web_assets)
154
161
  return assets
@@ -126,7 +126,7 @@ class Webpage:
126
126
  urlFilter = Filter(field=Filter.Field.KEY, operator=Filter.Operator.CONTAINS, value=filter)
127
127
  filters.append(urlFilter)
128
128
  node = Node(labels=[Node.Label.WEBPAGE], filters=filters, relationships=relationships)
129
- query = Query(node=node, page=offset, limit=pages)
129
+ query = Query(node=node, page=offset)
130
130
  return self.api.search.by_query(query, pages)
131
131
 
132
132
  def delete(self, key):
@@ -110,6 +110,7 @@ class Kind(Enum):
110
110
  OTHERS = 'others'
111
111
  WEBAPPLICATION = 'webapplication'
112
112
  WEBPAGE = 'webpage'
113
+ PORT = 'port'
113
114
 
114
115
  EXACT_FLAG = {'exact': 'true'}
115
116
  DESCENDING_FLAG = {'desc': 'true'}
@@ -68,6 +68,7 @@ class Relationship:
68
68
  DISCOVERED = 'DISCOVERED'
69
69
  HAS_ATTRIBUTE = 'HAS_ATTRIBUTE'
70
70
  HAS_WEBPAGE = 'HAS_WEBPAGE'
71
+ HAS_PORT = 'HAS_PORT'
71
72
 
72
73
  def __init__(self, label: Label, source: 'Node' = None, target: 'Node' = None, optional: bool = False, length: int = 0):
73
74
  self.label = label
@@ -97,6 +98,7 @@ class Node:
97
98
  ADDOMAIN = 'ADDomain'
98
99
  ATTRIBUTE = 'Attribute'
99
100
  RISK = 'Risk'
101
+ PORT = 'Port'
100
102
  PRESEED = 'Preseed'
101
103
  SEED = 'Seed'
102
104
  TTL = 'TTL'
@@ -152,11 +154,15 @@ class Query:
152
154
  ASSET_NODE = [Node.Label.ASSET]
153
155
  RISK_NODE = [Node.Label.RISK]
154
156
  ATTRIBUTE_NODE = [Node.Label.ATTRIBUTE]
157
+ PORT_NODE = [Node.Label.PORT]
158
+ WEBAPPLICATION_NODE = [Node.Label.WEBAPPLICATION]
159
+ WEBPAGE_NODE = [Node.Label.WEBPAGE]
155
160
 
156
161
  KIND_TO_LABEL = {
157
162
  Kind.ASSET.value: Node.Label.ASSET,
158
163
  Kind.RISK.value: Node.Label.RISK,
159
164
  Kind.ATTRIBUTE.value: Node.Label.ATTRIBUTE,
165
+ Kind.PORT.value: Node.Label.PORT,
160
166
  Kind.SEED.value: Node.Label.SEED,
161
167
  Kind.PRESEED.value: Node.Label.PRESEED,
162
168
  Kind.REPOSITORY.value: Node.Label.REPOSITORY,
@@ -102,7 +102,7 @@ class TestZCli:
102
102
  self.verify(f'update risk "{o.risk_key}" -s {Risk.OPEN_LOW.value}')
103
103
  self.verify(f'get risk "{o.risk_key}"', [o.risk_key, f'"status": "{Risk.OPEN_LOW.value}"'])
104
104
 
105
- self.verify(f'delete risk "{o.risk_key}"')
105
+ self.verify(f'delete risk "{o.risk_key}" -s {Risk.DELETED_OTHER_LOW.value}')
106
106
  self.verify(f'get risk "{o.risk_key}"', [
107
107
  o.risk_key, f'"status": "{Risk.DELETED_OTHER_LOW.value}"',
108
108
  f'"to": "{Risk.DELETED_OTHER_LOW.value}"'])
@@ -9,15 +9,16 @@ def handle_set(menu, args):
9
9
  return
10
10
 
11
11
  selection = args[0]
12
- selected_agent = parse_agent_identifier(selection, menu.agents)
12
+ selected_agent = parse_agent_identifier(selection, menu.displayed_agents, menu.agents)
13
13
 
14
14
  if selected_agent:
15
15
  menu.selected_agent = selected_agent
16
16
  hostname = selected_agent.hostname
17
17
  menu.console.print(f"\n Selected: {hostname}\n")
18
18
  else:
19
+ displayed_count = len(menu.displayed_agents)
19
20
  menu.console.print(f"\n[red] Agent not found:[/red] {selection}")
20
- menu.console.print(f"[dim] Use agent number (1-{len(menu.agents)}), client ID, or hostname[/dim]\n")
21
+ menu.console.print(f"[dim] Use agent number (1-{displayed_count}), client ID, or hostname[/dim]\n")
21
22
  menu.pause()
22
23
 
23
24
 
@@ -54,7 +54,8 @@ class AegisMenu:
54
54
  self.selected_agent: Optional[Agent] = None
55
55
  self._first_render = True
56
56
  self.agent_computed_data = {}
57
- self.current_prompt = "> "
57
+ self.current_prompt = "> "
58
+ self.displayed_agents: List[Agent] = [] # Track currently displayed agents
58
59
 
59
60
  self.user_email, self.username = self.sdk.get_current_user()
60
61
 
@@ -173,6 +174,8 @@ class AegisMenu:
173
174
  if show_offline:
174
175
  display_agents = display_agents + offline_agents
175
176
 
177
+ self.displayed_agents = [agent for _, agent in display_agents]
178
+
176
179
  self.console.print()
177
180
 
178
181
  if not display_agents:
@@ -392,4 +395,4 @@ class AegisMenu:
392
395
  def run_aegis_menu(sdk: Chariot) -> None:
393
396
  """Run the Aegis menu interface"""
394
397
  menu = AegisMenu(sdk)
395
- menu.run()
398
+ menu.run()
@@ -132,31 +132,32 @@ def get_agent_display_style(group: str, colors: dict) -> dict:
132
132
  }
133
133
 
134
134
 
135
- def parse_agent_identifier(identifier: str, agents: List[Agent]) -> Optional[Agent]:
136
- """Parse agent identifier and return matching agent"""
137
- if not agents:
135
+ def parse_agent_identifier(identifier: str, displayed_agents: List[Agent], all_agents: Optional[List[Agent]] = None) -> Optional[Agent]:
136
+ """Parse agent identifier and return matching agent
137
+ """
138
+ if not displayed_agents:
138
139
  return None
139
140
 
140
- # Try numeric index first
141
+ # Use all_agents for fallback searches, or displayed_agents if not provided
142
+ search_agents = all_agents if all_agents is not None else displayed_agents
143
+
141
144
  if identifier.isdigit():
142
145
  agent_num = int(identifier)
143
- if 1 <= agent_num <= len(agents):
144
- return agents[agent_num - 1]
146
+ if 1 <= agent_num <= len(displayed_agents):
147
+ return displayed_agents[agent_num - 1]
145
148
 
146
- # Try client ID match
147
- for agent in agents:
149
+ for agent in search_agents:
148
150
  try:
149
151
  if agent.client_id and agent.client_id.lower() == identifier.lower():
150
152
  return agent
151
153
  except AttributeError:
152
154
  continue
153
155
 
154
- # Try hostname match
155
- for agent in agents:
156
+ for agent in search_agents:
156
157
  try:
157
158
  if agent.hostname and agent.hostname.lower() == identifier.lower():
158
159
  return agent
159
160
  except AttributeError:
160
161
  continue
161
162
 
162
- return None
163
+ return None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: praetorian-cli
3
- Version: 2.2.10
3
+ Version: 2.2.12
4
4
  Summary: For interacting with the Chariot API
5
5
  Home-page: https://github.com/praetorian-inc/praetorian-cli
6
6
  Author: Praetorian
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = praetorian-cli
3
- version = 2.2.10
3
+ version = 2.2.12
4
4
  author = Praetorian
5
5
  author_email = support@praetorian.com
6
6
  description = For interacting with the Chariot API
File without changes