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.
Files changed (434) hide show
  1. proseforge_agent-0.4.0/PKG-INFO +133 -0
  2. proseforge_agent-0.4.0/README.md +112 -0
  3. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/pyproject.toml +9 -4
  4. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/__init__.py +1 -1
  5. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/intent_router.py +15 -1
  6. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/kernel.py +49 -7
  7. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/tools.py +1 -0
  8. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chat/__init__.py +2 -0
  9. proseforge_agent-0.4.0/src/proseforge_agent/chat/project_retrieval.py +127 -0
  10. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chat/repl.py +6 -1
  11. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/cli.py +184 -13
  12. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/package_checks.py +6 -2
  13. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/release/__init__.py +12 -4
  14. proseforge_agent-0.4.0/src/proseforge_agent/tui/__init__.py +17 -0
  15. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/tui/app.py +6 -1
  16. proseforge_agent-0.4.0/src/proseforge_agent/tui/product.py +248 -0
  17. proseforge_agent-0.4.0/src/proseforge_agent/workflows.py +82 -0
  18. proseforge_agent-0.4.0/src/proseforge_agent.egg-info/PKG-INFO +133 -0
  19. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent.egg-info/SOURCES.txt +8 -0
  20. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent.egg-info/requires.txt +2 -0
  21. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_docker_distribution.py +2 -1
  22. proseforge_agent-0.4.0/tests/test_package.py +17 -0
  23. proseforge_agent-0.4.0/tests/test_product_positioning.py +28 -0
  24. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_pypi_first_publish_and_version_bump.py +2 -2
  25. proseforge_agent-0.4.0/tests/test_real_agent_loop.py +188 -0
  26. proseforge_agent-0.4.0/tests/test_release_workflow_hygiene.py +42 -0
  27. proseforge_agent-0.4.0/tests/test_user_distribution_docs.py +47 -0
  28. proseforge_agent-0.4.0/tests/test_workflow_packs.py +27 -0
  29. proseforge_agent-0.3.2/PKG-INFO +0 -620
  30. proseforge_agent-0.3.2/README.md +0 -601
  31. proseforge_agent-0.3.2/src/proseforge_agent/tui/__init__.py +0 -7
  32. proseforge_agent-0.3.2/src/proseforge_agent.egg-info/PKG-INFO +0 -620
  33. proseforge_agent-0.3.2/tests/test_package.py +0 -7
  34. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/LICENSE +0 -0
  35. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/setup.cfg +0 -0
  36. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/__main__.py +0 -0
  37. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/_bootstrap.py +0 -0
  38. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/__init__.py +0 -0
  39. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/artifacts.py +0 -0
  40. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/attachments.py +0 -0
  41. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/audit.py +0 -0
  42. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/context_window.py +0 -0
  43. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/control.py +0 -0
  44. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/degradation.py +0 -0
  45. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/eval.py +0 -0
  46. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/events.py +0 -0
  47. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/execution_guard.py +0 -0
  48. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/function_calling.py +0 -0
  49. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/loop.py +0 -0
  50. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/middleware.py +0 -0
  51. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/modes.py +0 -0
  52. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/observability.py +0 -0
  53. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/offline.py +0 -0
  54. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/permissions.py +0 -0
  55. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/planner.py +0 -0
  56. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/profiles.py +0 -0
  57. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/prompt_templates.py +0 -0
  58. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/provider_fallback.py +0 -0
  59. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/reflection.py +0 -0
  60. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/request_cache.py +0 -0
  61. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/safety.py +0 -0
  62. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/sandbox.py +0 -0
  63. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/structured_output.py +0 -0
  64. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/subagent.py +0 -0
  65. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/agent/types.py +0 -0
  66. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/capabilities.py +0 -0
  67. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chapter/__init__.py +0 -0
  68. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chapter/accept.py +0 -0
  69. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chapter/context.py +0 -0
  70. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chapter/draft.py +0 -0
  71. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chapter/lifecycle.py +0 -0
  72. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chapter/review.py +0 -0
  73. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chapter/rewrite.py +0 -0
  74. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chat/context.py +0 -0
  75. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chat/handoff.py +0 -0
  76. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chat/memory.py +0 -0
  77. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chat/prompts.py +0 -0
  78. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chat/retrieval.py +0 -0
  79. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chat/session.py +0 -0
  80. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chat/slash.py +0 -0
  81. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chat/system_prompts.py +0 -0
  82. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/chat/transcript.py +0 -0
  83. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/concurrency.py +0 -0
  84. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/config.py +0 -0
  85. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/cron/__init__.py +0 -0
  86. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/cron/core.py +0 -0
  87. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/daily/__init__.py +0 -0
  88. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/daily/recommend.py +0 -0
  89. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/daily/workbook.py +0 -0
  90. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/demo.py +0 -0
  91. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/dotenv.py +0 -0
  92. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/__init__.py +0 -0
  93. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/base.py +0 -0
  94. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/checkpoints.py +0 -0
  95. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/daytona.py +0 -0
  96. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/docker.py +0 -0
  97. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/file_sync.py +0 -0
  98. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/local.py +0 -0
  99. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/modal.py +0 -0
  100. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/process_registry.py +0 -0
  101. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/process_runner.py +0 -0
  102. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/serverless.py +0 -0
  103. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/singularity.py +0 -0
  104. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/environments/ssh.py +0 -0
  105. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/errors.py +0 -0
  106. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/eval/__init__.py +0 -0
  107. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/eval/trajectories.py +0 -0
  108. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/extensions/__init__.py +0 -0
  109. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/extensions/base.py +0 -0
  110. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/extensions/registry.py +0 -0
  111. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/__init__.py +0 -0
  112. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/core.py +0 -0
  113. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/delivery.py +0 -0
  114. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/media.py +0 -0
  115. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/platforms/__init__.py +0 -0
  116. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/platforms/base.py +0 -0
  117. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/platforms/discord.py +0 -0
  118. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/platforms/email.py +0 -0
  119. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/platforms/mobile_email.py +0 -0
  120. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/platforms/signal.py +0 -0
  121. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/platforms/slack.py +0 -0
  122. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/platforms/telegram.py +0 -0
  123. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/platforms/telegram_transport.py +0 -0
  124. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/platforms/whatsapp.py +0 -0
  125. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/poller.py +0 -0
  126. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/relay/__init__.py +0 -0
  127. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/gateway/relay/auth.py +0 -0
  128. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/__init__.py +0 -0
  129. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/app_dirs.py +0 -0
  130. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/auto_trigger.py +0 -0
  131. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/binary_build.py +0 -0
  132. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/binary_packaging.py +0 -0
  133. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/ci_matrix.py +0 -0
  134. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/docker_plan.py +0 -0
  135. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/doctor.py +0 -0
  136. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/first_run.py +0 -0
  137. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/installer_scripts.py +0 -0
  138. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/installers.py +0 -0
  139. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/linux.py +0 -0
  140. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/local_models.py +0 -0
  141. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/macos.py +0 -0
  142. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/migrations.py +0 -0
  143. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/platform_io.py +0 -0
  144. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/provider_setup.py +0 -0
  145. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/qa_matrix.py +0 -0
  146. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/secrets.py +0 -0
  147. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/shell.py +0 -0
  148. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/support_bundle.py +0 -0
  149. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/uninstall.py +0 -0
  150. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/install/windows.py +0 -0
  151. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/__init__.py +0 -0
  152. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/base.py +0 -0
  153. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/capabilities.py +0 -0
  154. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/certification.py +0 -0
  155. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/docs_refresh.py +0 -0
  156. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/fake.py +0 -0
  157. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/http.py +0 -0
  158. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/openai_compatible.py +0 -0
  159. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/policies.py +0 -0
  160. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/probes.py +0 -0
  161. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/profiles.py +0 -0
  162. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/__init__.py +0 -0
  163. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/_openai_shape.py +0 -0
  164. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/anthropic.py +0 -0
  165. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/deepseek.py +0 -0
  166. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/doubao.py +0 -0
  167. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/gemini.py +0 -0
  168. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/glm.py +0 -0
  169. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/grok.py +0 -0
  170. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/mimo.py +0 -0
  171. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/minimax.py +0 -0
  172. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/openai.py +0 -0
  173. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/profiles/anthropic.yaml +0 -0
  174. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/profiles/deepseek.yaml +0 -0
  175. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/profiles/doubao.yaml +0 -0
  176. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/profiles/gemini.yaml +0 -0
  177. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/profiles/glm.yaml +0 -0
  178. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/profiles/mimo.yaml +0 -0
  179. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/profiles/minimax.yaml +0 -0
  180. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/profiles/openai.yaml +0 -0
  181. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/profiles/qwen.yaml +0 -0
  182. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/profiles/xai.yaml +0 -0
  183. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/providers/qwen.py +0 -0
  184. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/registry.py +0 -0
  185. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/router.py +0 -0
  186. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/streaming.py +0 -0
  187. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/llm/usage.py +0 -0
  188. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/mcp/__init__.py +0 -0
  189. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/mcp/approval.py +0 -0
  190. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/mcp/client.py +0 -0
  191. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/mcp/credentials.py +0 -0
  192. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/mcp/policy.py +0 -0
  193. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/mcp/registry.py +0 -0
  194. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/mcp/schema.py +0 -0
  195. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/memory/__init__.py +0 -0
  196. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/memory/compact.py +0 -0
  197. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/memory/ingest.py +0 -0
  198. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/memory/nudges.py +0 -0
  199. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/memory/review.py +0 -0
  200. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/memory/schema.py +0 -0
  201. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/memory/store.py +0 -0
  202. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/memory/user_model.py +0 -0
  203. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/notifications/__init__.py +0 -0
  204. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/notifications/core.py +0 -0
  205. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/notifications/desktop.py +0 -0
  206. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/notifications/jobs.py +0 -0
  207. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/notifications/webhook.py +0 -0
  208. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/__init__.py +0 -0
  209. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/approval_queue.py +0 -0
  210. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/artifacts.py +0 -0
  211. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/backup_verification.py +0 -0
  212. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/bible.py +0 -0
  213. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/character_arcs.py +0 -0
  214. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/continuity.py +0 -0
  215. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/draft_versioning.py +0 -0
  216. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/editorial_pipeline.py +0 -0
  217. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/exporter.py +0 -0
  218. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/foreshadowing.py +0 -0
  219. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/importer.py +0 -0
  220. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/literary_regression.py +0 -0
  221. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/manifest.py +0 -0
  222. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/manuscript_search.py +0 -0
  223. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/plot_threads.py +0 -0
  224. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/project_health.py +0 -0
  225. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/publishing.py +0 -0
  226. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/reader_review.py +0 -0
  227. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/relationship_graph.py +0 -0
  228. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/reorganize.py +0 -0
  229. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/rewrite_strategies.py +0 -0
  230. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/safety.py +0 -0
  231. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/scenes.py +0 -0
  232. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/storage.py +0 -0
  233. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/style_profile.py +0 -0
  234. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/timeline.py +0 -0
  235. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/writing_analytics.py +0 -0
  236. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/writing_quality.py +0 -0
  237. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/novel/writing_rules.py +0 -0
  238. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/planning/__init__.py +0 -0
  239. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/planning/intake.py +0 -0
  240. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/planning/phase_plan.py +0 -0
  241. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/plugins/__init__.py +0 -0
  242. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/plugins/dependencies.py +0 -0
  243. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/plugins/discovery.py +0 -0
  244. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/plugins/harness.py +0 -0
  245. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/plugins/hooks.py +0 -0
  246. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/plugins/manager.py +0 -0
  247. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/plugins/manifest.py +0 -0
  248. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/plugins/permissions.py +0 -0
  249. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/plugins/sandbox.py +0 -0
  250. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/proseforge/__init__.py +0 -0
  251. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/proseforge/adapter.py +0 -0
  252. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/proseforge/results.py +0 -0
  253. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/release/complete_agent_gate.py +0 -0
  254. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/release/publish.py +0 -0
  255. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/release/version_policy.py +0 -0
  256. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/reports/__init__.py +0 -0
  257. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/reports/registry.py +0 -0
  258. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/reports/render.py +0 -0
  259. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/retrieval/__init__.py +0 -0
  260. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/retrieval/embeddings.py +0 -0
  261. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/retrieval/evaluation.py +0 -0
  262. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/retrieval/evidence.py +0 -0
  263. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/retrieval/hybrid.py +0 -0
  264. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/retrieval/index.py +0 -0
  265. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/retrieval/ingestion.py +0 -0
  266. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/retrieval/router.py +0 -0
  267. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/retrieval/vector_store.py +0 -0
  268. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/service/__init__.py +0 -0
  269. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/service/api.py +0 -0
  270. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/service/http_server.py +0 -0
  271. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/setup/__init__.py +0 -0
  272. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/setup/config_generator.py +0 -0
  273. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/setup/first_run.py +0 -0
  274. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/setup/modes.py +0 -0
  275. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/setup/recovery.py +0 -0
  276. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/setup/summary.py +0 -0
  277. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/setup/wizard.py +0 -0
  278. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/skills/__init__.py +0 -0
  279. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/skills/audit.py +0 -0
  280. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/skills/creation.py +0 -0
  281. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/skills/hub.py +0 -0
  282. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/skills/improvement.py +0 -0
  283. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/skills/install.py +0 -0
  284. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/skills/registry.py +0 -0
  285. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/skills/usage.py +0 -0
  286. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/testing/__init__.py +0 -0
  287. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/testing/fakes.py +0 -0
  288. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/tools/__init__.py +0 -0
  289. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/tools/managed/__init__.py +0 -0
  290. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/tools/managed/cloud_browser.py +0 -0
  291. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/tools/managed/media.py +0 -0
  292. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/tools/managed/url_safety.py +0 -0
  293. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/tools/managed/web_search.py +0 -0
  294. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/tui/ansi.py +0 -0
  295. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/tui/fullscreen.py +0 -0
  296. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/tui/keys.py +0 -0
  297. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/tui/screen.py +0 -0
  298. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/tui/streaming.py +0 -0
  299. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/workflow/__init__.py +0 -0
  300. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/workflow/recovery.py +0 -0
  301. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/workflow/state.py +0 -0
  302. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent/workspace.py +0 -0
  303. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent.egg-info/dependency_links.txt +0 -0
  304. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent.egg-info/entry_points.txt +0 -0
  305. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/src/proseforge_agent.egg-info/top_level.txt +0 -0
  306. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_agent_events_jobs.py +0 -0
  307. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_agent_kernel.py +0 -0
  308. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_agent_loop.py +0 -0
  309. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_agent_profiles_personas.py +0 -0
  310. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_agent_safety_guard.py +0 -0
  311. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_agent_tools_permissions.py +0 -0
  312. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_app_dirs.py +0 -0
  313. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_attachment_ingestion.py +0 -0
  314. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_audit_trail_debuggability.py +0 -0
  315. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_binary_build.py +0 -0
  316. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_binary_packaging.py +0 -0
  317. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_capabilities.py +0 -0
  318. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_chapter_lifecycle.py +0 -0
  319. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_chapter_review.py +0 -0
  320. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_chat_cli_repl.py +0 -0
  321. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_chat_memory_preferences.py +0 -0
  322. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_chat_prompt_protocol.py +0 -0
  323. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_chat_retrieval_citations.py +0 -0
  324. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_chat_session_store.py +0 -0
  325. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_chat_workflow_handoff.py +0 -0
  326. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_ci_pipeline.py +0 -0
  327. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_cli.py +0 -0
  328. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_cli_commands.py +0 -0
  329. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_cli_config_yaml_example_seed.py +0 -0
  330. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_cli_quickstart.py +0 -0
  331. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_community_and_agent_docs.py +0 -0
  332. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_complete_agent_release_gate.py +0 -0
  333. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_concurrency_locking.py +0 -0
  334. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_config.py +0 -0
  335. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_context_window_management.py +0 -0
  336. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_control_interrupt.py +0 -0
  337. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_conversation_lifecycle.py +0 -0
  338. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_cross_session_search.py +0 -0
  339. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_daily_recommendations.py +0 -0
  340. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_daily_workbook.py +0 -0
  341. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_default_provider_resolution.py +0 -0
  342. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_default_tui_on_bare_command.py +0 -0
  343. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_dotenv_support.py +0 -0
  344. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_dotenv_workspace_env.py +0 -0
  345. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_e2e_demo.py +0 -0
  346. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_evidence_pack.py +0 -0
  347. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_execution_guard_timeout.py +0 -0
  348. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_extensions.py +0 -0
  349. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_first_run_auto_trigger.py +0 -0
  350. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_first_run_onboarding.py +0 -0
  351. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_fs_edit_and_registry_hardening.py +0 -0
  352. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_general_tools.py +0 -0
  353. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_graceful_degradation.py +0 -0
  354. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_injection_guard_cjk_precision.py +0 -0
  355. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_installation_doctor.py +0 -0
  356. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_installer_first_run_ux.py +0 -0
  357. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_intent_router.py +0 -0
  358. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_linux_native_support.py +0 -0
  359. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_llm_fake_and_routing.py +0 -0
  360. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_llm_response_normalization.py +0 -0
  361. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_local_agent_service_api.py +0 -0
  362. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_loud_placeholders_and_wiring.py +0 -0
  363. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_low_severity_review_cleanups.py +0 -0
  364. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_macos_native_support.py +0 -0
  365. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_managed_install_scripts.py +0 -0
  366. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_mcp_policy_enforced_in_client.py +0 -0
  367. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_memory_compaction.py +0 -0
  368. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_memory_ingestion.py +0 -0
  369. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_memory_schema.py +0 -0
  370. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_memory_store.py +0 -0
  371. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_middleware_hooks_trajectory_datasets.py +0 -0
  372. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_middleware_wiring.py +0 -0
  373. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_native_qa_matrix.py +0 -0
  374. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_native_secret_storage.py +0 -0
  375. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_observer_hooks_telemetry_export.py +0 -0
  376. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_offline_local_model_setup.py +0 -0
  377. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_offline_mode.py +0 -0
  378. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_openai_compatible_provider.py +0 -0
  379. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_os_installers.py +0 -0
  380. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_phase_plan_generator.py +0 -0
  381. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_platform_io.py +0 -0
  382. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_prompt_template_registry.py +0 -0
  383. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_proseforge_adapter.py +0 -0
  384. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_anthropic.py +0 -0
  385. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_certification.py +0 -0
  386. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_deepseek.py +0 -0
  387. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_doubao.py +0 -0
  388. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_fallback.py +0 -0
  389. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_gemini.py +0 -0
  390. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_glm.py +0 -0
  391. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_grok.py +0 -0
  392. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_mimo.py +0 -0
  393. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_minimax.py +0 -0
  394. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_openai.py +0 -0
  395. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_probes.py +0 -0
  396. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_profiles.py +0 -0
  397. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_qwen.py +0 -0
  398. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_registry.py +0 -0
  399. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_router.py +0 -0
  400. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_setup_wizard.py +0 -0
  401. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_provider_usage_metering.py +0 -0
  402. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_pypi_publish.py +0 -0
  403. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_python_install_flows.py +0 -0
  404. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_readme_localization.py +0 -0
  405. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_release_checks.py +0 -0
  406. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_report_readiness_badge.py +0 -0
  407. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_reports.py +0 -0
  408. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_request_cache.py +0 -0
  409. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_retrieval_router.py +0 -0
  410. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_rewrite_accept.py +0 -0
  411. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_self_verification.py +0 -0
  412. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_service_http_server.py +0 -0
  413. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_session_branching.py +0 -0
  414. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_session_export_import.py +0 -0
  415. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_shell_completions_launchers.py +0 -0
  416. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_store_concurrency_and_idempotency.py +0 -0
  417. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_streaming_responses.py +0 -0
  418. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_streaming_tool_output.py +0 -0
  419. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_structured_function_calling.py +0 -0
  420. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_sub_agent.py +0 -0
  421. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_support_bundle.py +0 -0
  422. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_system_prompt_management.py +0 -0
  423. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_task_planner.py +0 -0
  424. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_tool_result_artifacts_output_limits.py +0 -0
  425. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_tool_sandbox.py +0 -0
  426. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_tool_timeout_rate_limit_circuit_breaker.py +0 -0
  427. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_unified_redaction.py +0 -0
  428. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_uninstall_data_retention.py +0 -0
  429. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_upgrade_migration_backup.py +0 -0
  430. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_windows_native_support.py +0 -0
  431. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_windows_utf8_bootstrap.py +0 -0
  432. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_workflow_recovery.py +0 -0
  433. {proseforge_agent-0.3.2 → proseforge_agent-0.4.0}/tests/test_workflow_state.py +0 -0
  434. {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.3.2"
8
- description = "Agentic orchestration layer for long-form novel production on top of the ProseForge engine."
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 = ["pyyaml>=6.0", "tomli>=2.0; python_version < '3.11'"]
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"]
@@ -5,6 +5,6 @@ or require API keys. Subsystem behavior lives behind dedicated submodules
5
5
  that are imported explicitly by their callers.
6
6
  """
7
7
 
8
- __version__ = "0.3.2"
8
+ __version__ = "0.4.0"
9
9
 
10
10
  __all__ = ["__version__"]
@@ -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
- __all__ = ["IntentDecision", "IntentRouter"]
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, evidence_refs)
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 evidence_refs:
146
- content = f"{request.text}\nEvidence refs: {', '.join(evidence_refs)}"
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 = f"Permission denied for {tool_name}; requires {required}. Trace {trace_id}."
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
- evidence_refs: list[str],
445
+ evidence: list[dict[str, Any]],
404
446
  ) -> str:
405
447
  content = request.text
406
- if evidence_refs:
407
- content = f"{request.text}\nEvidence refs: {', '.join(evidence_refs)}"
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: