flowjet 2.1.7__tar.gz → 2.1.8__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 (175) hide show
  1. {flowjet-2.1.7 → flowjet-2.1.8}/CHANGELOG.md +17 -0
  2. {flowjet-2.1.7 → flowjet-2.1.8}/PKG-INFO +1 -1
  3. {flowjet-2.1.7 → flowjet-2.1.8}/pyproject.toml +1 -1
  4. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/agent/workspace.py +70 -6
  5. {flowjet-2.1.7 → flowjet-2.1.8}/.gitignore +0 -0
  6. {flowjet-2.1.7 → flowjet-2.1.8}/LICENSE +0 -0
  7. {flowjet-2.1.7 → flowjet-2.1.8}/README.md +0 -0
  8. {flowjet-2.1.7 → flowjet-2.1.8}/config/nano-local.yml +0 -0
  9. {flowjet-2.1.7 → flowjet-2.1.8}/config/nano-sandbox-soothe.yml +0 -0
  10. {flowjet-2.1.7 → flowjet-2.1.8}/config/nano.yml +0 -0
  11. {flowjet-2.1.7 → flowjet-2.1.8}/deploy/README.md +0 -0
  12. {flowjet-2.1.7 → flowjet-2.1.8}/docs/completion-design.md +0 -0
  13. {flowjet-2.1.7 → flowjet-2.1.8}/docs/impl/IG-001-openai-compatible-server.md +0 -0
  14. {flowjet-2.1.7 → flowjet-2.1.8}/docs/impl/IG-002-isolated-thread-pool-runtime.md +0 -0
  15. {flowjet-2.1.7 → flowjet-2.1.8}/docs/impl/IG-003-production-isolation-hardening.md +0 -0
  16. {flowjet-2.1.7 → flowjet-2.1.8}/docs/specs/RFC-001-openai-compatible-api.md +0 -0
  17. {flowjet-2.1.7 → flowjet-2.1.8}/docs/specs/RFC-002-isolated-thread-pool-runtime.md +0 -0
  18. {flowjet-2.1.7 → flowjet-2.1.8}/docs/specs/RFC-003-production-isolation-hardening.md +0 -0
  19. {flowjet-2.1.7 → flowjet-2.1.8}/docs/specs/RFC-004-unified-package.md +0 -0
  20. {flowjet-2.1.7 → flowjet-2.1.8}/docs/specs/RFC-005-arcbox-tool-sandbox.md +0 -0
  21. {flowjet-2.1.7 → flowjet-2.1.8}/docs/specs/rfc-history.md +0 -0
  22. {flowjet-2.1.7 → flowjet-2.1.8}/docs/specs/rfc-index.md +0 -0
  23. {flowjet-2.1.7 → flowjet-2.1.8}/docs/specs/rfc-namings.md +0 -0
  24. {flowjet-2.1.7 → flowjet-2.1.8}/examples/README.md +0 -0
  25. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/__init__.py +0 -0
  26. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/__main__.py +0 -0
  27. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/README.md +0 -0
  28. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/gws-drive/SKILL.md +0 -0
  29. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/gws-drive-upload/SKILL.md +0 -0
  30. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/logo-generator-skill/.env.example +0 -0
  31. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/logo-generator-skill/README.md +0 -0
  32. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/logo-generator-skill/SKILL.md +0 -0
  33. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/logo-generator-skill/assets/background_library.html +0 -0
  34. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/logo-generator-skill/assets/showcase_template.html +0 -0
  35. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/logo-generator-skill/references/background_styles.md +0 -0
  36. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/logo-generator-skill/references/design_patterns.md +0 -0
  37. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/logo-generator-skill/references/webgl_backgrounds.md +0 -0
  38. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/logo-generator-skill/requirements.txt +0 -0
  39. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/logo-generator-skill/scripts/generate_showcase.py +0 -0
  40. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/logo-generator-skill/scripts/svg_to_png.py +0 -0
  41. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/SKILL.md +0 -0
  42. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/brainstorming/spec-document-reviewer-prompt.md +0 -0
  43. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/implementation/coding-plan-template.md +0 -0
  44. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/implementation/impl-guide-template.md +0 -0
  45. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/review/pr-review-template.md +0 -0
  46. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/review/review-checklist.md +0 -0
  47. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/specs/rfc-template.md +0 -0
  48. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/specs/template-architecture-design.md +0 -0
  49. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/specs/template-conceptual-design.md +0 -0
  50. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/specs/template-impl-interface-design.md +0 -0
  51. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/templates/template-drafts-readme.md +0 -0
  52. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/templates/template-impl-readme.md +0 -0
  53. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/templates/template-platonic.yml +0 -0
  54. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/templates/template-rfc-history.md +0 -0
  55. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/templates/template-rfc-index.md +0 -0
  56. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/templates/template-rfc-namings.md +0 -0
  57. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/templates/template-rfc-standard.md +0 -0
  58. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/BRAINSTORM/brainstorm.md +0 -0
  59. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/IMPL/impl-code.md +0 -0
  60. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/IMPL/impl-create-guide.md +0 -0
  61. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/IMPL/impl-full.md +0 -0
  62. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/IMPL/impl-update-guide.md +0 -0
  63. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/IMPL/impl-validate-guide.md +0 -0
  64. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/INIT/init-plan-modular-specs.md +0 -0
  65. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/INIT/init-recover-architecture.md +0 -0
  66. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/INIT/init-recover-conceptual.md +0 -0
  67. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/INIT/init-recover-impl-interface.md +0 -0
  68. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/INIT/init-scaffold.md +0 -0
  69. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/INIT/init-scan.md +0 -0
  70. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/REFERENCE.md +0 -0
  71. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/REVIEW/review-spec-compliance.md +0 -0
  72. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/SPECS/specs-check-compliance.md +0 -0
  73. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/SPECS/specs-check-taxonomy.md +0 -0
  74. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/SPECS/specs-generate-history.md +0 -0
  75. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/SPECS/specs-generate-index.md +0 -0
  76. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/SPECS/specs-generate-namings.md +0 -0
  77. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/SPECS/specs-refine.md +0 -0
  78. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/SPECS/specs-validate-consistency.md +0 -0
  79. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/WORKFLOW/workflow-overview.md +0 -0
  80. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/WORKFLOW/workflow-phase-1.md +0 -0
  81. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/WORKFLOW/workflow-phase-2.md +0 -0
  82. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/WORKFLOW/workflow-phase-3.md +0 -0
  83. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/SKILL.md +0 -0
  84. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/patterns/evidence-deep.json +0 -0
  85. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/patterns/evidence-first.json +0 -0
  86. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/patterns/idea-first.json +0 -0
  87. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/patterns/loop.json +0 -0
  88. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/patterns/paper-pipeline.json +0 -0
  89. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/patterns/rapid.json +0 -0
  90. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/patterns/rigor-first.json +0 -0
  91. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/patterns/stance-first.json +0 -0
  92. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/patterns/systematic-review.json +0 -0
  93. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/patterns/verify-loop.json +0 -0
  94. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/references/backends.md +0 -0
  95. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/references/handoff-ars-omr.md +0 -0
  96. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/references/handoff-omr-ars.md +0 -0
  97. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/references/routing.md +0 -0
  98. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/scripts/csljson_to_omr.py +0 -0
  99. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/scripts/papers_index_to_csljson.py +0 -0
  100. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/__init__.py +0 -0
  101. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/__main__.py +0 -0
  102. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/agent.py +0 -0
  103. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/cli.py +0 -0
  104. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/completion/__init__.py +0 -0
  105. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/completion/context.py +0 -0
  106. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/completion/engine.py +0 -0
  107. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/doctor_cmd.py +0 -0
  108. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/doctor_fix_cmd.py +0 -0
  109. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/progress.py +0 -0
  110. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/serve_cmd.py +0 -0
  111. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/setup_cmd.py +0 -0
  112. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/shell/__init__.py +0 -0
  113. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/shell/_fj.zsh +0 -0
  114. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/shell/fj.bash +0 -0
  115. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/stream.py +0 -0
  116. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/threads.py +0 -0
  117. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/tool_stream.py +0 -0
  118. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/__init__.py +0 -0
  119. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/_warnings.py +0 -0
  120. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/agent/__init__.py +0 -0
  121. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/agent/config.py +0 -0
  122. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/agent/factory.py +0 -0
  123. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/agent/skills.py +0 -0
  124. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/agent/wiring.py +0 -0
  125. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/backend_config.py +0 -0
  126. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/bridges/base.py +0 -0
  127. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/bridges/nano/__init__.py +0 -0
  128. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/bridges/nano/adapter.py +0 -0
  129. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/bridges/nano/backend.py +0 -0
  130. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/bridges/nano/interrupts.py +0 -0
  131. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/bridges/nano/mapping.py +0 -0
  132. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/bridges/soothe/__init__.py +0 -0
  133. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/bridges/soothe/adapter.py +0 -0
  134. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/bridges/soothe/backend.py +0 -0
  135. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/events.py +0 -0
  136. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/identity.py +0 -0
  137. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/modes.py +0 -0
  138. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/protocol.py +0 -0
  139. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/runtime/__init__.py +0 -0
  140. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/runtime/direct.py +0 -0
  141. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/runtime/fake.py +0 -0
  142. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/runtime/isolation/__init__.py +0 -0
  143. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/runtime/isolation/adapter.py +0 -0
  144. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/runtime/isolation/admission.py +0 -0
  145. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/runtime/isolation/backend.py +0 -0
  146. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/runtime/isolation/errors.py +0 -0
  147. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/runtime/isolation/mode_gate.py +0 -0
  148. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/runtime/isolation/pool.py +0 -0
  149. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/runtime/isolation/request.py +0 -0
  150. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/runtime/isolation/workspace.py +0 -0
  151. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/sandbox/__init__.py +0 -0
  152. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/sandbox/arbox.py +0 -0
  153. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/sandbox/resolver.py +0 -0
  154. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/sandbox/settings.py +0 -0
  155. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/streaming/__init__.py +0 -0
  156. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/streaming/presentation.py +0 -0
  157. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/streaming/tool_results.py +0 -0
  158. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/streaming/tool_stream.py +0 -0
  159. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/home.py +0 -0
  160. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/__init__.py +0 -0
  161. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/__main__.py +0 -0
  162. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/acp/__init__.py +0 -0
  163. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/acp/agent.py +0 -0
  164. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/acp/routes.py +0 -0
  165. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/config.py +0 -0
  166. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/http/__init__.py +0 -0
  167. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/http/app.py +0 -0
  168. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/http/auth.py +0 -0
  169. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/openai_compat/__init__.py +0 -0
  170. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/openai_compat/errors.py +0 -0
  171. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/openai_compat/projection.py +0 -0
  172. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/openai_compat/routes.py +0 -0
  173. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/openai_compat/schemas.py +0 -0
  174. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/openai_compat/service.py +0 -0
  175. {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/openai_compat/store.py +0 -0
@@ -10,6 +10,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
10
10
 
11
11
  ## [Unreleased]
12
12
 
13
+ ## [2.1.8] — 2026-10-26
14
+
15
+ ### Fixed
16
+
17
+ - **PostgreSQL checkpointer is now wired for the server surface.**
18
+ `Checkpointers.open()` (the `/v1/responses` + ACP server path) used to warn
19
+ “Checkpointer backend 'postgresql' is not wired for the flowjet server surface
20
+ yet” and yield `None`, so thread state never survived a turn — a deployment
21
+ whose `persistence.default_backend` is `postgresql` silently ran every turn as
22
+ a fresh conversation. It now builds an `AsyncPostgresSaver` on nano's shared
23
+ checkpoints pool (`resolve_checkpointer()` → `(None, pool)`), opens the pool,
24
+ and runs `setup()` once per process under nano's advisory lock
25
+ (`SharedCheckpointerPool.setup_checkpointer`), so concurrent workers cannot
26
+ race LangGraph's DDL. The shared pool is deliberately **not** closed on exit
27
+ (it is process-wide). Failure still degrades to “no persistence” with a
28
+ warning instead of failing startup; unknown backends keep the old behavior.
29
+
13
30
  ## [2.1.7] — 2026-10-25
14
31
 
15
32
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: flowjet
3
- Version: 2.1.7
3
+ Version: 2.1.8
4
4
  Summary: FlowJet — a fast, open agent runtime for CLI and HTTP, powered by Soothe
5
5
  Project-URL: Homepage, https://github.com/caesar0301/flowjet
6
6
  Project-URL: Repository, https://github.com/caesar0301/flowjet
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "flowjet"
7
- version = "2.1.7"
7
+ version = "2.1.8"
8
8
  description = "FlowJet — a fast, open agent runtime for CLI and HTTP, powered by Soothe"
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -90,20 +90,43 @@ class Checkpointers:
90
90
 
91
91
  Server-surface counterpart of :meth:`open_sqlite`: honors
92
92
  ``agent.protocols.durability.checkpointer`` (which inherits
93
- ``persistence.default_backend``), so a deployment that asks for sqlite
94
- gets thread state that survives across turns, pool workers and
95
- restarts. ``postgresql`` is not wired for the server surface yet — it
96
- warns and yields ``None`` (no persistence) rather than failing
97
- startup.
93
+ ``persistence.default_backend``), so a deployment that asks for
94
+ ``sqlite`` **or** ``postgresql`` gets thread state that survives across
95
+ turns, pool workers and restarts.
96
+
97
+ The PostgreSQL branch builds an ``AsyncPostgresSaver`` on nano's shared
98
+ checkpoints pool so every worker and every restart sees the same
99
+ threads — that is what makes ``conversation_key`` continuity (and
100
+ recovery from an executor restart) work on this surface. Setup runs
101
+ once per process under nano's advisory lock, so parallel workers cannot
102
+ race LangGraph's DDL. Failure is degraded, not fatal: a warning is
103
+ logged and ``None`` is yielded.
98
104
  """
99
105
  try:
100
106
  backend = str(config.resolve_checkpointer_backend()).strip().lower()
101
107
  except Exception: # noqa: BLE001 - unknown config shape → sqlite default
102
108
  backend = "sqlite"
109
+
110
+ if backend == "postgresql":
111
+ try:
112
+ saver = await _connect_postgres(config)
113
+ except Exception: # noqa: BLE001 - persistence is degraded, not fatal
114
+ logger.warning(
115
+ "PostgreSQL checkpointer unavailable; thread state will not "
116
+ "persist across turns",
117
+ exc_info=True,
118
+ )
119
+ yield None
120
+ return
121
+ # The pool is a process-wide singleton shared by every worker:
122
+ # closing it here would break the next turn.
123
+ yield saver
124
+ return
125
+
103
126
  if backend != "sqlite":
104
127
  logger.warning(
105
128
  "Checkpointer backend %r is not wired for the flowjet server "
106
- "surface yet; thread state will not persist across turns",
129
+ "surface; thread state will not persist across turns",
107
130
  backend,
108
131
  )
109
132
  yield None
@@ -123,6 +146,47 @@ class Checkpointers:
123
146
  await saver.conn.close()
124
147
 
125
148
 
149
+ async def _connect_postgres(config: Any) -> Any:
150
+ """Open an ``AsyncPostgresSaver`` on nano's shared checkpoints pool.
151
+
152
+ ``resolve_checkpointer`` returns ``(None, pool)`` for PostgreSQL: the
153
+ saver is built from that pool (not from a DSN), and the pool must be
154
+ opened explicitly before use.
155
+ """
156
+ from langgraph.checkpoint.postgres.aio import AsyncPostgresSaver
157
+ from soothe_nano.utils.serde import create_soothe_serde
158
+
159
+ result = resolve_checkpointer(config)
160
+ pool = result[1] if isinstance(result, tuple) else None
161
+ if pool is None:
162
+ raise RuntimeError("PostgreSQL checkpointer pool unresolved")
163
+
164
+ await pool.open()
165
+ saver = AsyncPostgresSaver(pool, serde=create_soothe_serde())
166
+ await _setup_postgres(pool, saver)
167
+ logger.debug("PostgreSQL checkpointer ready (shared pool)")
168
+ return saver
169
+
170
+
171
+ async def _setup_postgres(pool: Any, saver: Any) -> None:
172
+ """Run ``saver.setup()`` once per process under nano's advisory lock.
173
+
174
+ Parallel `setup()` calls race LangGraph's DDL (``UniqueViolation`` on
175
+ checkpoint types), so nano's helper serializes them — and it is a no-op
176
+ after the first success in this process.
177
+ """
178
+ try:
179
+ from soothe_nano.persistence.shared_checkpointer_pool import (
180
+ SharedCheckpointerPool,
181
+ )
182
+
183
+ await SharedCheckpointerPool.setup_checkpointer(pool, saver.setup)
184
+ return
185
+ except (ImportError, AttributeError): # pragma: no cover - older nano
186
+ # nano without the helper (or without the method): plain setup().
187
+ await saver.setup()
188
+
189
+
126
190
  def _sqlite_db_path(result: Any) -> str | None:
127
191
  """Extract the sqlite db path from a ``resolve_checkpointer`` result."""
128
192
  if isinstance(result, tuple):
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes