dayhoff-tools 1.14.1__py3-none-any.whl → 1.14.2__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 (29) hide show
  1. dayhoff_tools/batch/__init__.py +8 -0
  2. dayhoff_tools/batch/workers/__init__.py +12 -0
  3. dayhoff_tools/batch/workers/base.py +150 -0
  4. dayhoff_tools/batch/workers/boltz.py +407 -0
  5. dayhoff_tools/batch/workers/embed_t5.py +92 -0
  6. dayhoff_tools/cli/batch/__init__.py +85 -0
  7. dayhoff_tools/cli/batch/aws_batch.py +401 -0
  8. dayhoff_tools/cli/batch/commands/__init__.py +25 -0
  9. dayhoff_tools/cli/batch/commands/boltz.py +362 -0
  10. dayhoff_tools/cli/batch/commands/cancel.py +82 -0
  11. dayhoff_tools/cli/batch/commands/embed_t5.py +303 -0
  12. dayhoff_tools/cli/batch/commands/finalize.py +206 -0
  13. dayhoff_tools/cli/batch/commands/list_jobs.py +78 -0
  14. dayhoff_tools/cli/batch/commands/local.py +95 -0
  15. dayhoff_tools/cli/batch/commands/logs.py +142 -0
  16. dayhoff_tools/cli/batch/commands/retry.py +142 -0
  17. dayhoff_tools/cli/batch/commands/status.py +214 -0
  18. dayhoff_tools/cli/batch/commands/submit.py +215 -0
  19. dayhoff_tools/cli/batch/job_id.py +151 -0
  20. dayhoff_tools/cli/batch/manifest.py +293 -0
  21. dayhoff_tools/cli/engines_studios/engine-studio-cli.md +26 -21
  22. dayhoff_tools/cli/engines_studios/engine_commands.py +16 -89
  23. dayhoff_tools/cli/engines_studios/ssh_config.py +96 -0
  24. dayhoff_tools/cli/engines_studios/studio_commands.py +13 -2
  25. dayhoff_tools/cli/main.py +14 -0
  26. {dayhoff_tools-1.14.1.dist-info → dayhoff_tools-1.14.2.dist-info}/METADATA +6 -1
  27. {dayhoff_tools-1.14.1.dist-info → dayhoff_tools-1.14.2.dist-info}/RECORD +29 -8
  28. {dayhoff_tools-1.14.1.dist-info → dayhoff_tools-1.14.2.dist-info}/WHEEL +0 -0
  29. {dayhoff_tools-1.14.1.dist-info → dayhoff_tools-1.14.2.dist-info}/entry_points.txt +0 -0
@@ -430,10 +430,13 @@ code tunnel --name my-engine
430
430
  - SSH agent forwarding: `-A` flag
431
431
  - Config file options: ControlMaster, compression, etc.
432
432
 
433
- **Recommended workflow:**
434
- 1. Run `dh engine2 config-ssh` once after launching engines
435
- 2. Use native `ssh <engine-name>` for all access
436
- 3. Rerun `config-ssh` if you launch new engines
433
+ **Note:** SSH config is automatically updated after `dh engine launch`, `dh engine start`, and `dh studio attach`. You typically don't need to run `config-ssh` manually.
434
+
435
+ **When to use `config-ssh` manually:**
436
+ - After restarting your terminal/shell
437
+ - If SSH entries are missing for some reason
438
+ - When using `--all` to add other users' engines
439
+ - When using `--admin` for ec2-user access
437
440
 
438
441
  ---
439
442
 
@@ -785,12 +788,17 @@ Attach your studio to an engine with real-time progress tracking through all 6 a
785
788
 
786
789
  **Usage:**
787
790
  ```bash
788
- dh studio2 attach <engine-name-or-id> [--env <env>]
791
+ dh studio2 attach <engine-name-or-id> [options]
789
792
  ```
790
793
 
791
794
  **Arguments:**
792
795
  - `engine-name-or-id` - Engine name or EC2 instance ID
793
796
 
797
+ **Options:**
798
+ - `--skip-ssh-config` - Don't automatically update SSH config
799
+ - `--user <username>` - User whose studio to attach (defaults to current user, use for testing/admin)
800
+ - `--env <env>` - Target environment
801
+
794
802
  **Examples:**
795
803
  ```bash
796
804
  dh studio2 attach my-engine
@@ -811,6 +819,7 @@ Progress ████████████████████ 100%
811
819
  Update State
812
820
 
813
821
  ✓ Studio attached successfully!
822
+ ✓ SSH config updated
814
823
 
815
824
  Your files are now available at:
816
825
  /studios/alice/
@@ -819,6 +828,8 @@ Connect with:
819
828
  ssh my-engine
820
829
  ```
821
830
 
831
+ **Note:** SSH config is automatically updated after successful attachment, so you can immediately `ssh my-engine` without running `dh engine config-ssh` first. Use `--skip-ssh-config` to disable this behavior.
832
+
822
833
  **6-step attachment process:**
823
834
  1. **Validate Engine** - Ensure engine is ready (~250ms)
824
835
  2. **Find Device Slot** - Locate available `/dev/sd[f-p]` (~150ms)
@@ -971,19 +982,16 @@ Reset studio status to 'available'? [y/N]: y
971
982
  ### Daily Development
972
983
 
973
984
  ```bash
974
- # Launch engine
985
+ # Launch engine (SSH config updated automatically)
975
986
  dh engine2 launch dev-work --type cpu
976
987
 
977
- # Add to SSH config
978
- dh engine2 config-ssh
979
-
980
988
  # Create studio (first time only)
981
989
  dh studio2 create --size 100
982
990
 
983
- # Attach studio
991
+ # Attach studio (SSH config updated automatically)
984
992
  dh studio2 attach dev-work
985
993
 
986
- # Connect with native SSH
994
+ # Connect with native SSH - works immediately!
987
995
  ssh dev-work
988
996
 
989
997
  # When done, detach and terminate
@@ -994,16 +1002,13 @@ dh engine2 terminate dev-work -y
994
1002
  ### GPU Training with Coffee Lock
995
1003
 
996
1004
  ```bash
997
- # Launch GPU engine
1005
+ # Launch GPU engine (SSH config updated automatically)
998
1006
  dh engine2 launch training --type a10g
999
1007
 
1000
- # Add to SSH config
1001
- dh engine2 config-ssh
1002
-
1003
1008
  # Set coffee lock for long job
1004
1009
  dh engine2 coffee training 8h
1005
1010
 
1006
- # Attach and start work
1011
+ # Attach and start work (SSH config updated automatically)
1007
1012
  dh studio2 attach training
1008
1013
  ssh training
1009
1014
 
@@ -1017,18 +1022,18 @@ dh engine2 terminate training -y
1017
1022
  ### Multi-Engine Development
1018
1023
 
1019
1024
  ```bash
1020
- # Launch multiple engines
1025
+ # Launch multiple engines (each updates SSH config)
1021
1026
  dh engine2 launch frontend --type cpu
1022
1027
  dh engine2 launch backend --type cpu
1023
1028
  dh engine2 launch ml --type t4
1024
1029
 
1025
- # Update SSH config for easy access
1026
- dh engine2 config-ssh
1027
-
1028
- # Now use direct SSH
1030
+ # SSH config already updated - connect directly
1029
1031
  ssh frontend
1030
1032
  ssh backend
1031
1033
  ssh ml
1034
+
1035
+ # Or manually refresh if needed
1036
+ dh engine2 config-ssh
1032
1037
  ```
1033
1038
 
1034
1039
  ### Monitoring Idle Detection
@@ -1,7 +1,6 @@
1
1
  """Engine CLI commands for engines_studios system."""
2
2
 
3
3
  import os
4
- import subprocess
5
4
  from typing import Optional
6
5
 
7
6
  import click
@@ -9,89 +8,7 @@ import click
9
8
  from .api_client import StudioManagerClient
10
9
  from .auth import check_aws_auth, detect_aws_environment, get_aws_username
11
10
  from .progress import format_idle_state, format_time_ago, wait_with_progress
12
-
13
-
14
- def _update_ssh_config_silent(client: StudioManagerClient, env: str) -> bool:
15
- """Update SSH config silently. Returns True if successful."""
16
- ssh_config_path = os.path.expanduser("~/.ssh/config")
17
-
18
- try:
19
- # Read existing config
20
- if os.path.exists(ssh_config_path):
21
- with open(ssh_config_path, "r") as f:
22
- lines = f.readlines()
23
- else:
24
- lines = []
25
-
26
- # Remove managed entries
27
- managed_start = "# BEGIN DAYHOFF ENGINES\n"
28
- managed_end = "# END DAYHOFF ENGINES\n"
29
-
30
- new_lines = []
31
- skip = False
32
- for line in lines:
33
- if line == managed_start:
34
- skip = True
35
- elif line == managed_end:
36
- skip = False
37
- continue
38
- elif not skip:
39
- new_lines.append(line)
40
-
41
- # Get engines
42
- result = client.list_engines()
43
- engines = result.get("engines", [])
44
-
45
- if not engines:
46
- return False
47
-
48
- # Generate new entries
49
- config_entries = [managed_start]
50
-
51
- try:
52
- current_user = get_aws_username()
53
- except RuntimeError:
54
- # Not authenticated - can't determine user, skip filtering
55
- current_user = None
56
-
57
- for engine in engines:
58
- user = engine.get("user", "unknown")
59
-
60
- # Skip engines owned by other users (unless user is unknown or we can't determine current user)
61
- if current_user and user != "unknown" and user != current_user:
62
- continue
63
-
64
- instance_id = engine.get("instance_id")
65
- name = engine.get("name", instance_id)
66
- state = engine.get("state", "unknown")
67
-
68
- # Only add running engines
69
- if state != "running":
70
- continue
71
-
72
- # Map environment to AWS profile
73
- profile = f"{env}-devaccess"
74
-
75
- config_entries.append(f"\nHost {name}\n")
76
- config_entries.append(f" HostName {instance_id}\n")
77
- config_entries.append(f" User {user}\n")
78
- config_entries.append(f" ForwardAgent yes\n")
79
- config_entries.append(
80
- f" ProxyCommand aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p' --profile {profile}\n"
81
- )
82
-
83
- config_entries.append(managed_end)
84
-
85
- # Write back
86
- new_lines.extend(config_entries)
87
-
88
- with open(ssh_config_path, "w") as f:
89
- f.writelines(new_lines)
90
-
91
- return True
92
-
93
- except Exception:
94
- return False
11
+ from .ssh_config import update_ssh_config_silent
95
12
 
96
13
 
97
14
  @click.group()
@@ -207,7 +124,7 @@ def launch_engine(
207
124
 
208
125
  # Update SSH config unless skipped
209
126
  if not skip_ssh_config:
210
- if _update_ssh_config_silent(client, env):
127
+ if update_ssh_config_silent(client, env):
211
128
  click.echo("✓ SSH config updated")
212
129
 
213
130
  click.echo(f"\nConnect with:")
@@ -215,15 +132,20 @@ def launch_engine(
215
132
  click.echo(f" ssh {name}")
216
133
 
217
134
  except TimeoutError:
218
- click.echo(f"\n⚠ Engine is still initializing. Check status with:")
135
+ click.echo("\n⚠ Engine is still initializing. Check status with:")
219
136
  click.echo(f" dh engine status {name}")
220
137
 
138
+ # Still update SSH config on timeout - engine is likely running
139
+ if not skip_ssh_config:
140
+ if update_ssh_config_silent(client, env):
141
+ click.echo("✓ SSH config updated")
142
+
221
143
  except Exception as e:
222
144
  error_msg = str(e)
223
145
 
224
146
  # Check for quota/limit errors
225
147
  if "VcpuLimitExceeded" in error_msg or "vCPU limit" in error_msg:
226
- click.echo(f"✗ Failed to launch engine: vCPU quota exceeded", err=True)
148
+ click.echo("✗ Failed to launch engine: vCPU quota exceeded", err=True)
227
149
  click.echo("", err=True)
228
150
  click.echo(
229
151
  f"The {env} AWS account has insufficient vCPU quota for {engine_type} instances.",
@@ -405,7 +327,7 @@ def start_engine(
405
327
 
406
328
  # Update SSH config unless skipped
407
329
  if not skip_ssh_config:
408
- if _update_ssh_config_silent(client, env):
330
+ if update_ssh_config_silent(client, env):
409
331
  click.echo("✓ SSH config updated")
410
332
 
411
333
  click.echo(f"\nConnect with:")
@@ -413,9 +335,14 @@ def start_engine(
413
335
  click.echo(f" ssh {engine_name}")
414
336
 
415
337
  except TimeoutError:
416
- click.echo(f"\n⚠ Engine is still starting. Check status with:")
338
+ click.echo("\n⚠ Engine is still starting. Check status with:")
417
339
  click.echo(f" dh engine status {engine_name}")
418
340
 
341
+ # Still update SSH config on timeout - engine is likely running
342
+ if not skip_ssh_config:
343
+ if update_ssh_config_silent(client, env):
344
+ click.echo("✓ SSH config updated")
345
+
419
346
  except Exception as e:
420
347
  click.echo(f"✗ Error: {e}", err=True)
421
348
  raise click.Abort()
@@ -0,0 +1,96 @@
1
+ """SSH config management utilities for engines_studios CLI."""
2
+
3
+ import os
4
+ from typing import TYPE_CHECKING
5
+
6
+ if TYPE_CHECKING:
7
+ from .api_client import StudioManagerClient
8
+
9
+
10
+ def update_ssh_config_silent(client: "StudioManagerClient", env: str) -> bool:
11
+ """Update SSH config with engine entries silently.
12
+
13
+ Returns True if successful, False otherwise.
14
+ Does not raise exceptions - intended for silent background updates.
15
+ """
16
+ from .auth import get_aws_username
17
+
18
+ ssh_config_path = os.path.expanduser("~/.ssh/config")
19
+
20
+ try:
21
+ # Read existing config
22
+ if os.path.exists(ssh_config_path):
23
+ with open(ssh_config_path, "r") as f:
24
+ lines = f.readlines()
25
+ else:
26
+ lines = []
27
+
28
+ # Remove managed entries
29
+ managed_start = "# BEGIN DAYHOFF ENGINES\n"
30
+ managed_end = "# END DAYHOFF ENGINES\n"
31
+
32
+ new_lines = []
33
+ skip = False
34
+ for line in lines:
35
+ if line == managed_start:
36
+ skip = True
37
+ elif line == managed_end:
38
+ skip = False
39
+ continue
40
+ elif not skip:
41
+ new_lines.append(line)
42
+
43
+ # Get engines
44
+ result = client.list_engines()
45
+ engines = result.get("engines", [])
46
+
47
+ if not engines:
48
+ return False
49
+
50
+ # Generate new entries
51
+ config_entries = [managed_start]
52
+
53
+ try:
54
+ current_user = get_aws_username()
55
+ except RuntimeError:
56
+ # Not authenticated - can't determine user, skip filtering
57
+ current_user = None
58
+
59
+ for engine in engines:
60
+ user = engine.get("user", "unknown")
61
+
62
+ # Skip engines owned by other users (unless user is unknown or we can't determine current user)
63
+ if current_user and user != "unknown" and user != current_user:
64
+ continue
65
+
66
+ instance_id = engine.get("instance_id")
67
+ name = engine.get("name", instance_id)
68
+ state = engine.get("state", "unknown")
69
+
70
+ # Only add running engines
71
+ if state != "running":
72
+ continue
73
+
74
+ # Map environment to AWS profile
75
+ profile = f"{env}-devaccess"
76
+
77
+ config_entries.append(f"\nHost {name}\n")
78
+ config_entries.append(f" HostName {instance_id}\n")
79
+ config_entries.append(f" User {user}\n")
80
+ config_entries.append(f" ForwardAgent yes\n")
81
+ config_entries.append(
82
+ f" ProxyCommand aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p' --profile {profile}\n"
83
+ )
84
+
85
+ config_entries.append(managed_end)
86
+
87
+ # Write back
88
+ new_lines.extend(config_entries)
89
+
90
+ with open(ssh_config_path, "w") as f:
91
+ f.writelines(new_lines)
92
+
93
+ return True
94
+
95
+ except Exception:
96
+ return False
@@ -1,6 +1,5 @@
1
1
  """Studio CLI commands for engines_studios system."""
2
2
 
3
- import os
4
3
  from typing import Optional
5
4
 
6
5
  import click
@@ -8,6 +7,7 @@ import click
8
7
  from .api_client import StudioManagerClient
9
8
  from .auth import check_aws_auth, detect_aws_environment, get_aws_username
10
9
  from .progress import format_time_ago, wait_with_progress
10
+ from .ssh_config import update_ssh_config_silent
11
11
 
12
12
 
13
13
  @click.group()
@@ -420,6 +420,9 @@ def list_studios(env: Optional[str]):
420
420
 
421
421
  @studio_cli.command("attach")
422
422
  @click.argument("engine_name_or_id")
423
+ @click.option(
424
+ "--skip-ssh-config", is_flag=True, help="Don't automatically update SSH config"
425
+ )
423
426
  @click.option(
424
427
  "--user",
425
428
  default=None,
@@ -430,7 +433,9 @@ def list_studios(env: Optional[str]):
430
433
  default=None,
431
434
  help="Environment (dev, sand, prod) - auto-detected if not specified",
432
435
  )
433
- def attach_studio(engine_name_or_id: str, user: Optional[str], env: Optional[str]):
436
+ def attach_studio(
437
+ engine_name_or_id: str, skip_ssh_config: bool, user: Optional[str], env: Optional[str]
438
+ ):
434
439
  """Attach your studio to an engine with progress tracking."""
435
440
 
436
441
  # Check AWS auth first to provide clear error messages
@@ -501,6 +506,12 @@ def attach_studio(engine_name_or_id: str, user: Optional[str], env: Optional[str
501
506
  )
502
507
 
503
508
  click.echo(f"\n✓ Studio attached successfully!")
509
+
510
+ # Update SSH config unless skipped
511
+ if not skip_ssh_config:
512
+ if update_ssh_config_silent(client, env):
513
+ click.echo("✓ SSH config updated")
514
+
504
515
  click.echo(f"\nYour files are now available at:")
505
516
  click.echo(f" /studios/{studio['user']}/")
506
517
  click.echo(f"\nConnect with:")
dayhoff_tools/cli/main.py CHANGED
@@ -98,6 +98,20 @@ def studio_cmd(ctx: typer.Context):
98
98
  studio_cli(ctx.args, standalone_mode=False)
99
99
 
100
100
 
101
+ # Batch job management (Click-based CLI)
102
+ @app.command(
103
+ "batch",
104
+ context_settings={"allow_extra_args": True, "ignore_unknown_options": True},
105
+ add_help_option=False,
106
+ )
107
+ def batch_cmd(ctx: typer.Context):
108
+ """Manage batch jobs on AWS Batch."""
109
+ from dayhoff_tools.cli.batch import batch_cli
110
+
111
+ # Pass arguments directly to Click CLI
112
+ batch_cli(ctx.args, standalone_mode=False)
113
+
114
+
101
115
  # Engine and Studio commands (v1 - legacy, uses old infrastructure)
102
116
  app.add_typer(engine1_app, name="engine1", help="[Legacy v1] Manage engines.")
103
117
  app.add_typer(studio1_app, name="studio1", help="[Legacy v1] Manage studios.")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dayhoff-tools
3
- Version: 1.14.1
3
+ Version: 1.14.2
4
4
  Summary: Common tools for all the repos at Dayhoff Labs
5
5
  Author: Daniel Martin-Alarcon
6
6
  Author-email: dma@dayhofflabs.com
@@ -11,11 +11,14 @@ Classifier: Programming Language :: Python :: 3.11
11
11
  Classifier: Programming Language :: Python :: 3.12
12
12
  Classifier: Programming Language :: Python :: 3.13
13
13
  Classifier: Programming Language :: Python :: 3.14
14
+ Provides-Extra: batch
15
+ Provides-Extra: boltz
14
16
  Provides-Extra: embedders
15
17
  Provides-Extra: full
16
18
  Requires-Dist: biopython (>=1.84) ; extra == "full"
17
19
  Requires-Dist: biopython (>=1.85) ; extra == "embedders"
18
20
  Requires-Dist: boto3 (>=1.36.8)
21
+ Requires-Dist: click (>=8.0.0) ; extra == "batch"
19
22
  Requires-Dist: docker (>=7.1.0) ; extra == "full"
20
23
  Requires-Dist: fair-esm (>=2.0.0) ; extra == "embedders"
21
24
  Requires-Dist: fair-esm (>=2.0.0) ; extra == "full"
@@ -25,10 +28,12 @@ Requires-Dist: h5py (>=3.13.0) ; extra == "embedders"
25
28
  Requires-Dist: numpy (>=1.26.4) ; extra == "embedders"
26
29
  Requires-Dist: pandas (>=2.2.0,<2.2.3) ; extra == "embedders"
27
30
  Requires-Dist: pandas (>=2.2.0,<2.2.3) ; extra == "full"
31
+ Requires-Dist: pydantic (>=2.0.0) ; extra == "batch"
28
32
  Requires-Dist: pyyaml (>=6.0)
29
33
  Requires-Dist: questionary (>=2.0.1)
30
34
  Requires-Dist: rdkit-pypi (>=2022.9.5) ; extra == "full"
31
35
  Requires-Dist: requests (>=2.31.0)
36
+ Requires-Dist: ruamel.yaml (>=0.17.0) ; extra == "boltz"
32
37
  Requires-Dist: sentencepiece (>=0.2.0) ; extra == "embedders"
33
38
  Requires-Dist: sentencepiece (>=0.2.0) ; extra == "full"
34
39
  Requires-Dist: sqlalchemy (>=2.0.40,<3.0.0) ; extra == "full"
@@ -1,7 +1,27 @@
1
1
  dayhoff_tools/__init__.py,sha256=M5zThPyEBRYa5CfwlzKhcqTevWn3OKu62cjV6Zqie2A,469
2
+ dayhoff_tools/batch/__init__.py,sha256=N7v1pUg3rp68W6J7cX2Gssxdfp57Z7G0WeFJh7gKeiM,163
3
+ dayhoff_tools/batch/workers/__init__.py,sha256=DJTtiBSE5k9J6qwG_MsXDn8hgz_lvEdaMwqKa6YyqXo,369
4
+ dayhoff_tools/batch/workers/base.py,sha256=eimShYucbCVs8MlLXdtPsxwQRPgXFXqABXIBE5kieJI,4305
5
+ dayhoff_tools/batch/workers/boltz.py,sha256=QTIqMWuV_o3v1tYaZhvjyCl5F65ZlPcc0-TXtitMaFQ,14663
6
+ dayhoff_tools/batch/workers/embed_t5.py,sha256=A5WqsQa1WZ7_la5X5wt0XUP-VwOglH04WyEINhwipeY,2750
2
7
  dayhoff_tools/chemistry/standardizer.py,sha256=uMn7VwHnx02nc404eO6fRuS4rsl4dvSPf2ElfZDXEpY,11188
3
8
  dayhoff_tools/chemistry/utils.py,sha256=jt-7JgF-GeeVC421acX-bobKbLU_X94KNOW24p_P-_M,2257
4
9
  dayhoff_tools/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ dayhoff_tools/cli/batch/__init__.py,sha256=gEuiDPWio8ihrIfF_Q6-5hKOnliPTxDKQrKN8-4Y3Ac,2320
11
+ dayhoff_tools/cli/batch/aws_batch.py,sha256=L6lNpUaxyhMvLcM3dF8yEi2yCgTNdviaNMmG75bpBIc,12719
12
+ dayhoff_tools/cli/batch/commands/__init__.py,sha256=1xRzzL_mc1hz1Pv0OWNr-g6fkL5XbEsOTGHzrqddLCA,458
13
+ dayhoff_tools/cli/batch/commands/boltz.py,sha256=M7UNebaV7EAoHY_Fhml7JGnTZjM5o1nkYL22pSmqnWA,10422
14
+ dayhoff_tools/cli/batch/commands/cancel.py,sha256=5FHLRoq8nvOr8HuKxXUZqAyAdjQP8seaNSaeAdhOoE8,2890
15
+ dayhoff_tools/cli/batch/commands/embed_t5.py,sha256=D56Hyamzm-peVEiA3tDzotfpHd2bVsKfMprpoj_ADR8,9627
16
+ dayhoff_tools/cli/batch/commands/finalize.py,sha256=2kQTtHxdW52s0lrLUlc7tx7Ab092sxs8uSc9-f2utUg,7198
17
+ dayhoff_tools/cli/batch/commands/list_jobs.py,sha256=y90_XqFI2qcvV2XUC01P3P2aIdtl5hXP3cBDEofsRtU,2432
18
+ dayhoff_tools/cli/batch/commands/local.py,sha256=vOTojTAp4YZXIMLKNqc76oIE0oWMjB1mtTe6r19LrEc,3075
19
+ dayhoff_tools/cli/batch/commands/logs.py,sha256=FOYpANQCsQTJKigq77k1xbhgOqtRPw9hyHkljILWlmo,5241
20
+ dayhoff_tools/cli/batch/commands/retry.py,sha256=FQMi77oh61i-JOD77OmoJECw03aWQIVS-MizKggSu1g,4481
21
+ dayhoff_tools/cli/batch/commands/status.py,sha256=BZyCF115XNqx4KXyLASsowY_e4R29BYQJyaK_EulPL8,7553
22
+ dayhoff_tools/cli/batch/commands/submit.py,sha256=9Ur2PFkb5vbWv8Xebqs8dsGDh28uAkOQBaMuZsLgnec,6752
23
+ dayhoff_tools/cli/batch/job_id.py,sha256=mqr8SwcPlUWIYLaR_C4kACmL2ZFK8jaddd7B-45-XaQ,4246
24
+ dayhoff_tools/cli/batch/manifest.py,sha256=2js-vbLkRipStN6_89T-wVUjgITA32EhN4eMdcw41hw,8610
5
25
  dayhoff_tools/cli/cloud_commands.py,sha256=xrWQZm48e09GTh8RmYh3JqXUzW8mMy07dHk_77LqZx8,41199
6
26
  dayhoff_tools/cli/engine1/__init__.py,sha256=RE45X2IPCNUvQp6_OHI2lbjwoqexkH3roUPccIHkeJo,9540
7
27
  dayhoff_tools/cli/engine1/engine_core.py,sha256=TECO6766GCZTtbxOY7QRggwmjpMH9JZSuxjbwF46unU,27061
@@ -13,8 +33,8 @@ dayhoff_tools/cli/engine1/studio_commands.py,sha256=VwTQujz32-uMcYusDRE73SdzRpgv
13
33
  dayhoff_tools/cli/engines_studios/__init__.py,sha256=E6aG0C6qjJnJuClemSKRFlYvLUL49MQZOvfqNQ7SDKs,159
14
34
  dayhoff_tools/cli/engines_studios/api_client.py,sha256=9mCVRjPUCYa7cFx29uVwYxmHPAM5FwsU9xdplvgftxs,13444
15
35
  dayhoff_tools/cli/engines_studios/auth.py,sha256=rwetV5hp4jSvK8FyvKgXCnezLOZx1aW8oiSDc6U83iE,5189
16
- dayhoff_tools/cli/engines_studios/engine-studio-cli.md,sha256=-AJB3VMV_xvPK9EcJOntTMu9dCiEch31bp-sxJUXp7w,29874
17
- dayhoff_tools/cli/engines_studios/engine_commands.py,sha256=ILPKI1HNjTYSl6C0VUO39fxJLL-IRHuYNq4Iqr5yHIY,38881
36
+ dayhoff_tools/cli/engines_studios/engine-studio-cli.md,sha256=Z9u8m8eGEuMoBba8v-bkkPAT2DqK5FhwiUtoyEWzbyI,30646
37
+ dayhoff_tools/cli/engines_studios/engine_commands.py,sha256=OQJ4WdmTilUbsLIcrd_E8kxabNRZ7HzxdwFEDP8JqCE,36765
18
38
  dayhoff_tools/cli/engines_studios/progress.py,sha256=VW70t7sEHlbLpCi6LOaY19Rp1Kx6Rt9CKNnmaZWFteA,9496
19
39
  dayhoff_tools/cli/engines_studios/simulators/cli-simulators.md,sha256=FZJl6nehdr2Duht2cx3yijcak0yKyOaHTrTzvFTAfZs,4976
20
40
  dayhoff_tools/cli/engines_studios/simulators/demo.sh,sha256=8tYABSCxLNXqGs-4r071V9mpKNZ5DTQ34WZ-v3d5s94,5364
@@ -24,9 +44,10 @@ dayhoff_tools/cli/engines_studios/simulators/idle_status_simulator.py,sha256=F_M
24
44
  dayhoff_tools/cli/engines_studios/simulators/simulator_utils.py,sha256=HA08pIMJWV3OFrWj3Ca8GldvgJZfFoTOloyLK0UWMgA,6729
25
45
  dayhoff_tools/cli/engines_studios/simulators/studio_list_simulator.py,sha256=ntizeR0BJLdJOwCRBKPajc2xT-BL7SNnONxfgxXDgr8,11609
26
46
  dayhoff_tools/cli/engines_studios/simulators/studio_status_simulator.py,sha256=6WvpnRawJVaQf_H81zuR1_66igRRVxPxjAt8e69xjp4,5394
27
- dayhoff_tools/cli/engines_studios/studio_commands.py,sha256=4ul6i8HDHZTffavu1y_j4kwvsDNvjMvYMWbZGXN8nKY,25597
47
+ dayhoff_tools/cli/engines_studios/ssh_config.py,sha256=UCv-jf_zSuk7FUStkCQBAJz1QkxiSEwZbdSrwt_9SMU,2932
48
+ dayhoff_tools/cli/engines_studios/studio_commands.py,sha256=YM81roRzpLpc6XkL4XsO5rmWA-L1aJdOvPmGZFoMPGs,25966
28
49
  dayhoff_tools/cli/github_commands.py,sha256=pfrxI68LObGm_gtPlQN-gHPahHV4l9k9T4GqO99NNL0,8948
29
- dayhoff_tools/cli/main.py,sha256=Vmfqzabc2ZZ6Uoq9mfEA5ko1r5eGXMf9uJqagIBQUC0,8091
50
+ dayhoff_tools/cli/main.py,sha256=6W-fdRfjkPGx4fnfAhmEKyFl6Ou1VOxy4IYFpcFWkrA,8489
30
51
  dayhoff_tools/cli/swarm_commands.py,sha256=5EyKj8yietvT5lfoz8Zx0iQvVaNgc3SJX1z2zQR6o6M,5614
31
52
  dayhoff_tools/cli/utility_commands.py,sha256=e2P4dCCtoqMUGNyb0lFBZ6GZpl5Zslm1qqE5qIvsy38,50765
32
53
  dayhoff_tools/deployment/base.py,sha256=uZnFvnPQx6pH_HmJbdThweAs3BrxMaDohpE3iX_-yk4,18377
@@ -49,7 +70,7 @@ dayhoff_tools/intake/uniprot.py,sha256=BZYJQF63OtPcBBnQ7_P9gulxzJtqyorgyuDiPeOJq
49
70
  dayhoff_tools/logs.py,sha256=DKdeP0k0kliRcilwvX0mUB2eipO5BdWUeHwh-VnsICs,838
50
71
  dayhoff_tools/sqlite.py,sha256=jV55ikF8VpTfeQqqlHSbY8OgfyfHj8zgHNpZjBLos_E,18672
51
72
  dayhoff_tools/warehouse.py,sha256=UETBtZD3r7WgvURqfGbyHlT7cxoiVq8isjzMuerKw8I,24475
52
- dayhoff_tools-1.14.1.dist-info/METADATA,sha256=9hTqtnpcQc7Ehvx2YP13N8mVZNiYE__EB0HiWj9_rPA,2980
53
- dayhoff_tools-1.14.1.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
54
- dayhoff_tools-1.14.1.dist-info/entry_points.txt,sha256=iAf4jteNqW3cJm6CO6czLxjW3vxYKsyGLZ8WGmxamSc,49
55
- dayhoff_tools-1.14.1.dist-info/RECORD,,
73
+ dayhoff_tools-1.14.2.dist-info/METADATA,sha256=v0DhSbERngGi4BentS_cQjF3bDiyoxg9HAFIEhvAKTU,3184
74
+ dayhoff_tools-1.14.2.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
75
+ dayhoff_tools-1.14.2.dist-info/entry_points.txt,sha256=iAf4jteNqW3cJm6CO6czLxjW3vxYKsyGLZ8WGmxamSc,49
76
+ dayhoff_tools-1.14.2.dist-info/RECORD,,