1212
1313from jobflow import JobStore , initialize_logger
1414from jobflow .core .flow import get_flow
15+ from monty .design_patterns import singleton
1516from monty .os import cd
1617from monty .serialization import dumpfn , loadfn
1718from monty .shutil import decompress_file
1819
1920from jobflow_remote .jobs .batch import LocalBatchManager
20- from jobflow_remote .jobs .data import IN_FILENAME , OUT_FILENAME
21+ from jobflow_remote .jobs .data import IN_FILENAME , OUT_FILENAME , JobDoc
2122from jobflow_remote .remote .data import get_job_path , get_store_file_paths
2223from jobflow_remote .utils .log import initialize_remote_run_log
2324
2930logger = logging .getLogger (__name__ )
3031
3132
33+ @singleton
34+ class JfrState :
35+ """State of the current job being executed."""
36+
37+ job_doc : JobDoc = None
38+
39+ def reset (self ):
40+ """Reset the current state."""
41+ self .job_doc = None
42+
43+
44+ CURRENT_JOBDOC : JfrState = JfrState ()
45+
46+
3247def run_remote_job (run_dir : str | Path = "." ) -> None :
3348 """Run the job."""
3449 initialize_remote_run_log ()
@@ -42,6 +57,10 @@ def run_remote_job(run_dir: str | Path = ".") -> None:
4257
4358 job : Job = in_data ["job" ]
4459 store = in_data ["store" ]
60+ job_doc_dict = in_data .get ("job_doc" , None )
61+ if job_doc_dict :
62+ job_doc_dict ["job" ] = job
63+ JfrState ().job_doc = JobDoc .model_validate (job_doc_dict )
4564
4665 store .connect ()
4766
@@ -91,6 +110,8 @@ def run_remote_job(run_dir: str | Path = ".") -> None:
91110 "end_time" : datetime .datetime .utcnow (),
92111 }
93112 dumpfn (output , OUT_FILENAME )
113+ finally :
114+ JfrState ().reset ()
94115
95116
96117def run_batch_jobs (
0 commit comments