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/web_tools.py DELETED
@@ -1,92 +0,0 @@
1
-
2
- import importlib
3
- import os
4
- from typing import Literal
5
-
6
- from flock.core.logging.trace_and_logged import traced_and_logged
7
-
8
-
9
- @traced_and_logged
10
- def web_search_tavily(query: str):
11
- if importlib.util.find_spec("tavily") is not None:
12
- from tavily import TavilyClient
13
-
14
- client = TavilyClient(api_key=os.getenv("TAVILY_API_KEY"))
15
- try:
16
- response = client.search(query, include_answer=True) # type: ignore
17
- return response
18
- except Exception:
19
- raise
20
- else:
21
- raise ImportError(
22
- "Optional tool dependencies not installed. Install with 'pip install flock-mcp[all]'."
23
- )
24
-
25
-
26
- @traced_and_logged
27
- def web_search_duckduckgo(
28
- keywords: str, search_type: Literal["news", "web"] = "web"
29
- ):
30
- try:
31
- if importlib.util.find_spec("ddgs") is not None:
32
- from ddgs import DDGS
33
-
34
- if search_type == "news":
35
- response = DDGS().news(keywords)
36
- else:
37
- response = DDGS().text(keywords)
38
-
39
- return response
40
- else:
41
- raise ImportError(
42
- "Optional tool dependencies not installed. Install with 'pip install flock-mcp[all]'."
43
- )
44
- except Exception:
45
- raise
46
-
47
-
48
- @traced_and_logged
49
- def web_search_bing(keywords: str):
50
- try:
51
- import httpx
52
-
53
- subscription_key = os.environ["BING_SEARCH_V7_SUBSCRIPTION_KEY"]
54
- endpoint = "https://api.bing.microsoft.com/v7.0/search"
55
-
56
- # Query term(s) to search for.
57
- query = keywords
58
-
59
- # Construct a request
60
- mkt = "en-US"
61
- params = {"q": query, "mkt": mkt}
62
- headers = {"Ocp-Apim-Subscription-Key": subscription_key}
63
-
64
- response = httpx.get(endpoint, headers=headers, params=params)
65
- response.raise_for_status()
66
- search_results = response.json()
67
- return search_results["webPages"]
68
- except Exception:
69
- raise
70
-
71
- @traced_and_logged
72
- def web_content_as_markdown(url: str) -> str:
73
- if (
74
- importlib.util.find_spec("httpx") is not None
75
- and importlib.util.find_spec("markdownify") is not None
76
- ):
77
- import httpx
78
- from markdownify import markdownify as md
79
-
80
- try:
81
- response = httpx.get(url)
82
- response.raise_for_status()
83
- markdown = md(response.text)
84
- return markdown
85
- except Exception:
86
- raise
87
- else:
88
- raise ImportError(
89
- "Optional tool dependencies not installed. Install with 'pip install flock-mcp[all]'."
90
- )
91
-
92
-
@@ -1,501 +0,0 @@
1
- """Tools for interacting with Zendesk."""
2
-
3
- import os
4
-
5
- import httpx
6
- from mcp.server.fastmcp import FastMCP
7
-
8
- from flock.core.logging.logging import get_logger
9
-
10
- mcp = FastMCP("ZendeskTools")
11
- logger = get_logger(__name__)
12
-
13
- def _get_headers() -> dict:
14
- logger.debug("Preparing headers for Zendesk API request")
15
-
16
- token = os.getenv("ZENDESK_BEARER_TOKEN")
17
- if not token:
18
- logger.error("ZENDESK_BEARER_TOKEN environment variable is not set")
19
- raise ValueError(
20
- "ZENDESK_BEARER_TOKEN environment variable is not set"
21
- )
22
-
23
- logger.debug("Successfully retrieved bearer token from environment")
24
- # Log a masked version of the token for debugging
25
- masked_token = f"{token[:10]}...{token[-4:] if len(token) > 14 else 'short'}"
26
- logger.debug(f"Using bearer token: {masked_token}")
27
- logger.debug("Headers prepared successfully")
28
-
29
- return {
30
- "Authorization": f"Bearer {token}",
31
- "Accept": "application/json",
32
- }
33
-
34
-
35
- @mcp.tool()
36
- def zendesk_get_tickets(number_of_tickets: int = 10) -> list[dict]:
37
- """Get all tickets."""
38
- logger.info(f"Starting zendesk_get_tickets with number_of_tickets: {number_of_tickets}")
39
-
40
- ZENDESK_SUBDOMAIN = os.getenv("ZENDESK_SUBDOMAIN_TICKET")
41
- logger.debug(f"Using Zendesk subdomain: {ZENDESK_SUBDOMAIN}")
42
-
43
- BASE_URL = f"https://{ZENDESK_SUBDOMAIN}.zendesk.com"
44
- url = f"{BASE_URL}/api/v2/tickets.json"
45
- logger.debug(f"Initial URL: {url}")
46
-
47
- all_tickets = []
48
- page_count = 0
49
-
50
- with httpx.Client(headers=_get_headers(), timeout=30.0) as client:
51
- logger.debug("Created HTTP client for Zendesk API")
52
-
53
- while url and len(all_tickets) < number_of_tickets:
54
- page_count += 1
55
- logger.debug(f"Fetching page {page_count} from URL: {url}")
56
-
57
- try:
58
- response = client.get(url)
59
- response.raise_for_status()
60
- logger.debug(f"Successfully received response with status: {response.status_code}")
61
-
62
- data = response.json()
63
- tickets = data.get("tickets", [])
64
- logger.debug(f"Retrieved {len(tickets)} tickets from page {page_count}")
65
-
66
- all_tickets.extend(tickets)
67
- logger.debug(f"Total tickets collected so far: {len(all_tickets)}")
68
-
69
- url = data.get("next_page")
70
- if url:
71
- logger.debug(f"Next page URL: {url}")
72
- else:
73
- logger.debug("No more pages available")
74
-
75
- except Exception as e:
76
- logger.error(f"Error fetching tickets on page {page_count}: {e}")
77
- raise
78
-
79
- logger.info(f"Successfully retrieved {len(all_tickets)} tickets across {page_count} pages")
80
- return all_tickets
81
-
82
- @mcp.tool()
83
- def zendesk_get_ticket_by_id(ticket_id: str) -> dict:
84
- """Get a ticket by ID."""
85
- logger.info(f"Starting zendesk_get_ticket_by_id for ticket_id: {ticket_id}")
86
-
87
- ZENDESK_SUBDOMAIN = os.getenv("ZENDESK_SUBDOMAIN_TICKET")
88
- logger.debug(f"Using Zendesk subdomain: {ZENDESK_SUBDOMAIN}")
89
-
90
- BASE_URL = f"https://{ZENDESK_SUBDOMAIN}.zendesk.com"
91
- url = f"{BASE_URL}/api/v2/tickets/{ticket_id}"
92
- logger.debug(f"Request URL: {url}")
93
-
94
- with httpx.Client(headers=_get_headers(), timeout=30.0) as client:
95
- logger.debug("Created HTTP client for Zendesk API")
96
-
97
- try:
98
- logger.debug(f"Making GET request for ticket {ticket_id}")
99
- response = client.get(url)
100
- response.raise_for_status()
101
- logger.debug(f"Successfully received response with status: {response.status_code}")
102
-
103
- ticket_data = response.json()["ticket"]
104
- logger.info(f"Successfully retrieved ticket {ticket_id} with subject: {ticket_data.get('subject', 'N/A')}")
105
- return ticket_data
106
-
107
- except Exception as e:
108
- logger.error(f"Error fetching ticket {ticket_id}: {e}")
109
- raise
110
-
111
- @mcp.tool()
112
- def zendesk_get_comments_by_ticket_id(ticket_id: str) -> list[dict]:
113
- """Get all comments for a ticket."""
114
- logger.info(f"Starting zendesk_get_comments_by_ticket_id for ticket_id: {ticket_id}")
115
-
116
- ZENDESK_SUBDOMAIN = os.getenv("ZENDESK_SUBDOMAIN_TICKET")
117
- logger.debug(f"Using Zendesk subdomain: {ZENDESK_SUBDOMAIN}")
118
-
119
- BASE_URL = f"https://{ZENDESK_SUBDOMAIN}.zendesk.com"
120
- url = f"{BASE_URL}/api/v2/tickets/{ticket_id}/comments"
121
- logger.debug(f"Request URL: {url}")
122
-
123
- with httpx.Client(headers=_get_headers(), timeout=30.0) as client:
124
- logger.debug("Created HTTP client for Zendesk API")
125
-
126
- try:
127
- logger.debug(f"Making GET request for comments of ticket {ticket_id}")
128
- response = client.get(url)
129
- response.raise_for_status()
130
- logger.debug(f"Successfully received response with status: {response.status_code}")
131
-
132
- comments = response.json()["comments"]
133
- logger.info(f"Successfully retrieved {len(comments)} comments for ticket {ticket_id}")
134
- return comments
135
-
136
- except Exception as e:
137
- logger.error(f"Error fetching comments for ticket {ticket_id}: {e}")
138
- raise
139
-
140
- @mcp.tool()
141
- def zendesk_get_article_by_id(article_id: str) -> dict:
142
- """Get an article by ID."""
143
- logger.info(f"Starting zendesk_get_article_by_id for article_id: {article_id}")
144
-
145
- ZENDESK_LOCALE = os.getenv("ZENDESK_ARTICLE_LOCALE")
146
- ZENDESK_SUBDOMAIN = os.getenv("ZENDESK_SUBDOMAIN_ARTICLE")
147
- logger.debug(f"Using locale: {ZENDESK_LOCALE}, subdomain: {ZENDESK_SUBDOMAIN}")
148
-
149
- BASE_URL = f"https://{ZENDESK_SUBDOMAIN}.zendesk.com"
150
- url = (
151
- f"{BASE_URL}/api/v2/help_center/{ZENDESK_LOCALE}/articles/{article_id}"
152
- )
153
- logger.debug(f"Request URL: {url}")
154
-
155
- with httpx.Client(headers=_get_headers(), timeout=30.0) as client:
156
- logger.debug("Created HTTP client for Zendesk API")
157
-
158
- try:
159
- logger.debug(f"Making GET request for article {article_id}")
160
- response = client.get(url)
161
- response.raise_for_status()
162
- logger.debug(f"Successfully received response with status: {response.status_code}")
163
-
164
- article = response.json()["article"]
165
- logger.info(f"Successfully retrieved article {article_id} with title: {article.get('title', 'N/A')}")
166
- return article
167
-
168
- except Exception as e:
169
- logger.error(f"Error fetching article {article_id}: {e}")
170
- raise
171
-
172
- @mcp.tool()
173
- def zendesk_get_articles() -> list[dict]:
174
- """Get all articles."""
175
- logger.info("Starting zendesk_get_articles")
176
-
177
- ZENDESK_LOCALE = os.getenv("ZENDESK_ARTICLE_LOCALE")
178
- ZENDESK_SUBDOMAIN = os.getenv("ZENDESK_SUBDOMAIN_ARTICLE")
179
- logger.debug(f"Using locale: {ZENDESK_LOCALE}, subdomain: {ZENDESK_SUBDOMAIN}")
180
-
181
- BASE_URL = f"https://{ZENDESK_SUBDOMAIN}.zendesk.com"
182
- url = f"{BASE_URL}/api/v2/help_center/{ZENDESK_LOCALE}/articles.json"
183
- logger.debug(f"Request URL: {url}")
184
-
185
- with httpx.Client(headers=_get_headers(), timeout=30.0) as client:
186
- logger.debug("Created HTTP client for Zendesk API")
187
-
188
- try:
189
- logger.debug("Making GET request for articles")
190
- response = client.get(url)
191
- response.raise_for_status()
192
- logger.debug(f"Successfully received response with status: {response.status_code}")
193
-
194
- articles = response.json()["articles"]
195
- logger.info(f"Successfully retrieved {len(articles)} articles")
196
- return articles
197
-
198
- except Exception as e:
199
- logger.error(f"Error fetching articles: {e}")
200
- raise
201
-
202
- @mcp.tool()
203
- def zendesk_get_articles_count() -> int:
204
- """Count every Help-Center article in the configured locale.
205
-
206
- Uses cursor pagination (page[size]=100) because it’s faster and
207
- has no 10 000-record ceiling. Falls back to offset pagination
208
- if the account hasn’t been migrated yet.
209
- """
210
- ZENDESK_LOCALE = os.getenv("ZENDESK_ARTICLE_LOCALE") # e.g. "en-us"
211
- ZENDESK_SUBDOMAIN = os.getenv("ZENDESK_SUBDOMAIN_ARTICLE")
212
- BASE_URL = f"https://{ZENDESK_SUBDOMAIN}.zendesk.com"
213
- url = (
214
- f"{BASE_URL}/api/v2/help_center/{ZENDESK_LOCALE}/articles.json"
215
- "?page[size]=100" # max page size for HC APIs
216
- )
217
-
218
- total = 0
219
- with httpx.Client(headers=_get_headers(), timeout=30.0) as client:
220
- while url:
221
- resp = client.get(url)
222
- resp.raise_for_status()
223
- data = resp.json()
224
-
225
- total += len(data.get("articles", []))
226
- print(f"Locale: {ZENDESK_LOCALE}")
227
- print(f"Number of articles: {total}")
228
-
229
- # Cursor pagination (preferred)
230
- if data.get("meta", {}).get("has_more"):
231
- url = data.get("links", {}).get("next")
232
- continue
233
-
234
- # Offset pagination fallback
235
- url = data.get("next_page")
236
-
237
- return total
238
-
239
- @mcp.tool()
240
- def zendesk_search_articles(query: str) -> list[dict]:
241
- """Search Zendesk Help Center articles using a query string."""
242
- logger.info(f"Starting zendesk_search_articles with query: '{query}'")
243
-
244
- ZENDESK_LOCALE = os.getenv("ZENDESK_ARTICLE_LOCALE") # e.g., "en-us"
245
- ZENDESK_SUBDOMAIN = os.getenv("ZENDESK_SUBDOMAIN_ARTICLE")
246
- logger.debug(f"Using locale: {ZENDESK_LOCALE}, subdomain: {ZENDESK_SUBDOMAIN}")
247
-
248
- BASE_URL = f"https://{ZENDESK_SUBDOMAIN}.zendesk.com"
249
- url = f"{BASE_URL}/api/v2/help_center/articles/search.json"
250
- logger.debug(f"Search URL: {url}")
251
-
252
- params = {
253
- "query": query,
254
- "locale": ZENDESK_LOCALE,
255
- "sort_by": "updated_at",
256
- "sort_order": "desc",
257
- }
258
- logger.debug(f"Search parameters: {params}")
259
-
260
- with httpx.Client(headers=_get_headers(), timeout=30.0) as client:
261
- logger.debug("Created HTTP client for Zendesk API")
262
-
263
- try:
264
- logger.debug(f"Making GET request to search articles with query: '{query}'")
265
- response = client.get(url, params=params)
266
- response.raise_for_status()
267
- logger.debug(f"Successfully received response with status: {response.status_code}")
268
-
269
- results = response.json().get("results", [])
270
- logger.info(f"Search completed successfully, found {len(results)} articles matching query: '{query}'")
271
- return results
272
-
273
- except Exception as e:
274
- logger.error(f"Error searching articles with query '{query}': {e}")
275
- raise
276
-
277
- @mcp.tool()
278
- def zendesk_add_comment_to_ticket(ticket_id: str, comment_body: str, public: bool = False) -> dict:
279
- """Add a comment to a Zendesk ticket.
280
-
281
- Updates the ticket with a new comment via Zendesk Ticketing API:
282
- PUT /api/v2/tickets/{ticket_id}.json
283
- """
284
- logger.info(f"Starting zendesk_add_comment_to_ticket for ticket_id: {ticket_id}, public: {public}")
285
- logger.debug(f"Comment body length: {len(comment_body)} characters")
286
-
287
- ZENDESK_SUBDOMAIN = os.getenv("ZENDESK_SUBDOMAIN_TICKET")
288
- logger.debug(f"Using Zendesk subdomain: {ZENDESK_SUBDOMAIN}")
289
-
290
- BASE_URL = f"https://{ZENDESK_SUBDOMAIN}.zendesk.com"
291
- url = f"{BASE_URL}/api/v2/tickets/{ticket_id}.json"
292
- logger.debug(f"Request URL: {url}")
293
-
294
- payload = {
295
- "ticket": {
296
- "comment": {
297
- "body": comment_body,
298
- "public": public,
299
- }
300
- }
301
- }
302
- logger.debug(f"Payload prepared for ticket {ticket_id}")
303
-
304
- import httpx
305
- with httpx.Client(headers=_get_headers(), timeout=30.0) as client:
306
- logger.debug("Created HTTP client for Zendesk API")
307
-
308
- try:
309
- logger.debug(f"Making PUT request to add comment to ticket {ticket_id}")
310
- response = client.put(url, json=payload)
311
- response.raise_for_status()
312
- logger.debug(f"Successfully received response with status: {response.status_code}")
313
-
314
- ticket_data = response.json()["ticket"]
315
- logger.info(f"Successfully added comment to ticket {ticket_id}")
316
- return ticket_data
317
-
318
- except Exception as e:
319
- logger.error(f"Error adding comment to ticket {ticket_id}: {e}")
320
- raise
321
-
322
- @mcp.tool()
323
- def zendesk_set_ticket_custom_field(
324
- ticket_id: str, custom_field_id: int, custom_field_value: str
325
- ) -> dict:
326
- """Set the custom field value of a Zendesk ticket.
327
-
328
- Uses Zendesk's Update Ticket API to set a custom field value:
329
- PUT /api/v2/tickets/{ticket_id}.json
330
- """#
331
- logger.info(f"Starting zendesk_set_ticket_custom_field for ticket_id: {ticket_id}, field_id: {custom_field_id}")
332
- logger.info(f"Custom field value: {custom_field_value}")
333
-
334
-
335
- custom_field_value = [custom_field_value]
336
- logger.debug("Converted custom field value to list for multi-option field")
337
-
338
- ZENDESK_SUBDOMAIN = os.getenv("ZENDESK_SUBDOMAIN_TICKET")
339
- logger.debug(f"Using Zendesk subdomain: {ZENDESK_SUBDOMAIN}")
340
-
341
- BASE_URL = f"https://{ZENDESK_SUBDOMAIN}.zendesk.com"
342
- url = f"{BASE_URL}/api/v2/tickets/{ticket_id}.json"
343
- logger.debug(f"Request URL: {url}")
344
-
345
- payload = {
346
- "ticket": {
347
- "custom_fields": [
348
- {
349
- "id": custom_field_id,
350
- "value": custom_field_value
351
- }
352
- ]
353
- }
354
- }
355
- logger.debug(f"Payload prepared for ticket {ticket_id} with custom field {custom_field_id}")
356
-
357
- import httpx
358
-
359
- with httpx.Client(headers=_get_headers(), timeout=30.0) as client:
360
- logger.debug("Created HTTP client for Zendesk API")
361
-
362
- try:
363
- logger.debug(f"Making PUT request to set custom field {custom_field_id} on ticket {ticket_id}")
364
- response = client.put(url, json=payload)
365
- response.raise_for_status()
366
- logger.debug(f"Successfully received response with status: {response.status_code}")
367
-
368
- ticket_data = response.json()["ticket"]
369
- logger.info(f"Successfully set custom field {custom_field_id} on ticket {ticket_id}")
370
- return ticket_data
371
-
372
- except Exception as e:
373
- logger.error(f"Error setting custom field {custom_field_id} on ticket {ticket_id}: {e}")
374
- raise
375
-
376
-
377
-
378
- @mcp.tool()
379
- def zendesk_set_ticket_tags(ticket_id: str, tags: list[str]) -> list[str]:
380
- """Set the complete tag list for a ticket (overwrites existing tags)."""
381
- logger.info(f"Starting zendesk_set_ticket_tags for ticket_id: {ticket_id}")
382
- logger.debug(f"Setting tags: {tags} (total: {len(tags)} tags)")
383
-
384
- ZENDESK_SUBDOMAIN = os.getenv("ZENDESK_SUBDOMAIN_TICKET")
385
- logger.debug(f"Using Zendesk subdomain: {ZENDESK_SUBDOMAIN}")
386
-
387
- BASE_URL = f"https://{ZENDESK_SUBDOMAIN}.zendesk.com"
388
- url = f"{BASE_URL}/api/v2/tickets/{ticket_id}/tags.json"
389
- logger.debug(f"Request URL: {url}")
390
-
391
- payload = {"tags": tags}
392
- logger.debug(f"Payload prepared for ticket {ticket_id}")
393
-
394
- import httpx
395
-
396
- with httpx.Client(headers=_get_headers(), timeout=30.0) as client:
397
- logger.debug("Created HTTP client for Zendesk API")
398
-
399
- try:
400
- logger.debug(f"Making PUT request to set tags on ticket {ticket_id}")
401
- resp = client.put(url, json=payload)
402
- resp.raise_for_status()
403
- logger.debug(f"Successfully received response with status: {resp.status_code}")
404
-
405
- result_tags = resp.json().get("tags", [])
406
- logger.info(f"Successfully set {len(result_tags)} tags on ticket {ticket_id}")
407
- return result_tags
408
-
409
- except Exception as e:
410
- logger.error(f"Error setting tags on ticket {ticket_id}: {e}")
411
- raise
412
-
413
-
414
- @mcp.tool()
415
- def zendesk_add_ticket_tags(ticket_id: str, tags: list[str]) -> list[str]:
416
- """Add tags to a ticket (preserves existing tags)."""
417
- logger.info(f"Starting zendesk_add_ticket_tags for ticket_id: {ticket_id}")
418
- logger.debug(f"Adding tags: {tags} (total: {len(tags)} tags)")
419
-
420
- ZENDESK_SUBDOMAIN = os.getenv("ZENDESK_SUBDOMAIN_TICKET")
421
- logger.debug(f"Using Zendesk subdomain: {ZENDESK_SUBDOMAIN}")
422
-
423
- BASE_URL = f"https://{ZENDESK_SUBDOMAIN}.zendesk.com"
424
- url = f"{BASE_URL}/api/v2/tickets/{ticket_id}/tags.json"
425
- logger.debug(f"Request URL: {url}")
426
-
427
- payload = {"tags": tags}
428
- logger.debug(f"Payload prepared for ticket {ticket_id}")
429
-
430
- import httpx
431
-
432
- with httpx.Client(headers=_get_headers(), timeout=30.0) as client:
433
- logger.debug("Created HTTP client for Zendesk API")
434
-
435
- try:
436
- logger.debug(f"Making POST request to add tags to ticket {ticket_id}")
437
- resp = client.post(url, json=payload)
438
- resp.raise_for_status()
439
- logger.debug(f"Successfully received response with status: {resp.status_code}")
440
-
441
- result_tags = resp.json().get("tags", [])
442
- logger.info(f"Successfully added tags to ticket {ticket_id}, total tags now: {len(result_tags)}")
443
- return result_tags
444
-
445
- except Exception as e:
446
- logger.error(f"Error adding tags to ticket {ticket_id}: {e}")
447
- raise
448
-
449
-
450
- @mcp.tool()
451
- def zendesk_get_ticket_field_type(field_id: int) -> dict:
452
- """Return the Zendesk custom field type and options for a field id.
453
-
454
- Uses GET /api/v2/ticket_fields/{field_id}.json.
455
-
456
- Returns a dict containing at least:
457
- { "type": str, "custom_field_options": list }
458
- """
459
- logger.info(f"Starting zendesk_get_ticket_field_type for field_id: {field_id}")
460
-
461
- ZENDESK_SUBDOMAIN = os.getenv("ZENDESK_SUBDOMAIN_TICKET")
462
- logger.debug(f"Using Zendesk subdomain: {ZENDESK_SUBDOMAIN}")
463
-
464
- BASE_URL = f"https://{ZENDESK_SUBDOMAIN}.zendesk.com"
465
- url = f"{BASE_URL}/api/v2/ticket_fields/{field_id}.json"
466
- logger.debug(f"Request URL: {url}")
467
-
468
- import httpx
469
-
470
- with httpx.Client(headers=_get_headers(), timeout=30.0) as client:
471
- logger.debug("Created HTTP client for Zendesk API")
472
-
473
- try:
474
- logger.debug(f"Making GET request for ticket field {field_id}")
475
- resp = client.get(url)
476
- resp.raise_for_status()
477
- logger.debug(f"Successfully received response with status: {resp.status_code}")
478
-
479
- field = resp.json().get("ticket_field", {})
480
- result = {
481
- "id": field.get("id"),
482
- "type": field.get("type"),
483
- "title": field.get("title"),
484
- "required": field.get("required"),
485
- "custom_field_options": field.get("custom_field_options", []),
486
- }
487
-
488
- logger.info(f"Successfully retrieved field info for {field_id}: type={result['type']}, title='{result['title']}'")
489
- logger.debug(f"Field has {len(result['custom_field_options'])} custom options")
490
- return result
491
-
492
- except Exception as e:
493
- logger.error(f"Error fetching ticket field {field_id}: {e}")
494
- raise
495
-
496
-
497
-
498
-
499
- if __name__ == "__main__":
500
- transport = os.getenv("ZENDESK_MCP_TRANSPORT", "stdio")
501
- mcp.run(transport=transport)
flock/webapp/__init__.py DELETED
@@ -1 +0,0 @@
1
- """Flock Web Application Package."""
File without changes
File without changes