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,54 @@
1
+ """
2
+ Simple CLI entry point for praisonai schedule command.
3
+
4
+ This provides a standalone entry point that can be called from main.py
5
+ """
6
+
7
+ import sys
8
+ from praisonai.cli.features.agent_scheduler import AgentSchedulerHandler
9
+
10
+
11
+ def main():
12
+ """Main entry point for schedule CLI command."""
13
+ import argparse
14
+
15
+ parser = argparse.ArgumentParser(
16
+ description='Schedule an agent to run continuously at regular intervals'
17
+ )
18
+
19
+ parser.add_argument(
20
+ 'schedule_yaml',
21
+ nargs='?',
22
+ default='agents.yaml',
23
+ help='Path to agents.yaml file (default: agents.yaml)'
24
+ )
25
+
26
+ parser.add_argument(
27
+ '--interval',
28
+ dest='schedule_interval',
29
+ type=str,
30
+ help='Override schedule interval (e.g., "hourly", "*/30m", "daily")'
31
+ )
32
+
33
+ parser.add_argument(
34
+ '--max-retries',
35
+ dest='schedule_max_retries',
36
+ type=int,
37
+ help='Override maximum retry attempts (default: from YAML or 3)'
38
+ )
39
+
40
+ parser.add_argument(
41
+ '--verbose', '-v',
42
+ action='store_true',
43
+ help='Enable verbose logging'
44
+ )
45
+
46
+ args = parser.parse_args()
47
+
48
+ # Call the handler
49
+ exit_code = AgentSchedulerHandler.handle_schedule_command(args)
50
+ sys.exit(exit_code)
51
+
52
+
53
+ if __name__ == '__main__':
54
+ main()
@@ -0,0 +1,31 @@
1
+ """
2
+ PraisonAI CLI State Module.
3
+
4
+ Provides state management for run IDs, trace IDs, agent IDs, and sessions.
5
+ """
6
+
7
+ from .identifiers import (
8
+ generate_run_id,
9
+ generate_trace_id,
10
+ generate_agent_id,
11
+ RunContext,
12
+ get_current_context,
13
+ set_current_context,
14
+ )
15
+ from .sessions import (
16
+ SessionManager,
17
+ SessionMetadata,
18
+ get_session_manager,
19
+ )
20
+
21
+ __all__ = [
22
+ 'generate_run_id',
23
+ 'generate_trace_id',
24
+ 'generate_agent_id',
25
+ 'RunContext',
26
+ 'get_current_context',
27
+ 'set_current_context',
28
+ 'SessionManager',
29
+ 'SessionMetadata',
30
+ 'get_session_manager',
31
+ ]
@@ -0,0 +1,161 @@
1
+ """
2
+ Identifier generation for PraisonAI CLI.
3
+
4
+ Provides stable, unique identifiers for runs, traces, and agents.
5
+ """
6
+
7
+ import hashlib
8
+ import os
9
+ import secrets
10
+ import threading
11
+ from dataclasses import dataclass, field
12
+ from datetime import datetime
13
+ from typing import Dict, Optional
14
+
15
+
16
+ def generate_run_id() -> str:
17
+ """
18
+ Generate a unique run ID.
19
+
20
+ Format: run_YYYYMMDD_HHMMSS_<random>
21
+ Example: run_20241231_143022_a1b2c3
22
+ """
23
+ timestamp = datetime.utcnow().strftime("%Y%m%d_%H%M%S")
24
+ random_suffix = secrets.token_hex(3) # 6 characters
25
+ return f"run_{timestamp}_{random_suffix}"
26
+
27
+
28
+ def generate_trace_id() -> str:
29
+ """
30
+ Generate a unique trace ID.
31
+
32
+ Format: trace_<random>
33
+ Example: trace_a1b2c3d4e5f6
34
+ """
35
+ return f"trace_{secrets.token_hex(6)}"
36
+
37
+
38
+ def generate_agent_id(agent_name: str, run_id: str, index: int = 0) -> str:
39
+ """
40
+ Generate a deterministic agent ID.
41
+
42
+ The ID is deterministic based on agent name, run ID, and index,
43
+ ensuring consistent IDs across the same run.
44
+
45
+ Format: agent_<hash>_<index>
46
+ Example: agent_a1b2c3_001
47
+
48
+ Args:
49
+ agent_name: Name of the agent
50
+ run_id: Current run ID
51
+ index: Agent index within the run
52
+
53
+ Returns:
54
+ Deterministic agent ID
55
+ """
56
+ # Create deterministic hash from agent name and run ID
57
+ hash_input = f"{agent_name}:{run_id}:{index}"
58
+ hash_value = hashlib.sha256(hash_input.encode()).hexdigest()[:6]
59
+ return f"agent_{hash_value}_{index:03d}"
60
+
61
+
62
+ @dataclass
63
+ class RunContext:
64
+ """
65
+ Context for a single run.
66
+
67
+ Holds all identifiers and metadata for the current execution.
68
+ """
69
+ run_id: str = field(default_factory=generate_run_id)
70
+ trace_id: str = field(default_factory=generate_trace_id)
71
+ start_time: datetime = field(default_factory=datetime.utcnow)
72
+
73
+ # Agent tracking
74
+ agents: Dict[str, str] = field(default_factory=dict) # name -> agent_id
75
+ _agent_counter: int = field(default=0, repr=False)
76
+
77
+ # Metadata
78
+ config_summary: Dict[str, str] = field(default_factory=dict)
79
+ workspace: Optional[str] = None
80
+
81
+ def get_agent_id(self, agent_name: str) -> str:
82
+ """
83
+ Get or create an agent ID for the given agent name.
84
+
85
+ Args:
86
+ agent_name: Name of the agent
87
+
88
+ Returns:
89
+ Agent ID (creates new one if not exists)
90
+ """
91
+ if agent_name not in self.agents:
92
+ agent_id = generate_agent_id(agent_name, self.run_id, self._agent_counter)
93
+ self.agents[agent_name] = agent_id
94
+ self._agent_counter += 1
95
+ return self.agents[agent_name]
96
+
97
+ def to_dict(self) -> Dict:
98
+ """Convert to dictionary for serialization."""
99
+ return {
100
+ "run_id": self.run_id,
101
+ "trace_id": self.trace_id,
102
+ "start_time": self.start_time.isoformat(),
103
+ "agents": self.agents.copy(),
104
+ "config_summary": self.config_summary.copy(),
105
+ "workspace": self.workspace,
106
+ }
107
+
108
+ @classmethod
109
+ def from_dict(cls, data: Dict) -> "RunContext":
110
+ """Create from dictionary."""
111
+ ctx = cls(
112
+ run_id=data.get("run_id", generate_run_id()),
113
+ trace_id=data.get("trace_id", generate_trace_id()),
114
+ workspace=data.get("workspace"),
115
+ )
116
+ ctx.agents = data.get("agents", {})
117
+ ctx.config_summary = data.get("config_summary", {})
118
+ ctx._agent_counter = len(ctx.agents)
119
+
120
+ start_time = data.get("start_time")
121
+ if start_time:
122
+ try:
123
+ ctx.start_time = datetime.fromisoformat(start_time)
124
+ except (ValueError, TypeError):
125
+ pass
126
+
127
+ return ctx
128
+
129
+
130
+ # Thread-local storage for current context
131
+ _context_local = threading.local()
132
+
133
+
134
+ def get_current_context() -> Optional[RunContext]:
135
+ """Get the current run context for this thread."""
136
+ return getattr(_context_local, "context", None)
137
+
138
+
139
+ def set_current_context(context: Optional[RunContext]) -> None:
140
+ """Set the current run context for this thread."""
141
+ _context_local.context = context
142
+
143
+
144
+ def create_context(workspace: Optional[str] = None) -> RunContext:
145
+ """
146
+ Create a new run context and set it as current.
147
+
148
+ Args:
149
+ workspace: Optional workspace path
150
+
151
+ Returns:
152
+ New RunContext instance
153
+ """
154
+ context = RunContext(workspace=workspace or os.getcwd())
155
+ set_current_context(context)
156
+ return context
157
+
158
+
159
+ def clear_context() -> None:
160
+ """Clear the current run context."""
161
+ set_current_context(None)
@@ -0,0 +1,313 @@
1
+ """
2
+ Session management for PraisonAI CLI.
3
+
4
+ Provides persistence and resume functionality for sessions.
5
+ """
6
+
7
+ import json
8
+ import os
9
+ import shutil
10
+ from dataclasses import dataclass, field
11
+ from datetime import datetime
12
+ from pathlib import Path
13
+ from typing import Any, Dict, List, Optional
14
+
15
+ from ..configuration.paths import get_sessions_dir, ensure_config_dirs
16
+ from .identifiers import RunContext
17
+
18
+
19
+ @dataclass
20
+ class SessionMetadata:
21
+ """Metadata for a session."""
22
+ session_id: str
23
+ run_id: str
24
+ trace_id: str
25
+ created_at: datetime
26
+ updated_at: datetime
27
+ name: Optional[str] = None
28
+ workspace: Optional[str] = None
29
+ config_summary: Dict[str, Any] = field(default_factory=dict)
30
+ event_count: int = 0
31
+ status: str = "active" # active, completed, error
32
+
33
+ def to_dict(self) -> Dict[str, Any]:
34
+ """Convert to dictionary."""
35
+ return {
36
+ "session_id": self.session_id,
37
+ "run_id": self.run_id,
38
+ "trace_id": self.trace_id,
39
+ "created_at": self.created_at.isoformat(),
40
+ "updated_at": self.updated_at.isoformat(),
41
+ "name": self.name,
42
+ "workspace": self.workspace,
43
+ "config_summary": self.config_summary,
44
+ "event_count": self.event_count,
45
+ "status": self.status,
46
+ }
47
+
48
+ @classmethod
49
+ def from_dict(cls, data: Dict[str, Any]) -> "SessionMetadata":
50
+ """Create from dictionary."""
51
+ return cls(
52
+ session_id=data["session_id"],
53
+ run_id=data["run_id"],
54
+ trace_id=data["trace_id"],
55
+ created_at=datetime.fromisoformat(data["created_at"]),
56
+ updated_at=datetime.fromisoformat(data["updated_at"]),
57
+ name=data.get("name"),
58
+ workspace=data.get("workspace"),
59
+ config_summary=data.get("config_summary", {}),
60
+ event_count=data.get("event_count", 0),
61
+ status=data.get("status", "active"),
62
+ )
63
+
64
+
65
+ class SessionManager:
66
+ """
67
+ Manages session persistence and retrieval.
68
+
69
+ Sessions are stored in ~/.praison/sessions/<session_id>/
70
+ Each session contains:
71
+ - metadata.json: Session metadata
72
+ - events.jsonl: Stream of events (NDJSON)
73
+ """
74
+
75
+ def __init__(self, sessions_dir: Optional[Path] = None):
76
+ self.sessions_dir = sessions_dir or get_sessions_dir()
77
+ ensure_config_dirs()
78
+
79
+ def _get_session_dir(self, session_id: str) -> Path:
80
+ """Get the directory for a session."""
81
+ return self.sessions_dir / session_id
82
+
83
+ def _get_metadata_path(self, session_id: str) -> Path:
84
+ """Get the metadata file path for a session."""
85
+ return self._get_session_dir(session_id) / "metadata.json"
86
+
87
+ def _get_events_path(self, session_id: str) -> Path:
88
+ """Get the events file path for a session."""
89
+ return self._get_session_dir(session_id) / "events.jsonl"
90
+
91
+ def create(self, context: RunContext, name: Optional[str] = None) -> SessionMetadata:
92
+ """
93
+ Create a new session from a run context.
94
+
95
+ Args:
96
+ context: Run context to create session from
97
+ name: Optional session name
98
+
99
+ Returns:
100
+ Session metadata
101
+ """
102
+ session_id = context.run_id # Use run_id as session_id
103
+ session_dir = self._get_session_dir(session_id)
104
+ session_dir.mkdir(parents=True, exist_ok=True)
105
+
106
+ now = datetime.utcnow()
107
+ metadata = SessionMetadata(
108
+ session_id=session_id,
109
+ run_id=context.run_id,
110
+ trace_id=context.trace_id,
111
+ created_at=now,
112
+ updated_at=now,
113
+ name=name,
114
+ workspace=context.workspace,
115
+ config_summary=context.config_summary,
116
+ )
117
+
118
+ # Save metadata
119
+ self._save_metadata(metadata)
120
+
121
+ # Create empty events file
122
+ self._get_events_path(session_id).touch()
123
+
124
+ return metadata
125
+
126
+ def _save_metadata(self, metadata: SessionMetadata) -> None:
127
+ """Save session metadata."""
128
+ path = self._get_metadata_path(metadata.session_id)
129
+ path.parent.mkdir(parents=True, exist_ok=True)
130
+ with open(path, "w", encoding="utf-8") as f:
131
+ json.dump(metadata.to_dict(), f, indent=2)
132
+
133
+ def _load_metadata(self, session_id: str) -> Optional[SessionMetadata]:
134
+ """Load session metadata."""
135
+ path = self._get_metadata_path(session_id)
136
+ if not path.exists():
137
+ return None
138
+ try:
139
+ with open(path, "r", encoding="utf-8") as f:
140
+ data = json.load(f)
141
+ return SessionMetadata.from_dict(data)
142
+ except (json.JSONDecodeError, KeyError):
143
+ return None
144
+
145
+ def append_event(self, session_id: str, event: Dict[str, Any]) -> None:
146
+ """
147
+ Append an event to a session.
148
+
149
+ Args:
150
+ session_id: Session ID
151
+ event: Event data to append
152
+ """
153
+ events_path = self._get_events_path(session_id)
154
+ if not events_path.parent.exists():
155
+ return
156
+
157
+ with open(events_path, "a", encoding="utf-8") as f:
158
+ f.write(json.dumps(event, default=str) + "\n")
159
+
160
+ # Update metadata
161
+ metadata = self._load_metadata(session_id)
162
+ if metadata:
163
+ metadata.event_count += 1
164
+ metadata.updated_at = datetime.utcnow()
165
+ self._save_metadata(metadata)
166
+
167
+ def get(self, session_id: str) -> Optional[SessionMetadata]:
168
+ """Get session metadata by ID."""
169
+ return self._load_metadata(session_id)
170
+
171
+ def list(self, limit: int = 50) -> List[SessionMetadata]:
172
+ """
173
+ List all sessions, sorted by updated_at descending.
174
+
175
+ Args:
176
+ limit: Maximum number of sessions to return
177
+
178
+ Returns:
179
+ List of session metadata
180
+ """
181
+ sessions = []
182
+
183
+ if not self.sessions_dir.exists():
184
+ return sessions
185
+
186
+ for session_dir in self.sessions_dir.iterdir():
187
+ if session_dir.is_dir():
188
+ metadata = self._load_metadata(session_dir.name)
189
+ if metadata:
190
+ sessions.append(metadata)
191
+
192
+ # Sort by updated_at descending
193
+ sessions.sort(key=lambda s: s.updated_at, reverse=True)
194
+
195
+ return sessions[:limit]
196
+
197
+ def delete(self, session_id: str) -> bool:
198
+ """
199
+ Delete a session.
200
+
201
+ Args:
202
+ session_id: Session ID to delete
203
+
204
+ Returns:
205
+ True if deleted, False if not found
206
+ """
207
+ session_dir = self._get_session_dir(session_id)
208
+ if not session_dir.exists():
209
+ return False
210
+
211
+ shutil.rmtree(session_dir)
212
+ return True
213
+
214
+ def get_events(self, session_id: str) -> List[Dict[str, Any]]:
215
+ """
216
+ Get all events for a session.
217
+
218
+ Args:
219
+ session_id: Session ID
220
+
221
+ Returns:
222
+ List of events
223
+ """
224
+ events_path = self._get_events_path(session_id)
225
+ if not events_path.exists():
226
+ return []
227
+
228
+ events = []
229
+ with open(events_path, "r", encoding="utf-8") as f:
230
+ for line in f:
231
+ line = line.strip()
232
+ if line:
233
+ try:
234
+ events.append(json.loads(line))
235
+ except json.JSONDecodeError:
236
+ pass
237
+
238
+ return events
239
+
240
+ def export(self, session_id: str, format: str = "md") -> Optional[str]:
241
+ """
242
+ Export a session to a string.
243
+
244
+ Args:
245
+ session_id: Session ID
246
+ format: Export format ("md" or "json")
247
+
248
+ Returns:
249
+ Exported content or None if not found
250
+ """
251
+ metadata = self._load_metadata(session_id)
252
+ if not metadata:
253
+ return None
254
+
255
+ events = self.get_events(session_id)
256
+
257
+ if format == "json":
258
+ return json.dumps({
259
+ "metadata": metadata.to_dict(),
260
+ "events": events,
261
+ }, indent=2, default=str)
262
+
263
+ # Markdown format
264
+ lines = [
265
+ f"# Session: {metadata.name or metadata.session_id}",
266
+ "",
267
+ f"- **Run ID**: {metadata.run_id}",
268
+ f"- **Trace ID**: {metadata.trace_id}",
269
+ f"- **Created**: {metadata.created_at.isoformat()}",
270
+ f"- **Status**: {metadata.status}",
271
+ "",
272
+ "## Events",
273
+ "",
274
+ ]
275
+
276
+ for event in events:
277
+ event_type = event.get("event", "unknown")
278
+ timestamp = event.get("timestamp", "")
279
+ message = event.get("message", "")
280
+
281
+ lines.append(f"### {event_type} ({timestamp})")
282
+ if message:
283
+ lines.append(f"\n{message}")
284
+
285
+ data = event.get("data", {})
286
+ if data:
287
+ lines.append("\n```json")
288
+ lines.append(json.dumps(data, indent=2, default=str))
289
+ lines.append("```")
290
+
291
+ lines.append("")
292
+
293
+ return "\n".join(lines)
294
+
295
+ def update_status(self, session_id: str, status: str) -> None:
296
+ """Update session status."""
297
+ metadata = self._load_metadata(session_id)
298
+ if metadata:
299
+ metadata.status = status
300
+ metadata.updated_at = datetime.utcnow()
301
+ self._save_metadata(metadata)
302
+
303
+
304
+ # Global session manager
305
+ _session_manager: Optional[SessionManager] = None
306
+
307
+
308
+ def get_session_manager() -> SessionManager:
309
+ """Get the global session manager."""
310
+ global _session_manager
311
+ if _session_manager is None:
312
+ _session_manager = SessionManager()
313
+ return _session_manager
@@ -0,0 +1,93 @@
1
+ """
2
+ PraisonAI Code - AI-powered code editing tools.
3
+
4
+ This module provides tools for AI agents to read, write, and modify code files
5
+ with precision using search/replace diff strategies similar to Kilo Code.
6
+
7
+ Features:
8
+ - read_file: Read file contents with optional line ranges
9
+ - write_file: Create or overwrite files
10
+ - list_files: List directory contents with filtering
11
+ - apply_diff: Apply SEARCH/REPLACE diffs with fuzzy matching
12
+ - search_replace: Multiple search/replace operations
13
+ - execute_command: Run shell commands safely
14
+
15
+ Example:
16
+ from praisonai.code import read_file, write_file, apply_diff
17
+
18
+ # Read a file
19
+ content = read_file("path/to/file.py")
20
+
21
+ # Write a file
22
+ write_file("path/to/new_file.py", "print('hello')")
23
+
24
+ # Apply a diff
25
+ result = apply_diff("path/to/file.py", diff_content)
26
+ """
27
+
28
+ from .tools import (
29
+ read_file,
30
+ write_file,
31
+ list_files,
32
+ apply_diff,
33
+ search_replace,
34
+ execute_command,
35
+ )
36
+
37
+ from .diff import (
38
+ DiffResult,
39
+ apply_search_replace_diff,
40
+ parse_diff_blocks,
41
+ )
42
+
43
+ from .utils import (
44
+ FileAccessController,
45
+ add_line_numbers,
46
+ strip_line_numbers,
47
+ )
48
+
49
+ from .agent_tools import (
50
+ set_workspace,
51
+ get_workspace,
52
+ code_read_file,
53
+ code_write_file,
54
+ code_list_files,
55
+ code_apply_diff,
56
+ code_search_replace,
57
+ code_execute_command,
58
+ CODE_TOOLS,
59
+ create_diff_block,
60
+ create_multi_diff,
61
+ )
62
+
63
+ __all__ = [
64
+ # Main tools (low-level)
65
+ "read_file",
66
+ "write_file",
67
+ "list_files",
68
+ "apply_diff",
69
+ "search_replace",
70
+ "execute_command",
71
+ # Agent tools (high-level, string returns)
72
+ "set_workspace",
73
+ "get_workspace",
74
+ "code_read_file",
75
+ "code_write_file",
76
+ "code_list_files",
77
+ "code_apply_diff",
78
+ "code_search_replace",
79
+ "code_execute_command",
80
+ "CODE_TOOLS",
81
+ "create_diff_block",
82
+ "create_multi_diff",
83
+ # Diff utilities
84
+ "DiffResult",
85
+ "apply_search_replace_diff",
86
+ "parse_diff_blocks",
87
+ # Utilities
88
+ "FileAccessController",
89
+ "add_line_numbers",
90
+ "strip_line_numbers",
91
+ ]
92
+
93
+ __version__ = "0.1.0"