flock-core 0.4.542__py3-none-any.whl → 0.5.0__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 (501) hide show
  1. flock/__init__.py +12 -217
  2. flock/agent.py +1079 -0
  3. flock/api/themes.py +71 -0
  4. flock/artifacts.py +86 -0
  5. flock/cli.py +147 -0
  6. flock/components.py +189 -0
  7. flock/dashboard/__init__.py +30 -0
  8. flock/dashboard/collector.py +559 -0
  9. flock/dashboard/events.py +188 -0
  10. flock/dashboard/graph_builder.py +563 -0
  11. flock/dashboard/launcher.py +235 -0
  12. flock/dashboard/models/graph.py +156 -0
  13. flock/dashboard/service.py +991 -0
  14. flock/dashboard/static_v2/assets/index-DFRnI_mt.js +111 -0
  15. flock/dashboard/static_v2/assets/index-fPLNdmp1.css +1 -0
  16. flock/dashboard/static_v2/index.html +13 -0
  17. flock/dashboard/websocket.py +246 -0
  18. flock/engines/__init__.py +6 -0
  19. flock/engines/dspy_engine.py +932 -0
  20. flock/examples.py +131 -0
  21. flock/frontend/README.md +778 -0
  22. flock/frontend/docs/DESIGN_SYSTEM.md +1980 -0
  23. flock/frontend/index.html +12 -0
  24. flock/frontend/package-lock.json +4337 -0
  25. flock/frontend/package.json +48 -0
  26. flock/frontend/src/App.tsx +139 -0
  27. flock/frontend/src/__tests__/integration/graph-snapshot.test.tsx +647 -0
  28. flock/frontend/src/__tests__/integration/indexeddb-persistence.test.tsx +699 -0
  29. flock/frontend/src/components/common/BuildInfo.tsx +39 -0
  30. flock/frontend/src/components/common/EmptyState.module.css +115 -0
  31. flock/frontend/src/components/common/EmptyState.tsx +128 -0
  32. flock/frontend/src/components/common/ErrorBoundary.module.css +169 -0
  33. flock/frontend/src/components/common/ErrorBoundary.tsx +118 -0
  34. flock/frontend/src/components/common/KeyboardShortcutsDialog.css +251 -0
  35. flock/frontend/src/components/common/KeyboardShortcutsDialog.tsx +151 -0
  36. flock/frontend/src/components/common/LoadingSpinner.module.css +97 -0
  37. flock/frontend/src/components/common/LoadingSpinner.tsx +29 -0
  38. flock/frontend/src/components/controls/PublishControl.css +547 -0
  39. flock/frontend/src/components/controls/PublishControl.test.tsx +543 -0
  40. flock/frontend/src/components/controls/PublishControl.tsx +432 -0
  41. flock/frontend/src/components/details/DetailWindowContainer.tsx +58 -0
  42. flock/frontend/src/components/details/LiveOutputTab.test.tsx +792 -0
  43. flock/frontend/src/components/details/LiveOutputTab.tsx +220 -0
  44. flock/frontend/src/components/details/MessageDetailWindow.tsx +439 -0
  45. flock/frontend/src/components/details/MessageHistoryTab.tsx +374 -0
  46. flock/frontend/src/components/details/NodeDetailWindow.test.tsx +501 -0
  47. flock/frontend/src/components/details/NodeDetailWindow.tsx +218 -0
  48. flock/frontend/src/components/details/RunStatusTab.tsx +348 -0
  49. flock/frontend/src/components/details/tabs.test.tsx +1015 -0
  50. flock/frontend/src/components/filters/ArtifactTypeFilter.tsx +21 -0
  51. flock/frontend/src/components/filters/CorrelationIDFilter.module.css +102 -0
  52. flock/frontend/src/components/filters/CorrelationIDFilter.test.tsx +197 -0
  53. flock/frontend/src/components/filters/CorrelationIDFilter.tsx +121 -0
  54. flock/frontend/src/components/filters/FilterFlyout.module.css +104 -0
  55. flock/frontend/src/components/filters/FilterFlyout.tsx +80 -0
  56. flock/frontend/src/components/filters/FilterPills.module.css +220 -0
  57. flock/frontend/src/components/filters/FilterPills.test.tsx +189 -0
  58. flock/frontend/src/components/filters/FilterPills.tsx +143 -0
  59. flock/frontend/src/components/filters/ProducerFilter.tsx +21 -0
  60. flock/frontend/src/components/filters/SavedFiltersControl.module.css +60 -0
  61. flock/frontend/src/components/filters/SavedFiltersControl.test.tsx +158 -0
  62. flock/frontend/src/components/filters/SavedFiltersControl.tsx +159 -0
  63. flock/frontend/src/components/filters/TagFilter.tsx +21 -0
  64. flock/frontend/src/components/filters/TimeRangeFilter.module.css +115 -0
  65. flock/frontend/src/components/filters/TimeRangeFilter.test.tsx +154 -0
  66. flock/frontend/src/components/filters/TimeRangeFilter.tsx +110 -0
  67. flock/frontend/src/components/filters/VisibilityFilter.tsx +21 -0
  68. flock/frontend/src/components/graph/AgentNode.test.tsx +77 -0
  69. flock/frontend/src/components/graph/AgentNode.tsx +324 -0
  70. flock/frontend/src/components/graph/GraphCanvas.tsx +613 -0
  71. flock/frontend/src/components/graph/MessageFlowEdge.tsx +128 -0
  72. flock/frontend/src/components/graph/MessageNode.test.tsx +64 -0
  73. flock/frontend/src/components/graph/MessageNode.tsx +129 -0
  74. flock/frontend/src/components/graph/MiniMap.tsx +47 -0
  75. flock/frontend/src/components/graph/TransformEdge.tsx +123 -0
  76. flock/frontend/src/components/layout/DashboardLayout.css +420 -0
  77. flock/frontend/src/components/layout/DashboardLayout.tsx +287 -0
  78. flock/frontend/src/components/layout/Header.module.css +88 -0
  79. flock/frontend/src/components/layout/Header.tsx +52 -0
  80. flock/frontend/src/components/modules/HistoricalArtifactsModule.module.css +288 -0
  81. flock/frontend/src/components/modules/HistoricalArtifactsModule.tsx +450 -0
  82. flock/frontend/src/components/modules/HistoricalArtifactsModuleWrapper.tsx +13 -0
  83. flock/frontend/src/components/modules/JsonAttributeRenderer.tsx +140 -0
  84. flock/frontend/src/components/modules/ModuleRegistry.test.ts +333 -0
  85. flock/frontend/src/components/modules/ModuleRegistry.ts +93 -0
  86. flock/frontend/src/components/modules/ModuleWindow.tsx +223 -0
  87. flock/frontend/src/components/modules/TraceModuleJaeger.tsx +1971 -0
  88. flock/frontend/src/components/modules/TraceModuleJaegerWrapper.tsx +13 -0
  89. flock/frontend/src/components/modules/registerModules.ts +29 -0
  90. flock/frontend/src/components/settings/AdvancedSettings.tsx +175 -0
  91. flock/frontend/src/components/settings/AppearanceSettings.tsx +185 -0
  92. flock/frontend/src/components/settings/GraphSettings.tsx +110 -0
  93. flock/frontend/src/components/settings/MultiSelect.tsx +235 -0
  94. flock/frontend/src/components/settings/SettingsPanel.css +327 -0
  95. flock/frontend/src/components/settings/SettingsPanel.tsx +131 -0
  96. flock/frontend/src/components/settings/ThemeSelector.tsx +298 -0
  97. flock/frontend/src/components/settings/TracingSettings.tsx +404 -0
  98. flock/frontend/src/hooks/useKeyboardShortcuts.ts +148 -0
  99. flock/frontend/src/hooks/useModulePersistence.test.ts +442 -0
  100. flock/frontend/src/hooks/useModulePersistence.ts +154 -0
  101. flock/frontend/src/hooks/useModules.ts +157 -0
  102. flock/frontend/src/hooks/usePersistence.ts +141 -0
  103. flock/frontend/src/main.tsx +13 -0
  104. flock/frontend/src/services/api.ts +337 -0
  105. flock/frontend/src/services/graphService.test.ts +330 -0
  106. flock/frontend/src/services/graphService.ts +75 -0
  107. flock/frontend/src/services/indexeddb.test.ts +793 -0
  108. flock/frontend/src/services/indexeddb.ts +848 -0
  109. flock/frontend/src/services/layout.test.ts +437 -0
  110. flock/frontend/src/services/layout.ts +357 -0
  111. flock/frontend/src/services/themeApplicator.ts +140 -0
  112. flock/frontend/src/services/themeService.ts +77 -0
  113. flock/frontend/src/services/websocket.ts +650 -0
  114. flock/frontend/src/store/filterStore.test.ts +250 -0
  115. flock/frontend/src/store/filterStore.ts +272 -0
  116. flock/frontend/src/store/graphStore.test.ts +570 -0
  117. flock/frontend/src/store/graphStore.ts +462 -0
  118. flock/frontend/src/store/moduleStore.test.ts +253 -0
  119. flock/frontend/src/store/moduleStore.ts +75 -0
  120. flock/frontend/src/store/settingsStore.ts +188 -0
  121. flock/frontend/src/store/streamStore.ts +68 -0
  122. flock/frontend/src/store/uiStore.test.ts +54 -0
  123. flock/frontend/src/store/uiStore.ts +122 -0
  124. flock/frontend/src/store/wsStore.ts +34 -0
  125. flock/frontend/src/styles/index.css +15 -0
  126. flock/frontend/src/styles/scrollbar.css +47 -0
  127. flock/frontend/src/styles/variables.css +488 -0
  128. flock/frontend/src/test/setup.ts +1 -0
  129. flock/frontend/src/types/filters.ts +47 -0
  130. flock/frontend/src/types/graph.ts +95 -0
  131. flock/frontend/src/types/modules.ts +10 -0
  132. flock/frontend/src/types/theme.ts +55 -0
  133. flock/frontend/src/utils/artifacts.ts +24 -0
  134. flock/frontend/src/utils/mockData.ts +98 -0
  135. flock/frontend/src/utils/performance.ts +16 -0
  136. flock/frontend/src/vite-env.d.ts +17 -0
  137. flock/frontend/tsconfig.json +27 -0
  138. flock/frontend/tsconfig.node.json +11 -0
  139. flock/frontend/vite.config.ts +25 -0
  140. flock/frontend/vitest.config.ts +11 -0
  141. flock/{core/util → helper}/cli_helper.py +9 -5
  142. flock/{core/logging → logging}/__init__.py +2 -3
  143. flock/logging/auto_trace.py +159 -0
  144. flock/{core/logging → logging}/formatters/enum_builder.py +3 -4
  145. flock/{core/logging → logging}/formatters/theme_builder.py +19 -44
  146. flock/{core/logging → logging}/formatters/themed_formatter.py +69 -107
  147. flock/{core/logging → logging}/logging.py +78 -61
  148. flock/{core/logging → logging}/telemetry.py +66 -26
  149. flock/{core/logging → logging}/telemetry_exporter/base_exporter.py +2 -2
  150. flock/logging/telemetry_exporter/duckdb_exporter.py +216 -0
  151. flock/{core/logging → logging}/telemetry_exporter/file_exporter.py +13 -10
  152. flock/{core/logging → logging}/telemetry_exporter/sqlite_exporter.py +2 -3
  153. flock/logging/trace_and_logged.py +304 -0
  154. flock/mcp/__init__.py +91 -0
  155. flock/{core/mcp/mcp_client.py → mcp/client.py} +131 -158
  156. flock/{core/mcp/mcp_config.py → mcp/config.py} +86 -132
  157. flock/mcp/manager.py +286 -0
  158. flock/mcp/servers/sse/__init__.py +1 -1
  159. flock/mcp/servers/sse/flock_sse_server.py +16 -58
  160. flock/mcp/servers/stdio/__init__.py +1 -1
  161. flock/mcp/servers/stdio/flock_stdio_server.py +13 -53
  162. flock/mcp/servers/streamable_http/flock_streamable_http_server.py +22 -67
  163. flock/mcp/servers/websockets/flock_websocket_server.py +12 -45
  164. flock/{core/mcp/flock_mcp_tool_base.py → mcp/tool.py} +24 -78
  165. flock/mcp/types/__init__.py +42 -0
  166. flock/{core/mcp → mcp}/types/callbacks.py +12 -15
  167. flock/{core/mcp → mcp}/types/factories.py +7 -6
  168. flock/{core/mcp → mcp}/types/handlers.py +13 -18
  169. flock/{core/mcp → mcp}/types/types.py +70 -74
  170. flock/{core/mcp → mcp}/util/helpers.py +3 -3
  171. flock/orchestrator.py +970 -0
  172. flock/registry.py +148 -0
  173. flock/runtime.py +262 -0
  174. flock/service.py +277 -0
  175. flock/store.py +1214 -0
  176. flock/subscription.py +111 -0
  177. flock/themes/andromeda.toml +1 -1
  178. flock/themes/apple-system-colors.toml +1 -1
  179. flock/themes/arcoiris.toml +1 -1
  180. flock/themes/atomonelight.toml +1 -1
  181. flock/themes/ayu copy.toml +1 -1
  182. flock/themes/ayu-light.toml +1 -1
  183. flock/themes/belafonte-day.toml +1 -1
  184. flock/themes/belafonte-night.toml +1 -1
  185. flock/themes/blulocodark.toml +1 -1
  186. flock/themes/breeze.toml +1 -1
  187. flock/themes/broadcast.toml +1 -1
  188. flock/themes/brogrammer.toml +1 -1
  189. flock/themes/builtin-dark.toml +1 -1
  190. flock/themes/builtin-pastel-dark.toml +1 -1
  191. flock/themes/catppuccin-latte.toml +1 -1
  192. flock/themes/catppuccin-macchiato.toml +1 -1
  193. flock/themes/catppuccin-mocha.toml +1 -1
  194. flock/themes/cga.toml +1 -1
  195. flock/themes/chalk.toml +1 -1
  196. flock/themes/ciapre.toml +1 -1
  197. flock/themes/coffee-theme.toml +1 -1
  198. flock/themes/cyberpunkscarletprotocol.toml +1 -1
  199. flock/themes/dark+.toml +1 -1
  200. flock/themes/darkermatrix.toml +1 -1
  201. flock/themes/darkmatrix.toml +2 -2
  202. flock/themes/darkside.toml +1 -1
  203. flock/themes/deep.toml +2 -2
  204. flock/themes/desert.toml +1 -1
  205. flock/themes/django.toml +1 -1
  206. flock/themes/djangosmooth.toml +1 -1
  207. flock/themes/doomone.toml +1 -1
  208. flock/themes/dotgov.toml +1 -1
  209. flock/themes/dracula+.toml +1 -1
  210. flock/themes/duckbones.toml +1 -1
  211. flock/themes/encom.toml +1 -1
  212. flock/themes/espresso.toml +1 -1
  213. flock/themes/everblush.toml +1 -1
  214. flock/themes/fairyfloss.toml +1 -1
  215. flock/themes/fideloper.toml +1 -1
  216. flock/themes/fishtank.toml +1 -1
  217. flock/themes/flexoki-light.toml +1 -1
  218. flock/themes/floraverse.toml +1 -1
  219. flock/themes/framer.toml +1 -1
  220. flock/themes/galizur.toml +1 -1
  221. flock/themes/github.toml +1 -1
  222. flock/themes/grass.toml +1 -1
  223. flock/themes/grey-green.toml +1 -1
  224. flock/themes/gruvboxlight.toml +1 -1
  225. flock/themes/guezwhoz.toml +1 -1
  226. flock/themes/harper.toml +1 -1
  227. flock/themes/hax0r-blue.toml +1 -1
  228. flock/themes/hopscotch.256.toml +1 -1
  229. flock/themes/ic-green-ppl.toml +1 -1
  230. flock/themes/iceberg-dark.toml +1 -1
  231. flock/themes/japanesque.toml +1 -1
  232. flock/themes/jubi.toml +1 -1
  233. flock/themes/kibble.toml +1 -1
  234. flock/themes/kolorit.toml +1 -1
  235. flock/themes/kurokula.toml +1 -1
  236. flock/themes/materialdesigncolors.toml +1 -1
  237. flock/themes/matrix.toml +1 -1
  238. flock/themes/mellifluous.toml +1 -1
  239. flock/themes/midnight-in-mojave.toml +1 -1
  240. flock/themes/monokai-remastered.toml +1 -1
  241. flock/themes/monokai-soda.toml +1 -1
  242. flock/themes/neon.toml +1 -1
  243. flock/themes/neopolitan.toml +5 -5
  244. flock/themes/nord-light.toml +1 -1
  245. flock/themes/ocean.toml +1 -1
  246. flock/themes/onehalfdark.toml +1 -1
  247. flock/themes/onehalflight.toml +1 -1
  248. flock/themes/palenighthc.toml +1 -1
  249. flock/themes/paulmillr.toml +1 -1
  250. flock/themes/pencildark.toml +1 -1
  251. flock/themes/pnevma.toml +1 -1
  252. flock/themes/purple-rain.toml +1 -1
  253. flock/themes/purplepeter.toml +1 -1
  254. flock/themes/raycast-dark.toml +1 -1
  255. flock/themes/red-sands.toml +1 -1
  256. flock/themes/relaxed.toml +1 -1
  257. flock/themes/retro.toml +1 -1
  258. flock/themes/rose-pine.toml +1 -1
  259. flock/themes/royal.toml +1 -1
  260. flock/themes/ryuuko.toml +1 -1
  261. flock/themes/sakura.toml +1 -1
  262. flock/themes/scarlet-protocol.toml +1 -1
  263. flock/themes/seoulbones-dark.toml +1 -1
  264. flock/themes/shades-of-purple.toml +1 -1
  265. flock/themes/smyck.toml +1 -1
  266. flock/themes/softserver.toml +1 -1
  267. flock/themes/solarized-darcula.toml +1 -1
  268. flock/themes/square.toml +1 -1
  269. flock/themes/sugarplum.toml +1 -1
  270. flock/themes/thayer-bright.toml +1 -1
  271. flock/themes/tokyonight.toml +1 -1
  272. flock/themes/tomorrow.toml +1 -1
  273. flock/themes/ubuntu.toml +1 -1
  274. flock/themes/ultradark.toml +1 -1
  275. flock/themes/ultraviolent.toml +1 -1
  276. flock/themes/unikitty.toml +1 -1
  277. flock/themes/urple.toml +1 -1
  278. flock/themes/vesper.toml +1 -1
  279. flock/themes/vimbones.toml +1 -1
  280. flock/themes/wildcherry.toml +1 -1
  281. flock/themes/wilmersdorf.toml +1 -1
  282. flock/themes/wryan.toml +1 -1
  283. flock/themes/xcodedarkhc.toml +1 -1
  284. flock/themes/xcodelight.toml +1 -1
  285. flock/themes/zenbones-light.toml +1 -1
  286. flock/themes/zenwritten-dark.toml +1 -1
  287. flock/utilities.py +301 -0
  288. flock/utility/output_utility_component.py +226 -0
  289. flock/visibility.py +107 -0
  290. flock_core-0.5.0.dist-info/METADATA +964 -0
  291. flock_core-0.5.0.dist-info/RECORD +525 -0
  292. flock_core-0.5.0.dist-info/entry_points.txt +2 -0
  293. {flock_core-0.4.542.dist-info → flock_core-0.5.0.dist-info}/licenses/LICENSE +1 -1
  294. flock/adapter/__init__.py +0 -14
  295. flock/adapter/azure_adapter.py +0 -68
  296. flock/adapter/chroma_adapter.py +0 -73
  297. flock/adapter/faiss_adapter.py +0 -97
  298. flock/adapter/pinecone_adapter.py +0 -51
  299. flock/adapter/vector_base.py +0 -47
  300. flock/cli/assets/release_notes.md +0 -140
  301. flock/cli/config.py +0 -8
  302. flock/cli/constants.py +0 -36
  303. flock/cli/create_agent.py +0 -1
  304. flock/cli/create_flock.py +0 -280
  305. flock/cli/execute_flock.py +0 -620
  306. flock/cli/load_agent.py +0 -1
  307. flock/cli/load_examples.py +0 -1
  308. flock/cli/load_flock.py +0 -192
  309. flock/cli/load_release_notes.py +0 -20
  310. flock/cli/loaded_flock_cli.py +0 -254
  311. flock/cli/manage_agents.py +0 -459
  312. flock/cli/registry_management.py +0 -889
  313. flock/cli/runner.py +0 -41
  314. flock/cli/settings.py +0 -857
  315. flock/cli/utils.py +0 -135
  316. flock/cli/view_results.py +0 -29
  317. flock/cli/yaml_editor.py +0 -396
  318. flock/config.py +0 -56
  319. flock/core/__init__.py +0 -44
  320. flock/core/api/__init__.py +0 -10
  321. flock/core/api/custom_endpoint.py +0 -45
  322. flock/core/api/endpoints.py +0 -262
  323. flock/core/api/main.py +0 -162
  324. flock/core/api/models.py +0 -101
  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/config/flock_agent_config.py +0 -11
  329. flock/core/config/scheduled_agent_config.py +0 -40
  330. flock/core/context/context.py +0 -214
  331. flock/core/context/context_manager.py +0 -40
  332. flock/core/context/context_vars.py +0 -11
  333. flock/core/evaluation/utils.py +0 -395
  334. flock/core/execution/batch_executor.py +0 -369
  335. flock/core/execution/evaluation_executor.py +0 -438
  336. flock/core/execution/local_executor.py +0 -31
  337. flock/core/execution/opik_executor.py +0 -103
  338. flock/core/execution/temporal_executor.py +0 -166
  339. flock/core/flock.py +0 -1003
  340. flock/core/flock_agent.py +0 -1258
  341. flock/core/flock_evaluator.py +0 -60
  342. flock/core/flock_factory.py +0 -513
  343. flock/core/flock_module.py +0 -207
  344. flock/core/flock_registry.py +0 -702
  345. flock/core/flock_router.py +0 -83
  346. flock/core/flock_scheduler.py +0 -166
  347. flock/core/flock_server_manager.py +0 -136
  348. flock/core/interpreter/python_interpreter.py +0 -689
  349. flock/core/logging/live_capture.py +0 -137
  350. flock/core/logging/trace_and_logged.py +0 -59
  351. flock/core/mcp/__init__.py +0 -1
  352. flock/core/mcp/flock_mcp_server.py +0 -640
  353. flock/core/mcp/mcp_client_manager.py +0 -201
  354. flock/core/mcp/types/__init__.py +0 -1
  355. flock/core/mixin/dspy_integration.py +0 -445
  356. flock/core/mixin/prompt_parser.py +0 -125
  357. flock/core/serialization/__init__.py +0 -13
  358. flock/core/serialization/callable_registry.py +0 -52
  359. flock/core/serialization/flock_serializer.py +0 -854
  360. flock/core/serialization/json_encoder.py +0 -41
  361. flock/core/serialization/secure_serializer.py +0 -175
  362. flock/core/serialization/serializable.py +0 -342
  363. flock/core/serialization/serialization_utils.py +0 -409
  364. flock/core/util/file_path_utils.py +0 -223
  365. flock/core/util/hydrator.py +0 -309
  366. flock/core/util/input_resolver.py +0 -141
  367. flock/core/util/loader.py +0 -59
  368. flock/core/util/splitter.py +0 -219
  369. flock/di.py +0 -41
  370. flock/evaluators/__init__.py +0 -1
  371. flock/evaluators/declarative/__init__.py +0 -1
  372. flock/evaluators/declarative/declarative_evaluator.py +0 -217
  373. flock/evaluators/memory/memory_evaluator.py +0 -90
  374. flock/evaluators/test/test_case_evaluator.py +0 -38
  375. flock/evaluators/zep/zep_evaluator.py +0 -59
  376. flock/modules/__init__.py +0 -1
  377. flock/modules/assertion/__init__.py +0 -1
  378. flock/modules/assertion/assertion_module.py +0 -286
  379. flock/modules/callback/__init__.py +0 -1
  380. flock/modules/callback/callback_module.py +0 -91
  381. flock/modules/enterprise_memory/README.md +0 -99
  382. flock/modules/enterprise_memory/enterprise_memory_module.py +0 -526
  383. flock/modules/mem0/__init__.py +0 -1
  384. flock/modules/mem0/mem0_module.py +0 -126
  385. flock/modules/mem0_async/__init__.py +0 -1
  386. flock/modules/mem0_async/async_mem0_module.py +0 -126
  387. flock/modules/memory/__init__.py +0 -1
  388. flock/modules/memory/memory_module.py +0 -429
  389. flock/modules/memory/memory_parser.py +0 -125
  390. flock/modules/memory/memory_storage.py +0 -736
  391. flock/modules/output/__init__.py +0 -1
  392. flock/modules/output/output_module.py +0 -196
  393. flock/modules/performance/__init__.py +0 -1
  394. flock/modules/performance/metrics_module.py +0 -678
  395. flock/modules/zep/__init__.py +0 -1
  396. flock/modules/zep/zep_module.py +0 -192
  397. flock/platform/docker_tools.py +0 -49
  398. flock/platform/jaeger_install.py +0 -86
  399. flock/routers/__init__.py +0 -1
  400. flock/routers/agent/__init__.py +0 -1
  401. flock/routers/agent/agent_router.py +0 -236
  402. flock/routers/agent/handoff_agent.py +0 -58
  403. flock/routers/conditional/conditional_router.py +0 -486
  404. flock/routers/default/__init__.py +0 -1
  405. flock/routers/default/default_router.py +0 -80
  406. flock/routers/feedback/feedback_router.py +0 -114
  407. flock/routers/list_generator/list_generator_router.py +0 -166
  408. flock/routers/llm/__init__.py +0 -1
  409. flock/routers/llm/llm_router.py +0 -365
  410. flock/tools/__init__.py +0 -0
  411. flock/tools/azure_tools.py +0 -781
  412. flock/tools/code_tools.py +0 -167
  413. flock/tools/file_tools.py +0 -149
  414. flock/tools/github_tools.py +0 -157
  415. flock/tools/markdown_tools.py +0 -205
  416. flock/tools/system_tools.py +0 -9
  417. flock/tools/text_tools.py +0 -810
  418. flock/tools/web_tools.py +0 -92
  419. flock/tools/zendesk_tools.py +0 -501
  420. flock/webapp/__init__.py +0 -1
  421. flock/webapp/app/__init__.py +0 -0
  422. flock/webapp/app/api/__init__.py +0 -0
  423. flock/webapp/app/api/agent_management.py +0 -237
  424. flock/webapp/app/api/execution.py +0 -503
  425. flock/webapp/app/api/flock_management.py +0 -125
  426. flock/webapp/app/api/registry_viewer.py +0 -29
  427. flock/webapp/app/chat.py +0 -662
  428. flock/webapp/app/config.py +0 -104
  429. flock/webapp/app/dependencies.py +0 -117
  430. flock/webapp/app/main.py +0 -1086
  431. flock/webapp/app/middleware.py +0 -113
  432. flock/webapp/app/models_ui.py +0 -7
  433. flock/webapp/app/services/__init__.py +0 -0
  434. flock/webapp/app/services/feedback_file_service.py +0 -363
  435. flock/webapp/app/services/flock_service.py +0 -345
  436. flock/webapp/app/services/sharing_models.py +0 -81
  437. flock/webapp/app/services/sharing_store.py +0 -597
  438. flock/webapp/app/templates/theme_mapper.html +0 -326
  439. flock/webapp/app/theme_mapper.py +0 -811
  440. flock/webapp/app/utils.py +0 -85
  441. flock/webapp/run.py +0 -219
  442. flock/webapp/static/css/chat.css +0 -301
  443. flock/webapp/static/css/components.css +0 -167
  444. flock/webapp/static/css/header.css +0 -39
  445. flock/webapp/static/css/layout.css +0 -281
  446. flock/webapp/static/css/sidebar.css +0 -127
  447. flock/webapp/static/css/two-pane.css +0 -48
  448. flock/webapp/templates/base.html +0 -389
  449. flock/webapp/templates/chat.html +0 -152
  450. flock/webapp/templates/chat_settings.html +0 -19
  451. flock/webapp/templates/flock_editor.html +0 -16
  452. flock/webapp/templates/index.html +0 -12
  453. flock/webapp/templates/partials/_agent_detail_form.html +0 -93
  454. flock/webapp/templates/partials/_agent_list.html +0 -18
  455. flock/webapp/templates/partials/_agent_manager_view.html +0 -51
  456. flock/webapp/templates/partials/_agent_tools_checklist.html +0 -14
  457. flock/webapp/templates/partials/_chat_container.html +0 -15
  458. flock/webapp/templates/partials/_chat_messages.html +0 -57
  459. flock/webapp/templates/partials/_chat_settings_form.html +0 -85
  460. flock/webapp/templates/partials/_create_flock_form.html +0 -50
  461. flock/webapp/templates/partials/_dashboard_flock_detail.html +0 -17
  462. flock/webapp/templates/partials/_dashboard_flock_file_list.html +0 -16
  463. flock/webapp/templates/partials/_dashboard_flock_properties_preview.html +0 -28
  464. flock/webapp/templates/partials/_dashboard_upload_flock_form.html +0 -16
  465. flock/webapp/templates/partials/_dynamic_input_form_content.html +0 -22
  466. flock/webapp/templates/partials/_env_vars_table.html +0 -23
  467. flock/webapp/templates/partials/_execution_form.html +0 -127
  468. flock/webapp/templates/partials/_execution_view_container.html +0 -28
  469. flock/webapp/templates/partials/_flock_file_list.html +0 -23
  470. flock/webapp/templates/partials/_flock_properties_form.html +0 -52
  471. flock/webapp/templates/partials/_flock_upload_form.html +0 -16
  472. flock/webapp/templates/partials/_header_flock_status.html +0 -5
  473. flock/webapp/templates/partials/_live_logs.html +0 -13
  474. flock/webapp/templates/partials/_load_manager_view.html +0 -49
  475. flock/webapp/templates/partials/_registry_table.html +0 -25
  476. flock/webapp/templates/partials/_registry_viewer_content.html +0 -70
  477. flock/webapp/templates/partials/_results_display.html +0 -78
  478. flock/webapp/templates/partials/_settings_env_content.html +0 -9
  479. flock/webapp/templates/partials/_settings_theme_content.html +0 -14
  480. flock/webapp/templates/partials/_settings_view.html +0 -36
  481. flock/webapp/templates/partials/_share_chat_link_snippet.html +0 -11
  482. flock/webapp/templates/partials/_share_link_snippet.html +0 -35
  483. flock/webapp/templates/partials/_sidebar.html +0 -74
  484. flock/webapp/templates/partials/_structured_data_view.html +0 -40
  485. flock/webapp/templates/partials/_theme_preview.html +0 -36
  486. flock/webapp/templates/registry_viewer.html +0 -84
  487. flock/webapp/templates/shared_run_page.html +0 -140
  488. flock/workflow/__init__.py +0 -0
  489. flock/workflow/activities.py +0 -237
  490. flock/workflow/agent_activities.py +0 -24
  491. flock/workflow/agent_execution_activity.py +0 -240
  492. flock/workflow/flock_workflow.py +0 -225
  493. flock/workflow/temporal_config.py +0 -96
  494. flock/workflow/temporal_setup.py +0 -60
  495. flock_core-0.4.542.dist-info/METADATA +0 -676
  496. flock_core-0.4.542.dist-info/RECORD +0 -572
  497. flock_core-0.4.542.dist-info/entry_points.txt +0 -2
  498. /flock/{core/logging → logging}/formatters/themes.py +0 -0
  499. /flock/{core/logging → logging}/span_middleware/baggage_span_processor.py +0 -0
  500. /flock/{core/mcp → mcp}/util/__init__.py +0 -0
  501. {flock_core-0.4.542.dist-info → flock_core-0.5.0.dist-info}/WHEEL +0 -0
@@ -1,389 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en" data-theme="dark">
3
-
4
- <head>
5
- <meta charset="UTF-8">
6
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
- <title>{% block title %}Flock UI{% endblock %}</title>
8
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css" />
9
- <!-- Split modular CSS files -->
10
- <link rel="stylesheet"
11
- href="{{ url_for('static', path='css/layout.css') }}">
12
- <link rel="stylesheet"
13
- href="{{ url_for('static', path='css/header.css') }}">
14
- <link rel="stylesheet" href="{{ url_for('static', path='css/sidebar.css') }}">
15
- <link rel="stylesheet" href="{{ url_for('static', path='css/components.css') }}">
16
- <link rel="stylesheet" href="{{ url_for('static', path='css/chat.css') }}">
17
- <link rel="stylesheet" href="{{ url_for('static', path='css/two-pane.css') }}">
18
- <!-- Font Awesome for icons -->
19
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
20
- <!-- Prism.js CSS for syntax highlighting (okaidia theme) -->
21
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-okaidia.min.css" referrerpolicy="no-referrer" />
22
- {# Inject Theme CSS Variables #}
23
- {% if theme_css and theme_css.strip() %}
24
- <style>
25
- /* Start Theme CSS */
26
- {{ theme_css | safe }}
27
- /* End Theme CSS */
28
- </style>
29
- {% endif %}
30
- {# End Theme CSS Injection #}
31
- <script src="https://unpkg.com/htmx.org@1.9.10"
32
- integrity="sha384-D1Kt99CQMDuVetoL1lrYwg5t+9QdHe7NLX/SoJYkXDFfX37iInKRy5xLSi8nO7UC"
33
- crossorigin="anonymous"></script>
34
- <script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
35
- <!-- Prism.js JS (core and autoloader) -->
36
- <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js" referrerpolicy="no-referrer"></script>
37
- <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js" referrerpolicy="no-referrer"></script>
38
- <!-- Removed inline styles as they're in custom.css -->
39
- </head>
40
-
41
- <body>
42
- <div id="global-toast-container" style="position: fixed; top: 1rem; right: 1rem; z-index: 9999; display: flex; flex-direction: column; gap: 0.5rem;">
43
- <!-- Toasts will be appended here -->
44
- </div>
45
-
46
- <header class="top-header">
47
- <span><strong>🐧 Flock Playground 🐤</strong></span> <span id="header-flock-status-container" hx-get="{{ url_for('htmx_get_header_flock_status') }}?ui_mode={{ ui_mode }}"
48
- hx-trigger="load, flockLoaded from:body, flockCleared from:body" hx-swap="innerHTML">
49
- <small>Loading status...</small> {# Placeholder while loading #}
50
- </span>
51
- </header> <aside class="sidebar" hx-get="{{ url_for('htmx_get_sidebar') }}?ui_mode={{ ui_mode }}"
52
- hx-trigger="load, flockLoaded from:body, flockListChanged from:body" hx-swap="innerHTML">
53
- <p>Loading navigation...</p><progress></progress>
54
- </aside>
55
-
56
- <main class="main-content" id="main-content-area">
57
- {# Initial content is now loaded via HTMX based on the route #}
58
- <div hx-get="{{ initial_content_url }}" hx-trigger="load" hx-swap="innerHTML">
59
- <p>Loading content...</p><progress></progress>
60
- </div>
61
- {# Render block content if navigating directly and template extends base #}
62
- {% block content %}{% endblock %}
63
- </main>
64
-
65
- <div class="message-container" x-data="messageHandler(
66
- {{ success_message | tojson | safe if success_message else 'null' }},
67
- {{ error_message | tojson | safe if error_message else 'null' }}
68
- )">
69
- <template x-if="showSuccess && successMsg">
70
- <div class="success" role="alert" @click="showSuccess = false" style="cursor: pointer;">
71
- <span x-text="successMsg"></span>
72
- <button type="button" class="close" aria-label="Dismiss">×</button>
73
- </div>
74
- </template>
75
- <template x-if="showError && errorMsg">
76
- <div class="error" role="alert" @click="showError = false" style="cursor: pointer;">
77
- <span x-text="errorMsg"></span>
78
- <button type="button" class="close" aria-label="Dismiss">×</button>
79
- </div>
80
- </template>
81
- </div>
82
-
83
- <footer class="main-footer" data-expanded="false" data-maximized="false">
84
- <div class="footer-bar">
85
- <small class="footer-meta">Built with FastAPI, HTMX, Pico.CSS by 🤍 white duck 🦆 - Theme: {{ active_theme_name | default('default') }}</small>
86
- <button id="live-log-toggle" class="live-log-toggle-link" type="button" aria-expanded="false" aria-controls="live-log-panel">
87
- Show logs
88
- </button>
89
- </div>
90
- <div class="live-log-wrapper" hidden>
91
- <div class="live-log-header">
92
- <div class="live-log-title-group">
93
- <span class="live-log-title">Live CLI Logs</span>
94
- <span class="live-log-hint">Mirrors recent stdout/stderr output</span>
95
- </div>
96
- <div class="live-log-actions">
97
- <form id="live-log-filter-form" class="live-log-filter" onsubmit="return false;">
98
- <label class="live-log-option">
99
- <input type="checkbox" name="hide_polling" value="1" checked>
100
- Hide poll requests
101
- </label>
102
- </form>
103
- <label class="live-log-option" for="live-log-autoscroll">
104
- <input type="checkbox" id="live-log-autoscroll" checked>
105
- Auto-scroll
106
- </label>
107
- <div class="live-log-buttons">
108
- <button id="live-log-copy" type="button" class="live-log-action-button" title="Copy visible logs" aria-label="Copy logs to clipboard">
109
- Copy
110
- </button>
111
- <button id="live-log-maximize" type="button" class="live-log-action-button" aria-pressed="false">
112
- Maximize
113
- </button>
114
- </div>
115
- </div>
116
- </div>
117
- <div
118
- id="live-log-panel"
119
- class="live-log-panel"
120
- hx-get="{{ url_for('htmx_live_cli_logs') }}"
121
- hx-trigger="refresh"
122
- hx-swap="innerHTML"
123
- hx-target="this"
124
- hx-include="#live-log-filter-form"
125
- >
126
- <div class="live-log-empty">Collecting CLI output...</div>
127
- </div>
128
- </div>
129
- </footer>
130
-
131
- <script>
132
- function messageHandler(initialSuccessMsg, initialErrorMsg) {
133
- return {
134
- showSuccess: !!initialSuccessMsg,
135
- showError: !!initialErrorMsg,
136
- successMsg: initialSuccessMsg,
137
- errorMsg: initialErrorMsg,
138
- init() {
139
- if (this.successMsg) { setTimeout(() => this.showSuccess = false, 5000); }
140
- if (this.errorMsg) { setTimeout(() => this.showError = false, 7000); }
141
-
142
- window.addEventListener('notify', event => {
143
- if (event.detail.type === 'success') {
144
- this.successMsg = event.detail.message;
145
- this.showSuccess = true; this.showError = false;
146
- setTimeout(() => this.showSuccess = false, 5000);
147
- }
148
- if (event.detail.type === 'error') {
149
- this.errorMsg = event.detail.message;
150
- this.showError = true; this.showSuccess = false;
151
- setTimeout(() => this.showError = false, 7000);
152
- }
153
- });
154
- }
155
- };
156
- }
157
- function triggerEvent(eventName, detail = {}) {
158
- htmx.trigger(document.body, eventName, detail);
159
- }
160
-
161
- // Add HTMX event listener for Prism highlighting
162
- document.addEventListener('htmx:afterSwap', function(event) {
163
- // Check if the swapped element or its parent is the main content area or results display
164
- const mainContentArea = document.getElementById('main-content-area');
165
- const resultsDisplay = document.getElementById('results-display-content');
166
- let targetElement = event.detail.target;
167
-
168
- if (targetElement === mainContentArea || (resultsDisplay && resultsDisplay.contains(targetElement)) || (mainContentArea && mainContentArea.contains(targetElement))) {
169
- if (typeof Prism !== 'undefined') {
170
- // console.log('Prism highlighting triggered for swapped content in main area.');
171
- Prism.highlightAllUnder(mainContentArea || document.documentElement);
172
- }
173
- }
174
- });
175
-
176
- // Initial highlight on page load
177
- document.addEventListener('DOMContentLoaded', () => {
178
- if (typeof Prism !== 'undefined') {
179
- // console.log('Prism initial highlighting.');
180
- Prism.highlightAll();
181
- }
182
- });
183
- </script>
184
- {# Global Toast Handler - identical to the one in chat.html #}
185
- <script>
186
- document.addEventListener('DOMContentLoaded', function () {
187
- var footer = document.querySelector('.main-footer');
188
- var toggleBtn = document.getElementById('live-log-toggle');
189
- var wrapper = footer ? footer.querySelector('.live-log-wrapper') : null;
190
- var panel = document.getElementById('live-log-panel');
191
- var filterForm = document.getElementById('live-log-filter-form');
192
- var autoScrollCheckbox = document.getElementById('live-log-autoscroll');
193
- var maximizeBtn = document.getElementById('live-log-maximize');
194
- var copyBtn = document.getElementById('live-log-copy');
195
- var AUTO_SCROLL_STORAGE_KEY = 'flock.liveLogs.autoScroll';
196
- var storageAvailable = false;
197
-
198
- try {
199
- if (window.localStorage) {
200
- var probeKey = '__flock_live_log_probe__';
201
- localStorage.setItem(probeKey, '1');
202
- localStorage.removeItem(probeKey);
203
- storageAvailable = true;
204
- }
205
- } catch (err) {
206
- storageAvailable = false;
207
- }
208
-
209
- if (!footer || !toggleBtn || !wrapper || !panel) {
210
- return;
211
- }
212
-
213
- var collapsedTrigger = 'refresh';
214
- var expandedTrigger = 'refresh, every 2s, change from:#live-log-filter-form';
215
-
216
- if (autoScrollCheckbox && storageAvailable) {
217
- var stored = localStorage.getItem(AUTO_SCROLL_STORAGE_KEY);
218
- if (stored === 'true' || stored === 'false') {
219
- autoScrollCheckbox.checked = stored === 'true';
220
- }
221
- }
222
-
223
- function updateLayout(expanded) {
224
- if (!expanded) {
225
- updateMaximize(false);
226
- }
227
-
228
- footer.classList.toggle('expanded', expanded);
229
- document.body.classList.toggle('logs-expanded', expanded);
230
- footer.dataset.expanded = expanded ? 'true' : 'false';
231
- toggleBtn.setAttribute('aria-expanded', String(expanded));
232
- toggleBtn.textContent = expanded ? 'Hide logs' : 'Show logs';
233
- wrapper.hidden = !expanded;
234
- panel.setAttribute('hx-trigger', expanded ? expandedTrigger : collapsedTrigger);
235
-
236
- if (window.htmx) {
237
- if (typeof window.htmx.stopPolling === 'function') {
238
- window.htmx.stopPolling(panel);
239
- }
240
- if (expanded) {
241
- window.htmx.process(panel);
242
- window.htmx.trigger(panel, 'refresh');
243
- }
244
- }
245
- }
246
-
247
- function updateMaximize(maximized) {
248
- footer.classList.toggle('maximized', maximized);
249
- document.body.classList.toggle('logs-maximized', maximized);
250
- footer.dataset.maximized = maximized ? 'true' : 'false';
251
- if (maximizeBtn) {
252
- maximizeBtn.setAttribute('aria-pressed', String(maximized));
253
- maximizeBtn.textContent = maximized ? 'Minimize' : 'Maximize';
254
- }
255
-
256
- if (maximized) {
257
- if (!footer.classList.contains('expanded')) {
258
- updateLayout(true);
259
- }
260
-
261
- requestAnimationFrame(function () {
262
- if (!autoScrollCheckbox || autoScrollCheckbox.checked) {
263
- panel.scrollTop = panel.scrollHeight;
264
- }
265
- });
266
- }
267
- }
268
-
269
- updateLayout(false);
270
-
271
- toggleBtn.addEventListener('click', function () {
272
- var expanded = !footer.classList.contains('expanded');
273
- updateLayout(expanded);
274
- });
275
-
276
- if (maximizeBtn) {
277
- maximizeBtn.addEventListener('click', function () {
278
- var maximized = footer.classList.contains('maximized');
279
- updateMaximize(!maximized);
280
- });
281
- }
282
-
283
- if (copyBtn && navigator.clipboard && navigator.clipboard.writeText) {
284
- copyBtn.addEventListener('click', function () {
285
- var text = panel.innerText.trim();
286
- if (!text) {
287
- return;
288
- }
289
-
290
- navigator.clipboard.writeText(text).then(function () {
291
- if (typeof triggerEvent === 'function') {
292
- triggerEvent('showGlobalToast', { type: 'success', message: 'Logs copied to clipboard.' });
293
- } else {
294
- document.body.dispatchEvent(new CustomEvent('showGlobalToast', { detail: { type: 'success', message: 'Logs copied to clipboard.' } }));
295
- }
296
- }).catch(function () {
297
- document.body.dispatchEvent(new CustomEvent('showGlobalToast', { detail: { type: 'error', message: 'Unable to copy logs.' } }));
298
- });
299
- });
300
- } else if (copyBtn) {
301
- copyBtn.disabled = true;
302
- copyBtn.title = 'Clipboard API unavailable in this browser.';
303
- }
304
-
305
- if (autoScrollCheckbox && storageAvailable) {
306
- autoScrollCheckbox.addEventListener('change', function () {
307
- localStorage.setItem(AUTO_SCROLL_STORAGE_KEY, String(autoScrollCheckbox.checked));
308
- });
309
- }
310
-
311
- if (window.htmx) {
312
- document.body.addEventListener('htmx:afterSwap', function (event) {
313
- if (event.target === panel) {
314
- if (!autoScrollCheckbox || autoScrollCheckbox.checked) {
315
- panel.scrollTop = panel.scrollHeight;
316
- }
317
- }
318
- });
319
- }
320
-
321
- if (filterForm) {
322
- filterForm.addEventListener('change', function () {
323
- if (window.htmx && footer.classList.contains('expanded')) {
324
- window.htmx.trigger(panel, 'refresh');
325
- }
326
- });
327
- }
328
- });
329
- </script>
330
- <script>
331
- document.body.addEventListener('showGlobalToast', function (event) {
332
- const detail = event.detail;
333
- const message = detail.message || 'Done!';
334
- const type = detail.type || 'info'; // success, error, warning, info
335
-
336
- const toastContainer = document.getElementById('global-toast-container');
337
- if (!toastContainer) return;
338
-
339
- const toast = document.createElement('article');
340
- toast.className = `toast-message ${type}`;
341
- toast.innerHTML = `<button class="close-toast" style="float: right; background: none; border: none; font-size: 1.2rem; line-height: 1; padding: 0.25rem 0.5rem; cursor: pointer;">&times;</button>${message}`;
342
-
343
- toast.style.padding = '0.75rem';
344
- toast.style.border = '1px solid';
345
- toast.style.borderRadius = 'var(--pico-border-radius, 4px)';
346
- toast.style.minWidth = '250px';
347
- toast.style.maxWidth = '400px';
348
- toast.style.opacity = '0';
349
- toast.style.transition = 'opacity 0.3s ease-in-out, transform 0.3s ease-in-out';
350
- toast.style.transform = 'translateX(100%)';
351
-
352
- if (type === 'success') {
353
- toast.style.borderColor = 'var(--pico-color-green-500, green)';
354
- toast.style.backgroundColor = 'var(--pico-color-green-150, #e6fffa)';
355
- toast.style.color = 'var(--pico-color-green-700, darkgreen)';
356
- } else if (type === 'error') {
357
- toast.style.borderColor = 'var(--pico-color-red-500, red)';
358
- toast.style.backgroundColor = 'var(--pico-color-red-150, #ffe6e6)';
359
- toast.style.color = 'var(--pico-color-red-700, darkred)';
360
- } else { // Default/info/warning
361
- toast.style.borderColor = 'var(--pico-color-blue-500, blue)';
362
- toast.style.backgroundColor = 'var(--pico-color-blue-150, #e6f7ff)';
363
- toast.style.color = 'var(--pico-color-blue-700, darkblue)';
364
- }
365
-
366
- toastContainer.appendChild(toast);
367
-
368
- setTimeout(() => {
369
- toast.style.opacity = '1';
370
- toast.style.transform = 'translateX(0)';
371
- }, 10);
372
-
373
- const closeButton = toast.querySelector('.close-toast');
374
- closeButton.onclick = () => {
375
- toast.style.opacity = '0';
376
- toast.style.transform = 'translateY(-20px)';
377
- setTimeout(() => toast.remove(), 300);
378
- };
379
-
380
- setTimeout(() => {
381
- toast.style.opacity = '0';
382
- toast.style.transform = 'translateY(-20px)';
383
- setTimeout(() => toast.remove(), 300);
384
- }, 5000);
385
- });
386
- </script>
387
- </body>
388
-
389
- </html>
@@ -1,152 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en" data-theme="dark">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Flock Chat</title>
7
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css" />
8
- <link rel="stylesheet" href="{{ url_for('static', path='css/chat.css') }}">
9
- {# Prism.js CSS for syntax highlighting (okaidia theme) #}
10
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-okaidia.min.css" referrerpolicy="no-referrer" />
11
- {# Inject active theme variables #}
12
- {% if theme_css and theme_css.strip() %}
13
- <style>
14
- /* Start Theme CSS */
15
- /* stylelint-disable */
16
- {{ theme_css | safe }}
17
- /* stylelint-enable */
18
- /* End Theme CSS */
19
- </style>
20
- {% endif %}
21
- <script src="https://unpkg.com/htmx.org@1.9.10" integrity="sha384-D1Kt99CQMDuVetoL1lrYwg5t+9QdHe7NLX/SoJYkXDFfX37iInKRy5xLSi8nO7UC" crossorigin="anonymous"></script>
22
- <script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
23
- {# Prism.js JS (core and components for common languages) #}
24
- <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js" referrerpolicy="no-referrer"></script>
25
- <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js" referrerpolicy="no-referrer"></script>
26
- </head>
27
- <body class="chat-page">
28
- <div id="global-toast-container" style="position: fixed; top: 1rem; right: 1rem; z-index: 9999; display: flex; flex-direction: column; gap: 0.5rem;">
29
- <!-- Toasts will be appended here -->
30
- </div>
31
-
32
- <div id="chat-container">
33
- <div class="chat-header" style="justify-content: space-between;">
34
- <hgroup>
35
- <h2>Flock Chat</h2>
36
- <h3>{{ chat_subtitle }}</h3>
37
- </hgroup> {% if not is_shared_chat %}
38
- <button class="secondary outline" hx-get="{{ url_for('chat_settings_standalone') }}" hx-target="#chat-content-area" hx-swap="innerHTML" style="min-width:auto;">Settings</button>
39
- {% else %}
40
- {# Optionally, could show a disabled settings button or some other indicator #}
41
- <span style="font-size: 0.8rem; color: var(--pico-muted-color);">Settings frozen for shared session.</span>
42
- {% endif %}
43
- </div>
44
-
45
- <div id="chat-content-area"> <div id="chat-log"
46
- hx-get="{% if is_shared_chat %}{{ url_for('chat_history_shared_partial', share_id=share_id) }}{% else %}{{ url_for('chat_history_partial') }}{% endif %}"
47
- hx-trigger="load" {# Polling removed #}
48
- hx-swap="innerHTML">
49
- <p><em>Loading chat…</em></p>
50
- </div>
51
- <form id="chat-form-standalone"
52
- hx-post="{% if is_shared_chat %}{{ url_for('chat_send_shared') }}{% else %}{{ url_for('chat_send') }}{% endif %}"
53
- hx-target="#chat-log"
54
- hx-swap="innerHTML"
55
- hx-disabled-elt="input[name='message'], button[type='submit']"
56
- hx-on::before-request="htmx.find('#chat-form-standalone button[type=\'submit\']').textContent = 'Sending...'"
57
- hx-on::after-request="htmx.find('#chat-form-standalone button[type=\'submit\']').textContent = 'Send'; this.reset();">
58
-
59
- {% if is_shared_chat %}
60
- <input type="hidden" name="share_id" value="{{ share_id }}">
61
- {% endif %}
62
- <input type="text" name="message" placeholder="Type a message…" required autofocus>
63
- <button type="submit">Send</button>
64
- </form>
65
- </div>
66
-
67
- <div class="chat-footer">
68
- <small>Built with FastAPI • HTMX • Pico.css – Theme: {{ active_theme_name | default('default') }}</small>
69
- </div>
70
- </div>
71
-
72
- <script>
73
- (function() {
74
- const log = document.getElementById('chat-log');
75
- function scrollBottom() {
76
- log.scrollTop = log.scrollHeight;
77
- }
78
- document.addEventListener('htmx:afterSwap', e => {
79
- if (e.detail.target.id === 'chat-log') {
80
- scrollBottom();
81
- // Re-run Prism highlighting after new content is swapped in
82
- Prism.highlightAllUnder(log);
83
- }
84
- });
85
- window.addEventListener('load', scrollBottom);
86
- // Initial highlight on page load for any pre-existing content
87
- document.addEventListener('DOMContentLoaded', () => {
88
- Prism.highlightAll();
89
- });
90
- })();
91
-
92
- // Global Toast Handler
93
- document.body.addEventListener('showGlobalToast', function (event) {
94
- const detail = event.detail;
95
- const message = detail.message || 'Done!';
96
- const type = detail.type || 'info'; // success, error, warning, info
97
-
98
- const toastContainer = document.getElementById('global-toast-container');
99
- if (!toastContainer) return;
100
-
101
- const toast = document.createElement('article');
102
- toast.className = `toast-message ${type}`;
103
- toast.innerHTML = `<button class="close-toast" style="float: right; background: none; border: none; font-size: 1.2rem; line-height: 1; padding: 0.25rem 0.5rem; cursor: pointer;">&times;</button>${message}`;
104
-
105
- // Basic styling, can be enhanced in CSS file
106
- toast.style.padding = '0.75rem';
107
- toast.style.border = '1px solid';
108
- toast.style.borderRadius = 'var(--pico-border-radius, 4px)';
109
- toast.style.minWidth = '250px';
110
- toast.style.maxWidth = '400px';
111
- toast.style.opacity = '0'; // Start faded out
112
- toast.style.transition = 'opacity 0.3s ease-in-out, transform 0.3s ease-in-out';
113
- toast.style.transform = 'translateX(100%)'; // Start off-screen
114
-
115
- if (type === 'success') {
116
- toast.style.borderColor = 'var(--pico-color-green-500, green)';
117
- toast.style.backgroundColor = 'var(--pico-color-green-150, #e6fffa)';
118
- toast.style.color = 'var(--pico-color-green-700, darkgreen)';
119
- } else if (type === 'error') {
120
- toast.style.borderColor = 'var(--pico-color-red-500, red)';
121
- toast.style.backgroundColor = 'var(--pico-color-red-150, #ffe6e6)';
122
- toast.style.color = 'var(--pico-color-red-700, darkred)';
123
- } else { // Default/info/warning
124
- toast.style.borderColor = 'var(--pico-color-blue-500, blue)';
125
- toast.style.backgroundColor = 'var(--pico-color-blue-150, #e6f7ff)';
126
- toast.style.color = 'var(--pico-color-blue-700, darkblue)';
127
- }
128
-
129
- toastContainer.appendChild(toast);
130
-
131
- // Animate in
132
- setTimeout(() => {
133
- toast.style.opacity = '1';
134
- toast.style.transform = 'translateX(0)';
135
- }, 10); // Small delay to allow CSS to apply initial state
136
-
137
- const closeButton = toast.querySelector('.close-toast');
138
- closeButton.onclick = () => {
139
- toast.style.opacity = '0';
140
- toast.style.transform = 'translateY(-20px)';
141
- setTimeout(() => toast.remove(), 300);
142
- };
143
-
144
- setTimeout(() => {
145
- toast.style.opacity = '0';
146
- toast.style.transform = 'translateY(-20px)';
147
- setTimeout(() => toast.remove(), 300);
148
- }, 5000); // Auto-dismiss after 5 seconds
149
- });
150
- </script>
151
- </body>
152
- </html>
@@ -1,19 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en" data-theme="dark">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Chat Settings</title>
7
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css" /> <link rel="stylesheet" href="{{ url_for('static', path='css/chat.css') }}">
8
- <link rel="stylesheet" href="{{ url_for('static', path='css/header.css') }}">
9
- {# Active theme CSS #}
10
- {% if theme_css %}<style>{{ theme_css | safe }}</style>{% endif %}
11
- <script src="https://unpkg.com/htmx.org@1.9.10" crossorigin="anonymous"></script>
12
- </head>
13
- <body class="chat-page">
14
- <main style="max-width: 700px; margin: 2rem auto;">
15
- {% include 'partials/_chat_settings_form.html' %}
16
- <p style="text-align:center; margin-top: 1rem;"><a href="{{ url_for('chat_page') }}">← Back to Chat</a></p>
17
- </main>
18
- </body>
19
- </html>
@@ -1,16 +0,0 @@
1
- {% extends "base.html" %}
2
-
3
- {% block title %}Flock Editor - {{ flock.name if flock else 'Loading...' }}{% endblock %}
4
-
5
- {% block content %}
6
- {# Main content area is now loaded dynamically based on sidebar clicks #}
7
- {# We can load the properties form by default when this page is hit #}
8
- <div id="editor-main-content" hx-get="{{ url_for('htmx_get_flock_properties_form') }}"
9
- hx-trigger="load"
10
- hx-swap="innerHTML">
11
- <article>
12
- <p>Loading editor content...</p>
13
- <progress></progress>
14
- </article>
15
- </div>
16
- {% endblock %}
@@ -1,12 +0,0 @@
1
- {% extends "base.html" %}
2
-
3
- {% block title %}Flock UI - Dashboard{% endblock %}
4
-
5
- {% block content %}
6
- {# This content will be loaded dynamically via HTMX from the sidebar #}
7
- {# We can load the 'load/manage' view by default #}
8
- <div id="dashboard-content" hx-get="{{ url_for('htmx_get_load_flock_view') }}" hx-trigger="load" hx-swap="innerHTML">
9
- <p>Loading dashboard content...</p>
10
- <progress></progress>
11
- </div>
12
- {% endblock %}