proseforge-agent 0.3.2__tar.gz → 0.4.0__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.
- proseforge_agent-0.4.0/PKG-INFO +133 -0
- proseforge_agent-0.4.0/README.md +112 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/pyproject.toml +9 -4
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/__init__.py +1 -1
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/intent_router.py +15 -1
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/kernel.py +49 -7
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/tools.py +1 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chat/__init__.py +2 -0
- proseforge_agent-0.4.0/src/proseforge_agent/chat/project_retrieval.py +127 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chat/repl.py +6 -1
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/cli.py +184 -13
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/package_checks.py +6 -2
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/release/__init__.py +12 -4
- proseforge_agent-0.4.0/src/proseforge_agent/tui/__init__.py +17 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/tui/app.py +6 -1
- proseforge_agent-0.4.0/src/proseforge_agent/tui/product.py +248 -0
- proseforge_agent-0.4.0/src/proseforge_agent/workflows.py +82 -0
- proseforge_agent-0.4.0/src/proseforge_agent.egg-info/PKG-INFO +133 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent.egg-info/SOURCES.txt +8 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent.egg-info/requires.txt +2 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_docker_distribution.py +2 -1
- proseforge_agent-0.4.0/tests/test_package.py +17 -0
- proseforge_agent-0.4.0/tests/test_product_positioning.py +28 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_pypi_first_publish_and_version_bump.py +2 -2
- proseforge_agent-0.4.0/tests/test_real_agent_loop.py +188 -0
- proseforge_agent-0.4.0/tests/test_release_workflow_hygiene.py +42 -0
- proseforge_agent-0.4.0/tests/test_user_distribution_docs.py +47 -0
- proseforge_agent-0.4.0/tests/test_workflow_packs.py +27 -0
- proseforge_agent-0.3.2/PKG-INFO +0 -620
- proseforge_agent-0.3.2/README.md +0 -601
- proseforge_agent-0.3.2/src/proseforge_agent/tui/__init__.py +0 -7
- proseforge_agent-0.3.2/src/proseforge_agent.egg-info/PKG-INFO +0 -620
- proseforge_agent-0.3.2/tests/test_package.py +0 -7
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/LICENSE +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/setup.cfg +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/__main__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/_bootstrap.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/artifacts.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/attachments.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/audit.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/context_window.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/control.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/degradation.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/eval.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/events.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/execution_guard.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/function_calling.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/loop.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/middleware.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/modes.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/observability.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/offline.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/permissions.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/planner.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/profiles.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/prompt_templates.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/provider_fallback.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/reflection.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/request_cache.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/safety.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/sandbox.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/structured_output.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/subagent.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/types.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/capabilities.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chapter/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chapter/accept.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chapter/context.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chapter/draft.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chapter/lifecycle.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chapter/review.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chapter/rewrite.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chat/context.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chat/handoff.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chat/memory.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chat/prompts.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chat/retrieval.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chat/session.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chat/slash.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chat/system_prompts.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chat/transcript.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/concurrency.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/config.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/cron/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/cron/core.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/daily/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/daily/recommend.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/daily/workbook.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/demo.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/dotenv.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/base.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/checkpoints.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/daytona.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/docker.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/file_sync.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/local.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/modal.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/process_registry.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/process_runner.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/serverless.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/singularity.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/ssh.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/errors.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/eval/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/eval/trajectories.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/extensions/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/extensions/base.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/extensions/registry.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/core.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/delivery.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/media.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/platforms/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/platforms/base.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/platforms/discord.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/platforms/email.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/platforms/mobile_email.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/platforms/signal.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/platforms/slack.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/platforms/telegram.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/platforms/telegram_transport.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/platforms/whatsapp.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/poller.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/relay/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/relay/auth.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/app_dirs.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/auto_trigger.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/binary_build.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/binary_packaging.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/ci_matrix.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/docker_plan.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/doctor.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/first_run.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/installer_scripts.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/installers.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/linux.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/local_models.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/macos.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/migrations.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/platform_io.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/provider_setup.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/qa_matrix.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/secrets.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/shell.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/support_bundle.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/uninstall.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/windows.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/base.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/capabilities.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/certification.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/docs_refresh.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/fake.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/http.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/openai_compatible.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/policies.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/probes.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/profiles.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/_openai_shape.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/anthropic.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/deepseek.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/doubao.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/gemini.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/glm.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/grok.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/mimo.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/minimax.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/openai.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/profiles/anthropic.yaml +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/profiles/deepseek.yaml +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/profiles/doubao.yaml +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/profiles/gemini.yaml +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/profiles/glm.yaml +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/profiles/mimo.yaml +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/profiles/minimax.yaml +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/profiles/openai.yaml +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/profiles/qwen.yaml +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/profiles/xai.yaml +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/qwen.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/registry.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/router.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/streaming.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/usage.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/mcp/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/mcp/approval.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/mcp/client.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/mcp/credentials.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/mcp/policy.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/mcp/registry.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/mcp/schema.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/memory/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/memory/compact.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/memory/ingest.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/memory/nudges.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/memory/review.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/memory/schema.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/memory/store.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/memory/user_model.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/notifications/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/notifications/core.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/notifications/desktop.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/notifications/jobs.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/notifications/webhook.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/approval_queue.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/artifacts.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/backup_verification.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/bible.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/character_arcs.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/continuity.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/draft_versioning.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/editorial_pipeline.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/exporter.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/foreshadowing.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/importer.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/literary_regression.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/manifest.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/manuscript_search.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/plot_threads.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/project_health.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/publishing.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/reader_review.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/relationship_graph.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/reorganize.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/rewrite_strategies.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/safety.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/scenes.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/storage.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/style_profile.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/timeline.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/writing_analytics.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/writing_quality.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/writing_rules.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/planning/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/planning/intake.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/planning/phase_plan.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/plugins/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/plugins/dependencies.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/plugins/discovery.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/plugins/harness.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/plugins/hooks.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/plugins/manager.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/plugins/manifest.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/plugins/permissions.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/plugins/sandbox.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/proseforge/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/proseforge/adapter.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/proseforge/results.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/release/complete_agent_gate.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/release/publish.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/release/version_policy.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/reports/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/reports/registry.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/reports/render.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/retrieval/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/retrieval/embeddings.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/retrieval/evaluation.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/retrieval/evidence.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/retrieval/hybrid.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/retrieval/index.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/retrieval/ingestion.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/retrieval/router.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/retrieval/vector_store.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/service/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/service/api.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/service/http_server.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/setup/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/setup/config_generator.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/setup/first_run.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/setup/modes.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/setup/recovery.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/setup/summary.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/setup/wizard.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/skills/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/skills/audit.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/skills/creation.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/skills/hub.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/skills/improvement.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/skills/install.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/skills/registry.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/skills/usage.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/testing/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/testing/fakes.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/tools/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/tools/managed/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/tools/managed/cloud_browser.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/tools/managed/media.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/tools/managed/url_safety.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/tools/managed/web_search.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/tui/ansi.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/tui/fullscreen.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/tui/keys.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/tui/screen.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/tui/streaming.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/workflow/__init__.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/workflow/recovery.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/workflow/state.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/workspace.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent.egg-info/dependency_links.txt +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent.egg-info/entry_points.txt +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent.egg-info/top_level.txt +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_agent_events_jobs.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_agent_kernel.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_agent_loop.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_agent_profiles_personas.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_agent_safety_guard.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_agent_tools_permissions.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_app_dirs.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_attachment_ingestion.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_audit_trail_debuggability.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_binary_build.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_binary_packaging.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_capabilities.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_chapter_lifecycle.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_chapter_review.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_chat_cli_repl.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_chat_memory_preferences.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_chat_prompt_protocol.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_chat_retrieval_citations.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_chat_session_store.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_chat_workflow_handoff.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_ci_pipeline.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_cli.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_cli_commands.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_cli_config_yaml_example_seed.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_cli_quickstart.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_community_and_agent_docs.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_complete_agent_release_gate.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_concurrency_locking.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_config.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_context_window_management.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_control_interrupt.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_conversation_lifecycle.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_cross_session_search.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_daily_recommendations.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_daily_workbook.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_default_provider_resolution.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_default_tui_on_bare_command.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_dotenv_support.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_dotenv_workspace_env.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_e2e_demo.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_evidence_pack.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_execution_guard_timeout.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_extensions.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_first_run_auto_trigger.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_first_run_onboarding.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_fs_edit_and_registry_hardening.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_general_tools.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_graceful_degradation.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_injection_guard_cjk_precision.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_installation_doctor.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_installer_first_run_ux.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_intent_router.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_linux_native_support.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_llm_fake_and_routing.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_llm_response_normalization.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_local_agent_service_api.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_loud_placeholders_and_wiring.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_low_severity_review_cleanups.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_macos_native_support.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_managed_install_scripts.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_mcp_policy_enforced_in_client.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_memory_compaction.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_memory_ingestion.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_memory_schema.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_memory_store.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_middleware_hooks_trajectory_datasets.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_middleware_wiring.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_native_qa_matrix.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_native_secret_storage.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_observer_hooks_telemetry_export.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_offline_local_model_setup.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_offline_mode.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_openai_compatible_provider.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_os_installers.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_phase_plan_generator.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_platform_io.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_prompt_template_registry.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_proseforge_adapter.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_anthropic.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_certification.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_deepseek.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_doubao.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_fallback.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_gemini.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_glm.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_grok.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_mimo.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_minimax.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_openai.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_probes.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_profiles.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_qwen.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_registry.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_router.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_setup_wizard.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_usage_metering.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_pypi_publish.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_python_install_flows.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_readme_localization.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_release_checks.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_report_readiness_badge.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_reports.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_request_cache.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_retrieval_router.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_rewrite_accept.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_self_verification.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_service_http_server.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_session_branching.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_session_export_import.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_shell_completions_launchers.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_store_concurrency_and_idempotency.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_streaming_responses.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_streaming_tool_output.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_structured_function_calling.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_sub_agent.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_support_bundle.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_system_prompt_management.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_task_planner.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_tool_result_artifacts_output_limits.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_tool_sandbox.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_tool_timeout_rate_limit_circuit_breaker.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_unified_redaction.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_uninstall_data_retention.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_upgrade_migration_backup.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_windows_native_support.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_windows_utf8_bootstrap.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_workflow_recovery.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_workflow_state.py +0 -0
- {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_workspace.py +0 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: proseforge-agent
|
|
3
|
+
Version: 0.4.0
|
|
4
|
+
Summary: General agent runtime with a built-in ProseForge writing workflow pack.
|
|
5
|
+
Author: ProseForge Agent
|
|
6
|
+
License: Apache-2.0
|
|
7
|
+
Requires-Python: <3.13,>=3.10
|
|
8
|
+
Description-Content-Type: text/markdown
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Requires-Dist: pyyaml>=6.0
|
|
11
|
+
Requires-Dist: rich>=13.0
|
|
12
|
+
Requires-Dist: prompt_toolkit>=3.0
|
|
13
|
+
Requires-Dist: tomli>=2.0; python_version < "3.11"
|
|
14
|
+
Provides-Extra: dev
|
|
15
|
+
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
16
|
+
Provides-Extra: ci
|
|
17
|
+
Requires-Dist: pytest>=7.0; extra == "ci"
|
|
18
|
+
Requires-Dist: pytest-rerunfailures>=13.0; extra == "ci"
|
|
19
|
+
Requires-Dist: pytest-repeat>=0.9; extra == "ci"
|
|
20
|
+
Dynamic: license-file
|
|
21
|
+
|
|
22
|
+
> 🌐 [English](README.md) · [简体中文](README.zh-CN.md)
|
|
23
|
+
|
|
24
|
+
<p align="center">
|
|
25
|
+
<img src="assets/banner.png" alt="ProseForge Agent command center" width="100%">
|
|
26
|
+
</p>
|
|
27
|
+
|
|
28
|
+
<h1 align="center">ProseForge Agent</h1>
|
|
29
|
+
|
|
30
|
+
<p align="center">
|
|
31
|
+
<strong>A general agent runtime with a built-in ProseForge writing workflow pack.</strong>
|
|
32
|
+
</p>
|
|
33
|
+
|
|
34
|
+
<p align="center">
|
|
35
|
+
<a href="README.zh-CN.md">简体中文</a> ·
|
|
36
|
+
<a href="https://pypi.org/project/proseforge-agent/">PyPI</a> ·
|
|
37
|
+
<a href="https://github.com/remacheybn408-boop/ProseForge-Agent/releases">Releases</a> ·
|
|
38
|
+
<a href="https://github.com/remacheybn408-boop/ProseForge-Agent/pkgs/container/proseforge-agent">GHCR</a>
|
|
39
|
+
</p>
|
|
40
|
+
|
|
41
|
+
<p align="center">
|
|
42
|
+
<a href="https://pypi.org/project/proseforge-agent/"><img src="https://img.shields.io/pypi/v/proseforge-agent?style=for-the-badge&label=PyPI" alt="PyPI version"></a>
|
|
43
|
+
<a href="https://pypi.org/project/proseforge-agent/"><img src="https://img.shields.io/pypi/pyversions/proseforge-agent?style=for-the-badge" alt="Python versions"></a>
|
|
44
|
+
<a href="https://github.com/remacheybn408-boop/ProseForge-Agent/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/remacheybn408-boop/ProseForge-Agent/ci.yml?branch=main&style=for-the-badge&label=CI" alt="CI status"></a>
|
|
45
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/License-Apache--2.0-green?style=for-the-badge" alt="Apache-2.0 license"></a>
|
|
46
|
+
</p>
|
|
47
|
+
|
|
48
|
+
ProseForge Agent is becoming a general personal agent runtime: a terminal-first system for model setup, sessions, tools, approvals, memory, workflow packs, and project automation. The ProseForge writing workflow pack is the first built-in pack, focused on long-form planning, drafting, review, rewrite, export, and memory closeout.
|
|
49
|
+
|
|
50
|
+
The terminal experience follows modern agent CLI patterns inspired by [openai/codex](https://github.com/openai/codex), while the implementation stays in the Python CLI stack used by projects like [NousResearch/hermes-agent](https://github.com/NousResearch/hermes-agent): `prompt_toolkit` for interaction, `rich` for readable terminal rendering, and Python as the authoritative runtime.
|
|
51
|
+
|
|
52
|
+
<table>
|
|
53
|
+
<tr><td><b>General runtime</b></td><td>Chat, setup, provider/model switching, sessions, workflow packs, doctor checks, and project binding from one CLI.</td></tr>
|
|
54
|
+
<tr><td><b>Workflow packs</b></td><td>Start with General Chat and ProseForge Novel; extend later into research, coding, docs, automation, and personal assistant packs.</td></tr>
|
|
55
|
+
<tr><td><b>ProseForge writing pack</b></td><td>Project init, chapter drafting, review, rewrite, export, and memory closeout for long-form writing.</td></tr>
|
|
56
|
+
<tr><td><b>Hermes-style terminal stack</b></td><td>Python + <code>prompt_toolkit</code> + <code>rich</code>; no Rust binary is required for ordinary users.</td></tr>
|
|
57
|
+
<tr><td><b>Bring your model</b></td><td>Profiles for OpenAI, Anthropic, Gemini, xAI/Grok, DeepSeek, Qwen, GLM, Mimo, MiniMax, Doubao, plus an offline fake provider.</td></tr>
|
|
58
|
+
</table>
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Quick Install
|
|
63
|
+
|
|
64
|
+
### Python package
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
pip install -U proseforge-agent
|
|
68
|
+
pf-agent --help
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Linux, macOS, WSL2
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
curl -fsSL https://raw.githubusercontent.com/remacheybn408-boop/ProseForge-Agent/main/scripts/install.sh | sh
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Windows PowerShell
|
|
78
|
+
|
|
79
|
+
```powershell
|
|
80
|
+
iex (irm https://raw.githubusercontent.com/remacheybn408-boop/ProseForge-Agent/main/scripts/install.ps1)
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
The one-line installer uses PyPI + `uv tool` by default. It installs or upgrades `proseforge-agent`, puts the manager bin directory first on PATH, runs `pf-agent doctor`, then starts `pf-agent setup --quick`.
|
|
84
|
+
|
|
85
|
+
### Docker
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
docker compose up
|
|
89
|
+
docker compose run --rm pf-agent pf-agent quickstart
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
The default `docker-compose.yml` uses the published GHCR image:
|
|
93
|
+
`ghcr.io/remacheybn408-boop/proseforge-agent:latest`. It does not build from
|
|
94
|
+
source, so normal users do not need Python, uv, or a local checkout beyond the
|
|
95
|
+
compose file.
|
|
96
|
+
|
|
97
|
+
### Secrets and env files
|
|
98
|
+
|
|
99
|
+
`pf-agent setup --quick` runs the guided setup. setup --quick writes provider keys to `.pf-agent/.env`.
|
|
100
|
+
config.yaml does not store raw API keys; it stores provider metadata and key
|
|
101
|
+
references. Environment precedence is:
|
|
102
|
+
|
|
103
|
+
```text
|
|
104
|
+
shell env > .env.local > .env > .pf-agent/.env > machine defaults
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Start
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
pf-agent quickstart
|
|
113
|
+
pf-agent setup --quick
|
|
114
|
+
pf-agent
|
|
115
|
+
pf-agent workflow list
|
|
116
|
+
pf-agent workflow use proseforge
|
|
117
|
+
pf-agent project init --type novel --slug my-novel
|
|
118
|
+
pf-agent doctor
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Bare `pf-agent` opens the general Agent Runtime TUI. The legacy stdlib terminal surface remains available with:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
pf-agent tui --legacy
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Workflow Packs
|
|
128
|
+
|
|
129
|
+
`general` is the default open-ended runtime workflow. `proseforge` activates the ProseForge writing workflow pack for novel and long-form writing projects. Future packs can add research, coding, document, automation, and personal assistant flows without redefining the core agent runtime.
|
|
130
|
+
|
|
131
|
+
## License
|
|
132
|
+
|
|
133
|
+
Apache-2.0. See `LICENSE`.
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
> 🌐 [English](README.md) · [简体中文](README.zh-CN.md)
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<img src="assets/banner.png" alt="ProseForge Agent command center" width="100%">
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
<h1 align="center">ProseForge Agent</h1>
|
|
8
|
+
|
|
9
|
+
<p align="center">
|
|
10
|
+
<strong>A general agent runtime with a built-in ProseForge writing workflow pack.</strong>
|
|
11
|
+
</p>
|
|
12
|
+
|
|
13
|
+
<p align="center">
|
|
14
|
+
<a href="README.zh-CN.md">简体中文</a> ·
|
|
15
|
+
<a href="https://pypi.org/project/proseforge-agent/">PyPI</a> ·
|
|
16
|
+
<a href="https://github.com/remacheybn408-boop/ProseForge-Agent/releases">Releases</a> ·
|
|
17
|
+
<a href="https://github.com/remacheybn408-boop/ProseForge-Agent/pkgs/container/proseforge-agent">GHCR</a>
|
|
18
|
+
</p>
|
|
19
|
+
|
|
20
|
+
<p align="center">
|
|
21
|
+
<a href="https://pypi.org/project/proseforge-agent/"><img src="https://img.shields.io/pypi/v/proseforge-agent?style=for-the-badge&label=PyPI" alt="PyPI version"></a>
|
|
22
|
+
<a href="https://pypi.org/project/proseforge-agent/"><img src="https://img.shields.io/pypi/pyversions/proseforge-agent?style=for-the-badge" alt="Python versions"></a>
|
|
23
|
+
<a href="https://github.com/remacheybn408-boop/ProseForge-Agent/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/remacheybn408-boop/ProseForge-Agent/ci.yml?branch=main&style=for-the-badge&label=CI" alt="CI status"></a>
|
|
24
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/License-Apache--2.0-green?style=for-the-badge" alt="Apache-2.0 license"></a>
|
|
25
|
+
</p>
|
|
26
|
+
|
|
27
|
+
ProseForge Agent is becoming a general personal agent runtime: a terminal-first system for model setup, sessions, tools, approvals, memory, workflow packs, and project automation. The ProseForge writing workflow pack is the first built-in pack, focused on long-form planning, drafting, review, rewrite, export, and memory closeout.
|
|
28
|
+
|
|
29
|
+
The terminal experience follows modern agent CLI patterns inspired by [openai/codex](https://github.com/openai/codex), while the implementation stays in the Python CLI stack used by projects like [NousResearch/hermes-agent](https://github.com/NousResearch/hermes-agent): `prompt_toolkit` for interaction, `rich` for readable terminal rendering, and Python as the authoritative runtime.
|
|
30
|
+
|
|
31
|
+
<table>
|
|
32
|
+
<tr><td><b>General runtime</b></td><td>Chat, setup, provider/model switching, sessions, workflow packs, doctor checks, and project binding from one CLI.</td></tr>
|
|
33
|
+
<tr><td><b>Workflow packs</b></td><td>Start with General Chat and ProseForge Novel; extend later into research, coding, docs, automation, and personal assistant packs.</td></tr>
|
|
34
|
+
<tr><td><b>ProseForge writing pack</b></td><td>Project init, chapter drafting, review, rewrite, export, and memory closeout for long-form writing.</td></tr>
|
|
35
|
+
<tr><td><b>Hermes-style terminal stack</b></td><td>Python + <code>prompt_toolkit</code> + <code>rich</code>; no Rust binary is required for ordinary users.</td></tr>
|
|
36
|
+
<tr><td><b>Bring your model</b></td><td>Profiles for OpenAI, Anthropic, Gemini, xAI/Grok, DeepSeek, Qwen, GLM, Mimo, MiniMax, Doubao, plus an offline fake provider.</td></tr>
|
|
37
|
+
</table>
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Quick Install
|
|
42
|
+
|
|
43
|
+
### Python package
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
pip install -U proseforge-agent
|
|
47
|
+
pf-agent --help
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Linux, macOS, WSL2
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
curl -fsSL https://raw.githubusercontent.com/remacheybn408-boop/ProseForge-Agent/main/scripts/install.sh | sh
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Windows PowerShell
|
|
57
|
+
|
|
58
|
+
```powershell
|
|
59
|
+
iex (irm https://raw.githubusercontent.com/remacheybn408-boop/ProseForge-Agent/main/scripts/install.ps1)
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
The one-line installer uses PyPI + `uv tool` by default. It installs or upgrades `proseforge-agent`, puts the manager bin directory first on PATH, runs `pf-agent doctor`, then starts `pf-agent setup --quick`.
|
|
63
|
+
|
|
64
|
+
### Docker
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
docker compose up
|
|
68
|
+
docker compose run --rm pf-agent pf-agent quickstart
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
The default `docker-compose.yml` uses the published GHCR image:
|
|
72
|
+
`ghcr.io/remacheybn408-boop/proseforge-agent:latest`. It does not build from
|
|
73
|
+
source, so normal users do not need Python, uv, or a local checkout beyond the
|
|
74
|
+
compose file.
|
|
75
|
+
|
|
76
|
+
### Secrets and env files
|
|
77
|
+
|
|
78
|
+
`pf-agent setup --quick` runs the guided setup. setup --quick writes provider keys to `.pf-agent/.env`.
|
|
79
|
+
config.yaml does not store raw API keys; it stores provider metadata and key
|
|
80
|
+
references. Environment precedence is:
|
|
81
|
+
|
|
82
|
+
```text
|
|
83
|
+
shell env > .env.local > .env > .pf-agent/.env > machine defaults
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Start
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
pf-agent quickstart
|
|
92
|
+
pf-agent setup --quick
|
|
93
|
+
pf-agent
|
|
94
|
+
pf-agent workflow list
|
|
95
|
+
pf-agent workflow use proseforge
|
|
96
|
+
pf-agent project init --type novel --slug my-novel
|
|
97
|
+
pf-agent doctor
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Bare `pf-agent` opens the general Agent Runtime TUI. The legacy stdlib terminal surface remains available with:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
pf-agent tui --legacy
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Workflow Packs
|
|
107
|
+
|
|
108
|
+
`general` is the default open-ended runtime workflow. `proseforge` activates the ProseForge writing workflow pack for novel and long-form writing projects. Future packs can add research, coding, document, automation, and personal assistant flows without redefining the core agent runtime.
|
|
109
|
+
|
|
110
|
+
## License
|
|
111
|
+
|
|
112
|
+
Apache-2.0. See `LICENSE`.
|
|
@@ -4,13 +4,18 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "proseforge-agent"
|
|
7
|
-
version = "0.
|
|
8
|
-
description = "
|
|
7
|
+
version = "0.4.0"
|
|
8
|
+
description = "General agent runtime with a built-in ProseForge writing workflow pack."
|
|
9
9
|
readme = "README.md"
|
|
10
|
-
requires-python = ">=3.10"
|
|
10
|
+
requires-python = ">=3.10,<3.13"
|
|
11
11
|
license = { text = "Apache-2.0" }
|
|
12
12
|
authors = [{ name = "ProseForge Agent" }]
|
|
13
|
-
dependencies = [
|
|
13
|
+
dependencies = [
|
|
14
|
+
"pyyaml>=6.0",
|
|
15
|
+
"rich>=13.0",
|
|
16
|
+
"prompt_toolkit>=3.0",
|
|
17
|
+
"tomli>=2.0; python_version < '3.11'",
|
|
18
|
+
]
|
|
14
19
|
|
|
15
20
|
[project.optional-dependencies]
|
|
16
21
|
dev = ["pytest>=7.0"]
|
{proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/intent_router.py
RENAMED
|
@@ -8,6 +8,15 @@ from ..errors import ConfigurationError
|
|
|
8
8
|
from .modes import CONVERSATION_MODES
|
|
9
9
|
|
|
10
10
|
|
|
11
|
+
_TARGET_TOOLS = (
|
|
12
|
+
"install.doctor",
|
|
13
|
+
"provider.configure",
|
|
14
|
+
"workflow.continue",
|
|
15
|
+
"workflow.start",
|
|
16
|
+
"memory.add_candidate",
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
11
20
|
@dataclass(frozen=True)
|
|
12
21
|
class IntentDecision:
|
|
13
22
|
"""Intent metadata returned to the Agent Kernel."""
|
|
@@ -149,4 +158,9 @@ class IntentRouter:
|
|
|
149
158
|
return normalized in {"write it", "write"} or normalized.startswith("write ")
|
|
150
159
|
|
|
151
160
|
|
|
152
|
-
|
|
161
|
+
def intent_tool_targets() -> tuple[str, ...]:
|
|
162
|
+
"""Return all tool ids the deterministic router can target."""
|
|
163
|
+
return _TARGET_TOOLS
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
__all__ = ["IntentDecision", "IntentRouter", "intent_tool_targets"]
|
|
@@ -33,6 +33,18 @@ _PERMISSION_ORDER = {
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
|
|
36
|
+
def _render_evidence(evidence: list[dict[str, Any]]) -> str:
|
|
37
|
+
lines: list[str] = []
|
|
38
|
+
for item in evidence:
|
|
39
|
+
ref = str(item.get("id", "evidence"))
|
|
40
|
+
text = " ".join(str(item.get("text", "")).split())
|
|
41
|
+
if text:
|
|
42
|
+
lines.append(f"- [{ref}] {text}")
|
|
43
|
+
else:
|
|
44
|
+
lines.append(f"- [{ref}]")
|
|
45
|
+
return "\n".join(lines)
|
|
46
|
+
|
|
47
|
+
|
|
36
48
|
class AgentKernel:
|
|
37
49
|
"""Run one agent turn through classification, retrieval, tools, and provider."""
|
|
38
50
|
|
|
@@ -89,7 +101,7 @@ class AgentKernel:
|
|
|
89
101
|
permission_level=effective_ceiling,
|
|
90
102
|
)
|
|
91
103
|
|
|
92
|
-
text = self._call_provider(request, intent, events, trace_id,
|
|
104
|
+
text = self._call_provider(request, intent, events, trace_id, evidence)
|
|
93
105
|
self._append_message(request.session_id, "assistant", text)
|
|
94
106
|
self._record_events(events)
|
|
95
107
|
return AgentTurnResult(
|
|
@@ -142,8 +154,8 @@ class AgentKernel:
|
|
|
142
154
|
return
|
|
143
155
|
|
|
144
156
|
content = request.text
|
|
145
|
-
if
|
|
146
|
-
content = f"{request.text}\
|
|
157
|
+
if evidence:
|
|
158
|
+
content = f"{request.text}\n\nProject evidence:\n{_render_evidence(evidence)}"
|
|
147
159
|
provider_request = ProviderRequest(
|
|
148
160
|
role="planner" if intent.name == "retrieve_context" else "drafter",
|
|
149
161
|
messages=self._provider_messages(request, content),
|
|
@@ -319,6 +331,32 @@ class AgentKernel:
|
|
|
319
331
|
arguments = dict(rewritten.arguments)
|
|
320
332
|
|
|
321
333
|
required = self._tool_permission(tool_name) or intent.required_permission
|
|
334
|
+
if self._tools is None:
|
|
335
|
+
events.append(
|
|
336
|
+
{
|
|
337
|
+
"type": "tool_registry_missing",
|
|
338
|
+
"trace_id": trace_id,
|
|
339
|
+
"tool": tool_name,
|
|
340
|
+
}
|
|
341
|
+
)
|
|
342
|
+
text = f"Tool registry is not configured for this chat surface. Trace: {trace_id}"
|
|
343
|
+
self._append_message(request.session_id, "assistant", text)
|
|
344
|
+
self._record_events(events)
|
|
345
|
+
return AgentTurnResult(
|
|
346
|
+
text=text,
|
|
347
|
+
intent=intent,
|
|
348
|
+
tool_calls=[
|
|
349
|
+
ToolCallResult(
|
|
350
|
+
name=tool_name or "",
|
|
351
|
+
status="failed",
|
|
352
|
+
error="tool registry missing",
|
|
353
|
+
)
|
|
354
|
+
],
|
|
355
|
+
evidence_refs=evidence_refs,
|
|
356
|
+
memory_candidate_ids=memory_ids,
|
|
357
|
+
events=events,
|
|
358
|
+
trace_id=trace_id,
|
|
359
|
+
)
|
|
322
360
|
if not self._permission_allows(permission_level, required):
|
|
323
361
|
events.append(
|
|
324
362
|
{
|
|
@@ -326,9 +364,13 @@ class AgentKernel:
|
|
|
326
364
|
"trace_id": trace_id,
|
|
327
365
|
"tool": tool_name,
|
|
328
366
|
"required_permission": required,
|
|
367
|
+
"current_permission": permission_level,
|
|
329
368
|
}
|
|
330
369
|
)
|
|
331
|
-
text =
|
|
370
|
+
text = (
|
|
371
|
+
f"Permission denied for {tool_name}; "
|
|
372
|
+
f"required={required} current={permission_level}. Trace {trace_id}."
|
|
373
|
+
)
|
|
332
374
|
self._append_message(request.session_id, "assistant", text)
|
|
333
375
|
self._record_events(events)
|
|
334
376
|
return AgentTurnResult(
|
|
@@ -400,11 +442,11 @@ class AgentKernel:
|
|
|
400
442
|
intent: AgentIntent,
|
|
401
443
|
events: list[dict[str, Any]],
|
|
402
444
|
trace_id: str,
|
|
403
|
-
|
|
445
|
+
evidence: list[dict[str, Any]],
|
|
404
446
|
) -> str:
|
|
405
447
|
content = request.text
|
|
406
|
-
if
|
|
407
|
-
content = f"{request.text}\
|
|
448
|
+
if evidence:
|
|
449
|
+
content = f"{request.text}\n\nProject evidence:\n{_render_evidence(evidence)}"
|
|
408
450
|
provider_request = ProviderRequest(
|
|
409
451
|
role="planner" if intent.name == "retrieve_context" else "drafter",
|
|
410
452
|
messages=self._provider_messages(request, content),
|
|
@@ -359,6 +359,7 @@ def default_tool_registry() -> ToolRegistry:
|
|
|
359
359
|
("chapter.prepare", "draft_write", "Prepare chapter context"),
|
|
360
360
|
("chapter.run", "draft_write", "Draft chapter artifacts"),
|
|
361
361
|
("chapter.accept", "project_write", "Accept chapter output"),
|
|
362
|
+
("provider.configure", "draft_write", "Configure a model provider"),
|
|
362
363
|
("provider.certify", "draft_write", "Write provider certification records"),
|
|
363
364
|
("install.doctor", "read_only", "Run installation diagnostics"),
|
|
364
365
|
("install.shell_completion", "system_write", "Install shell completions"),
|
|
@@ -4,6 +4,7 @@ from .handoff import ChatWorkflowHandoff, HandoffPackage
|
|
|
4
4
|
from .context import ActiveContext, ActiveContextStore
|
|
5
5
|
from .memory import ChatMemoryExtractor, MemoryCandidate
|
|
6
6
|
from .prompts import ChatPromptBuilder, PromptItem, PromptPack
|
|
7
|
+
from .project_retrieval import ProjectChatRetriever
|
|
7
8
|
from .retrieval import ChatAnswer, ChatCitation, ChatEvidence, ChatRetrievalResponder
|
|
8
9
|
from .session import (
|
|
9
10
|
ChatContext,
|
|
@@ -41,6 +42,7 @@ __all__ = [
|
|
|
41
42
|
"MemoryCandidate",
|
|
42
43
|
"PromptItem",
|
|
43
44
|
"PromptPack",
|
|
45
|
+
"ProjectChatRetriever",
|
|
44
46
|
"SlashCommandAction",
|
|
45
47
|
"SlashCommandContext",
|
|
46
48
|
"SlashCommandRegistry",
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"""Lightweight project evidence retrieval for chat surfaces."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import re
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
_TEXT_SUFFIXES = {".md", ".txt", ".yaml", ".yml", ".json", ".jsonl"}
|
|
11
|
+
_SOURCE_HINTS = (
|
|
12
|
+
("manifest", ("manifest",)),
|
|
13
|
+
("bible", ("bible",)),
|
|
14
|
+
("timeline", ("timeline",)),
|
|
15
|
+
("relation", ("relation", "relationship")),
|
|
16
|
+
("foreshadow", ("foreshadow",)),
|
|
17
|
+
("character_arc", ("character", "arc")),
|
|
18
|
+
("chapter", ("chapter", "chapters", "scene", "scenes")),
|
|
19
|
+
("rag", ("rag", "chunk", "chunks")),
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ProjectChatRetriever:
|
|
24
|
+
"""Scan project artifacts and return deterministic evidence snippets.
|
|
25
|
+
|
|
26
|
+
This first pass intentionally avoids vector dependencies. It favours
|
|
27
|
+
predictable file-structure hints and keyword overlap so project chat has
|
|
28
|
+
useful citations even in a fresh PyPI install.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
def __init__(self, workspace_root: str | Path = ".pf-agent/workspace", *, max_results: int = 8) -> None:
|
|
32
|
+
self.workspace_root = Path(workspace_root)
|
|
33
|
+
self.max_results = max(1, max_results)
|
|
34
|
+
|
|
35
|
+
def retrieve(self, project_slug: str | None, query: str) -> list[dict[str, Any]]:
|
|
36
|
+
if not project_slug:
|
|
37
|
+
return []
|
|
38
|
+
project_root = (self.workspace_root / project_slug).resolve()
|
|
39
|
+
try:
|
|
40
|
+
project_root.relative_to(self.workspace_root.resolve())
|
|
41
|
+
except ValueError:
|
|
42
|
+
return []
|
|
43
|
+
if not project_root.is_dir():
|
|
44
|
+
return []
|
|
45
|
+
|
|
46
|
+
tokens = _tokens(query)
|
|
47
|
+
candidates: list[dict[str, Any]] = []
|
|
48
|
+
for path in sorted(project_root.rglob("*")):
|
|
49
|
+
if not path.is_file() or path.suffix.lower() not in _TEXT_SUFFIXES:
|
|
50
|
+
continue
|
|
51
|
+
try:
|
|
52
|
+
text = path.read_text(encoding="utf-8")
|
|
53
|
+
except UnicodeDecodeError:
|
|
54
|
+
continue
|
|
55
|
+
rel_path = path.relative_to(project_root)
|
|
56
|
+
source = _source_for(rel_path)
|
|
57
|
+
score, snippet = _score_text(text, tokens, source)
|
|
58
|
+
if score <= 0:
|
|
59
|
+
continue
|
|
60
|
+
candidates.append(
|
|
61
|
+
{
|
|
62
|
+
"id": f"{source}:{rel_path.as_posix()}",
|
|
63
|
+
"source": source,
|
|
64
|
+
"text": snippet,
|
|
65
|
+
"path": str(path),
|
|
66
|
+
"confidence": round(min(0.99, score / 12), 2),
|
|
67
|
+
"score": score,
|
|
68
|
+
}
|
|
69
|
+
)
|
|
70
|
+
candidates.sort(key=lambda item: (-float(item["score"]), str(item["path"])))
|
|
71
|
+
return [
|
|
72
|
+
{key: value for key, value in item.items() if key != "score"}
|
|
73
|
+
for item in candidates[: self.max_results]
|
|
74
|
+
]
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _tokens(text: str) -> set[str]:
|
|
78
|
+
lowered = text.lower()
|
|
79
|
+
tokens = {token for token in re.findall(r"[a-z0-9_]{2,}", lowered)}
|
|
80
|
+
tokens.update(re.findall(r"[\u4e00-\u9fff]{2,}", text))
|
|
81
|
+
return tokens
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _source_for(path: Path) -> str:
|
|
85
|
+
haystack = path.as_posix().lower()
|
|
86
|
+
for source, hints in _SOURCE_HINTS:
|
|
87
|
+
if any(hint in haystack for hint in hints):
|
|
88
|
+
return source
|
|
89
|
+
return "artifact"
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def _score_text(text: str, tokens: set[str], source: str) -> tuple[float, str]:
|
|
93
|
+
lines = [line.strip() for line in text.splitlines() if line.strip()]
|
|
94
|
+
if not lines:
|
|
95
|
+
return 0, ""
|
|
96
|
+
source_bonus = {
|
|
97
|
+
"manifest": 1.5,
|
|
98
|
+
"bible": 2.0,
|
|
99
|
+
"timeline": 2.0,
|
|
100
|
+
"relation": 1.8,
|
|
101
|
+
"foreshadow": 1.8,
|
|
102
|
+
"character_arc": 1.8,
|
|
103
|
+
"chapter": 1.4,
|
|
104
|
+
"rag": 1.6,
|
|
105
|
+
}.get(source, 1.0)
|
|
106
|
+
best_line = lines[0]
|
|
107
|
+
best_overlap = 0
|
|
108
|
+
for line in lines:
|
|
109
|
+
line_tokens = _tokens(line)
|
|
110
|
+
overlap = len(tokens & line_tokens) if tokens else 0
|
|
111
|
+
if overlap > best_overlap:
|
|
112
|
+
best_overlap = overlap
|
|
113
|
+
best_line = line
|
|
114
|
+
if best_overlap == 0:
|
|
115
|
+
# Keep high-signal project structure lightly discoverable.
|
|
116
|
+
if source in {"manifest", "bible", "timeline", "relation", "foreshadow", "character_arc"}:
|
|
117
|
+
return source_bonus, _snippet(best_line)
|
|
118
|
+
return 0, ""
|
|
119
|
+
return best_overlap + source_bonus, _snippet(best_line)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def _snippet(text: str, *, limit: int = 360) -> str:
|
|
123
|
+
clean = " ".join(text.split())
|
|
124
|
+
return clean if len(clean) <= limit else clean[: limit - 1].rstrip() + "..."
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
__all__ = ["ProjectChatRetriever"]
|
|
@@ -7,7 +7,9 @@ from .. import _bootstrap # noqa: F401 # UTF-8 + path hardening, must run earl
|
|
|
7
7
|
import sys
|
|
8
8
|
from typing import TextIO
|
|
9
9
|
|
|
10
|
-
from ..agent import AgentKernel, AgentTurnRequest, IntentRouter
|
|
10
|
+
from ..agent import AgentKernel, AgentTurnRequest, IntentRouter, default_tool_registry
|
|
11
|
+
from ..agent.safety import InjectionGuard
|
|
12
|
+
from .project_retrieval import ProjectChatRetriever
|
|
11
13
|
from .session import ChatSessionStore
|
|
12
14
|
from .slash import SlashCommandContext, SlashCommandRegistry
|
|
13
15
|
|
|
@@ -40,8 +42,11 @@ class ChatRepl:
|
|
|
40
42
|
self.slash_registry = SlashCommandRegistry.default()
|
|
41
43
|
self.kernel = AgentKernel(
|
|
42
44
|
provider=provider,
|
|
45
|
+
tools=default_tool_registry(),
|
|
46
|
+
retrieval=ProjectChatRetriever(session_store.root / "workspace") if project_slug else None,
|
|
43
47
|
session_store=session_store,
|
|
44
48
|
intent_router=IntentRouter(),
|
|
49
|
+
safety=InjectionGuard(),
|
|
45
50
|
)
|
|
46
51
|
|
|
47
52
|
def run(self) -> int:
|