flowmesh-cli-stack 0.1.1__tar.gz → 0.1.2__tar.gz

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 (20) hide show
  1. {flowmesh_cli_stack-0.1.1/src/flowmesh_cli_stack.egg-info → flowmesh_cli_stack-0.1.2}/PKG-INFO +3 -3
  2. {flowmesh_cli_stack-0.1.1 → flowmesh_cli_stack-0.1.2}/pyproject.toml +3 -3
  3. {flowmesh_cli_stack-0.1.1 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack/assets/.env.example +15 -4
  4. {flowmesh_cli_stack-0.1.1 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack/assets/compose.yml +4 -0
  5. {flowmesh_cli_stack-0.1.1 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack/env_schema.py +32 -4
  6. {flowmesh_cli_stack-0.1.1 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack/stack.py +2 -0
  7. {flowmesh_cli_stack-0.1.1 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack/utils.py +24 -0
  8. {flowmesh_cli_stack-0.1.1 → flowmesh_cli_stack-0.1.2/src/flowmesh_cli_stack.egg-info}/PKG-INFO +3 -3
  9. flowmesh_cli_stack-0.1.2/src/flowmesh_cli_stack.egg-info/requires.txt +5 -0
  10. flowmesh_cli_stack-0.1.1/src/flowmesh_cli_stack.egg-info/requires.txt +0 -5
  11. {flowmesh_cli_stack-0.1.1 → flowmesh_cli_stack-0.1.2}/LICENSE +0 -0
  12. {flowmesh_cli_stack-0.1.1 → flowmesh_cli_stack-0.1.2}/README.md +0 -0
  13. {flowmesh_cli_stack-0.1.1 → flowmesh_cli_stack-0.1.2}/setup.cfg +0 -0
  14. {flowmesh_cli_stack-0.1.1 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack/__init__.py +0 -0
  15. {flowmesh_cli_stack-0.1.1 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack/assets/docker-bake.hcl +0 -0
  16. {flowmesh_cli_stack-0.1.1 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack/bundle.py +0 -0
  17. {flowmesh_cli_stack-0.1.1 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack/worker.py +0 -0
  18. {flowmesh_cli_stack-0.1.1 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack.egg-info/SOURCES.txt +0 -0
  19. {flowmesh_cli_stack-0.1.1 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack.egg-info/dependency_links.txt +0 -0
  20. {flowmesh_cli_stack-0.1.1 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack.egg-info/top_level.txt +0 -0
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flowmesh-cli-stack
3
- Version: 0.1.1
3
+ Version: 0.1.2
4
4
  Summary: FlowMesh CLI stack commands
5
5
  License-Expression: Apache-2.0
6
6
  Requires-Python: >=3.12
7
7
  Description-Content-Type: text/markdown
8
8
  License-File: LICENSE
9
- Requires-Dist: flowmesh-cli==0.1.1
10
- Requires-Dist: flowmesh-sdk-stack==0.1.1
9
+ Requires-Dist: flowmesh-cli==0.1.2
10
+ Requires-Dist: flowmesh-sdk-stack==0.1.2
11
11
  Requires-Dist: docker>=7.1.0
12
12
  Requires-Dist: packaging>=24
13
13
  Requires-Dist: pyyaml>=6.0.2
@@ -4,15 +4,15 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "flowmesh-cli-stack"
7
- version = "0.1.1"
7
+ version = "0.1.2"
8
8
  description = "FlowMesh CLI stack commands"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
11
11
  license = "Apache-2.0"
12
12
  license-files = ["LICENSE"]
13
13
  dependencies = [
14
- "flowmesh-cli==0.1.1",
15
- "flowmesh-sdk-stack==0.1.1",
14
+ "flowmesh-cli==0.1.2",
15
+ "flowmesh-sdk-stack==0.1.2",
16
16
  "docker>=7.1.0",
17
17
  "packaging>=24",
18
18
  "pyyaml>=6.0.2",
@@ -93,6 +93,13 @@ SSH_DEFAULT_IDLE_SEC=
93
93
  SSH_MAX_TTL_SEC=
94
94
  SSH_POLL_INTERVAL_SEC=
95
95
  SSH_STOP_TIMEOUT_SEC=
96
+ SSH_MAX_CPU=
97
+ SSH_MAX_MEMORY=
98
+ SSH_MAX_PIDS=
99
+ # Whether to apply requested GPU limits to SSH tasks.
100
+ # If false, SSH tasks are allocated all available GPUs
101
+ # regardless of their resource requests.
102
+ ENABLE_SSH_GPU_LIMIT=false
96
103
 
97
104
  # ==== General Settings ====
98
105
  TZ=Asia/Singapore
@@ -166,11 +173,15 @@ NEBULA_API_TOKEN=
166
173
 
167
174
  # ==== External Plugins ====
168
175
  # Plugins are Python packages dropped under FLOWMESH_PLUGIN_DIR
169
- # (host-mounted to /app/plugins on the server) and selected by
170
- # FLOWMESH_PLUGINS as a comma-separated list of top-level module
171
- # names. Each named module must expose `install()` returning a
172
- # `HookBindings`. Leave both empty unless you ship a plugin.
176
+ # (read-only at /app/plugins) and selected by FLOWMESH_PLUGINS as
177
+ # a comma-separated list of top-level module names. Each must
178
+ # expose `install()` returning a `HookBindings`.
179
+ # FLOWMESH_PLUGIN_DATA_DIR is writable at /app/plugin-data for
180
+ # plugin state. Leave all empty unless you ship a plugin.
173
181
  FLOWMESH_PLUGIN_DIR=./plugins
182
+ # A path (`./x`, `/abs/x`) -> host bind-mount (auto-created).
183
+ # A bare name -> external Docker volume of that name.
184
+ FLOWMESH_PLUGIN_DATA_DIR=./plugin-data
174
185
  FLOWMESH_PLUGINS=
175
186
 
176
187
  # ==== Agent Executor (youtu-agent / utu) ====
@@ -166,6 +166,7 @@ services:
166
166
  - /var/run/docker.sock:/var/run/docker.sock
167
167
  - ${SERVER_WORKER_CONFIG:-./configs/worker_config.yaml}:/etc/flowmesh/worker_config.yaml:ro
168
168
  - ${FLOWMESH_PLUGIN_DIR:-./plugins}:/app/plugins:ro
169
+ - ${FLOWMESH_PLUGIN_DATA_DIR:-./plugin-data}:/app/plugin-data
169
170
  - ${REDIS_TLS_DIR:-./secrets/tls/redis}:/etc/ssl/redis:ro
170
171
  - ${SERVER_TLS_DIR:-./secrets/tls/server}:/etc/ssl/server:ro
171
172
  restart: unless-stopped
@@ -199,3 +200,6 @@ volumes:
199
200
  name: ${FLOWMESH_STACK_SLUG:-flowmesh_node}_metrics
200
201
  flowmesh_server_logs:
201
202
  name: ${FLOWMESH_STACK_SLUG:-flowmesh_node}_server_logs
203
+ flowmesh_plugin_data:
204
+ external: true
205
+ name: ${FLOWMESH_PLUGIN_DATA_VOLUME:-${FLOWMESH_STACK_SLUG:-flowmesh_node}_plugin_data}
@@ -301,6 +301,24 @@ STACK_ENV_SCHEMA = EnvSchema(
301
301
  EnvVar("SSH_MAX_TTL_SEC", var_type=EnvVarType.FLOAT, min_value=0),
302
302
  EnvVar("SSH_POLL_INTERVAL_SEC", var_type=EnvVarType.FLOAT, min_value=0),
303
303
  EnvVar("SSH_STOP_TIMEOUT_SEC", var_type=EnvVarType.FLOAT, min_value=0),
304
+ EnvVar(
305
+ "SSH_MAX_CPU",
306
+ var_type=EnvVarType.FLOAT,
307
+ min_value=0,
308
+ min_inclusive=False,
309
+ ),
310
+ EnvVar("SSH_MAX_MEMORY"),
311
+ EnvVar("SSH_MAX_PIDS", var_type=EnvVarType.INT, min_value=1),
312
+ EnvVar(
313
+ "ENABLE_SSH_GPU_LIMIT",
314
+ "false",
315
+ var_type=EnvVarType.BOOL,
316
+ description=[
317
+ "Whether to apply requested GPU limits to SSH tasks.",
318
+ "If false, SSH tasks are allocated all available GPUs",
319
+ "regardless of their resource requests.",
320
+ ],
321
+ ),
304
322
  ],
305
323
  ),
306
324
  EnvSection(
@@ -512,10 +530,11 @@ STACK_ENV_SCHEMA = EnvSchema(
512
530
  title="External Plugins",
513
531
  description=[
514
532
  "Plugins are Python packages dropped under FLOWMESH_PLUGIN_DIR ",
515
- "(host-mounted to /app/plugins on the server) and selected by ",
516
- "FLOWMESH_PLUGINS as a comma-separated list of top-level module ",
517
- "names. Each named module must expose `install()` returning a ",
518
- "`HookBindings`. Leave both empty unless you ship a plugin.",
533
+ "(read-only at /app/plugins) and selected by FLOWMESH_PLUGINS as ",
534
+ "a comma-separated list of top-level module names. Each must ",
535
+ "expose `install()` returning a `HookBindings`. ",
536
+ "FLOWMESH_PLUGIN_DATA_DIR is writable at /app/plugin-data for ",
537
+ "plugin state. Leave all empty unless you ship a plugin.",
519
538
  ],
520
539
  vars=[
521
540
  EnvVar(
@@ -525,6 +544,15 @@ STACK_ENV_SCHEMA = EnvSchema(
525
544
  use_default=True,
526
545
  ensure_path="create",
527
546
  ),
547
+ EnvVar(
548
+ "FLOWMESH_PLUGIN_DATA_DIR",
549
+ "./plugin-data",
550
+ use_default=True,
551
+ description=[
552
+ "A path (`./x`, `/abs/x`) -> host bind-mount (auto-created).",
553
+ "A bare name -> external Docker volume of that name.",
554
+ ],
555
+ ),
528
556
  EnvVar("FLOWMESH_PLUGINS", ""),
529
557
  ],
530
558
  ),
@@ -35,6 +35,7 @@ from .env_schema import STACK_ENV_SCHEMA, deploy_overrides, role_overrides
35
35
  from .utils import (
36
36
  DEFAULT_ENV_FILE,
37
37
  STACK_PATH_KEYS,
38
+ apply_plugin_data_env,
38
39
  apply_stack_resource_env,
39
40
  ensure_deploy_paths,
40
41
  parse_node_role,
@@ -58,6 +59,7 @@ def _stack() -> DockerComposeStack:
58
59
  except ValueError as exc:
59
60
  logging.error(str(exc))
60
61
  raise typer.Exit(code=1)
62
+ apply_plugin_data_env(Path.cwd())
61
63
 
62
64
  return DockerComposeStack(
63
65
  compose_file=stack_compose_file(),
@@ -57,6 +57,22 @@ def apply_stack_resource_env() -> None:
57
57
  os.environ[WORKER_RESULTS_DIR_ENV] = results_volume
58
58
 
59
59
 
60
+ _PLUGIN_DATA_PATH_PREFIXES = ("/", "./", "../", "~")
61
+ _PLUGIN_DATA_ALIAS = "flowmesh_plugin_data"
62
+ _PLUGIN_DATA_DEFAULT = "./plugin-data"
63
+ _PLUGIN_DATA_VOLUME_ENV = "FLOWMESH_PLUGIN_DATA_VOLUME"
64
+
65
+
66
+ def apply_plugin_data_env(base_dir: Path) -> None:
67
+ raw = os.environ.get("FLOWMESH_PLUGIN_DATA_DIR", "").strip()
68
+ if not raw or raw.startswith(_PLUGIN_DATA_PATH_PREFIXES):
69
+ resolved = resolve_path(raw, default=_PLUGIN_DATA_DEFAULT, base_dir=base_dir)
70
+ os.environ["FLOWMESH_PLUGIN_DATA_DIR"] = resolved.as_posix()
71
+ else:
72
+ os.environ[_PLUGIN_DATA_VOLUME_ENV] = raw
73
+ os.environ["FLOWMESH_PLUGIN_DATA_DIR"] = _PLUGIN_DATA_ALIAS
74
+
75
+
60
76
  def stack_compose_file() -> Path:
61
77
  return asset_path("flowmesh_cli_stack.assets", "compose.yml")
62
78
 
@@ -118,6 +134,14 @@ def ensure_deploy_paths(base_dir: Path) -> None:
118
134
  base_dir=base_dir,
119
135
  )
120
136
  )
137
+ if not os.environ.get(_PLUGIN_DATA_VOLUME_ENV):
138
+ ensure_dir(
139
+ resolve_path(
140
+ os.getenv("FLOWMESH_PLUGIN_DATA_DIR", ""),
141
+ default=_PLUGIN_DATA_DEFAULT,
142
+ base_dir=base_dir,
143
+ )
144
+ )
121
145
 
122
146
 
123
147
  def parse_node_role(raw: str) -> NodeRole:
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flowmesh-cli-stack
3
- Version: 0.1.1
3
+ Version: 0.1.2
4
4
  Summary: FlowMesh CLI stack commands
5
5
  License-Expression: Apache-2.0
6
6
  Requires-Python: >=3.12
7
7
  Description-Content-Type: text/markdown
8
8
  License-File: LICENSE
9
- Requires-Dist: flowmesh-cli==0.1.1
10
- Requires-Dist: flowmesh-sdk-stack==0.1.1
9
+ Requires-Dist: flowmesh-cli==0.1.2
10
+ Requires-Dist: flowmesh-sdk-stack==0.1.2
11
11
  Requires-Dist: docker>=7.1.0
12
12
  Requires-Dist: packaging>=24
13
13
  Requires-Dist: pyyaml>=6.0.2
@@ -0,0 +1,5 @@
1
+ flowmesh-cli==0.1.2
2
+ flowmesh-sdk-stack==0.1.2
3
+ docker>=7.1.0
4
+ packaging>=24
5
+ pyyaml>=6.0.2
@@ -1,5 +0,0 @@
1
- flowmesh-cli==0.1.1
2
- flowmesh-sdk-stack==0.1.1
3
- docker>=7.1.0
4
- packaging>=24
5
- pyyaml>=6.0.2