praisonai-code 0.0.1__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 (309) hide show
  1. praisonai_code/__init__.py +17 -0
  2. praisonai_code/cli/__init__.py +12 -0
  3. praisonai_code/cli/_forward_shim.py +10 -0
  4. praisonai_code/cli/_paths.py +88 -0
  5. praisonai_code/cli/_warnings.py +58 -0
  6. praisonai_code/cli/app.py +757 -0
  7. praisonai_code/cli/approval_backend.py +272 -0
  8. praisonai_code/cli/branding.py +94 -0
  9. praisonai_code/cli/commands/__init__.py +114 -0
  10. praisonai_code/cli/commands/acp.py +80 -0
  11. praisonai_code/cli/commands/agent.py +116 -0
  12. praisonai_code/cli/commands/agents.py +80 -0
  13. praisonai_code/cli/commands/app.py +139 -0
  14. praisonai_code/cli/commands/attach.py +95 -0
  15. praisonai_code/cli/commands/audit.py +102 -0
  16. praisonai_code/cli/commands/auth.py +508 -0
  17. praisonai_code/cli/commands/batch.py +848 -0
  18. praisonai_code/cli/commands/benchmark.py +286 -0
  19. praisonai_code/cli/commands/browser.py +299 -0
  20. praisonai_code/cli/commands/call.py +45 -0
  21. praisonai_code/cli/commands/chat.py +332 -0
  22. praisonai_code/cli/commands/checkpoint.py +170 -0
  23. praisonai_code/cli/commands/code.py +276 -0
  24. praisonai_code/cli/commands/command.py +114 -0
  25. praisonai_code/cli/commands/commit.py +47 -0
  26. praisonai_code/cli/commands/completion.py +333 -0
  27. praisonai_code/cli/commands/config.py +681 -0
  28. praisonai_code/cli/commands/context.py +414 -0
  29. praisonai_code/cli/commands/daemon.py +203 -0
  30. praisonai_code/cli/commands/debug.py +142 -0
  31. praisonai_code/cli/commands/deploy.py +71 -0
  32. praisonai_code/cli/commands/diag.py +55 -0
  33. praisonai_code/cli/commands/docs.py +1575 -0
  34. praisonai_code/cli/commands/doctor.py +332 -0
  35. praisonai_code/cli/commands/endpoints.py +51 -0
  36. praisonai_code/cli/commands/environment.py +179 -0
  37. praisonai_code/cli/commands/eval.py +131 -0
  38. praisonai_code/cli/commands/examples.py +953 -0
  39. praisonai_code/cli/commands/flow.py +436 -0
  40. praisonai_code/cli/commands/github.py +752 -0
  41. praisonai_code/cli/commands/hooks.py +74 -0
  42. praisonai_code/cli/commands/init.py +174 -0
  43. praisonai_code/cli/commands/knowledge.py +440 -0
  44. praisonai_code/cli/commands/langextract.py +120 -0
  45. praisonai_code/cli/commands/langfuse.py +984 -0
  46. praisonai_code/cli/commands/loop.py +211 -0
  47. praisonai_code/cli/commands/lsp.py +112 -0
  48. praisonai_code/cli/commands/managed.py +659 -0
  49. praisonai_code/cli/commands/mcp.py +763 -0
  50. praisonai_code/cli/commands/memory.py +298 -0
  51. praisonai_code/cli/commands/models.py +264 -0
  52. praisonai_code/cli/commands/n8n.py +326 -0
  53. praisonai_code/cli/commands/obs.py +19 -0
  54. praisonai_code/cli/commands/package.py +76 -0
  55. praisonai_code/cli/commands/paths.py +106 -0
  56. praisonai_code/cli/commands/permissions.py +272 -0
  57. praisonai_code/cli/commands/plugins.py +609 -0
  58. praisonai_code/cli/commands/port.py +530 -0
  59. praisonai_code/cli/commands/profile.py +466 -0
  60. praisonai_code/cli/commands/publish.py +193 -0
  61. praisonai_code/cli/commands/rag.py +913 -0
  62. praisonai_code/cli/commands/realtime.py +52 -0
  63. praisonai_code/cli/commands/recipe.py +684 -0
  64. praisonai_code/cli/commands/registry.py +59 -0
  65. praisonai_code/cli/commands/replay.py +830 -0
  66. praisonai_code/cli/commands/research.py +49 -0
  67. praisonai_code/cli/commands/retrieval.py +377 -0
  68. praisonai_code/cli/commands/rules.py +71 -0
  69. praisonai_code/cli/commands/run.py +1573 -0
  70. praisonai_code/cli/commands/sandbox.py +371 -0
  71. praisonai_code/cli/commands/schedule.py +529 -0
  72. praisonai_code/cli/commands/serve.py +690 -0
  73. praisonai_code/cli/commands/session.py +450 -0
  74. praisonai_code/cli/commands/setup.py +174 -0
  75. praisonai_code/cli/commands/skills.py +545 -0
  76. praisonai_code/cli/commands/standardise.py +711 -0
  77. praisonai_code/cli/commands/templates.py +54 -0
  78. praisonai_code/cli/commands/test.py +558 -0
  79. praisonai_code/cli/commands/todo.py +74 -0
  80. praisonai_code/cli/commands/tools.py +205 -0
  81. praisonai_code/cli/commands/traces.py +145 -0
  82. praisonai_code/cli/commands/tracker.py +852 -0
  83. praisonai_code/cli/commands/train.py +613 -0
  84. praisonai_code/cli/commands/ui.py +172 -0
  85. praisonai_code/cli/commands/up.py +354 -0
  86. praisonai_code/cli/commands/validate.py +291 -0
  87. praisonai_code/cli/commands/version.py +101 -0
  88. praisonai_code/cli/commands/workflow.py +97 -0
  89. praisonai_code/cli/config_loader.py +437 -0
  90. praisonai_code/cli/configuration/__init__.py +27 -0
  91. praisonai_code/cli/configuration/config.schema.json +57 -0
  92. praisonai_code/cli/configuration/credentials.py +446 -0
  93. praisonai_code/cli/configuration/loader.py +364 -0
  94. praisonai_code/cli/configuration/model_resolver.py +161 -0
  95. praisonai_code/cli/configuration/oauth.py +389 -0
  96. praisonai_code/cli/configuration/paths.py +224 -0
  97. praisonai_code/cli/configuration/resolver.py +687 -0
  98. praisonai_code/cli/configuration/schema.py +317 -0
  99. praisonai_code/cli/execution/__init__.py +99 -0
  100. praisonai_code/cli/execution/core.py +208 -0
  101. praisonai_code/cli/execution/profiler.py +898 -0
  102. praisonai_code/cli/execution/request.py +85 -0
  103. praisonai_code/cli/execution/result.py +74 -0
  104. praisonai_code/cli/fallback_schema.py +416 -0
  105. praisonai_code/cli/features/__init__.py +278 -0
  106. praisonai_code/cli/features/_endpoint_registry.py +64 -0
  107. praisonai_code/cli/features/_search_registry.py +43 -0
  108. praisonai_code/cli/features/acp.py +236 -0
  109. praisonai_code/cli/features/action_orchestrator.py +576 -0
  110. praisonai_code/cli/features/agent_scheduler.py +773 -0
  111. praisonai_code/cli/features/agent_tools.py +603 -0
  112. praisonai_code/cli/features/agents.py +397 -0
  113. praisonai_code/cli/features/at_mentions.py +471 -0
  114. praisonai_code/cli/features/audit_cli.py +270 -0
  115. praisonai_code/cli/features/auto_memory.py +182 -0
  116. praisonai_code/cli/features/auto_mode.py +552 -0
  117. praisonai_code/cli/features/autonomy_mode.py +546 -0
  118. praisonai_code/cli/features/background.py +356 -0
  119. praisonai_code/cli/features/base.py +168 -0
  120. praisonai_code/cli/features/benchmark.py +1462 -0
  121. praisonai_code/cli/features/capabilities.py +1326 -0
  122. praisonai_code/cli/features/checkpoints.py +345 -0
  123. praisonai_code/cli/features/cli_profiler.py +335 -0
  124. praisonai_code/cli/features/code_intelligence.py +666 -0
  125. praisonai_code/cli/features/compaction.py +294 -0
  126. praisonai_code/cli/features/compare.py +534 -0
  127. praisonai_code/cli/features/config_hierarchy.py +366 -0
  128. praisonai_code/cli/features/context_manager.py +597 -0
  129. praisonai_code/cli/features/cost_tracker.py +514 -0
  130. praisonai_code/cli/features/csv_test_runner.py +736 -0
  131. praisonai_code/cli/features/custom_definitions.py +790 -0
  132. praisonai_code/cli/features/debug.py +810 -0
  133. praisonai_code/cli/features/deploy.py +605 -0
  134. praisonai_code/cli/features/diag.py +289 -0
  135. praisonai_code/cli/features/display_jsonl.py +173 -0
  136. praisonai_code/cli/features/doctor/__init__.py +63 -0
  137. praisonai_code/cli/features/doctor/checks/__init__.py +29 -0
  138. praisonai_code/cli/features/doctor/checks/acp_checks.py +220 -0
  139. praisonai_code/cli/features/doctor/checks/bot_checks.py +340 -0
  140. praisonai_code/cli/features/doctor/checks/config_checks.py +373 -0
  141. praisonai_code/cli/features/doctor/checks/db_checks.py +366 -0
  142. praisonai_code/cli/features/doctor/checks/env_checks.py +637 -0
  143. praisonai_code/cli/features/doctor/checks/gateway_checks.py +387 -0
  144. praisonai_code/cli/features/doctor/checks/lsp_checks.py +231 -0
  145. praisonai_code/cli/features/doctor/checks/mcp_checks.py +367 -0
  146. praisonai_code/cli/features/doctor/checks/memory_checks.py +268 -0
  147. praisonai_code/cli/features/doctor/checks/network_checks.py +251 -0
  148. praisonai_code/cli/features/doctor/checks/obs_checks.py +328 -0
  149. praisonai_code/cli/features/doctor/checks/packaging_checks.py +422 -0
  150. praisonai_code/cli/features/doctor/checks/performance_checks.py +235 -0
  151. praisonai_code/cli/features/doctor/checks/permissions_checks.py +259 -0
  152. praisonai_code/cli/features/doctor/checks/runtime_checks.py +650 -0
  153. praisonai_code/cli/features/doctor/checks/runtime_migration_checks.py +220 -0
  154. praisonai_code/cli/features/doctor/checks/selftest_checks.py +322 -0
  155. praisonai_code/cli/features/doctor/checks/serve_checks.py +426 -0
  156. praisonai_code/cli/features/doctor/checks/skills_checks.py +327 -0
  157. praisonai_code/cli/features/doctor/checks/tools_checks.py +371 -0
  158. praisonai_code/cli/features/doctor/engine.py +266 -0
  159. praisonai_code/cli/features/doctor/formatters.py +377 -0
  160. praisonai_code/cli/features/doctor/handler.py +564 -0
  161. praisonai_code/cli/features/doctor/models.py +276 -0
  162. praisonai_code/cli/features/doctor/registry.py +239 -0
  163. praisonai_code/cli/features/endpoints.py +1016 -0
  164. praisonai_code/cli/features/eval.py +559 -0
  165. praisonai_code/cli/features/examples.py +707 -0
  166. praisonai_code/cli/features/external_agents.py +231 -0
  167. praisonai_code/cli/features/fast_context.py +410 -0
  168. praisonai_code/cli/features/file_history.py +320 -0
  169. praisonai_code/cli/features/flow_display.py +566 -0
  170. praisonai_code/cli/features/git_attribution.py +159 -0
  171. praisonai_code/cli/features/git_integration.py +651 -0
  172. praisonai_code/cli/features/guardrail.py +171 -0
  173. praisonai_code/cli/features/handoff.py +252 -0
  174. praisonai_code/cli/features/hooks.py +583 -0
  175. praisonai_code/cli/features/hybrid_workflow.py +391 -0
  176. praisonai_code/cli/features/image.py +384 -0
  177. praisonai_code/cli/features/interactive_core_headless.py +450 -0
  178. praisonai_code/cli/features/interactive_runtime.py +600 -0
  179. praisonai_code/cli/features/interactive_test_harness.py +537 -0
  180. praisonai_code/cli/features/interactive_tools.py +428 -0
  181. praisonai_code/cli/features/interactive_tui.py +603 -0
  182. praisonai_code/cli/features/job_workflow.py +906 -0
  183. praisonai_code/cli/features/jobs.py +632 -0
  184. praisonai_code/cli/features/knowledge.py +531 -0
  185. praisonai_code/cli/features/knowledge_cli.py +438 -0
  186. praisonai_code/cli/features/lite.py +244 -0
  187. praisonai_code/cli/features/logs.py +200 -0
  188. praisonai_code/cli/features/lsp_cli.py +225 -0
  189. praisonai_code/cli/features/lsp_diagnostics.py +185 -0
  190. praisonai_code/cli/features/mcp.py +344 -0
  191. praisonai_code/cli/features/message_queue.py +587 -0
  192. praisonai_code/cli/features/metrics.py +210 -0
  193. praisonai_code/cli/features/migrate.py +1329 -0
  194. praisonai_code/cli/features/migration_flow.py +463 -0
  195. praisonai_code/cli/features/migration_spec.py +276 -0
  196. praisonai_code/cli/features/n8n.py +703 -0
  197. praisonai_code/cli/features/observability.py +293 -0
  198. praisonai_code/cli/features/ollama.py +361 -0
  199. praisonai_code/cli/features/output_modes.py +155 -0
  200. praisonai_code/cli/features/output_style.py +273 -0
  201. praisonai_code/cli/features/package.py +631 -0
  202. praisonai_code/cli/features/performance.py +308 -0
  203. praisonai_code/cli/features/persistence.py +636 -0
  204. praisonai_code/cli/features/profiler/__init__.py +81 -0
  205. praisonai_code/cli/features/profiler/core.py +558 -0
  206. praisonai_code/cli/features/profiler/optimizations.py +652 -0
  207. praisonai_code/cli/features/profiler/suite.py +386 -0
  208. praisonai_code/cli/features/queue/__init__.py +73 -0
  209. praisonai_code/cli/features/queue/manager.py +435 -0
  210. praisonai_code/cli/features/queue/models.py +289 -0
  211. praisonai_code/cli/features/queue/persistence.py +564 -0
  212. praisonai_code/cli/features/queue/scheduler.py +529 -0
  213. praisonai_code/cli/features/queue/worker.py +400 -0
  214. praisonai_code/cli/features/recipe.py +2187 -0
  215. praisonai_code/cli/features/recipe_creator.py +996 -0
  216. praisonai_code/cli/features/recipe_optimizer.py +1364 -0
  217. praisonai_code/cli/features/recipe_prompts.py +226 -0
  218. praisonai_code/cli/features/registry.py +229 -0
  219. praisonai_code/cli/features/repo_map.py +860 -0
  220. praisonai_code/cli/features/router.py +466 -0
  221. praisonai_code/cli/features/safe_shell.py +427 -0
  222. praisonai_code/cli/features/sandbox_cli.py +283 -0
  223. praisonai_code/cli/features/sandbox_executor.py +536 -0
  224. praisonai_code/cli/features/sdk_knowledge.py +500 -0
  225. praisonai_code/cli/features/session.py +222 -0
  226. praisonai_code/cli/features/session_checkpoints.py +208 -0
  227. praisonai_code/cli/features/setup/__init__.py +9 -0
  228. praisonai_code/cli/features/setup/handler.py +355 -0
  229. praisonai_code/cli/features/setup/templates.py +62 -0
  230. praisonai_code/cli/features/skills.py +940 -0
  231. praisonai_code/cli/features/slash_commands.py +692 -0
  232. praisonai_code/cli/features/telemetry.py +179 -0
  233. praisonai_code/cli/features/templates.py +1390 -0
  234. praisonai_code/cli/features/thinking.py +343 -0
  235. praisonai_code/cli/features/todo.py +334 -0
  236. praisonai_code/cli/features/tools.py +680 -0
  237. praisonai_code/cli/features/tui/__init__.py +83 -0
  238. praisonai_code/cli/features/tui/app.py +871 -0
  239. praisonai_code/cli/features/tui/cli.py +580 -0
  240. praisonai_code/cli/features/tui/config.py +150 -0
  241. praisonai_code/cli/features/tui/debug.py +526 -0
  242. praisonai_code/cli/features/tui/events.py +99 -0
  243. praisonai_code/cli/features/tui/mock_provider.py +328 -0
  244. praisonai_code/cli/features/tui/orchestrator.py +652 -0
  245. praisonai_code/cli/features/tui/screens/__init__.py +50 -0
  246. praisonai_code/cli/features/tui/screens/help.py +157 -0
  247. praisonai_code/cli/features/tui/screens/main.py +568 -0
  248. praisonai_code/cli/features/tui/screens/queue.py +174 -0
  249. praisonai_code/cli/features/tui/screens/session.py +124 -0
  250. praisonai_code/cli/features/tui/screens/settings.py +148 -0
  251. praisonai_code/cli/features/tui/session_store.py +198 -0
  252. praisonai_code/cli/features/tui/widgets/__init__.py +56 -0
  253. praisonai_code/cli/features/tui/widgets/chat.py +263 -0
  254. praisonai_code/cli/features/tui/widgets/command_popup.py +258 -0
  255. praisonai_code/cli/features/tui/widgets/composer.py +292 -0
  256. praisonai_code/cli/features/tui/widgets/file_popup.py +207 -0
  257. praisonai_code/cli/features/tui/widgets/queue_panel.py +223 -0
  258. praisonai_code/cli/features/tui/widgets/status.py +181 -0
  259. praisonai_code/cli/features/tui/widgets/tool_panel.py +307 -0
  260. praisonai_code/cli/features/wizard.py +289 -0
  261. praisonai_code/cli/features/workflow.py +802 -0
  262. praisonai_code/cli/features/yaml_utils.py +321 -0
  263. praisonai_code/cli/interactive/__init__.py +48 -0
  264. praisonai_code/cli/interactive/async_tui.py +1218 -0
  265. praisonai_code/cli/interactive/config.py +139 -0
  266. praisonai_code/cli/interactive/core.py +618 -0
  267. praisonai_code/cli/interactive/events.py +131 -0
  268. praisonai_code/cli/interactive/frontends/__init__.py +31 -0
  269. praisonai_code/cli/interactive/frontends/rich_frontend.py +462 -0
  270. praisonai_code/cli/interactive/frontends/textual_frontend.py +157 -0
  271. praisonai_code/cli/interactive/praison_io.py +502 -0
  272. praisonai_code/cli/interactive/repl.py +297 -0
  273. praisonai_code/cli/interactive/split_tui.py +456 -0
  274. praisonai_code/cli/interactive/tui_app.py +457 -0
  275. praisonai_code/cli/langfuse_client.py +360 -0
  276. praisonai_code/cli/main.py +7421 -0
  277. praisonai_code/cli/output/__init__.py +25 -0
  278. praisonai_code/cli/output/console.py +456 -0
  279. praisonai_code/cli/output/event_bridge.py +191 -0
  280. praisonai_code/cli/schedule_cli.py +54 -0
  281. praisonai_code/cli/schema_provider.py +23 -0
  282. praisonai_code/cli/session/__init__.py +16 -0
  283. praisonai_code/cli/session/resume.py +148 -0
  284. praisonai_code/cli/session/unified.py +548 -0
  285. praisonai_code/cli/state/__init__.py +31 -0
  286. praisonai_code/cli/state/identifiers.py +161 -0
  287. praisonai_code/cli/state/project_sessions.py +383 -0
  288. praisonai_code/cli/state/sessions.py +390 -0
  289. praisonai_code/cli/ui/__init__.py +160 -0
  290. praisonai_code/cli/ui/config.py +46 -0
  291. praisonai_code/cli/ui/events.py +61 -0
  292. praisonai_code/cli/ui/mg_backend.py +342 -0
  293. praisonai_code/cli/ui/plain.py +133 -0
  294. praisonai_code/cli/ui/rich_backend.py +162 -0
  295. praisonai_code/cli/unified_schema.py +655 -0
  296. praisonai_code/cli/utils/env_utils.py +126 -0
  297. praisonai_code/cli/utils/project.py +131 -0
  298. praisonai_code/cli_backends/__init__.py +73 -0
  299. praisonai_code/cli_backends/claude.py +373 -0
  300. praisonai_code/cli_backends/registry.py +113 -0
  301. praisonai_code/runtime/__init__.py +36 -0
  302. praisonai_code/runtime/__main__.py +81 -0
  303. praisonai_code/runtime/client.py +131 -0
  304. praisonai_code/runtime/descriptor.py +209 -0
  305. praisonai_code/runtime/server.py +356 -0
  306. praisonai_code-0.0.1.dist-info/METADATA +80 -0
  307. praisonai_code-0.0.1.dist-info/RECORD +309 -0
  308. praisonai_code-0.0.1.dist-info/WHEEL +5 -0
  309. praisonai_code-0.0.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,80 @@
1
+ """
2
+ Agents command group for PraisonAI CLI.
3
+
4
+ Provides agent management commands.
5
+ """
6
+
7
+ import typer
8
+
9
+ app = typer.Typer(help="Agent management")
10
+
11
+
12
+ @app.command("list")
13
+ def agents_list(
14
+ verbose: bool = typer.Option(False, "--verbose", "-v", help="Show detailed info"),
15
+ ):
16
+ """List available agents."""
17
+ from praisonai.cli.main import PraisonAI
18
+ import sys
19
+
20
+ argv = ['agents', 'list']
21
+ if verbose:
22
+ argv.append('--verbose')
23
+
24
+ original_argv = sys.argv
25
+ sys.argv = ['praisonai'] + argv
26
+
27
+ try:
28
+ praison = PraisonAI()
29
+ praison.main()
30
+ except SystemExit:
31
+ pass
32
+ finally:
33
+ sys.argv = original_argv
34
+
35
+
36
+ @app.command("create")
37
+ def agents_create(
38
+ name: str = typer.Argument(..., help="Agent name"),
39
+ template: str = typer.Option(None, "--template", "-t", help="Template to use"),
40
+ ):
41
+ """Create a new agent."""
42
+ from praisonai.cli.main import PraisonAI
43
+ import sys
44
+
45
+ argv = ['agents', 'create', name]
46
+ if template:
47
+ argv.extend(['--template', template])
48
+
49
+ original_argv = sys.argv
50
+ sys.argv = ['praisonai'] + argv
51
+
52
+ try:
53
+ praison = PraisonAI()
54
+ praison.main()
55
+ except SystemExit:
56
+ pass
57
+ finally:
58
+ sys.argv = original_argv
59
+
60
+
61
+ @app.command("info")
62
+ def agents_info(
63
+ name: str = typer.Argument(..., help="Agent name"),
64
+ ):
65
+ """Show agent information."""
66
+ from praisonai.cli.main import PraisonAI
67
+ import sys
68
+
69
+ argv = ['agents', 'info', name]
70
+
71
+ original_argv = sys.argv
72
+ sys.argv = ['praisonai'] + argv
73
+
74
+ try:
75
+ praison = PraisonAI()
76
+ praison.main()
77
+ except SystemExit:
78
+ pass
79
+ finally:
80
+ sys.argv = original_argv
@@ -0,0 +1,139 @@
1
+ """
2
+ CLI command for AgentOS - production deployment of AI agents.
3
+
4
+ Usage:
5
+ praisonai app # Start server with default config
6
+ praisonai app --port 9000 # Start on custom port
7
+ praisonai app --config app.yaml # Load from config file
8
+ praisonai app --reload # Enable auto-reload for development
9
+ """
10
+
11
+ import click
12
+ from typing import Optional
13
+
14
+
15
+ @click.command("app")
16
+ @click.option("--port", "-p", type=int, default=8000, help="Port to listen on")
17
+ @click.option("--host", "-h", type=str, default="0.0.0.0", help="Host to bind to")
18
+ @click.option("--config", "-c", type=click.Path(exists=True), help="Path to config file (YAML)")
19
+ @click.option("--reload", "-r", is_flag=True, help="Enable auto-reload for development")
20
+ @click.option("--debug", "-d", is_flag=True, help="Enable debug mode")
21
+ @click.option("--name", "-n", type=str, default="PraisonAI App", help="Application name")
22
+ def app_command(
23
+ port: int,
24
+ host: str,
25
+ config: Optional[str],
26
+ reload: bool,
27
+ debug: bool,
28
+ name: str,
29
+ ):
30
+ """
31
+ Start an AgentOS server for production deployment.
32
+
33
+ AgentOS provides a FastAPI-based web service for deploying AI agents
34
+ with REST and WebSocket endpoints.
35
+
36
+ Examples:
37
+
38
+ # Start with defaults (port 8000)
39
+ praisonai app
40
+
41
+ # Start on custom port
42
+ praisonai app --port 9000
43
+
44
+ # Enable auto-reload for development
45
+ praisonai app --reload
46
+
47
+ # Load agents from config file
48
+ praisonai app --config agents.yaml
49
+ """
50
+ from rich.console import Console
51
+ console = Console()
52
+
53
+ try:
54
+ from praisonai import AgentOS
55
+ from praisonaiagents import AgentOSConfig
56
+ except ImportError as e:
57
+ console.print(f"[red]Error importing AgentOS: {e}[/red]")
58
+ console.print("[yellow]Install with: pip install praisonai[api][/yellow]")
59
+ raise click.Abort()
60
+
61
+ # Load agents from config file if provided
62
+ agents = []
63
+ if config:
64
+ agents = _load_agents_from_config(config, console)
65
+
66
+ # Create config
67
+ app_config = AgentOSConfig(
68
+ name=name,
69
+ host=host,
70
+ port=port,
71
+ reload=reload,
72
+ debug=debug,
73
+ )
74
+
75
+ # Create and start app
76
+ console.print(f"\n[bold green]🚀 Starting {name}[/bold green]")
77
+ console.print(f"[dim]Host: {host}:{port}[/dim]")
78
+ if agents:
79
+ console.print(f"[dim]Agents: {len(agents)}[/dim]")
80
+ if reload:
81
+ console.print("[yellow]Auto-reload enabled (development mode)[/yellow]")
82
+ console.print()
83
+
84
+ try:
85
+ agent_app = AgentOS(
86
+ name=name,
87
+ agents=agents,
88
+ config=app_config,
89
+ )
90
+ agent_app.serve()
91
+ except ImportError as e:
92
+ console.print(f"[red]Missing dependency: {e}[/red]")
93
+ console.print("[yellow]Install with: pip install praisonai[api][/yellow]")
94
+ raise click.Abort()
95
+ except Exception as e:
96
+ console.print(f"[red]Error starting server: {e}[/red]")
97
+ raise click.Abort()
98
+
99
+
100
+ def _load_agents_from_config(config_path: str, console) -> list:
101
+ """Load agents from a YAML config file."""
102
+ import yaml
103
+ from pathlib import Path
104
+
105
+ try:
106
+ with open(config_path, 'r') as f:
107
+ config_data = yaml.safe_load(f)
108
+ except Exception as e:
109
+ console.print(f"[red]Error loading config: {e}[/red]")
110
+ return []
111
+
112
+ if not config_data:
113
+ return []
114
+
115
+ agents = []
116
+
117
+ # Try to load agents from config
118
+ agents_config = config_data.get('agents', [])
119
+ if not agents_config and 'agent' in config_data:
120
+ agents_config = [config_data['agent']]
121
+
122
+ if agents_config:
123
+ try:
124
+ from praisonaiagents import Agent
125
+
126
+ for agent_data in agents_config:
127
+ if isinstance(agent_data, dict):
128
+ agent = Agent(
129
+ name=agent_data.get('name', 'Agent'),
130
+ role=agent_data.get('role'),
131
+ instructions=agent_data.get('instructions', agent_data.get('goal', '')),
132
+ llm=agent_data.get('llm'),
133
+ )
134
+ agents.append(agent)
135
+ console.print(f"[green]✓ Loaded agent: {agent.name}[/green]")
136
+ except Exception as e:
137
+ console.print(f"[yellow]Warning: Could not load agents from config: {e}[/yellow]")
138
+
139
+ return agents
@@ -0,0 +1,95 @@
1
+ """
2
+ Attach command for PraisonAI CLI.
3
+
4
+ Subscribe to a live session running on the warm local runtime and stream its
5
+ events in real time from another terminal. Multiple clients can attach to the
6
+ same active session and observe it concurrently.
7
+
8
+ praisonai attach <session-id>
9
+
10
+ The runtime must be running (``praisonai daemon start``) and a ``praisonai run``
11
+ must have been issued against the same session id (``run --attach <id>``) for
12
+ events to appear. Attaching is read-only: it never starts execution itself.
13
+ """
14
+
15
+ import json as _json
16
+
17
+ import typer
18
+
19
+ from ..output.console import get_output_controller
20
+
21
+ app = typer.Typer(help="Attach to a live session on the warm runtime")
22
+
23
+
24
+ @app.callback(invoke_without_command=True)
25
+ def attach_main(
26
+ ctx: typer.Context,
27
+ session_id: str = typer.Argument(..., help="Session id to attach to"),
28
+ json_output: bool = typer.Option(False, "--json", help="Emit raw NDJSON events"),
29
+ ):
30
+ """Stream live events for a running session.
31
+
32
+ Examples:
33
+ praisonai attach my-session
34
+ praisonai attach my-session --json
35
+ """
36
+ if ctx.invoked_subcommand is not None:
37
+ return
38
+
39
+ output = get_output_controller()
40
+
41
+ try:
42
+ from praisonai.runtime import (
43
+ get_runtime_descriptor,
44
+ RuntimeClient,
45
+ RuntimeUnavailable,
46
+ )
47
+ except ImportError as e:
48
+ output.print_error(f"Runtime module not available: {e}")
49
+ raise typer.Exit(4)
50
+
51
+ # Require a compatible runtime (same major version) so we never attach to an
52
+ # older runtime that lacks /sessions/{id}/events or speaks a different event
53
+ # contract — mirrors the gate the `run` path uses before reusing a runtime.
54
+ descriptor = get_runtime_descriptor(require_compatible=True)
55
+ if descriptor is None:
56
+ output.print_error(
57
+ "No compatible warm runtime is running. Start one with: praisonai daemon start"
58
+ )
59
+ raise typer.Exit(1)
60
+
61
+ client = RuntimeClient(descriptor)
62
+
63
+ if not json_output:
64
+ output.print_info(f"Attached to session '{session_id}'. Ctrl-C to detach.")
65
+
66
+ try:
67
+ for event in client.attach(session_id):
68
+ if json_output:
69
+ print(_json.dumps(event), flush=True)
70
+ continue
71
+ _render_event(output, event)
72
+ except RuntimeUnavailable as e:
73
+ output.print_error(f"Lost connection to runtime: {e}")
74
+ raise typer.Exit(1)
75
+ except KeyboardInterrupt:
76
+ if not json_output:
77
+ output.print_info("Detached.")
78
+ raise typer.Exit(0)
79
+
80
+
81
+ def _render_event(output, event: dict) -> None:
82
+ """Render a single session event for human-readable terminals."""
83
+ etype = event.get("type", "event")
84
+ if etype == "run.start":
85
+ prompt = event.get("prompt", "")
86
+ output.print_info(f"▶ run.start: {prompt}")
87
+ elif etype == "run.result":
88
+ result = event.get("result", "")
89
+ output.print_success("✓ run.result")
90
+ if result:
91
+ print(result)
92
+ elif etype == "run.error":
93
+ output.print_error(f"✗ run.error: {event.get('error', '')}")
94
+ else:
95
+ output.print(_json.dumps(event))
@@ -0,0 +1,102 @@
1
+ """
2
+ CLI command for agent-centric compliance auditing.
3
+
4
+ Usage:
5
+ praisonai audit agent-centric --scan /path/to/examples
6
+ praisonai audit agent-centric --fix /path/to/examples
7
+ praisonai audit agent-centric --check /path/to/examples
8
+ """
9
+
10
+ import click
11
+ import json
12
+ import sys
13
+ from pathlib import Path
14
+
15
+
16
+ @click.group()
17
+ def audit():
18
+ """Audit commands for compliance checking."""
19
+ pass
20
+
21
+
22
+ @audit.command("agent-centric")
23
+ @click.option("--scan", "scan_path", type=click.Path(exists=True), help="Scan path for compliance")
24
+ @click.option("--fix", "fix_path", type=click.Path(exists=True), help="Fix non-compliant files")
25
+ @click.option("--check", "check_path", type=click.Path(exists=True), help="Check and fail if non-compliant")
26
+ @click.option("--json", "output_json", is_flag=True, help="Output as JSON")
27
+ @click.option("--line-limit", default=40, help="Line limit for header scan (default: 40)")
28
+ @click.option("--only-examples", is_flag=True, help="Only scan Python examples")
29
+ @click.option("--only-docs", is_flag=True, help="Only scan documentation")
30
+ @click.option("--verbose", "-v", is_flag=True, help="Verbose output")
31
+ def agent_centric(scan_path, fix_path, check_path, output_json, line_limit, only_examples, only_docs, verbose):
32
+ """
33
+ Audit agent-centric compliance for examples and docs.
34
+
35
+ Examples:
36
+ praisonai audit agent-centric --scan ./examples
37
+ praisonai audit agent-centric --fix ./examples --verbose
38
+ praisonai audit agent-centric --check ./examples # Fails if non-compliant
39
+ """
40
+ from praisonai.audit.agent_centric import AgentCentricAuditor, ComplianceStatus
41
+
42
+ path = scan_path or fix_path or check_path
43
+ if not path:
44
+ click.echo("Error: Must specify --scan, --fix, or --check with a path", err=True)
45
+ sys.exit(1)
46
+
47
+ auditor = AgentCentricAuditor(line_limit=line_limit, verbose=verbose)
48
+
49
+ if fix_path:
50
+ # Fix mode
51
+ click.echo(f"Fixing non-compliant files in: {fix_path}")
52
+ report = auditor.scan(fix_path)
53
+
54
+ fixed_count = 0
55
+ for result in report.results:
56
+ if result.status == ComplianceStatus.NON_COMPLIANT:
57
+ success, reason = auditor.fix_file(result.file_path)
58
+ if success:
59
+ fixed_count += 1
60
+ if verbose:
61
+ click.echo(f" Fixed: {result.file_path} - {reason}")
62
+
63
+ click.echo(f"\nFixed {fixed_count} files")
64
+
65
+ # Re-scan to verify
66
+ report = auditor.scan(fix_path)
67
+ click.echo(f"Compliance rate: {report.compliance_rate():.1f}%")
68
+
69
+ else:
70
+ # Scan or check mode
71
+ report = auditor.scan(path)
72
+
73
+ if output_json:
74
+ click.echo(auditor.to_json(report))
75
+ else:
76
+ click.echo(f"\n{'='*60}")
77
+ click.echo("AGENT-CENTRIC COMPLIANCE REPORT")
78
+ click.echo(f"{'='*60}")
79
+ click.echo(f"Total files: {report.total_files}")
80
+ click.echo(f"Compliant: {report.compliant}")
81
+ click.echo(f"Non-compliant: {report.non_compliant}")
82
+ click.echo(f"Skipped: {report.skipped}")
83
+ click.echo(f"Compliance rate: {report.compliance_rate():.1f}%")
84
+
85
+ if report.by_reason:
86
+ click.echo(f"\nBy Reason:")
87
+ for reason, count in sorted(report.by_reason.items()):
88
+ click.echo(f" {reason}: {count}")
89
+
90
+ if verbose and report.non_compliant > 0:
91
+ click.echo(f"\nNon-compliant files:")
92
+ for r in report.results:
93
+ if r.status == ComplianceStatus.NON_COMPLIANT:
94
+ click.echo(f" {r.file_path}")
95
+ click.echo(f" Reason: {r.reason.value if r.reason else 'unknown'}")
96
+
97
+ # Check mode - fail if non-compliant
98
+ if check_path and report.non_compliant > 0:
99
+ click.echo(f"\n❌ FAILED: {report.non_compliant} non-compliant files found", err=True)
100
+ sys.exit(1)
101
+ elif check_path:
102
+ click.echo(f"\n✓ PASSED: All files are agent-centric compliant")