From 2db488595e95490a55d2f81d84aa259c9dfc2d29 Mon Sep 17 00:00:00 2001 From: Sebastien Miguel Date: Mon, 3 Aug 2026 09:39:22 +0200 Subject: [PATCH] feat(client): add action_output contract output type (#331) The platform's ContractOutputType enum already has ActionOutput ("action_output"), used to store raw injector output as a finding with isFindingCompatible=false so it can be used as a chaining/event filter without appearing in the Findings tab. Expose the same value here so injectors (e.g. netexec) can declare it. --- pyoaev/contracts/contract_config.py | 1 + test/contracts/test_contract_output_types.py | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/pyoaev/contracts/contract_config.py b/pyoaev/contracts/contract_config.py index 07b9d6d..cc39dc0 100644 --- a/pyoaev/contracts/contract_config.py +++ b/pyoaev/contracts/contract_config.py @@ -40,6 +40,7 @@ class ContractFieldKey(str, Enum): class ContractOutputType(str, Enum): Text: str = "text" + ActionOutput: str = "action_output" Number: str = "number" Port: str = "port" PortsScan: str = "portscan" diff --git a/test/contracts/test_contract_output_types.py b/test/contracts/test_contract_output_types.py index 42c99ca..ed151b9 100644 --- a/test/contracts/test_contract_output_types.py +++ b/test/contracts/test_contract_output_types.py @@ -10,6 +10,13 @@ def test_file_wire_label(self): self.assertEqual(ContractOutputType.File.value, "file") self.assertEqual(ContractOutputType.File, "file") + def test_action_output_wire_label(self): + # The wire label is a public contract shared with the platform enum + # (io.openaev.database.model.ContractOutputType.ActionOutput); it must stay + # exactly "action_output". + self.assertEqual(ContractOutputType.ActionOutput.value, "action_output") + self.assertEqual(ContractOutputType.ActionOutput, "action_output") + if __name__ == "__main__": unittest.main()