monkeybrain-runtime 1.0.0__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.
Files changed (838) hide show
  1. monkeybrain_runtime-1.0.0.dist-info/METADATA +76 -0
  2. monkeybrain_runtime-1.0.0.dist-info/RECORD +838 -0
  3. monkeybrain_runtime-1.0.0.dist-info/WHEEL +5 -0
  4. monkeybrain_runtime-1.0.0.dist-info/entry_points.txt +3 -0
  5. monkeybrain_runtime-1.0.0.dist-info/top_level.txt +2 -0
  6. services/__init__.py +8 -0
  7. services/agentos/__init__.py +0 -0
  8. services/agentos/main.py +1 -0
  9. services/assets/helpers/__init__.py +12 -0
  10. services/assets/helpers/device.py +59 -0
  11. services/assets/helpers/equipment.py +179 -0
  12. services/assets/helpers/instruments.py +72 -0
  13. services/assets/helpers/machines.py +183 -0
  14. services/assets/helpers/materials.py +76 -0
  15. services/assets/helpers/parts.py +116 -0
  16. services/assets/helpers/plc.py +134 -0
  17. services/assets/helpers/tags.py +108 -0
  18. services/assets/helpers/tools.py +101 -0
  19. services/assets/main.py +75 -0
  20. services/assets/models/__init__.py +12 -0
  21. services/assets/models/device.py +79 -0
  22. services/assets/models/equipment.py +222 -0
  23. services/assets/models/instruments.py +85 -0
  24. services/assets/models/machines.py +230 -0
  25. services/assets/models/material.py +266 -0
  26. services/assets/models/parts.py +96 -0
  27. services/assets/models/plc.py +264 -0
  28. services/assets/models/tags.py +76 -0
  29. services/assets/models/tools.py +179 -0
  30. services/assets/routers/__init__.py +12 -0
  31. services/assets/routers/classes.py +65 -0
  32. services/assets/routers/device.py +86 -0
  33. services/assets/routers/equipment.py +145 -0
  34. services/assets/routers/families.py +61 -0
  35. services/assets/routers/instruments.py +70 -0
  36. services/assets/routers/machines.py +136 -0
  37. services/assets/routers/materials.py +105 -0
  38. services/assets/routers/parts.py +130 -0
  39. services/assets/routers/plc.py +94 -0
  40. services/assets/routers/subclasses.py +68 -0
  41. services/assets/routers/tags.py +138 -0
  42. services/assets/routers/tools.py +113 -0
  43. services/auth/helpers/__init__.py +13 -0
  44. services/auth/helpers/approval_decisions.py +261 -0
  45. services/auth/helpers/audit_elasticsearch_sync.py +350 -0
  46. services/auth/helpers/departments.py +53 -0
  47. services/auth/helpers/graph_store.py +848 -0
  48. services/auth/helpers/influx_store.py +280 -0
  49. services/auth/helpers/me.py +33 -0
  50. services/auth/helpers/nats_consumer.py +618 -0
  51. services/auth/helpers/nats_store.py +242 -0
  52. services/auth/helpers/permissions.py +62 -0
  53. services/auth/helpers/roles.py +87 -0
  54. services/auth/helpers/store.py +54 -0
  55. services/auth/helpers/team_members.py +155 -0
  56. services/auth/helpers/teams.py +87 -0
  57. services/auth/helpers/tokens.py +71 -0
  58. services/auth/helpers/users.py +119 -0
  59. services/auth/helpers/websocket_broadcast.py +41 -0
  60. services/auth/main.py +88 -0
  61. services/auth/models/__init__.py +12 -0
  62. services/auth/models/departments.py +55 -0
  63. services/auth/models/login.py +20 -0
  64. services/auth/models/permissions.py +61 -0
  65. services/auth/models/roles.py +53 -0
  66. services/auth/models/session.py +26 -0
  67. services/auth/models/teamMembers.py +59 -0
  68. services/auth/models/teams.py +56 -0
  69. services/auth/models/users.py +77 -0
  70. services/auth/routers/__init__.py +14 -0
  71. services/auth/routers/auth.py +3839 -0
  72. services/auth/routers/departments.py +84 -0
  73. services/auth/routers/integration_config.py +703 -0
  74. services/auth/routers/me.py +28 -0
  75. services/auth/routers/permissions.py +96 -0
  76. services/auth/routers/roles.py +139 -0
  77. services/auth/routers/session.py +224 -0
  78. services/auth/routers/team_members.py +152 -0
  79. services/auth/routers/teams.py +112 -0
  80. services/auth/routers/users.py +131 -0
  81. services/auth/routers/websocket_events.py +247 -0
  82. services/batch_execution/__init__.py +19 -0
  83. services/batch_execution/pipeline_triggers/__init__.py +53 -0
  84. services/batch_execution/pipeline_triggers/pipeline_parameter_adjuster.py +440 -0
  85. services/batch_execution/pipeline_triggers/pipeline_trigger_engine.py +445 -0
  86. services/batch_execution/pipeline_triggers/re_evaluation_queue.py +341 -0
  87. services/batch_execution/pipeline_triggers/test_phase3_implementation.py +553 -0
  88. services/batch_execution/pipeline_triggers/workflow_reevaluator.py +367 -0
  89. services/batch_execution/smoke_test_e2e_feedback_loop.py +704 -0
  90. services/batch_execution/workflow_executor.py +478 -0
  91. services/changeover/helpers/__init__.py +11 -0
  92. services/changeover/helpers/changeover.py +87 -0
  93. services/changeover/helpers/changeover_common.py +55 -0
  94. services/changeover/helpers/changeover_events.py +66 -0
  95. services/changeover/helpers/changeover_kpis.py +33 -0
  96. services/changeover/helpers/changeover_matrix.py +60 -0
  97. services/changeover/helpers/changeover_procedures.py +164 -0
  98. services/changeover/helpers/changeover_windows.py +96 -0
  99. services/changeover/main.py +52 -0
  100. services/changeover/models/__init__.py +11 -0
  101. services/changeover/models/changeover.py +73 -0
  102. services/changeover/models/changeover_events.py +142 -0
  103. services/changeover/models/changeover_kpis.py +75 -0
  104. services/changeover/models/changeover_matrix.py +63 -0
  105. services/changeover/models/changeover_procedures.py +108 -0
  106. services/changeover/models/changeover_tasks.py +87 -0
  107. services/changeover/models/changeover_windows.py +72 -0
  108. services/changeover/routers/__init__.py +9 -0
  109. services/changeover/routers/changeover_events.py +127 -0
  110. services/changeover/routers/changeover_kpis.py +80 -0
  111. services/changeover/routers/changeover_matrix.py +80 -0
  112. services/changeover/routers/changeover_procedures.py +118 -0
  113. services/changeover/routers/changeover_windows.py +98 -0
  114. services/common/__init__.py +2 -0
  115. services/common/approval_chains.py +648 -0
  116. services/common/auth.py +56 -0
  117. services/common/cdc.py +52 -0
  118. services/common/compat.py +217 -0
  119. services/common/compliance.py +562 -0
  120. services/common/config.py +134 -0
  121. services/common/cors.py +17 -0
  122. services/common/data_transformation.py +195 -0
  123. services/common/db.py +577 -0
  124. services/common/embeddings.py +97 -0
  125. services/common/event_reducers.py +194 -0
  126. services/common/event_types.py +51 -0
  127. services/common/integration_ingestion.py +169 -0
  128. services/common/logging.py +204 -0
  129. services/common/models/__init__.py +2 -0
  130. services/common/models/databricks.py +25 -0
  131. services/common/models/enums.py +64 -0
  132. services/common/module_control.py +422 -0
  133. services/common/mongo_cdc_watcher.py +106 -0
  134. services/common/n8n_auth.py +22 -0
  135. services/common/neo4j_mirror.py +1087 -0
  136. services/common/ontology_registry.py +110 -0
  137. services/common/reasoning_traces.py +52 -0
  138. services/common/supply_chain_cdc.py +555 -0
  139. services/common/tracing.py +159 -0
  140. services/common/utils.py +30 -0
  141. services/customers/helpers/__init__.py +8 -0
  142. services/customers/helpers/customer_details.py +64 -0
  143. services/customers/helpers/customer_metadata.py +64 -0
  144. services/customers/helpers/customer_order_metrics.py +67 -0
  145. services/customers/helpers/customer_payment_data.py +67 -0
  146. services/customers/main.py +50 -0
  147. services/customers/models/__init__.py +8 -0
  148. services/customers/models/customer_details.py +42 -0
  149. services/customers/models/customer_metadata.py +97 -0
  150. services/customers/models/customer_order_metrics.py +86 -0
  151. services/customers/models/customer_payment_data.py +60 -0
  152. services/customers/routers/__init__.py +8 -0
  153. services/customers/routers/customer_details.py +88 -0
  154. services/customers/routers/customer_metadata.py +88 -0
  155. services/customers/routers/customer_order_metrics.py +88 -0
  156. services/customers/routers/customer_payment_data.py +88 -0
  157. services/documents/__init__.py +1 -0
  158. services/documents/helpers/__init__.py +6 -0
  159. services/documents/helpers/document_metadata.py +569 -0
  160. services/documents/helpers/document_workflows.py +215 -0
  161. services/documents/helpers/report_templates.py +113 -0
  162. services/documents/main.py +49 -0
  163. services/documents/models/__init__.py +6 -0
  164. services/documents/models/document_metadata.py +215 -0
  165. services/documents/models/document_workflows.py +136 -0
  166. services/documents/models/report_templates.py +132 -0
  167. services/documents/routers/__init__.py +6 -0
  168. services/documents/routers/document_metadata.py +654 -0
  169. services/documents/routers/document_workflows.py +146 -0
  170. services/documents/routers/report_templates.py +86 -0
  171. services/events/helpers/__init__.py +5 -0
  172. services/events/helpers/events.py +394 -0
  173. services/events/main.py +40 -0
  174. services/events/models/__init__.py +5 -0
  175. services/events/models/events.py +50 -0
  176. services/events/routers/__init__.py +6 -0
  177. services/events/routers/count_events.py +109 -0
  178. services/events/routers/events.py +75 -0
  179. services/events/seed_events.py +196 -0
  180. services/facilities/helpers/__init__.py +8 -0
  181. services/facilities/helpers/lines.py +74 -0
  182. services/facilities/helpers/locations.py +231 -0
  183. services/facilities/helpers/plants.py +59 -0
  184. services/facilities/helpers/stages.py +110 -0
  185. services/facilities/helpers/workstation.py +213 -0
  186. services/facilities/main.py +60 -0
  187. services/facilities/models/__init__.py +10 -0
  188. services/facilities/models/industrialLine.py +72 -0
  189. services/facilities/models/industrialPlant.py +164 -0
  190. services/facilities/models/locations.py +74 -0
  191. services/facilities/models/stages.py +92 -0
  192. services/facilities/models/worker.py +73 -0
  193. services/facilities/models/workstation.py +117 -0
  194. services/facilities/models/workstation_live_state.py +59 -0
  195. services/facilities/routers/__init__.py +8 -0
  196. services/facilities/routers/bays.py +81 -0
  197. services/facilities/routers/buildings.py +92 -0
  198. services/facilities/routers/floors.py +81 -0
  199. services/facilities/routers/lines.py +154 -0
  200. services/facilities/routers/locations.py +208 -0
  201. services/facilities/routers/plant.py +203 -0
  202. services/facilities/routers/rooms.py +81 -0
  203. services/facilities/routers/stages.py +152 -0
  204. services/facilities/routers/workstation.py +173 -0
  205. services/file/backup.py +71 -0
  206. services/file/main.py +45 -0
  207. services/file/recieve.py +54 -0
  208. services/file/send.py +55 -0
  209. services/file/src/core/config.py +90 -0
  210. services/file/src/core/keycloak.py +152 -0
  211. services/file/src/core/logging_config.py +9 -0
  212. services/file/src/core/security.py +33 -0
  213. services/file/src/helpers/cad_conversion.py +331 -0
  214. services/file/src/helpers/helpers.py +825 -0
  215. services/file/src/routes/cad_conversion.py +26 -0
  216. services/file/src/routes/files.py +136 -0
  217. services/file/src/routes/presigned.py +154 -0
  218. services/file/src/services/websocket.py +293 -0
  219. services/floor_layout/helpers/__init__.py +8 -0
  220. services/floor_layout/helpers/bays.py +92 -0
  221. services/floor_layout/helpers/buildings.py +54 -0
  222. services/floor_layout/helpers/floors.py +65 -0
  223. services/floor_layout/helpers/rooms.py +76 -0
  224. services/floor_layout/main.py +52 -0
  225. services/floor_layout/models/__init__.py +8 -0
  226. services/floor_layout/models/bays.py +65 -0
  227. services/floor_layout/models/buildings.py +52 -0
  228. services/floor_layout/models/floors.py +45 -0
  229. services/floor_layout/models/rooms.py +61 -0
  230. services/floor_layout/routers/__init__.py +9 -0
  231. services/floor_layout/routers/bays.py +143 -0
  232. services/floor_layout/routers/buildings.py +116 -0
  233. services/floor_layout/routers/floors.py +89 -0
  234. services/floor_layout/routers/locations.py +80 -0
  235. services/floor_layout/routers/rooms.py +134 -0
  236. services/inventory/helpers/__init__.py +13 -0
  237. services/inventory/helpers/cycle_counts.py +124 -0
  238. services/inventory/helpers/inventory_allocations.py +134 -0
  239. services/inventory/helpers/inventory_item_counts.py +114 -0
  240. services/inventory/helpers/inventory_item_quantities.py +114 -0
  241. services/inventory/helpers/inventory_items.py +103 -0
  242. services/inventory/helpers/inventory_stage_outputs.py +134 -0
  243. services/inventory/helpers/inventory_transactions.py +112 -0
  244. services/inventory/helpers/stock_adjustment_requests.py +101 -0
  245. services/inventory/helpers/warehouse_cycle_counts.py +133 -0
  246. services/inventory/helpers/warehouse_locations.py +213 -0
  247. services/inventory/helpers/warehouse_regulated_records.py +123 -0
  248. services/inventory/main.py +62 -0
  249. services/inventory/models/__init__.py +17 -0
  250. services/inventory/models/cycle_counts.py +99 -0
  251. services/inventory/models/inventory_allocations.py +121 -0
  252. services/inventory/models/inventory_common.py +65 -0
  253. services/inventory/models/inventory_enums.py +21 -0
  254. services/inventory/models/inventory_item_count.py +65 -0
  255. services/inventory/models/inventory_item_quantity.py +82 -0
  256. services/inventory/models/inventory_items.py +168 -0
  257. services/inventory/models/inventory_responses.py +44 -0
  258. services/inventory/models/inventory_stage_outputs.py +96 -0
  259. services/inventory/models/inventory_state.py +15 -0
  260. services/inventory/models/inventory_transactions.py +80 -0
  261. services/inventory/models/stock_adjustment_requests.py +109 -0
  262. services/inventory/models/warehouse_cycle_counts.py +119 -0
  263. services/inventory/models/warehouse_location_models.py +708 -0
  264. services/inventory/models/warehouse_regulated_records.py +358 -0
  265. services/inventory/routers/__init__.py +13 -0
  266. services/inventory/routers/cycle_counts.py +106 -0
  267. services/inventory/routers/inventory_allocations.py +125 -0
  268. services/inventory/routers/inventory_item_counts.py +105 -0
  269. services/inventory/routers/inventory_item_quantities.py +105 -0
  270. services/inventory/routers/inventory_items.py +109 -0
  271. services/inventory/routers/inventory_stage_outputs.py +122 -0
  272. services/inventory/routers/inventory_transactions.py +96 -0
  273. services/inventory/routers/stock_adjustment_requests.py +124 -0
  274. services/inventory/routers/warehouse_cycle_counts.py +124 -0
  275. services/inventory/routers/warehouse_locations.py +426 -0
  276. services/inventory/routers/warehouse_regulated_records.py +273 -0
  277. services/iot/helpers/__init__.py +8 -0
  278. services/iot/helpers/ble_device.py +87 -0
  279. services/iot/helpers/mqtt_bridge.py +115 -0
  280. services/iot/helpers/sensor_readings.py +63 -0
  281. services/iot/helpers/sensors.py +77 -0
  282. services/iot/helpers/servers.py +72 -0
  283. services/iot/helpers/uwb_device.py +95 -0
  284. services/iot/main.py +53 -0
  285. services/iot/models/__init__.py +8 -0
  286. services/iot/models/ble_device.py +118 -0
  287. services/iot/models/sensors.py +256 -0
  288. services/iot/models/servers.py +206 -0
  289. services/iot/models/uwb_device.py +106 -0
  290. services/iot/routers/__init__.py +8 -0
  291. services/iot/routers/ble_device.py +110 -0
  292. services/iot/routers/sensors.py +144 -0
  293. services/iot/routers/servers.py +141 -0
  294. services/iot/routers/uwb_device.py +148 -0
  295. services/module_control/__init__.py +1 -0
  296. services/module_control/helpers/__init__.py +1 -0
  297. services/module_control/helpers/integration_config.py +243 -0
  298. services/module_control/helpers/security.py +104 -0
  299. services/module_control/main.py +44 -0
  300. services/module_control/models/__init__.py +1 -0
  301. services/module_control/models/module_control.py +65 -0
  302. services/module_control/routers/__init__.py +1 -0
  303. services/module_control/routers/module_control.py +219 -0
  304. services/orders/helpers/__init__.py +11 -0
  305. services/orders/helpers/invoices.py +123 -0
  306. services/orders/helpers/order_customer_metrics.py +61 -0
  307. services/orders/helpers/order_details.py +71 -0
  308. services/orders/helpers/order_metadata.py +61 -0
  309. services/orders/helpers/order_payment_metadata.py +74 -0
  310. services/orders/helpers/orders.py +119 -0
  311. services/orders/helpers/sales_orders.py +136 -0
  312. services/orders/main.py +56 -0
  313. services/orders/models/__init__.py +11 -0
  314. services/orders/models/invoices.py +415 -0
  315. services/orders/models/order_customer_metrics.py +78 -0
  316. services/orders/models/order_details.py +46 -0
  317. services/orders/models/order_metadata.py +60 -0
  318. services/orders/models/order_payment_metadata.py +63 -0
  319. services/orders/models/orders.py +64 -0
  320. services/orders/models/sales_orders.py +130 -0
  321. services/orders/routers/__init__.py +11 -0
  322. services/orders/routers/invoices.py +111 -0
  323. services/orders/routers/order_customer_metrics.py +87 -0
  324. services/orders/routers/order_details.py +87 -0
  325. services/orders/routers/order_metadata.py +87 -0
  326. services/orders/routers/order_payment_metadata.py +87 -0
  327. services/orders/routers/orders.py +74 -0
  328. services/orders/routers/sales_orders.py +111 -0
  329. services/pm/helpers/__init__.py +14 -0
  330. services/pm/helpers/calendar_bookings.py +114 -0
  331. services/pm/helpers/calibration_point.py +110 -0
  332. services/pm/helpers/calibrations.py +196 -0
  333. services/pm/helpers/checklists.py +318 -0
  334. services/pm/helpers/cleaning.py +333 -0
  335. services/pm/helpers/downtime.py +376 -0
  336. services/pm/helpers/kanban_boards.py +186 -0
  337. services/pm/helpers/maintainance.py +177 -0
  338. services/pm/helpers/sop.py +1155 -0
  339. services/pm/helpers/sop_cdc.py +324 -0
  340. services/pm/helpers/weekly_schedules.py +79 -0
  341. services/pm/main.py +62 -0
  342. services/pm/models/__init__.py +14 -0
  343. services/pm/models/calendar_booking.py +82 -0
  344. services/pm/models/calibration_point.py +44 -0
  345. services/pm/models/calibrations.py +167 -0
  346. services/pm/models/checklists.py +117 -0
  347. services/pm/models/cleaning.py +203 -0
  348. services/pm/models/downtime.py +109 -0
  349. services/pm/models/kanban_board.py +178 -0
  350. services/pm/models/maintainanceLog.py +148 -0
  351. services/pm/models/sop.py +152 -0
  352. services/pm/models/weekly_schedule.py +91 -0
  353. services/pm/routers/__init__.py +14 -0
  354. services/pm/routers/calendar_bookings.py +143 -0
  355. services/pm/routers/calibration_point.py +94 -0
  356. services/pm/routers/calibrations.py +232 -0
  357. services/pm/routers/checklists.py +188 -0
  358. services/pm/routers/cleaning.py +127 -0
  359. services/pm/routers/downtime.py +143 -0
  360. services/pm/routers/kanban_boards.py +283 -0
  361. services/pm/routers/maintainance.py +241 -0
  362. services/pm/routers/sop.py +437 -0
  363. services/pm/routers/weekly_schedules.py +108 -0
  364. services/process_definitions/helpers/__init__.py +11 -0
  365. services/process_definitions/helpers/cpp_cqa_registry.py +120 -0
  366. services/process_definitions/helpers/mbmr_templates.py +107 -0
  367. services/process_definitions/helpers/packing_instructions.py +113 -0
  368. services/process_definitions/helpers/process_constraints.py +495 -0
  369. services/process_definitions/helpers/process_corrections.py +279 -0
  370. services/process_definitions/helpers/process_definition.py +996 -0
  371. services/process_definitions/helpers/process_node_catalog.py +786 -0
  372. services/process_definitions/helpers/process_post_checks.py +441 -0
  373. services/process_definitions/helpers/process_pre_checks.py +351 -0
  374. services/process_definitions/helpers/process_steps.py +220 -0
  375. services/process_definitions/main.py +71 -0
  376. services/process_definitions/models/__init__.py +13 -0
  377. services/process_definitions/models/cpp_cqa_registry.py +145 -0
  378. services/process_definitions/models/gxp_change_controls.py +38 -0
  379. services/process_definitions/models/gxp_risk_assessments.py +30 -0
  380. services/process_definitions/models/gxp_validation_evidence.py +33 -0
  381. services/process_definitions/models/mbmr_templates.py +173 -0
  382. services/process_definitions/models/packing_instructions.py +176 -0
  383. services/process_definitions/models/process_constraints.py +159 -0
  384. services/process_definitions/models/process_corrections.py +118 -0
  385. services/process_definitions/models/process_definition.py +685 -0
  386. services/process_definitions/models/process_definition_common.py +48 -0
  387. services/process_definitions/models/process_node_catalog.py +25 -0
  388. services/process_definitions/models/process_post_checks.py +171 -0
  389. services/process_definitions/models/process_pre_checks.py +168 -0
  390. services/process_definitions/models/process_steps.py +170 -0
  391. services/process_definitions/node_services/__init__.py +8 -0
  392. services/process_definitions/node_services/common.py +95 -0
  393. services/process_definitions/node_services/executor.py +499 -0
  394. services/process_definitions/node_services/flow_simulator.py +733 -0
  395. services/process_definitions/node_services/functions.py +193 -0
  396. services/process_definitions/node_services/messaging.py +44 -0
  397. services/process_definitions/node_services/models.py +221 -0
  398. services/process_definitions/node_services/network.py +161 -0
  399. services/process_definitions/node_services/parsers.py +87 -0
  400. services/process_definitions/node_services/sequence.py +95 -0
  401. services/process_definitions/node_services/storage.py +50 -0
  402. services/process_definitions/node_services/webhooks.py +52 -0
  403. services/process_definitions/routers/__init__.py +10 -0
  404. services/process_definitions/routers/cpp_cqa_registry.py +86 -0
  405. services/process_definitions/routers/mbmr_templates.py +84 -0
  406. services/process_definitions/routers/packing_instructions.py +84 -0
  407. services/process_definitions/routers/process_constraints.py +564 -0
  408. services/process_definitions/routers/process_corrections.py +343 -0
  409. services/process_definitions/routers/process_definition.py +992 -0
  410. services/process_definitions/routers/process_post_checks.py +529 -0
  411. services/process_definitions/routers/process_pre_checks.py +435 -0
  412. services/process_definitions/routers/process_steps.py +274 -0
  413. services/procurement/helpers/__init__.py +9 -0
  414. services/procurement/helpers/goods_receipts.py +240 -0
  415. services/procurement/helpers/purchase_order_shipping_information.py +85 -0
  416. services/procurement/helpers/purchase_orders.py +68 -0
  417. services/procurement/helpers/quality_control.py +235 -0
  418. services/procurement/helpers/sampling.py +404 -0
  419. services/procurement/main.py +52 -0
  420. services/procurement/models/__init__.py +9 -0
  421. services/procurement/models/goods_receipts.py +165 -0
  422. services/procurement/models/purchase_orders.py +54 -0
  423. services/procurement/models/quality_control.py +464 -0
  424. services/procurement/models/reinspection_records.py +28 -0
  425. services/procurement/models/sampling.py +262 -0
  426. services/procurement/models/shipping_information.py +51 -0
  427. services/procurement/routers/__init__.py +9 -0
  428. services/procurement/routers/goods_receipts.py +201 -0
  429. services/procurement/routers/purchase_orders.py +106 -0
  430. services/procurement/routers/quality_control.py +386 -0
  431. services/procurement/routers/sampling.py +296 -0
  432. services/procurement/routers/shipping_information.py +97 -0
  433. services/production/__init__.py +1 -0
  434. services/production/agents/__init__.py +5 -0
  435. services/production/agents/batch_planning_agent.py +815 -0
  436. services/production/models/__init__.py +25 -0
  437. services/production/models/batch.py +253 -0
  438. services/products/helpers/__init__.py +10 -0
  439. services/products/helpers/boms.py +100 -0
  440. services/products/helpers/drug_research.py +644 -0
  441. services/products/helpers/product_component.py +168 -0
  442. services/products/helpers/product_inventory.py +221 -0
  443. services/products/helpers/product_pricing.py +123 -0
  444. services/products/helpers/product_utils.py +32 -0
  445. services/products/helpers/products.py +81 -0
  446. services/products/main.py +59 -0
  447. services/products/models/__init__.py +9 -0
  448. services/products/models/drug_research.py +138 -0
  449. services/products/models/product_common.py +60 -0
  450. services/products/models/product_component.py +1028 -0
  451. services/products/models/product_inventory.py +118 -0
  452. services/products/models/product_pricing.py +73 -0
  453. services/products/models/products.py +151 -0
  454. services/products/routers/__init__.py +9 -0
  455. services/products/routers/boms.py +116 -0
  456. services/products/routers/drug_research.py +115 -0
  457. services/products/routers/product_components.py +123 -0
  458. services/products/routers/product_inventory.py +185 -0
  459. services/products/routers/product_pricing.py +136 -0
  460. services/products/routers/products.py +165 -0
  461. services/replenishment/__init__.py +1 -0
  462. services/replenishment/main.py +46 -0
  463. services/replenishment/routers/__init__.py +1 -0
  464. services/replenishment/routers/replenishment.py +20 -0
  465. services/shifts/helpers/__init__.py +7 -0
  466. services/shifts/helpers/shift_templates.py +124 -0
  467. services/shifts/helpers/shifts.py +79 -0
  468. services/shifts/helpers/timesheets.py +137 -0
  469. services/shifts/main.py +48 -0
  470. services/shifts/models/__init__.py +8 -0
  471. services/shifts/models/shift.py +62 -0
  472. services/shifts/models/shift_template.py +82 -0
  473. services/shifts/models/time_range.py +31 -0
  474. services/shifts/models/timesheet.py +196 -0
  475. services/shifts/routers/__init__.py +7 -0
  476. services/shifts/routers/shift_templates.py +97 -0
  477. services/shifts/routers/shifts.py +117 -0
  478. services/shifts/routers/timesheets.py +117 -0
  479. services/shipping/helpers/__init__.py +15 -0
  480. services/shipping/helpers/carrier.py +78 -0
  481. services/shipping/helpers/customs_declaration.py +104 -0
  482. services/shipping/helpers/delivery_note.py +99 -0
  483. services/shipping/helpers/package.py +95 -0
  484. services/shipping/helpers/pallet.py +85 -0
  485. services/shipping/helpers/route.py +93 -0
  486. services/shipping/helpers/shipping_information.py +82 -0
  487. services/shipping/helpers/shipping_provider_details.py +59 -0
  488. services/shipping/helpers/shipping_provider_metadata.py +59 -0
  489. services/shipping/helpers/vehicle.py +85 -0
  490. services/shipping/helpers/waybill.py +86 -0
  491. services/shipping/main.py +64 -0
  492. services/shipping/models/__init__.py +15 -0
  493. services/shipping/models/carrier.py +97 -0
  494. services/shipping/models/customs_declaration.py +138 -0
  495. services/shipping/models/delivery_note.py +163 -0
  496. services/shipping/models/package.py +152 -0
  497. services/shipping/models/pallet.py +137 -0
  498. services/shipping/models/route.py +120 -0
  499. services/shipping/models/shipping_information.py +55 -0
  500. services/shipping/models/shipping_provider_details.py +42 -0
  501. services/shipping/models/shipping_provider_metadata.py +54 -0
  502. services/shipping/models/vehicle.py +129 -0
  503. services/shipping/models/waybill.py +189 -0
  504. services/shipping/routers/__init__.py +15 -0
  505. services/shipping/routers/carrier.py +99 -0
  506. services/shipping/routers/customs_declaration.py +132 -0
  507. services/shipping/routers/delivery_note.py +150 -0
  508. services/shipping/routers/package.py +141 -0
  509. services/shipping/routers/pallet.py +108 -0
  510. services/shipping/routers/route.py +128 -0
  511. services/shipping/routers/shipping_information.py +97 -0
  512. services/shipping/routers/shipping_provider_details.py +80 -0
  513. services/shipping/routers/shipping_provider_metadata.py +80 -0
  514. services/shipping/routers/vehicle.py +117 -0
  515. services/shipping/routers/waybill.py +119 -0
  516. services/suppliers/helpers/__init__.py +13 -0
  517. services/suppliers/helpers/supplier_capabilities.py +58 -0
  518. services/suppliers/helpers/supplier_certifications.py +67 -0
  519. services/suppliers/helpers/supplier_details.py +58 -0
  520. services/suppliers/helpers/supplier_financials.py +58 -0
  521. services/suppliers/helpers/supplier_inventory.py +74 -0
  522. services/suppliers/helpers/supplier_locations.py +60 -0
  523. services/suppliers/helpers/supplier_pricing.py +69 -0
  524. services/suppliers/helpers/supplier_quality.py +69 -0
  525. services/suppliers/helpers/supplier_shipping.py +69 -0
  526. services/suppliers/main.py +60 -0
  527. services/suppliers/models/__init__.py +13 -0
  528. services/suppliers/models/supplier_capabilities.py +70 -0
  529. services/suppliers/models/supplier_certifications.py +64 -0
  530. services/suppliers/models/supplier_details.py +75 -0
  531. services/suppliers/models/supplier_financials.py +69 -0
  532. services/suppliers/models/supplier_inventory.py +76 -0
  533. services/suppliers/models/supplier_locations.py +70 -0
  534. services/suppliers/models/supplier_pricing.py +74 -0
  535. services/suppliers/models/supplier_quality.py +74 -0
  536. services/suppliers/models/supplier_shipping.py +76 -0
  537. services/suppliers/routers/__init__.py +13 -0
  538. services/suppliers/routers/supplier_capabilities.py +88 -0
  539. services/suppliers/routers/supplier_certifications.py +87 -0
  540. services/suppliers/routers/supplier_details.py +83 -0
  541. services/suppliers/routers/supplier_financials.py +83 -0
  542. services/suppliers/routers/supplier_inventory.py +105 -0
  543. services/suppliers/routers/supplier_locations.py +89 -0
  544. services/suppliers/routers/supplier_pricing.py +96 -0
  545. services/suppliers/routers/supplier_quality.py +96 -0
  546. services/suppliers/routers/supplier_shipping.py +96 -0
  547. services/supply_allocation/main.py +46 -0
  548. services/supply_allocation/routers/__init__.py +1 -0
  549. services/supply_allocation/routers/allocation.py +20 -0
  550. services/taxonomy/helpers/__init__.py +7 -0
  551. services/taxonomy/helpers/classes.py +48 -0
  552. services/taxonomy/helpers/family.py +53 -0
  553. services/taxonomy/helpers/subclass.py +58 -0
  554. services/taxonomy/main.py +48 -0
  555. services/taxonomy/models/__init__.py +7 -0
  556. services/taxonomy/models/classes.py +52 -0
  557. services/taxonomy/models/family.py +60 -0
  558. services/taxonomy/models/subclass.py +50 -0
  559. services/taxonomy/routers/__init__.py +7 -0
  560. services/taxonomy/routers/classes.py +78 -0
  561. services/taxonomy/routers/family.py +77 -0
  562. services/taxonomy/routers/subclass.py +82 -0
  563. services/warehouse_execution/__init__.py +1 -0
  564. services/warehouse_execution/main.py +46 -0
  565. services/warehouse_execution/routers/__init__.py +1 -0
  566. services/warehouse_execution/routers/execution.py +21 -0
  567. services/work_order_agent/__init__.py +17 -0
  568. services/work_order_agent/agent/__init__.py +17 -0
  569. services/work_order_agent/agent/work_order_agent.py +658 -0
  570. services/work_order_agent/tracking/__init__.py +101 -0
  571. services/work_order_agent/tracking/event_system.py +182 -0
  572. services/work_order_agent/tracking/state_machine.py +163 -0
  573. services/work_order_agent/tracking/state_machine_integrator.py +295 -0
  574. services/work_order_agent/tracking/test_phase2_implementation.py +302 -0
  575. services/work_order_agent/tracking/time_analysis.py +301 -0
  576. services/work_order_agent/tracking/tracked_work_order.py +255 -0
  577. services/work_order_agent/tracking/work_order_adapter.py +367 -0
  578. services/work_order_agent/tracking/work_order_batch_manager.py +406 -0
  579. services/work_order_agent/tracking/work_order_repository.py +431 -0
  580. services/workorders/helpers/__init__.py +5 -0
  581. services/workorders/helpers/area_room_usage_ledger.py +139 -0
  582. services/workorders/helpers/batch_execution_records.py +265 -0
  583. services/workorders/helpers/batch_release_workflows.py +158 -0
  584. services/workorders/helpers/batch_step_executions.py +145 -0
  585. services/workorders/helpers/equipment_usage_ledger.py +209 -0
  586. services/workorders/helpers/executed_bmr_records.py +170 -0
  587. services/workorders/helpers/executed_bpr_records.py +170 -0
  588. services/workorders/helpers/executed_instruction_evidence.py +155 -0
  589. services/workorders/helpers/ipc_result_records.py +134 -0
  590. services/workorders/helpers/production_batches.py +117 -0
  591. services/workorders/helpers/work_orders.py +367 -0
  592. services/workorders/helpers/yield_reconciliation_records.py +158 -0
  593. services/workorders/main.py +110 -0
  594. services/workorders/models/__init__.py +5 -0
  595. services/workorders/models/area_room_usage_ledger.py +154 -0
  596. services/workorders/models/batch_execution_records.py +575 -0
  597. services/workorders/models/batch_release_workflows.py +190 -0
  598. services/workorders/models/batch_step_executions.py +142 -0
  599. services/workorders/models/equipment_usage_ledger.py +144 -0
  600. services/workorders/models/executed_bmr_records.py +220 -0
  601. services/workorders/models/executed_bpr_records.py +220 -0
  602. services/workorders/models/executed_instruction_evidence.py +128 -0
  603. services/workorders/models/ipc_result_records.py +164 -0
  604. services/workorders/models/production_batches.py +181 -0
  605. services/workorders/models/work_orders.py +255 -0
  606. services/workorders/models/yield_reconciliation_records.py +175 -0
  607. services/workorders/routers/__init__.py +5 -0
  608. services/workorders/routers/area_room_usage_ledger.py +117 -0
  609. services/workorders/routers/batch_execution_records.py +103 -0
  610. services/workorders/routers/batch_release_workflows.py +86 -0
  611. services/workorders/routers/batch_step_executions.py +88 -0
  612. services/workorders/routers/equipment_usage_ledger.py +115 -0
  613. services/workorders/routers/executed_bmr_records.py +86 -0
  614. services/workorders/routers/executed_bpr_records.py +86 -0
  615. services/workorders/routers/executed_instruction_evidence.py +86 -0
  616. services/workorders/routers/ipc_result_records.py +86 -0
  617. services/workorders/routers/production_batches.py +86 -0
  618. services/workorders/routers/work_orders.py +257 -0
  619. services/workorders/routers/yield_reconciliation_records.py +86 -0
  620. src/broca/__init__.py +5 -0
  621. src/broca/agent.py +201 -0
  622. src/cerebellum/__init__.py +0 -0
  623. src/cerebellum/adapter.py +84 -0
  624. src/cerebellum/capabilities/__init__.py +0 -0
  625. src/cerebellum/capabilities/agent/__init__.py +0 -0
  626. src/cerebellum/capabilities/agent/agents.py +65 -0
  627. src/cerebellum/capabilities/ai/__init__.py +0 -0
  628. src/cerebellum/capabilities/ai/providers.py +106 -0
  629. src/cerebellum/capabilities/api/__init__.py +0 -0
  630. src/cerebellum/capabilities/api/graphql.py +35 -0
  631. src/cerebellum/capabilities/api/rest_api.py +45 -0
  632. src/cerebellum/capabilities/api/webhook.py +30 -0
  633. src/cerebellum/capabilities/browser/__init__.py +0 -0
  634. src/cerebellum/capabilities/browser/browsers.py +27 -0
  635. src/cerebellum/capabilities/cloud/__init__.py +0 -0
  636. src/cerebellum/capabilities/cloud/cloud.py +46 -0
  637. src/cerebellum/capabilities/communication/__init__.py +0 -0
  638. src/cerebellum/capabilities/communication/communication.py +62 -0
  639. src/cerebellum/capabilities/database/__init__.py +0 -0
  640. src/cerebellum/capabilities/database/elasticsearch.py +40 -0
  641. src/cerebellum/capabilities/database/influxdb.py +37 -0
  642. src/cerebellum/capabilities/database/mongodb.py +50 -0
  643. src/cerebellum/capabilities/database/neo4j.py +32 -0
  644. src/cerebellum/capabilities/database/redis.py +44 -0
  645. src/cerebellum/capabilities/enterprise/__init__.py +0 -0
  646. src/cerebellum/capabilities/enterprise/opensource.py +180 -0
  647. src/cerebellum/capabilities/enterprise/proprietary.py +313 -0
  648. src/cerebellum/capabilities/event_streaming/__init__.py +0 -0
  649. src/cerebellum/capabilities/event_streaming/streaming.py +38 -0
  650. src/cerebellum/capabilities/infrastructure/__init__.py +0 -0
  651. src/cerebellum/capabilities/infrastructure/infrastructure.py +30 -0
  652. src/cerebellum/capabilities/productivity/__init__.py +0 -0
  653. src/cerebellum/capabilities/productivity/productivity.py +158 -0
  654. src/cerebellum/capabilities/robotics/__init__.py +0 -0
  655. src/cerebellum/capabilities/robotics/robotics.py +124 -0
  656. src/cerebellum/capabilities/runtime/__init__.py +0 -0
  657. src/cerebellum/capabilities/runtime/runtimes.py +92 -0
  658. src/cerebellum/capabilities/search/__init__.py +0 -0
  659. src/cerebellum/capabilities/search/search.py +63 -0
  660. src/cerebellum/capabilities/source_control/__init__.py +0 -0
  661. src/cerebellum/capabilities/source_control/source_control.py +113 -0
  662. src/cerebellum/capabilities/storage/__init__.py +0 -0
  663. src/cerebellum/capabilities/storage/storage.py +94 -0
  664. src/cerebellum/capabilities/workflow/__init__.py +0 -0
  665. src/cerebellum/capabilities/workflow/workflows.py +49 -0
  666. src/cerebellum/capability.py +108 -0
  667. src/cerebellum/config.py +157 -0
  668. src/cerebellum/fallback.py +147 -0
  669. src/cerebellum/fallback_engine.py +121 -0
  670. src/cerebellum/key_manager.py +129 -0
  671. src/cerebellum/keystore.py +179 -0
  672. src/cerebellum/lifecycle.py +54 -0
  673. src/cerebellum/metadata.py +61 -0
  674. src/cerebellum/operator/base.py +25 -0
  675. src/cerebellum/peripheral.py +92 -0
  676. src/cerebellum/registry.py +98 -0
  677. src/cerebellum/resolve_entity_capability.py +259 -0
  678. src/cingulate/benchmark/__init__.py +23 -0
  679. src/cingulate/benchmark/reporter.py +102 -0
  680. src/cingulate/benchmark/runner.py +159 -0
  681. src/cingulate/benchmark/scenario_runner.py +150 -0
  682. src/cingulate/benchmark/validator.py +102 -0
  683. src/cingulate/governance/__init__.py +21 -0
  684. src/cingulate/governance/architecture_validator.py +194 -0
  685. src/cingulate/governance/compliance.py +104 -0
  686. src/cingulate/governance/governance.py +77 -0
  687. src/cingulate/governance/policy_registry.py +91 -0
  688. src/cortex/__init__.py +33 -0
  689. src/cortex/cost.py +71 -0
  690. src/cortex/counterfactual.py +162 -0
  691. src/cortex/digital_twin.py +90 -0
  692. src/cortex/experience.py +83 -0
  693. src/cortex/feedback.py +144 -0
  694. src/cortex/loss.py +116 -0
  695. src/cortex/prediction.py +142 -0
  696. src/cortex/replay.py +130 -0
  697. src/cortex/reward.py +113 -0
  698. src/cortex/simulator.py +102 -0
  699. src/cortex/world_model.py +180 -0
  700. src/cortex/world_model_simulation.py +1591 -0
  701. src/cortex/world_state.py +121 -0
  702. src/cortex/xavier.py +250 -0
  703. src/deepdive/__init__.py +29 -0
  704. src/deepdive/aggregation.py +113 -0
  705. src/deepdive/digital_twin_aggregator.py +128 -0
  706. src/deepdive/elasticsearch_adapter.py +110 -0
  707. src/deepdive/fleet_analytics.py +131 -0
  708. src/deepdive/knowledge_aggregator.py +130 -0
  709. src/homeostasis/__init__.py +19 -0
  710. src/homeostasis/control_plane.py +159 -0
  711. src/introspection/__init__.py +38 -0
  712. src/introspection/alerting.py +142 -0
  713. src/introspection/health.py +101 -0
  714. src/introspection/lemon.py +243 -0
  715. src/introspection/logging.py +147 -0
  716. src/introspection/metrics.py +106 -0
  717. src/introspection/tracing.py +162 -0
  718. src/monkey_brain/__init__.py +1 -0
  719. src/monkey_brain/api/main.py +148 -0
  720. src/monkey_brain/api/models.py +81 -0
  721. src/monkey_brain/api/routes/routes/keys.py +106 -0
  722. src/monkey_brain/api/routes/routes/run.py +169 -0
  723. src/monkey_brain/api/routes/routes/simulate.py +485 -0
  724. src/monkey_brain/dlm/__init__.py +44 -0
  725. src/monkey_brain/dlm/dlm.py +139 -0
  726. src/monkey_brain/dlm/gc.py +115 -0
  727. src/monkey_brain/dlm/lifecycle.py +149 -0
  728. src/monkey_brain/dlm/orphans.py +99 -0
  729. src/monkey_brain/dlm/storage.py +149 -0
  730. src/monkey_brain/dlm/ttl.py +140 -0
  731. src/monkey_brain/documents/__init__.py +0 -0
  732. src/monkey_brain/documents/document_ocr.py +6 -0
  733. src/monkey_brain/kernel/__init__.py +53 -0
  734. src/monkey_brain/kernel/capability_interface.py +144 -0
  735. src/monkey_brain/kernel/classifier/__init__.py +1 -0
  736. src/monkey_brain/kernel/classifier/embed_classifier.py +125 -0
  737. src/monkey_brain/kernel/classifier/intent_examples.py +106 -0
  738. src/monkey_brain/kernel/dag.py +23 -0
  739. src/monkey_brain/kernel/execution_state.py +257 -0
  740. src/monkey_brain/kernel/goal_planner.py +85 -0
  741. src/monkey_brain/kernel/goal_router.py +20 -0
  742. src/monkey_brain/kernel/goals/__init__.py +1 -0
  743. src/monkey_brain/kernel/goals/goal.py +130 -0
  744. src/monkey_brain/kernel/goals/goal_bootstrap.py +38 -0
  745. src/monkey_brain/kernel/goals/goal_classifier.py +132 -0
  746. src/monkey_brain/kernel/goals/goal_registry.py +75 -0
  747. src/monkey_brain/kernel/intents/__init__.py +1 -0
  748. src/monkey_brain/kernel/intents/event_adapter.py +246 -0
  749. src/monkey_brain/kernel/intents/helpers.py +13 -0
  750. src/monkey_brain/kernel/intents/intent_registry.py +705 -0
  751. src/monkey_brain/kernel/intents/intent_router.py +102 -0
  752. src/monkey_brain/kernel/intents/predicates/approval_create.py +9 -0
  753. src/monkey_brain/kernel/intents/predicates/approval_decision.py +9 -0
  754. src/monkey_brain/kernel/intents/predicates/approval_hold.py +9 -0
  755. src/monkey_brain/kernel/intents/predicates/approval_query.py +9 -0
  756. src/monkey_brain/kernel/intents/predicates/batch_close.py +9 -0
  757. src/monkey_brain/kernel/intents/predicates/batch_creation.py +9 -0
  758. src/monkey_brain/kernel/intents/predicates/batch_delete.py +9 -0
  759. src/monkey_brain/kernel/intents/predicates/batch_hold.py +9 -0
  760. src/monkey_brain/kernel/intents/predicates/batch_record.py +9 -0
  761. src/monkey_brain/kernel/intents/predicates/batch_update.py +9 -0
  762. src/monkey_brain/kernel/intents/predicates/change_control.py +49 -0
  763. src/monkey_brain/kernel/intents/predicates/compliance_audit.py +14 -0
  764. src/monkey_brain/kernel/intents/predicates/decision_intelligence.py +9 -0
  765. src/monkey_brain/kernel/intents/predicates/drug_research.py +9 -0
  766. src/monkey_brain/kernel/intents/predicates/fuzzy_match.py +19 -0
  767. src/monkey_brain/kernel/intents/predicates/production_kpi.py +9 -0
  768. src/monkey_brain/kernel/intents/predicates/sop_create.py +9 -0
  769. src/monkey_brain/kernel/intents/predicates/sop_query.py +9 -0
  770. src/monkey_brain/kernel/intents/predicates/sop_update.py +9 -0
  771. src/monkey_brain/kernel/intents/predicates/warehouse_shipping.py +9 -0
  772. src/monkey_brain/kernel/intents/predicates/work_order_create.py +9 -0
  773. src/monkey_brain/kernel/intents/predicates/work_order_delete.py +9 -0
  774. src/monkey_brain/kernel/intents/predicates/work_order_hold.py +9 -0
  775. src/monkey_brain/kernel/intents/predicates/work_order_query.py +9 -0
  776. src/monkey_brain/kernel/intents/predicates/work_order_status.py +9 -0
  777. src/monkey_brain/kernel/intents/predicates/work_order_update.py +9 -0
  778. src/monkey_brain/kernel/intents/predicates/worker.py +9 -0
  779. src/monkey_brain/kernel/intents/telemetry_adapter.py +274 -0
  780. src/monkey_brain/kernel/intents/utils.py +68 -0
  781. src/monkey_brain/kernel/learning.py +98 -0
  782. src/monkey_brain/kernel/llm_explorer.py +188 -0
  783. src/monkey_brain/kernel/loss.py +81 -0
  784. src/monkey_brain/kernel/nlp/__init__.py +1 -0
  785. src/monkey_brain/kernel/nlp/compat.py +23 -0
  786. src/monkey_brain/kernel/nlp/models.py +10 -0
  787. src/monkey_brain/kernel/nlp/question_analyzer.py +203 -0
  788. src/monkey_brain/kernel/nlp/spacy_parser.py +53 -0
  789. src/monkey_brain/kernel/observer.py +97 -0
  790. src/monkey_brain/kernel/parser/__init__.py +3 -0
  791. src/monkey_brain/kernel/parser/ast.py +28 -0
  792. src/monkey_brain/kernel/parser/extractors/__init__.py +11 -0
  793. src/monkey_brain/kernel/parser/extractors/entities.py +21 -0
  794. src/monkey_brain/kernel/parser/extractors/filters.py +16 -0
  795. src/monkey_brain/kernel/parser/extractors/projections.py +36 -0
  796. src/monkey_brain/kernel/parser/extractors/verbs.py +31 -0
  797. src/monkey_brain/kernel/parser/parser.py +57 -0
  798. src/monkey_brain/kernel/parser/rules.py +75 -0
  799. src/monkey_brain/kernel/pipeline.py +44 -0
  800. src/monkey_brain/kernel/planner.py +57 -0
  801. src/monkey_brain/kernel/rl/__init__.py +33 -0
  802. src/monkey_brain/kernel/rl/learner.py +98 -0
  803. src/monkey_brain/kernel/rl/policy.py +254 -0
  804. src/monkey_brain/kernel/rl/reward.py +117 -0
  805. src/monkey_brain/kernel/rl/transition.py +112 -0
  806. src/monkey_brain/persistence/__init__.py +47 -0
  807. src/monkey_brain/persistence/adapters.py +49 -0
  808. src/monkey_brain/persistence/events.py +105 -0
  809. src/monkey_brain/persistence/manager.py +124 -0
  810. src/monkey_brain/persistence/mongodb_adapter.py +91 -0
  811. src/monkey_brain/persistence/redis_adapter.py +93 -0
  812. src/monkey_brain/persistence/reducer.py +111 -0
  813. src/monkey_brain/runtime/__init__.py +49 -0
  814. src/monkey_brain/runtime/depedencies.py +8 -0
  815. src/monkey_brain/runtime/engine.py +183 -0
  816. src/monkey_brain/runtime/message_bus.py +82 -0
  817. src/monkey_brain/runtime/process.py +144 -0
  818. src/monkey_brain/runtime/resource_manager.py +100 -0
  819. src/monkey_brain/runtime/routers.py +8 -0
  820. src/monkey_brain/runtime/runtime.py +199 -0
  821. src/monkey_brain/runtime/scheduler.py +165 -0
  822. src/monkey_brain/runtime/supervisor.py +133 -0
  823. src/monkey_brain/runtime/worker_pool.py +111 -0
  824. src/plasticity/seed/__init__.py +30 -0
  825. src/plasticity/seed/benchmark_generator.py +105 -0
  826. src/plasticity/seed/event_generator.py +122 -0
  827. src/plasticity/seed/scenario_builder.py +134 -0
  828. src/plasticity/seed/seed_data.py +206 -0
  829. src/plasticity/seed/seeder.py +122 -0
  830. src/plasticity/testing/__init__.py +28 -0
  831. src/plasticity/testing/performance.py +131 -0
  832. src/plasticity/testing/profiler.py +255 -0
  833. src/plasticity/testing/reporter.py +84 -0
  834. src/plasticity/testing/runner.py +209 -0
  835. src/sync/__init__.py +12 -0
  836. src/sync/cloud_aggregator.py +63 -0
  837. src/sync/edge_node.py +51 -0
  838. src/sync/sync_manager.py +74 -0
@@ -0,0 +1,658 @@
1
+ """
2
+ Batch Work Order Agent
3
+
4
+ Generates work orders for each step in a batch workflow execution.
5
+ Enables human operators to understand what work needs to be done and when.
6
+ """
7
+
8
+ import logging
9
+ from datetime import datetime, timedelta, timezone
10
+ from enum import Enum
11
+ from typing import Any, Dict, List, Optional
12
+ from uuid import uuid4
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+ # Import state machine integration
17
+ try:
18
+ from services.work_order_agent.tracking.event_system import (
19
+ WorkOrderEventBus,
20
+ )
21
+ from services.work_order_agent.tracking.state_machine_integrator import (
22
+ InvalidStateTransitionError,
23
+ StateMachineIntegrator,
24
+ )
25
+ except ImportError:
26
+ # Optional dependencies - not all contexts may have these
27
+ StateMachineIntegrator = None
28
+ InvalidStateTransitionError = None
29
+ WorkOrderEventBus = None
30
+
31
+
32
+ class WorkOrderGenerationStrategy(Enum):
33
+ """Strategy for generating work orders."""
34
+
35
+ PARALLEL = "parallel" # All work orders generated before workflow starts
36
+ SEQUENTIAL = "sequential" # Work order generated as step completes
37
+ ON_DEMAND = "on_demand" # Work order generated when requested
38
+
39
+
40
+ class WorkOrderStatus(Enum):
41
+ """Status of a generated work order."""
42
+
43
+ CREATED = "created"
44
+ ASSIGNED = "assigned"
45
+ IN_PROGRESS = "in_progress"
46
+ COMPLETED = "completed"
47
+ REJECTED = "rejected"
48
+ ON_HOLD = "on_hold"
49
+
50
+
51
+ class WorkOrderPriority(Enum):
52
+ """Priority of a work order."""
53
+
54
+ LOW = "Low"
55
+ MEDIUM = "Medium"
56
+ HIGH = "High"
57
+ CRITICAL = "Critical"
58
+
59
+
60
+ class GeneratedWorkOrder:
61
+ """A work order generated for a batch workflow step."""
62
+
63
+ def __init__(
64
+ self,
65
+ work_order_id: str,
66
+ step_id: str,
67
+ step_name: str,
68
+ batch_id: str,
69
+ execution_id: str,
70
+ description: str,
71
+ owner_role: str,
72
+ estimated_duration_minutes: int,
73
+ dependencies: List[str],
74
+ quality_checkpoints: List[str],
75
+ priority: WorkOrderPriority = WorkOrderPriority.MEDIUM,
76
+ event_bus: Optional["WorkOrderEventBus"] = None,
77
+ ):
78
+ self.work_order_id = work_order_id
79
+ self.step_id = step_id
80
+ self.step_name = step_name
81
+ self.batch_id = batch_id
82
+ self.execution_id = execution_id
83
+ self.description = description
84
+ self.owner_role = owner_role
85
+ self.estimated_duration_minutes = estimated_duration_minutes
86
+ self.dependencies = dependencies
87
+ self.quality_checkpoints = quality_checkpoints
88
+ self.priority = priority
89
+
90
+ # Status tracking
91
+ self.status = WorkOrderStatus.CREATED
92
+ self.assigned_to = None
93
+ self.assigned_user_id = None
94
+ self.assigned_user_name = None
95
+ self.assigned_team_id = None
96
+ self.assigned_team_name = None
97
+
98
+ # Timing
99
+ self.created_at = datetime.now(timezone.utc)
100
+ self.expected_completion = self.created_at + timedelta(
101
+ minutes=estimated_duration_minutes
102
+ )
103
+ self.started_at = None
104
+ self.completed_at = None
105
+
106
+ # Execution tracking
107
+ self.remarks = None
108
+ self.attachments: List[str] = []
109
+ self.qc_checks_completed: List[str] = []
110
+
111
+ # State machine integration (optional, only if event_bus provided)
112
+ self.state_machine_integrator: Optional[StateMachineIntegrator] = None
113
+ if StateMachineIntegrator is not None and event_bus is not None:
114
+ self.state_machine_integrator = StateMachineIntegrator(
115
+ work_order_id=work_order_id,
116
+ step_id=step_id,
117
+ batch_id=batch_id,
118
+ execution_id=execution_id,
119
+ event_bus=event_bus,
120
+ )
121
+
122
+ # Hold state tracking
123
+ self.on_hold_reason: Optional[str] = None
124
+ self.held_at: Optional[datetime] = None
125
+
126
+ def assign_to_user(
127
+ self,
128
+ user_id: str,
129
+ user_name: str,
130
+ assigned_to: Optional[str] = None,
131
+ ) -> bool:
132
+ """Assign work order to a user.
133
+
134
+ Returns:
135
+ True if assignment succeeded, False if state machine transition failed.
136
+ """
137
+ # Transition state machine first if available
138
+ if self.state_machine_integrator:
139
+ try:
140
+ success = self.state_machine_integrator.assign(
141
+ user_id=user_id, user_name=user_name
142
+ )
143
+ if not success:
144
+ logger.warning(
145
+ f"State machine transition failed for {self.work_order_id}"
146
+ )
147
+ # For backward compatibility, still update status if integrator fails
148
+ # This allows old code paths without event bus to still work
149
+ except InvalidStateTransitionError as e:
150
+ logger.error(f"Failed to assign work order: {e}")
151
+ # For backward compatibility, continue even if state machine fails
152
+
153
+ # Update status after successful transition
154
+ self.assigned_user_id = user_id
155
+ self.assigned_user_name = user_name
156
+ self.assigned_to = assigned_to or user_name
157
+ self.status = WorkOrderStatus.ASSIGNED
158
+
159
+ logger.info(f"Work order {self.work_order_id} assigned to {user_name}")
160
+ return True
161
+
162
+ def assign_to_team(
163
+ self,
164
+ team_id: str,
165
+ team_name: str,
166
+ ) -> bool:
167
+ """Assign work order to a team.
168
+
169
+ Returns:
170
+ True if assignment succeeded, False if state machine transition failed.
171
+ """
172
+ # Transition state machine first if available
173
+ if self.state_machine_integrator:
174
+ try:
175
+ success = self.state_machine_integrator.assign(
176
+ team_id=team_id, team_name=team_name
177
+ )
178
+ if not success:
179
+ logger.warning(
180
+ f"State machine transition failed for {self.work_order_id}"
181
+ )
182
+ # For backward compatibility, still update status if integrator fails
183
+ except InvalidStateTransitionError as e:
184
+ logger.error(f"Failed to assign work order to team: {e}")
185
+ # For backward compatibility, continue even if state machine fails
186
+
187
+ # Update status after successful transition
188
+ self.assigned_team_id = team_id
189
+ self.assigned_team_name = team_name
190
+ self.assigned_to = team_name
191
+ self.status = WorkOrderStatus.ASSIGNED
192
+
193
+ logger.info(f"Work order {self.work_order_id} assigned to team {team_name}")
194
+ return True
195
+
196
+ def mark_in_progress(self) -> bool:
197
+ """Mark work order as in progress.
198
+
199
+ Returns:
200
+ True if transition succeeded, False if state machine transition failed.
201
+ """
202
+ # Transition state machine first if available
203
+ if self.state_machine_integrator:
204
+ try:
205
+ success = self.state_machine_integrator.start()
206
+ if not success:
207
+ logger.warning(
208
+ f"State machine transition failed for {self.work_order_id}"
209
+ )
210
+ # For backward compatibility, still update status if integrator fails
211
+ except InvalidStateTransitionError as e:
212
+ logger.error(f"Failed to mark work order in progress: {e}")
213
+ # For backward compatibility, continue even if state machine fails
214
+
215
+ # Update status after successful transition
216
+ self.status = WorkOrderStatus.IN_PROGRESS
217
+ self.started_at = datetime.now(timezone.utc)
218
+
219
+ logger.info(f"Work order {self.work_order_id} marked in progress")
220
+ return True
221
+
222
+ def complete(self, remarks: Optional[str] = None) -> bool:
223
+ """Mark work order as completed.
224
+
225
+ Returns:
226
+ True if completion succeeded, False if state machine transition failed.
227
+ """
228
+ # Transition state machine first if available
229
+ if self.state_machine_integrator:
230
+ try:
231
+ success = self.state_machine_integrator.complete(remarks=remarks)
232
+ if not success:
233
+ logger.warning(
234
+ f"State machine transition failed for {self.work_order_id}"
235
+ )
236
+ # For backward compatibility, still update status if integrator fails
237
+ except InvalidStateTransitionError as e:
238
+ logger.error(f"Failed to complete work order: {e}")
239
+ # For backward compatibility, continue even if state machine fails
240
+
241
+ # Update status after successful transition
242
+ self.status = WorkOrderStatus.COMPLETED
243
+ self.completed_at = datetime.now(timezone.utc)
244
+ if remarks:
245
+ self.remarks = remarks
246
+
247
+ logger.info(f"Work order {self.work_order_id} completed")
248
+ return True
249
+
250
+ def reject(self, remarks: str) -> bool:
251
+ """Reject the work order.
252
+
253
+ Returns:
254
+ True if rejection succeeded, False if state machine transition failed.
255
+ """
256
+ # Transition state machine first if available
257
+ if self.state_machine_integrator:
258
+ try:
259
+ success = self.state_machine_integrator.reject(remarks=remarks)
260
+ if not success:
261
+ logger.warning(
262
+ f"State machine transition failed for {self.work_order_id}"
263
+ )
264
+ # For backward compatibility, still update status if integrator fails
265
+ except InvalidStateTransitionError as e:
266
+ logger.error(f"Failed to reject work order: {e}")
267
+ # For backward compatibility, continue even if state machine fails
268
+
269
+ # Update status after successful transition
270
+ self.status = WorkOrderStatus.REJECTED
271
+ self.remarks = remarks
272
+
273
+ logger.warning(f"Work order {self.work_order_id} rejected: {remarks}")
274
+ return True
275
+
276
+ def hold(self, reason: str) -> bool:
277
+ """Place work order on hold.
278
+
279
+ Returns:
280
+ True if hold succeeded, False if state machine transition failed.
281
+ """
282
+ # Transition state machine first if available
283
+ if self.state_machine_integrator:
284
+ try:
285
+ success = self.state_machine_integrator.hold(reason=reason)
286
+ if not success:
287
+ logger.warning(
288
+ f"State machine transition failed for {self.work_order_id}"
289
+ )
290
+ # For backward compatibility, still update status if integrator fails
291
+ except InvalidStateTransitionError as e:
292
+ logger.error(f"Failed to hold work order: {e}")
293
+ # For backward compatibility, continue even if state machine fails
294
+
295
+ # Update status after successful transition
296
+ self.status = WorkOrderStatus.ON_HOLD
297
+ self.on_hold_reason = reason
298
+ self.held_at = datetime.now(timezone.utc)
299
+
300
+ logger.info(f"Work order {self.work_order_id} placed on hold: {reason}")
301
+ return True
302
+
303
+ def resume(self) -> bool:
304
+ """Resume work order from hold.
305
+
306
+ Returns:
307
+ True if resume succeeded, False if state machine transition failed.
308
+ """
309
+ if self.status != WorkOrderStatus.ON_HOLD:
310
+ logger.error(
311
+ f"Cannot resume work order {self.work_order_id}: not in ON_HOLD state"
312
+ )
313
+ return False
314
+
315
+ # Transition state machine first if available
316
+ if self.state_machine_integrator:
317
+ try:
318
+ success = self.state_machine_integrator.resume()
319
+ if not success:
320
+ logger.warning(
321
+ f"State machine transition failed for {self.work_order_id}"
322
+ )
323
+ # For backward compatibility, still update status if integrator fails
324
+ except InvalidStateTransitionError as e:
325
+ logger.error(f"Failed to resume work order: {e}")
326
+ # For backward compatibility, continue even if state machine fails
327
+
328
+ # Update status after successful transition
329
+ self.status = WorkOrderStatus.IN_PROGRESS
330
+ self.on_hold_reason = None
331
+ self.held_at = None
332
+
333
+ logger.info(f"Work order {self.work_order_id} resumed from hold")
334
+ return True
335
+
336
+ def add_qc_check_result(self, checkpoint_name: str):
337
+ """Record a completed QC check."""
338
+ self.qc_checks_completed.append(checkpoint_name)
339
+
340
+ def add_attachment(self, attachment_path: str):
341
+ """Add an attachment to the work order."""
342
+ self.attachments.append(attachment_path)
343
+
344
+ def get_overdue_status(self) -> bool:
345
+ """Check if work order is overdue."""
346
+ if self.status in [WorkOrderStatus.COMPLETED, WorkOrderStatus.REJECTED]:
347
+ return False
348
+ return datetime.now(timezone.utc) > self.expected_completion
349
+
350
+ def to_workorder_api_format(self) -> Dict[str, Any]:
351
+ """Convert to work order service API format."""
352
+ return {
353
+ "work_order_id": self.work_order_id,
354
+ "title": f"{self.step_name} - Batch {self.batch_id}",
355
+ "message": self.description,
356
+ "work_order_type": "Other",
357
+ "status": self._status_to_api_status(self.status),
358
+ "priority": self.priority.value,
359
+ "product_id": self.batch_id,
360
+ "assigned_to": self.assigned_to,
361
+ "assigned_user_id": self.assigned_user_id,
362
+ "assigned_user_name": self.assigned_user_name,
363
+ "assigned_team_id": self.assigned_team_id,
364
+ "assigned_team_name": self.assigned_team_name,
365
+ "created_at": self.created_at.isoformat(),
366
+ "expected_completion": self.expected_completion.isoformat(),
367
+ "started_at": self.started_at.isoformat() if self.started_at else None,
368
+ "completed_at": self.completed_at.isoformat()
369
+ if self.completed_at
370
+ else None,
371
+ "total_time_hrs": (
372
+ (self.completed_at - self.started_at).total_seconds() / 3600
373
+ if self.started_at and self.completed_at
374
+ else None
375
+ ),
376
+ "remarks": self.remarks
377
+ or f"QC Checks: {', '.join(self.quality_checkpoints)}",
378
+ "attachments": self.attachments,
379
+ "is_overdue": self.get_overdue_status(),
380
+ }
381
+
382
+ @staticmethod
383
+ def _status_to_api_status(status: WorkOrderStatus) -> str:
384
+ """Convert internal status to work order API status."""
385
+ mapping = {
386
+ WorkOrderStatus.CREATED: "Todo",
387
+ WorkOrderStatus.ASSIGNED: "Todo",
388
+ WorkOrderStatus.IN_PROGRESS: "In Progress",
389
+ WorkOrderStatus.COMPLETED: "Done",
390
+ WorkOrderStatus.REJECTED: "Rejected",
391
+ WorkOrderStatus.ON_HOLD: "On Hold",
392
+ }
393
+ return mapping.get(status, "Todo")
394
+
395
+ def get_state_machine_summary(self) -> Optional[Dict[str, Any]]:
396
+ """Get state machine summary if integrator is available."""
397
+ if self.state_machine_integrator:
398
+ return self.state_machine_integrator.get_summary()
399
+ return None
400
+
401
+ def to_dict(self) -> Dict[str, Any]:
402
+ """Convert to dictionary."""
403
+ result = {
404
+ "work_order_id": self.work_order_id,
405
+ "step_id": self.step_id,
406
+ "step_name": self.step_name,
407
+ "batch_id": self.batch_id,
408
+ "execution_id": self.execution_id,
409
+ "description": self.description,
410
+ "owner_role": self.owner_role,
411
+ "estimated_duration_minutes": self.estimated_duration_minutes,
412
+ "dependencies": self.dependencies,
413
+ "quality_checkpoints": self.quality_checkpoints,
414
+ "priority": self.priority.value,
415
+ "status": self.status.value,
416
+ "assigned_to": self.assigned_to,
417
+ "assigned_user_id": self.assigned_user_id,
418
+ "assigned_user_name": self.assigned_user_name,
419
+ "assigned_team_id": self.assigned_team_id,
420
+ "assigned_team_name": self.assigned_team_name,
421
+ "created_at": self.created_at.isoformat(),
422
+ "expected_completion": self.expected_completion.isoformat(),
423
+ "started_at": self.started_at.isoformat() if self.started_at else None,
424
+ "completed_at": self.completed_at.isoformat()
425
+ if self.completed_at
426
+ else None,
427
+ "remarks": self.remarks,
428
+ "attachments": self.attachments,
429
+ "qc_checks_completed": self.qc_checks_completed,
430
+ "is_overdue": self.get_overdue_status(),
431
+ "on_hold_reason": self.on_hold_reason,
432
+ "held_at": self.held_at.isoformat() if self.held_at else None,
433
+ }
434
+
435
+ # Add state machine summary if available
436
+ if self.state_machine_integrator:
437
+ result["state_machine"] = self.state_machine_integrator.to_dict()
438
+
439
+ return result
440
+
441
+
442
+ class BatchWorkOrderAgent:
443
+ """
444
+ Agent that generates work orders for batch workflow steps.
445
+
446
+ Responsibilities:
447
+ - Generate work orders from workflow steps
448
+ - Track work order status
449
+ - Link work orders to batch execution
450
+ - Enable operator assignment and completion tracking
451
+ """
452
+
453
+ def __init__(
454
+ self,
455
+ batch_id: str,
456
+ execution_id: str,
457
+ workflow_id: str,
458
+ strategy: WorkOrderGenerationStrategy = WorkOrderGenerationStrategy.PARALLEL,
459
+ event_bus: Optional["WorkOrderEventBus"] = None,
460
+ ):
461
+ self.batch_id = batch_id
462
+ self.execution_id = execution_id
463
+ self.workflow_id = workflow_id
464
+ self.strategy = strategy
465
+ self.event_bus = event_bus
466
+
467
+ self.work_orders: Dict[str, GeneratedWorkOrder] = {}
468
+ self.work_order_by_step: Dict[str, str] = {} # step_id -> work_order_id
469
+
470
+ self.created_at = datetime.now(timezone.utc)
471
+ self.generation_log: List[Dict[str, Any]] = []
472
+
473
+ def generate_work_orders(
474
+ self,
475
+ workflow_steps: List[Dict[str, Any]],
476
+ ) -> List[GeneratedWorkOrder]:
477
+ """
478
+ Generate work orders for all workflow steps.
479
+
480
+ Args:
481
+ workflow_steps: List of workflow step definitions
482
+
483
+ Returns:
484
+ List of generated work orders
485
+ """
486
+ generated_orders = []
487
+
488
+ for step_data in workflow_steps:
489
+ work_order = self._create_work_order_from_step(step_data)
490
+ generated_orders.append(work_order)
491
+ self.work_orders[work_order.work_order_id] = work_order
492
+ self.work_order_by_step[step_data["step_id"]] = work_order.work_order_id
493
+
494
+ self.generation_log.append(
495
+ {
496
+ "timestamp": datetime.now(timezone.utc).isoformat(),
497
+ "action": "generated",
498
+ "step_id": step_data["step_id"],
499
+ "work_order_id": work_order.work_order_id,
500
+ }
501
+ )
502
+
503
+ logger.info(
504
+ f"Generated work order {work_order.work_order_id} for step {step_data['step_id']}"
505
+ )
506
+
507
+ return generated_orders
508
+
509
+ def _create_work_order_from_step(
510
+ self,
511
+ step_data: Dict[str, Any],
512
+ ) -> GeneratedWorkOrder:
513
+ """Create a work order from workflow step data."""
514
+ work_order_id = f"WO-{self.batch_id}-{step_data['step_id']}-{uuid4().hex[:8]}"
515
+
516
+ # Determine priority based on step
517
+ priority = self._determine_priority(step_data)
518
+
519
+ work_order = GeneratedWorkOrder(
520
+ work_order_id=work_order_id,
521
+ step_id=step_data["step_id"],
522
+ step_name=step_data["name"],
523
+ batch_id=self.batch_id,
524
+ execution_id=self.execution_id,
525
+ description=step_data.get("description", ""),
526
+ owner_role=step_data.get("operator_role", "operator"),
527
+ estimated_duration_minutes=step_data.get("estimated_duration_minutes", 0),
528
+ dependencies=step_data.get("dependencies", []),
529
+ quality_checkpoints=step_data.get("quality_checkpoints", []),
530
+ priority=priority,
531
+ event_bus=self.event_bus,
532
+ )
533
+
534
+ return work_order
535
+
536
+ def _determine_priority(self, step_data: Dict[str, Any]) -> WorkOrderPriority:
537
+ """Determine work order priority based on step."""
538
+ # Steps with QC checkpoints or critical processes get higher priority
539
+ qc_count = len(step_data.get("quality_checkpoints", []))
540
+ step_name = step_data.get("name", "").lower()
541
+
542
+ if "final" in step_name or "release" in step_name:
543
+ return WorkOrderPriority.CRITICAL
544
+ elif qc_count >= 3:
545
+ return WorkOrderPriority.HIGH
546
+ elif qc_count >= 1:
547
+ return WorkOrderPriority.MEDIUM
548
+ else:
549
+ return WorkOrderPriority.LOW
550
+
551
+ def get_work_order(self, work_order_id: str) -> Optional[GeneratedWorkOrder]:
552
+ """Get a work order by ID."""
553
+ return self.work_orders.get(work_order_id)
554
+
555
+ def get_work_order_by_step(self, step_id: str) -> Optional[GeneratedWorkOrder]:
556
+ """Get work order for a specific step."""
557
+ wo_id = self.work_order_by_step.get(step_id)
558
+ if wo_id:
559
+ return self.work_orders.get(wo_id)
560
+ return None
561
+
562
+ def get_pending_work_orders(self) -> List[GeneratedWorkOrder]:
563
+ """Get all pending work orders."""
564
+ return [
565
+ wo
566
+ for wo in self.work_orders.values()
567
+ if wo.status in [WorkOrderStatus.CREATED, WorkOrderStatus.ASSIGNED]
568
+ ]
569
+
570
+ def get_on_hold_work_orders(self) -> List[GeneratedWorkOrder]:
571
+ """Get all on-hold work orders."""
572
+ return [
573
+ wo
574
+ for wo in self.work_orders.values()
575
+ if wo.status == WorkOrderStatus.ON_HOLD
576
+ ]
577
+
578
+ def get_in_progress_work_orders(self) -> List[GeneratedWorkOrder]:
579
+ """Get all in-progress work orders."""
580
+ return [
581
+ wo
582
+ for wo in self.work_orders.values()
583
+ if wo.status == WorkOrderStatus.IN_PROGRESS
584
+ ]
585
+
586
+ def get_completed_work_orders(self) -> List[GeneratedWorkOrder]:
587
+ """Get all completed work orders."""
588
+ return [
589
+ wo
590
+ for wo in self.work_orders.values()
591
+ if wo.status == WorkOrderStatus.COMPLETED
592
+ ]
593
+
594
+ def get_overdue_work_orders(self) -> List[GeneratedWorkOrder]:
595
+ """Get all overdue work orders."""
596
+ return [wo for wo in self.work_orders.values() if wo.get_overdue_status()]
597
+
598
+ def get_summary(self) -> Dict[str, Any]:
599
+ """Get work order generation summary."""
600
+ total = len(self.work_orders)
601
+ created = len(
602
+ [
603
+ wo
604
+ for wo in self.work_orders.values()
605
+ if wo.status == WorkOrderStatus.CREATED
606
+ ]
607
+ )
608
+ assigned = len(
609
+ [
610
+ wo
611
+ for wo in self.work_orders.values()
612
+ if wo.status == WorkOrderStatus.ASSIGNED
613
+ ]
614
+ )
615
+ in_progress = len(self.get_in_progress_work_orders())
616
+ completed = len(self.get_completed_work_orders())
617
+ rejected = len(
618
+ [
619
+ wo
620
+ for wo in self.work_orders.values()
621
+ if wo.status == WorkOrderStatus.REJECTED
622
+ ]
623
+ )
624
+ overdue = len(self.get_overdue_work_orders())
625
+
626
+ on_hold = len(self.get_on_hold_work_orders())
627
+
628
+ return {
629
+ "batch_id": self.batch_id,
630
+ "execution_id": self.execution_id,
631
+ "workflow_id": self.workflow_id,
632
+ "strategy": self.strategy.value,
633
+ "created_at": self.created_at.isoformat(),
634
+ "total_work_orders": total,
635
+ "created": created,
636
+ "assigned": assigned,
637
+ "in_progress": in_progress,
638
+ "on_hold": on_hold,
639
+ "completed": completed,
640
+ "rejected": rejected,
641
+ "overdue": overdue,
642
+ "completion_rate": f"{(completed / total * 100):.1f}%"
643
+ if total > 0
644
+ else "N/A",
645
+ }
646
+
647
+ def to_dict(self) -> Dict[str, Any]:
648
+ """Convert to dictionary."""
649
+ return {
650
+ "batch_id": self.batch_id,
651
+ "execution_id": self.execution_id,
652
+ "workflow_id": self.workflow_id,
653
+ "strategy": self.strategy.value,
654
+ "created_at": self.created_at.isoformat(),
655
+ "work_orders": [wo.to_dict() for wo in self.work_orders.values()],
656
+ "summary": self.get_summary(),
657
+ "generation_log": self.generation_log,
658
+ }