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.
- {flowjet-2.1.7 → flowjet-2.1.8}/CHANGELOG.md +17 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/PKG-INFO +1 -1
- {flowjet-2.1.7 → flowjet-2.1.8}/pyproject.toml +1 -1
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/agent/workspace.py +70 -6
- {flowjet-2.1.7 → flowjet-2.1.8}/.gitignore +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/LICENSE +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/README.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/config/nano-local.yml +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/config/nano-sandbox-soothe.yml +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/config/nano.yml +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/deploy/README.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/docs/completion-design.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/docs/impl/IG-001-openai-compatible-server.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/docs/impl/IG-002-isolated-thread-pool-runtime.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/docs/impl/IG-003-production-isolation-hardening.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/docs/specs/RFC-001-openai-compatible-api.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/docs/specs/RFC-002-isolated-thread-pool-runtime.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/docs/specs/RFC-003-production-isolation-hardening.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/docs/specs/RFC-004-unified-package.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/docs/specs/RFC-005-arcbox-tool-sandbox.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/docs/specs/rfc-history.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/docs/specs/rfc-index.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/docs/specs/rfc-namings.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/examples/README.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/__init__.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/__main__.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/README.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/gws-drive/SKILL.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/gws-drive-upload/SKILL.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/logo-generator-skill/.env.example +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/logo-generator-skill/README.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/logo-generator-skill/SKILL.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/logo-generator-skill/assets/background_library.html +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/logo-generator-skill/assets/showcase_template.html +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/logo-generator-skill/references/background_styles.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/logo-generator-skill/references/design_patterns.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/logo-generator-skill/references/webgl_backgrounds.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/logo-generator-skill/requirements.txt +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/logo-generator-skill/scripts/generate_showcase.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/logo-generator-skill/scripts/svg_to_png.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/SKILL.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/brainstorming/spec-document-reviewer-prompt.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/implementation/coding-plan-template.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/implementation/impl-guide-template.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/review/pr-review-template.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/review/review-checklist.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/specs/rfc-template.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/specs/template-architecture-design.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/specs/template-conceptual-design.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/specs/template-impl-interface-design.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/templates/template-drafts-readme.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/templates/template-impl-readme.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/templates/template-platonic.yml +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/templates/template-rfc-history.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/templates/template-rfc-index.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/templates/template-rfc-namings.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/assets/templates/template-rfc-standard.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/BRAINSTORM/brainstorm.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/IMPL/impl-code.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/IMPL/impl-create-guide.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/IMPL/impl-full.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/IMPL/impl-update-guide.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/IMPL/impl-validate-guide.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/INIT/init-plan-modular-specs.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/INIT/init-recover-architecture.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/INIT/init-recover-conceptual.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/INIT/init-recover-impl-interface.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/INIT/init-scaffold.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/INIT/init-scan.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/REFERENCE.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/REVIEW/review-spec-compliance.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/SPECS/specs-check-compliance.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/SPECS/specs-check-taxonomy.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/SPECS/specs-generate-history.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/SPECS/specs-generate-index.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/SPECS/specs-generate-namings.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/SPECS/specs-refine.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/SPECS/specs-validate-consistency.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/WORKFLOW/workflow-overview.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/WORKFLOW/workflow-phase-1.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/WORKFLOW/workflow-phase-2.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/WORKFLOW/workflow-phase-3.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/SKILL.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/patterns/evidence-deep.json +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/patterns/evidence-first.json +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/patterns/idea-first.json +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/patterns/loop.json +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/patterns/paper-pipeline.json +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/patterns/rapid.json +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/patterns/rigor-first.json +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/patterns/stance-first.json +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/patterns/systematic-review.json +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/patterns/verify-loop.json +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/references/backends.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/references/handoff-ars-omr.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/references/handoff-omr-ars.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/references/routing.md +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/scripts/csljson_to_omr.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/scripts/papers_index_to_csljson.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/__init__.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/__main__.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/agent.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/cli.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/completion/__init__.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/completion/context.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/completion/engine.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/doctor_cmd.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/doctor_fix_cmd.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/progress.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/serve_cmd.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/setup_cmd.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/shell/__init__.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/shell/_fj.zsh +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/shell/fj.bash +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/stream.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/threads.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/cli/tool_stream.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/__init__.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/_warnings.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/agent/__init__.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/agent/config.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/agent/factory.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/agent/skills.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/agent/wiring.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/backend_config.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/bridges/base.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/bridges/nano/__init__.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/bridges/nano/adapter.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/bridges/nano/backend.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/bridges/nano/interrupts.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/bridges/nano/mapping.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/bridges/soothe/__init__.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/bridges/soothe/adapter.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/bridges/soothe/backend.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/events.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/identity.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/modes.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/protocol.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/runtime/__init__.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/runtime/direct.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/runtime/fake.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/runtime/isolation/__init__.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/runtime/isolation/adapter.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/runtime/isolation/admission.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/runtime/isolation/backend.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/runtime/isolation/errors.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/runtime/isolation/mode_gate.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/runtime/isolation/pool.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/runtime/isolation/request.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/runtime/isolation/workspace.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/sandbox/__init__.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/sandbox/arbox.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/sandbox/resolver.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/sandbox/settings.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/streaming/__init__.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/streaming/presentation.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/streaming/tool_results.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/core/streaming/tool_stream.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/home.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/__init__.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/__main__.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/acp/__init__.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/acp/agent.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/acp/routes.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/config.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/http/__init__.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/http/app.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/http/auth.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/openai_compat/__init__.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/openai_compat/errors.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/openai_compat/projection.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/openai_compat/routes.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/openai_compat/schemas.py +0 -0
- {flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/server/openai_compat/service.py +0 -0
- {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.
|
|
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
|
|
@@ -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
|
|
94
|
-
gets thread state that survives across
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
{flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/logo-generator-skill/.env.example
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/logo-generator-skill/requirements.txt
RENAMED
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/platonic-coding/references/REFERENCE.md
RENAMED
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/patterns/loop.json
RENAMED
|
File without changes
|
|
File without changes
|
{flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/patterns/rapid.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/references/backends.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{flowjet-2.1.7 → flowjet-2.1.8}/src/flowjet/builtin_skills/research-bootstrap/references/routing.md
RENAMED
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|