PraisonAI 3.0.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.
Files changed (393) hide show
  1. praisonai/__init__.py +54 -0
  2. praisonai/__main__.py +15 -0
  3. praisonai/acp/__init__.py +54 -0
  4. praisonai/acp/config.py +159 -0
  5. praisonai/acp/server.py +587 -0
  6. praisonai/acp/session.py +219 -0
  7. praisonai/adapters/__init__.py +50 -0
  8. praisonai/adapters/readers.py +395 -0
  9. praisonai/adapters/rerankers.py +315 -0
  10. praisonai/adapters/retrievers.py +394 -0
  11. praisonai/adapters/vector_stores.py +409 -0
  12. praisonai/agent_scheduler.py +337 -0
  13. praisonai/agents_generator.py +903 -0
  14. praisonai/api/call.py +292 -0
  15. praisonai/auto.py +1197 -0
  16. praisonai/capabilities/__init__.py +275 -0
  17. praisonai/capabilities/a2a.py +140 -0
  18. praisonai/capabilities/assistants.py +283 -0
  19. praisonai/capabilities/audio.py +320 -0
  20. praisonai/capabilities/batches.py +469 -0
  21. praisonai/capabilities/completions.py +336 -0
  22. praisonai/capabilities/container_files.py +155 -0
  23. praisonai/capabilities/containers.py +93 -0
  24. praisonai/capabilities/embeddings.py +158 -0
  25. praisonai/capabilities/files.py +467 -0
  26. praisonai/capabilities/fine_tuning.py +293 -0
  27. praisonai/capabilities/guardrails.py +182 -0
  28. praisonai/capabilities/images.py +330 -0
  29. praisonai/capabilities/mcp.py +190 -0
  30. praisonai/capabilities/messages.py +270 -0
  31. praisonai/capabilities/moderations.py +154 -0
  32. praisonai/capabilities/ocr.py +217 -0
  33. praisonai/capabilities/passthrough.py +204 -0
  34. praisonai/capabilities/rag.py +207 -0
  35. praisonai/capabilities/realtime.py +160 -0
  36. praisonai/capabilities/rerank.py +165 -0
  37. praisonai/capabilities/responses.py +266 -0
  38. praisonai/capabilities/search.py +109 -0
  39. praisonai/capabilities/skills.py +133 -0
  40. praisonai/capabilities/vector_store_files.py +334 -0
  41. praisonai/capabilities/vector_stores.py +304 -0
  42. praisonai/capabilities/videos.py +141 -0
  43. praisonai/chainlit_ui.py +304 -0
  44. praisonai/chat/__init__.py +106 -0
  45. praisonai/chat/app.py +125 -0
  46. praisonai/cli/__init__.py +26 -0
  47. praisonai/cli/app.py +213 -0
  48. praisonai/cli/commands/__init__.py +75 -0
  49. praisonai/cli/commands/acp.py +70 -0
  50. praisonai/cli/commands/completion.py +333 -0
  51. praisonai/cli/commands/config.py +166 -0
  52. praisonai/cli/commands/debug.py +142 -0
  53. praisonai/cli/commands/diag.py +55 -0
  54. praisonai/cli/commands/doctor.py +166 -0
  55. praisonai/cli/commands/environment.py +179 -0
  56. praisonai/cli/commands/lsp.py +112 -0
  57. praisonai/cli/commands/mcp.py +210 -0
  58. praisonai/cli/commands/profile.py +457 -0
  59. praisonai/cli/commands/run.py +228 -0
  60. praisonai/cli/commands/schedule.py +150 -0
  61. praisonai/cli/commands/serve.py +97 -0
  62. praisonai/cli/commands/session.py +212 -0
  63. praisonai/cli/commands/traces.py +145 -0
  64. praisonai/cli/commands/version.py +101 -0
  65. praisonai/cli/configuration/__init__.py +18 -0
  66. praisonai/cli/configuration/loader.py +353 -0
  67. praisonai/cli/configuration/paths.py +114 -0
  68. praisonai/cli/configuration/schema.py +164 -0
  69. praisonai/cli/features/__init__.py +268 -0
  70. praisonai/cli/features/acp.py +236 -0
  71. praisonai/cli/features/action_orchestrator.py +546 -0
  72. praisonai/cli/features/agent_scheduler.py +773 -0
  73. praisonai/cli/features/agent_tools.py +474 -0
  74. praisonai/cli/features/agents.py +375 -0
  75. praisonai/cli/features/at_mentions.py +471 -0
  76. praisonai/cli/features/auto_memory.py +182 -0
  77. praisonai/cli/features/autonomy_mode.py +490 -0
  78. praisonai/cli/features/background.py +356 -0
  79. praisonai/cli/features/base.py +168 -0
  80. praisonai/cli/features/capabilities.py +1326 -0
  81. praisonai/cli/features/checkpoints.py +338 -0
  82. praisonai/cli/features/code_intelligence.py +652 -0
  83. praisonai/cli/features/compaction.py +294 -0
  84. praisonai/cli/features/compare.py +534 -0
  85. praisonai/cli/features/cost_tracker.py +514 -0
  86. praisonai/cli/features/debug.py +810 -0
  87. praisonai/cli/features/deploy.py +517 -0
  88. praisonai/cli/features/diag.py +289 -0
  89. praisonai/cli/features/doctor/__init__.py +63 -0
  90. praisonai/cli/features/doctor/checks/__init__.py +24 -0
  91. praisonai/cli/features/doctor/checks/acp_checks.py +240 -0
  92. praisonai/cli/features/doctor/checks/config_checks.py +366 -0
  93. praisonai/cli/features/doctor/checks/db_checks.py +366 -0
  94. praisonai/cli/features/doctor/checks/env_checks.py +543 -0
  95. praisonai/cli/features/doctor/checks/lsp_checks.py +199 -0
  96. praisonai/cli/features/doctor/checks/mcp_checks.py +349 -0
  97. praisonai/cli/features/doctor/checks/memory_checks.py +268 -0
  98. praisonai/cli/features/doctor/checks/network_checks.py +251 -0
  99. praisonai/cli/features/doctor/checks/obs_checks.py +328 -0
  100. praisonai/cli/features/doctor/checks/performance_checks.py +235 -0
  101. praisonai/cli/features/doctor/checks/permissions_checks.py +259 -0
  102. praisonai/cli/features/doctor/checks/selftest_checks.py +322 -0
  103. praisonai/cli/features/doctor/checks/serve_checks.py +426 -0
  104. praisonai/cli/features/doctor/checks/skills_checks.py +231 -0
  105. praisonai/cli/features/doctor/checks/tools_checks.py +371 -0
  106. praisonai/cli/features/doctor/engine.py +266 -0
  107. praisonai/cli/features/doctor/formatters.py +310 -0
  108. praisonai/cli/features/doctor/handler.py +397 -0
  109. praisonai/cli/features/doctor/models.py +264 -0
  110. praisonai/cli/features/doctor/registry.py +239 -0
  111. praisonai/cli/features/endpoints.py +1019 -0
  112. praisonai/cli/features/eval.py +560 -0
  113. praisonai/cli/features/external_agents.py +231 -0
  114. praisonai/cli/features/fast_context.py +410 -0
  115. praisonai/cli/features/flow_display.py +566 -0
  116. praisonai/cli/features/git_integration.py +651 -0
  117. praisonai/cli/features/guardrail.py +171 -0
  118. praisonai/cli/features/handoff.py +185 -0
  119. praisonai/cli/features/hooks.py +583 -0
  120. praisonai/cli/features/image.py +384 -0
  121. praisonai/cli/features/interactive_runtime.py +585 -0
  122. praisonai/cli/features/interactive_tools.py +380 -0
  123. praisonai/cli/features/interactive_tui.py +603 -0
  124. praisonai/cli/features/jobs.py +632 -0
  125. praisonai/cli/features/knowledge.py +531 -0
  126. praisonai/cli/features/lite.py +244 -0
  127. praisonai/cli/features/lsp_cli.py +225 -0
  128. praisonai/cli/features/mcp.py +169 -0
  129. praisonai/cli/features/message_queue.py +587 -0
  130. praisonai/cli/features/metrics.py +211 -0
  131. praisonai/cli/features/n8n.py +673 -0
  132. praisonai/cli/features/observability.py +293 -0
  133. praisonai/cli/features/ollama.py +361 -0
  134. praisonai/cli/features/output_style.py +273 -0
  135. praisonai/cli/features/package.py +631 -0
  136. praisonai/cli/features/performance.py +308 -0
  137. praisonai/cli/features/persistence.py +636 -0
  138. praisonai/cli/features/profile.py +226 -0
  139. praisonai/cli/features/profiler/__init__.py +81 -0
  140. praisonai/cli/features/profiler/core.py +558 -0
  141. praisonai/cli/features/profiler/optimizations.py +652 -0
  142. praisonai/cli/features/profiler/suite.py +386 -0
  143. praisonai/cli/features/profiling.py +350 -0
  144. praisonai/cli/features/queue/__init__.py +73 -0
  145. praisonai/cli/features/queue/manager.py +395 -0
  146. praisonai/cli/features/queue/models.py +286 -0
  147. praisonai/cli/features/queue/persistence.py +564 -0
  148. praisonai/cli/features/queue/scheduler.py +484 -0
  149. praisonai/cli/features/queue/worker.py +372 -0
  150. praisonai/cli/features/recipe.py +1723 -0
  151. praisonai/cli/features/recipes.py +449 -0
  152. praisonai/cli/features/registry.py +229 -0
  153. praisonai/cli/features/repo_map.py +860 -0
  154. praisonai/cli/features/router.py +466 -0
  155. praisonai/cli/features/sandbox_executor.py +515 -0
  156. praisonai/cli/features/serve.py +829 -0
  157. praisonai/cli/features/session.py +222 -0
  158. praisonai/cli/features/skills.py +856 -0
  159. praisonai/cli/features/slash_commands.py +650 -0
  160. praisonai/cli/features/telemetry.py +179 -0
  161. praisonai/cli/features/templates.py +1384 -0
  162. praisonai/cli/features/thinking.py +305 -0
  163. praisonai/cli/features/todo.py +334 -0
  164. praisonai/cli/features/tools.py +680 -0
  165. praisonai/cli/features/tui/__init__.py +83 -0
  166. praisonai/cli/features/tui/app.py +580 -0
  167. praisonai/cli/features/tui/cli.py +566 -0
  168. praisonai/cli/features/tui/debug.py +511 -0
  169. praisonai/cli/features/tui/events.py +99 -0
  170. praisonai/cli/features/tui/mock_provider.py +328 -0
  171. praisonai/cli/features/tui/orchestrator.py +652 -0
  172. praisonai/cli/features/tui/screens/__init__.py +50 -0
  173. praisonai/cli/features/tui/screens/main.py +245 -0
  174. praisonai/cli/features/tui/screens/queue.py +174 -0
  175. praisonai/cli/features/tui/screens/session.py +124 -0
  176. praisonai/cli/features/tui/screens/settings.py +148 -0
  177. praisonai/cli/features/tui/widgets/__init__.py +56 -0
  178. praisonai/cli/features/tui/widgets/chat.py +261 -0
  179. praisonai/cli/features/tui/widgets/composer.py +224 -0
  180. praisonai/cli/features/tui/widgets/queue_panel.py +200 -0
  181. praisonai/cli/features/tui/widgets/status.py +167 -0
  182. praisonai/cli/features/tui/widgets/tool_panel.py +248 -0
  183. praisonai/cli/features/workflow.py +720 -0
  184. praisonai/cli/legacy.py +236 -0
  185. praisonai/cli/main.py +5559 -0
  186. praisonai/cli/schedule_cli.py +54 -0
  187. praisonai/cli/state/__init__.py +31 -0
  188. praisonai/cli/state/identifiers.py +161 -0
  189. praisonai/cli/state/sessions.py +313 -0
  190. praisonai/code/__init__.py +93 -0
  191. praisonai/code/agent_tools.py +344 -0
  192. praisonai/code/diff/__init__.py +21 -0
  193. praisonai/code/diff/diff_strategy.py +432 -0
  194. praisonai/code/tools/__init__.py +27 -0
  195. praisonai/code/tools/apply_diff.py +221 -0
  196. praisonai/code/tools/execute_command.py +275 -0
  197. praisonai/code/tools/list_files.py +274 -0
  198. praisonai/code/tools/read_file.py +206 -0
  199. praisonai/code/tools/search_replace.py +248 -0
  200. praisonai/code/tools/write_file.py +217 -0
  201. praisonai/code/utils/__init__.py +46 -0
  202. praisonai/code/utils/file_utils.py +307 -0
  203. praisonai/code/utils/ignore_utils.py +308 -0
  204. praisonai/code/utils/text_utils.py +276 -0
  205. praisonai/db/__init__.py +64 -0
  206. praisonai/db/adapter.py +531 -0
  207. praisonai/deploy/__init__.py +62 -0
  208. praisonai/deploy/api.py +231 -0
  209. praisonai/deploy/docker.py +454 -0
  210. praisonai/deploy/doctor.py +367 -0
  211. praisonai/deploy/main.py +327 -0
  212. praisonai/deploy/models.py +179 -0
  213. praisonai/deploy/providers/__init__.py +33 -0
  214. praisonai/deploy/providers/aws.py +331 -0
  215. praisonai/deploy/providers/azure.py +358 -0
  216. praisonai/deploy/providers/base.py +101 -0
  217. praisonai/deploy/providers/gcp.py +314 -0
  218. praisonai/deploy/schema.py +208 -0
  219. praisonai/deploy.py +185 -0
  220. praisonai/endpoints/__init__.py +53 -0
  221. praisonai/endpoints/a2u_server.py +410 -0
  222. praisonai/endpoints/discovery.py +165 -0
  223. praisonai/endpoints/providers/__init__.py +28 -0
  224. praisonai/endpoints/providers/a2a.py +253 -0
  225. praisonai/endpoints/providers/a2u.py +208 -0
  226. praisonai/endpoints/providers/agents_api.py +171 -0
  227. praisonai/endpoints/providers/base.py +231 -0
  228. praisonai/endpoints/providers/mcp.py +263 -0
  229. praisonai/endpoints/providers/recipe.py +206 -0
  230. praisonai/endpoints/providers/tools_mcp.py +150 -0
  231. praisonai/endpoints/registry.py +131 -0
  232. praisonai/endpoints/server.py +161 -0
  233. praisonai/inbuilt_tools/__init__.py +24 -0
  234. praisonai/inbuilt_tools/autogen_tools.py +117 -0
  235. praisonai/inc/__init__.py +2 -0
  236. praisonai/inc/config.py +96 -0
  237. praisonai/inc/models.py +155 -0
  238. praisonai/integrations/__init__.py +56 -0
  239. praisonai/integrations/base.py +303 -0
  240. praisonai/integrations/claude_code.py +270 -0
  241. praisonai/integrations/codex_cli.py +255 -0
  242. praisonai/integrations/cursor_cli.py +195 -0
  243. praisonai/integrations/gemini_cli.py +222 -0
  244. praisonai/jobs/__init__.py +67 -0
  245. praisonai/jobs/executor.py +425 -0
  246. praisonai/jobs/models.py +230 -0
  247. praisonai/jobs/router.py +314 -0
  248. praisonai/jobs/server.py +186 -0
  249. praisonai/jobs/store.py +203 -0
  250. praisonai/llm/__init__.py +66 -0
  251. praisonai/llm/registry.py +382 -0
  252. praisonai/mcp_server/__init__.py +152 -0
  253. praisonai/mcp_server/adapters/__init__.py +74 -0
  254. praisonai/mcp_server/adapters/agents.py +128 -0
  255. praisonai/mcp_server/adapters/capabilities.py +168 -0
  256. praisonai/mcp_server/adapters/cli_tools.py +568 -0
  257. praisonai/mcp_server/adapters/extended_capabilities.py +462 -0
  258. praisonai/mcp_server/adapters/knowledge.py +93 -0
  259. praisonai/mcp_server/adapters/memory.py +104 -0
  260. praisonai/mcp_server/adapters/prompts.py +306 -0
  261. praisonai/mcp_server/adapters/resources.py +124 -0
  262. praisonai/mcp_server/adapters/tools_bridge.py +280 -0
  263. praisonai/mcp_server/auth/__init__.py +48 -0
  264. praisonai/mcp_server/auth/api_key.py +291 -0
  265. praisonai/mcp_server/auth/oauth.py +460 -0
  266. praisonai/mcp_server/auth/oidc.py +289 -0
  267. praisonai/mcp_server/auth/scopes.py +260 -0
  268. praisonai/mcp_server/cli.py +852 -0
  269. praisonai/mcp_server/elicitation.py +445 -0
  270. praisonai/mcp_server/icons.py +302 -0
  271. praisonai/mcp_server/recipe_adapter.py +573 -0
  272. praisonai/mcp_server/recipe_cli.py +824 -0
  273. praisonai/mcp_server/registry.py +703 -0
  274. praisonai/mcp_server/sampling.py +422 -0
  275. praisonai/mcp_server/server.py +490 -0
  276. praisonai/mcp_server/tasks.py +443 -0
  277. praisonai/mcp_server/transports/__init__.py +18 -0
  278. praisonai/mcp_server/transports/http_stream.py +376 -0
  279. praisonai/mcp_server/transports/stdio.py +132 -0
  280. praisonai/persistence/__init__.py +84 -0
  281. praisonai/persistence/config.py +238 -0
  282. praisonai/persistence/conversation/__init__.py +25 -0
  283. praisonai/persistence/conversation/async_mysql.py +427 -0
  284. praisonai/persistence/conversation/async_postgres.py +410 -0
  285. praisonai/persistence/conversation/async_sqlite.py +371 -0
  286. praisonai/persistence/conversation/base.py +151 -0
  287. praisonai/persistence/conversation/json_store.py +250 -0
  288. praisonai/persistence/conversation/mysql.py +387 -0
  289. praisonai/persistence/conversation/postgres.py +401 -0
  290. praisonai/persistence/conversation/singlestore.py +240 -0
  291. praisonai/persistence/conversation/sqlite.py +341 -0
  292. praisonai/persistence/conversation/supabase.py +203 -0
  293. praisonai/persistence/conversation/surrealdb.py +287 -0
  294. praisonai/persistence/factory.py +301 -0
  295. praisonai/persistence/hooks/__init__.py +18 -0
  296. praisonai/persistence/hooks/agent_hooks.py +297 -0
  297. praisonai/persistence/knowledge/__init__.py +26 -0
  298. praisonai/persistence/knowledge/base.py +144 -0
  299. praisonai/persistence/knowledge/cassandra.py +232 -0
  300. praisonai/persistence/knowledge/chroma.py +295 -0
  301. praisonai/persistence/knowledge/clickhouse.py +242 -0
  302. praisonai/persistence/knowledge/cosmosdb_vector.py +438 -0
  303. praisonai/persistence/knowledge/couchbase.py +286 -0
  304. praisonai/persistence/knowledge/lancedb.py +216 -0
  305. praisonai/persistence/knowledge/langchain_adapter.py +291 -0
  306. praisonai/persistence/knowledge/lightrag_adapter.py +212 -0
  307. praisonai/persistence/knowledge/llamaindex_adapter.py +256 -0
  308. praisonai/persistence/knowledge/milvus.py +277 -0
  309. praisonai/persistence/knowledge/mongodb_vector.py +306 -0
  310. praisonai/persistence/knowledge/pgvector.py +335 -0
  311. praisonai/persistence/knowledge/pinecone.py +253 -0
  312. praisonai/persistence/knowledge/qdrant.py +301 -0
  313. praisonai/persistence/knowledge/redis_vector.py +291 -0
  314. praisonai/persistence/knowledge/singlestore_vector.py +299 -0
  315. praisonai/persistence/knowledge/surrealdb_vector.py +309 -0
  316. praisonai/persistence/knowledge/upstash_vector.py +266 -0
  317. praisonai/persistence/knowledge/weaviate.py +223 -0
  318. praisonai/persistence/migrations/__init__.py +10 -0
  319. praisonai/persistence/migrations/manager.py +251 -0
  320. praisonai/persistence/orchestrator.py +406 -0
  321. praisonai/persistence/state/__init__.py +21 -0
  322. praisonai/persistence/state/async_mongodb.py +200 -0
  323. praisonai/persistence/state/base.py +107 -0
  324. praisonai/persistence/state/dynamodb.py +226 -0
  325. praisonai/persistence/state/firestore.py +175 -0
  326. praisonai/persistence/state/gcs.py +155 -0
  327. praisonai/persistence/state/memory.py +245 -0
  328. praisonai/persistence/state/mongodb.py +158 -0
  329. praisonai/persistence/state/redis.py +190 -0
  330. praisonai/persistence/state/upstash.py +144 -0
  331. praisonai/persistence/tests/__init__.py +3 -0
  332. praisonai/persistence/tests/test_all_backends.py +633 -0
  333. praisonai/profiler.py +1214 -0
  334. praisonai/recipe/__init__.py +134 -0
  335. praisonai/recipe/bridge.py +278 -0
  336. praisonai/recipe/core.py +893 -0
  337. praisonai/recipe/exceptions.py +54 -0
  338. praisonai/recipe/history.py +402 -0
  339. praisonai/recipe/models.py +266 -0
  340. praisonai/recipe/operations.py +440 -0
  341. praisonai/recipe/policy.py +422 -0
  342. praisonai/recipe/registry.py +849 -0
  343. praisonai/recipe/runtime.py +214 -0
  344. praisonai/recipe/security.py +711 -0
  345. praisonai/recipe/serve.py +859 -0
  346. praisonai/recipe/server.py +613 -0
  347. praisonai/scheduler/__init__.py +45 -0
  348. praisonai/scheduler/agent_scheduler.py +552 -0
  349. praisonai/scheduler/base.py +124 -0
  350. praisonai/scheduler/daemon_manager.py +225 -0
  351. praisonai/scheduler/state_manager.py +155 -0
  352. praisonai/scheduler/yaml_loader.py +193 -0
  353. praisonai/scheduler.py +194 -0
  354. praisonai/setup/__init__.py +1 -0
  355. praisonai/setup/build.py +21 -0
  356. praisonai/setup/post_install.py +23 -0
  357. praisonai/setup/setup_conda_env.py +25 -0
  358. praisonai/setup.py +16 -0
  359. praisonai/templates/__init__.py +116 -0
  360. praisonai/templates/cache.py +364 -0
  361. praisonai/templates/dependency_checker.py +358 -0
  362. praisonai/templates/discovery.py +391 -0
  363. praisonai/templates/loader.py +564 -0
  364. praisonai/templates/registry.py +511 -0
  365. praisonai/templates/resolver.py +206 -0
  366. praisonai/templates/security.py +327 -0
  367. praisonai/templates/tool_override.py +498 -0
  368. praisonai/templates/tools_doctor.py +256 -0
  369. praisonai/test.py +105 -0
  370. praisonai/train.py +562 -0
  371. praisonai/train_vision.py +306 -0
  372. praisonai/ui/agents.py +824 -0
  373. praisonai/ui/callbacks.py +57 -0
  374. praisonai/ui/chainlit_compat.py +246 -0
  375. praisonai/ui/chat.py +532 -0
  376. praisonai/ui/code.py +717 -0
  377. praisonai/ui/colab.py +474 -0
  378. praisonai/ui/colab_chainlit.py +81 -0
  379. praisonai/ui/components/aicoder.py +284 -0
  380. praisonai/ui/context.py +283 -0
  381. praisonai/ui/database_config.py +56 -0
  382. praisonai/ui/db.py +294 -0
  383. praisonai/ui/realtime.py +488 -0
  384. praisonai/ui/realtimeclient/__init__.py +756 -0
  385. praisonai/ui/realtimeclient/tools.py +242 -0
  386. praisonai/ui/sql_alchemy.py +710 -0
  387. praisonai/upload_vision.py +140 -0
  388. praisonai/version.py +1 -0
  389. praisonai-3.0.0.dist-info/METADATA +3493 -0
  390. praisonai-3.0.0.dist-info/RECORD +393 -0
  391. praisonai-3.0.0.dist-info/WHEEL +5 -0
  392. praisonai-3.0.0.dist-info/entry_points.txt +4 -0
  393. praisonai-3.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,344 @@
1
+ """
2
+ Agent-compatible tool wrappers for PraisonAI Code.
3
+
4
+ These functions are designed to be used as tools with PraisonAI agents.
5
+ They return string results suitable for agent consumption.
6
+ """
7
+
8
+ import os
9
+ from typing import Optional
10
+
11
+ from .tools import (
12
+ read_file as _read_file,
13
+ write_file as _write_file,
14
+ list_files as _list_files,
15
+ apply_diff as _apply_diff,
16
+ search_replace as _search_replace,
17
+ execute_command as _execute_command,
18
+ )
19
+ from .tools.apply_diff import create_diff_block, create_multi_diff
20
+
21
+
22
+ # Global workspace setting for tools
23
+ _workspace_root: Optional[str] = None
24
+
25
+
26
+ def set_workspace(workspace_path: str) -> None:
27
+ """
28
+ Set the workspace root for all code tools.
29
+
30
+ Args:
31
+ workspace_path: Absolute path to the workspace root
32
+ """
33
+ global _workspace_root
34
+ _workspace_root = os.path.abspath(workspace_path)
35
+
36
+
37
+ def get_workspace() -> Optional[str]:
38
+ """Get the current workspace root."""
39
+ return _workspace_root
40
+
41
+
42
+ def code_read_file(
43
+ path: str,
44
+ start_line: Optional[int] = None,
45
+ end_line: Optional[int] = None,
46
+ ) -> str:
47
+ """
48
+ Read the contents of a file.
49
+
50
+ Use this tool to read source code files. The content is returned with
51
+ line numbers for easy reference when making edits.
52
+
53
+ Args:
54
+ path: Path to the file (relative to workspace or absolute)
55
+ start_line: First line to read (1-indexed, optional)
56
+ end_line: Last line to read (1-indexed, optional)
57
+
58
+ Returns:
59
+ File content with line numbers, or error message
60
+
61
+ Example:
62
+ >>> content = code_read_file("src/main.py")
63
+ >>> content = code_read_file("src/main.py", start_line=10, end_line=50)
64
+ """
65
+ result = _read_file(
66
+ path=path,
67
+ start_line=start_line,
68
+ end_line=end_line,
69
+ add_line_nums=True,
70
+ workspace=_workspace_root,
71
+ )
72
+
73
+ if result['success']:
74
+ header = f"File: {path}"
75
+ if start_line or end_line:
76
+ header += f" (lines {result['start_line']}-{result['end_line']} of {result['total_lines']})"
77
+ else:
78
+ header += f" ({result['total_lines']} lines)"
79
+ return f"{header}\n\n{result['content']}"
80
+ else:
81
+ return f"Error reading {path}: {result['error']}"
82
+
83
+
84
+ def code_write_file(path: str, content: str) -> str:
85
+ """
86
+ Write content to a file, creating it if it doesn't exist.
87
+
88
+ Use this tool to create new files or completely replace existing files.
89
+ For partial modifications, use code_apply_diff instead.
90
+
91
+ Args:
92
+ path: Path to the file (relative to workspace or absolute)
93
+ content: Content to write to the file
94
+
95
+ Returns:
96
+ Success message or error
97
+
98
+ Example:
99
+ >>> result = code_write_file("src/new_module.py", "def hello():\\n print('Hello!')")
100
+ """
101
+ result = _write_file(
102
+ path=path,
103
+ content=content,
104
+ workspace=_workspace_root,
105
+ create_directories=True,
106
+ strip_code_fences=True,
107
+ )
108
+
109
+ if result['success']:
110
+ action = "Created" if result['created'] else "Updated"
111
+ return f"{action} file: {path} ({result['bytes_written']} bytes)"
112
+ else:
113
+ return f"Error writing {path}: {result['error']}"
114
+
115
+
116
+ def code_list_files(
117
+ path: str = ".",
118
+ recursive: bool = False,
119
+ extensions: Optional[str] = None,
120
+ ) -> str:
121
+ """
122
+ List files in a directory.
123
+
124
+ Use this tool to explore the codebase structure.
125
+
126
+ Args:
127
+ path: Directory path (relative to workspace or absolute)
128
+ recursive: Whether to list recursively
129
+ extensions: Comma-separated list of extensions to filter (e.g., "py,js,ts")
130
+
131
+ Returns:
132
+ Formatted list of files and directories
133
+
134
+ Example:
135
+ >>> files = code_list_files("src", recursive=True, extensions="py")
136
+ """
137
+ ext_list = None
138
+ if extensions:
139
+ ext_list = [e.strip() for e in extensions.split(',')]
140
+
141
+ result = _list_files(
142
+ path=path,
143
+ recursive=recursive,
144
+ workspace=_workspace_root,
145
+ extensions=ext_list,
146
+ )
147
+
148
+ if result['success']:
149
+ lines = [f"Contents of {path}:"]
150
+
151
+ # Add directories
152
+ for d in result['directories']:
153
+ lines.append(f" 📁 {d['path']}/")
154
+
155
+ # Add files
156
+ for f in result['files']:
157
+ size = f.get('size', 0)
158
+ if size < 1024:
159
+ size_str = f"{size}B"
160
+ elif size < 1024 * 1024:
161
+ size_str = f"{size / 1024:.1f}KB"
162
+ else:
163
+ size_str = f"{size / (1024 * 1024):.1f}MB"
164
+ lines.append(f" 📄 {f['path']} ({size_str})")
165
+
166
+ if result.get('truncated'):
167
+ lines.append(f"\n ... (showing {result['total_count']} items, more available)")
168
+
169
+ return '\n'.join(lines)
170
+ else:
171
+ return f"Error listing {path}: {result['error']}"
172
+
173
+
174
+ def code_apply_diff(path: str, diff: str) -> str:
175
+ """
176
+ Apply a SEARCH/REPLACE diff to modify a file.
177
+
178
+ Use this tool for precise, surgical edits to existing files.
179
+ The SEARCH section must match existing content exactly.
180
+
181
+ Diff Format:
182
+ <<<<<<< SEARCH
183
+ :start_line:N
184
+ -------
185
+ [exact content to find]
186
+ =======
187
+ [new content to replace with]
188
+ >>>>>>> REPLACE
189
+
190
+ Args:
191
+ path: Path to the file to modify
192
+ diff: The SEARCH/REPLACE diff content
193
+
194
+ Returns:
195
+ Success message with number of changes, or error details
196
+
197
+ Example:
198
+ >>> diff = '''<<<<<<< SEARCH
199
+ ... :start_line:10
200
+ ... -------
201
+ ... def old_function():
202
+ ... pass
203
+ ... =======
204
+ ... def new_function():
205
+ ... return True
206
+ ... >>>>>>> REPLACE'''
207
+ >>> result = code_apply_diff("src/main.py", diff)
208
+ """
209
+ result = _apply_diff(
210
+ path=path,
211
+ diff=diff,
212
+ workspace=_workspace_root,
213
+ fuzzy_threshold=0.95, # Allow slight fuzzy matching
214
+ )
215
+
216
+ if result['success']:
217
+ msg = f"Successfully applied {result['applied_count']} change(s) to {path}"
218
+ if result.get('failed_blocks'):
219
+ msg += f"\nWarning: {len(result['failed_blocks'])} block(s) failed to apply"
220
+ return msg
221
+ else:
222
+ error_msg = f"Error applying diff to {path}: {result['error']}"
223
+ if result.get('failed_blocks'):
224
+ for fb in result['failed_blocks'][:3]: # Show first 3 failures
225
+ error_msg += f"\n- {fb.get('error', 'Unknown error')}"
226
+ return error_msg
227
+
228
+
229
+ def code_search_replace(
230
+ path: str,
231
+ search: str,
232
+ replace: str,
233
+ is_regex: bool = False,
234
+ ) -> str:
235
+ """
236
+ Perform a search and replace operation on a file.
237
+
238
+ Use this for simple text replacements. For complex multi-part edits,
239
+ use code_apply_diff instead.
240
+
241
+ Args:
242
+ path: Path to the file
243
+ search: Text to search for (or regex pattern if is_regex=True)
244
+ replace: Text to replace with
245
+ is_regex: Whether to treat search as a regex pattern
246
+
247
+ Returns:
248
+ Success message with replacement count, or error
249
+
250
+ Example:
251
+ >>> result = code_search_replace("src/main.py", "old_name", "new_name")
252
+ """
253
+ result = _search_replace(
254
+ path=path,
255
+ operations=[{
256
+ 'search': search,
257
+ 'replace': replace,
258
+ 'is_regex': is_regex,
259
+ }],
260
+ workspace=_workspace_root,
261
+ )
262
+
263
+ if result['success']:
264
+ return f"Replaced {result['total_replacements']} occurrence(s) in {path}"
265
+ else:
266
+ return f"Error: {result['error']}"
267
+
268
+
269
+ def code_execute_command(
270
+ command: str,
271
+ cwd: Optional[str] = None,
272
+ ) -> str:
273
+ """
274
+ Execute a shell command.
275
+
276
+ Use this tool to run commands like tests, linters, or build tools.
277
+
278
+ Args:
279
+ command: The command to execute
280
+ cwd: Working directory (relative to workspace or absolute)
281
+
282
+ Returns:
283
+ Command output (stdout and stderr)
284
+
285
+ Example:
286
+ >>> result = code_execute_command("python -m pytest tests/")
287
+ >>> result = code_execute_command("npm test", cwd="frontend")
288
+ """
289
+ work_dir = cwd
290
+ if work_dir and _workspace_root and not os.path.isabs(work_dir):
291
+ work_dir = os.path.join(_workspace_root, work_dir)
292
+ elif not work_dir and _workspace_root:
293
+ work_dir = _workspace_root
294
+
295
+ result = _execute_command(
296
+ command=command,
297
+ cwd=work_dir,
298
+ timeout=120,
299
+ )
300
+
301
+ output_parts = []
302
+
303
+ if result['stdout']:
304
+ output_parts.append(f"stdout:\n{result['stdout']}")
305
+
306
+ if result['stderr']:
307
+ output_parts.append(f"stderr:\n{result['stderr']}")
308
+
309
+ if result['success']:
310
+ status = f"Command completed successfully (exit code: {result['exit_code']})"
311
+ else:
312
+ if result.get('error'):
313
+ status = f"Command failed: {result['error']}"
314
+ else:
315
+ status = f"Command failed (exit code: {result['exit_code']})"
316
+
317
+ output_parts.insert(0, status)
318
+
319
+ return '\n\n'.join(output_parts)
320
+
321
+
322
+ # Export all agent tools
323
+ CODE_TOOLS = [
324
+ code_read_file,
325
+ code_write_file,
326
+ code_list_files,
327
+ code_apply_diff,
328
+ code_search_replace,
329
+ code_execute_command,
330
+ ]
331
+
332
+ __all__ = [
333
+ 'set_workspace',
334
+ 'get_workspace',
335
+ 'code_read_file',
336
+ 'code_write_file',
337
+ 'code_list_files',
338
+ 'code_apply_diff',
339
+ 'code_search_replace',
340
+ 'code_execute_command',
341
+ 'CODE_TOOLS',
342
+ 'create_diff_block',
343
+ 'create_multi_diff',
344
+ ]
@@ -0,0 +1,21 @@
1
+ """
2
+ Diff handling for PraisonAI Code module.
3
+
4
+ Provides SEARCH/REPLACE diff parsing and application with fuzzy matching.
5
+ """
6
+
7
+ from .diff_strategy import (
8
+ DiffResult,
9
+ DiffBlock,
10
+ apply_search_replace_diff,
11
+ parse_diff_blocks,
12
+ validate_diff_format,
13
+ )
14
+
15
+ __all__ = [
16
+ "DiffResult",
17
+ "DiffBlock",
18
+ "apply_search_replace_diff",
19
+ "parse_diff_blocks",
20
+ "validate_diff_format",
21
+ ]