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.
- janus_agent-1.34.3/LICENSE +21 -0
- janus_agent-1.34.3/PKG-INFO +570 -0
- janus_agent-1.34.3/README.md +524 -0
- janus_agent-1.34.3/janus/__init__.py +3 -0
- janus_agent-1.34.3/janus/__main__.py +1288 -0
- janus_agent-1.34.3/janus/app.py +340 -0
- janus_agent-1.34.3/janus/at_mentions.py +246 -0
- janus_agent-1.34.3/janus/audit_log.py +220 -0
- janus_agent-1.34.3/janus/auto_mode.py +391 -0
- janus_agent-1.34.3/janus/backup.py +267 -0
- janus_agent-1.34.3/janus/branding.py +317 -0
- janus_agent-1.34.3/janus/cache.py +73 -0
- janus_agent-1.34.3/janus/cli.py +1785 -0
- janus_agent-1.34.3/janus/cli_rich.py +3201 -0
- janus_agent-1.34.3/janus/commands.py +99 -0
- janus_agent-1.34.3/janus/config.py +318 -0
- janus_agent-1.34.3/janus/conversation.py +432 -0
- janus_agent-1.34.3/janus/cost.py +666 -0
- janus_agent-1.34.3/janus/diff.py +146 -0
- janus_agent-1.34.3/janus/doctor.py +232 -0
- janus_agent-1.34.3/janus/eval.py +231 -0
- janus_agent-1.34.3/janus/executor.py +1341 -0
- janus_agent-1.34.3/janus/gateways/__init__.py +1 -0
- janus_agent-1.34.3/janus/gateways/_common.py +680 -0
- janus_agent-1.34.3/janus/gateways/static/app.css +681 -0
- janus_agent-1.34.3/janus/gateways/static/app.js +1777 -0
- janus_agent-1.34.3/janus/gateways/static/index.html +384 -0
- janus_agent-1.34.3/janus/gateways/static/login.html +32 -0
- janus_agent-1.34.3/janus/gateways/static/vendor/cm-closebrackets.min.js +1 -0
- janus_agent-1.34.3/janus/gateways/static/vendor/cm-matchbrackets.min.js +1 -0
- janus_agent-1.34.3/janus/gateways/static/vendor/codemirror-theme-dracula.min.css +1 -0
- janus_agent-1.34.3/janus/gateways/static/vendor/codemirror.min.css +1 -0
- janus_agent-1.34.3/janus/gateways/static/vendor/codemirror.min.js +1 -0
- janus_agent-1.34.3/janus/gateways/static/vendor/mode-css.min.js +1 -0
- janus_agent-1.34.3/janus/gateways/static/vendor/mode-htmlmixed.min.js +1 -0
- janus_agent-1.34.3/janus/gateways/static/vendor/mode-javascript.min.js +1 -0
- janus_agent-1.34.3/janus/gateways/static/vendor/mode-markdown.min.js +1 -0
- janus_agent-1.34.3/janus/gateways/static/vendor/mode-python.min.js +1 -0
- janus_agent-1.34.3/janus/gateways/static/vendor/mode-shell.min.js +1 -0
- janus_agent-1.34.3/janus/gateways/static/vendor/mode-xml.min.js +1 -0
- janus_agent-1.34.3/janus/gateways/static/vendor/mode-yaml.min.js +1 -0
- janus_agent-1.34.3/janus/gateways/static/vendor/xterm-addon-fit.min.js +8 -0
- janus_agent-1.34.3/janus/gateways/static/vendor/xterm.css +209 -0
- janus_agent-1.34.3/janus/gateways/static/vendor/xterm.min.js +8 -0
- janus_agent-1.34.3/janus/gateways/telegram.py +1825 -0
- janus_agent-1.34.3/janus/gateways/web.py +2808 -0
- janus_agent-1.34.3/janus/gateways/web_audit.py +102 -0
- janus_agent-1.34.3/janus/gateways/web_auth.py +434 -0
- janus_agent-1.34.3/janus/gateways/web_bridge.py +334 -0
- janus_agent-1.34.3/janus/gateways/whatsapp.py +480 -0
- janus_agent-1.34.3/janus/headless.py +254 -0
- janus_agent-1.34.3/janus/hooks.py +247 -0
- janus_agent-1.34.3/janus/index.py +247 -0
- janus_agent-1.34.3/janus/init_codebase.py +175 -0
- janus_agent-1.34.3/janus/injection.py +234 -0
- janus_agent-1.34.3/janus/insights.py +375 -0
- janus_agent-1.34.3/janus/interpreter.py +138 -0
- janus_agent-1.34.3/janus/interview_inferred.py +297 -0
- janus_agent-1.34.3/janus/interview_runner.py +159 -0
- janus_agent-1.34.3/janus/interviews.py +867 -0
- janus_agent-1.34.3/janus/interviews_bundled/__init__.py +5 -0
- janus_agent-1.34.3/janus/interviews_bundled/constraint.md +45 -0
- janus_agent-1.34.3/janus/interviews_bundled/decision.md +49 -0
- janus_agent-1.34.3/janus/interviews_bundled/goal.md +44 -0
- janus_agent-1.34.3/janus/interviews_bundled/habit.md +63 -0
- janus_agent-1.34.3/janus/interviews_bundled/identity.md +54 -0
- janus_agent-1.34.3/janus/interviews_bundled/preference.md +66 -0
- janus_agent-1.34.3/janus/interviews_bundled/project.md +49 -0
- janus_agent-1.34.3/janus/interviews_bundled/relationship.md +45 -0
- janus_agent-1.34.3/janus/llm.py +504 -0
- janus_agent-1.34.3/janus/logger.py +57 -0
- janus_agent-1.34.3/janus/mcp/__init__.py +32 -0
- janus_agent-1.34.3/janus/mcp/client.py +495 -0
- janus_agent-1.34.3/janus/memory.py +560 -0
- janus_agent-1.34.3/janus/memory_cards.py +339 -0
- janus_agent-1.34.3/janus/memory_consolidate.py +353 -0
- janus_agent-1.34.3/janus/memory_consolidate_cron.py +216 -0
- janus_agent-1.34.3/janus/memory_extract.py +203 -0
- janus_agent-1.34.3/janus/memory_index.py +374 -0
- janus_agent-1.34.3/janus/memory_migrate.py +142 -0
- janus_agent-1.34.3/janus/memory_prune.py +120 -0
- janus_agent-1.34.3/janus/memory_recall.py +195 -0
- janus_agent-1.34.3/janus/memory_refusal.py +186 -0
- janus_agent-1.34.3/janus/memory_state.py +379 -0
- janus_agent-1.34.3/janus/memory_sync.py +239 -0
- janus_agent-1.34.3/janus/model_fallback.py +148 -0
- janus_agent-1.34.3/janus/onboarding.py +497 -0
- janus_agent-1.34.3/janus/orchestrator.py +514 -0
- janus_agent-1.34.3/janus/output_styles.py +34 -0
- janus_agent-1.34.3/janus/permissions.py +319 -0
- janus_agent-1.34.3/janus/plan_render.py +369 -0
- janus_agent-1.34.3/janus/planner.py +188 -0
- janus_agent-1.34.3/janus/project_context.py +140 -0
- janus_agent-1.34.3/janus/project_detect.py +241 -0
- janus_agent-1.34.3/janus/rate_limit.py +225 -0
- janus_agent-1.34.3/janus/read_tracker.py +150 -0
- janus_agent-1.34.3/janus/redact.py +253 -0
- janus_agent-1.34.3/janus/security.py +59 -0
- janus_agent-1.34.3/janus/services.py +398 -0
- janus_agent-1.34.3/janus/session_context.py +198 -0
- janus_agent-1.34.3/janus/skill_catalog.py +183 -0
- janus_agent-1.34.3/janus/skill_evolution.py +336 -0
- janus_agent-1.34.3/janus/skill_preprocessing.py +263 -0
- janus_agent-1.34.3/janus/skill_proposer.py +635 -0
- janus_agent-1.34.3/janus/skills.py +590 -0
- janus_agent-1.34.3/janus/skills_bundled/__init__.py +4 -0
- janus_agent-1.34.3/janus/skills_bundled/adversarial-self-test.md +59 -0
- janus_agent-1.34.3/janus/skills_bundled/agent-orchestrate.md +45 -0
- janus_agent-1.34.3/janus/skills_bundled/agent-self-portrait.md +54 -0
- janus_agent-1.34.3/janus/skills_bundled/calendar-plan.md +36 -0
- janus_agent-1.34.3/janus/skills_bundled/confidence-self-report.md +50 -0
- janus_agent-1.34.3/janus/skills_bundled/conversation-fork.md +50 -0
- janus_agent-1.34.3/janus/skills_bundled/conversation-grep.md +48 -0
- janus_agent-1.34.3/janus/skills_bundled/cost-cartographer.md +46 -0
- janus_agent-1.34.3/janus/skills_bundled/creative-audio-gen.md +48 -0
- janus_agent-1.34.3/janus/skills_bundled/creative-image-gen.md +47 -0
- janus_agent-1.34.3/janus/skills_bundled/creative-pixel-and-ascii.md +42 -0
- janus_agent-1.34.3/janus/skills_bundled/creative-video-gen.md +48 -0
- janus_agent-1.34.3/janus/skills_bundled/delegate-to-agent.md +53 -0
- janus_agent-1.34.3/janus/skills_bundled/dev-diff-narrator.md +47 -0
- janus_agent-1.34.3/janus/skills_bundled/dev-flake-hunter.md +53 -0
- janus_agent-1.34.3/janus/skills_bundled/devops-orchestrate.md +47 -0
- janus_agent-1.34.3/janus/skills_bundled/diagram-author.md +50 -0
- janus_agent-1.34.3/janus/skills_bundled/distillation-recorder.md +57 -0
- janus_agent-1.34.3/janus/skills_bundled/doc-create.md +39 -0
- janus_agent-1.34.3/janus/skills_bundled/domain-recon.md +49 -0
- janus_agent-1.34.3/janus/skills_bundled/email-toolkit.md +39 -0
- janus_agent-1.34.3/janus/skills_bundled/environment-probe.md +62 -0
- janus_agent-1.34.3/janus/skills_bundled/formal-spec-translator.md +62 -0
- janus_agent-1.34.3/janus/skills_bundled/gaming-server.md +51 -0
- janus_agent-1.34.3/janus/skills_bundled/gh-pr.md +39 -0
- janus_agent-1.34.3/janus/skills_bundled/gh-release.md +49 -0
- janus_agent-1.34.3/janus/skills_bundled/gh-review.md +44 -0
- janus_agent-1.34.3/janus/skills_bundled/gh-triage.md +40 -0
- janus_agent-1.34.3/janus/skills_bundled/home-automation.md +42 -0
- janus_agent-1.34.3/janus/skills_bundled/hook-author.md +53 -0
- janus_agent-1.34.3/janus/skills_bundled/inference-multimodel.md +41 -0
- janus_agent-1.34.3/janus/skills_bundled/interpretability-probe.md +63 -0
- janus_agent-1.34.3/janus/skills_bundled/jupyter-explore.md +41 -0
- janus_agent-1.34.3/janus/skills_bundled/log-bisect.md +46 -0
- janus_agent-1.34.3/janus/skills_bundled/macos-system.md +43 -0
- janus_agent-1.34.3/janus/skills_bundled/mcp-integration.md +45 -0
- janus_agent-1.34.3/janus/skills_bundled/media-gif.md +37 -0
- janus_agent-1.34.3/janus/skills_bundled/media-spotify.md +38 -0
- janus_agent-1.34.3/janus/skills_bundled/media-youtube.md +41 -0
- janus_agent-1.34.3/janus/skills_bundled/memory-archaeologist.md +50 -0
- janus_agent-1.34.3/janus/skills_bundled/memory-conflict-resolver.md +48 -0
- janus_agent-1.34.3/janus/skills_bundled/mlops-lifecycle.md +53 -0
- janus_agent-1.34.3/janus/skills_bundled/multi-model-jury.md +48 -0
- janus_agent-1.34.3/janus/skills_bundled/note-capture.md +41 -0
- janus_agent-1.34.3/janus/skills_bundled/notes-obsidian.md +45 -0
- janus_agent-1.34.3/janus/skills_bundled/pattern-distiller.md +50 -0
- janus_agent-1.34.3/janus/skills_bundled/pdf-toolkit.md +48 -0
- janus_agent-1.34.3/janus/skills_bundled/prompt-injection-detector.md +50 -0
- janus_agent-1.34.3/janus/skills_bundled/provenance-graph.md +51 -0
- janus_agent-1.34.3/janus/skills_bundled/qa-exploratory.md +39 -0
- janus_agent-1.34.3/janus/skills_bundled/redaction-gateway.md +57 -0
- janus_agent-1.34.3/janus/skills_bundled/regression-replay.md +48 -0
- janus_agent-1.34.3/janus/skills_bundled/research-literature.md +45 -0
- janus_agent-1.34.3/janus/skills_bundled/sandbox-spawner.md +50 -0
- janus_agent-1.34.3/janus/skills_bundled/social-post.md +41 -0
- janus_agent-1.34.3/janus/skills_bundled/software-engineering.md +54 -0
- janus_agent-1.34.3/janus/skills_bundled/synthetic-eval-builder.md +51 -0
- janus_agent-1.34.3/janus/skills_bundled/task-decomposer-with-budget.md +46 -0
- janus_agent-1.34.3/janus/skills_market.py +215 -0
- janus_agent-1.34.3/janus/slash_dispatch.py +337 -0
- janus_agent-1.34.3/janus/status_line.py +286 -0
- janus_agent-1.34.3/janus/statusline.py +60 -0
- janus_agent-1.34.3/janus/streaming.py +210 -0
- janus_agent-1.34.3/janus/subagent.py +402 -0
- janus_agent-1.34.3/janus/swarms/__init__.py +28 -0
- janus_agent-1.34.3/janus/swarms/aggregators.py +223 -0
- janus_agent-1.34.3/janus/swarms/budget.py +149 -0
- janus_agent-1.34.3/janus/swarms/cancel.py +85 -0
- janus_agent-1.34.3/janus/swarms/recursion.py +64 -0
- janus_agent-1.34.3/janus/swarms/runner.py +621 -0
- janus_agent-1.34.3/janus/swarms/slash.py +203 -0
- janus_agent-1.34.3/janus/swarms/spec.py +498 -0
- janus_agent-1.34.3/janus/swarms/state.py +247 -0
- janus_agent-1.34.3/janus/task_render.py +162 -0
- janus_agent-1.34.3/janus/title_generator.py +162 -0
- janus_agent-1.34.3/janus/tool_call_recovery.py +213 -0
- janus_agent-1.34.3/janus/tool_guardrails.py +317 -0
- janus_agent-1.34.3/janus/tools/__init__.py +188 -0
- janus_agent-1.34.3/janus/tools/agent.py +889 -0
- janus_agent-1.34.3/janus/tools/base.py +226 -0
- janus_agent-1.34.3/janus/tools/browser.py +207 -0
- janus_agent-1.34.3/janus/tools/capabilities.py +136 -0
- janus_agent-1.34.3/janus/tools/clarify.py +127 -0
- janus_agent-1.34.3/janus/tools/code_exec.py +175 -0
- janus_agent-1.34.3/janus/tools/delegate.py +239 -0
- janus_agent-1.34.3/janus/tools/edit.py +119 -0
- janus_agent-1.34.3/janus/tools/fs.py +228 -0
- janus_agent-1.34.3/janus/tools/gateway_send_file.py +99 -0
- janus_agent-1.34.3/janus/tools/glob.py +66 -0
- janus_agent-1.34.3/janus/tools/grep.py +132 -0
- janus_agent-1.34.3/janus/tools/image_gen.py +250 -0
- janus_agent-1.34.3/janus/tools/interview_ask.py +184 -0
- janus_agent-1.34.3/janus/tools/memory_search.py +127 -0
- janus_agent-1.34.3/janus/tools/multi_edit.py +137 -0
- janus_agent-1.34.3/janus/tools/notebook.py +142 -0
- janus_agent-1.34.3/janus/tools/plan_mode.py +134 -0
- janus_agent-1.34.3/janus/tools/session_search.py +76 -0
- janus_agent-1.34.3/janus/tools/shell.py +377 -0
- janus_agent-1.34.3/janus/tools/shell_bg.py +564 -0
- janus_agent-1.34.3/janus/tools/shell_pty.py +218 -0
- janus_agent-1.34.3/janus/tools/ssh_exec.py +252 -0
- janus_agent-1.34.3/janus/tools/subagent.py +420 -0
- janus_agent-1.34.3/janus/tools/swarm_run.py +144 -0
- janus_agent-1.34.3/janus/tools/telegram_react.py +122 -0
- janus_agent-1.34.3/janus/tools/telegram_send.py +211 -0
- janus_agent-1.34.3/janus/tools/todo.py +108 -0
- janus_agent-1.34.3/janus/tools/vision.py +77 -0
- janus_agent-1.34.3/janus/tools/web.py +98 -0
- janus_agent-1.34.3/janus/tools/web_search.py +95 -0
- janus_agent-1.34.3/janus/trajectory.py +222 -0
- janus_agent-1.34.3/janus/triggers/__init__.py +11 -0
- janus_agent-1.34.3/janus/triggers/base.py +203 -0
- janus_agent-1.34.3/janus/triggers/runtime.py +465 -0
- janus_agent-1.34.3/janus/tui/__init__.py +45 -0
- janus_agent-1.34.3/janus/tui/app.py +524 -0
- janus_agent-1.34.3/janus/user_scope.py +144 -0
- janus_agent-1.34.3/janus/verification.py +339 -0
- janus_agent-1.34.3/janus/web_config.py +268 -0
- janus_agent-1.34.3/janus/web_rate_limit.py +206 -0
- janus_agent-1.34.3/janus/webhooks.py +216 -0
- janus_agent-1.34.3/janus_agent.egg-info/PKG-INFO +570 -0
- janus_agent-1.34.3/janus_agent.egg-info/SOURCES.txt +414 -0
- janus_agent-1.34.3/janus_agent.egg-info/dependency_links.txt +1 -0
- janus_agent-1.34.3/janus_agent.egg-info/entry_points.txt +2 -0
- janus_agent-1.34.3/janus_agent.egg-info/requires.txt +32 -0
- janus_agent-1.34.3/janus_agent.egg-info/top_level.txt +1 -0
- janus_agent-1.34.3/pyproject.toml +95 -0
- janus_agent-1.34.3/setup.cfg +4 -0
- janus_agent-1.34.3/tests/test_agent_prompt_v152.py +130 -0
- janus_agent-1.34.3/tests/test_agent_system_prompt.py +183 -0
- janus_agent-1.34.3/tests/test_app_event_stream.py +429 -0
- janus_agent-1.34.3/tests/test_approver.py +60 -0
- janus_agent-1.34.3/tests/test_approver_args.py +305 -0
- janus_agent-1.34.3/tests/test_at_mentions.py +294 -0
- janus_agent-1.34.3/tests/test_auto_mode.py +267 -0
- janus_agent-1.34.3/tests/test_auto_permissions.py +177 -0
- janus_agent-1.34.3/tests/test_auto_ui.py +117 -0
- janus_agent-1.34.3/tests/test_branding.py +102 -0
- janus_agent-1.34.3/tests/test_capabilities.py +54 -0
- janus_agent-1.34.3/tests/test_chatbot_guard.py +409 -0
- janus_agent-1.34.3/tests/test_clarify_and_delegate.py +269 -0
- janus_agent-1.34.3/tests/test_cli_logo.py +56 -0
- janus_agent-1.34.3/tests/test_cli_rich_completer.py +97 -0
- janus_agent-1.34.3/tests/test_cli_thinking_indicator.py +105 -0
- janus_agent-1.34.3/tests/test_coding_agent_audit.py +400 -0
- janus_agent-1.34.3/tests/test_conversation.py +125 -0
- janus_agent-1.34.3/tests/test_cost.py +78 -0
- janus_agent-1.34.3/tests/test_cost_per_chat.py +107 -0
- janus_agent-1.34.3/tests/test_diff_render_rich.py +197 -0
- janus_agent-1.34.3/tests/test_eval.py +49 -0
- janus_agent-1.34.3/tests/test_eval_drift_budget.py +91 -0
- janus_agent-1.34.3/tests/test_executor_chat.py +195 -0
- janus_agent-1.34.3/tests/test_executor_injection.py +256 -0
- janus_agent-1.34.3/tests/test_fire_uses_chat.py +253 -0
- janus_agent-1.34.3/tests/test_gateway_send_file.py +180 -0
- janus_agent-1.34.3/tests/test_gateway_web.py +187 -0
- janus_agent-1.34.3/tests/test_gateways_common.py +305 -0
- janus_agent-1.34.3/tests/test_headless.py +131 -0
- janus_agent-1.34.3/tests/test_hooks.py +244 -0
- janus_agent-1.34.3/tests/test_hotkeys.py +176 -0
- janus_agent-1.34.3/tests/test_index.py +69 -0
- janus_agent-1.34.3/tests/test_injection.py +196 -0
- janus_agent-1.34.3/tests/test_insights_and_titles.py +242 -0
- janus_agent-1.34.3/tests/test_install_services_script.py +126 -0
- janus_agent-1.34.3/tests/test_interpreter_identity.py +71 -0
- janus_agent-1.34.3/tests/test_interview_ask_tool.py +234 -0
- janus_agent-1.34.3/tests/test_interview_inferred.py +273 -0
- janus_agent-1.34.3/tests/test_interviews_completion.py +135 -0
- janus_agent-1.34.3/tests/test_interviews_drip.py +287 -0
- janus_agent-1.34.3/tests/test_interviews_gateway_wires.py +224 -0
- janus_agent-1.34.3/tests/test_interviews_parser.py +423 -0
- janus_agent-1.34.3/tests/test_interviews_runner.py +318 -0
- janus_agent-1.34.3/tests/test_interviews_state.py +397 -0
- janus_agent-1.34.3/tests/test_mcp.py +249 -0
- janus_agent-1.34.3/tests/test_memory.py +206 -0
- janus_agent-1.34.3/tests/test_memory_cards.py +456 -0
- janus_agent-1.34.3/tests/test_memory_consolidate.py +159 -0
- janus_agent-1.34.3/tests/test_memory_extract.py +448 -0
- janus_agent-1.34.3/tests/test_memory_index.py +435 -0
- janus_agent-1.34.3/tests/test_memory_migrate.py +213 -0
- janus_agent-1.34.3/tests/test_memory_privacy.py +216 -0
- janus_agent-1.34.3/tests/test_memory_prune.py +235 -0
- janus_agent-1.34.3/tests/test_memory_recall.py +319 -0
- janus_agent-1.34.3/tests/test_memory_search_tool.py +200 -0
- janus_agent-1.34.3/tests/test_memory_state.py +209 -0
- janus_agent-1.34.3/tests/test_memory_ux.py +183 -0
- janus_agent-1.34.3/tests/test_no_tools.py +182 -0
- janus_agent-1.34.3/tests/test_orchestrator.py +52 -0
- janus_agent-1.34.3/tests/test_origin_and_guardrails.py +278 -0
- janus_agent-1.34.3/tests/test_permissions.py +131 -0
- janus_agent-1.34.3/tests/test_phase12.py +155 -0
- janus_agent-1.34.3/tests/test_phase14.py +160 -0
- janus_agent-1.34.3/tests/test_phase15.py +192 -0
- janus_agent-1.34.3/tests/test_phase18.py +116 -0
- janus_agent-1.34.3/tests/test_phase19.py +137 -0
- janus_agent-1.34.3/tests/test_phase20.py +119 -0
- janus_agent-1.34.3/tests/test_phase9_tools.py +426 -0
- janus_agent-1.34.3/tests/test_planner.py +76 -0
- janus_agent-1.34.3/tests/test_post_merge_hook.py +163 -0
- janus_agent-1.34.3/tests/test_provider_adapters.py +187 -0
- janus_agent-1.34.3/tests/test_read_tracker_context.py +195 -0
- janus_agent-1.34.3/tests/test_redact_rate_ssh.py +461 -0
- janus_agent-1.34.3/tests/test_services.py +267 -0
- janus_agent-1.34.3/tests/test_shell_safety.py +145 -0
- janus_agent-1.34.3/tests/test_single_user_mode.py +235 -0
- janus_agent-1.34.3/tests/test_skill_evolution.py +381 -0
- janus_agent-1.34.3/tests/test_skill_preprocess_and_pins.py +327 -0
- janus_agent-1.34.3/tests/test_skills.py +95 -0
- janus_agent-1.34.3/tests/test_skills_bundled.py +259 -0
- janus_agent-1.34.3/tests/test_skills_market.py +130 -0
- janus_agent-1.34.3/tests/test_smart_404.py +267 -0
- janus_agent-1.34.3/tests/test_step_budget_redesign.py +559 -0
- janus_agent-1.34.3/tests/test_subagent.py +415 -0
- janus_agent-1.34.3/tests/test_swarm_background.py +321 -0
- janus_agent-1.34.3/tests/test_swarm_run_tool.py +263 -0
- janus_agent-1.34.3/tests/test_swarm_telegram_ping.py +108 -0
- janus_agent-1.34.3/tests/test_swarms_aggregators.py +401 -0
- janus_agent-1.34.3/tests/test_swarms_budget.py +422 -0
- janus_agent-1.34.3/tests/test_swarms_cancellation.py +449 -0
- janus_agent-1.34.3/tests/test_swarms_cli.py +317 -0
- janus_agent-1.34.3/tests/test_swarms_hooks.py +396 -0
- janus_agent-1.34.3/tests/test_swarms_indicators.py +259 -0
- janus_agent-1.34.3/tests/test_swarms_recursion.py +259 -0
- janus_agent-1.34.3/tests/test_swarms_retry.py +222 -0
- janus_agent-1.34.3/tests/test_swarms_runner.py +516 -0
- janus_agent-1.34.3/tests/test_swarms_sequential_phases.py +378 -0
- janus_agent-1.34.3/tests/test_swarms_slash.py +242 -0
- janus_agent-1.34.3/tests/test_swarms_spec.py +568 -0
- janus_agent-1.34.3/tests/test_task_render.py +241 -0
- janus_agent-1.34.3/tests/test_telegram_approval_stale.py +264 -0
- janus_agent-1.34.3/tests/test_telegram_auto_hint.py +65 -0
- janus_agent-1.34.3/tests/test_telegram_chat.py +157 -0
- janus_agent-1.34.3/tests/test_telegram_logo.py +38 -0
- janus_agent-1.34.3/tests/test_telegram_send_tools.py +315 -0
- janus_agent-1.34.3/tests/test_telegram_typing_pulse.py +137 -0
- janus_agent-1.34.3/tests/test_telegram_uploads.py +302 -0
- janus_agent-1.34.3/tests/test_tool_agent.py +532 -0
- janus_agent-1.34.3/tests/test_tool_call_recovery.py +375 -0
- janus_agent-1.34.3/tests/test_tool_risk.py +79 -0
- janus_agent-1.34.3/tests/test_trajectory_and_onboarding.py +311 -0
- janus_agent-1.34.3/tests/test_triggers.py +95 -0
- janus_agent-1.34.3/tests/test_tui_app.py +127 -0
- janus_agent-1.34.3/tests/test_uninstall.py +225 -0
- janus_agent-1.34.3/tests/test_v153_fixes.py +185 -0
- janus_agent-1.34.3/tests/test_v1_18_2_fixes.py +265 -0
- janus_agent-1.34.3/tests/test_v1_24_0.py +357 -0
- janus_agent-1.34.3/tests/test_v1_24_1.py +305 -0
- janus_agent-1.34.3/tests/test_v1_24_2_bugs.py +224 -0
- janus_agent-1.34.3/tests/test_v1_24_3_locale.py +171 -0
- janus_agent-1.34.3/tests/test_v1_24_4.py +283 -0
- janus_agent-1.34.3/tests/test_v1_24_5_question_bug.py +233 -0
- janus_agent-1.34.3/tests/test_v1_24_6_emoji_box_drawing.py +210 -0
- janus_agent-1.34.3/tests/test_v1_24_6_explanation_and_docs.py +183 -0
- janus_agent-1.34.3/tests/test_v1_24_6_high_risk_prompt.py +282 -0
- janus_agent-1.34.3/tests/test_v1_24_6_memory_refusal.py +230 -0
- janus_agent-1.34.3/tests/test_v1_26_0_system_prompt.py +287 -0
- janus_agent-1.34.3/tests/test_v1_27_0_subagent.py +781 -0
- janus_agent-1.34.3/tests/test_v1_27_1_verification.py +537 -0
- janus_agent-1.34.3/tests/test_v1_27_2_plan_render.py +427 -0
- janus_agent-1.34.3/tests/test_v1_27_3_resume_picker.py +452 -0
- janus_agent-1.34.3/tests/test_v1_28_0_skill_proposer.py +534 -0
- janus_agent-1.34.3/tests/test_v1_28_1_auto_offer.py +228 -0
- janus_agent-1.34.3/tests/test_v1_28_2_cost_dashboard.py +340 -0
- janus_agent-1.34.3/tests/test_v1_28_3_model_fallback.py +395 -0
- janus_agent-1.34.3/tests/test_v1_28_4_project_detect.py +348 -0
- janus_agent-1.34.3/tests/test_v1_29_0_consolidate_multi_stage.py +374 -0
- janus_agent-1.34.3/tests/test_v1_29_1_mcp_catalog.py +519 -0
- janus_agent-1.34.3/tests/test_v1_29_2_streaming_fallback.py +315 -0
- janus_agent-1.34.3/tests/test_v1_29_3_skill_auto_offer_gateways.py +191 -0
- janus_agent-1.34.3/tests/test_v1_29_4_web_mcp_panel.py +145 -0
- janus_agent-1.34.3/tests/test_v1_30_0_plan_render_parity.py +365 -0
- janus_agent-1.34.3/tests/test_v1_30_1_skill_project_types.py +386 -0
- janus_agent-1.34.3/tests/test_v1_30_2_memory_consolidate_cron.py +314 -0
- janus_agent-1.34.3/tests/test_v1_31_0_web_skill_proposals.py +303 -0
- janus_agent-1.34.3/tests/test_v1_31_10_plan_review_text_reply.py +313 -0
- janus_agent-1.34.3/tests/test_v1_31_11_concurrent_updates.py +82 -0
- janus_agent-1.34.3/tests/test_v1_31_12_clarify_text_reply.py +159 -0
- janus_agent-1.34.3/tests/test_v1_31_13_plan_mode_guidance.py +194 -0
- janus_agent-1.34.3/tests/test_v1_31_14_mcp_diagnostics.py +440 -0
- janus_agent-1.34.3/tests/test_v1_31_15_web_startup_unbuffered.py +211 -0
- janus_agent-1.34.3/tests/test_v1_31_16_banner_mcp_count_and_telegram_quiet.py +275 -0
- janus_agent-1.34.3/tests/test_v1_31_17_web_service_unit.py +182 -0
- janus_agent-1.34.3/tests/test_v1_31_1_web_cost_charts.py +285 -0
- janus_agent-1.34.3/tests/test_v1_31_2_web_grants_panel.py +292 -0
- janus_agent-1.34.3/tests/test_v1_31_3_homogeneous_sequence_filter.py +188 -0
- janus_agent-1.34.3/tests/test_v1_31_4_file_detector_tool_allowlist.py +209 -0
- janus_agent-1.34.3/tests/test_v1_31_5_plan_review_production_path.py +377 -0
- janus_agent-1.34.3/tests/test_v1_31_6_status_line_pause_during_prompt.py +270 -0
- janus_agent-1.34.3/tests/test_v1_31_7_telegram_parse_mode.py +206 -0
- janus_agent-1.34.3/tests/test_v1_31_8_telegram_logging.py +204 -0
- janus_agent-1.34.3/tests/test_v1_32_0_pypi_publish_workflow.py +216 -0
- janus_agent-1.34.3/tests/test_v1_32_1_docker_image.py +226 -0
- janus_agent-1.34.3/tests/test_v1_32_2_one_line_installer.py +214 -0
- janus_agent-1.34.3/tests/test_v1_32_3_onboard_autodetect.py +249 -0
- janus_agent-1.34.3/tests/test_v1_32_4_tutorials.py +188 -0
- janus_agent-1.34.3/tests/test_v1_32_5_readme_outsiders.py +174 -0
- janus_agent-1.34.3/tests/test_v1_33_0_web_config_proxy.py +266 -0
- janus_agent-1.34.3/tests/test_v1_33_1_backup_restore.py +253 -0
- janus_agent-1.34.3/tests/test_v1_33_2_health_endpoint.py +168 -0
- janus_agent-1.34.3/tests/test_v1_33_3_rate_limiting.py +249 -0
- janus_agent-1.34.3/tests/test_v1_33_4_user_scope.py +269 -0
- janus_agent-1.34.3/tests/test_v1_33_5_audit_log.py +242 -0
- janus_agent-1.34.3/tests/test_v1_34_0_webhook_endpoint.py +295 -0
- janus_agent-1.34.3/tests/test_v1_34_1_memory_sync.py +264 -0
- janus_agent-1.34.3/tests/test_v1_34_2_image_gen_tool.py +202 -0
- janus_agent-1.34.3/tests/test_web_auth.py +350 -0
- janus_agent-1.34.3/tests/test_web_bridge.py +272 -0
- janus_agent-1.34.3/tests/test_web_security_regress.py +180 -0
- janus_agent-1.34.3/tests/test_web_v1_22_endpoints.py +340 -0
- 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.
|