flock-core 0.5.0b28__py3-none-any.whl → 0.5.0b51__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.

Files changed (469) hide show
  1. flock/__init__.py +12 -217
  2. flock/agent.py +678 -0
  3. flock/api/themes.py +71 -0
  4. flock/artifacts.py +79 -0
  5. flock/cli.py +75 -0
  6. flock/components.py +173 -0
  7. flock/dashboard/__init__.py +28 -0
  8. flock/dashboard/collector.py +283 -0
  9. flock/dashboard/events.py +182 -0
  10. flock/dashboard/launcher.py +230 -0
  11. flock/dashboard/service.py +537 -0
  12. flock/dashboard/websocket.py +235 -0
  13. flock/engines/__init__.py +6 -0
  14. flock/engines/dspy_engine.py +856 -0
  15. flock/examples.py +128 -0
  16. flock/frontend/README.md +678 -0
  17. flock/frontend/docs/DESIGN_SYSTEM.md +1980 -0
  18. flock/frontend/index.html +12 -0
  19. flock/frontend/package-lock.json +4347 -0
  20. flock/frontend/package.json +48 -0
  21. flock/frontend/src/App.tsx +79 -0
  22. flock/frontend/src/__tests__/e2e/critical-scenarios.test.tsx +587 -0
  23. flock/frontend/src/__tests__/integration/filtering-e2e.test.tsx +387 -0
  24. flock/frontend/src/__tests__/integration/graph-rendering.test.tsx +640 -0
  25. flock/frontend/src/__tests__/integration/indexeddb-persistence.test.tsx +699 -0
  26. flock/frontend/src/components/common/BuildInfo.tsx +39 -0
  27. flock/frontend/src/components/common/EmptyState.module.css +115 -0
  28. flock/frontend/src/components/common/EmptyState.tsx +128 -0
  29. flock/frontend/src/components/common/ErrorBoundary.module.css +169 -0
  30. flock/frontend/src/components/common/ErrorBoundary.tsx +118 -0
  31. flock/frontend/src/components/common/KeyboardShortcutsDialog.css +251 -0
  32. flock/frontend/src/components/common/KeyboardShortcutsDialog.tsx +151 -0
  33. flock/frontend/src/components/common/LoadingSpinner.module.css +97 -0
  34. flock/frontend/src/components/common/LoadingSpinner.tsx +29 -0
  35. flock/frontend/src/components/controls/PublishControl.css +547 -0
  36. flock/frontend/src/components/controls/PublishControl.test.tsx +543 -0
  37. flock/frontend/src/components/controls/PublishControl.tsx +432 -0
  38. flock/frontend/src/components/details/DetailWindowContainer.tsx +62 -0
  39. flock/frontend/src/components/details/LiveOutputTab.test.tsx +792 -0
  40. flock/frontend/src/components/details/LiveOutputTab.tsx +220 -0
  41. flock/frontend/src/components/details/MessageHistoryTab.tsx +299 -0
  42. flock/frontend/src/components/details/NodeDetailWindow.test.tsx +501 -0
  43. flock/frontend/src/components/details/NodeDetailWindow.tsx +218 -0
  44. flock/frontend/src/components/details/RunStatusTab.tsx +307 -0
  45. flock/frontend/src/components/details/tabs.test.tsx +1015 -0
  46. flock/frontend/src/components/filters/CorrelationIDFilter.module.css +102 -0
  47. flock/frontend/src/components/filters/CorrelationIDFilter.test.tsx +197 -0
  48. flock/frontend/src/components/filters/CorrelationIDFilter.tsx +121 -0
  49. flock/frontend/src/components/filters/FilterBar.module.css +29 -0
  50. flock/frontend/src/components/filters/FilterBar.test.tsx +133 -0
  51. flock/frontend/src/components/filters/FilterBar.tsx +33 -0
  52. flock/frontend/src/components/filters/FilterPills.module.css +79 -0
  53. flock/frontend/src/components/filters/FilterPills.test.tsx +173 -0
  54. flock/frontend/src/components/filters/FilterPills.tsx +67 -0
  55. flock/frontend/src/components/filters/TimeRangeFilter.module.css +91 -0
  56. flock/frontend/src/components/filters/TimeRangeFilter.test.tsx +154 -0
  57. flock/frontend/src/components/filters/TimeRangeFilter.tsx +105 -0
  58. flock/frontend/src/components/graph/AgentNode.test.tsx +75 -0
  59. flock/frontend/src/components/graph/AgentNode.tsx +322 -0
  60. flock/frontend/src/components/graph/GraphCanvas.tsx +406 -0
  61. flock/frontend/src/components/graph/MessageFlowEdge.tsx +128 -0
  62. flock/frontend/src/components/graph/MessageNode.test.tsx +62 -0
  63. flock/frontend/src/components/graph/MessageNode.tsx +116 -0
  64. flock/frontend/src/components/graph/MiniMap.tsx +47 -0
  65. flock/frontend/src/components/graph/TransformEdge.tsx +123 -0
  66. flock/frontend/src/components/layout/DashboardLayout.css +407 -0
  67. flock/frontend/src/components/layout/DashboardLayout.tsx +300 -0
  68. flock/frontend/src/components/layout/Header.module.css +88 -0
  69. flock/frontend/src/components/layout/Header.tsx +52 -0
  70. flock/frontend/src/components/modules/EventLogModule.test.tsx +401 -0
  71. flock/frontend/src/components/modules/EventLogModule.tsx +396 -0
  72. flock/frontend/src/components/modules/EventLogModuleWrapper.tsx +17 -0
  73. flock/frontend/src/components/modules/ModuleRegistry.test.ts +333 -0
  74. flock/frontend/src/components/modules/ModuleRegistry.ts +85 -0
  75. flock/frontend/src/components/modules/ModuleWindow.tsx +155 -0
  76. flock/frontend/src/components/modules/registerModules.ts +20 -0
  77. flock/frontend/src/components/settings/AdvancedSettings.tsx +175 -0
  78. flock/frontend/src/components/settings/AppearanceSettings.tsx +185 -0
  79. flock/frontend/src/components/settings/GraphSettings.tsx +110 -0
  80. flock/frontend/src/components/settings/SettingsPanel.css +327 -0
  81. flock/frontend/src/components/settings/SettingsPanel.tsx +131 -0
  82. flock/frontend/src/components/settings/ThemeSelector.tsx +298 -0
  83. flock/frontend/src/hooks/useKeyboardShortcuts.ts +148 -0
  84. flock/frontend/src/hooks/useModulePersistence.test.ts +442 -0
  85. flock/frontend/src/hooks/useModulePersistence.ts +154 -0
  86. flock/frontend/src/hooks/useModules.ts +139 -0
  87. flock/frontend/src/hooks/usePersistence.ts +139 -0
  88. flock/frontend/src/main.tsx +13 -0
  89. flock/frontend/src/services/api.ts +213 -0
  90. flock/frontend/src/services/indexeddb.test.ts +793 -0
  91. flock/frontend/src/services/indexeddb.ts +794 -0
  92. flock/frontend/src/services/layout.test.ts +437 -0
  93. flock/frontend/src/services/layout.ts +146 -0
  94. flock/frontend/src/services/themeApplicator.ts +140 -0
  95. flock/frontend/src/services/themeService.ts +77 -0
  96. flock/frontend/src/services/websocket.test.ts +595 -0
  97. flock/frontend/src/services/websocket.ts +685 -0
  98. flock/frontend/src/store/filterStore.test.ts +242 -0
  99. flock/frontend/src/store/filterStore.ts +103 -0
  100. flock/frontend/src/store/graphStore.test.ts +186 -0
  101. flock/frontend/src/store/graphStore.ts +414 -0
  102. flock/frontend/src/store/moduleStore.test.ts +253 -0
  103. flock/frontend/src/store/moduleStore.ts +57 -0
  104. flock/frontend/src/store/settingsStore.ts +188 -0
  105. flock/frontend/src/store/streamStore.ts +68 -0
  106. flock/frontend/src/store/uiStore.test.ts +54 -0
  107. flock/frontend/src/store/uiStore.ts +110 -0
  108. flock/frontend/src/store/wsStore.ts +34 -0
  109. flock/frontend/src/styles/index.css +15 -0
  110. flock/frontend/src/styles/scrollbar.css +47 -0
  111. flock/frontend/src/styles/variables.css +488 -0
  112. flock/frontend/src/test/setup.ts +1 -0
  113. flock/frontend/src/types/filters.ts +14 -0
  114. flock/frontend/src/types/graph.ts +55 -0
  115. flock/frontend/src/types/modules.ts +7 -0
  116. flock/frontend/src/types/theme.ts +55 -0
  117. flock/frontend/src/utils/mockData.ts +85 -0
  118. flock/frontend/src/utils/performance.ts +16 -0
  119. flock/frontend/src/utils/transforms.test.ts +860 -0
  120. flock/frontend/src/utils/transforms.ts +323 -0
  121. flock/frontend/src/vite-env.d.ts +17 -0
  122. flock/frontend/tsconfig.json +27 -0
  123. flock/frontend/tsconfig.node.json +11 -0
  124. flock/frontend/vite.config.ts +25 -0
  125. flock/frontend/vitest.config.ts +11 -0
  126. flock/{core/util → helper}/cli_helper.py +4 -3
  127. flock/{core/logging → logging}/__init__.py +2 -3
  128. flock/{core/logging → logging}/formatters/enum_builder.py +3 -4
  129. flock/{core/logging → logging}/formatters/theme_builder.py +19 -44
  130. flock/{core/logging → logging}/formatters/themed_formatter.py +69 -115
  131. flock/{core/logging → logging}/logging.py +77 -61
  132. flock/{core/logging → logging}/telemetry.py +20 -26
  133. flock/{core/logging → logging}/telemetry_exporter/base_exporter.py +2 -2
  134. flock/{core/logging → logging}/telemetry_exporter/file_exporter.py +6 -9
  135. flock/{core/logging → logging}/telemetry_exporter/sqlite_exporter.py +2 -3
  136. flock/{core/logging → logging}/trace_and_logged.py +20 -24
  137. flock/mcp/__init__.py +91 -0
  138. flock/{core/mcp/mcp_client.py → mcp/client.py} +103 -154
  139. flock/{core/mcp/mcp_config.py → mcp/config.py} +62 -117
  140. flock/mcp/manager.py +255 -0
  141. flock/mcp/servers/sse/__init__.py +1 -1
  142. flock/mcp/servers/sse/flock_sse_server.py +11 -53
  143. flock/mcp/servers/stdio/__init__.py +1 -1
  144. flock/mcp/servers/stdio/flock_stdio_server.py +8 -48
  145. flock/mcp/servers/streamable_http/flock_streamable_http_server.py +17 -62
  146. flock/mcp/servers/websockets/flock_websocket_server.py +7 -40
  147. flock/{core/mcp/flock_mcp_tool.py → mcp/tool.py} +16 -26
  148. flock/mcp/types/__init__.py +42 -0
  149. flock/{core/mcp → mcp}/types/callbacks.py +9 -15
  150. flock/{core/mcp → mcp}/types/factories.py +7 -6
  151. flock/{core/mcp → mcp}/types/handlers.py +13 -18
  152. flock/{core/mcp → mcp}/types/types.py +70 -74
  153. flock/{core/mcp → mcp}/util/helpers.py +1 -1
  154. flock/orchestrator.py +645 -0
  155. flock/registry.py +148 -0
  156. flock/runtime.py +262 -0
  157. flock/service.py +140 -0
  158. flock/store.py +69 -0
  159. flock/subscription.py +111 -0
  160. flock/themes/andromeda.toml +1 -1
  161. flock/themes/apple-system-colors.toml +1 -1
  162. flock/themes/arcoiris.toml +1 -1
  163. flock/themes/atomonelight.toml +1 -1
  164. flock/themes/ayu copy.toml +1 -1
  165. flock/themes/ayu-light.toml +1 -1
  166. flock/themes/belafonte-day.toml +1 -1
  167. flock/themes/belafonte-night.toml +1 -1
  168. flock/themes/blulocodark.toml +1 -1
  169. flock/themes/breeze.toml +1 -1
  170. flock/themes/broadcast.toml +1 -1
  171. flock/themes/brogrammer.toml +1 -1
  172. flock/themes/builtin-dark.toml +1 -1
  173. flock/themes/builtin-pastel-dark.toml +1 -1
  174. flock/themes/catppuccin-latte.toml +1 -1
  175. flock/themes/catppuccin-macchiato.toml +1 -1
  176. flock/themes/catppuccin-mocha.toml +1 -1
  177. flock/themes/cga.toml +1 -1
  178. flock/themes/chalk.toml +1 -1
  179. flock/themes/ciapre.toml +1 -1
  180. flock/themes/coffee-theme.toml +1 -1
  181. flock/themes/cyberpunkscarletprotocol.toml +1 -1
  182. flock/themes/dark+.toml +1 -1
  183. flock/themes/darkermatrix.toml +1 -1
  184. flock/themes/darkside.toml +1 -1
  185. flock/themes/desert.toml +1 -1
  186. flock/themes/django.toml +1 -1
  187. flock/themes/djangosmooth.toml +1 -1
  188. flock/themes/doomone.toml +1 -1
  189. flock/themes/dotgov.toml +1 -1
  190. flock/themes/dracula+.toml +1 -1
  191. flock/themes/duckbones.toml +1 -1
  192. flock/themes/encom.toml +1 -1
  193. flock/themes/espresso.toml +1 -1
  194. flock/themes/everblush.toml +1 -1
  195. flock/themes/fairyfloss.toml +1 -1
  196. flock/themes/fideloper.toml +1 -1
  197. flock/themes/fishtank.toml +1 -1
  198. flock/themes/flexoki-light.toml +1 -1
  199. flock/themes/floraverse.toml +1 -1
  200. flock/themes/framer.toml +1 -1
  201. flock/themes/galizur.toml +1 -1
  202. flock/themes/github.toml +1 -1
  203. flock/themes/grass.toml +1 -1
  204. flock/themes/grey-green.toml +1 -1
  205. flock/themes/gruvboxlight.toml +1 -1
  206. flock/themes/guezwhoz.toml +1 -1
  207. flock/themes/harper.toml +1 -1
  208. flock/themes/hax0r-blue.toml +1 -1
  209. flock/themes/hopscotch.256.toml +1 -1
  210. flock/themes/ic-green-ppl.toml +1 -1
  211. flock/themes/iceberg-dark.toml +1 -1
  212. flock/themes/japanesque.toml +1 -1
  213. flock/themes/jubi.toml +1 -1
  214. flock/themes/kibble.toml +1 -1
  215. flock/themes/kolorit.toml +1 -1
  216. flock/themes/kurokula.toml +1 -1
  217. flock/themes/materialdesigncolors.toml +1 -1
  218. flock/themes/matrix.toml +1 -1
  219. flock/themes/mellifluous.toml +1 -1
  220. flock/themes/midnight-in-mojave.toml +1 -1
  221. flock/themes/monokai-remastered.toml +1 -1
  222. flock/themes/monokai-soda.toml +1 -1
  223. flock/themes/neon.toml +1 -1
  224. flock/themes/neopolitan.toml +1 -1
  225. flock/themes/nord-light.toml +1 -1
  226. flock/themes/ocean.toml +1 -1
  227. flock/themes/onehalfdark.toml +1 -1
  228. flock/themes/onehalflight.toml +1 -1
  229. flock/themes/palenighthc.toml +1 -1
  230. flock/themes/paulmillr.toml +1 -1
  231. flock/themes/pencildark.toml +1 -1
  232. flock/themes/pnevma.toml +1 -1
  233. flock/themes/purple-rain.toml +1 -1
  234. flock/themes/purplepeter.toml +1 -1
  235. flock/themes/raycast-dark.toml +1 -1
  236. flock/themes/red-sands.toml +1 -1
  237. flock/themes/relaxed.toml +1 -1
  238. flock/themes/retro.toml +1 -1
  239. flock/themes/rose-pine.toml +1 -1
  240. flock/themes/royal.toml +1 -1
  241. flock/themes/ryuuko.toml +1 -1
  242. flock/themes/sakura.toml +1 -1
  243. flock/themes/scarlet-protocol.toml +1 -1
  244. flock/themes/seoulbones-dark.toml +1 -1
  245. flock/themes/shades-of-purple.toml +1 -1
  246. flock/themes/smyck.toml +1 -1
  247. flock/themes/softserver.toml +1 -1
  248. flock/themes/solarized-darcula.toml +1 -1
  249. flock/themes/square.toml +1 -1
  250. flock/themes/sugarplum.toml +1 -1
  251. flock/themes/thayer-bright.toml +1 -1
  252. flock/themes/tokyonight.toml +1 -1
  253. flock/themes/tomorrow.toml +1 -1
  254. flock/themes/ubuntu.toml +1 -1
  255. flock/themes/ultradark.toml +1 -1
  256. flock/themes/ultraviolent.toml +1 -1
  257. flock/themes/unikitty.toml +1 -1
  258. flock/themes/urple.toml +1 -1
  259. flock/themes/vesper.toml +1 -1
  260. flock/themes/vimbones.toml +1 -1
  261. flock/themes/wildcherry.toml +1 -1
  262. flock/themes/wilmersdorf.toml +1 -1
  263. flock/themes/wryan.toml +1 -1
  264. flock/themes/xcodedarkhc.toml +1 -1
  265. flock/themes/xcodelight.toml +1 -1
  266. flock/themes/zenbones-light.toml +1 -1
  267. flock/themes/zenwritten-dark.toml +1 -1
  268. flock/utilities.py +301 -0
  269. flock/{components/utility → utility}/output_utility_component.py +68 -53
  270. flock/visibility.py +107 -0
  271. flock_core-0.5.0b51.dist-info/METADATA +747 -0
  272. flock_core-0.5.0b51.dist-info/RECORD +508 -0
  273. flock_core-0.5.0b51.dist-info/entry_points.txt +2 -0
  274. {flock_core-0.5.0b28.dist-info → flock_core-0.5.0b51.dist-info}/licenses/LICENSE +1 -1
  275. flock/adapter/__init__.py +0 -14
  276. flock/adapter/azure_adapter.py +0 -68
  277. flock/adapter/chroma_adapter.py +0 -73
  278. flock/adapter/faiss_adapter.py +0 -97
  279. flock/adapter/pinecone_adapter.py +0 -51
  280. flock/adapter/vector_base.py +0 -47
  281. flock/cli/assets/release_notes.md +0 -140
  282. flock/cli/config.py +0 -8
  283. flock/cli/constants.py +0 -36
  284. flock/cli/create_agent.py +0 -1
  285. flock/cli/create_flock.py +0 -280
  286. flock/cli/execute_flock.py +0 -620
  287. flock/cli/load_agent.py +0 -1
  288. flock/cli/load_examples.py +0 -1
  289. flock/cli/load_flock.py +0 -192
  290. flock/cli/load_release_notes.py +0 -20
  291. flock/cli/loaded_flock_cli.py +0 -254
  292. flock/cli/manage_agents.py +0 -459
  293. flock/cli/registry_management.py +0 -889
  294. flock/cli/runner.py +0 -41
  295. flock/cli/settings.py +0 -857
  296. flock/cli/utils.py +0 -135
  297. flock/cli/view_results.py +0 -29
  298. flock/cli/yaml_editor.py +0 -396
  299. flock/components/__init__.py +0 -30
  300. flock/components/evaluation/__init__.py +0 -9
  301. flock/components/evaluation/declarative_evaluation_component.py +0 -606
  302. flock/components/routing/__init__.py +0 -15
  303. flock/components/routing/conditional_routing_component.py +0 -494
  304. flock/components/routing/default_routing_component.py +0 -103
  305. flock/components/routing/llm_routing_component.py +0 -206
  306. flock/components/utility/__init__.py +0 -22
  307. flock/components/utility/example_utility_component.py +0 -250
  308. flock/components/utility/feedback_utility_component.py +0 -206
  309. flock/components/utility/memory_utility_component.py +0 -550
  310. flock/components/utility/metrics_utility_component.py +0 -700
  311. flock/config.py +0 -61
  312. flock/core/__init__.py +0 -110
  313. flock/core/agent/__init__.py +0 -16
  314. flock/core/agent/default_agent.py +0 -216
  315. flock/core/agent/flock_agent_components.py +0 -104
  316. flock/core/agent/flock_agent_execution.py +0 -101
  317. flock/core/agent/flock_agent_integration.py +0 -260
  318. flock/core/agent/flock_agent_lifecycle.py +0 -186
  319. flock/core/agent/flock_agent_serialization.py +0 -381
  320. flock/core/api/__init__.py +0 -10
  321. flock/core/api/custom_endpoint.py +0 -45
  322. flock/core/api/endpoints.py +0 -254
  323. flock/core/api/main.py +0 -162
  324. flock/core/api/models.py +0 -97
  325. flock/core/api/run_store.py +0 -224
  326. flock/core/api/runner.py +0 -44
  327. flock/core/api/service.py +0 -214
  328. flock/core/component/__init__.py +0 -15
  329. flock/core/component/agent_component_base.py +0 -309
  330. flock/core/component/evaluation_component.py +0 -62
  331. flock/core/component/routing_component.py +0 -74
  332. flock/core/component/utility_component.py +0 -69
  333. flock/core/config/flock_agent_config.py +0 -58
  334. flock/core/config/scheduled_agent_config.py +0 -40
  335. flock/core/context/context.py +0 -213
  336. flock/core/context/context_manager.py +0 -37
  337. flock/core/context/context_vars.py +0 -10
  338. flock/core/evaluation/utils.py +0 -396
  339. flock/core/execution/batch_executor.py +0 -369
  340. flock/core/execution/evaluation_executor.py +0 -438
  341. flock/core/execution/local_executor.py +0 -31
  342. flock/core/execution/opik_executor.py +0 -103
  343. flock/core/execution/temporal_executor.py +0 -164
  344. flock/core/flock.py +0 -634
  345. flock/core/flock_agent.py +0 -336
  346. flock/core/flock_factory.py +0 -613
  347. flock/core/flock_scheduler.py +0 -166
  348. flock/core/flock_server_manager.py +0 -136
  349. flock/core/interpreter/python_interpreter.py +0 -689
  350. flock/core/mcp/__init__.py +0 -1
  351. flock/core/mcp/flock_mcp_server.py +0 -680
  352. flock/core/mcp/mcp_client_manager.py +0 -201
  353. flock/core/mcp/types/__init__.py +0 -1
  354. flock/core/mixin/dspy_integration.py +0 -403
  355. flock/core/mixin/prompt_parser.py +0 -125
  356. flock/core/orchestration/__init__.py +0 -15
  357. flock/core/orchestration/flock_batch_processor.py +0 -94
  358. flock/core/orchestration/flock_evaluator.py +0 -113
  359. flock/core/orchestration/flock_execution.py +0 -295
  360. flock/core/orchestration/flock_initialization.py +0 -149
  361. flock/core/orchestration/flock_server_manager.py +0 -67
  362. flock/core/orchestration/flock_web_server.py +0 -117
  363. flock/core/registry/__init__.py +0 -45
  364. flock/core/registry/agent_registry.py +0 -69
  365. flock/core/registry/callable_registry.py +0 -139
  366. flock/core/registry/component_discovery.py +0 -142
  367. flock/core/registry/component_registry.py +0 -64
  368. flock/core/registry/config_mapping.py +0 -64
  369. flock/core/registry/decorators.py +0 -137
  370. flock/core/registry/registry_hub.py +0 -205
  371. flock/core/registry/server_registry.py +0 -57
  372. flock/core/registry/type_registry.py +0 -86
  373. flock/core/serialization/__init__.py +0 -13
  374. flock/core/serialization/callable_registry.py +0 -52
  375. flock/core/serialization/flock_serializer.py +0 -832
  376. flock/core/serialization/json_encoder.py +0 -41
  377. flock/core/serialization/secure_serializer.py +0 -175
  378. flock/core/serialization/serializable.py +0 -342
  379. flock/core/serialization/serialization_utils.py +0 -412
  380. flock/core/util/file_path_utils.py +0 -223
  381. flock/core/util/hydrator.py +0 -309
  382. flock/core/util/input_resolver.py +0 -164
  383. flock/core/util/loader.py +0 -59
  384. flock/core/util/splitter.py +0 -219
  385. flock/di.py +0 -27
  386. flock/platform/docker_tools.py +0 -49
  387. flock/platform/jaeger_install.py +0 -86
  388. flock/webapp/__init__.py +0 -1
  389. flock/webapp/app/__init__.py +0 -0
  390. flock/webapp/app/api/__init__.py +0 -0
  391. flock/webapp/app/api/agent_management.py +0 -241
  392. flock/webapp/app/api/execution.py +0 -709
  393. flock/webapp/app/api/flock_management.py +0 -129
  394. flock/webapp/app/api/registry_viewer.py +0 -30
  395. flock/webapp/app/chat.py +0 -665
  396. flock/webapp/app/config.py +0 -104
  397. flock/webapp/app/dependencies.py +0 -117
  398. flock/webapp/app/main.py +0 -1070
  399. flock/webapp/app/middleware.py +0 -113
  400. flock/webapp/app/models_ui.py +0 -7
  401. flock/webapp/app/services/__init__.py +0 -0
  402. flock/webapp/app/services/feedback_file_service.py +0 -363
  403. flock/webapp/app/services/flock_service.py +0 -337
  404. flock/webapp/app/services/sharing_models.py +0 -81
  405. flock/webapp/app/services/sharing_store.py +0 -762
  406. flock/webapp/app/templates/theme_mapper.html +0 -326
  407. flock/webapp/app/theme_mapper.py +0 -812
  408. flock/webapp/app/utils.py +0 -85
  409. flock/webapp/run.py +0 -215
  410. flock/webapp/static/css/chat.css +0 -301
  411. flock/webapp/static/css/components.css +0 -167
  412. flock/webapp/static/css/header.css +0 -39
  413. flock/webapp/static/css/layout.css +0 -46
  414. flock/webapp/static/css/sidebar.css +0 -127
  415. flock/webapp/static/css/two-pane.css +0 -48
  416. flock/webapp/templates/base.html +0 -200
  417. flock/webapp/templates/chat.html +0 -152
  418. flock/webapp/templates/chat_settings.html +0 -19
  419. flock/webapp/templates/flock_editor.html +0 -16
  420. flock/webapp/templates/index.html +0 -12
  421. flock/webapp/templates/partials/_agent_detail_form.html +0 -93
  422. flock/webapp/templates/partials/_agent_list.html +0 -18
  423. flock/webapp/templates/partials/_agent_manager_view.html +0 -51
  424. flock/webapp/templates/partials/_agent_tools_checklist.html +0 -14
  425. flock/webapp/templates/partials/_chat_container.html +0 -15
  426. flock/webapp/templates/partials/_chat_messages.html +0 -57
  427. flock/webapp/templates/partials/_chat_settings_form.html +0 -85
  428. flock/webapp/templates/partials/_create_flock_form.html +0 -50
  429. flock/webapp/templates/partials/_dashboard_flock_detail.html +0 -17
  430. flock/webapp/templates/partials/_dashboard_flock_file_list.html +0 -16
  431. flock/webapp/templates/partials/_dashboard_flock_properties_preview.html +0 -28
  432. flock/webapp/templates/partials/_dashboard_upload_flock_form.html +0 -16
  433. flock/webapp/templates/partials/_dynamic_input_form_content.html +0 -22
  434. flock/webapp/templates/partials/_env_vars_table.html +0 -23
  435. flock/webapp/templates/partials/_execution_form.html +0 -118
  436. flock/webapp/templates/partials/_execution_view_container.html +0 -28
  437. flock/webapp/templates/partials/_flock_file_list.html +0 -23
  438. flock/webapp/templates/partials/_flock_properties_form.html +0 -52
  439. flock/webapp/templates/partials/_flock_upload_form.html +0 -16
  440. flock/webapp/templates/partials/_header_flock_status.html +0 -5
  441. flock/webapp/templates/partials/_load_manager_view.html +0 -49
  442. flock/webapp/templates/partials/_registry_table.html +0 -25
  443. flock/webapp/templates/partials/_registry_viewer_content.html +0 -70
  444. flock/webapp/templates/partials/_results_display.html +0 -78
  445. flock/webapp/templates/partials/_settings_env_content.html +0 -9
  446. flock/webapp/templates/partials/_settings_theme_content.html +0 -14
  447. flock/webapp/templates/partials/_settings_view.html +0 -36
  448. flock/webapp/templates/partials/_share_chat_link_snippet.html +0 -11
  449. flock/webapp/templates/partials/_share_link_snippet.html +0 -35
  450. flock/webapp/templates/partials/_sidebar.html +0 -74
  451. flock/webapp/templates/partials/_streaming_results_container.html +0 -195
  452. flock/webapp/templates/partials/_structured_data_view.html +0 -40
  453. flock/webapp/templates/partials/_theme_preview.html +0 -36
  454. flock/webapp/templates/registry_viewer.html +0 -84
  455. flock/webapp/templates/shared_run_page.html +0 -140
  456. flock/workflow/__init__.py +0 -0
  457. flock/workflow/activities.py +0 -196
  458. flock/workflow/agent_activities.py +0 -24
  459. flock/workflow/agent_execution_activity.py +0 -202
  460. flock/workflow/flock_workflow.py +0 -214
  461. flock/workflow/temporal_config.py +0 -96
  462. flock/workflow/temporal_setup.py +0 -68
  463. flock_core-0.5.0b28.dist-info/METADATA +0 -274
  464. flock_core-0.5.0b28.dist-info/RECORD +0 -561
  465. flock_core-0.5.0b28.dist-info/entry_points.txt +0 -2
  466. /flock/{core/logging → logging}/formatters/themes.py +0 -0
  467. /flock/{core/logging → logging}/span_middleware/baggage_span_processor.py +0 -0
  468. /flock/{core/mcp → mcp}/util/__init__.py +0 -0
  469. {flock_core-0.5.0b28.dist-info → flock_core-0.5.0b51.dist-info}/WHEEL +0 -0
@@ -0,0 +1,537 @@
1
+ """DashboardHTTPService - extends BlackboardHTTPService with WebSocket support.
2
+
3
+ Provides real-time dashboard capabilities by:
4
+ 1. Mounting WebSocket endpoint at /ws
5
+ 2. Serving static files for dashboard frontend
6
+ 3. Integrating DashboardEventCollector with WebSocketManager
7
+ 4. Supporting CORS for development mode (DASHBOARD_DEV=1)
8
+ """
9
+
10
+ import os
11
+ from importlib.metadata import PackageNotFoundError, version
12
+ from pathlib import Path
13
+ from typing import Any
14
+ from uuid import uuid4
15
+
16
+ from fastapi import HTTPException, WebSocket, WebSocketDisconnect
17
+ from fastapi.middleware.cors import CORSMiddleware
18
+ from fastapi.staticfiles import StaticFiles
19
+ from pydantic import ValidationError
20
+
21
+ from flock.dashboard.collector import DashboardEventCollector
22
+ from flock.dashboard.events import MessagePublishedEvent, VisibilitySpec
23
+ from flock.dashboard.websocket import WebSocketManager
24
+ from flock.logging.logging import get_logger
25
+ from flock.orchestrator import Flock
26
+ from flock.registry import type_registry
27
+ from flock.service import BlackboardHTTPService
28
+
29
+
30
+ logger = get_logger("dashboard.service")
31
+
32
+
33
+ class DashboardHTTPService(BlackboardHTTPService):
34
+ """HTTP service with WebSocket support for real-time dashboard.
35
+
36
+ Extends BlackboardHTTPService to add:
37
+ - WebSocket endpoint at /ws for real-time event streaming
38
+ - Static file serving for dashboard frontend
39
+ - Integration with DashboardEventCollector
40
+ - Optional CORS middleware for development
41
+ """
42
+
43
+ def __init__(
44
+ self,
45
+ orchestrator: Flock,
46
+ websocket_manager: WebSocketManager | None = None,
47
+ event_collector: DashboardEventCollector | None = None,
48
+ ) -> None:
49
+ """Initialize DashboardHTTPService.
50
+
51
+ Args:
52
+ orchestrator: Flock orchestrator instance
53
+ websocket_manager: Optional WebSocketManager (creates new if not provided)
54
+ event_collector: Optional DashboardEventCollector (creates new if not provided)
55
+ """
56
+ # Initialize base service
57
+ super().__init__(orchestrator)
58
+
59
+ # Initialize WebSocket manager and event collector
60
+ self.websocket_manager = websocket_manager or WebSocketManager()
61
+ self.event_collector = event_collector or DashboardEventCollector()
62
+
63
+ # Integrate collector with WebSocket manager
64
+ self.event_collector.set_websocket_manager(self.websocket_manager)
65
+
66
+ # Configure CORS if DASHBOARD_DEV environment variable is set
67
+ if os.environ.get("DASHBOARD_DEV") == "1":
68
+ logger.info("DASHBOARD_DEV mode enabled - adding CORS middleware")
69
+ self.app.add_middleware(
70
+ CORSMiddleware,
71
+ allow_origins=["*"], # Allow all origins in dev mode
72
+ allow_credentials=True,
73
+ allow_methods=["*"],
74
+ allow_headers=["*"],
75
+ )
76
+
77
+ # IMPORTANT: Register API routes BEFORE static files!
78
+ # Static file mount acts as catch-all and must be last
79
+ self._register_control_routes()
80
+ self._register_theme_routes()
81
+ self._register_dashboard_routes()
82
+
83
+ logger.info("DashboardHTTPService initialized")
84
+
85
+ def _register_dashboard_routes(self) -> None:
86
+ """Register WebSocket endpoint and static file serving."""
87
+ app = self.app
88
+
89
+ @app.websocket("/ws")
90
+ async def websocket_endpoint(websocket: WebSocket) -> None:
91
+ """WebSocket endpoint for real-time dashboard events.
92
+
93
+ Handles connection lifecycle:
94
+ 1. Accept connection
95
+ 2. Add to WebSocketManager pool
96
+ 3. Keep connection alive
97
+ 4. Handle disconnection gracefully
98
+ """
99
+ await websocket.accept()
100
+ await self.websocket_manager.add_client(websocket)
101
+
102
+ try:
103
+ # Keep connection alive and handle incoming messages
104
+ # Dashboard clients may send heartbeat responses or control messages
105
+ while True:
106
+ # Wait for messages from client (pong responses, etc.)
107
+ try:
108
+ data = await websocket.receive_text()
109
+ # Handle client messages if needed (e.g., pong responses)
110
+ # For Phase 3, we primarily broadcast from server to client
111
+ logger.debug(f"Received message from client: {data[:100]}")
112
+ except WebSocketDisconnect:
113
+ logger.info("WebSocket client disconnected")
114
+ break
115
+ except Exception as e:
116
+ logger.warning(f"Error receiving WebSocket message: {e}")
117
+ break
118
+
119
+ except Exception as e:
120
+ logger.exception(f"WebSocket endpoint error: {e}")
121
+ finally:
122
+ # Clean up: remove client from pool
123
+ await self.websocket_manager.remove_client(websocket)
124
+
125
+ # Serve static files for dashboard frontend
126
+ # Look for static files in dashboard directory
127
+ dashboard_dir = Path(__file__).parent
128
+ static_dir = dashboard_dir / "static"
129
+
130
+ # Also check for 'dist' or 'build' directories (common build output names)
131
+ possible_dirs = [static_dir, dashboard_dir / "dist", dashboard_dir / "build"]
132
+
133
+ for dir_path in possible_dirs:
134
+ if dir_path.exists() and dir_path.is_dir():
135
+ logger.info(f"Mounting static files from: {dir_path}")
136
+ # Mount at root to serve index.html and other frontend assets
137
+ app.mount(
138
+ "/",
139
+ StaticFiles(directory=str(dir_path), html=True),
140
+ name="dashboard-static",
141
+ )
142
+ break
143
+ else:
144
+ logger.warning(
145
+ f"No static directory found in {dashboard_dir}. "
146
+ "Dashboard frontend will not be served. "
147
+ "Expected directories: static/, dist/, or build/"
148
+ )
149
+
150
+ def _register_control_routes(self) -> None:
151
+ """Register control API endpoints for dashboard operations."""
152
+ app = self.app
153
+ orchestrator = self.orchestrator
154
+
155
+ @app.get("/api/artifact-types")
156
+ async def get_artifact_types() -> dict[str, Any]:
157
+ """Get all registered artifact types with their schemas.
158
+
159
+ Returns:
160
+ {
161
+ "artifact_types": [
162
+ {
163
+ "name": "TypeName",
164
+ "schema": {...}
165
+ },
166
+ ...
167
+ ]
168
+ }
169
+ """
170
+ artifact_types = []
171
+
172
+ for type_name in type_registry._by_name:
173
+ try:
174
+ model_class = type_registry.resolve(type_name)
175
+ # Get Pydantic schema
176
+ schema = model_class.model_json_schema()
177
+ artifact_types.append({"name": type_name, "schema": schema})
178
+ except Exception as e:
179
+ logger.warning(f"Could not get schema for {type_name}: {e}")
180
+
181
+ return {"artifact_types": artifact_types}
182
+
183
+ @app.get("/api/agents")
184
+ async def get_agents() -> dict[str, Any]:
185
+ """Get all registered agents.
186
+
187
+ Returns:
188
+ {
189
+ "agents": [
190
+ {
191
+ "name": "agent_name",
192
+ "description": "...",
193
+ "status": "ready",
194
+ "subscriptions": ["TypeA", "TypeB"],
195
+ "output_types": ["TypeC", "TypeD"]
196
+ },
197
+ ...
198
+ ]
199
+ }
200
+ """
201
+ agents = []
202
+
203
+ for agent in orchestrator.agents:
204
+ # Extract consumed types from agent subscriptions
205
+ consumed_types = []
206
+ for sub in agent.subscriptions:
207
+ consumed_types.extend(sub.type_names)
208
+
209
+ # Extract produced types from agent outputs
210
+ produced_types = [output.spec.type_name for output in agent.outputs]
211
+
212
+ agents.append(
213
+ {
214
+ "name": agent.name,
215
+ "description": agent.description or "",
216
+ "status": "ready",
217
+ "subscriptions": consumed_types,
218
+ "output_types": produced_types,
219
+ }
220
+ )
221
+
222
+ return {"agents": agents}
223
+
224
+ @app.get("/api/version")
225
+ async def get_version() -> dict[str, str]:
226
+ """Get version information for the backend and dashboard.
227
+
228
+ Returns:
229
+ {
230
+ "backend_version": "0.1.18",
231
+ "package_name": "flock-flow"
232
+ }
233
+ """
234
+ try:
235
+ backend_version = version("flock-flow")
236
+ except PackageNotFoundError:
237
+ # Fallback version if package not installed
238
+ backend_version = "0.2.0-dev"
239
+
240
+ return {"backend_version": backend_version, "package_name": "flock-flow"}
241
+
242
+ @app.post("/api/control/publish")
243
+ async def publish_artifact(body: dict[str, Any]) -> dict[str, str]:
244
+ """Publish artifact with correlation tracking.
245
+
246
+ Request body:
247
+ {
248
+ "artifact_type": "TypeName",
249
+ "content": {"field": "value", ...}
250
+ }
251
+
252
+ Returns:
253
+ {
254
+ "correlation_id": "<uuid>",
255
+ "published_at": "<iso-timestamp>"
256
+ }
257
+ """
258
+ # Validate required fields
259
+ artifact_type = body.get("artifact_type")
260
+ content = body.get("content")
261
+
262
+ if not artifact_type:
263
+ raise HTTPException(status_code=400, detail="artifact_type is required")
264
+ if content is None:
265
+ raise HTTPException(status_code=400, detail="content is required")
266
+
267
+ try:
268
+ # Resolve type from registry
269
+ model_class = type_registry.resolve(artifact_type)
270
+
271
+ # Validate content against Pydantic schema
272
+ try:
273
+ instance = model_class(**content)
274
+ except ValidationError as e:
275
+ raise HTTPException(status_code=422, detail=f"Validation error: {e!s}")
276
+
277
+ # Generate correlation ID
278
+ correlation_id = str(uuid4())
279
+
280
+ # Publish to orchestrator
281
+ artifact = await orchestrator.publish(
282
+ instance, correlation_id=correlation_id, is_dashboard=True
283
+ )
284
+
285
+ # Phase 11 Fix: Emit message_published event for dashboard visibility
286
+ # This enables virtual "orchestrator" agent to appear in both Agent View and Blackboard View
287
+ event = MessagePublishedEvent(
288
+ correlation_id=str(artifact.correlation_id),
289
+ artifact_id=str(artifact.id),
290
+ artifact_type=artifact.type,
291
+ produced_by=artifact.produced_by, # Will be "orchestrator" or similar for non-agent publishers
292
+ payload=artifact.payload,
293
+ visibility=VisibilitySpec(
294
+ kind="Public"
295
+ ), # Dashboard-published artifacts are public by default
296
+ tags=list(artifact.tags) if artifact.tags else [],
297
+ partition_key=artifact.partition_key,
298
+ version=artifact.version,
299
+ consumers=[], # Will be populated by subscription matching in frontend
300
+ )
301
+ await self.websocket_manager.broadcast(event)
302
+
303
+ return {
304
+ "correlation_id": str(artifact.correlation_id),
305
+ "published_at": artifact.created_at.isoformat(),
306
+ }
307
+
308
+ except KeyError:
309
+ raise HTTPException(
310
+ status_code=422, detail=f"Unknown artifact type: {artifact_type}"
311
+ )
312
+ except Exception as e:
313
+ logger.exception(f"Error publishing artifact: {e}")
314
+ raise HTTPException(status_code=500, detail=str(e))
315
+
316
+ @app.post("/api/control/invoke")
317
+ async def invoke_agent(body: dict[str, Any]) -> dict[str, Any]:
318
+ """Directly invoke a specific agent.
319
+
320
+ Request body:
321
+ {
322
+ "agent_name": "agent_name",
323
+ "input": {"type": "TypeName", "field": "value", ...}
324
+ }
325
+
326
+ Returns:
327
+ {
328
+ "invocation_id": "<uuid>",
329
+ "result": "success"
330
+ }
331
+ """
332
+ # Validate required fields
333
+ agent_name = body.get("agent_name")
334
+ input_data = body.get("input")
335
+
336
+ if not agent_name:
337
+ raise HTTPException(status_code=400, detail="agent_name is required")
338
+ if input_data is None:
339
+ raise HTTPException(status_code=400, detail="input is required")
340
+
341
+ try:
342
+ # Get agent from orchestrator
343
+ agent = orchestrator.get_agent(agent_name)
344
+ except KeyError:
345
+ raise HTTPException(status_code=404, detail=f"Agent not found: {agent_name}")
346
+
347
+ try:
348
+ # Parse input type and create instance
349
+ input_type = input_data.get("type")
350
+ if not input_type:
351
+ raise HTTPException(status_code=400, detail="input.type is required")
352
+
353
+ # Resolve type from registry
354
+ model_class = type_registry.resolve(input_type)
355
+
356
+ # Create payload by removing 'type' key
357
+ payload = {k: v for k, v in input_data.items() if k != "type"}
358
+
359
+ # Validate and create instance
360
+ try:
361
+ instance = model_class(**payload)
362
+ except ValidationError as e:
363
+ raise HTTPException(status_code=422, detail=f"Validation error: {e!s}")
364
+
365
+ # Invoke agent
366
+ outputs = await orchestrator.invoke(agent, instance)
367
+
368
+ # Generate invocation ID from first output or create new UUID
369
+ invocation_id = str(outputs[0].id) if outputs else str(uuid4())
370
+
371
+ # Extract correlation_id from first output (for filter automation)
372
+ correlation_id = (
373
+ str(outputs[0].correlation_id)
374
+ if outputs and outputs[0].correlation_id
375
+ else None
376
+ )
377
+
378
+ return {
379
+ "invocation_id": invocation_id,
380
+ "correlation_id": correlation_id,
381
+ "result": "success",
382
+ }
383
+
384
+ except HTTPException:
385
+ raise
386
+ except KeyError:
387
+ raise HTTPException(status_code=422, detail=f"Unknown type: {input_type}")
388
+ except Exception as e:
389
+ logger.exception(f"Error invoking agent: {e}")
390
+ raise HTTPException(status_code=500, detail=str(e))
391
+
392
+ @app.post("/api/control/pause")
393
+ async def pause_orchestrator() -> dict[str, Any]:
394
+ """Pause orchestrator (placeholder).
395
+
396
+ Returns:
397
+ 501 Not Implemented
398
+ """
399
+ raise HTTPException(status_code=501, detail="Pause functionality coming in Phase 12")
400
+
401
+ @app.post("/api/control/resume")
402
+ async def resume_orchestrator() -> dict[str, Any]:
403
+ """Resume orchestrator (placeholder).
404
+
405
+ Returns:
406
+ 501 Not Implemented
407
+ """
408
+ raise HTTPException(status_code=501, detail="Resume functionality coming in Phase 12")
409
+
410
+ @app.get("/api/streaming-history/{agent_name}")
411
+ async def get_streaming_history(agent_name: str) -> dict[str, Any]:
412
+ """Get historical streaming output for a specific agent.
413
+
414
+ Args:
415
+ agent_name: Name of the agent to get streaming history for
416
+
417
+ Returns:
418
+ {
419
+ "agent_name": "agent_name",
420
+ "events": [
421
+ {
422
+ "correlation_id": "...",
423
+ "timestamp": "...",
424
+ "agent_name": "...",
425
+ "run_id": "...",
426
+ "output_type": "llm_token",
427
+ "content": "...",
428
+ "sequence": 0,
429
+ "is_final": false
430
+ },
431
+ ...
432
+ ]
433
+ }
434
+ """
435
+ try:
436
+ history = self.websocket_manager.get_streaming_history(agent_name)
437
+ return {
438
+ "agent_name": agent_name,
439
+ "events": [event.model_dump() for event in history],
440
+ }
441
+ except Exception as e:
442
+ logger.exception(f"Failed to get streaming history for {agent_name}: {e}")
443
+ raise HTTPException(
444
+ status_code=500, detail=f"Failed to get streaming history: {e!s}"
445
+ )
446
+
447
+ def _register_theme_routes(self) -> None:
448
+ """Register theme API endpoints for dashboard customization."""
449
+ from pathlib import Path
450
+
451
+ import toml
452
+
453
+ app = self.app
454
+ themes_dir = Path(__file__).parent.parent / "themes"
455
+
456
+ @app.get("/api/themes")
457
+ async def list_themes() -> dict[str, Any]:
458
+ """Get list of available theme names.
459
+
460
+ Returns:
461
+ {"themes": ["dracula", "nord", ...]}
462
+ """
463
+ try:
464
+ if not themes_dir.exists():
465
+ return {"themes": []}
466
+
467
+ theme_files = list(themes_dir.glob("*.toml"))
468
+ theme_names = sorted([f.stem for f in theme_files])
469
+
470
+ return {"themes": theme_names}
471
+ except Exception as e:
472
+ logger.exception(f"Failed to list themes: {e}")
473
+ raise HTTPException(status_code=500, detail=f"Failed to list themes: {e!s}")
474
+
475
+ @app.get("/api/themes/{theme_name}")
476
+ async def get_theme(theme_name: str) -> dict[str, Any]:
477
+ """Get theme data by name.
478
+
479
+ Args:
480
+ theme_name: Name of theme (without .toml extension)
481
+
482
+ Returns:
483
+ {
484
+ "name": "dracula",
485
+ "data": {
486
+ "colors": {...}
487
+ }
488
+ }
489
+ """
490
+ try:
491
+ # Sanitize theme name to prevent path traversal
492
+ theme_name = theme_name.replace("/", "").replace("\\", "").replace("..", "")
493
+
494
+ theme_path = themes_dir / f"{theme_name}.toml"
495
+
496
+ if not theme_path.exists():
497
+ raise HTTPException(status_code=404, detail=f"Theme '{theme_name}' not found")
498
+
499
+ # Load TOML theme
500
+ theme_data = toml.load(theme_path)
501
+
502
+ return {"name": theme_name, "data": theme_data}
503
+ except HTTPException:
504
+ raise
505
+ except Exception as e:
506
+ logger.exception(f"Failed to load theme '{theme_name}': {e}")
507
+ raise HTTPException(status_code=500, detail=f"Failed to load theme: {e!s}")
508
+
509
+ async def start(self) -> None:
510
+ """Start the dashboard service.
511
+
512
+ Note: For testing purposes. In production, use uvicorn.run(app).
513
+ """
514
+ logger.info("DashboardHTTPService started")
515
+ # Start heartbeat if there are clients
516
+ if len(self.websocket_manager.clients) > 0:
517
+ await self.websocket_manager.start_heartbeat()
518
+
519
+ async def stop(self) -> None:
520
+ """Stop the dashboard service and clean up resources.
521
+
522
+ Closes all WebSocket connections gracefully.
523
+ """
524
+ logger.info("Stopping DashboardHTTPService")
525
+ await self.websocket_manager.shutdown()
526
+ logger.info("DashboardHTTPService stopped")
527
+
528
+ def get_app(self):
529
+ """Get FastAPI application instance.
530
+
531
+ Returns:
532
+ FastAPI app for testing or custom server setup
533
+ """
534
+ return self.app
535
+
536
+
537
+ __all__ = ["DashboardHTTPService"]