flock-core 0.4.543__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.543.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.543.dist-info/METADATA +0 -676
  496. flock_core-0.4.543.dist-info/RECORD +0 -572
  497. flock_core-0.4.543.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.543.dist-info → flock_core-0.5.0.dist-info}/WHEEL +0 -0
flock/tools/code_tools.py DELETED
@@ -1,167 +0,0 @@
1
- from flock.core.interpreter.python_interpreter import PythonInterpreter
2
- from flock.core.logging.trace_and_logged import traced_and_logged
3
-
4
-
5
- @traced_and_logged
6
- def code_evaluate_math(expression: str) -> float:
7
- try:
8
- result = PythonInterpreter(
9
- {},
10
- [
11
- "os",
12
- "math",
13
- "random",
14
- "datetime",
15
- "time",
16
- "string",
17
- "collections",
18
- "itertools",
19
- "functools",
20
- "typing",
21
- "enum",
22
- "json",
23
- "ast",
24
- ],
25
- verbose=True,
26
- ).execute(expression)
27
- return result
28
- except Exception:
29
- raise
30
-
31
-
32
- @traced_and_logged
33
- def code_code_eval(python_code: str) -> str:
34
- """A Python code evaluation tool that executes Python code and returns the result.
35
-
36
- The code may not be markdown-escaped with triple backticks.
37
- It is expected to be a valid Python code snippet that can be executed directly.
38
- The code is executed in a controlled environment with a limited set of libraries.
39
- It allows the use of the following libraries:
40
- "os",
41
- "math",
42
- "random",
43
- "datetime",
44
- "time",
45
- "string",
46
- "collections",
47
- "itertools",
48
- "functools",
49
- "typing",
50
- "enum",
51
- "json",
52
- "ast",
53
- "numpy",
54
- "sympy",
55
- "pandas",
56
- "httpx",
57
- """
58
- try:
59
- result = PythonInterpreter(
60
- {},
61
- [
62
- "os",
63
- "math",
64
- "random",
65
- "datetime",
66
- "time",
67
- "string",
68
- "collections",
69
- "itertools",
70
- "functools",
71
- "typing",
72
- "enum",
73
- "json",
74
- "ast",
75
- "numpy",
76
- "sympy",
77
- "pandas",
78
- ],
79
- verbose=True,
80
- ).execute(python_code)
81
- return result
82
- except Exception:
83
- raise
84
-
85
-
86
- @traced_and_logged
87
- def docker_code_execute(python_code: str) -> str:
88
- """Execute Python code in a sandboxed Docker container."""
89
- import ast
90
- import os
91
- import pathlib
92
- import platform
93
- import shutil
94
- import textwrap
95
- import uuid
96
-
97
- import docker
98
- def _auto_print_last_expr(code: str) -> str:
99
- """If the last top-level statement is a bare expression,
100
- append a print() so script mode surfaces its value.
101
- """
102
- tree = ast.parse(code, mode="exec")
103
- if tree.body and isinstance(tree.body[-1], ast.Expr):
104
- # Re-extract the exact source of that expression
105
- expr_src = textwrap.dedent(
106
- code.splitlines()[tree.body[-1].lineno - 1]
107
- )
108
- code += f"\nprint({expr_src})"
109
- return code
110
- # --- 1. Figure out a base directory that exists on this OS ----------
111
- if platform.system() == "Windows":
112
- base_dir = pathlib.Path(os.getenv("SANDBOX_BASE_DIR", r"C:\sandboxes"))
113
- else: # Linux, macOS, WSL2
114
- base_dir = pathlib.Path(os.getenv("SANDBOX_BASE_DIR", "/var/sandboxes"))
115
-
116
- base_dir.mkdir(parents=True, exist_ok=True)
117
-
118
- sandbox_id = f"sbox-{uuid.uuid4()}"
119
- workdir = base_dir / sandbox_id
120
- workdir.mkdir(parents=True, exist_ok=False)
121
-
122
- # Docker’s HTTP API always wants POSIX‐style paths (“/”, drive letter allowed).
123
- host_path = workdir.resolve().as_posix() # e.g. "C:/sandboxes/…"
124
-
125
- client = docker.from_env()
126
- image = "python:3.12-slim"
127
-
128
- # --- 2. Decide whether we can / should request the gVisor runtime ---
129
- runtime_args = {}
130
- if platform.system() != "Windows" and shutil.which("runsc"):
131
- runtime_args["runtime"] = "runsc" # gVisor on Linux & macOS
132
-
133
- container = client.containers.run(
134
- image,
135
- name=sandbox_id,
136
- command=["sleep", "infinity"],
137
- user="65534:65534", # nobody
138
- network_mode="none",
139
- volumes={host_path: {"bind": "/workspace", "mode": "rw"}},
140
- mem_limit="4g",
141
- cpu_period=100_000,
142
- cpu_quota=200_000, # 2 vCPU
143
- security_opt=["no-new-privileges"],
144
- detach=True,
145
- **runtime_args,
146
- )
147
-
148
- try:
149
- def exec_code(cmd: list[str], timeout: int = 30) -> str:
150
- exec_id = client.api.exec_create(
151
- container.id, cmd, workdir="/workspace"
152
- )["Id"]
153
- return client.api.exec_start(
154
- exec_id, stream=False, demux=False, tty=False,
155
- ).decode()
156
-
157
- # --- 3. Copy code in and execute --------------------------------
158
- (workdir / "main.py").write_text(_auto_print_last_expr(python_code), encoding="utf-8")
159
- stdout = exec_code(["python", "main.py"], timeout=30)
160
- return stdout.strip()
161
-
162
- finally:
163
- # --- 4. Tear everything down ------------------------------------
164
- container.remove(force=True)
165
- shutil.rmtree(workdir, ignore_errors=True)
166
-
167
-
flock/tools/file_tools.py DELETED
@@ -1,149 +0,0 @@
1
- import importlib
2
- import json
3
- from typing import Any
4
-
5
- from flock.core.logging.trace_and_logged import traced_and_logged
6
-
7
-
8
- @traced_and_logged
9
- def file_get_anything_as_markdown(url_or_file_path: str):
10
- if importlib.util.find_spec("docling") is not None:
11
- from docling.document_converter import DocumentConverter
12
-
13
- try:
14
- converter = DocumentConverter()
15
- result = converter.convert(url_or_file_path)
16
- markdown = result.document.export_to_markdown()
17
- return markdown
18
- except Exception:
19
- raise
20
- else:
21
- raise ImportError(
22
- "Optional tool dependencies not installed. Install with 'pip install flock-core[file-tools]'."
23
- )
24
-
25
-
26
- @traced_and_logged
27
- def file_append_to_file(content: str, filename: str):
28
- try:
29
- with open(filename, "a", encoding="utf-8") as f:
30
- f.write(content)
31
- except Exception:
32
- raise
33
-
34
-
35
- @traced_and_logged
36
- def file_save_to_file(content: str, filename: str):
37
- try:
38
- with open(filename, "w", encoding="utf-8") as f:
39
- f.write(content)
40
- except Exception:
41
- raise
42
-
43
-
44
- @traced_and_logged
45
- def file_read_from_file(filename: str) -> str:
46
- with open(filename, encoding="utf-8") as file:
47
- return file.read()
48
-
49
-
50
- @traced_and_logged
51
- def file_json_parse_safe(text: str) -> dict:
52
- try:
53
- result = json.loads(text)
54
- return result
55
- except Exception:
56
- return {}
57
-
58
-
59
- @traced_and_logged
60
- def file_json_search(
61
- json_file_path: str, search_query: str, case_sensitive: bool = False
62
- ) -> list:
63
- """Search a JSON file for objects containing the specified search query.
64
-
65
- Args:
66
- json_file_path (str): Path to the JSON file to search
67
- search_query (str): Text to search for within the JSON objects
68
- case_sensitive (bool, optional): Whether to perform a case-sensitive search. Defaults to False.
69
-
70
- Returns:
71
- list: List of JSON objects (as dicts) that contain the search query
72
-
73
- Example:
74
- >>> matching_tickets = file_json_search("tickets.json", "error 404")
75
- >>> print(
76
- ... f"Found {len(matching_tickets)} tickets mentioning '404 error'"
77
- ... )
78
- """
79
- try:
80
- # Read the JSON file
81
- file_content = file_read_from_file(json_file_path)
82
-
83
- # Parse the JSON content
84
- json_data = file_json_parse_safe(file_content)
85
-
86
- # Convert search query to lowercase if case-insensitive search
87
- if not case_sensitive:
88
- search_query = search_query.lower()
89
-
90
- results = []
91
-
92
- # Determine if the JSON root is an object or array
93
- if isinstance(json_data, dict):
94
- # Handle case where root is a dictionary object
95
- for key, value in json_data.items():
96
- if isinstance(value, list):
97
- # If this key contains a list of objects, search within them
98
- matching_items = _search_in_list(
99
- value, search_query, case_sensitive
100
- )
101
- results.extend(matching_items)
102
- elif _contains_text(value, search_query, case_sensitive):
103
- # The entire object matches
104
- results.append(json_data)
105
- break
106
- elif isinstance(json_data, list):
107
- # Handle case where root is an array
108
- matching_items = _search_in_list(
109
- json_data, search_query, case_sensitive
110
- )
111
- results.extend(matching_items)
112
-
113
- return results
114
-
115
- except Exception as e:
116
- return [{"error": f"Error searching JSON file: {e!s}"}]
117
-
118
-
119
- def _search_in_list(
120
- items: list, search_query: str, case_sensitive: bool
121
- ) -> list:
122
- """Helper function to search for text in a list of items."""
123
- matching_items = []
124
- for item in items:
125
- if _contains_text(item, search_query, case_sensitive):
126
- matching_items.append(item)
127
- return matching_items
128
-
129
-
130
- def _contains_text(obj: Any, search_query: str, case_sensitive: bool) -> bool:
131
- """Recursively check if an object contains the search query in any of its string values."""
132
- if isinstance(obj, str):
133
- # For string values, check if they contain the search query
134
- if case_sensitive:
135
- return search_query in obj
136
- else:
137
- return search_query in obj.lower()
138
- elif isinstance(obj, dict):
139
- # For dictionaries, check each value
140
- for value in obj.values():
141
- if _contains_text(value, search_query, case_sensitive):
142
- return True
143
- elif isinstance(obj, list):
144
- # For lists, check each item
145
- for item in obj:
146
- if _contains_text(item, search_query, case_sensitive):
147
- return True
148
- # For other types (numbers, booleans, None), return False
149
- return False
@@ -1,157 +0,0 @@
1
- """This module provides tools for interacting with GitHub repositories."""
2
-
3
- import base64
4
- import os
5
-
6
- import httpx
7
-
8
- from flock.core.logging.trace_and_logged import traced_and_logged
9
-
10
-
11
- @traced_and_logged
12
- def github_create_user_stories_as_github_issue(title: str, body: str) -> str:
13
- github_pat = os.getenv("GITHUB_PAT")
14
- github_repo = os.getenv("GITHUB_REPO")
15
-
16
- url = f"https://api.github.com/repos/{github_repo}/issues"
17
- headers = {
18
- "Authorization": f"Bearer {github_pat}",
19
- "Accept": "application/vnd.github+json",
20
- }
21
- issue_title = title
22
- issue_body = body
23
-
24
- payload = {"title": issue_title, "body": issue_body}
25
- response = httpx.post(url, json=payload, headers=headers)
26
-
27
- if response.status_code == 201:
28
- return "Issue created successfully."
29
- else:
30
- return "Failed to create issue. Please try again later."
31
-
32
-
33
- @traced_and_logged
34
- def github_upload_readme(content: str):
35
- GITHUB_USERNAME = os.getenv("GITHUB_USERNAME")
36
- REPO_NAME = os.getenv("GITHUB_REPO")
37
- GITHUB_TOKEN = os.getenv("GITHUB_PAT")
38
-
39
- if not GITHUB_USERNAME or not REPO_NAME or not GITHUB_TOKEN:
40
- raise ValueError(
41
- "Missing environment variables: GITHUB_USERNAME, GITHUB_REPO, or GITHUB_PAT"
42
- )
43
-
44
- GITHUB_API_URL = f"https://api.github.com/repos/{GITHUB_USERNAME}/{REPO_NAME}/contents/README.md"
45
-
46
- encoded_content = base64.b64encode(content.encode()).decode()
47
-
48
- with httpx.Client() as client:
49
- response = client.get(
50
- GITHUB_API_URL,
51
- headers={
52
- "Authorization": f"Bearer {GITHUB_TOKEN}",
53
- "Accept": "application/vnd.github.v3+json",
54
- },
55
- )
56
-
57
- data = response.json()
58
- sha = data.get("sha", None)
59
-
60
- payload = {
61
- "message": "Updating README.md",
62
- "content": encoded_content,
63
- "branch": "main",
64
- }
65
-
66
- if sha:
67
- payload["sha"] = sha
68
-
69
- response = client.put(
70
- GITHUB_API_URL,
71
- json=payload,
72
- headers={
73
- "Authorization": f"Bearer {GITHUB_TOKEN}",
74
- "Accept": "application/vnd.github.v3+json",
75
- },
76
- )
77
-
78
- if response.status_code in [200, 201]:
79
- print("README.md successfully uploaded/updated!")
80
- else:
81
- print("Failed to upload README.md:", response.json())
82
-
83
-
84
- @traced_and_logged
85
- def github_create_files(file_paths) -> str:
86
- """Create multiple files in a GitHub repository with a predefined content.
87
-
88
- This function iterates over a list of file paths (relative to the repository root) and creates
89
- each file in the specified GitHub repository with the content "#created by flock". For each file,
90
- it checks whether the file already exists; if it does, that file is skipped. The function
91
- uses the following environment variables for authentication and repository information:
92
-
93
- - GITHUB_USERNAME: Your GitHub username.
94
- - GITHUB_REPO: The name of the repository.
95
- - GITHUB_PAT: Your GitHub Personal Access Token for authentication.
96
-
97
- Parameters:
98
- file_paths (list of str): A list of file paths (relative to the repository root) to be created.
99
-
100
- Returns:
101
- str: A message indicating whether the files were created successfully or if there was a failure.
102
- """
103
- try:
104
- GITHUB_USERNAME = os.getenv("GITHUB_USERNAME")
105
- REPO_NAME = os.getenv("GITHUB_REPO")
106
- GITHUB_TOKEN = os.getenv("GITHUB_PAT")
107
-
108
- if not GITHUB_USERNAME or not REPO_NAME or not GITHUB_TOKEN:
109
- raise ValueError(
110
- "Missing environment variables: GITHUB_USERNAME, GITHUB_REPO, or GITHUB_PAT"
111
- )
112
-
113
- encoded_content = base64.b64encode(b"#created by flock").decode()
114
-
115
- with httpx.Client() as client:
116
- for file_path in file_paths:
117
- GITHUB_API_URL = f"https://api.github.com/repos/{GITHUB_USERNAME}/{REPO_NAME}/contents/{file_path}"
118
-
119
- response = client.get(
120
- GITHUB_API_URL,
121
- headers={
122
- "Authorization": f"token {GITHUB_TOKEN}",
123
- "Accept": "application/vnd.github.v3+json",
124
- },
125
- )
126
-
127
- data = response.json()
128
- sha = data.get("sha", None)
129
-
130
- payload = {
131
- "message": f"Creating {file_path}",
132
- "content": encoded_content,
133
- "branch": "main",
134
- }
135
-
136
- if sha:
137
- print(f"Skipping {file_path}, file already exists.")
138
- continue
139
-
140
- response = client.put(
141
- GITHUB_API_URL,
142
- json=payload,
143
- headers={
144
- "Authorization": f"token {GITHUB_TOKEN}",
145
- "Accept": "application/vnd.github.v3+json",
146
- },
147
- )
148
-
149
- if response.status_code in [200, 201]:
150
- print(f"{file_path} successfully created!")
151
- else:
152
- print(f"Failed to create {file_path}:", response.json())
153
-
154
- return "Files created successfully."
155
-
156
- except Exception:
157
- return "Failed to create file. Please try again later."
@@ -1,205 +0,0 @@
1
- import re
2
- from typing import Any
3
-
4
- from flock.core.logging.trace_and_logged import traced_and_logged
5
-
6
-
7
- @traced_and_logged
8
- def markdown_split_by_headers(
9
- markdown_text: str, min_header_level: int = 1, max_header_level: int = 2
10
- ) -> list[dict[str, Any]]:
11
- if not markdown_text:
12
- return []
13
-
14
- # Pattern to match headers from level min_header_level to max_header_level
15
- header_pattern = re.compile(
16
- f"^({'#' * min_header_level}){{'1,{max_header_level - min_header_level + 1}'}}\\s+(.+)$",
17
- re.MULTILINE,
18
- )
19
-
20
- # Find all headers
21
- headers = list(header_pattern.finditer(markdown_text))
22
-
23
- if not headers:
24
- return [{"title": "Text", "content": markdown_text, "level": 0}]
25
-
26
- chunks = []
27
-
28
- # Process each section
29
- for i in range(len(headers)):
30
- current_header = headers[i]
31
- header_text = current_header.group(2).strip()
32
- header_level = len(current_header.group(1))
33
-
34
- # Determine section content
35
- if i < len(headers) - 1:
36
- next_header_start = headers[i + 1].start()
37
- content = markdown_text[current_header.end() : next_header_start]
38
- else:
39
- content = markdown_text[current_header.end() :]
40
-
41
- chunks.append(
42
- {
43
- "title": header_text,
44
- "content": content.strip(),
45
- "level": header_level,
46
- }
47
- )
48
-
49
- # Check if there's content before the first header
50
- if headers[0].start() > 0:
51
- preamble = markdown_text[: headers[0].start()].strip()
52
- if preamble:
53
- chunks.insert(
54
- 0, {"title": "Preamble", "content": preamble, "level": 0}
55
- )
56
-
57
- return chunks
58
-
59
-
60
- @traced_and_logged
61
- def markdown_extract_code_blocks(
62
- markdown_text: str, language: str = None
63
- ) -> list[dict[str, str]]:
64
- if not markdown_text:
65
- return []
66
-
67
- # Pattern to match markdown code blocks
68
- if language:
69
- # Match only code blocks with the specified language
70
- pattern = rf"```{language}\s*([\s\S]*?)\s*```"
71
- else:
72
- # Match all code blocks, capturing the language specifier if present
73
- pattern = r"```(\w*)\s*([\s\S]*?)\s*```"
74
-
75
- blocks = []
76
-
77
- if language:
78
- # If language is specified, we only capture the code content
79
- matches = re.finditer(pattern, markdown_text)
80
- for match in matches:
81
- blocks.append(
82
- {"language": language, "code": match.group(1).strip()}
83
- )
84
- else:
85
- # If no language is specified, we capture both language and code content
86
- matches = re.finditer(pattern, markdown_text)
87
- for match in matches:
88
- lang = match.group(1).strip() if match.group(1) else "text"
89
- blocks.append({"language": lang, "code": match.group(2).strip()})
90
-
91
- return blocks
92
-
93
-
94
- @traced_and_logged
95
- def markdown_extract_links(markdown_text: str) -> list[dict[str, str]]:
96
- if not markdown_text:
97
- return []
98
-
99
- # Pattern to match markdown links [text](url)
100
- link_pattern = re.compile(r"\[([^\]]+)\]\(([^)]+)\)")
101
- matches = link_pattern.findall(markdown_text)
102
-
103
- return [{"text": text, "url": url} for text, url in matches]
104
-
105
-
106
- @traced_and_logged
107
- def markdown_extract_tables(markdown_text: str) -> list[dict[str, Any]]:
108
- if not markdown_text:
109
- return []
110
-
111
- # Split the text by lines
112
- lines = markdown_text.split("\n")
113
-
114
- tables = []
115
- current_table = None
116
- header_row = None
117
-
118
- for line in lines:
119
- line = line.strip()
120
-
121
- # Table rows are indicated by starting with |
122
- if line.startswith("|") and line.endswith("|"):
123
- if current_table is None:
124
- current_table = []
125
- # This is the header row
126
- header_row = [
127
- cell.strip() for cell in line.strip("|").split("|")
128
- ]
129
- elif "|--" in line or "|:-" in line:
130
- # This is the separator row, ignore it
131
- pass
132
- else:
133
- # This is a data row
134
- row_data = [cell.strip() for cell in line.strip("|").split("|")]
135
-
136
- # Create a dictionary mapping headers to values
137
- row_dict = {}
138
- for i, header in enumerate(header_row):
139
- if i < len(row_data):
140
- row_dict[header] = row_data[i]
141
- else:
142
- row_dict[header] = ""
143
-
144
- current_table.append(row_dict)
145
- else:
146
- # End of table
147
- if current_table is not None:
148
- tables.append({"headers": header_row, "rows": current_table})
149
- current_table = None
150
- header_row = None
151
-
152
- # Don't forget to add the last table if we're at the end of the document
153
- if current_table is not None:
154
- tables.append({"headers": header_row, "rows": current_table})
155
-
156
- return tables
157
-
158
-
159
- @traced_and_logged
160
- def markdown_to_plain_text(markdown_text: str) -> str:
161
- if not markdown_text:
162
- return ""
163
-
164
- # Replace headers
165
- text = re.sub(r"^#{1,6}\s+(.+)$", r"\1", markdown_text, flags=re.MULTILINE)
166
-
167
- # Replace bold and italic
168
- text = re.sub(r"\*\*(.*?)\*\*", r"\1", text)
169
- text = re.sub(r"__(.*?)__", r"\1", text)
170
- text = re.sub(r"\*(.*?)\*", r"\1", text)
171
- text = re.sub(r"_(.*?)_", r"\1", text)
172
-
173
- # Replace links
174
- text = re.sub(r"\[(.*?)\]\((.*?)\)", r"\1 (\2)", text)
175
-
176
- # Replace code blocks
177
- text = re.sub(r"```(?:\w+)?\s*([\s\S]*?)\s*```", r"\1", text)
178
- text = re.sub(r"`([^`]*?)`", r"\1", text)
179
-
180
- # Replace bullet points
181
- text = re.sub(r"^[\*\-\+]\s+(.+)$", r"• \1", text, flags=re.MULTILINE)
182
-
183
- # Replace numbered lists (keeping the numbers)
184
- text = re.sub(r"^\d+\.\s+(.+)$", r"\1", text, flags=re.MULTILINE)
185
-
186
- # Replace blockquotes
187
- text = re.sub(r"^>\s+(.+)$", r"\1", text, flags=re.MULTILINE)
188
-
189
- # Remove HTML tags
190
- text = re.sub(r"<.*?>", "", text)
191
-
192
- # Normalize whitespace
193
- text = re.sub(r"\n{3,}", "\n\n", text)
194
-
195
- return text.strip()
196
-
197
-
198
-
199
- @traced_and_logged
200
- def extract_links_from_markdown(markdown: str, url: str) -> list:
201
- # Regular expression to find all markdown links
202
- link_pattern = re.compile(r"\[([^\]]+)\]\(([^)]+)\)")
203
- links = link_pattern.findall(markdown)
204
- return [url + link[1] for link in links]
205
-
@@ -1,9 +0,0 @@
1
- from flock.core.logging.trace_and_logged import traced_and_logged
2
-
3
-
4
- @traced_and_logged
5
- def get_current_time() -> str:
6
- import datetime
7
-
8
- time = datetime.datetime.now().isoformat()
9
- return time