flock-core 0.4.0b37__py3-none-any.whl → 0.4.0b39__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.

Potentially problematic release.


This version of flock-core might be problematic. Click here for more details.

flock/config.py CHANGED
@@ -36,7 +36,9 @@ OTEL_FILE_NAME = config("OTEL_FILE_NAME", "flock_events.jsonl")
36
36
  OTEL_ENABLE_SQL: bool = config("OTEL_ENABLE_SQL", True) == "True"
37
37
  OTEL_ENABLE_FILE: bool = config("OTEL_ENABLE_FILE", True) == "True"
38
38
  OTEL_ENABLE_JAEGER: bool = config("OTEL_ENABLE_JAEGER", False) == "True"
39
-
39
+ OTEL_ENABLE_OTLP: bool = config("OTEL_ENABLE_OTLP", False) == "True"
40
+ OTEL_EXPORTER_OTLP_PROTOCOL: str = config("OTEL_EXPORTER_OTLP_PROTOCOL", "grpc")
41
+ OTEL_EXPORTER_OTLP_ENDPOINT: str = config("OTEL_EXPORTER_OTLP_ENDPOINT", "http://localhost:4317")
40
42
 
41
43
  TELEMETRY = TelemetryConfig(
42
44
  OTEL_SERVICE_NAME,
@@ -48,4 +50,7 @@ TELEMETRY = TelemetryConfig(
48
50
  OTEL_ENABLE_JAEGER,
49
51
  OTEL_ENABLE_FILE,
50
52
  OTEL_ENABLE_SQL,
53
+ OTEL_ENABLE_OTLP,
54
+ OTEL_EXPORTER_OTLP_PROTOCOL,
55
+ OTEL_EXPORTER_OTLP_ENDPOINT,
51
56
  )
@@ -0,0 +1,40 @@
1
+ """Lightweight helper object for declaring additional REST routes.
2
+
3
+ Developers can pass instances of :class:`FlockEndpoint` to
4
+ ``Flock.start_api(custom_endpoints=[...])`` instead of the terse dictionary
5
+ syntax. The class carries optional Pydantic request/response models plus
6
+ OpenAPI metadata so the generated docs look perfect.
7
+ """
8
+ from __future__ import annotations
9
+
10
+ from collections.abc import Callable
11
+ from typing import Any
12
+
13
+ from pydantic import BaseModel
14
+
15
+ __all__ = [
16
+ "FlockEndpoint",
17
+ ]
18
+
19
+
20
+ class FlockEndpoint(BaseModel):
21
+ """Declarative description of an extra API route."""
22
+
23
+ path: str
24
+ methods: list[str] = ["GET"]
25
+ callback: Callable[..., Any]
26
+
27
+ # Optional schema models
28
+ request_model: type[BaseModel] | None = None
29
+ response_model: type[BaseModel] | None = None
30
+
31
+ # OpenAPI / Swagger metadata
32
+ summary: str | None = None
33
+ description: str | None = None
34
+ name: str | None = None # Route name in FastAPI
35
+ include_in_schema: bool = True
36
+
37
+ model_config = {
38
+ "arbitrary_types_allowed": True,
39
+ "validate_default": True,
40
+ }
flock/core/api/main.py CHANGED
@@ -1,17 +1,22 @@
1
1
  # src/flock/core/api/main.py
2
2
  """Main Flock API server class and setup."""
3
3
 
4
- from typing import Any
4
+ from collections.abc import Callable, Sequence
5
+ from typing import TYPE_CHECKING, Any
5
6
 
6
7
  import uvicorn
7
8
  from fastapi import FastAPI
8
9
  from fastapi.responses import RedirectResponse
10
+ from pydantic import BaseModel
9
11
 
10
12
  # Flock core imports
11
13
  from flock.core.api.models import FlockBatchRequest
12
- from flock.core.flock import Flock
13
14
  from flock.core.logging.logging import get_logger
14
15
 
16
+ if TYPE_CHECKING:
17
+ # These imports are only for type hints
18
+ from flock.core.flock import Flock
19
+
15
20
  logger = get_logger("api.main")
16
21
 
17
22
  from .endpoints import create_api_router
@@ -63,14 +68,57 @@ except ImportError:
63
68
  def format_result_to_html(*args, **kwargs):
64
69
  return ""
65
70
 
71
+ from flock.core.api.custom_endpoint import FlockEndpoint
66
72
 
67
- class FlockAPI:
68
- """Coordinates the Flock API server, including endpoints and UI."""
69
73
 
70
- def __init__(self, flock: Flock):
74
+ class FlockAPI:
75
+ """Coordinates the Flock API server, including endpoints and UI.
76
+
77
+ A user can provide custom FastAPI-style routes via the ``custom_endpoints`` dict.
78
+ Each key is a tuple of ``(<path:str>, <methods:list[str] | None>)`` and the
79
+ value is a callback ``Callable``. ``methods`` can be ``None`` or an empty
80
+ list to default to ``["GET"]``. The callback can be synchronous or
81
+ ``async``. At execution time we provide the following keyword arguments and
82
+ filter them to the callback's signature:
83
+
84
+ • ``body`` – request json/plain payload (for POST/PUT/PATCH)
85
+ • ``query`` – dict of query parameters
86
+ • ``flock`` – current :class:`Flock` instance
87
+ • any path parameters extracted from the route pattern
88
+ """
89
+
90
+ def __init__(
91
+ self,
92
+ flock: "Flock",
93
+ custom_endpoints: Sequence[FlockEndpoint] | dict[tuple[str, list[str] | None], Callable[..., Any]] | None = None,
94
+ ):
71
95
  self.flock = flock
96
+ # Normalize into list[FlockEndpoint]
97
+ self.custom_endpoints: list[FlockEndpoint] = []
98
+ if custom_endpoints:
99
+ merged: list[FlockEndpoint] = []
100
+ if isinstance(custom_endpoints, dict):
101
+ for (path, methods), cb in custom_endpoints.items():
102
+ merged.append(
103
+ FlockEndpoint(path=path, methods=list(methods) if methods else ["GET"], callback=cb)
104
+ )
105
+ else:
106
+ merged.extend(list(custom_endpoints))
107
+
108
+ pending_endpoints = merged
109
+ else:
110
+ pending_endpoints = []
111
+
112
+ # FastAPI app instance
72
113
  self.app = FastAPI(title="Flock API")
73
- self.run_store = RunStore() # Create the run store instance
114
+
115
+ # Store run information
116
+ self.run_store = RunStore()
117
+
118
+ # Register any pending custom endpoints collected before app creation
119
+ if pending_endpoints:
120
+ self.custom_endpoints.extend(pending_endpoints)
121
+
74
122
  self._setup_routes()
75
123
 
76
124
  def _setup_routes(self):
@@ -81,6 +129,71 @@ class FlockAPI:
81
129
 
82
130
  # Root redirect (if UI is enabled later) will be added in start()
83
131
 
132
+ # --- Register user-supplied custom endpoints ---------------------
133
+ if self.custom_endpoints:
134
+ import inspect
135
+
136
+ from fastapi import Request
137
+
138
+ # Register any endpoints collected during __init__ (self.custom_endpoints)
139
+ if self.custom_endpoints:
140
+ from fastapi import Body
141
+
142
+ def _create_handler_factory(callback: Callable[..., Any], req_model: type[BaseModel] | None):
143
+
144
+ if req_model is not None:
145
+
146
+ async def _route_handler(body: req_model = Body(...), request: Request = None): # type: ignore[arg-type,valid-type]
147
+ payload: dict[str, Any] = {
148
+ "body": body,
149
+ "query": dict(request.query_params) if request else {},
150
+ "flock": self.flock,
151
+ **(request.path_params if request else {}),
152
+ }
153
+
154
+ sig = inspect.signature(callback)
155
+ filtered_kwargs = {k: v for k, v in payload.items() if k in sig.parameters}
156
+
157
+ if inspect.iscoroutinefunction(callback):
158
+ return await callback(**filtered_kwargs)
159
+ return callback(**filtered_kwargs)
160
+
161
+ else:
162
+
163
+ async def _route_handler(request: Request):
164
+ payload: dict[str, Any] = {
165
+ "query": dict(request.query_params),
166
+ "flock": self.flock,
167
+ **request.path_params,
168
+ }
169
+
170
+ if request.method in {"POST", "PUT", "PATCH"}:
171
+ try:
172
+ payload["body"] = await request.json()
173
+ except Exception:
174
+ payload["body"] = await request.body()
175
+
176
+ sig = inspect.signature(callback)
177
+ filtered_kwargs = {k: v for k, v in payload.items() if k in sig.parameters}
178
+
179
+ if inspect.iscoroutinefunction(callback):
180
+ return await callback(**filtered_kwargs)
181
+ return callback(**filtered_kwargs)
182
+
183
+ return _route_handler
184
+
185
+ for ep in self.custom_endpoints:
186
+ self.app.add_api_route(
187
+ ep.path,
188
+ _create_handler_factory(ep.callback, ep.request_model),
189
+ methods=ep.methods or ["GET"],
190
+ name=ep.name or f"custom:{ep.path}",
191
+ include_in_schema=ep.include_in_schema,
192
+ response_model=ep.response_model,
193
+ summary=ep.summary,
194
+ description=ep.description,
195
+ )
196
+
84
197
  # --- Core Execution Helper Methods ---
85
198
  # These remain here as they need access to self.flock and self.run_store
86
199
 
@@ -431,6 +544,7 @@ class FlockAPI:
431
544
  port: int = 8344,
432
545
  server_name: str = "Flock API",
433
546
  create_ui: bool = False,
547
+ #custom_endpoints: Sequence[FlockEndpoint] | dict[tuple[str, list[str] | None], Callable[..., Any]] | None = None,
434
548
  ):
435
549
  """Start the API server. If create_ui is True, it mounts the new webapp or the old FastHTML UI at the root."""
436
550
  if create_ui:
flock/core/api/runner.py CHANGED
@@ -1,8 +1,10 @@
1
1
  # src/flock/api/runner.py
2
2
  """Provides functionality to start the Flock API server."""
3
3
 
4
- from typing import TYPE_CHECKING
4
+ from collections.abc import Callable, Sequence
5
+ from typing import TYPE_CHECKING, Any
5
6
 
7
+ from flock.core.api.custom_endpoint import FlockEndpoint
6
8
  from flock.core.logging.logging import get_logger
7
9
 
8
10
  if TYPE_CHECKING:
@@ -17,6 +19,7 @@ def start_flock_api(
17
19
  port: int = 8344,
18
20
  server_name: str = "Flock API",
19
21
  create_ui: bool = False,
22
+ custom_endpoints: Sequence[FlockEndpoint] | dict[tuple[str, list[str] | None], Callable[..., Any]] | None = None,
20
23
  ) -> None:
21
24
  """Start a REST API server for the given Flock instance."""
22
25
  try:
@@ -32,7 +35,10 @@ def start_flock_api(
32
35
  logger.info(
33
36
  f"Preparing to start API server for Flock '{flock.name}' on {host}:{port} {'with UI' if create_ui else 'without UI'}"
34
37
  )
35
- api_instance = FlockAPI(flock) # Pass the Flock instance to the API
38
+ api_instance = FlockAPI(flock, custom_endpoints=custom_endpoints) # Pass the Flock instance to the API
36
39
  api_instance.start(
37
- host=host, port=port, server_name=server_name, create_ui=create_ui
40
+ host=host,
41
+ port=port,
42
+ server_name=server_name,
43
+ create_ui=create_ui,
38
44
  )
flock/core/flock.py CHANGED
@@ -6,7 +6,7 @@ from __future__ import annotations # Ensure forward references work
6
6
  import asyncio
7
7
  import os
8
8
  import uuid
9
- from collections.abc import Callable
9
+ from collections.abc import Callable, Sequence
10
10
  from pathlib import Path
11
11
  from typing import (
12
12
  TYPE_CHECKING,
@@ -32,6 +32,7 @@ from pydantic import BaseModel, Field
32
32
 
33
33
  # Flock core components & utilities
34
34
  from flock.config import DEFAULT_MODEL, TELEMETRY
35
+ from flock.core.api.custom_endpoint import FlockEndpoint
35
36
  from flock.core.context.context import FlockContext
36
37
  from flock.core.context.context_manager import initialize_context
37
38
  from flock.core.execution.temporal_executor import run_temporal_workflow
@@ -685,6 +686,7 @@ class Flock(BaseModel, Serializable):
685
686
  server_name: str = "Flock API",
686
687
  create_ui: bool = False,
687
688
  ui_theme: str | None = None,
689
+ custom_endpoints: Sequence[FlockEndpoint] | dict[tuple[str, list[str] | None], Callable[..., Any]] | None = None,
688
690
  ) -> None:
689
691
  """Starts a REST API server for this Flock instance.
690
692
  If create_ui is True, integrates the web UI, potentially with a specific theme.
@@ -734,6 +736,7 @@ class Flock(BaseModel, Serializable):
734
736
  port=port,
735
737
  server_name=server_name,
736
738
  create_ui=False, # Explicitly false for API only runner
739
+ custom_endpoints=custom_endpoints,
737
740
  )
738
741
 
739
742
  # --- CLI Starter ---
@@ -42,6 +42,9 @@ class TelemetryConfig:
42
42
  enable_jaeger: bool = True,
43
43
  enable_file: bool = True,
44
44
  enable_sql: bool = True,
45
+ enable_otlp: bool = True,
46
+ otlp_protocol: str = "grpc",
47
+ otlp_endpoint: str = "http://localhost:4317",
45
48
  batch_processor_options: dict | None = None,
46
49
  ):
47
50
  """:param service_name: Name of your service.
@@ -61,6 +64,9 @@ class TelemetryConfig:
61
64
  self.enable_jaeger = enable_jaeger
62
65
  self.enable_file = enable_file
63
66
  self.enable_sql = enable_sql
67
+ self.enable_otlp = enable_otlp
68
+ self.otlp_protocol = otlp_protocol
69
+ self.otlp_endpoint = otlp_endpoint
64
70
  self.global_tracer = None
65
71
 
66
72
  def setup_tracing(self):
@@ -97,6 +103,32 @@ class TelemetryConfig:
97
103
 
98
104
  span_processors.append(SimpleSpanProcessor(jaeger_exporter))
99
105
 
106
+
107
+ if self.enable_otlp:
108
+ if self.otlp_protocol == "grpc":
109
+ from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import (
110
+ OTLPSpanExporter,
111
+ )
112
+
113
+ otlp_exporter = OTLPSpanExporter(
114
+ endpoint=self.otlp_endpoint,
115
+ insecure=True,
116
+ )
117
+ elif self.otlp_protocol == "http":
118
+ from opentelemetry.exporter.otlp.proto.http.trace_exporter import (
119
+ OTLPSpanExporter,
120
+ )
121
+
122
+ otlp_exporter = OTLPSpanExporter(
123
+ collector_endpoint=self.otlp_endpoint,
124
+ )
125
+ else:
126
+ raise ValueError(
127
+ "Invalid OTEL_EXPORTER_OTLP_PROTOCOL specified. Use 'grpc' or 'http'."
128
+ )
129
+
130
+ span_processors.append(SimpleSpanProcessor(otlp_exporter))
131
+
100
132
  # If a file path is provided, add the custom file exporter.
101
133
  if self.file_export_name and self.enable_file:
102
134
  file_exporter = FileSpanExporter(
flock/webapp/app/main.py CHANGED
@@ -362,7 +362,7 @@ async def page_dashboard(
362
362
  if effective_ui_mode == "scoped":
363
363
  if get_current_flock_instance(): # Re-check, as clear_current_flock might have run if user switched modes
364
364
  context["initial_content_url"] = (
365
- "/api/flocks/htmx/flock-properties-form"
365
+ "/ui/htmx/execution-view-container"
366
366
  )
367
367
  else:
368
368
  context["initial_content_url"] = "/ui/htmx/scoped-no-flock-view"
@@ -22,12 +22,12 @@
22
22
  {% if current_flock %}
23
23
  <hr>
24
24
  <h5>Current Flock</h5>
25
- <ul>
25
+ <ul>
26
26
  <li>
27
- <button hx-get="/api/flocks/htmx/flock-properties-form?ui_mode={{ ui_mode }}" hx-target="#main-content-area"
28
- hx-push-url="/ui/editor/properties?ui_mode={{ ui_mode }}" hx-indicator="#content-loading-indicator-main"
29
- class="contrast {% if request.url.path == '/ui/editor/properties' %}active-nav{% endif %}">
30
- <i class="fas fa-cog"></i> Properties
27
+ <button hx-get="/ui/htmx/execution-view-container?ui_mode={{ ui_mode }}" hx-target="#main-content-area"
28
+ hx-push-url="/ui/editor/execute?ui_mode={{ ui_mode }}" hx-indicator="#content-loading-indicator-main"
29
+ class="contrast {% if request.url.path == '/ui/editor/execute' %}active-nav{% endif %}">
30
+ <i class="fas fa-play-circle"></i> Execute Flock
31
31
  </button>
32
32
  </li>
33
33
  <li>
@@ -38,10 +38,10 @@
38
38
  </button>
39
39
  </li>
40
40
  <li>
41
- <button hx-get="/ui/htmx/execution-view-container?ui_mode={{ ui_mode }}" hx-target="#main-content-area"
42
- hx-push-url="/ui/editor/execute?ui_mode={{ ui_mode }}" hx-indicator="#content-loading-indicator-main"
43
- class="contrast {% if request.url.path == '/ui/editor/execute' %}active-nav{% endif %}">
44
- <i class="fas fa-play-circle"></i> Execute Flock
41
+ <button hx-get="/api/flocks/htmx/flock-properties-form?ui_mode={{ ui_mode }}" hx-target="#main-content-area"
42
+ hx-push-url="/ui/editor/properties?ui_mode={{ ui_mode }}" hx-indicator="#content-loading-indicator-main"
43
+ class="contrast {% if request.url.path == '/ui/editor/properties' %}active-nav{% endif %}">
44
+ <i class="fas fa-cog"></i> Properties
45
45
  </button>
46
46
  </li>
47
47
  </ul>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flock-core
3
- Version: 0.4.0b37
3
+ Version: 0.4.0b39
4
4
  Summary: Declarative LLM Orchestration at Scale
5
5
  Author-email: Andre Ratzenberger <andre.ratzenberger@whiteduck.de>
6
6
  License-File: LICENSE
@@ -1,5 +1,5 @@
1
1
  flock/__init__.py,sha256=1tMdEwpFvJXVso96jyGvGPXhD9P7EbZfkSV-WX1fXuE,5918
2
- flock/config.py,sha256=Nrip1Nn03KGVmRq2NYkuI-hJtnIVI1lHkurIrsPt7YI,1588
2
+ flock/config.py,sha256=9aUYglHavosdTS212WXW9qc_snZVimvxaXZ3Z5NDGWM,1923
3
3
  flock/cli/config.py,sha256=5DvFLObOx3ObisHnc9JfnUBnK83y0CBsUQzXfxPZve0,138
4
4
  flock/cli/constants.py,sha256=ZyXtTW91P1hUMkbMwmOwp_JEL5e9-YkcuM3vHM5glP4,978
5
5
  flock/cli/create_agent.py,sha256=DkeLUlrb7rGx3nZ04aADU9HXXu5mZTf_DBwT0xhzIv4,7
@@ -19,7 +19,7 @@ flock/cli/view_results.py,sha256=dOzK0O1FHSIDERnx48y-2Xke9BkOHS7pcOhs64AyIg0,781
19
19
  flock/cli/yaml_editor.py,sha256=K3N0bh61G1TSDAZDnurqW9e_-hO6CtSQKXQqlDhCjVo,12527
20
20
  flock/cli/assets/release_notes.md,sha256=bqnk50jxM3w5uY44Dc7MkdT8XmRREFxrVBAG9XCOSSU,4896
21
21
  flock/core/__init__.py,sha256=p7lmQULRu9ejIAELfanZiyMhW0CougIPvyFHW2nqBFQ,847
22
- flock/core/flock.py,sha256=HLJyWDdpUfDfpp-hHeyhrJty0FiOHBa8CBM2YrSMFyM,30139
22
+ flock/core/flock.py,sha256=A75h8f_vwZHKNkSVoUie9AZlKbUKpbUX1wNA3VNsPyY,30379
23
23
  flock/core/flock_agent.py,sha256=JTqaGD_OnZSd3bVU989WMsK1rAT6UGn-JYrPxFV15EE,39576
24
24
  flock/core/flock_evaluator.py,sha256=dOXZeDOGZcAmJ9ahqq_2bdGUU1VOXY4skmwTVpAjiVw,1685
25
25
  flock/core/flock_factory.py,sha256=_4zsjkEmJnCR7IvJ3SUHnDbX6c7Tt3E4P5ohxwKvE6w,3173
@@ -27,11 +27,12 @@ flock/core/flock_module.py,sha256=UCK6TFe4viXs596zeng0GD3gln4ZNGu_gCWkXIIMREg,30
27
27
  flock/core/flock_registry.py,sha256=Qcu9juUFNyDAOEsqVxauwVlWdfgKZrSzc8yT8JMiK-c,24246
28
28
  flock/core/flock_router.py,sha256=1OAXDsdaIIFApEfo6SRfFEDoTuGt3Si7n2MXiySEfis,2644
29
29
  flock/core/api/__init__.py,sha256=OKlhzDWZJfA6ddBwxQUmATY0TSzESsH032u00iVGvdA,228
30
+ flock/core/api/custom_endpoint.py,sha256=nCm8lhvq1OOVlHB5f1DD1Pgm5U-PgggPlYjlMRK4nPc,1090
30
31
  flock/core/api/endpoints.py,sha256=qQnJmtcYGkjdKtLllVpyJVjc-iZrvu5EEeVIryyt4tc,12987
31
- flock/core/api/main.py,sha256=Z8XSHV9iJsVr5k_77GqOZrdc9Lr5CJZ_N3SfaPNlixE,23663
32
+ flock/core/api/main.py,sha256=f7uZkl8wIOLSoaIztdRG40LqmmRQSdIe-WxXsZx4Q-U,28681
32
33
  flock/core/api/models.py,sha256=seqKuzhbN37nCNO7KrcJjI2mWuwiOKCLFcJcTPvTtag,3422
33
34
  flock/core/api/run_store.py,sha256=bFodJvVyWogzoezVy0cOoWWU3MdEBXf_6_5sBqCRWps,9227
34
- flock/core/api/runner.py,sha256=PjKQyMNawHm_N-X2uTUWBKAKBe7AEzNmRIGwQI6tUWw,1156
35
+ flock/core/api/runner.py,sha256=3izg6cVk1RoR1hDIDwMAO1gi3lnLcp8DPv7AnJBYx6A,1443
35
36
  flock/core/api/ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
37
  flock/core/api/ui/routes.py,sha256=nS-wWO94mshE5ozWfOQZ-HOvtes_1qxDVcqpMZtU5JQ,8885
37
38
  flock/core/api/ui/utils.py,sha256=V7PqYHNK519hFJ8jvvwf7bGpbBXCRz_HQG3BDCCqlNA,4802
@@ -46,7 +47,7 @@ flock/core/execution/temporal_executor.py,sha256=dHcb0xuzPFWU_wbwTgI7glLNyyppei9
46
47
  flock/core/interpreter/python_interpreter.py,sha256=RaUMZuufsKBNQ4FAeSaOgUuxzs8VYu5TgUUs-xwaxxM,26376
47
48
  flock/core/logging/__init__.py,sha256=Q8hp9-1ilPIUIV0jLgJ3_cP7COrea32cVwL7dicPnlM,82
48
49
  flock/core/logging/logging.py,sha256=JcgABQ8QJU1hhzhfF93eqnE0jhyXGZ2oObZst68sKR8,15409
49
- flock/core/logging/telemetry.py,sha256=3E9Tyj6AUR6A5RlIufcdCdWm5BAA7tbOsCa7lHoUQaU,5404
50
+ flock/core/logging/telemetry.py,sha256=3pApCiKAHbznuCBpJhlDxOrDJWK8cLs3ENk8CpA6WKc,6571
50
51
  flock/core/logging/trace_and_logged.py,sha256=5vNrK1kxuPMoPJ0-QjQg-EDJL1oiEzvU6UNi6X8FiMs,2117
51
52
  flock/core/logging/formatters/enum_builder.py,sha256=LgEYXUv84wK5vwHflZ5h8HBGgvLH3sByvUQe8tZiyY0,981
52
53
  flock/core/logging/formatters/theme_builder.py,sha256=Wnaal3HuUDA4HFg9tdql1BxYwK83ACOZBBQy-DXnxcA,17342
@@ -442,7 +443,7 @@ flock/webapp/__init__.py,sha256=YtRbbyciN3Z2oMB9fdXZuvM3e49R8m2mY5qHLDoapRA,37
442
443
  flock/webapp/run.py,sha256=DGXcZ9APSE9ae0r7t2DhVKsKdIx1kGZrhzzXFZmHqYc,4944
443
444
  flock/webapp/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
444
445
  flock/webapp/app/config.py,sha256=t4-4OCa_tqktkJLQgVbAmwFA7MoyahFE1IEDItsqqpY,4155
445
- flock/webapp/app/main.py,sha256=DV-k_oZ-EkpujLCK3x0wZWdA0GtWsFK-3wiOw4hdmzA,42980
446
+ flock/webapp/app/main.py,sha256=xCk2zhSAlgd2YmVT8Sfw-kwq9dnTBMtRybJpz__cCQw,42975
446
447
  flock/webapp/app/models_ui.py,sha256=vrEBLbhEp6FziAgBSFOLT1M7ckwadsTdT7qus5_NduE,329
447
448
  flock/webapp/app/theme_mapper.py,sha256=QzWwLWpED78oYp3FjZ9zxv1KxCyj43m8MZ0fhfzz37w,34302
448
449
  flock/webapp/app/utils.py,sha256=RF8DMKKAj1XPmm4txUdo2OdswI1ATQ7cqUm6G9JFDzA,2942
@@ -484,7 +485,7 @@ flock/webapp/templates/partials/_results_display.html,sha256=vuAbIdnG_7jzeHxeeoR
484
485
  flock/webapp/templates/partials/_settings_env_content.html,sha256=Q1Xr6wLHLlqiduqNk6PyF1B4juP-vvqLOLZyiHHNRLc,572
485
486
  flock/webapp/templates/partials/_settings_theme_content.html,sha256=-y5vGRKBZf3Cp5DDE1M4Qw-yunuMtCG54Sa7r60XfJE,807
486
487
  flock/webapp/templates/partials/_settings_view.html,sha256=7Uy2EfAgVJ2Kac5S6nkeaIEr2tSagVyR5CBbf07fbSQ,1349
487
- flock/webapp/templates/partials/_sidebar.html,sha256=JXvxZpAihndiZ83Fg9JQVsUihFnog443IsM-lqF9oPc,3541
488
+ flock/webapp/templates/partials/_sidebar.html,sha256=4KRRlOWEnzrMv4IhzNRFPJvN3VN4w-c5XGIa9nAb7W8,3549
488
489
  flock/webapp/templates/partials/_structured_data_view.html,sha256=IsmGbm2rKHZr6qx0a_n6QGs89Rq4xNFhymrZVI6OShc,2063
489
490
  flock/webapp/templates/partials/_theme_preview.html,sha256=81vP5z8958LjhGWGwjVAVw3zW0uvYwfcXlU30i9exmo,867
490
491
  flock/workflow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -494,8 +495,8 @@ flock/workflow/agent_execution_activity.py,sha256=Gy6FtuVAjf0NiUXmC3syS2eJpNQF4R
494
495
  flock/workflow/flock_workflow.py,sha256=iSUF_soFvWar0ffpkzE4irkDZRx0p4HnwmEBi_Ne2sY,9666
495
496
  flock/workflow/temporal_config.py,sha256=3_8O7SDEjMsSMXsWJBfnb6XTp0TFaz39uyzSlMTSF_I,3988
496
497
  flock/workflow/temporal_setup.py,sha256=YIHnSBntzOchHfMSh8hoLeNXrz3B1UbR14YrR6soM7A,1606
497
- flock_core-0.4.0b37.dist-info/METADATA,sha256=LwoAJHiE-9HElrwu-8oXHv-3oUfAojCocQpJLR2k6wk,17125
498
- flock_core-0.4.0b37.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
499
- flock_core-0.4.0b37.dist-info/entry_points.txt,sha256=rWaS5KSpkTmWySURGFZk6PhbJ87TmvcFQDi2uzjlagQ,37
500
- flock_core-0.4.0b37.dist-info/licenses/LICENSE,sha256=iYEqWy0wjULzM9GAERaybP4LBiPeu7Z1NEliLUdJKSc,1072
501
- flock_core-0.4.0b37.dist-info/RECORD,,
498
+ flock_core-0.4.0b39.dist-info/METADATA,sha256=zZnZWqBTRaem-XCem8L92sWCVkLIf0qe4ZfuMYiz4_U,17125
499
+ flock_core-0.4.0b39.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
500
+ flock_core-0.4.0b39.dist-info/entry_points.txt,sha256=rWaS5KSpkTmWySURGFZk6PhbJ87TmvcFQDi2uzjlagQ,37
501
+ flock_core-0.4.0b39.dist-info/licenses/LICENSE,sha256=iYEqWy0wjULzM9GAERaybP4LBiPeu7Z1NEliLUdJKSc,1072
502
+ flock_core-0.4.0b39.dist-info/RECORD,,