flowjet 2.0.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.
- flowjet-2.0.0/.gitignore +257 -0
- flowjet-2.0.0/CHANGELOG.md +111 -0
- flowjet-2.0.0/LICENSE +21 -0
- flowjet-2.0.0/PKG-INFO +288 -0
- flowjet-2.0.0/README.md +245 -0
- flowjet-2.0.0/config/nano.yml +63 -0
- flowjet-2.0.0/deploy/README.md +63 -0
- flowjet-2.0.0/deploy/nano.yml +82 -0
- flowjet-2.0.0/docs/completion-design.md +1065 -0
- flowjet-2.0.0/docs/drafts/README.md +48 -0
- flowjet-2.0.0/docs/drafts/api-spec.md +21 -0
- flowjet-2.0.0/docs/impl/IG-001-openai-compatible-server.md +383 -0
- flowjet-2.0.0/docs/impl/IG-002-isolated-thread-pool-runtime.md +235 -0
- flowjet-2.0.0/docs/impl/IG-003-production-isolation-hardening.md +177 -0
- flowjet-2.0.0/docs/impl/README.md +61 -0
- flowjet-2.0.0/docs/impl/TEST-COVERAGE-MATRIX.md +104 -0
- flowjet-2.0.0/docs/naming.md +68 -0
- flowjet-2.0.0/docs/specs/RFC-001-openai-compatible-api.md +518 -0
- flowjet-2.0.0/docs/specs/RFC-002-isolated-thread-pool-runtime.md +229 -0
- flowjet-2.0.0/docs/specs/RFC-003-production-isolation-hardening.md +164 -0
- flowjet-2.0.0/docs/specs/RFC-004-unified-package.md +180 -0
- flowjet-2.0.0/docs/specs/rfc-history.md +45 -0
- flowjet-2.0.0/docs/specs/rfc-index.md +61 -0
- flowjet-2.0.0/docs/specs/rfc-namings.md +68 -0
- flowjet-2.0.0/docs/specs/templates/architecture-design.md +139 -0
- flowjet-2.0.0/docs/specs/templates/conceptual-design.md +102 -0
- flowjet-2.0.0/docs/specs/templates/impl-interface-design.md +137 -0
- flowjet-2.0.0/docs/specs/templates/rfc-standard.md +577 -0
- flowjet-2.0.0/docs/specs/templates/rfc-template.md +94 -0
- flowjet-2.0.0/docs/upgrade.md +81 -0
- flowjet-2.0.0/examples/README.md +84 -0
- flowjet-2.0.0/nano.yml +31 -0
- flowjet-2.0.0/pyproject.toml +131 -0
- flowjet-2.0.0/src/flowjet/__init__.py +19 -0
- flowjet-2.0.0/src/flowjet/__main__.py +7 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/README.md +10 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/gws-drive/SKILL.md +138 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/gws-drive-upload/SKILL.md +53 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/logo-generator-skill/.env.example +11 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/logo-generator-skill/README.md +439 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/logo-generator-skill/SKILL.md +196 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/logo-generator-skill/assets/background_library.html +724 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/logo-generator-skill/assets/showcase_template.html +198 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/logo-generator-skill/references/background_styles.md +262 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/logo-generator-skill/references/design_patterns.md +722 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/logo-generator-skill/references/webgl_backgrounds.md +127 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/logo-generator-skill/requirements.txt +4 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/logo-generator-skill/scripts/generate_showcase.py +296 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/logo-generator-skill/scripts/svg_to_png.py +69 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/SKILL.md +145 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/assets/brainstorming/spec-document-reviewer-prompt.md +49 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/assets/implementation/coding-plan-template.md +82 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/assets/implementation/impl-guide-template.md +262 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/assets/review/pr-review-template.md +168 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/assets/review/review-checklist.md +179 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/assets/specs/rfc-template.md +94 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/assets/specs/template-architecture-design.md +139 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/assets/specs/template-conceptual-design.md +102 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/assets/specs/template-impl-interface-design.md +137 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/assets/templates/template-drafts-readme.md +48 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/assets/templates/template-impl-readme.md +61 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/assets/templates/template-platonic.yml +22 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/assets/templates/template-rfc-history.md +36 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/assets/templates/template-rfc-index.md +57 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/assets/templates/template-rfc-namings.md +36 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/assets/templates/template-rfc-standard.md +577 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/BRAINSTORM/brainstorm.md +160 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/IMPL/impl-code.md +106 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/IMPL/impl-create-guide.md +156 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/IMPL/impl-full.md +51 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/IMPL/impl-update-guide.md +155 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/IMPL/impl-validate-guide.md +147 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/INIT/init-plan-modular-specs.md +160 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/INIT/init-recover-architecture.md +149 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/INIT/init-recover-conceptual.md +126 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/INIT/init-recover-impl-interface.md +134 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/INIT/init-scaffold.md +119 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/INIT/init-scan.md +55 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/REFERENCE.md +180 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/REVIEW/review-spec-compliance.md +63 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/SPECS/specs-check-compliance.md +160 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/SPECS/specs-check-taxonomy.md +106 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/SPECS/specs-generate-history.md +95 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/SPECS/specs-generate-index.md +119 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/SPECS/specs-generate-namings.md +129 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/SPECS/specs-refine.md +84 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/SPECS/specs-validate-consistency.md +116 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/WORKFLOW/workflow-overview.md +78 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/WORKFLOW/workflow-phase-1.md +25 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/WORKFLOW/workflow-phase-2.md +34 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/platonic-coding/references/WORKFLOW/workflow-phase-3.md +40 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/research-bootstrap/SKILL.md +109 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/research-bootstrap/patterns/evidence-deep.json +41 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/research-bootstrap/patterns/evidence-first.json +36 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/research-bootstrap/patterns/idea-first.json +40 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/research-bootstrap/patterns/loop.json +44 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/research-bootstrap/patterns/paper-pipeline.json +38 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/research-bootstrap/patterns/rapid.json +30 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/research-bootstrap/patterns/rigor-first.json +42 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/research-bootstrap/patterns/stance-first.json +39 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/research-bootstrap/patterns/systematic-review.json +47 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/research-bootstrap/patterns/verify-loop.json +42 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/research-bootstrap/references/backends.md +72 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/research-bootstrap/references/handoff-ars-omr.md +44 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/research-bootstrap/references/handoff-omr-ars.md +51 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/research-bootstrap/references/routing.md +51 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/research-bootstrap/scripts/csljson_to_omr.py +136 -0
- flowjet-2.0.0/src/flowjet/builtin_skills/research-bootstrap/scripts/papers_index_to_csljson.py +199 -0
- flowjet-2.0.0/src/flowjet/cli/__init__.py +7 -0
- flowjet-2.0.0/src/flowjet/cli/__main__.py +7 -0
- flowjet-2.0.0/src/flowjet/cli/agent.py +178 -0
- flowjet-2.0.0/src/flowjet/cli/cli.py +607 -0
- flowjet-2.0.0/src/flowjet/cli/completion/__init__.py +7 -0
- flowjet-2.0.0/src/flowjet/cli/completion/context.py +250 -0
- flowjet-2.0.0/src/flowjet/cli/completion/engine.py +497 -0
- flowjet-2.0.0/src/flowjet/cli/doctor_cmd.py +507 -0
- flowjet-2.0.0/src/flowjet/cli/doctor_fix_cmd.py +383 -0
- flowjet-2.0.0/src/flowjet/cli/progress.py +875 -0
- flowjet-2.0.0/src/flowjet/cli/serve_cmd.py +55 -0
- flowjet-2.0.0/src/flowjet/cli/setup_cmd.py +531 -0
- flowjet-2.0.0/src/flowjet/cli/shell/__init__.py +0 -0
- flowjet-2.0.0/src/flowjet/cli/shell/_fj.zsh +77 -0
- flowjet-2.0.0/src/flowjet/cli/shell/fj.bash +69 -0
- flowjet-2.0.0/src/flowjet/cli/stream.py +416 -0
- flowjet-2.0.0/src/flowjet/cli/threads.py +384 -0
- flowjet-2.0.0/src/flowjet/cli/tool_stream.py +20 -0
- flowjet-2.0.0/src/flowjet/core/__init__.py +53 -0
- flowjet-2.0.0/src/flowjet/core/backends/__init__.py +12 -0
- flowjet-2.0.0/src/flowjet/core/backends/direct.py +59 -0
- flowjet-2.0.0/src/flowjet/core/backends/fake.py +57 -0
- flowjet-2.0.0/src/flowjet/core/backends/isolation/__init__.py +24 -0
- flowjet-2.0.0/src/flowjet/core/backends/isolation/adapter.py +74 -0
- flowjet-2.0.0/src/flowjet/core/backends/isolation/admission.py +37 -0
- flowjet-2.0.0/src/flowjet/core/backends/isolation/backend.py +98 -0
- flowjet-2.0.0/src/flowjet/core/backends/isolation/errors.py +12 -0
- flowjet-2.0.0/src/flowjet/core/backends/isolation/mode_gate.py +36 -0
- flowjet-2.0.0/src/flowjet/core/backends/isolation/pool.py +634 -0
- flowjet-2.0.0/src/flowjet/core/backends/isolation/request.py +24 -0
- flowjet-2.0.0/src/flowjet/core/backends/isolation/workspace.py +47 -0
- flowjet-2.0.0/src/flowjet/core/bootstrap.py +183 -0
- flowjet-2.0.0/src/flowjet/core/bridges/nano/__init__.py +6 -0
- flowjet-2.0.0/src/flowjet/core/bridges/nano/adapter.py +119 -0
- flowjet-2.0.0/src/flowjet/core/bridges/nano/backend.py +86 -0
- flowjet-2.0.0/src/flowjet/core/bridges/nano/mapping.py +213 -0
- flowjet-2.0.0/src/flowjet/core/events.py +113 -0
- flowjet-2.0.0/src/flowjet/core/modes.py +117 -0
- flowjet-2.0.0/src/flowjet/core/protocol.py +20 -0
- flowjet-2.0.0/src/flowjet/core/tool_results.py +70 -0
- flowjet-2.0.0/src/flowjet/core/tool_stream.py +246 -0
- flowjet-2.0.0/src/flowjet/server/__init__.py +11 -0
- flowjet-2.0.0/src/flowjet/server/__main__.py +66 -0
- flowjet-2.0.0/src/flowjet/server/acp/__init__.py +11 -0
- flowjet-2.0.0/src/flowjet/server/acp/agent.py +313 -0
- flowjet-2.0.0/src/flowjet/server/acp/routes.py +47 -0
- flowjet-2.0.0/src/flowjet/server/config.py +60 -0
- flowjet-2.0.0/src/flowjet/server/http/__init__.py +5 -0
- flowjet-2.0.0/src/flowjet/server/http/app.py +119 -0
- flowjet-2.0.0/src/flowjet/server/http/auth.py +36 -0
- flowjet-2.0.0/src/flowjet/server/openai_compat/__init__.py +14 -0
- flowjet-2.0.0/src/flowjet/server/openai_compat/errors.py +34 -0
- flowjet-2.0.0/src/flowjet/server/openai_compat/projection.py +321 -0
- flowjet-2.0.0/src/flowjet/server/openai_compat/routes.py +77 -0
- flowjet-2.0.0/src/flowjet/server/openai_compat/schemas.py +120 -0
- flowjet-2.0.0/src/flowjet/server/openai_compat/service.py +299 -0
- flowjet-2.0.0/src/flowjet/server/openai_compat/store.py +29 -0
flowjet-2.0.0/.gitignore
ADDED
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[codz]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
share/python-wheels/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
*.egg
|
|
27
|
+
MANIFEST
|
|
28
|
+
|
|
29
|
+
# PyInstaller
|
|
30
|
+
# Usually these files are written by a python script from a template
|
|
31
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
32
|
+
*.manifest
|
|
33
|
+
*.spec
|
|
34
|
+
|
|
35
|
+
# Installer logs
|
|
36
|
+
pip-log.txt
|
|
37
|
+
pip-delete-this-directory.txt
|
|
38
|
+
|
|
39
|
+
# Unit test / coverage reports
|
|
40
|
+
htmlcov/
|
|
41
|
+
.tox/
|
|
42
|
+
.nox/
|
|
43
|
+
.coverage
|
|
44
|
+
.coverage.*
|
|
45
|
+
.cache
|
|
46
|
+
nosetests.xml
|
|
47
|
+
coverage.xml
|
|
48
|
+
*.cover
|
|
49
|
+
*.py.cover
|
|
50
|
+
.hypothesis/
|
|
51
|
+
.pytest_cache/
|
|
52
|
+
cover/
|
|
53
|
+
|
|
54
|
+
# Translations
|
|
55
|
+
*.mo
|
|
56
|
+
*.pot
|
|
57
|
+
|
|
58
|
+
# Django stuff:
|
|
59
|
+
*.log
|
|
60
|
+
local_settings.py
|
|
61
|
+
db.sqlite3
|
|
62
|
+
db.sqlite3-journal
|
|
63
|
+
|
|
64
|
+
# Flask stuff:
|
|
65
|
+
instance/
|
|
66
|
+
.webassets-cache
|
|
67
|
+
|
|
68
|
+
# Scrapy stuff:
|
|
69
|
+
.scrapy
|
|
70
|
+
|
|
71
|
+
# Sphinx documentation
|
|
72
|
+
docs/_build/
|
|
73
|
+
|
|
74
|
+
# PyBuilder
|
|
75
|
+
.pybuilder/
|
|
76
|
+
target/
|
|
77
|
+
|
|
78
|
+
# Jupyter Notebook
|
|
79
|
+
.ipynb_checkpoints
|
|
80
|
+
|
|
81
|
+
# IPython
|
|
82
|
+
profile_default/
|
|
83
|
+
ipython_config.py
|
|
84
|
+
|
|
85
|
+
# pyenv
|
|
86
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
87
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
88
|
+
# .python-version
|
|
89
|
+
|
|
90
|
+
# pipenv
|
|
91
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
92
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
93
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
94
|
+
# install all needed dependencies.
|
|
95
|
+
# Pipfile.lock
|
|
96
|
+
|
|
97
|
+
# UV
|
|
98
|
+
# flowjet commits uv.lock for reproducible installs (CLI + server extras).
|
|
99
|
+
|
|
100
|
+
# poetry
|
|
101
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
102
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
103
|
+
# commonly ignored for libraries.
|
|
104
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
105
|
+
# poetry.lock
|
|
106
|
+
# poetry.toml
|
|
107
|
+
|
|
108
|
+
# pdm
|
|
109
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
110
|
+
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
|
|
111
|
+
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
|
|
112
|
+
# pdm.lock
|
|
113
|
+
# pdm.toml
|
|
114
|
+
.pdm-python
|
|
115
|
+
.pdm-build/
|
|
116
|
+
|
|
117
|
+
# pixi
|
|
118
|
+
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
|
|
119
|
+
# pixi.lock
|
|
120
|
+
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
|
|
121
|
+
# in the .venv directory. It is recommended not to include this directory in version control.
|
|
122
|
+
.pixi
|
|
123
|
+
|
|
124
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
125
|
+
__pypackages__/
|
|
126
|
+
|
|
127
|
+
# Celery stuff
|
|
128
|
+
celerybeat-schedule
|
|
129
|
+
celerybeat.pid
|
|
130
|
+
|
|
131
|
+
# Redis
|
|
132
|
+
*.rdb
|
|
133
|
+
*.aof
|
|
134
|
+
*.pid
|
|
135
|
+
|
|
136
|
+
# RabbitMQ
|
|
137
|
+
mnesia/
|
|
138
|
+
rabbitmq/
|
|
139
|
+
rabbitmq-data/
|
|
140
|
+
|
|
141
|
+
# ActiveMQ
|
|
142
|
+
activemq-data/
|
|
143
|
+
|
|
144
|
+
# SageMath parsed files
|
|
145
|
+
*.sage.py
|
|
146
|
+
|
|
147
|
+
# Environments
|
|
148
|
+
.env
|
|
149
|
+
.envrc
|
|
150
|
+
.venv
|
|
151
|
+
env/
|
|
152
|
+
venv/
|
|
153
|
+
ENV/
|
|
154
|
+
env.bak/
|
|
155
|
+
venv.bak/
|
|
156
|
+
|
|
157
|
+
# Local editor / tool backups
|
|
158
|
+
.backups/
|
|
159
|
+
|
|
160
|
+
# Spyder project settings
|
|
161
|
+
.spyderproject
|
|
162
|
+
.spyproject
|
|
163
|
+
|
|
164
|
+
# Rope project settings
|
|
165
|
+
.ropeproject
|
|
166
|
+
|
|
167
|
+
# mkdocs documentation
|
|
168
|
+
/site
|
|
169
|
+
|
|
170
|
+
# mypy
|
|
171
|
+
.mypy_cache/
|
|
172
|
+
.dmypy.json
|
|
173
|
+
dmypy.json
|
|
174
|
+
|
|
175
|
+
# Pyre type checker
|
|
176
|
+
.pyre/
|
|
177
|
+
|
|
178
|
+
# pytype static type analyzer
|
|
179
|
+
.pytype/
|
|
180
|
+
|
|
181
|
+
# Cython debug symbols
|
|
182
|
+
cython_debug/
|
|
183
|
+
|
|
184
|
+
# PyCharm
|
|
185
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
186
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
187
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
188
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
189
|
+
# .idea/
|
|
190
|
+
|
|
191
|
+
# Abstra
|
|
192
|
+
# Abstra is an AI-powered process automation framework.
|
|
193
|
+
# Ignore directories containing user credentials, local state, and settings.
|
|
194
|
+
# Learn more at https://abstra.io/docs
|
|
195
|
+
.abstra/
|
|
196
|
+
|
|
197
|
+
# Visual Studio Code
|
|
198
|
+
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
|
|
199
|
+
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
|
|
200
|
+
# and can be added to the global gitignore or merged into this file. However, if you prefer,
|
|
201
|
+
# you could uncomment the following to ignore the entire vscode folder
|
|
202
|
+
# .vscode/
|
|
203
|
+
# Temporary file for partial code execution
|
|
204
|
+
tempCodeRunnerFile.py
|
|
205
|
+
|
|
206
|
+
# Ruff stuff:
|
|
207
|
+
.ruff_cache/
|
|
208
|
+
|
|
209
|
+
# PyPI configuration file
|
|
210
|
+
.pypirc
|
|
211
|
+
|
|
212
|
+
# Marimo
|
|
213
|
+
marimo/_static/
|
|
214
|
+
marimo/_lsp/
|
|
215
|
+
__marimo__/
|
|
216
|
+
|
|
217
|
+
# Streamlit
|
|
218
|
+
.streamlit/secrets.toml
|
|
219
|
+
#--------------------------------------------------#
|
|
220
|
+
# The following was generated with gitignore.nvim: #
|
|
221
|
+
#--------------------------------------------------#
|
|
222
|
+
# Gitignore for the following technologies: macOS
|
|
223
|
+
|
|
224
|
+
# General
|
|
225
|
+
.DS_Store
|
|
226
|
+
.AppleDouble
|
|
227
|
+
.LSOverride
|
|
228
|
+
|
|
229
|
+
# Icon must end with two
|
|
230
|
+
Icon
|
|
231
|
+
|
|
232
|
+
# Thumbnails
|
|
233
|
+
._*
|
|
234
|
+
|
|
235
|
+
# Files that might appear in the root of a volume
|
|
236
|
+
.DocumentRevisions-V100
|
|
237
|
+
.fseventsd
|
|
238
|
+
.Spotlight-V100
|
|
239
|
+
.TemporaryItems
|
|
240
|
+
.Trashes
|
|
241
|
+
.VolumeIcon.icns
|
|
242
|
+
.com.apple.timemachine.donotpresent
|
|
243
|
+
|
|
244
|
+
# Directories potentially created on remote AFP share
|
|
245
|
+
.AppleDB
|
|
246
|
+
.AppleDesktop
|
|
247
|
+
Network Trash Folder
|
|
248
|
+
Temporary Items
|
|
249
|
+
.apdisk
|
|
250
|
+
|
|
251
|
+
# iCloud generated files
|
|
252
|
+
*.icloud
|
|
253
|
+
.soothe/
|
|
254
|
+
|
|
255
|
+
# Claude Code session-local
|
|
256
|
+
.claude/
|
|
257
|
+
.codebuddy/
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to **flowjet** are documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
> History from 0.1.0–0.2.0 below was released as the separate `flowjet-server`
|
|
9
|
+
> distribution, now merged into `flowjet`. See [docs/upgrade.md](docs/upgrade.md).
|
|
10
|
+
|
|
11
|
+
## [2.0.0] — 2026-09-17 — unified CLI + server
|
|
12
|
+
|
|
13
|
+
**Breaking.** `flowjet-server` is merged into this repository and ships as one
|
|
14
|
+
distribution, `flowjet`. See [RFC-004](docs/specs/RFC-004-unified-package.md).
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- **One distribution, two surfaces.** `flowjet.core` (shared runtime),
|
|
19
|
+
`flowjet.cli` (was `fj_ai`) and `flowjet.server` (was `flowjet_server`).
|
|
20
|
+
- **`fj serve`** — run the HTTP service from the CLI (alias of `flowjet-server`,
|
|
21
|
+
flags: `--host`, `-p/--port`, `--api-key`, `--nano-config`).
|
|
22
|
+
- **Optional `[server]` extra.** `pip install flowjet` pulls one runtime
|
|
23
|
+
dependency (soothe-nano); FastAPI/uvicorn/ACP/pydantic-settings are opt-in
|
|
24
|
+
and lazily imported so `fj` never loads them.
|
|
25
|
+
- **`DirectRuntimeBackend`** — the CLI now runs on the same `RuntimeBackend`
|
|
26
|
+
contract and `RuntimeEvent` stream as SSE and ACP.
|
|
27
|
+
- **`Narration` event** — pre-tool-call text is available to the terminal for
|
|
28
|
+
live preview while remaining invisible to protocol clients.
|
|
29
|
+
- **`SurfaceProfile`** (`flowjet.core.modes`) — the CLI's permissive workspace
|
|
30
|
+
and the server's workspace confinement are now explicit, per-surface
|
|
31
|
+
invariants; `bypass` mode is rejected on the server surface.
|
|
32
|
+
- Auth now uses `hmac.compare_digest` instead of `!=`.
|
|
33
|
+
|
|
34
|
+
### Changed
|
|
35
|
+
|
|
36
|
+
- Distribution renamed `flowjet-agent` → `flowjet`; version single-sourced from
|
|
37
|
+
`flowjet.__version__` (the server no longer hard-codes `0.2.0`).
|
|
38
|
+
- Builtin skills moved to `flowjet/builtin_skills` and are registered for both
|
|
39
|
+
surfaces.
|
|
40
|
+
- `langchain-core` is now an explicit `server` dependency (it was imported but
|
|
41
|
+
undeclared).
|
|
42
|
+
|
|
43
|
+
### Removed
|
|
44
|
+
|
|
45
|
+
- The `fj_ai` and `flowjet_server` import namespaces. No compatibility shims —
|
|
46
|
+
see [docs/upgrade.md](docs/upgrade.md) for the migration table.
|
|
47
|
+
|
|
48
|
+
## [0.2.0] — 2026-09-16
|
|
49
|
+
|
|
50
|
+
### Added
|
|
51
|
+
|
|
52
|
+
- **ACP (Agent Client Protocol) support.** flowjet-server now exposes an ACP
|
|
53
|
+
`Agent` over a WebSocket endpoint at `/acp`. Other ACP clients (Zed, custom
|
|
54
|
+
integrations) connect via `ws://host:port/acp` and drive the same
|
|
55
|
+
nano-backed `RuntimeBackend` used by the OpenAI-compatible Responses API.
|
|
56
|
+
The implementation bridges `RuntimeEvent` streams (RunStarted, Progress,
|
|
57
|
+
OutputTextDelta, ToolStarted/Completed, RunCompleted) to ACP
|
|
58
|
+
`session/update` notifications (agent_message_chunk, agent_thought_chunk,
|
|
59
|
+
tool_call/tool_call_update) and returns `PromptResponse` with
|
|
60
|
+
`stopReason=end_turn` + token usage. Initialize, session/new,
|
|
61
|
+
session/load, session/list, session/prompt, session/cancel, and
|
|
62
|
+
session/close are all supported.
|
|
63
|
+
|
|
64
|
+
### Changed
|
|
65
|
+
|
|
66
|
+
- **Bumped `soothe-nano` dependency** from `>=1.2.23,<2.0.0` to
|
|
67
|
+
`>=1.2.28,<2.0.0` (latest release).
|
|
68
|
+
- **Added `agent-client-protocol[http]`** as a runtime dependency
|
|
69
|
+
(`>=0.12.1,<1.0.0`), providing the ACP SDK server + WebSocket transport.
|
|
70
|
+
|
|
71
|
+
## [0.1.1] — 2026-09-05
|
|
72
|
+
|
|
73
|
+
### Fixed
|
|
74
|
+
|
|
75
|
+
- **litellm corrupted-install fix.** The previous image (v0.1.0) shipped a
|
|
76
|
+
broken `litellm` 1.99.0 wheel: `litellm/__init__.py` was listed in the
|
|
77
|
+
dist-info RECORD but missing from disk, so Python treated the package as an
|
|
78
|
+
empty namespace package and every `/v1/responses` call failed with
|
|
79
|
+
`module 'litellm' has no attribute 'acompletion'`. Reinstalling litellm with
|
|
80
|
+
`uv pip install --force-reinstall litellm==1.99.0` restores
|
|
81
|
+
`litellm/__init__.py` and `acompletion` becomes available again. The Docker
|
|
82
|
+
image now rebuilds the venv cleanly so the fix is baked into the published
|
|
83
|
+
image.
|
|
84
|
+
|
|
85
|
+
### Verified
|
|
86
|
+
|
|
87
|
+
Full E2E suite (`examples/e2e_http_api.py`) passes against the live server:
|
|
88
|
+
|
|
89
|
+
| Endpoint | Method | Result |
|
|
90
|
+
|---|---|---|
|
|
91
|
+
| `/health` | GET | ✅ `{"status":"ok",...}` |
|
|
92
|
+
| `/v1/models` | GET | ✅ returns `default` model |
|
|
93
|
+
| `/v1/responses` (stream=false) | POST | ✅ status `completed`, real LLM text |
|
|
94
|
+
| `/v1/responses/{id}` | GET | ✅ retrieve returns stored response |
|
|
95
|
+
| `/v1/responses/{id}` | DELETE | ✅ `deleted:true`, subsequent GET → 404 |
|
|
96
|
+
| `/v1/responses` (SSE, report) | POST | ✅ `response.created` → `output_text.delta` → `response.completed` |
|
|
97
|
+
| `/v1/responses` (SSE, progress) | POST | ✅ includes `response.flowjet.progress` stages |
|
|
98
|
+
| `/v1/responses` (SSE, developer) | POST | ✅ completes; no tool args leaked to wire |
|
|
99
|
+
| unknown model | POST | ✅ HTTP 404 `model_not_found` |
|
|
100
|
+
| missing id | GET | ✅ HTTP 404 `response_not_found` |
|
|
101
|
+
|
|
102
|
+
## [0.1.0] — initial release
|
|
103
|
+
|
|
104
|
+
OpenAI Responses–compatible HTTP service backed by soothe-nano (≥1.2.23).
|
|
105
|
+
Includes ask/agent interaction modes, three SSE projection modes
|
|
106
|
+
(report / progress / developer), thread-pool isolation (RFC-002), production
|
|
107
|
+
isolation suite (RFC-003), and a self-contained Docker deploy stack
|
|
108
|
+
(PostgreSQL + pgvector + flowjet-server).
|
|
109
|
+
|
|
110
|
+
[0.1.1]: https://github.com/caesar0301/flowjet-server/releases/tag/v0.1.1
|
|
111
|
+
[0.1.0]: https://github.com/caesar0301/flowjet-server/releases/tag/v0.1.0
|
flowjet-2.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Xiaming Chen
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
flowjet-2.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: flowjet
|
|
3
|
+
Version: 2.0.0
|
|
4
|
+
Summary: FlowJet — agent CLI (fj) and server (ACP + OpenAI-compatible HTTP) powered by soothe-nano
|
|
5
|
+
Project-URL: Homepage, https://github.com/caesar0301/flowjet-agent
|
|
6
|
+
Project-URL: Repository, https://github.com/caesar0301/flowjet-agent
|
|
7
|
+
Project-URL: Issues, https://github.com/caesar0301/flowjet-agent/issues
|
|
8
|
+
Author: Xiaming Chen
|
|
9
|
+
License: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: acp,agent,ai,cli,coding-agent,fj,flowjet,nano,openai,server,soothe
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Environment :: Web Environment
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
22
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
23
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
24
|
+
Requires-Python: <3.15,>=3.11
|
|
25
|
+
Requires-Dist: soothe-nano<1.3.0,>=1.2.28
|
|
26
|
+
Provides-Extra: dev
|
|
27
|
+
Requires-Dist: httpx>=0.27.0; extra == 'dev'
|
|
28
|
+
Requires-Dist: mypy>=1.0.0; extra == 'dev'
|
|
29
|
+
Requires-Dist: openai>=2.51.0; extra == 'dev'
|
|
30
|
+
Requires-Dist: pytest-asyncio>=1.3.0; extra == 'dev'
|
|
31
|
+
Requires-Dist: pytest-cov; extra == 'dev'
|
|
32
|
+
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
33
|
+
Requires-Dist: ruff>=0.12.0; extra == 'dev'
|
|
34
|
+
Requires-Dist: twine>=5.0.0; extra == 'dev'
|
|
35
|
+
Provides-Extra: server
|
|
36
|
+
Requires-Dist: agent-client-protocol[http]<1.0.0,>=0.12.1; extra == 'server'
|
|
37
|
+
Requires-Dist: fastapi>=0.115.0; extra == 'server'
|
|
38
|
+
Requires-Dist: langchain-core>=0.3; extra == 'server'
|
|
39
|
+
Requires-Dist: pydantic-settings>=2.0; extra == 'server'
|
|
40
|
+
Requires-Dist: pydantic>=2.0; extra == 'server'
|
|
41
|
+
Requires-Dist: uvicorn[standard]>=0.32.0; extra == 'server'
|
|
42
|
+
Description-Content-Type: text/markdown
|
|
43
|
+
|
|
44
|
+
# FlowJet
|
|
45
|
+
|
|
46
|
+
[](https://pypi.org/p/flowjet)
|
|
47
|
+
[](https://pypi.org/p/flowjet)
|
|
48
|
+
[](https://github.com/caesar0301/flowjet-agent/actions/workflows/ci.yml)
|
|
49
|
+
[](LICENSE)
|
|
50
|
+
|
|
51
|
+
🎥 [Watch the demo on Vimeo](https://vimeo.com/1211730182)
|
|
52
|
+
|
|
53
|
+
**FlowJet** is one agent runtime, two surfaces:
|
|
54
|
+
|
|
55
|
+
| Surface | Entry point | What it gives you |
|
|
56
|
+
|---------|-------------|-------------------|
|
|
57
|
+
| **Terminal CLI** | `fj` | A friendly one-shot coding agent — ask in plain English, get an answer |
|
|
58
|
+
| **HTTP service** | `flowjet-server` / `fj serve` | **ACP** over WebSocket + an **OpenAI-compatible API** (`/v1/responses`, `/v1/chat/completions`, `/v1/models`) |
|
|
59
|
+
|
|
60
|
+
Both are the same distribution and the same `flowjet.core` runtime: one nano
|
|
61
|
+
bootstrap, one stream mapper, one `RuntimeEvent` contract. The terminal renders
|
|
62
|
+
those events as a progress line; the server renders them as SSE or ACP updates.
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# CLI
|
|
66
|
+
fj explain this repo
|
|
67
|
+
fj -f what did we decide last time # continue the latest conversation
|
|
68
|
+
fjf what did we decide last time # alias of fj -f
|
|
69
|
+
|
|
70
|
+
# Server (OpenAI-compatible + ACP)
|
|
71
|
+
flowjet-server # or: fj serve --port 8618
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
It runs on [soothe-nano](https://github.com/mirasoth/soothe-nano) — tools, skills, MCP, subagents, and progressive loading — with SQLite persistence so every conversation is resumable.
|
|
75
|
+
|
|
76
|
+
> Package: **flowjet** · CLI aliases: `fj`, `fjf` (=`-f`) · Server: `flowjet-server` · Runtime: [soothe-nano](https://github.com/mirasoth/soothe-nano) · Naming details: [docs/naming.md](docs/naming.md)
|
|
77
|
+
|
|
78
|
+
> **Upgrading from 1.x?** The distribution and all import paths were renamed. See [docs/upgrade.md](docs/upgrade.md).
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Install
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
pip install flowjet # CLI only (one runtime dependency: soothe-nano)
|
|
86
|
+
pip install 'flowjet[server]' # + the HTTP service (fastapi, uvicorn, ACP)
|
|
87
|
+
# or
|
|
88
|
+
uv tool install 'flowjet[server]'
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Requires Python 3.11+. The server half is an optional extra — `fj` never imports
|
|
92
|
+
FastAPI or uvicorn.
|
|
93
|
+
|
|
94
|
+
## Configure
|
|
95
|
+
|
|
96
|
+
**Option A — Local model (guided setup):**
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
fj setup
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
This walks you through an OpenAI-compatible endpoint (Ollama, LM Studio, vLLM, …) and writes the basics to `~/.soothe/config/nano.yml`.
|
|
103
|
+
|
|
104
|
+
**Option B — Cloud (no config file needed):**
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
export OPENAI_API_KEY=sk-...
|
|
108
|
+
fj summarize README.md
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Without a `nano.yml`, FlowJet falls back to `OPENAI_API_KEY` or `ANTHROPIC_API_KEY`.
|
|
112
|
+
|
|
113
|
+
## Doctor
|
|
114
|
+
|
|
115
|
+
Check whether your machine is ready to run `fj` (tool binaries, providers, observability):
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
fj doctor # quick check
|
|
119
|
+
fj doctor --deep # thorough check
|
|
120
|
+
fj doctor --live-llm # actually call the model
|
|
121
|
+
fj doctor --format json # machine-readable
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Conversations
|
|
127
|
+
|
|
128
|
+
Threads persist in SQLite, so you can pick up where you left off — continue the latest, jump to a specific one, or list them:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
fj -f and now add tests # continue this project's latest active thread
|
|
132
|
+
fj -t abc123 continue from here # continue a specific thread
|
|
133
|
+
fj -l # list recent threads
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
`-f` is scoped to the project you are in — the git repo root, or the current directory when it is not a repo — so parallel work in other checkouts never hijacks your thread. `fj -l` still lists every thread; pick one up from anywhere with `-t ID`.
|
|
137
|
+
|
|
138
|
+
## Flags
|
|
139
|
+
|
|
140
|
+
```text
|
|
141
|
+
fj [options] [--] <query...>
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
| Flag | Meaning |
|
|
145
|
+
|------|---------|
|
|
146
|
+
| `-f` / `--follow` | Continue the latest active thread in this project directory |
|
|
147
|
+
| `-t ID` / `--thread` | Continue (or pin) a specific thread (overrides `-f`) |
|
|
148
|
+
| `-l` / `--list` | List recent threads (newest first) |
|
|
149
|
+
| `-n NUM` | How many threads `-l` shows (`0` = all) |
|
|
150
|
+
| `-c PATH` / `--config` | Use an alternate `nano.yml` |
|
|
151
|
+
| `-w DIR` / `--workspace` | Workspace root |
|
|
152
|
+
| `--no-stream` | Wait for the full answer instead of streaming |
|
|
153
|
+
| `-v` / `--verbose` | Mirror tool calls on stderr |
|
|
154
|
+
|
|
155
|
+
> `-t` and `-f` can be combined; `-t` wins (explicit id overrides follow).
|
|
156
|
+
|
|
157
|
+
Shell completion is AI-assisted — it predicts natural-language intents, not just flags:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
eval "$(fj completion zsh)" # or: fj completion bash
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Extend
|
|
166
|
+
|
|
167
|
+
### Skills
|
|
168
|
+
|
|
169
|
+
FlowJet ships with AgentSkills (planning, TDD, debugging, document tools, MCP builder, and more). Add your own in `nano.yml`:
|
|
170
|
+
|
|
171
|
+
```yaml
|
|
172
|
+
skills:
|
|
173
|
+
- ~/.soothe/skills/my-reviewer
|
|
174
|
+
- ./skills/deploy
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Each skill is a `SKILL.md` with frontmatter; progressive loading keeps the catalog compact and loads skills on demand.
|
|
178
|
+
|
|
179
|
+
### MCP servers
|
|
180
|
+
|
|
181
|
+
Connect any Model Context Protocol server:
|
|
182
|
+
|
|
183
|
+
```yaml
|
|
184
|
+
mcp_servers:
|
|
185
|
+
- name: filesystem
|
|
186
|
+
transport: stdio
|
|
187
|
+
command: npx
|
|
188
|
+
args: ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
With `defer: true` (the default), MCP tools activate on demand.
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Server
|
|
196
|
+
|
|
197
|
+
Start the service and point any OpenAI-compatible client at it:
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
flowjet-server # defaults: host :: (dual-stack), port 8618
|
|
201
|
+
fj serve --port 8618 # same thing from the CLI
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
```python
|
|
205
|
+
from openai import OpenAI
|
|
206
|
+
|
|
207
|
+
client = OpenAI(api_key="local", base_url="http://127.0.0.1:8618/v1")
|
|
208
|
+
print(client.responses.create(model="default", input="Hello"))
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
| HTTP | Purpose |
|
|
212
|
+
|------|---------|
|
|
213
|
+
| `GET /health` | Liveness + thread-pool metrics |
|
|
214
|
+
| `GET /v1/models` | Logical model ids |
|
|
215
|
+
| `POST /v1/responses` | Create a response (`stream=true` → SSE) |
|
|
216
|
+
| `GET` / `DELETE /v1/responses/{id}` | Retrieve / cancel a response |
|
|
217
|
+
| `POST /v1/chat/completions` | Chat Completions (non-stream + SSE) |
|
|
218
|
+
| `WS /acp` | Agent Client Protocol (JSON-RPC) |
|
|
219
|
+
|
|
220
|
+
FlowJet options travel in `extra_body.flowjet`:
|
|
221
|
+
|
|
222
|
+
| Field | Values | Default | Meaning |
|
|
223
|
+
|-------|--------|---------|---------|
|
|
224
|
+
| `projection` | `report` \| `progress` \| `developer` | `report` | How much SSE detail to expose |
|
|
225
|
+
| `session` | string | new `fj-<uuid>` | Isolates workspace + conversation thread |
|
|
226
|
+
| `interaction_mode` | `agent` \| `ask` | `agent` | `ask` is hard read-only |
|
|
227
|
+
| `metadata` | object | — | Opaque bag forwarded to the runtime |
|
|
228
|
+
|
|
229
|
+
### Environment
|
|
230
|
+
|
|
231
|
+
| Variable | Default | Meaning |
|
|
232
|
+
|----------|---------|---------|
|
|
233
|
+
| `FLOWJET_API_KEY` | unset | If set, require Bearer auth |
|
|
234
|
+
| `FLOWJET_MODELS` | `default` | Comma-separated logical model ids |
|
|
235
|
+
| `FLOWJET_HOST` | `::` | Bind host (dual-stack IPv4/IPv6) |
|
|
236
|
+
| `FLOWJET_PORT` | `8618` | Bind port |
|
|
237
|
+
| `FLOWJET_HOME` | `~/.flowjet` | Root for per-session workspaces |
|
|
238
|
+
| `FLOWJET_NANO_CONFIG` | unset | Optional `nano.yml` (else `$SOOTHE_HOME/config/nano.yml`) |
|
|
239
|
+
| `FLOWJET_THREAD_POOL_MIN` | `2` | Min isolation worker threads |
|
|
240
|
+
| `FLOWJET_THREAD_POOL_MAX` | `8` | Max isolation worker threads |
|
|
241
|
+
| `FLOWJET_THREAD_POOL_IDLE_TIMEOUT` | `300` | Scaled-worker idle exit seconds (`0` = never) |
|
|
242
|
+
| `FLOWJET_MAX_REQUESTS_PER_WORKER` | `100` | Recycle worker after N turns (`0` = unlimited) |
|
|
243
|
+
| `FLOWJET_REUSE_RUNNER` | `true` | Reuse agent adapter per worker |
|
|
244
|
+
| `FLOWJET_REQUEST_TIMEOUT` | `0` | Per-run timeout seconds (`0` = none; set in production) |
|
|
245
|
+
| `FLOWJET_READY_TIMEOUT` | `30` | Max wait for post-turn worker ready |
|
|
246
|
+
| `FLOWJET_ALLOW_EXTERNAL_WORKSPACE` | `false` | Allow `metadata.workspace` outside `FLOWJET_HOME` |
|
|
247
|
+
| `FLOWJET_CORS_ORIGINS` | `*` | Comma-separated browser origins allowed to call the API |
|
|
248
|
+
|
|
249
|
+
### Security model
|
|
250
|
+
|
|
251
|
+
The two surfaces have deliberately different invariants (enforced in
|
|
252
|
+
`flowjet.core.modes`, not by whichever module loaded first):
|
|
253
|
+
|
|
254
|
+
| | CLI | Server |
|
|
255
|
+
|---|---|---|
|
|
256
|
+
| `allow_paths_outside_workspace` | `True` (your machine) | **`False`** (per-request workspace, non-overridable) |
|
|
257
|
+
| `bypass` interaction mode | available | **rejected** — tools must never escape the request workspace |
|
|
258
|
+
| API key | — | optional `FLOWJET_API_KEY` (Bearer, constant-time compare) |
|
|
259
|
+
|
|
260
|
+
`FLOWJET_CORS_ORIGINS` defaults to `*` with credentials enabled so browser
|
|
261
|
+
clients work out of the box; set it to an explicit origin list in production.
|
|
262
|
+
|
|
263
|
+
Full protocol reference and deployment guide: [deploy/README.md](deploy/README.md),
|
|
264
|
+
[docs/specs/RFC-001-openai-compatible-api.md](docs/specs/RFC-001-openai-compatible-api.md).
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## Development
|
|
269
|
+
|
|
270
|
+
```bash
|
|
271
|
+
git clone https://github.com/caesar0301/flowjet-agent.git
|
|
272
|
+
cd flowjet-agent
|
|
273
|
+
make sync-dev # dev + server extras
|
|
274
|
+
make test # unit + integration + server suites
|
|
275
|
+
make test-server # HTTP/ACP suites only
|
|
276
|
+
make run # start the server locally
|
|
277
|
+
make lint
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
CI runs format, lint, and tests on Python 3.11–3.13; releases go GitHub Release → PyPI.
|
|
281
|
+
|
|
282
|
+
## Powered by
|
|
283
|
+
|
|
284
|
+
Built on [soothe-nano](https://github.com/mirasoth/soothe-nano). For a full TUI coding agent from the same stack, see [mirasoth/soothe](https://github.com/mirasoth/soothe).
|
|
285
|
+
|
|
286
|
+
## License
|
|
287
|
+
|
|
288
|
+
MIT
|