janus-agent 1.34.3__tar.gz

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 (416) hide show
  1. janus_agent-1.34.3/LICENSE +21 -0
  2. janus_agent-1.34.3/PKG-INFO +570 -0
  3. janus_agent-1.34.3/README.md +524 -0
  4. janus_agent-1.34.3/janus/__init__.py +3 -0
  5. janus_agent-1.34.3/janus/__main__.py +1288 -0
  6. janus_agent-1.34.3/janus/app.py +340 -0
  7. janus_agent-1.34.3/janus/at_mentions.py +246 -0
  8. janus_agent-1.34.3/janus/audit_log.py +220 -0
  9. janus_agent-1.34.3/janus/auto_mode.py +391 -0
  10. janus_agent-1.34.3/janus/backup.py +267 -0
  11. janus_agent-1.34.3/janus/branding.py +317 -0
  12. janus_agent-1.34.3/janus/cache.py +73 -0
  13. janus_agent-1.34.3/janus/cli.py +1785 -0
  14. janus_agent-1.34.3/janus/cli_rich.py +3201 -0
  15. janus_agent-1.34.3/janus/commands.py +99 -0
  16. janus_agent-1.34.3/janus/config.py +318 -0
  17. janus_agent-1.34.3/janus/conversation.py +432 -0
  18. janus_agent-1.34.3/janus/cost.py +666 -0
  19. janus_agent-1.34.3/janus/diff.py +146 -0
  20. janus_agent-1.34.3/janus/doctor.py +232 -0
  21. janus_agent-1.34.3/janus/eval.py +231 -0
  22. janus_agent-1.34.3/janus/executor.py +1341 -0
  23. janus_agent-1.34.3/janus/gateways/__init__.py +1 -0
  24. janus_agent-1.34.3/janus/gateways/_common.py +680 -0
  25. janus_agent-1.34.3/janus/gateways/static/app.css +681 -0
  26. janus_agent-1.34.3/janus/gateways/static/app.js +1777 -0
  27. janus_agent-1.34.3/janus/gateways/static/index.html +384 -0
  28. janus_agent-1.34.3/janus/gateways/static/login.html +32 -0
  29. janus_agent-1.34.3/janus/gateways/static/vendor/cm-closebrackets.min.js +1 -0
  30. janus_agent-1.34.3/janus/gateways/static/vendor/cm-matchbrackets.min.js +1 -0
  31. janus_agent-1.34.3/janus/gateways/static/vendor/codemirror-theme-dracula.min.css +1 -0
  32. janus_agent-1.34.3/janus/gateways/static/vendor/codemirror.min.css +1 -0
  33. janus_agent-1.34.3/janus/gateways/static/vendor/codemirror.min.js +1 -0
  34. janus_agent-1.34.3/janus/gateways/static/vendor/mode-css.min.js +1 -0
  35. janus_agent-1.34.3/janus/gateways/static/vendor/mode-htmlmixed.min.js +1 -0
  36. janus_agent-1.34.3/janus/gateways/static/vendor/mode-javascript.min.js +1 -0
  37. janus_agent-1.34.3/janus/gateways/static/vendor/mode-markdown.min.js +1 -0
  38. janus_agent-1.34.3/janus/gateways/static/vendor/mode-python.min.js +1 -0
  39. janus_agent-1.34.3/janus/gateways/static/vendor/mode-shell.min.js +1 -0
  40. janus_agent-1.34.3/janus/gateways/static/vendor/mode-xml.min.js +1 -0
  41. janus_agent-1.34.3/janus/gateways/static/vendor/mode-yaml.min.js +1 -0
  42. janus_agent-1.34.3/janus/gateways/static/vendor/xterm-addon-fit.min.js +8 -0
  43. janus_agent-1.34.3/janus/gateways/static/vendor/xterm.css +209 -0
  44. janus_agent-1.34.3/janus/gateways/static/vendor/xterm.min.js +8 -0
  45. janus_agent-1.34.3/janus/gateways/telegram.py +1825 -0
  46. janus_agent-1.34.3/janus/gateways/web.py +2808 -0
  47. janus_agent-1.34.3/janus/gateways/web_audit.py +102 -0
  48. janus_agent-1.34.3/janus/gateways/web_auth.py +434 -0
  49. janus_agent-1.34.3/janus/gateways/web_bridge.py +334 -0
  50. janus_agent-1.34.3/janus/gateways/whatsapp.py +480 -0
  51. janus_agent-1.34.3/janus/headless.py +254 -0
  52. janus_agent-1.34.3/janus/hooks.py +247 -0
  53. janus_agent-1.34.3/janus/index.py +247 -0
  54. janus_agent-1.34.3/janus/init_codebase.py +175 -0
  55. janus_agent-1.34.3/janus/injection.py +234 -0
  56. janus_agent-1.34.3/janus/insights.py +375 -0
  57. janus_agent-1.34.3/janus/interpreter.py +138 -0
  58. janus_agent-1.34.3/janus/interview_inferred.py +297 -0
  59. janus_agent-1.34.3/janus/interview_runner.py +159 -0
  60. janus_agent-1.34.3/janus/interviews.py +867 -0
  61. janus_agent-1.34.3/janus/interviews_bundled/__init__.py +5 -0
  62. janus_agent-1.34.3/janus/interviews_bundled/constraint.md +45 -0
  63. janus_agent-1.34.3/janus/interviews_bundled/decision.md +49 -0
  64. janus_agent-1.34.3/janus/interviews_bundled/goal.md +44 -0
  65. janus_agent-1.34.3/janus/interviews_bundled/habit.md +63 -0
  66. janus_agent-1.34.3/janus/interviews_bundled/identity.md +54 -0
  67. janus_agent-1.34.3/janus/interviews_bundled/preference.md +66 -0
  68. janus_agent-1.34.3/janus/interviews_bundled/project.md +49 -0
  69. janus_agent-1.34.3/janus/interviews_bundled/relationship.md +45 -0
  70. janus_agent-1.34.3/janus/llm.py +504 -0
  71. janus_agent-1.34.3/janus/logger.py +57 -0
  72. janus_agent-1.34.3/janus/mcp/__init__.py +32 -0
  73. janus_agent-1.34.3/janus/mcp/client.py +495 -0
  74. janus_agent-1.34.3/janus/memory.py +560 -0
  75. janus_agent-1.34.3/janus/memory_cards.py +339 -0
  76. janus_agent-1.34.3/janus/memory_consolidate.py +353 -0
  77. janus_agent-1.34.3/janus/memory_consolidate_cron.py +216 -0
  78. janus_agent-1.34.3/janus/memory_extract.py +203 -0
  79. janus_agent-1.34.3/janus/memory_index.py +374 -0
  80. janus_agent-1.34.3/janus/memory_migrate.py +142 -0
  81. janus_agent-1.34.3/janus/memory_prune.py +120 -0
  82. janus_agent-1.34.3/janus/memory_recall.py +195 -0
  83. janus_agent-1.34.3/janus/memory_refusal.py +186 -0
  84. janus_agent-1.34.3/janus/memory_state.py +379 -0
  85. janus_agent-1.34.3/janus/memory_sync.py +239 -0
  86. janus_agent-1.34.3/janus/model_fallback.py +148 -0
  87. janus_agent-1.34.3/janus/onboarding.py +497 -0
  88. janus_agent-1.34.3/janus/orchestrator.py +514 -0
  89. janus_agent-1.34.3/janus/output_styles.py +34 -0
  90. janus_agent-1.34.3/janus/permissions.py +319 -0
  91. janus_agent-1.34.3/janus/plan_render.py +369 -0
  92. janus_agent-1.34.3/janus/planner.py +188 -0
  93. janus_agent-1.34.3/janus/project_context.py +140 -0
  94. janus_agent-1.34.3/janus/project_detect.py +241 -0
  95. janus_agent-1.34.3/janus/rate_limit.py +225 -0
  96. janus_agent-1.34.3/janus/read_tracker.py +150 -0
  97. janus_agent-1.34.3/janus/redact.py +253 -0
  98. janus_agent-1.34.3/janus/security.py +59 -0
  99. janus_agent-1.34.3/janus/services.py +398 -0
  100. janus_agent-1.34.3/janus/session_context.py +198 -0
  101. janus_agent-1.34.3/janus/skill_catalog.py +183 -0
  102. janus_agent-1.34.3/janus/skill_evolution.py +336 -0
  103. janus_agent-1.34.3/janus/skill_preprocessing.py +263 -0
  104. janus_agent-1.34.3/janus/skill_proposer.py +635 -0
  105. janus_agent-1.34.3/janus/skills.py +590 -0
  106. janus_agent-1.34.3/janus/skills_bundled/__init__.py +4 -0
  107. janus_agent-1.34.3/janus/skills_bundled/adversarial-self-test.md +59 -0
  108. janus_agent-1.34.3/janus/skills_bundled/agent-orchestrate.md +45 -0
  109. janus_agent-1.34.3/janus/skills_bundled/agent-self-portrait.md +54 -0
  110. janus_agent-1.34.3/janus/skills_bundled/calendar-plan.md +36 -0
  111. janus_agent-1.34.3/janus/skills_bundled/confidence-self-report.md +50 -0
  112. janus_agent-1.34.3/janus/skills_bundled/conversation-fork.md +50 -0
  113. janus_agent-1.34.3/janus/skills_bundled/conversation-grep.md +48 -0
  114. janus_agent-1.34.3/janus/skills_bundled/cost-cartographer.md +46 -0
  115. janus_agent-1.34.3/janus/skills_bundled/creative-audio-gen.md +48 -0
  116. janus_agent-1.34.3/janus/skills_bundled/creative-image-gen.md +47 -0
  117. janus_agent-1.34.3/janus/skills_bundled/creative-pixel-and-ascii.md +42 -0
  118. janus_agent-1.34.3/janus/skills_bundled/creative-video-gen.md +48 -0
  119. janus_agent-1.34.3/janus/skills_bundled/delegate-to-agent.md +53 -0
  120. janus_agent-1.34.3/janus/skills_bundled/dev-diff-narrator.md +47 -0
  121. janus_agent-1.34.3/janus/skills_bundled/dev-flake-hunter.md +53 -0
  122. janus_agent-1.34.3/janus/skills_bundled/devops-orchestrate.md +47 -0
  123. janus_agent-1.34.3/janus/skills_bundled/diagram-author.md +50 -0
  124. janus_agent-1.34.3/janus/skills_bundled/distillation-recorder.md +57 -0
  125. janus_agent-1.34.3/janus/skills_bundled/doc-create.md +39 -0
  126. janus_agent-1.34.3/janus/skills_bundled/domain-recon.md +49 -0
  127. janus_agent-1.34.3/janus/skills_bundled/email-toolkit.md +39 -0
  128. janus_agent-1.34.3/janus/skills_bundled/environment-probe.md +62 -0
  129. janus_agent-1.34.3/janus/skills_bundled/formal-spec-translator.md +62 -0
  130. janus_agent-1.34.3/janus/skills_bundled/gaming-server.md +51 -0
  131. janus_agent-1.34.3/janus/skills_bundled/gh-pr.md +39 -0
  132. janus_agent-1.34.3/janus/skills_bundled/gh-release.md +49 -0
  133. janus_agent-1.34.3/janus/skills_bundled/gh-review.md +44 -0
  134. janus_agent-1.34.3/janus/skills_bundled/gh-triage.md +40 -0
  135. janus_agent-1.34.3/janus/skills_bundled/home-automation.md +42 -0
  136. janus_agent-1.34.3/janus/skills_bundled/hook-author.md +53 -0
  137. janus_agent-1.34.3/janus/skills_bundled/inference-multimodel.md +41 -0
  138. janus_agent-1.34.3/janus/skills_bundled/interpretability-probe.md +63 -0
  139. janus_agent-1.34.3/janus/skills_bundled/jupyter-explore.md +41 -0
  140. janus_agent-1.34.3/janus/skills_bundled/log-bisect.md +46 -0
  141. janus_agent-1.34.3/janus/skills_bundled/macos-system.md +43 -0
  142. janus_agent-1.34.3/janus/skills_bundled/mcp-integration.md +45 -0
  143. janus_agent-1.34.3/janus/skills_bundled/media-gif.md +37 -0
  144. janus_agent-1.34.3/janus/skills_bundled/media-spotify.md +38 -0
  145. janus_agent-1.34.3/janus/skills_bundled/media-youtube.md +41 -0
  146. janus_agent-1.34.3/janus/skills_bundled/memory-archaeologist.md +50 -0
  147. janus_agent-1.34.3/janus/skills_bundled/memory-conflict-resolver.md +48 -0
  148. janus_agent-1.34.3/janus/skills_bundled/mlops-lifecycle.md +53 -0
  149. janus_agent-1.34.3/janus/skills_bundled/multi-model-jury.md +48 -0
  150. janus_agent-1.34.3/janus/skills_bundled/note-capture.md +41 -0
  151. janus_agent-1.34.3/janus/skills_bundled/notes-obsidian.md +45 -0
  152. janus_agent-1.34.3/janus/skills_bundled/pattern-distiller.md +50 -0
  153. janus_agent-1.34.3/janus/skills_bundled/pdf-toolkit.md +48 -0
  154. janus_agent-1.34.3/janus/skills_bundled/prompt-injection-detector.md +50 -0
  155. janus_agent-1.34.3/janus/skills_bundled/provenance-graph.md +51 -0
  156. janus_agent-1.34.3/janus/skills_bundled/qa-exploratory.md +39 -0
  157. janus_agent-1.34.3/janus/skills_bundled/redaction-gateway.md +57 -0
  158. janus_agent-1.34.3/janus/skills_bundled/regression-replay.md +48 -0
  159. janus_agent-1.34.3/janus/skills_bundled/research-literature.md +45 -0
  160. janus_agent-1.34.3/janus/skills_bundled/sandbox-spawner.md +50 -0
  161. janus_agent-1.34.3/janus/skills_bundled/social-post.md +41 -0
  162. janus_agent-1.34.3/janus/skills_bundled/software-engineering.md +54 -0
  163. janus_agent-1.34.3/janus/skills_bundled/synthetic-eval-builder.md +51 -0
  164. janus_agent-1.34.3/janus/skills_bundled/task-decomposer-with-budget.md +46 -0
  165. janus_agent-1.34.3/janus/skills_market.py +215 -0
  166. janus_agent-1.34.3/janus/slash_dispatch.py +337 -0
  167. janus_agent-1.34.3/janus/status_line.py +286 -0
  168. janus_agent-1.34.3/janus/statusline.py +60 -0
  169. janus_agent-1.34.3/janus/streaming.py +210 -0
  170. janus_agent-1.34.3/janus/subagent.py +402 -0
  171. janus_agent-1.34.3/janus/swarms/__init__.py +28 -0
  172. janus_agent-1.34.3/janus/swarms/aggregators.py +223 -0
  173. janus_agent-1.34.3/janus/swarms/budget.py +149 -0
  174. janus_agent-1.34.3/janus/swarms/cancel.py +85 -0
  175. janus_agent-1.34.3/janus/swarms/recursion.py +64 -0
  176. janus_agent-1.34.3/janus/swarms/runner.py +621 -0
  177. janus_agent-1.34.3/janus/swarms/slash.py +203 -0
  178. janus_agent-1.34.3/janus/swarms/spec.py +498 -0
  179. janus_agent-1.34.3/janus/swarms/state.py +247 -0
  180. janus_agent-1.34.3/janus/task_render.py +162 -0
  181. janus_agent-1.34.3/janus/title_generator.py +162 -0
  182. janus_agent-1.34.3/janus/tool_call_recovery.py +213 -0
  183. janus_agent-1.34.3/janus/tool_guardrails.py +317 -0
  184. janus_agent-1.34.3/janus/tools/__init__.py +188 -0
  185. janus_agent-1.34.3/janus/tools/agent.py +889 -0
  186. janus_agent-1.34.3/janus/tools/base.py +226 -0
  187. janus_agent-1.34.3/janus/tools/browser.py +207 -0
  188. janus_agent-1.34.3/janus/tools/capabilities.py +136 -0
  189. janus_agent-1.34.3/janus/tools/clarify.py +127 -0
  190. janus_agent-1.34.3/janus/tools/code_exec.py +175 -0
  191. janus_agent-1.34.3/janus/tools/delegate.py +239 -0
  192. janus_agent-1.34.3/janus/tools/edit.py +119 -0
  193. janus_agent-1.34.3/janus/tools/fs.py +228 -0
  194. janus_agent-1.34.3/janus/tools/gateway_send_file.py +99 -0
  195. janus_agent-1.34.3/janus/tools/glob.py +66 -0
  196. janus_agent-1.34.3/janus/tools/grep.py +132 -0
  197. janus_agent-1.34.3/janus/tools/image_gen.py +250 -0
  198. janus_agent-1.34.3/janus/tools/interview_ask.py +184 -0
  199. janus_agent-1.34.3/janus/tools/memory_search.py +127 -0
  200. janus_agent-1.34.3/janus/tools/multi_edit.py +137 -0
  201. janus_agent-1.34.3/janus/tools/notebook.py +142 -0
  202. janus_agent-1.34.3/janus/tools/plan_mode.py +134 -0
  203. janus_agent-1.34.3/janus/tools/session_search.py +76 -0
  204. janus_agent-1.34.3/janus/tools/shell.py +377 -0
  205. janus_agent-1.34.3/janus/tools/shell_bg.py +564 -0
  206. janus_agent-1.34.3/janus/tools/shell_pty.py +218 -0
  207. janus_agent-1.34.3/janus/tools/ssh_exec.py +252 -0
  208. janus_agent-1.34.3/janus/tools/subagent.py +420 -0
  209. janus_agent-1.34.3/janus/tools/swarm_run.py +144 -0
  210. janus_agent-1.34.3/janus/tools/telegram_react.py +122 -0
  211. janus_agent-1.34.3/janus/tools/telegram_send.py +211 -0
  212. janus_agent-1.34.3/janus/tools/todo.py +108 -0
  213. janus_agent-1.34.3/janus/tools/vision.py +77 -0
  214. janus_agent-1.34.3/janus/tools/web.py +98 -0
  215. janus_agent-1.34.3/janus/tools/web_search.py +95 -0
  216. janus_agent-1.34.3/janus/trajectory.py +222 -0
  217. janus_agent-1.34.3/janus/triggers/__init__.py +11 -0
  218. janus_agent-1.34.3/janus/triggers/base.py +203 -0
  219. janus_agent-1.34.3/janus/triggers/runtime.py +465 -0
  220. janus_agent-1.34.3/janus/tui/__init__.py +45 -0
  221. janus_agent-1.34.3/janus/tui/app.py +524 -0
  222. janus_agent-1.34.3/janus/user_scope.py +144 -0
  223. janus_agent-1.34.3/janus/verification.py +339 -0
  224. janus_agent-1.34.3/janus/web_config.py +268 -0
  225. janus_agent-1.34.3/janus/web_rate_limit.py +206 -0
  226. janus_agent-1.34.3/janus/webhooks.py +216 -0
  227. janus_agent-1.34.3/janus_agent.egg-info/PKG-INFO +570 -0
  228. janus_agent-1.34.3/janus_agent.egg-info/SOURCES.txt +414 -0
  229. janus_agent-1.34.3/janus_agent.egg-info/dependency_links.txt +1 -0
  230. janus_agent-1.34.3/janus_agent.egg-info/entry_points.txt +2 -0
  231. janus_agent-1.34.3/janus_agent.egg-info/requires.txt +32 -0
  232. janus_agent-1.34.3/janus_agent.egg-info/top_level.txt +1 -0
  233. janus_agent-1.34.3/pyproject.toml +95 -0
  234. janus_agent-1.34.3/setup.cfg +4 -0
  235. janus_agent-1.34.3/tests/test_agent_prompt_v152.py +130 -0
  236. janus_agent-1.34.3/tests/test_agent_system_prompt.py +183 -0
  237. janus_agent-1.34.3/tests/test_app_event_stream.py +429 -0
  238. janus_agent-1.34.3/tests/test_approver.py +60 -0
  239. janus_agent-1.34.3/tests/test_approver_args.py +305 -0
  240. janus_agent-1.34.3/tests/test_at_mentions.py +294 -0
  241. janus_agent-1.34.3/tests/test_auto_mode.py +267 -0
  242. janus_agent-1.34.3/tests/test_auto_permissions.py +177 -0
  243. janus_agent-1.34.3/tests/test_auto_ui.py +117 -0
  244. janus_agent-1.34.3/tests/test_branding.py +102 -0
  245. janus_agent-1.34.3/tests/test_capabilities.py +54 -0
  246. janus_agent-1.34.3/tests/test_chatbot_guard.py +409 -0
  247. janus_agent-1.34.3/tests/test_clarify_and_delegate.py +269 -0
  248. janus_agent-1.34.3/tests/test_cli_logo.py +56 -0
  249. janus_agent-1.34.3/tests/test_cli_rich_completer.py +97 -0
  250. janus_agent-1.34.3/tests/test_cli_thinking_indicator.py +105 -0
  251. janus_agent-1.34.3/tests/test_coding_agent_audit.py +400 -0
  252. janus_agent-1.34.3/tests/test_conversation.py +125 -0
  253. janus_agent-1.34.3/tests/test_cost.py +78 -0
  254. janus_agent-1.34.3/tests/test_cost_per_chat.py +107 -0
  255. janus_agent-1.34.3/tests/test_diff_render_rich.py +197 -0
  256. janus_agent-1.34.3/tests/test_eval.py +49 -0
  257. janus_agent-1.34.3/tests/test_eval_drift_budget.py +91 -0
  258. janus_agent-1.34.3/tests/test_executor_chat.py +195 -0
  259. janus_agent-1.34.3/tests/test_executor_injection.py +256 -0
  260. janus_agent-1.34.3/tests/test_fire_uses_chat.py +253 -0
  261. janus_agent-1.34.3/tests/test_gateway_send_file.py +180 -0
  262. janus_agent-1.34.3/tests/test_gateway_web.py +187 -0
  263. janus_agent-1.34.3/tests/test_gateways_common.py +305 -0
  264. janus_agent-1.34.3/tests/test_headless.py +131 -0
  265. janus_agent-1.34.3/tests/test_hooks.py +244 -0
  266. janus_agent-1.34.3/tests/test_hotkeys.py +176 -0
  267. janus_agent-1.34.3/tests/test_index.py +69 -0
  268. janus_agent-1.34.3/tests/test_injection.py +196 -0
  269. janus_agent-1.34.3/tests/test_insights_and_titles.py +242 -0
  270. janus_agent-1.34.3/tests/test_install_services_script.py +126 -0
  271. janus_agent-1.34.3/tests/test_interpreter_identity.py +71 -0
  272. janus_agent-1.34.3/tests/test_interview_ask_tool.py +234 -0
  273. janus_agent-1.34.3/tests/test_interview_inferred.py +273 -0
  274. janus_agent-1.34.3/tests/test_interviews_completion.py +135 -0
  275. janus_agent-1.34.3/tests/test_interviews_drip.py +287 -0
  276. janus_agent-1.34.3/tests/test_interviews_gateway_wires.py +224 -0
  277. janus_agent-1.34.3/tests/test_interviews_parser.py +423 -0
  278. janus_agent-1.34.3/tests/test_interviews_runner.py +318 -0
  279. janus_agent-1.34.3/tests/test_interviews_state.py +397 -0
  280. janus_agent-1.34.3/tests/test_mcp.py +249 -0
  281. janus_agent-1.34.3/tests/test_memory.py +206 -0
  282. janus_agent-1.34.3/tests/test_memory_cards.py +456 -0
  283. janus_agent-1.34.3/tests/test_memory_consolidate.py +159 -0
  284. janus_agent-1.34.3/tests/test_memory_extract.py +448 -0
  285. janus_agent-1.34.3/tests/test_memory_index.py +435 -0
  286. janus_agent-1.34.3/tests/test_memory_migrate.py +213 -0
  287. janus_agent-1.34.3/tests/test_memory_privacy.py +216 -0
  288. janus_agent-1.34.3/tests/test_memory_prune.py +235 -0
  289. janus_agent-1.34.3/tests/test_memory_recall.py +319 -0
  290. janus_agent-1.34.3/tests/test_memory_search_tool.py +200 -0
  291. janus_agent-1.34.3/tests/test_memory_state.py +209 -0
  292. janus_agent-1.34.3/tests/test_memory_ux.py +183 -0
  293. janus_agent-1.34.3/tests/test_no_tools.py +182 -0
  294. janus_agent-1.34.3/tests/test_orchestrator.py +52 -0
  295. janus_agent-1.34.3/tests/test_origin_and_guardrails.py +278 -0
  296. janus_agent-1.34.3/tests/test_permissions.py +131 -0
  297. janus_agent-1.34.3/tests/test_phase12.py +155 -0
  298. janus_agent-1.34.3/tests/test_phase14.py +160 -0
  299. janus_agent-1.34.3/tests/test_phase15.py +192 -0
  300. janus_agent-1.34.3/tests/test_phase18.py +116 -0
  301. janus_agent-1.34.3/tests/test_phase19.py +137 -0
  302. janus_agent-1.34.3/tests/test_phase20.py +119 -0
  303. janus_agent-1.34.3/tests/test_phase9_tools.py +426 -0
  304. janus_agent-1.34.3/tests/test_planner.py +76 -0
  305. janus_agent-1.34.3/tests/test_post_merge_hook.py +163 -0
  306. janus_agent-1.34.3/tests/test_provider_adapters.py +187 -0
  307. janus_agent-1.34.3/tests/test_read_tracker_context.py +195 -0
  308. janus_agent-1.34.3/tests/test_redact_rate_ssh.py +461 -0
  309. janus_agent-1.34.3/tests/test_services.py +267 -0
  310. janus_agent-1.34.3/tests/test_shell_safety.py +145 -0
  311. janus_agent-1.34.3/tests/test_single_user_mode.py +235 -0
  312. janus_agent-1.34.3/tests/test_skill_evolution.py +381 -0
  313. janus_agent-1.34.3/tests/test_skill_preprocess_and_pins.py +327 -0
  314. janus_agent-1.34.3/tests/test_skills.py +95 -0
  315. janus_agent-1.34.3/tests/test_skills_bundled.py +259 -0
  316. janus_agent-1.34.3/tests/test_skills_market.py +130 -0
  317. janus_agent-1.34.3/tests/test_smart_404.py +267 -0
  318. janus_agent-1.34.3/tests/test_step_budget_redesign.py +559 -0
  319. janus_agent-1.34.3/tests/test_subagent.py +415 -0
  320. janus_agent-1.34.3/tests/test_swarm_background.py +321 -0
  321. janus_agent-1.34.3/tests/test_swarm_run_tool.py +263 -0
  322. janus_agent-1.34.3/tests/test_swarm_telegram_ping.py +108 -0
  323. janus_agent-1.34.3/tests/test_swarms_aggregators.py +401 -0
  324. janus_agent-1.34.3/tests/test_swarms_budget.py +422 -0
  325. janus_agent-1.34.3/tests/test_swarms_cancellation.py +449 -0
  326. janus_agent-1.34.3/tests/test_swarms_cli.py +317 -0
  327. janus_agent-1.34.3/tests/test_swarms_hooks.py +396 -0
  328. janus_agent-1.34.3/tests/test_swarms_indicators.py +259 -0
  329. janus_agent-1.34.3/tests/test_swarms_recursion.py +259 -0
  330. janus_agent-1.34.3/tests/test_swarms_retry.py +222 -0
  331. janus_agent-1.34.3/tests/test_swarms_runner.py +516 -0
  332. janus_agent-1.34.3/tests/test_swarms_sequential_phases.py +378 -0
  333. janus_agent-1.34.3/tests/test_swarms_slash.py +242 -0
  334. janus_agent-1.34.3/tests/test_swarms_spec.py +568 -0
  335. janus_agent-1.34.3/tests/test_task_render.py +241 -0
  336. janus_agent-1.34.3/tests/test_telegram_approval_stale.py +264 -0
  337. janus_agent-1.34.3/tests/test_telegram_auto_hint.py +65 -0
  338. janus_agent-1.34.3/tests/test_telegram_chat.py +157 -0
  339. janus_agent-1.34.3/tests/test_telegram_logo.py +38 -0
  340. janus_agent-1.34.3/tests/test_telegram_send_tools.py +315 -0
  341. janus_agent-1.34.3/tests/test_telegram_typing_pulse.py +137 -0
  342. janus_agent-1.34.3/tests/test_telegram_uploads.py +302 -0
  343. janus_agent-1.34.3/tests/test_tool_agent.py +532 -0
  344. janus_agent-1.34.3/tests/test_tool_call_recovery.py +375 -0
  345. janus_agent-1.34.3/tests/test_tool_risk.py +79 -0
  346. janus_agent-1.34.3/tests/test_trajectory_and_onboarding.py +311 -0
  347. janus_agent-1.34.3/tests/test_triggers.py +95 -0
  348. janus_agent-1.34.3/tests/test_tui_app.py +127 -0
  349. janus_agent-1.34.3/tests/test_uninstall.py +225 -0
  350. janus_agent-1.34.3/tests/test_v153_fixes.py +185 -0
  351. janus_agent-1.34.3/tests/test_v1_18_2_fixes.py +265 -0
  352. janus_agent-1.34.3/tests/test_v1_24_0.py +357 -0
  353. janus_agent-1.34.3/tests/test_v1_24_1.py +305 -0
  354. janus_agent-1.34.3/tests/test_v1_24_2_bugs.py +224 -0
  355. janus_agent-1.34.3/tests/test_v1_24_3_locale.py +171 -0
  356. janus_agent-1.34.3/tests/test_v1_24_4.py +283 -0
  357. janus_agent-1.34.3/tests/test_v1_24_5_question_bug.py +233 -0
  358. janus_agent-1.34.3/tests/test_v1_24_6_emoji_box_drawing.py +210 -0
  359. janus_agent-1.34.3/tests/test_v1_24_6_explanation_and_docs.py +183 -0
  360. janus_agent-1.34.3/tests/test_v1_24_6_high_risk_prompt.py +282 -0
  361. janus_agent-1.34.3/tests/test_v1_24_6_memory_refusal.py +230 -0
  362. janus_agent-1.34.3/tests/test_v1_26_0_system_prompt.py +287 -0
  363. janus_agent-1.34.3/tests/test_v1_27_0_subagent.py +781 -0
  364. janus_agent-1.34.3/tests/test_v1_27_1_verification.py +537 -0
  365. janus_agent-1.34.3/tests/test_v1_27_2_plan_render.py +427 -0
  366. janus_agent-1.34.3/tests/test_v1_27_3_resume_picker.py +452 -0
  367. janus_agent-1.34.3/tests/test_v1_28_0_skill_proposer.py +534 -0
  368. janus_agent-1.34.3/tests/test_v1_28_1_auto_offer.py +228 -0
  369. janus_agent-1.34.3/tests/test_v1_28_2_cost_dashboard.py +340 -0
  370. janus_agent-1.34.3/tests/test_v1_28_3_model_fallback.py +395 -0
  371. janus_agent-1.34.3/tests/test_v1_28_4_project_detect.py +348 -0
  372. janus_agent-1.34.3/tests/test_v1_29_0_consolidate_multi_stage.py +374 -0
  373. janus_agent-1.34.3/tests/test_v1_29_1_mcp_catalog.py +519 -0
  374. janus_agent-1.34.3/tests/test_v1_29_2_streaming_fallback.py +315 -0
  375. janus_agent-1.34.3/tests/test_v1_29_3_skill_auto_offer_gateways.py +191 -0
  376. janus_agent-1.34.3/tests/test_v1_29_4_web_mcp_panel.py +145 -0
  377. janus_agent-1.34.3/tests/test_v1_30_0_plan_render_parity.py +365 -0
  378. janus_agent-1.34.3/tests/test_v1_30_1_skill_project_types.py +386 -0
  379. janus_agent-1.34.3/tests/test_v1_30_2_memory_consolidate_cron.py +314 -0
  380. janus_agent-1.34.3/tests/test_v1_31_0_web_skill_proposals.py +303 -0
  381. janus_agent-1.34.3/tests/test_v1_31_10_plan_review_text_reply.py +313 -0
  382. janus_agent-1.34.3/tests/test_v1_31_11_concurrent_updates.py +82 -0
  383. janus_agent-1.34.3/tests/test_v1_31_12_clarify_text_reply.py +159 -0
  384. janus_agent-1.34.3/tests/test_v1_31_13_plan_mode_guidance.py +194 -0
  385. janus_agent-1.34.3/tests/test_v1_31_14_mcp_diagnostics.py +440 -0
  386. janus_agent-1.34.3/tests/test_v1_31_15_web_startup_unbuffered.py +211 -0
  387. janus_agent-1.34.3/tests/test_v1_31_16_banner_mcp_count_and_telegram_quiet.py +275 -0
  388. janus_agent-1.34.3/tests/test_v1_31_17_web_service_unit.py +182 -0
  389. janus_agent-1.34.3/tests/test_v1_31_1_web_cost_charts.py +285 -0
  390. janus_agent-1.34.3/tests/test_v1_31_2_web_grants_panel.py +292 -0
  391. janus_agent-1.34.3/tests/test_v1_31_3_homogeneous_sequence_filter.py +188 -0
  392. janus_agent-1.34.3/tests/test_v1_31_4_file_detector_tool_allowlist.py +209 -0
  393. janus_agent-1.34.3/tests/test_v1_31_5_plan_review_production_path.py +377 -0
  394. janus_agent-1.34.3/tests/test_v1_31_6_status_line_pause_during_prompt.py +270 -0
  395. janus_agent-1.34.3/tests/test_v1_31_7_telegram_parse_mode.py +206 -0
  396. janus_agent-1.34.3/tests/test_v1_31_8_telegram_logging.py +204 -0
  397. janus_agent-1.34.3/tests/test_v1_32_0_pypi_publish_workflow.py +216 -0
  398. janus_agent-1.34.3/tests/test_v1_32_1_docker_image.py +226 -0
  399. janus_agent-1.34.3/tests/test_v1_32_2_one_line_installer.py +214 -0
  400. janus_agent-1.34.3/tests/test_v1_32_3_onboard_autodetect.py +249 -0
  401. janus_agent-1.34.3/tests/test_v1_32_4_tutorials.py +188 -0
  402. janus_agent-1.34.3/tests/test_v1_32_5_readme_outsiders.py +174 -0
  403. janus_agent-1.34.3/tests/test_v1_33_0_web_config_proxy.py +266 -0
  404. janus_agent-1.34.3/tests/test_v1_33_1_backup_restore.py +253 -0
  405. janus_agent-1.34.3/tests/test_v1_33_2_health_endpoint.py +168 -0
  406. janus_agent-1.34.3/tests/test_v1_33_3_rate_limiting.py +249 -0
  407. janus_agent-1.34.3/tests/test_v1_33_4_user_scope.py +269 -0
  408. janus_agent-1.34.3/tests/test_v1_33_5_audit_log.py +242 -0
  409. janus_agent-1.34.3/tests/test_v1_34_0_webhook_endpoint.py +295 -0
  410. janus_agent-1.34.3/tests/test_v1_34_1_memory_sync.py +264 -0
  411. janus_agent-1.34.3/tests/test_v1_34_2_image_gen_tool.py +202 -0
  412. janus_agent-1.34.3/tests/test_web_auth.py +350 -0
  413. janus_agent-1.34.3/tests/test_web_bridge.py +272 -0
  414. janus_agent-1.34.3/tests/test_web_security_regress.py +180 -0
  415. janus_agent-1.34.3/tests/test_web_v1_22_endpoints.py +340 -0
  416. janus_agent-1.34.3/tests/test_web_v1_22_panels.py +325 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Sam (samalgotrader7@gmail.com)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,570 @@
1
+ Metadata-Version: 2.4
2
+ Name: janus-agent
3
+ Version: 1.34.3
4
+ Summary: Claude Code's UX, on any model, with plain-text state and a learning loop.
5
+ Author: Sam
6
+ License: MIT
7
+ Project-URL: Source, https://github.com/samalgotrader7-ops/janus
8
+ Project-URL: Issues, https://github.com/samalgotrader7-ops/janus/issues
9
+ Keywords: agent,llm,cli,local-first,safety
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Operating System :: OS Independent
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Topic :: Software Development
18
+ Requires-Python: >=3.10
19
+ Description-Content-Type: text/markdown
20
+ License-File: LICENSE
21
+ Requires-Dist: requests>=2.31
22
+ Provides-Extra: rich
23
+ Requires-Dist: prompt_toolkit>=3.0; extra == "rich"
24
+ Requires-Dist: rich>=13.0; extra == "rich"
25
+ Provides-Extra: tui
26
+ Requires-Dist: textual>=0.50; extra == "tui"
27
+ Provides-Extra: web
28
+ Requires-Dist: fastapi>=0.110; extra == "web"
29
+ Requires-Dist: uvicorn>=0.27; extra == "web"
30
+ Provides-Extra: browser
31
+ Requires-Dist: playwright>=1.40; extra == "browser"
32
+ Provides-Extra: telegram
33
+ Requires-Dist: python-telegram-bot>=20; extra == "telegram"
34
+ Provides-Extra: whatsapp
35
+ Provides-Extra: test
36
+ Requires-Dist: pytest>=8.0; extra == "test"
37
+ Provides-Extra: all
38
+ Requires-Dist: prompt_toolkit>=3.0; extra == "all"
39
+ Requires-Dist: rich>=13.0; extra == "all"
40
+ Requires-Dist: fastapi>=0.110; extra == "all"
41
+ Requires-Dist: uvicorn>=0.27; extra == "all"
42
+ Requires-Dist: playwright>=1.40; extra == "all"
43
+ Requires-Dist: python-telegram-bot>=20; extra == "all"
44
+ Requires-Dist: textual>=0.50; extra == "all"
45
+ Dynamic: license-file
46
+
47
+ <div align="center">
48
+
49
+ # Janus
50
+
51
+ **Claude Code's UX, on any model, with plain-text state and a learning loop.**
52
+
53
+ </div>
54
+
55
+ Janus is a local AI agent that talks to you the way Claude Code does —
56
+ streaming responses, inline tool calls, permission modes you set and
57
+ forget — but runs against any OpenAI-compatible model (Anthropic,
58
+ OpenRouter, Ollama, OpenAI, llama.cpp, …). Memory, skills, hooks, and
59
+ every interaction live as plain-text files under `~/.janus/` that you
60
+ can `cat`, `grep`, version-control, or hand-edit.
61
+
62
+ What makes it useful:
63
+
64
+ - **Model-agnostic.** Swap providers with one env var. No vendor lock-in.
65
+ - **Plain-text everywhere.** Memory is markdown, conversations are JSON,
66
+ the audit log is JSONL. No opaque database.
67
+ - **Skills you teach it.** Durable workflows land as `quarantined`
68
+ markdown files; you `/promote` them to trusted state when ready.
69
+ - **Permission modes copied from Claude Code.** `default` /
70
+ `acceptEdits` / `plan` / `bypassPermissions`, switchable mid-session
71
+ with `/mode`.
72
+ - **Self-hostable.** No cloud dependencies. No SaaS user model.
73
+
74
+ ---
75
+
76
+ ## 60-second quickstart
77
+
78
+ ```bash
79
+ # 1. Install (Linux / macOS — requires Python 3.10+)
80
+ curl -sSL https://raw.githubusercontent.com/samalgotrader7-ops/janus/main/scripts/install.sh | sh
81
+
82
+ # 2. Configure (interactive — picks up existing OPENAI_API_KEY etc.)
83
+ janus onboard
84
+
85
+ # 3. Chat
86
+ janus
87
+ ```
88
+
89
+ That's it. You'll see a streaming chat with inline tool calls and a
90
+ permission prompt for any side effect.
91
+
92
+ > **Want a deeper walkthrough?** Four progressive tutorials in
93
+ > [`docs/tutorials/`](docs/tutorials/) cover skills, memory, and MCP
94
+ > integration — each one screenful, ~10 minutes each.
95
+
96
+ > **Want to deploy on a VPS?**
97
+ > [`scripts/install_services.sh`](scripts/install_services.sh) installs
98
+ > systemd units for `telegram` + `web` + `daemon` with auto-restart on
99
+ > `git pull`. See [Production deployment](#production-deployment) below.
100
+
101
+ ---
102
+
103
+ ## Table of contents
104
+
105
+ - [Why Janus](#why-janus)
106
+ - [Install](#install)
107
+ - [Configure](#configure)
108
+ - [Quickstart](#quickstart)
109
+ - [Tutorials](#tutorials)
110
+ - [Production deployment](#production-deployment)
111
+ - [Permission modes](#permission-modes)
112
+ - [Updating](#updating)
113
+ - [Slash commands](#slash-commands)
114
+ - [Architecture](#architecture)
115
+ - [Where state lives](#where-state-lives)
116
+ - [Testing](#testing)
117
+ - [Documentation](#documentation)
118
+ - [License](#license)
119
+
120
+ ---
121
+
122
+ ## Why Janus
123
+
124
+ | | Janus | Claude Code | Typical agent CLI |
125
+ |---|---|---|---|
126
+ | **Model** | Any OpenAI-compatible | Anthropic only | Provider-locked |
127
+ | **State** | Plain text under `~/.janus/` (cat, grep, git) | Opaque | Database-backed |
128
+ | **Permission modes** | `default` / `acceptEdits` / `plan` / `bypass` | Same | Coarse "yolo / ask" |
129
+ | **Skills** | Markdown files; quarantined → user `/promote`s | None first-class | Auto-evolve, hard to roll back |
130
+ | **Memory** | Plain `user.md` + diff propose + manual approve | None first-class | Opaque embeddings |
131
+ | **Logs** | Every turn → `~/.janus/log.jsonl`, FTS5-indexed | n/a | Best-effort |
132
+ | **Model-call path** | ~50 lines of `requests`, no SDK | n/a | litellm / openai-python |
133
+ | **Self-hostable** | Yes | No | Varies |
134
+
135
+ If you want Claude Code's ergonomics without Anthropic lock-in, with
136
+ state you can audit and a skill system you actually control, Janus is
137
+ for you.
138
+
139
+ ---
140
+
141
+ ## Install
142
+
143
+ Janus runs on **Windows, macOS, and Linux** with Python ≥ 3.10. The core
144
+ install is one dependency (`requests`) — everything else is opt-in.
145
+
146
+ ### Easiest — one-line installer (Linux / macOS)
147
+
148
+ ```bash
149
+ curl -sSL https://raw.githubusercontent.com/samalgotrader7-ops/janus/main/scripts/install.sh | sh
150
+ ```
151
+
152
+ Detects your platform, installs `pipx` if missing, pulls Janus from
153
+ PyPI (or git+URL fallback), and prints next-step instructions. Handles
154
+ PEP 668 (`--break-system-packages`) on recent Debian / Ubuntu.
155
+
156
+ ### Docker (any platform)
157
+
158
+ ```bash
159
+ # Standalone
160
+ docker run --rm -it -p 8765:8765 \
161
+ -v janus-data:/root/.janus \
162
+ --env-file .env \
163
+ ghcr.io/samalgotrader7-ops/janus:latest web
164
+
165
+ # Three-service stack (web + telegram + daemon)
166
+ git clone https://github.com/samalgotrader7-ops/janus.git
167
+ cd janus
168
+ cp .env.example .env # fill in your keys
169
+ docker compose up -d
170
+ ```
171
+
172
+ ### From source (for contributors)
173
+
174
+ #### 1. Clone
175
+
176
+ ```bash
177
+ git clone https://github.com/samalgotrader7-ops/janus.git
178
+ cd janus
179
+ ```
180
+
181
+ #### 2. Create a virtual environment
182
+
183
+ <details>
184
+ <summary><b>Windows (PowerShell)</b></summary>
185
+
186
+ ```powershell
187
+ python -m venv .venv
188
+ .\.venv\Scripts\Activate.ps1
189
+ ```
190
+
191
+ If activation is blocked: `Set-ExecutionPolicy -Scope CurrentUser RemoteSigned`.
192
+ </details>
193
+
194
+ <details>
195
+ <summary><b>macOS / Linux</b></summary>
196
+
197
+ ```bash
198
+ python3 -m venv .venv
199
+ source .venv/bin/activate
200
+ ```
201
+ </details>
202
+
203
+ #### 3. Install
204
+
205
+ ##### Option A — pipx (recommended on Linux & macOS)
206
+
207
+ `pipx` puts `janus` on your PATH globally without needing to activate a
208
+ venv each shell. This is the durable install for servers and dev boxes.
209
+
210
+ ```bash
211
+ sudo apt install -y pipx # Ubuntu / Debian
212
+ # or: brew install pipx # macOS
213
+ pipx ensurepath # adds ~/.local/bin to PATH (once)
214
+
215
+ pipx install -e ".[rich]" # editable install + rich TUI
216
+ ```
217
+
218
+ To later switch extras: `pipx uninstall janus-agent && pipx install -e ".[all]"`.
219
+
220
+ ##### Option B — pip in a venv (works everywhere)
221
+
222
+ ```bash
223
+ pip install -e . # core only (just `requests`)
224
+ pip install -e ".[rich]" # + polished TUI (recommended)
225
+ pip install -e ".[web]" # + local web UI
226
+ pip install -e ".[browser]" # + headless Chromium tools
227
+ pip install -e ".[all]" # everything
228
+ ```
229
+
230
+ After install, `janus` is on your PATH **as long as the venv is
231
+ activated**. Open a new shell and you'll need to `source .venv/bin/activate`
232
+ again, or use Option A above.
233
+
234
+ #### 4. Smoke test
235
+
236
+ ```bash
237
+ janus --version # janus 1.1
238
+ janus --logo # prints the bifurcation logo
239
+ janus --help # subcommands and flags
240
+ janus --doctor # config + environment diagnostics
241
+ ```
242
+
243
+ ---
244
+
245
+ ## Configure
246
+
247
+ Copy the example env file and fill in your provider key:
248
+
249
+ <details>
250
+ <summary><b>Windows (PowerShell)</b></summary>
251
+
252
+ ```powershell
253
+ Copy-Item .env.example .env
254
+ notepad .env
255
+ ```
256
+ </details>
257
+
258
+ <details>
259
+ <summary><b>macOS / Linux</b></summary>
260
+
261
+ ```bash
262
+ cp .env.example .env
263
+ $EDITOR .env
264
+ ```
265
+ </details>
266
+
267
+ Janus auto-loads `.env` from the current working directory, then falls
268
+ back to `~/.janus/.env`. Existing shell exports always win.
269
+
270
+ | Variable | Required | Default | Notes |
271
+ |---|---|---|---|
272
+ | `JANUS_API_KEY` | ✅ | — | Provider key (OpenRouter, Anthropic, OpenAI, …) |
273
+ | `JANUS_API_BASE` | | `https://openrouter.ai/api/v1` | Override for direct providers |
274
+ | `JANUS_MODEL` | | `openai/gpt-4o-mini` | Any chat model the base supports |
275
+ | `JANUS_WORKSPACE` | | current directory | Pin so fs/shell tools can't escape |
276
+ | `JANUS_MEMORY_MODEL` | | same as `JANUS_MODEL` | Cheaper model for the memory-diff loop |
277
+ | `JANUS_BRAVE_API_KEY` | | — | Web search (free key at brave.com) |
278
+ | `JANUS_TELEGRAM_TOKEN` | | — | Telegram gateway |
279
+ | `JANUS_WHATSAPP_*` | | — | WhatsApp Cloud API webhook |
280
+
281
+ Full reference: [`.env.example`](.env.example).
282
+
283
+ ---
284
+
285
+ ## Quickstart
286
+
287
+ ```bash
288
+ janus # interactive REPL (rich TUI if installed)
289
+ janus --basic # plain input() loop
290
+ janus -p "summarise the readme" # headless, single-shot
291
+
292
+ janus web # local web UI on http://127.0.0.1:8765
293
+ janus daemon # proactive trigger daemon
294
+ janus telegram # Telegram bot
295
+ janus whatsapp # WhatsApp webhook
296
+
297
+ janus --eval --last 20 # replay recent turns at temp=0
298
+ janus --analyze # log statistics
299
+ janus --resume <id> # resume a saved conversation
300
+ janus --continue # continue the most recent one
301
+ ```
302
+
303
+ A typical session:
304
+
305
+ ```
306
+ › refactor janus/cli_rich.py to extract the dispatcher into its own module
307
+
308
+ I'll start by reading the current cli_rich.py to see what's in the
309
+ dispatcher.
310
+
311
+ → fs_read(path=janus/cli_rich.py)
312
+ ✓ 1209 lines
313
+
314
+ The dispatcher is roughly 280 lines (_dispatch + helpers). I'll move it to
315
+ janus/dispatcher.py and re-export. Approve the new file?
316
+
317
+ ⚠ approval needed: fs_write: create (risk=write, mode=default)
318
+ create janus/dispatcher.py (8412 bytes)
319
+ --- proposed contents ---
320
+ ...
321
+
322
+ approve? [y/N]: y
323
+ ```
324
+
325
+ No interpretation picker — just chat with tool calls inline, gated by
326
+ the active permission mode. Use `/why` if you want the model to surface
327
+ 2–3 alternative readings of a message before acting.
328
+
329
+ ---
330
+
331
+ ## Tutorials
332
+
333
+ Four progressive walkthroughs in [`docs/tutorials/`](docs/tutorials/),
334
+ each one screenful (~10 minutes):
335
+
336
+ 1. **[Hello, Janus](docs/tutorials/01-hello-janus.md)** — install,
337
+ configure a model, first turn.
338
+ 2. **[Your First Skill](docs/tutorials/02-your-first-skill.md)** —
339
+ write a skill, see it auto-load, `/promote` it.
340
+ 3. **[Memory Loop](docs/tutorials/03-memory-loop.md)** — memory
341
+ proposals, review, hygiene.
342
+ 4. **[Connect MCP](docs/tutorials/04-connect-mcp.md)** — configure a
343
+ stdio MCP server, list tools, call them through Janus.
344
+
345
+ ---
346
+
347
+ ## Production deployment
348
+
349
+ For VPS / always-on deployments, the **systemd path** is recommended:
350
+
351
+ ```bash
352
+ # On the VPS (after one-line install):
353
+ git clone https://github.com/samalgotrader7-ops/janus.git /opt/janus
354
+ cd /opt/janus
355
+
356
+ # Set required env vars in your shell, then:
357
+ bash scripts/install_services.sh
358
+ ```
359
+
360
+ What this gets you:
361
+
362
+ - Three systemd user-units: `janus-telegram`, `janus-web`,
363
+ `janus-daemon` — each with auto-restart on failure.
364
+ - `~/.janus/.env` written with `chmod 600` from your shell env.
365
+ - `loginctl enable-linger` so units survive SSH logout.
366
+ - `git config core.hooksPath scripts/git-hooks` so `git pull` auto-
367
+ restarts services when `janus/*.py` changes.
368
+ - Bypass with `JANUS_NO_AUTO_RESTART=1 git pull`.
369
+
370
+ For Docker, see `docker-compose.yml` (three services share one named
371
+ volume `janus-data`).
372
+
373
+ ---
374
+
375
+ ## Permission modes
376
+
377
+ Copied from Claude Code so muscle memory transfers. Switch with
378
+ `/mode <name>` or set `JANUS_APPROVAL` in `.env`. The decision matrix:
379
+
380
+ | mode | read | write | exec |
381
+ |---|---|---|---|
382
+ | `default` | allow | ask | ask |
383
+ | `acceptEdits` | allow | allow | ask |
384
+ | `plan` | allow | **DENY** | **DENY** |
385
+ | `bypassPermissions` | allow | allow | allow |
386
+
387
+ - **default** — start here. The model can read freely, asks before
388
+ writing files or running commands.
389
+ - **acceptEdits** — for trusted refactors when you don't want to babysit
390
+ every diff. Shell commands still ask.
391
+ - **plan** — read-only thinking. The model can browse the codebase and
392
+ propose a plan; nothing mutates. Switch to `default` when ready to act.
393
+ - **bypassPermissions** — fully autonomous. Use only in throwaway
394
+ workspaces.
395
+
396
+ Skills can grant capability tokens (e.g. `shell.exec: ["git *"]`) that
397
+ short-circuit the prompt for narrow targets without flipping the whole
398
+ session into bypass.
399
+
400
+ ---
401
+
402
+ ## Updating
403
+
404
+ Janus follows simple SemVer tags (`v0.13.0`, `v0.14.0`, …). Pull the
405
+ latest tag and reinstall in place:
406
+
407
+ ```bash
408
+ cd /path/to/janus
409
+ git pull --tags
410
+ janus --version # confirm the new version
411
+ ```
412
+
413
+ Then **reinstall** so the new code is picked up:
414
+
415
+ ```bash
416
+ # If installed via pipx:
417
+ pipx reinstall janus-agent
418
+
419
+ # If installed via pip in a venv:
420
+ source .venv/bin/activate
421
+ pip install -e ".[rich]" --upgrade
422
+ ```
423
+
424
+ To pin to a specific release:
425
+
426
+ ```bash
427
+ git checkout v0.13.0
428
+ pipx reinstall janus-agent # or: pip install -e ".[rich]" --upgrade
429
+ ```
430
+
431
+ ---
432
+
433
+ ## Slash commands
434
+
435
+ Type `/` in the REPL to open the dropdown. All commands carry inline
436
+ descriptions; the menu is grouped by source (built-in vs. user-defined).
437
+
438
+ | Command | Purpose |
439
+ |---|---|
440
+ | `/mode [name]` | Switch permission mode: `default` / `acceptEdits` / `plan` / `bypassPermissions` |
441
+ | `/why` | Re-interpret your last message and show 2–3 candidate readings |
442
+ | `/workspace [path]` | Show or change the active workspace directory |
443
+ | `/analyze` | Scan the workspace for tools, skills, project hints |
444
+ | `/memory` | Show the `user.md` memory file |
445
+ | `/search <query>` | Search prior interactions in the FTS5 log index |
446
+ | `/skills` | List installed skills with state and trust score |
447
+ | `/promote <name> <state>` | Promote a quarantined skill to a trusted state |
448
+ | `/skill new \| review \| import` | Skill authoring |
449
+ | `/cost` | Token + cost summary for this session |
450
+ | `/clear` | Clear conversation turns and cost counters |
451
+ | `/compact` | Summarize and prune older turns |
452
+ | `/resume <id>` / `/continue` | Conversation continuity |
453
+ | `/verbose` / `/stream` | Toggle verbose tool args / token streaming |
454
+ | `/init` | Scan codebase and propose starter `user.md` + skills |
455
+ | `/model [id]` | Show or set the model for this session |
456
+ | `/doctor` | Run diagnostics on configuration and environment |
457
+ | `/output-style` | Switch output rendering (markdown / plain / json / …) |
458
+ | `/commands` | List user-defined slash commands |
459
+ | `/eval [--last N] [--skill <name>]` | Replay last N turns at temp=0 (drift check) |
460
+ | `/mcp list \| connect \| disconnect` | Manage MCP servers |
461
+ | `/triggers` | List configured triggers |
462
+ | `/help` | Full grouped command list |
463
+ | `/quit` | Exit |
464
+
465
+ You can author your own commands as plain markdown files with optional
466
+ frontmatter — drop them in `~/.janus/commands/` (global) or
467
+ `<workspace>/.janus/commands/` (per-project):
468
+
469
+ ```markdown
470
+ ---
471
+ name: refactor
472
+ description: rewrite the supplied snippet for clarity
473
+ ---
474
+
475
+ Refactor this code:
476
+
477
+ {args}
478
+ ```
479
+
480
+ ---
481
+
482
+ ## Architecture
483
+
484
+ ```
485
+ user types
486
+
487
+
488
+ slash command? handle and continue
489
+
490
+
491
+ skills.match() → trusted-auto skill attaches (if any)
492
+
493
+
494
+ executor.chat(messages, user_input, tools, approver, mode, …)
495
+
496
+
497
+ loop:
498
+ llm.chat_stream(messages, tools=registry.schemas())
499
+ if tool_calls:
500
+ for each call:
501
+ hooks.fire(PreToolUse) → maybe deny
502
+ tools.call() → approver(action, details, risk=…, capability=(…))
503
+ → permissions.decide(risk, mode) → allow / ask / deny
504
+ hooks.fire(PostToolUse)
505
+ append tool result
506
+ else:
507
+ final text → return
508
+
509
+
510
+ cost.record() · conversation.add_turn() · skill.record_run()
511
+ memory.propose_diff() · logger.write()
512
+ ```
513
+
514
+ The legacy interpretation-gated flow is preserved on `/why` for users
515
+ who want to inspect ambiguity before acting.
516
+
517
+ ---
518
+
519
+ ## Where state lives
520
+
521
+ Everything Janus learns about you lives under `~/.janus/`, in plain
522
+ files you can open in any text editor:
523
+
524
+ ```
525
+ ~/.janus/
526
+ ├── log.jsonl every interaction (append-only)
527
+ ├── sessions.db SQLite FTS5 index over log.jsonl
528
+ ├── user.md plain-text user model
529
+ ├── skills/<name>.md installed skills
530
+ ├── conversations/<id>.json resumable conversations
531
+ ├── triggers/<name>.yaml proactive triggers
532
+ ├── hooks/<event>.<order>.json lifecycle hooks
533
+ ├── mcp/servers.json MCP server registry
534
+ ├── commands/<name>.md custom slash commands
535
+ ├── evals/run-<ts>.json eval reports
536
+ └── demo/phase_<N>.md per-phase demo records
537
+ ```
538
+
539
+ Inspect, diff, version-control, or hand-edit any of it. There is no
540
+ opaque database.
541
+
542
+ ---
543
+
544
+ ## Testing
545
+
546
+ ```bash
547
+ pip install -e ".[test]"
548
+ pytest tests/ -q
549
+ ```
550
+
551
+ The suite is fast (~12 s for 401 tests as of v1.1) and uses no network
552
+ or LLM calls — `fake_llm` and `janus_home` fixtures isolate every run.
553
+
554
+ ---
555
+
556
+ ## Documentation
557
+
558
+ | Doc | What it covers |
559
+ |---|---|
560
+ | [`docs/JANUS_MASTER_SPEC.md`](docs/JANUS_MASTER_SPEC.md) | The design contract |
561
+ | [`docs/BUILD_GUIDE_FOR_CLAUDE_CODE.md`](docs/BUILD_GUIDE_FOR_CLAUDE_CODE.md) | The operational contract — read before contributing |
562
+ | [`docs/HERMES_AUDIT.md`](docs/HERMES_AUDIT.md) | Competitive thesis + why each safety primitive exists |
563
+ | [`docs/PHASE_2_3_DESIGN.md`](docs/PHASE_2_3_DESIGN.md) | Original design rationale for memory + skills |
564
+ | [`CLAUDE.md`](CLAUDE.md) | Onboarding for AI assistants working in this repo |
565
+
566
+ ---
567
+
568
+ ## License
569
+
570
+ [MIT](LICENSE) © 2026 Sam.