@autoweb/domain-models 1.0.0

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 (68) hide show
  1. package/README.md +100 -0
  2. package/index.d.ts +594 -0
  3. package/index.js +3 -0
  4. package/package.json +55 -0
  5. package/python-models/__init__.py +68 -0
  6. package/python-models/action-configs.py +1112 -0
  7. package/python-models/build/lib/floweb_models/__init__.py +194 -0
  8. package/python-models/build/lib/floweb_models/action_configs.py +783 -0
  9. package/python-models/build/lib/floweb_models/debug.py +209 -0
  10. package/python-models/build/lib/floweb_models/debug_models.py +141 -0
  11. package/python-models/build/lib/floweb_models/environment.py +158 -0
  12. package/python-models/build/lib/floweb_models/execution_results.py +208 -0
  13. package/python-models/build/lib/floweb_models/flow.py +345 -0
  14. package/python-models/build/lib/floweb_models/flow_validation.py +316 -0
  15. package/python-models/build/lib/floweb_models/parallel_execution.py +258 -0
  16. package/python-models/build/lib/floweb_models/performance_test.py +605 -0
  17. package/python-models/build/lib/floweb_models/websocket_communication.py +697 -0
  18. package/python-models/debug.py +209 -0
  19. package/python-models/dist/floweb_domain_models-1.0.0-py3-none-any.whl +0 -0
  20. package/python-models/environment.py +158 -0
  21. package/python-models/execution-results.py +208 -0
  22. package/python-models/flow-validation.py +316 -0
  23. package/python-models/flow.py +369 -0
  24. package/python-models/floweb_domain_models.egg-info/PKG-INFO +9 -0
  25. package/python-models/floweb_domain_models.egg-info/SOURCES.txt +16 -0
  26. package/python-models/floweb_domain_models.egg-info/dependency_links.txt +1 -0
  27. package/python-models/floweb_domain_models.egg-info/requires.txt +1 -0
  28. package/python-models/floweb_domain_models.egg-info/top_level.txt +1 -0
  29. package/python-models/floweb_models/__init__.py +194 -0
  30. package/python-models/floweb_models/__pycache__/__init__.cpython-312.pyc +0 -0
  31. package/python-models/floweb_models/__pycache__/action_configs.cpython-312.pyc +0 -0
  32. package/python-models/floweb_models/__pycache__/debug.cpython-312.pyc +0 -0
  33. package/python-models/floweb_models/__pycache__/debug_models.cpython-312.pyc +0 -0
  34. package/python-models/floweb_models/__pycache__/environment.cpython-312.pyc +0 -0
  35. package/python-models/floweb_models/__pycache__/execution_results.cpython-312.pyc +0 -0
  36. package/python-models/floweb_models/__pycache__/flow.cpython-312.pyc +0 -0
  37. package/python-models/floweb_models/__pycache__/flow_validation.cpython-312.pyc +0 -0
  38. package/python-models/floweb_models/__pycache__/parallel_execution.cpython-312.pyc +0 -0
  39. package/python-models/floweb_models/__pycache__/performance_test.cpython-312.pyc +0 -0
  40. package/python-models/floweb_models/__pycache__/websocket_communication.cpython-312.pyc +0 -0
  41. package/python-models/floweb_models/action_configs.py +1062 -0
  42. package/python-models/floweb_models/debug.py +209 -0
  43. package/python-models/floweb_models/debug_models.py +141 -0
  44. package/python-models/floweb_models/environment.py +158 -0
  45. package/python-models/floweb_models/execution_results.py +208 -0
  46. package/python-models/floweb_models/flow.py +345 -0
  47. package/python-models/floweb_models/flow_validation.py +316 -0
  48. package/python-models/floweb_models/parallel_execution.py +229 -0
  49. package/python-models/floweb_models/performance_test.py +605 -0
  50. package/python-models/floweb_models/websocket_communication.py +697 -0
  51. package/python-models/floweb_models.egg-info/PKG-INFO +9 -0
  52. package/python-models/floweb_models.egg-info/SOURCES.txt +16 -0
  53. package/python-models/floweb_models.egg-info/dependency_links.txt +1 -0
  54. package/python-models/floweb_models.egg-info/requires.txt +1 -0
  55. package/python-models/floweb_models.egg-info/top_level.txt +1 -0
  56. package/python-models/parallel-execution.py +475 -0
  57. package/python-models/performance-test.py +605 -0
  58. package/python-models/setup.py +13 -0
  59. package/python-models/websocket-communication.py +697 -0
  60. package/schemas/action-configs.json +1501 -0
  61. package/schemas/debug.json +203 -0
  62. package/schemas/environment.json +165 -0
  63. package/schemas/execution-results.json +209 -0
  64. package/schemas/flow-validation.json +311 -0
  65. package/schemas/flow.json +381 -0
  66. package/schemas/parallel-execution.json +219 -0
  67. package/schemas/performance-test.json +600 -0
  68. package/schemas/websocket-communication.json +1118 -0
@@ -0,0 +1,209 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: debug.json
3
+ # timestamp: 2026-02-04T15:36:47+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from enum import StrEnum
8
+ from typing import Any
9
+
10
+ from pydantic import BaseModel, ConfigDict
11
+
12
+
13
+ class DebugModels(BaseModel):
14
+ """
15
+ Schema for debug session management, states, and execution control
16
+ """
17
+
18
+ model_config = ConfigDict(
19
+ populate_by_name=True,
20
+ )
21
+
22
+
23
+ class DebugState(StrEnum):
24
+ """
25
+ Debug session states following the state machine specification
26
+ """
27
+
28
+ ready = 'ready'
29
+ running = 'running'
30
+ paused = 'paused'
31
+ stepping = 'stepping'
32
+ completed = 'completed'
33
+ error = 'error'
34
+ stopped = 'stopped'
35
+
36
+
37
+ class PauseReason(StrEnum):
38
+ """
39
+ Reasons for debug execution pause
40
+ """
41
+
42
+ breakpoint = 'breakpoint'
43
+ manual = 'manual'
44
+ error = 'error'
45
+ step = 'step'
46
+
47
+
48
+ class Breakpoint(BaseModel):
49
+ """
50
+ Represents a breakpoint in debug execution
51
+ """
52
+
53
+ model_config = ConfigDict(
54
+ populate_by_name=True,
55
+ )
56
+ nodeId: str
57
+ """
58
+ Action/node ID where breakpoint is set
59
+ """
60
+ enabled: bool
61
+ """
62
+ Whether the breakpoint is active
63
+ """
64
+ hitCount: int | None = 0
65
+ """
66
+ Number of times this breakpoint has been hit
67
+ """
68
+
69
+
70
+ class DebugExecutionInfo(BaseModel):
71
+ """
72
+ Information about current debug execution state
73
+ """
74
+
75
+ model_config = ConfigDict(
76
+ populate_by_name=True,
77
+ )
78
+ currentNodeId: str | None
79
+ """
80
+ ID of the action currently being executed or about to execute
81
+ """
82
+ currentActionIndex: int
83
+ """
84
+ Zero-based index of current action in execution order
85
+ """
86
+ totalActions: int
87
+ """
88
+ Total number of actions in the flow
89
+ """
90
+ executedActions: list[str]
91
+ """
92
+ List of action IDs that have been executed
93
+ """
94
+ nextBreakpoint: str | None
95
+ """
96
+ ID of the next breakpoint that will be hit
97
+ """
98
+
99
+
100
+ class DebugSession(BaseModel):
101
+ """
102
+ Represents a single debug execution session
103
+ """
104
+
105
+ model_config = ConfigDict(
106
+ populate_by_name=True,
107
+ )
108
+ sessionId: str
109
+ """
110
+ Unique identifier for the debug session
111
+ """
112
+ flowId: str
113
+ """
114
+ ID of the flow being debugged
115
+ """
116
+ breakpoints: list[str]
117
+ """
118
+ Set of action IDs where execution should pause
119
+ """
120
+ state: DebugState
121
+ currentActionId: str | None = None
122
+ """
123
+ ID of the action currently being executed or about to execute
124
+ """
125
+ currentActionIndex: int | None = 0
126
+ """
127
+ Zero-based index of current action in execution order
128
+ """
129
+ executedActions: list[str] | None = []
130
+ """
131
+ List of action IDs that have been executed
132
+ """
133
+ pauseRequested: bool | None = False
134
+ """
135
+ Flag indicating manual pause was requested
136
+ """
137
+ stopRequested: bool | None = False
138
+ """
139
+ Flag indicating stop was requested
140
+ """
141
+ createdAt: float | None = None
142
+ """
143
+ Timestamp when session was created (Unix timestamp)
144
+ """
145
+ lastUpdated: float | None = None
146
+ """
147
+ Timestamp of last state change (Unix timestamp)
148
+ """
149
+
150
+
151
+ class Type(StrEnum):
152
+ """
153
+ Type of debug update
154
+ """
155
+
156
+ debug_action_started = 'debug_action_started'
157
+ debug_action_completed = 'debug_action_completed'
158
+ debug_action_failed = 'debug_action_failed'
159
+ debug_paused = 'debug_paused'
160
+ debug_resumed = 'debug_resumed'
161
+ debug_completed = 'debug_completed'
162
+ debug_stopped = 'debug_stopped'
163
+ debug_error = 'debug_error'
164
+
165
+
166
+ class DebugActionUpdate(BaseModel):
167
+ """
168
+ Real-time update sent during debug execution
169
+ """
170
+
171
+ model_config = ConfigDict(
172
+ populate_by_name=True,
173
+ )
174
+ type: Type
175
+ """
176
+ Type of debug update
177
+ """
178
+ sessionId: str
179
+ """
180
+ Debug session ID
181
+ """
182
+ actionId: str | None = None
183
+ """
184
+ Action ID related to this update
185
+ """
186
+ actionIndex: int | None = None
187
+ """
188
+ Index of the action in execution order
189
+ """
190
+ state: DebugState
191
+ """
192
+ Current debug state
193
+ """
194
+ pauseReason: PauseReason | None = None
195
+ """
196
+ Reason for pause if state is paused
197
+ """
198
+ result: dict[str, Any] | None = None
199
+ """
200
+ Action execution result if available
201
+ """
202
+ error: str | None = None
203
+ """
204
+ Error message if action failed
205
+ """
206
+ variables: dict[str, Any] | None = None
207
+ """
208
+ Current flow variables state
209
+ """
@@ -0,0 +1,141 @@
1
+ """Debug-related domain models shared by backend and frontend contracts."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from enum import StrEnum
6
+ from typing import Any, Literal
7
+
8
+ from pydantic import BaseModel, ConfigDict
9
+
10
+
11
+ class DebugState(StrEnum):
12
+ """Current debug execution state."""
13
+
14
+ ready = "ready"
15
+ running = "running"
16
+ paused = "paused"
17
+ stepping = "stepping"
18
+ completed = "completed"
19
+ failed = "failed"
20
+ stopped = "stopped"
21
+
22
+
23
+ class PauseReason(StrEnum):
24
+ """Reason debug execution paused."""
25
+
26
+ breakpoint = "breakpoint"
27
+ manual = "manual"
28
+ step = "step"
29
+ error = "error"
30
+
31
+
32
+ class Breakpoint(BaseModel):
33
+ """Breakpoint configuration for a flow node."""
34
+
35
+ model_config = ConfigDict(populate_by_name=True)
36
+
37
+ node_id: str
38
+ enabled: bool = True
39
+
40
+
41
+ class DebugExecutionInfo(BaseModel):
42
+ """Runtime debug execution snapshot."""
43
+
44
+ model_config = ConfigDict(populate_by_name=True)
45
+
46
+ session_id: str
47
+ flow_id: str
48
+ state: DebugState
49
+ current_action_id: str | None = None
50
+ current_action_index: int = 0
51
+ executed_actions: list[str] | None = None
52
+
53
+
54
+ class DebugSession(BaseModel):
55
+ """Debug session metadata and state."""
56
+
57
+ model_config = ConfigDict(populate_by_name=True)
58
+
59
+ session_id: str
60
+ flow_id: str
61
+ state: DebugState = DebugState.ready
62
+ breakpoints: list[str] | None = None
63
+ current_action_id: str | None = None
64
+ current_action_index: int = 0
65
+ created_at: float | None = None
66
+ last_updated: float | None = None
67
+
68
+
69
+ class DebugActionUpdate(BaseModel):
70
+ """Incremental debug action status update."""
71
+
72
+ model_config = ConfigDict(populate_by_name=True)
73
+
74
+ session_id: str
75
+ node_id: str
76
+ action_index: int
77
+ action_type: str | None = None
78
+ status: Literal["started", "completed", "failed", "skipped"]
79
+ result: dict[str, Any] | None = None
80
+
81
+
82
+ class DebugRunCommand(BaseModel):
83
+ """Start debug execution for a flow."""
84
+
85
+ model_config = ConfigDict(populate_by_name=True)
86
+
87
+ command: Literal["debug_run"] = "debug_run"
88
+ session_id: str
89
+ flow: dict[str, Any]
90
+ breakpoints: list[str] | None = None
91
+ browser: str | None = None
92
+ headless: bool = False
93
+ incognito: bool = False
94
+
95
+
96
+ class DebugStepCommand(BaseModel):
97
+ """Execute one action and pause again."""
98
+
99
+ model_config = ConfigDict(populate_by_name=True)
100
+
101
+ command: Literal["debug_step"] = "debug_step"
102
+ session_id: str
103
+
104
+
105
+ class DebugContinueCommand(BaseModel):
106
+ """Continue execution until next pause condition."""
107
+
108
+ model_config = ConfigDict(populate_by_name=True)
109
+
110
+ command: Literal["debug_continue"] = "debug_continue"
111
+ session_id: str
112
+
113
+
114
+ class DebugPauseCommand(BaseModel):
115
+ """Request pause for a running debug session."""
116
+
117
+ model_config = ConfigDict(populate_by_name=True)
118
+
119
+ command: Literal["debug_pause"] = "debug_pause"
120
+ session_id: str
121
+
122
+
123
+ class DebugStopCommand(BaseModel):
124
+ """Stop a running debug session."""
125
+
126
+ model_config = ConfigDict(populate_by_name=True)
127
+
128
+ command: Literal["debug_stop"] = "debug_stop"
129
+ session_id: str
130
+
131
+
132
+ class DebugResponse(BaseModel):
133
+ """Generic debug websocket response model."""
134
+
135
+ model_config = ConfigDict(populate_by_name=True)
136
+
137
+ command: str
138
+ success: bool
139
+ session_id: str | None = None
140
+ message: str | None = None
141
+ data: dict[str, Any] | None = None
@@ -0,0 +1,158 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: environment.json
3
+ # timestamp: 2026-01-25T13:38:24+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from enum import StrEnum
8
+ from typing import Annotated
9
+
10
+ from pydantic import AwareDatetime, BaseModel, ConfigDict, Field
11
+
12
+
13
+ class Type(StrEnum):
14
+ """
15
+ Data type of the variable
16
+ """
17
+
18
+ string = 'string'
19
+ number = 'number'
20
+ boolean = 'boolean'
21
+ url = 'url'
22
+ file = 'file'
23
+ json = 'json'
24
+ array = 'array'
25
+
26
+
27
+ class GlobalVariable(BaseModel):
28
+ """
29
+ A global variable available across all environments
30
+ """
31
+
32
+ model_config = ConfigDict(
33
+ populate_by_name=True,
34
+ )
35
+ id: Annotated[str, Field(max_length=50, min_length=1, pattern='^[a-zA-Z0-9_-]+$')]
36
+ """
37
+ Unique identifier for the global variable
38
+ """
39
+ name: Annotated[
40
+ str, Field(max_length=50, min_length=1, pattern='^[a-zA-Z_][a-zA-Z0-9_]*$')
41
+ ]
42
+ """
43
+ Variable name used in flows
44
+ """
45
+ value: Annotated[str, Field(max_length=10000, min_length=0)]
46
+ """
47
+ The variable's value
48
+ """
49
+ type: Type
50
+ """
51
+ Data type of the variable
52
+ """
53
+ description: Annotated[str | None, Field(max_length=500)] = None
54
+ """
55
+ Description of the variable's purpose
56
+ """
57
+ createdAt: AwareDatetime
58
+ """
59
+ ISO 8601 timestamp when the variable was created
60
+ """
61
+ updatedAt: AwareDatetime
62
+ """
63
+ ISO 8601 timestamp when the variable was last updated
64
+ """
65
+
66
+
67
+ class Variable(BaseModel):
68
+ """
69
+ An environment-specific variable
70
+ """
71
+
72
+ model_config = ConfigDict(
73
+ populate_by_name=True,
74
+ )
75
+ id: Annotated[str, Field(max_length=50, min_length=1, pattern='^[a-zA-Z0-9_-]+$')]
76
+ """
77
+ Unique identifier for the variable within this environment
78
+ """
79
+ name: Annotated[
80
+ str, Field(max_length=50, min_length=1, pattern='^[a-zA-Z_][a-zA-Z0-9_]*$')
81
+ ]
82
+ """
83
+ Variable name used in flows
84
+ """
85
+ value: Annotated[str, Field(max_length=10000, min_length=0)]
86
+ """
87
+ The variable's value
88
+ """
89
+ type: Type
90
+ """
91
+ Data type of the variable
92
+ """
93
+ description: Annotated[str | None, Field(max_length=500)] = None
94
+ """
95
+ Description of the variable's purpose
96
+ """
97
+
98
+
99
+ class Environment(BaseModel):
100
+ """
101
+ An environment configuration with its variables
102
+ """
103
+
104
+ model_config = ConfigDict(
105
+ populate_by_name=True,
106
+ )
107
+ id: Annotated[str, Field(max_length=50, min_length=1, pattern='^[a-zA-Z0-9_-]+$')]
108
+ """
109
+ Unique identifier for the environment
110
+ """
111
+ name: Annotated[str, Field(max_length=100, min_length=1)]
112
+ """
113
+ Display name for the environment
114
+ """
115
+ description: Annotated[str | None, Field(max_length=500)] = None
116
+ """
117
+ Description of the environment's purpose
118
+ """
119
+ variables: Annotated[list[Variable], Field(min_length=0)]
120
+ """
121
+ Environment-specific variables
122
+ """
123
+ isDefault: bool
124
+ """
125
+ Whether this is the default environment
126
+ """
127
+ createdAt: AwareDatetime
128
+ """
129
+ ISO 8601 timestamp when the environment was created
130
+ """
131
+ updatedAt: AwareDatetime
132
+ """
133
+ ISO 8601 timestamp when the environment was last updated
134
+ """
135
+
136
+
137
+ class EnvironmentAndGlobalVariablesConfiguration(BaseModel):
138
+ """
139
+ Schema for environment configurations and global variables used in Floweb automation flows
140
+ """
141
+
142
+ model_config = ConfigDict(
143
+ populate_by_name=True,
144
+ )
145
+ environments: Annotated[list[Environment], Field(min_length=0)]
146
+ """
147
+ List of available environments
148
+ """
149
+ globalVariables: Annotated[list[GlobalVariable], Field(min_length=0)]
150
+ """
151
+ List of global variables available across all environments
152
+ """
153
+ selectedEnvironmentId: Annotated[str | None, Field(pattern='^[a-zA-Z0-9_-]+$')] = (
154
+ None
155
+ )
156
+ """
157
+ ID of the currently selected environment
158
+ """
@@ -0,0 +1,208 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: execution-results.json
3
+ # timestamp: 2026-01-25T13:38:26+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import Annotated, Any
8
+
9
+ from pydantic import BaseModel, ConfigDict, Field
10
+
11
+
12
+ class ActionResult(BaseModel):
13
+ """
14
+ Result of executing an action
15
+ """
16
+
17
+ model_config = ConfigDict(
18
+ populate_by_name=True,
19
+ )
20
+ node_id: str
21
+ """
22
+ Action node ID
23
+ """
24
+ action_type: str
25
+ """
26
+ Type of action executed
27
+ """
28
+ config: dict[str, Any]
29
+ """
30
+ Action configuration used
31
+ """
32
+ start_time: int
33
+ """
34
+ Start timestamp in milliseconds
35
+ """
36
+ end_time: int
37
+ """
38
+ End timestamp in milliseconds
39
+ """
40
+ duration_seconds: Annotated[float, Field(ge=0.0)]
41
+ """
42
+ Duration in seconds
43
+ """
44
+ success: bool
45
+ """
46
+ Whether the action succeeded
47
+ """
48
+ message: str
49
+ """
50
+ Result message
51
+ """
52
+ error: str | None = None
53
+ """
54
+ Error message if failed
55
+ """
56
+ screenshot: str | None = None
57
+ """
58
+ Base64 screenshot if taken
59
+ """
60
+ data: dict[str, Any] | None = None
61
+ """
62
+ Additional action-specific data
63
+ """
64
+
65
+
66
+ class Parameters(BaseModel):
67
+ """
68
+ Parameters used during execution (input/output)
69
+ """
70
+
71
+ model_config = ConfigDict(
72
+ populate_by_name=True,
73
+ )
74
+ input: list[dict[str, Any]] | None = []
75
+ output: list[dict[str, Any]] | None = []
76
+
77
+
78
+ class BrowserInfo(BaseModel):
79
+ """
80
+ Browser information
81
+ """
82
+
83
+ model_config = ConfigDict(
84
+ populate_by_name=True,
85
+ )
86
+ name: str | None = None
87
+ version: str | None = None
88
+ user_agent: str | None = None
89
+
90
+
91
+ class PerformanceMetrics(BaseModel):
92
+ """
93
+ Performance metrics collected during execution
94
+ """
95
+
96
+ model_config = ConfigDict(
97
+ populate_by_name=True,
98
+ )
99
+ total_actions: Annotated[int | None, Field(ge=0)] = None
100
+ successful_actions: Annotated[int | None, Field(ge=0)] = None
101
+ failed_actions: Annotated[int | None, Field(ge=0)] = None
102
+ average_action_time: Annotated[float | None, Field(ge=0.0)] = None
103
+ total_network_requests: Annotated[int | None, Field(ge=0)] = None
104
+ total_data_transferred: Annotated[int | None, Field(ge=0)] = None
105
+
106
+
107
+ class FlowReport(BaseModel):
108
+ """
109
+ Complete report of flow execution
110
+ """
111
+
112
+ model_config = ConfigDict(
113
+ populate_by_name=True,
114
+ )
115
+ actions: list[ActionResult]
116
+ """
117
+ Results of all actions
118
+ """
119
+ variables: dict[str, list[dict[str, Any]]]
120
+ """
121
+ Variables used during execution (input/output)
122
+ """
123
+ parameters: Annotated[
124
+ Parameters,
125
+ Field(
126
+ default_factory=lambda: Parameters.model_validate(
127
+ {'input': [], 'output': []}
128
+ )
129
+ ),
130
+ ]
131
+ """
132
+ Parameters used during execution (input/output)
133
+ """
134
+ output: dict[str, Any]
135
+ """
136
+ Final output
137
+ """
138
+ recording: str | None = None
139
+ """
140
+ Recording data (deprecated, use recording_file instead)
141
+ """
142
+ recording_file: str | None = None
143
+ """
144
+ Path to the recording file on the server
145
+ """
146
+ recording_duration: Annotated[float | None, Field(ge=0.0)] = None
147
+ """
148
+ Duration of the recording in seconds
149
+ """
150
+ flow_id: str | None = None
151
+ """
152
+ ID of the executed flow
153
+ """
154
+ flow_name: str | None = None
155
+ """
156
+ Name of the executed flow
157
+ """
158
+ start_time: int | None = None
159
+ """
160
+ Flow execution start timestamp
161
+ """
162
+ end_time: int | None = None
163
+ """
164
+ Flow execution end timestamp
165
+ """
166
+ total_duration: Annotated[float | None, Field(ge=0.0)] = None
167
+ """
168
+ Total execution time in seconds
169
+ """
170
+ success: bool | None = None
171
+ """
172
+ Overall flow success status
173
+ """
174
+ error: str | None = None
175
+ """
176
+ Error message if flow failed
177
+ """
178
+ environment: dict[str, Any] | None = None
179
+ """
180
+ Environment used during execution
181
+ """
182
+ browser_info: BrowserInfo | None = None
183
+ """
184
+ Browser information
185
+ """
186
+ performance_metrics: PerformanceMetrics | None = None
187
+ """
188
+ Performance metrics collected during execution
189
+ """
190
+
191
+
192
+ class ExecutionResults(BaseModel):
193
+ model_config = ConfigDict(
194
+ populate_by_name=True,
195
+ )
196
+ actionResults: list[ActionResult] | None = None
197
+ flowReports: list[FlowReport] | None = None
198
+
199
+
200
+ class ExecutionResultsModels(BaseModel):
201
+ """
202
+ Schema for action execution results and flow reports
203
+ """
204
+
205
+ model_config = ConfigDict(
206
+ populate_by_name=True,
207
+ )
208
+ executionResults: ExecutionResults | None = None