lobes-cli 0.68.4__tar.gz → 0.69.2__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.
- lobes_cli-0.69.2/.devague/current +1 -0
- lobes_cli-0.69.2/.devague/frames/targeted-ops-and-honest-streams.json +276 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/CHANGELOG.md +25 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/CLAUDE.md +22 -3
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/PKG-INFO +1 -1
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/colleague-stack.md +39 -7
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/deployment-shapes.md +10 -4
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/gateway-fleet.md +82 -9
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/mistral-small-3.2-24b-nvfp4.md +4 -2
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/openai-api.md +34 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_commands/init.py +18 -16
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_commands/up.py +96 -20
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/explain/catalog.py +4 -2
- lobes_cli-0.69.2/lobes/gateway/_authlog.py +177 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/gateway/_readiness.py +193 -30
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/gateway/server.py +207 -7
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/roles.py +82 -31
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/runtime/_compose.py +39 -10
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/templates/fleet/docker-compose.yml +23 -10
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/pyproject.toml +1 -1
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_cli_up.py +11 -9
- lobes_cli-0.69.2/tests/test_gateway_auth_rejection_log.py +299 -0
- lobes_cli-0.69.2/tests/test_gateway_peer_advert.py +269 -0
- lobes_cli-0.69.2/tests/test_gateway_stream_termination.py +191 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_init_shape.py +14 -8
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_tool_parser_plugin.py +10 -1
- lobes_cli-0.69.2/tests/test_up_no_deps_isolation.py +149 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/uv.lock +1 -1
- lobes_cli-0.68.4/.devague/current +0 -1
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.agex/data/pr/events.jsonl +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/ask-colleague/SKILL.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/ask-colleague/prompts/explore.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/ask-colleague/prompts/review.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/ask-colleague/prompts/write.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/ask-colleague/scripts/ask-colleague.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/challenge/SKILL.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/cicd/SKILL.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/cicd/scripts/workflow.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/communicate/SKILL.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/deviate/SKILL.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/model-runner/SKILL.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/model-runner/scripts/model-runner.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/recall/SKILL.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/recall/scripts/recall.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/remember/SKILL.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/remember/scripts/remember.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/run-tests/SKILL.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/scope/SKILL.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/sonarclaude/SKILL.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/spec-to-plan/SKILL.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/summarize-delivery/SKILL.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/think/SKILL.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/think/scripts/think.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/version-bump/SKILL.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills/version-bump/scripts/bump.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.claude/skills.local.yaml.example +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/current_plan +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/deliveries/capacity-relative-pool-routing.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/deliveries/cortex-replica-pool-199.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/deliveries/deployment-lock-per-box.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/deliveries/dspark-speculation-on-the-spark-cortex.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/deliveries/every-lobe-in-the-mesh-can-see-the-spark-reaches-t.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/deliveries/hand-lobe-lfm2-5-1-2b.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/deliveries/lightning-on-orin.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/deliveries/lobes-capabilities-tells-you-where-a-lobe-is-serve.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/deliveries/nemotron-lightning-worker.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/deliveries/qwen3-8-gguf-llamacpp.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/deliveries/realtime-voice-to-voice-astro-test-site-151.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/deliveries/thor-cortex-speculation.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/deliveries/unsloth-qat-senses-first-class-orin-variation.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/capacity-relative-pool-routing.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/chatterbox-on-thor-sm-110.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/compose-chain-unification-init-repair-doctor-stale.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/cortex-replica-pool-199.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/deployment-lock-per-box.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/dspark-speculation-on-the-spark-cortex.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/every-lobe-in-the-mesh-can-see-the-spark-reaches-t.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/flash-next-on-vllm.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/hand-lobe-lfm2-5-1-2b.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/lightning-on-orin.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/lobes-adds-a-third-middle-model-tier-and-pressure.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/lobes-capabilities-tells-you-where-a-lobe-is-serve.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/lobes-exposes-the-full-colleague-runtime-stack-as.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/lobes-fits-the-machine-it-lands-on-one-command-det.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/lobes-gateway-relays-sse-streams-frame-by-frame-th.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/lobes-never-advertises-a-capability-it-cannot-serv.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/lobes-now-defaults-to-a-spark-duo-the-qwen3-6-27b.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/lobes-preserves-qwen-thinking-traces-across-multi.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/lobes-serves-strict-grammar-constrained-tool-calls.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/lobes-serves-the-brain-shape-you-choose-machine-as.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/lobes-serves-the-mesh-brain-end-state-one-lobe-per.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/lobes-ships-a-custom-vllm-image-from-nvcr-io-nvidi.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/lobes-ships-a-minor-lobe-a-cheap-warm-co-resident.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/lobes-ships-a-per-lobe-benchmark-suite-speed-paral.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/lobes-tells-clients-the-truth-about-a-fleet-a-cons.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/lobes-unifies-its-generate-lane-on-one-vllm-nightl.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/model-gear-now-serves-an-embedding-gear-qwen3-embe-2.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/model-gear-now-serves-an-embedding-gear-qwen3-embe.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/model-gear-owns-the-audio-i-o-surface-end-to-end-m.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/nemotron-lightning-worker.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/proxy-lobes-pairwise-auth.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/qwen3-8-27b-gguf-on-the-spark.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/qwen3-8-cortex-upgrade.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/qwen3-8-flash-next-gguf-candidate.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/qwen3-8-gguf-llamacpp.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/realtime-voice-to-voice-astro-test-site-151.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/realtime-ws-server-vad-149.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/stt-readiness-truth-155.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/the-gemma-4-12b-gear-gets-speculative-decoding-lob.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/thor-cortex-speculation.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/thor-worker-lobe-qwen3-6-35b-a3b.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/under-pressure-lobes-tells-you-the-cortex-model-is.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/frames/unsloth-qat-senses-first-class-orin-variation.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/capacity-relative-pool-routing.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/compose-chain-unification-init-repair-doctor-stale.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/cortex-replica-pool-199.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/deployment-lock-per-box.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/dspark-speculation-on-the-spark-cortex.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/every-lobe-in-the-mesh-can-see-the-spark-reaches-t.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/hand-lobe-lfm2-5-1-2b.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/lightning-on-orin.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/lobes-adds-a-third-middle-model-tier-and-pressure.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/lobes-capabilities-tells-you-where-a-lobe-is-serve.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/lobes-exposes-the-full-colleague-runtime-stack-as.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/lobes-fits-the-machine-it-lands-on-one-command-det.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/lobes-gateway-relays-sse-streams-frame-by-frame-th.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/lobes-never-advertises-a-capability-it-cannot-serv.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/lobes-now-defaults-to-a-spark-duo-the-qwen3-6-27b.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/lobes-preserves-qwen-thinking-traces-across-multi.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/lobes-serves-strict-grammar-constrained-tool-calls.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/lobes-serves-the-brain-shape-you-choose-machine-as.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/lobes-serves-the-mesh-brain-end-state-one-lobe-per.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/lobes-ships-a-custom-vllm-image-from-nvcr-io-nvidi.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/lobes-ships-a-minor-lobe-a-cheap-warm-co-resident.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/lobes-ships-a-per-lobe-benchmark-suite-speed-paral.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/lobes-tells-clients-the-truth-about-a-fleet-a-cons.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/lobes-unifies-its-generate-lane-on-one-vllm-nightl.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/model-gear-now-serves-an-embedding-gear-qwen3-embe-2.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/model-gear-owns-the-audio-i-o-surface-end-to-end-m.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/nemotron-lightning-worker.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/proxy-lobes-pairwise-auth.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/qwen3-8-cortex-upgrade.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/qwen3-8-flash-next-gguf-candidate.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/qwen3-8-gguf-llamacpp.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/realtime-voice-to-voice-astro-test-site-151.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/realtime-ws-server-vad-149.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/stt-readiness-truth-155.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/the-gemma-4-12b-gear-gets-speculative-decoding-lob.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/thor-cortex-speculation.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/thor-worker-lobe-qwen3-6-35b-a3b.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/under-pressure-lobes-tells-you-the-cortex-model-is.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.devague/plans/unsloth-qat-senses-first-class-orin-variation.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.eidetic/memory/colleague__public.jsonl +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.eidetic/memory/default__public.jsonl +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.eidetic/memory/lobes__public.jsonl +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.flake8 +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.github/workflows/publish.yml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.github/workflows/tests.yml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.gitignore +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/.markdownlint-cli2.yaml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/AGENTS.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/LICENSE +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/README.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/culture.yaml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/deployments/README.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/deployments/VARIATION.template.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/chatterbox-tts.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/deliveries/2026-07-16-proxy-lobes-pairwise-auth.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/deliveries/2026-07-21-realtime-voice-to-voice-astro-test-site-151.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/deliveries/2026-08-04-unsloth-qat-senses-first-class-orin-variation.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/deliveries/2026-08-10-hand-lobe-lfm2-5-1-2b.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/deliveries/2026-08-20-nemotron-lightning-worker.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/deliveries/2026-08-22-qwen3-8-gguf-llamacpp.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/deliveries/2026-08-23-qwen3-8-gguf-llamacpp-deviation-ledger.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/deliveries/2026-08-24-dspark-speculation-on-the-spark-cortex.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/deliveries/2026-08-25-cortex-replica-pool-199.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/deliveries/2026-08-25-lightning-on-orin.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/deliveries/2026-08-25-thor-cortex-speculation.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/deliveries/2026-08-29-deployment-lock-per-box.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/deployment-lock.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/dspark-speculation.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/durable-logs.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-07-14-accept-referral-thor.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-07-14-accept-spark-lobe-gb10.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-07-14-accept-thor-lobe-live-referral-thor.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-07-14-accept-thor-lobe-thor.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-07-14-strict-tools-spark-lobe-spark.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-07-16-proxy-lobes-live-spark-thor.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-07-17-accept-muse-tool-calling-thor.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-07-20-accept-embed-deep-gb10.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-07-21-accept-realtime-spark.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-07-21-accept-voice-loop-spark.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-07-22-accept-realtime-voice-to-voice-spark.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-07-25-accept-by-proxy-spark-f8a9.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-07-31-accept-multimodal-cortex-spark.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-07-31-accept-worker-proxy-spark.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-07-31-accept-worker-thor.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-04-accept-senses-unsloth-orin.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-10-hand-lobe-budget-derivation.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-10-partial-hand-orin.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-10-partial-hand-spark.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-19-accept-qwen38-1m-spark.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-19-baseline-qwen3.6-cortex-spark.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-19-spike-qwen3.8-official-nightly-spark.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-20-accept-cortex-local-thor.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-20-accept-cortex-repoint-orin.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-20-accept-cortex-repoint-thor.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-20-accept-dual-cortex-mesh.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-20-accept-hand-spark.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-20-accept-worker-hand-spark.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-20-baseline-worker-qwen35b-thor.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-20-hand-thor-blocked-reattributed.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-20-spike-lightning-thor-no-go.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-20-spike-nightly-sm110-thor.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-21-measure-reasoning-effort-cortex-spark.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-23-spike-qwen38-gguf-llamacpp-orin.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-24-spike-dspark-cortex-spark.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-25-accept-cortex-replica-pool-spark-thor.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-25-accept-spark-lobe-dspark-render.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-25-baseline-cortex-single-owner.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-25-measure-associate-budget-orin.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-25-orin-board-state-lightning-spikes.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-25-spike-lightning-llamacpp-orin.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-25-spike-lightning-vllm-orin.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-25-spike-thor-cortex-speculation.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-26-accept-orin-associate.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-26-associate-gateway-auth-front.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/2026-08-28-accept-capacity-relative-pool-thor-spark.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/README-dspark-arms.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/README-realtime-acceptance.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/arm-a16-dspark-262k.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/arm-a16-none-262k.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/arm-dspark-262k.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/arm-dspark-768k.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/arm-mtp-n2-262k.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/arm-mtp-n2-768k.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/arm-mtp-n2.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/arm-none-262k.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/evidence/arm-none-768k.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/experiments/README.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/experiments/qwen3.8-flash-next-gguf-llamacpp-vllm.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/gemma-4-12b-nvfp4.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/gemma-4-12b-qat-w4a16.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/gemma-4-31b-nvfp4.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/gemma4-mtp-draft.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/image-ledger.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/lfm2.5-1.2b-hand.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/machine-profiles.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/measuring-lane-performance.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/model-switch-playbook.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/nemotron-3.5-lightning-30b-a3b-nvfp4.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/orin-associate-deployment.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/orin-profiles.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/parakeet-stt.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-06-12-model-gear-owns-the-audio-i-o-surface-end-to-end-m.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-06-19-model-gear-now-serves-an-embedding-gear-qwen3-embe-2.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-06-26-lobes-ships-a-minor-lobe-a-cheap-warm-co-resident.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-06-26-lobes-ships-a-per-lobe-benchmark-suite-speed-paral.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-06-29-lobes-adds-a-third-middle-model-tier-and-pressure.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-06-30-lobes-now-defaults-to-a-spark-duo-the-qwen3-6-27b.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-06-30-lobes-ships-a-custom-vllm-image-from-nvcr-io-nvidi.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-07-01-gemma-4-12b-gear-gets-speculative-decoding-draft.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-07-01-lobes-unifies-its-generate-lane-on-one-vllm-nightl.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-07-03-lobes-exposes-the-full-colleague-runtime-stack-as.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-07-03-under-pressure-lobes-tells-you-the-cortex-model-is.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-07-04-lobes-tells-clients-the-truth-about-a-fleet-a-cons.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-07-07-lobes-preserves-qwen-thinking-traces-across-multi.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-07-09-lobes-never-advertises-a-capability-it-cannot-serv.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-07-10-lobes-gateway-relays-sse-streams-frame-by-frame-th.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-07-13-lobes-fits-the-machine-it-lands-on-one-command-det.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-07-14-lobes-serves-strict-grammar-constrained-tool-calls.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-07-14-lobes-serves-the-brain-shape-you-choose-machine-as.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-07-14-lobes-serves-the-mesh-brain-end-state-one-lobe-per.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-07-16-proxy-lobes-pairwise-auth.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-07-17-compose-chain-unification-init-repair-doctor-stale.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-07-21-realtime-voice-to-voice-astro-test-site-151.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-07-21-realtime-ws-server-vad-149.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-07-24-stt-readiness-truth-155.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-07-25-lobes-capabilities-tells-you-where-a-lobe-is-serve.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-07-31-every-lobe-in-the-mesh-can-see-the-spark-reaches-t.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-07-31-thor-worker-lobe-qwen3-6-35b-a3b.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-08-04-unsloth-qat-senses-first-class-orin-variation.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-08-10-hand-lobe-lfm2-5-1-2b.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-08-19-qwen3-8-cortex-upgrade.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-08-20-nemotron-lightning-worker.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-08-22-qwen3-8-gguf-llamacpp.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-08-24-dspark-speculation-on-the-spark-cortex.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-08-25-cortex-replica-pool-199.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-08-25-lightning-on-orin.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-08-25-thor-cortex-speculation.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-08-27-capacity-relative-pool-routing.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/plans/2026-08-29-deployment-lock-per-box.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/qwen3-14b-nvfp4.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/qwen3-32b-nvfp4.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/qwen3-embedding-0.6b.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/qwen3-embedding-4b.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/qwen3-reranker-0.6b.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/qwen3.5-4b-minor.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/qwen3.6-27b-nvfp4-multimodal.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/qwen3.6-27b-nvfp4.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/qwen3.6-27b-text-nvfp4-mtp.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/qwen3.6-35b-a3b-nvfp4.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/qwen3.8-27b-gguf-llamacpp.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/qwen3.8-27b-nvfp4.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/qwen38-rollout-notes.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/realtime-pipeline.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/secret-rotation.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/skill-sources.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-06-12-model-gear-owns-the-audio-i-o-surface-end-to-end-m.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-06-19-model-gear-now-serves-an-embedding-gear-qwen3-embe-2.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-06-26-lobes-ships-a-minor-lobe-a-cheap-warm-co-resident.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-06-26-lobes-ships-a-per-lobe-benchmark-suite-speed-paral.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-06-29-lobes-adds-a-third-middle-model-tier-and-pressure.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-06-30-lobes-now-defaults-to-a-spark-duo-the-qwen3-6-27b.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-06-30-lobes-ships-a-custom-vllm-image-from-nvcr-io-nvidi.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-07-01-gemma-4-12b-gear-gets-speculative-decoding-draft.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-07-01-lobes-unifies-its-generate-lane-on-one-vllm-nightl.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-07-03-lobes-exposes-the-full-colleague-runtime-stack-as.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-07-03-under-pressure-lobes-tells-you-the-cortex-model-is.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-07-04-lobes-tells-clients-the-truth-about-a-fleet-a-cons.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-07-07-lobes-preserves-qwen-thinking-traces-across-multi.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-07-09-lobes-never-advertises-a-capability-it-cannot-serv.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-07-10-lobes-gateway-relays-sse-streams-frame-by-frame-th.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-07-13-lobes-fits-the-machine-it-lands-on-one-command-det.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-07-14-lobes-serves-strict-grammar-constrained-tool-calls.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-07-14-lobes-serves-the-brain-shape-you-choose-machine-as.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-07-14-lobes-serves-the-mesh-brain-end-state-one-lobe-per.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-07-16-proxy-lobes-pairwise-auth.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-07-17-compose-chain-unification-init-repair-doctor-stale.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-07-21-realtime-voice-to-voice-astro-test-site-151.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-07-21-realtime-ws-server-vad-149.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-07-24-stt-readiness-truth-155.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-07-25-lobes-capabilities-tells-you-where-a-lobe-is-serve.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-07-31-every-lobe-in-the-mesh-can-see-the-spark-reaches-t.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-07-31-thor-worker-lobe-qwen3-6-35b-a3b.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-08-04-unsloth-qat-senses-first-class-orin-variation.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-08-09-hand-lobe-lfm2-5-1-2b.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-08-19-qwen3-8-cortex-upgrade.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-08-20-nemotron-lightning-worker.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-08-22-qwen3-8-gguf-llamacpp.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-08-24-dspark-speculation-on-the-spark-cortex.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-08-25-cortex-replica-pool-199.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-08-25-lightning-on-orin.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-08-25-thor-cortex-speculation.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-08-27-capacity-relative-pool-routing.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-08-27-flash-next-on-vllm.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-08-27-qwen3-8-flash-next-gguf-candidate.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/specs/2026-08-29-deployment-lock-per-box.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/superpowers/plans/2026-05-22-scaffold-cli-sibling.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/superpowers/specs/2026-05-22-scaffold-cli-sibling-design.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/tensorrt-llm-investigation.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/tuning-profiles.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/validate-tiers.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/vllm-nightly-migration.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/docs/worker-lightning-rollout-notes.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/examples/minor-evals/smoke.jsonl +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/__init__.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/__main__.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/_metrics.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/assess.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/bench/__init__.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/bench/cat_probe.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/bench/cat_score.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/bench/compare.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/bench/report.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/catalog.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/__init__.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_commands/__init__.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_commands/assess.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_commands/benchmark.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_commands/calibrate.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_commands/capabilities.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_commands/cli.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_commands/doctor.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_commands/eval.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_commands/explain.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_commands/fleet.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_commands/learn.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_commands/logs.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_commands/measure.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_commands/overview.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_commands/route.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_commands/run.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_commands/serve.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_commands/status.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_commands/stop.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_commands/switch.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_commands/tunnel.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_commands/whoami.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_errors.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_live.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_output.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/cli/_runtime_ops.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/explain/__init__.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/gateway/__init__.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/gateway/__main__.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/gateway/_config.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/gateway/_pressure_policy.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/gateway/_realtime.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/gateway/_replicas.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/gateway/_routing.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/gateway/_selection.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/gateway/_tier_request.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/machines/__init__.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/machines/_registry.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/machines/_strategy.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/machines/_traits.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/machines/blackwell.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/machines/generic.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/machines/orin.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/machines/spark.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/machines/thor.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/minor/__init__.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/minor/_client.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/minor/governance.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/profiles/__init__.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/profiles/builtin/__init__.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/profiles/builtin/base.toml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/profiles/builtin/orin.toml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/profiles/builtin/spark.toml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/profiles/builtin/thor.toml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/profiles/builtin_shapes/__init__.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/profiles/builtin_shapes/machine-as-brain.toml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/profiles/builtin_shapes/orin-associate.toml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/profiles/builtin_shapes/orin-cortex.toml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/profiles/builtin_shapes/orin-lobe.toml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/profiles/builtin_shapes/orin-small.toml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/profiles/builtin_shapes/spark-lobe.toml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/profiles/builtin_shapes/thor-lobe.toml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/profiles/builtin_shapes/thor-muse.toml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/profiles/builtin_shapes/thor-worker.toml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/profiles/loader.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/profiles/render.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/profiles/schema.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/profiles/shape_render.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/profiles/shapes.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/realtime/__init__.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/realtime/__main__.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/realtime/_conversation.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/realtime/_floor.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/realtime/_pcm.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/realtime/_readiness.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/realtime/_segmenter.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/realtime/_session.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/realtime/_settings.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/realtime/_turn.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/realtime/_wire.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/realtime/app.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/realtime/audio_facade.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/realtime/chatterbox_server.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/realtime/protocol.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/realtime/tts_client.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/roles_measure.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/runtime/__init__.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/runtime/_buildability.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/runtime/_detect.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/runtime/_env.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/runtime/_health.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/runtime/_lock.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/runtime/_parser.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/runtime/_pressure.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/runtime/_tunnel.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/templates/__init__.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/templates/cf-tunnel.env.example +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/templates/docker-compose.yml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/templates/env.example +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/templates/fleet/Dockerfile.chatterbox +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/templates/fleet/Dockerfile.gateway +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/templates/fleet/Dockerfile.parakeet +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/templates/fleet/Dockerfile.realtime +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/templates/fleet/Dockerfile.vllm-gemma4 +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/templates/fleet/__init__.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/templates/fleet/_readiness.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/templates/fleet/docker-compose.audio.yml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/templates/fleet/env.audio.example +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/templates/fleet/env.example +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/templates/fleet/listen_server.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/templates/mg-logwrap.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/variation.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/variation_catalog.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/vllm_plugins/__init__.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/lobes/vllm_plugins/qwen3_thinking_tool_parser.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/packaging/model-gear/README.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/packaging/model-gear/pyproject.toml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/scripts/accept-by-proxy.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/scripts/accept-shape.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/scripts/audio-smoke.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/scripts/gen-api-key.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/scripts/live-check.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/scripts/prefill-depth-curve.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/scripts/realtime-smoke.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/scripts/realtime-voice-loop.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/scripts/scan_deployment_secrets.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/scripts/spec-arms.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/scripts/spike-preflight.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/scripts/validate-tiers.sh +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/.env.example +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/.gitignore +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/.nvmrc +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/README.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/astro.config.mjs +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/package-lock.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/package.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/proxy/gateway-proxy.mjs +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/public/favicon.svg +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/public/worklets/pcm-capture-processor.js +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/components/ConnectionPanel.astro +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/components/EventStream.astro +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/components/Footer.astro +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/components/Header.astro +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/components/MicIsland.astro +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/components/SignalMesh.astro +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/layouts/Layout.astro +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/pages/dev-connection.astro +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/pages/dev-events.astro +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/pages/dev-mic.astro +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/pages/index.astro +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/scripts/audio-graph.ts +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/scripts/audio-playback.test.ts +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/scripts/audio-playback.ts +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/scripts/audio-test-doubles.ts +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/scripts/connection-panel.ts +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/scripts/dev-mic-harness.ts +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/scripts/event-fixtures.ts +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/scripts/event-icons.ts +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/scripts/event-log.test.ts +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/scripts/event-log.ts +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/scripts/mic-capture.test.ts +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/scripts/mic-capture.ts +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/scripts/mic-island.test.ts +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/scripts/mic-island.ts +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/scripts/no-mic-mute.test.ts +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/scripts/pcm-wire.test.ts +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/scripts/pcm-wire.ts +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/scripts/realtime-connection.ts +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/scripts/realtime-events.ts +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/src/styles/global.css +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/test/connection-panel.test.ts +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/test/gateway-proxy.test.ts +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/test/realtime-connection.test.ts +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/tsconfig.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/site/vitest.config.ts +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/sonar-project.properties +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/__init__.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/conftest.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/fixtures/deployments/fixture-card/Dockerfile.gateway +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/fixtures/deployments/fixture-card/VARIATION.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/fixtures/deployments/fixture-card/deployment.lock.toml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/fixtures/deployments/fixture-card/docker-compose.override.yml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/fixtures/deployments/fixture-card/docker-compose.yml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/fixtures/deployments/fixture-card__fixture-shape/VARIATION.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/fixtures/deployments/fixture-card__fixture-shape/deployment.lock.toml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/fixtures/deployments/fixture-card__fixture-shape/docker-compose.override.yml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/fixtures/deployments/fixture-card__fixture-shape/docker-compose.shape.yml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/fixtures/deployments/fixture-card__fixture-shape/docker-compose.yml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/fixtures/upgrade_compat/README.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/fixtures/upgrade_compat/fleet/docker-compose.yml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/fixtures/upgrade_compat/fleet/env.example +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/fixtures/upgrade_compat/single/docker-compose.yml +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/fixtures/upgrade_compat/single/env.example +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/README.md +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/__init__.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/base.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/no-pool-gateway.json +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/orin.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/regen.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/orin-associate__base.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/orin-associate__orin.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/orin-associate__spark.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/orin-associate__thor.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/orin-cortex__base.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/orin-cortex__orin.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/orin-cortex__spark.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/orin-cortex__thor.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/orin-lobe__base.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/orin-lobe__orin.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/orin-lobe__spark.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/orin-lobe__thor.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/orin-small__base.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/orin-small__orin.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/orin-small__spark.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/orin-small__thor.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/spark-lobe__base.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/spark-lobe__orin.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/spark-lobe__spark.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/spark-lobe__thor.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/thor-lobe__base.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/thor-lobe__orin.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/thor-lobe__spark.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/thor-lobe__thor.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/thor-muse__base.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/thor-muse__orin.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/thor-muse__spark.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/thor-muse__thor.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/thor-worker__base.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/thor-worker__orin.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/thor-worker__spark.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/shapes/thor-worker__thor.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/spark.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/switch-plans.txt +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/template-defaults.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/goldens/thor.env +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_assess.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_assess_perf.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_associate_compose.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_associate_exposure.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_associate_gateway_boundaries.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_associate_role.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_bench_compare.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_bench_report.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_benchmark_all_lobes.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_boundary_serves_only.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_buildability_guard.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_calibration_knee.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_cat_probe.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_cat_score.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_catalog.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_catalog_tiers.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_chatterbox_pcm16.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_chatterbox_readiness.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_cli.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_cli_benchmark_profiles.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_cli_calibrate.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_cli_capabilities.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_cli_capabilities_replicas.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_cli_eval.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_cli_eval_cat.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_cli_fleet.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_cli_gateway_auth.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_cli_introspection.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_cli_logs.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_cli_measure.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_cli_route.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_cli_run.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_cli_runtime.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_cli_tunnel.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_cli_wiring.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_client_reasoning_roundtrip.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_colleague_contract.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_compose_chain.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_deployment_lock.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_deployment_lock_doc.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_detect.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_doctor.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_doctor_fix.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_doctor_machine_profile.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_doctor_passthrough.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_dropped_lobe_honesty.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_fleet_audio_vad_env.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_fleet_minor.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_fleet_per_machine_knobs.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_fleet_secrets_env_file.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_fleet_template_gateway_env.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_audio_peer.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_audio_routing.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_auth.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_busy_e2e.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_capabilities.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_config_proxy.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_config_replicas.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_config_wiring.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_embed_deep.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_env_passthrough_guard.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_feasibility.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_fleet_doc.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_force_strict.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_hand_adapters.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_pool.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_pool_capacity_wiring.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_pool_pressure.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_pool_saturation.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_proxy.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_readiness.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_realtime_ws.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_replicas.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_routing.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_selection.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_server.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_status.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gateway_tiers.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gemma4_compose.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gemma4_dockerfile.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gen_api_key.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_gitignore_convention.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_init.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_init_coresidency.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_init_from_lock.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_init_gpu_access.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_init_profile.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_live_capabilities.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_lock_drift.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_machines.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_minor_client.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_minor_governance.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_minor_integration.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_minor_logprobs.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_nightly_migration_doc.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_no_config_byte_identity.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_orin_associate_shape.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_orin_cortex_shape.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_orin_lobe_shape.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_overview_live.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_parser.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_peer_referral.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_preserve_thinking_diagnostic.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_pressure.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_pressure_policy.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_profile_goldens.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_profile_render.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_profile_schema.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_profiles.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_proxy_integration.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_readiness_peer_probe.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_realtime_audio_env_coverage.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_realtime_audio_facade.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_realtime_conversation.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_realtime_floor.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_realtime_imports.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_realtime_pcm.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_realtime_protocol.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_realtime_readiness.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_realtime_segmenter.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_realtime_session.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_realtime_settings.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_realtime_smoke_helpers.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_realtime_tts_gate.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_realtime_turn.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_realtime_wire.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_role_probes.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_roles.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_roles_proxied.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_roles_replicas.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_scan_deployment_secrets.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_senses_speculative_config.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_shape_budgets.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_shape_contract_matrix.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_shape_goldens.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_shapes.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_smoke_duo.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_spec_arms.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_spike_preflight.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_status_fleet.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_status_pressure.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_switch_bf16.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_switch_plan_goldens.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_templates_preserve_thinking.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_tier_request.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_tts_pause_and_truncation.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_upgrade_compat.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_variation.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_variation_catalog.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_vllm_plugin_thinking.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_wheel_excludes_deployments.py +0 -0
- {lobes_cli-0.68.4 → lobes_cli-0.69.2}/tests/test_worker_compose.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
targeted-ops-and-honest-streams
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "targeted-ops-and-honest-streams",
|
|
3
|
+
"title": "targeted ops and honest streams",
|
|
4
|
+
"schema_version": 5,
|
|
5
|
+
"status": "drafting",
|
|
6
|
+
"created": "2026-08-29T12:18:43Z",
|
|
7
|
+
"updated": "2026-08-29T12:19:55Z",
|
|
8
|
+
"claims": [
|
|
9
|
+
{
|
|
10
|
+
"id": "c1",
|
|
11
|
+
"kind": "announcement",
|
|
12
|
+
"text": "lobes keeps two promises it currently breaks: a targeted lobe operation touches only what it names, and a streamed or proxied answer is honest about what it is \u2014 every SSE relay ends with a terminal frame and a closed socket even when its upstream dies, and a proxied role advertises the hosting peer's own ready and context rather than a locally-guessed one.",
|
|
13
|
+
"origin": "user",
|
|
14
|
+
"status": "confirmed",
|
|
15
|
+
"honesty_conditions": [],
|
|
16
|
+
"hard_questions": [],
|
|
17
|
+
"links": [],
|
|
18
|
+
"instruction": "",
|
|
19
|
+
"revisions": []
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "c2",
|
|
23
|
+
"kind": "requirement",
|
|
24
|
+
"text": "compose_service_argv's up branch gains --no-deps: lobes/runtime/_compose.py:769-782 builds ['docker','compose',*files,'up','-d',*services] and its own docstring already promises 'only these are (re)started ... without disturbing the rest of the fleet' \u2014 grep for no-deps/no_deps across lobes/ returns nothing, so the docstring is the spec and the argv is the defect. lobes/cli/_commands/up.py:231 is the single caller and renders its dry-run PLAN from the same argv, so the printed plan becomes truthful in the same change.",
|
|
25
|
+
"origin": "llm",
|
|
26
|
+
"status": "proposed",
|
|
27
|
+
"honesty_conditions": [],
|
|
28
|
+
"hard_questions": [],
|
|
29
|
+
"links": [],
|
|
30
|
+
"instruction": "",
|
|
31
|
+
"revisions": []
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"id": "c3",
|
|
35
|
+
"kind": "requirement",
|
|
36
|
+
"text": "the fleet template's gateway depends_on stops being an unconditional hard edge: lobes/templates/fleet/docker-compose.yml:1706-1710 lists vllm-primary/vllm-multimodal/vllm-embed/vllm-rerank, its own adjacent comment says 'Start order only \u2014 the gateway tolerates a backend still loading ... so it must not block on backend health', and lobes/cli/_commands/init.py:230 already !resets exactly this attribute for a role-dropping shape \u2014 so the edge is already known-droppable.",
|
|
37
|
+
"origin": "llm",
|
|
38
|
+
"status": "proposed",
|
|
39
|
+
"honesty_conditions": [],
|
|
40
|
+
"hard_questions": [],
|
|
41
|
+
"links": [],
|
|
42
|
+
"instruction": "",
|
|
43
|
+
"revisions": []
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"id": "c4",
|
|
47
|
+
"kind": "requirement",
|
|
48
|
+
"text": "lobes gains a first-class gateway update path: lobes/cli/_commands/up.py:92 sets TARGETS = roles.ROLES + (colleague-stack,), so 'gateway' is not an addressable target and the operator need ('reinstall the gateway at a new MODEL_GEAR_VERSION, touch nothing else') has no verb \u2014 which is why issue 222 was hit through a hand-written docker compose up -d --build gateway.",
|
|
49
|
+
"origin": "llm",
|
|
50
|
+
"status": "proposed",
|
|
51
|
+
"honesty_conditions": [],
|
|
52
|
+
"hard_questions": [],
|
|
53
|
+
"links": [],
|
|
54
|
+
"instruction": "",
|
|
55
|
+
"revisions": []
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"id": "c5",
|
|
59
|
+
"kind": "requirement",
|
|
60
|
+
"text": "_relay_streaming terminates the client stream on an upstream failure: lobes/gateway/server.py:3442-3457 loops resp.upstream.read(_CHUNK) -> wfile.write(frame_chunk(chunk)) with no try/except, so an exception from either side skips both CHUNK_TERMINATOR and any terminal SSE frame; _Upstream.read (server.py:482) is a bare http.client read1 that can raise OSError/HTTPException mid-stream.",
|
|
61
|
+
"origin": "llm",
|
|
62
|
+
"status": "proposed",
|
|
63
|
+
"honesty_conditions": [],
|
|
64
|
+
"hard_questions": [],
|
|
65
|
+
"links": [],
|
|
66
|
+
"instruction": "",
|
|
67
|
+
"revisions": []
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"id": "c6",
|
|
71
|
+
"kind": "requirement",
|
|
72
|
+
"text": "a proxied role's advertised ready and context come from the hosting peer's own /capabilities, not from local data: lobes/roles.py:682-711 derives context from _served_context(role, env, native_context) over the LOCAL .env plus the catalog's native_max_model_len (1048576 for the Lightning entry), and lobes/gateway/_readiness.py:212-266 probe_peer_ready only checks that the peer's /v1/models lists served_name \u2014 which a box forwarding the alias (ASSOCIATE_SERVED_NAME) can never satisfy, yielding the reported ready:false/context:1048576 against the Orin's own ready:true/context:128000.",
|
|
73
|
+
"origin": "llm",
|
|
74
|
+
"status": "proposed",
|
|
75
|
+
"honesty_conditions": [],
|
|
76
|
+
"hard_questions": [],
|
|
77
|
+
"links": [],
|
|
78
|
+
"instruction": "",
|
|
79
|
+
"revisions": []
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"id": "c7",
|
|
83
|
+
"kind": "assumption",
|
|
84
|
+
"text": "probe_audio_peer_ready (lobes/gateway/_readiness.py:322-341) is the existing precedent for reading a peer's GET /capabilities and trusting roles[role].ready \u2014 the core-role relay is that same shape widened to carry context, not a new mechanism.",
|
|
85
|
+
"origin": "llm",
|
|
86
|
+
"status": "proposed",
|
|
87
|
+
"honesty_conditions": [],
|
|
88
|
+
"hard_questions": [],
|
|
89
|
+
"links": [],
|
|
90
|
+
"instruction": "",
|
|
91
|
+
"revisions": []
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"id": "c8",
|
|
95
|
+
"kind": "boundary",
|
|
96
|
+
"text": "the shape override contract is untouched: lobes/cli/_commands/init.py:187-231 renders docker-compose.shape.yml parking dropped services in the inert shape-dropped profile AND emitting 'depends_on: !reset null' on the gateway; tests/test_shape_goldens.py and tests/test_init_shape.py pin that text, so a base-template depends_on change must leave the override renderable and its goldens honest (a !reset of an absent attribute is legal but the comment prose around it would become false).",
|
|
97
|
+
"origin": "llm",
|
|
98
|
+
"status": "proposed",
|
|
99
|
+
"honesty_conditions": [],
|
|
100
|
+
"hard_questions": [],
|
|
101
|
+
"links": [],
|
|
102
|
+
"instruction": "",
|
|
103
|
+
"revisions": []
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"id": "c9",
|
|
107
|
+
"kind": "boundary",
|
|
108
|
+
"text": "the stop branch of compose_service_argv stays as it is: docker compose stop does not walk depends_on, so --no-deps belongs on the up branch only \u2014 the issue itself names this asymmetry as why the defect went unnoticed.",
|
|
109
|
+
"origin": "llm",
|
|
110
|
+
"status": "proposed",
|
|
111
|
+
"honesty_conditions": [],
|
|
112
|
+
"hard_questions": [],
|
|
113
|
+
"links": [],
|
|
114
|
+
"instruction": "",
|
|
115
|
+
"revisions": []
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"id": "c10",
|
|
119
|
+
"kind": "boundary",
|
|
120
|
+
"text": "the per-heavy-lobe depends_on edges are NOT in scope: vllm-muse (docker-compose.yml:1245), vllm-worker (:1354) and vllm-associate (:1602) each wait on vllm-embed/vllm-rerank service_healthy as a MEASURED mitigation for the Thor unified-memory first-boot race (2026-07-17, docs/machine-profiles.md) \u2014 only the gateway's edge is the defect.",
|
|
121
|
+
"origin": "llm",
|
|
122
|
+
"status": "proposed",
|
|
123
|
+
"honesty_conditions": [],
|
|
124
|
+
"hard_questions": [],
|
|
125
|
+
"links": [],
|
|
126
|
+
"instruction": "",
|
|
127
|
+
"revisions": []
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"id": "c11",
|
|
131
|
+
"kind": "non_goal",
|
|
132
|
+
"text": "issue 220 part 4 (bursts of 29x POST /tokenize 401 every ~2 min) is not fixed here: the issue itself states the fix is on the resident side (an older spark-colleague mesh resident without the gateway key), and nothing under lobes/gateway/ is misbehaving \u2014 a 401 on an unauthenticated POST is the #127 inbound gate working.",
|
|
133
|
+
"origin": "llm",
|
|
134
|
+
"status": "proposed",
|
|
135
|
+
"honesty_conditions": [],
|
|
136
|
+
"hard_questions": [],
|
|
137
|
+
"links": [],
|
|
138
|
+
"instruction": "",
|
|
139
|
+
"revisions": []
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"id": "c12",
|
|
143
|
+
"kind": "non_goal",
|
|
144
|
+
"text": "issue 220 part 3 (reranker calibration \u2014 distractors scoring 0.72-0.77, a NOTICE sentence out-ranking a toolbatch sentence) is not fixed here: it is a served-prompt-template/measurement investigation against Qwen3-Reranker-0.6B's model card, with no defect localised in lobes yet, and the reporter's own verdict is 'usable for top-k ordering, not thresholds'.",
|
|
145
|
+
"origin": "llm",
|
|
146
|
+
"status": "proposed",
|
|
147
|
+
"honesty_conditions": [],
|
|
148
|
+
"hard_questions": [],
|
|
149
|
+
"links": [],
|
|
150
|
+
"instruction": "",
|
|
151
|
+
"revisions": []
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"id": "c13",
|
|
155
|
+
"kind": "boundary",
|
|
156
|
+
"text": "no live-box validation is claimed: the #108 rule in CLAUDE.md forbids doc, support-table or lobes capabilities output claiming validation without an acceptance transcript under docs/evidence/, and the boxes this was observed on (spark, the Thor peer, the Orin) are not being re-booted by this change \u2014 every claim here is offline-testable or stays UNVALIDATED.",
|
|
157
|
+
"origin": "llm",
|
|
158
|
+
"status": "proposed",
|
|
159
|
+
"honesty_conditions": [],
|
|
160
|
+
"hard_questions": [],
|
|
161
|
+
"links": [],
|
|
162
|
+
"instruction": "",
|
|
163
|
+
"revisions": []
|
|
164
|
+
}
|
|
165
|
+
],
|
|
166
|
+
"open_vagueness": [
|
|
167
|
+
{
|
|
168
|
+
"id": "v1",
|
|
169
|
+
"text": "the reported symptom (client hangs, SSE socket ESTABLISHED, no terminal frame) is not fully explained by the traceback in the issue: a BrokenPipeError on wfile.write means the CLIENT already went away, yet the client reported still waiting \u2014 so there may be a second failure mode (the JSONDecodeError traceback, or a pre-relay path) that the _relay_streaming fix alone does not close.",
|
|
170
|
+
"kind": "unknown_nonblocking",
|
|
171
|
+
"claim_id": null,
|
|
172
|
+
"resolved": false,
|
|
173
|
+
"resolution": "",
|
|
174
|
+
"resolution_claim_id": null
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"id": "v2",
|
|
178
|
+
"text": "whether an infeasible-but-PROXIED role should relay the peer's context verbatim or a min(local ceiling, peer context) \u2014 a caller that trusts a relayed 128000 is right today, but the value is the peer's, and this box cannot honour it if the proxy is later withdrawn.",
|
|
179
|
+
"kind": "unknown_nonblocking",
|
|
180
|
+
"claim_id": null,
|
|
181
|
+
"resolved": false,
|
|
182
|
+
"resolution": "",
|
|
183
|
+
"resolution_claim_id": null
|
|
184
|
+
}
|
|
185
|
+
],
|
|
186
|
+
"scope_entries": [
|
|
187
|
+
{
|
|
188
|
+
"id": "s1",
|
|
189
|
+
"surface": "lobes/runtime/_compose.py:769-782 (compose_service_argv)",
|
|
190
|
+
"finding": "the up branch emits 'up -d <services>' with no --no-deps while its docstring promises fleet isolation; grep -rn 'no-deps|no_deps' lobes/ returns nothing",
|
|
191
|
+
"seeds": [
|
|
192
|
+
"c2",
|
|
193
|
+
"c9"
|
|
194
|
+
]
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"id": "s2",
|
|
198
|
+
"surface": "lobes/cli/_commands/up.py (TARGETS, ROLE_SERVICE, _resolve)",
|
|
199
|
+
"finding": "the single caller of compose_service_argv (line 231); TARGETS at line 92 is roles.ROLES + colleague-stack, so 'gateway' is not an addressable target; ROLE_SERVICE maps ten roles to services, gateway absent",
|
|
200
|
+
"seeds": [
|
|
201
|
+
"c2",
|
|
202
|
+
"c4"
|
|
203
|
+
]
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
"id": "s3",
|
|
207
|
+
"surface": "lobes/templates/fleet/docker-compose.yml (gateway service, line ~1690-1712)",
|
|
208
|
+
"finding": "gateway depends_on lists all four default core lanes unconditionally, annotated 'Start order only \u2014 the gateway ... must not block on backend health'; the muse/worker/associate lanes at 1245/1354/1602 carry a DIFFERENT, measured depends_on on embed+rerank service_healthy",
|
|
209
|
+
"seeds": [
|
|
210
|
+
"c3",
|
|
211
|
+
"c10"
|
|
212
|
+
]
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
"id": "s4",
|
|
216
|
+
"surface": "lobes/cli/_commands/init.py:143-231 (SHAPE_DROPPED_PROFILE, render_shape_override)",
|
|
217
|
+
"finding": "a role-dropping shape already parks dropped services in the inert 'shape-dropped' profile and emits 'depends_on: !reset null' on the gateway \u2014 so the base edge is known-droppable, and its prose/goldens are the constraint on changing the base",
|
|
218
|
+
"seeds": [
|
|
219
|
+
"c3",
|
|
220
|
+
"c8"
|
|
221
|
+
]
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
"id": "s5",
|
|
225
|
+
"surface": "lobes/gateway/server.py:432-436, 482-495, 3442-3457 (_relay_streaming, _Upstream.read, frame_chunk)",
|
|
226
|
+
"finding": "the relay loop has no exception handling around either the upstream read1 or the client wfile.write, so a mid-stream failure skips CHUNK_TERMINATOR entirely and emits no terminal SSE frame",
|
|
227
|
+
"seeds": [
|
|
228
|
+
"c5"
|
|
229
|
+
]
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
"id": "s6",
|
|
233
|
+
"surface": "lobes/roles.py:120-170 and 682-711 (ROLE_BACKEND/ROLE_ROLE_HINT, _core_role entry builder)",
|
|
234
|
+
"finding": "context comes from _served_context over the LOCAL .env plus the catalog native_max_model_len, and associate shares worker's role_hint (one checkpoint, two addresses) \u2014 which is also why the raw model id and 'worker' resolve to the local worker backend and 404 role_infeasible on the proxying box",
|
|
235
|
+
"seeds": [
|
|
236
|
+
"c6"
|
|
237
|
+
]
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"id": "s7",
|
|
241
|
+
"surface": "lobes/gateway/_readiness.py:212-266 (probe_peer_ready) and :322-341 (probe_audio_peer_ready)",
|
|
242
|
+
"finding": "the core-role peer probe asserts the peer's /v1/models lists served_name \u2014 unsatisfiable when the box forwards an alias \u2014 while the AUDIO peer probe already reads the peer's GET /capabilities and trusts roles[role].ready; the audio shape is the precedent to widen",
|
|
243
|
+
"seeds": [
|
|
244
|
+
"c6",
|
|
245
|
+
"c7"
|
|
246
|
+
]
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
"id": "s8",
|
|
250
|
+
"surface": "issue 220 parts 3 and 4 as filed",
|
|
251
|
+
"finding": "part 4 names its own fix as resident-side (an old spark-colleague without the gateway key); part 3 has no defect localised in lobes and asks for a served-prompt-template check against the model card \u2014 neither is a lobes code change today",
|
|
252
|
+
"seeds": [
|
|
253
|
+
"c11",
|
|
254
|
+
"c12"
|
|
255
|
+
]
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
"id": "s9",
|
|
259
|
+
"surface": "CLAUDE.md (#108 honesty rule) and docs/evidence/",
|
|
260
|
+
"finding": "no acceptance transcript may be claimed without a live boot; the boxes in both issue reports are not being re-booted here, so every claim must be offline-testable or explicitly stay UNVALIDATED",
|
|
261
|
+
"seeds": [
|
|
262
|
+
"c13"
|
|
263
|
+
]
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
"id": "s10",
|
|
267
|
+
"surface": "tests/ (test_cli_up.py, test_compose_chain.py, test_shape_goldens.py, test_init_shape.py, test_gateway_readiness.py, test_gateway_capabilities.py, test_gateway_proxy.py)",
|
|
268
|
+
"finding": "existing offline suites already cover the argv, the compose chain, the shape override goldens, the peer probes and the capabilities payload \u2014 issue 222's requested guard tests (argv contains --no-deps; an infeasible role is never a started dependency) land in files that already exist",
|
|
269
|
+
"seeds": [
|
|
270
|
+
"c2",
|
|
271
|
+
"c3"
|
|
272
|
+
]
|
|
273
|
+
}
|
|
274
|
+
],
|
|
275
|
+
"lapses": []
|
|
276
|
+
}
|
|
@@ -4,6 +4,31 @@ All notable changes to this project are documented here. The format is based on
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project
|
|
5
5
|
adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
+
## [0.69.2] - 2026-08-29
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- An inbound auth rejection now logs its source and the reason it failed, and repeats from one source collapse to one line per 60s instead of flooding the log (issue #228). The 401 response is unchanged and still distinguishes nothing — the caller must not learn missing vs. malformed vs. wrong.
|
|
12
|
+
|
|
13
|
+
## [0.69.1] - 2026-08-29
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
|
|
17
|
+
- The streamed relay also treats a `ValueError` from the upstream read as an upstream failure, so a malformed chunked body cannot skip the terminal SSE frames (PR #229 review).
|
|
18
|
+
- `cmd_up` and `build_role_registry` were split into named helpers (`_audio_overlay_required`, `_resolve_build`, `_role_signals`) to stay under the cognitive-complexity gate.
|
|
19
|
+
|
|
20
|
+
## [0.69.0] - 2026-08-29
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
|
|
24
|
+
- `lobes up gateway` (and `--build`) — a first-class path to restart or re-image the gateway alone at a new `MODEL_GEAR_VERSION` (issue #222).
|
|
25
|
+
|
|
26
|
+
### Fixed
|
|
27
|
+
|
|
28
|
+
- `lobes up <role>` now runs with `--no-deps` and the fleet gateway declares no `depends_on`, so a targeted start can no longer recreate the whole fleet or boot a lane the box declares infeasible (issue #222).
|
|
29
|
+
- A streamed `/v1/chat/completions` relay always terminates the client stream: an upstream that dies mid-stream now yields an SSE error event, `data: [DONE]` and the chunked terminator, and a client that hung up is logged instead of leaving a wedged socket (issue #220).
|
|
30
|
+
- A proxied role advertises the hosting peer's own `ready` and `context`, read from the peer's `GET /capabilities`, instead of a locally-guessed catalog ceiling and an unsatisfiable `/v1/models` check (issue #220).
|
|
31
|
+
|
|
7
32
|
## [0.68.4] - 2026-08-29
|
|
8
33
|
|
|
9
34
|
### Fixed
|
|
@@ -238,7 +238,14 @@ busy — the former degrade-to-`minor` substitution path was removed outright,
|
|
|
238
238
|
so there is no cheaper-rung fallback for any of the four); an explicit
|
|
239
239
|
`hand` request (or its `minor`/`cheap` spellings) is the servable floor and is
|
|
240
240
|
always served regardless of pressure. `lobes status --pressure` shows the current busy/warm state.
|
|
241
|
-
Start/stop one role at a time with `lobes up <role>`
|
|
241
|
+
Start/stop one role at a time with `lobes up <role>` — which since issue #222
|
|
242
|
+
actually isolates: every `up` carries `--no-deps` and the base compose gives
|
|
243
|
+
the gateway no `depends_on` at all, because `docker compose up -d <service>`
|
|
244
|
+
walks that list and a gateway-only restart was therefore recreating every heavy
|
|
245
|
+
lane (measured live on the Thor 2026-08-28, including starting a lane the box
|
|
246
|
+
declares `MULTIMODAL_FEASIBLE=false`). `gateway` is now an `up` TARGET too (not
|
|
247
|
+
a role): `lobes up gateway --build --apply` re-images the front at a new
|
|
248
|
+
`MODEL_GEAR_VERSION` without touching the lobes behind it. Or the
|
|
242
249
|
seven-default-role bundle, `lobes up colleague-stack` — `muse` and `worker` are
|
|
243
250
|
deliberately excluded from the bundle, both being opt-in-hosted, while `hand`
|
|
244
251
|
IS included, being default-hosted and un-gated; `lobes up muse` works on
|
|
@@ -704,8 +711,20 @@ stays byte-identical to the pre-proxy contract.
|
|
|
704
711
|
**Live as of 2026-07-31:** the DGX Spark (`spark-lobe`) proxies TWO roles —
|
|
705
712
|
`senses` → the AGX Orin and `worker` → the Jetson AGX Thor — so a caller
|
|
706
713
|
addresses either on the Spark's own gateway and never dials the peer box.
|
|
707
|
-
Both answer 200 with `X-Lobes-Proxied-By`, image input included.
|
|
708
|
-
role
|
|
714
|
+
Both answer 200 with `X-Lobes-Proxied-By`, image input included. **A proxied
|
|
715
|
+
role's `ready` and `context` are the PEER's own advert (issue #220):** the
|
|
716
|
+
background probe reads the peer's `GET /capabilities` and relays that role
|
|
717
|
+
entry, falling back to the old `/v1/models` served-id check only for a peer
|
|
718
|
+
with no such entry. Both halves fixed a measured lie — on the Spark,
|
|
719
|
+
2026-08-27, `associate` advertised `ready:false, context:1048576` against an
|
|
720
|
+
Orin reporting `ready:true, context:128000` — with two distinct causes: the
|
|
721
|
+
`/v1/models` check is unsatisfiable for a box forwarding an ALIAS (which
|
|
722
|
+
`associate` must do, sharing a checkpoint with `worker`), and a role this box
|
|
723
|
+
does not host has no `<PREFIX>_MAX_MODEL_LEN` to read, so context fell through
|
|
724
|
+
to the catalog's native ceiling. That collision is also why **role-name
|
|
725
|
+
addressing (`model=associate`) is the documented proxied path** — the raw
|
|
726
|
+
checkpoint id is ambiguous and resolves to the local `worker` lane. Note a
|
|
727
|
+
proxied role reports `feasible: false` **by design** (it means "this box does not *host*
|
|
709
728
|
it", not "you cannot use it here"); `proxied: true` + `hosted_by` + `ready` are
|
|
710
729
|
the fields that say it is usable, and `loaded` is a *wiring* fact, not a
|
|
711
730
|
running one. See `docs/gateway-fleet.md#proxy-lobes-the-third-lobe-state-opt-in`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: lobes-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.69.2
|
|
4
4
|
Summary: lobes — run, assess, and switch the local vLLM model.
|
|
5
5
|
Project-URL: Homepage, https://github.com/agentculture/lobes-cli
|
|
6
6
|
Project-URL: Issues, https://github.com/agentculture/lobes-cli/issues
|
|
@@ -661,19 +661,51 @@ carries `hosted_by` at most, never `proxied`).
|
|
|
661
661
|
touching the rest of the fleet:
|
|
662
662
|
|
|
663
663
|
```bash
|
|
664
|
-
lobes up cortex --apply # docker compose up -d vllm-primary
|
|
665
|
-
lobes up senses --apply # docker compose up -d vllm-multimodal
|
|
666
|
-
lobes up muse --apply # docker compose up -d vllm-muse (muse-hosting shape only — currently no box hosts one, see the dormant callout above)
|
|
667
|
-
lobes up worker --apply # docker compose up -d vllm-worker (verb wired; live on the Spark since d1, errors helpfully off any other non-hosting box)
|
|
668
|
-
lobes up embedder --apply # docker compose up -d vllm-embed
|
|
669
|
-
lobes up reranker --apply # docker compose up -d vllm-rerank
|
|
664
|
+
lobes up cortex --apply # docker compose up -d --no-deps vllm-primary
|
|
665
|
+
lobes up senses --apply # docker compose up -d --no-deps vllm-multimodal
|
|
666
|
+
lobes up muse --apply # docker compose up -d --no-deps vllm-muse (muse-hosting shape only — currently no box hosts one, see the dormant callout above)
|
|
667
|
+
lobes up worker --apply # docker compose up -d --no-deps vllm-worker (verb wired; live on the Spark since d1, errors helpfully off any other non-hosting box)
|
|
668
|
+
lobes up embedder --apply # docker compose up -d --no-deps vllm-embed
|
|
669
|
+
lobes up reranker --apply # docker compose up -d --no-deps vllm-rerank
|
|
670
670
|
lobes up stt --apply # requires the --audio overlay
|
|
671
671
|
lobes up tts --apply # requires the --audio overlay
|
|
672
672
|
lobes up colleague-stack --apply # the SEVEN default roles at once (requires --audio scaffolded)
|
|
673
|
+
lobes up gateway --apply # the gateway ALONE (not a role — see below)
|
|
674
|
+
lobes up gateway --build --apply # ...re-imaged at the current MODEL_GEAR_VERSION
|
|
673
675
|
```
|
|
674
676
|
|
|
675
677
|
Dry-run by default (prints the exact `docker compose …` command); `--apply`
|
|
676
|
-
commits.
|
|
678
|
+
commits.
|
|
679
|
+
|
|
680
|
+
### `--no-deps` is what makes "without touching the rest of the fleet" true
|
|
681
|
+
|
|
682
|
+
**Issue #222.** `docker compose up -d <service>` **walks `depends_on`** and
|
|
683
|
+
(re)creates every dependency, so before #222 this verb's isolation promise was
|
|
684
|
+
documentation only. Hit live on a Jetson AGX Thor 2026-08-28: a gateway-only
|
|
685
|
+
rebuild recreated the resident 27B cortex (a multi-minute reload) *and* started
|
|
686
|
+
`vllm-multimodal` on a box declaring `MULTIMODAL_FEASIBLE=false` with an active
|
|
687
|
+
proxy to a peer — burning the exact GPU budget that declaration exists to
|
|
688
|
+
reclaim, in a unified-memory race against the load it was meant to leave alone.
|
|
689
|
+
|
|
690
|
+
Every `up` now carries `--no-deps`, and the base compose no longer gives the
|
|
691
|
+
gateway a `depends_on` at all (belt and braces: the flag fixes this CLI, the
|
|
692
|
+
template fixes the hand-written `docker compose` command and every
|
|
693
|
+
lock-restored box). `--down` needs no equivalent — compose `stop` never walks
|
|
694
|
+
`depends_on`, which is exactly why the asymmetry went unnoticed. The dry-run
|
|
695
|
+
PLAN is rendered from the argv that later runs, so the printed command is the
|
|
696
|
+
executed one.
|
|
697
|
+
|
|
698
|
+
### `gateway` is a target, not a role
|
|
699
|
+
|
|
700
|
+
`gateway` is deliberately **not** in `lobes.roles.ROLES`, not in the role→service
|
|
701
|
+
map, and not in the `colleague-stack` bundle — it is the stdlib reverse proxy
|
|
702
|
+
*fronting* the roles, not one of them. It is an `up` target because it is the
|
|
703
|
+
service an operator most often needs to touch alone: pure stdlib, rebuilds in
|
|
704
|
+
seconds, and it bakes `MODEL_GEAR_VERSION` into its image, while the lobes
|
|
705
|
+
behind it take minutes and hold tens of GiB. `lobes up gateway --build --apply`
|
|
706
|
+
is the "reinstall the gateway, touch nothing else" operation that had no verb
|
|
707
|
+
before #222 — which is why it was being done by hand, with the consequences
|
|
708
|
+
above. `colleague-stack` is a first-class bundle — the four default fleet
|
|
677
709
|
roles **plus** the audio overlay's `stt`/`tts` — not a compose `profiles:`
|
|
678
710
|
tag, because tagging the already-default-on services with a profile would
|
|
679
711
|
demote them out of the default fleet (a regression). If the audio overlay
|
|
@@ -277,10 +277,16 @@ half-served, never silently rerouted:
|
|
|
277
277
|
docker-compose.shape.yml`, which `lobes fleet up --apply` auto-includes
|
|
278
278
|
when present). It parks each dropped core service in the inert
|
|
279
279
|
`shape-dropped` compose profile — a profile **nothing** activates, so
|
|
280
|
-
`docker compose up` skips it
|
|
281
|
-
the compose `!reset` merge tag
|
|
282
|
-
|
|
283
|
-
|
|
280
|
+
`docker compose up` skips it. It used to *also* clear the gateway's
|
|
281
|
+
`depends_on` with the compose `!reset` merge tag, because the base template
|
|
282
|
+
listed every core lane there and a profile-disabled service left that edge
|
|
283
|
+
dangling; since **issue #222** the base template declares no gateway
|
|
284
|
+
`depends_on` at all, so the override no longer patches the gateway and no
|
|
285
|
+
longer needs Compose v2.24+. (The edge was never a correctness property —
|
|
286
|
+
the gateway routes and fails over per request — but it *was* a hazard: any
|
|
287
|
+
gateway start walked it and brought up every heavy lane, dropped or not.
|
|
288
|
+
Removing it in the base file also covers the hand-scaffolded and
|
|
289
|
+
lock-restored boxes no shape override reaches.) The resolved `-f`
|
|
284
290
|
chain comes from one builder (#137) and is printable read-only via
|
|
285
291
|
`lobes fleet files` — anything driving `docker compose` by hand (scripts,
|
|
286
292
|
operators) should consume that instead of re-deriving the file list.
|
|
@@ -128,8 +128,8 @@ actually activates a template change on a running fleet.
|
|
|
128
128
|
The gateway adds a second backend **only** when `FALLBACK_URL` or
|
|
129
129
|
`FALLBACK_SERVED_NAME` is set. To add a warm fallback: define a `vllm-fallback`
|
|
130
130
|
service in the fleet compose (mirror `vllm-primary` with the fallback's model /
|
|
131
|
-
quantization / tokenizer / tool-parser),
|
|
132
|
-
|
|
131
|
+
quantization / tokenizer / tool-parser), set `FALLBACK_URL` +
|
|
132
|
+
`FALLBACK_SERVED_NAME` on the gateway, and **drop both
|
|
133
133
|
`*_GPU_MEM_UTIL` values** so they sum well under 1.0. The archived dense Mistral
|
|
134
134
|
fallback config is in git history and
|
|
135
135
|
[`docs/mistral-small-3.2-24b-nvfp4.md`](mistral-small-3.2-24b-nvfp4.md).
|
|
@@ -512,6 +512,42 @@ The gate runs *before* the request body is read off the socket, before model
|
|
|
512
512
|
resolution, and before any upstream connection, so a rejected request costs
|
|
513
513
|
the fleet zero parsing and zero sockets.
|
|
514
514
|
|
|
515
|
+
**What the rejection LOGS (issue #228).** The response says as little as
|
|
516
|
+
possible; the log says as much as the operator needs, and the asymmetry is
|
|
517
|
+
deliberate — the caller must not learn whether its key was missing, malformed
|
|
518
|
+
or merely wrong (that would make a 401 a key-material oracle), while whoever
|
|
519
|
+
reads their own gateway's stderr needs exactly that to tell a misconfigured
|
|
520
|
+
client from someone guessing. A rejection logs:
|
|
521
|
+
|
|
522
|
+
```text
|
|
523
|
+
[gateway] auth: rejected POST /tokenize from 172.21.0.1 (no Authorization header)
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
— the method and path, the **socket peer** (never `X-Forwarded-For`: a
|
|
527
|
+
security log whose attribution field the caller can write is worse than one
|
|
528
|
+
with none), and a reason from a fixed set (`no Authorization header` /
|
|
529
|
+
`not a Bearer credential` / `empty Bearer token` /
|
|
530
|
+
`Bearer token did not match this gateway's key`). No reason string is derived
|
|
531
|
+
from the presented credential or the configured key, so the classification
|
|
532
|
+
cannot leak what it classified.
|
|
533
|
+
|
|
534
|
+
Repeats from one source **collapse to one line per 60 s**, and the next line
|
|
535
|
+
after that window carries what was suppressed:
|
|
536
|
+
|
|
537
|
+
```text
|
|
538
|
+
[gateway] auth: rejected POST /tokenize from 172.21.0.1 (no Authorization header) [+28 more from this source in the previous 123s]
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
Both the diagnostic *and* the ordinary access line are suppressed for a
|
|
542
|
+
collapsed repeat — suppressing only one would leave the flood at its original
|
|
543
|
+
size. This is sized against the measured failure: a client with no key retried
|
|
544
|
+
in bursts of ~29 every ~2 minutes, putting **1190 identical, sourceless,
|
|
545
|
+
reasonless lines** into four hours of a DGX Spark's gateway log and burying
|
|
546
|
+
everything else it had to say. Sources collapse independently, so a second
|
|
547
|
+
address appearing is never hidden by a first one that is already flooding, and
|
|
548
|
+
the tracking table is capped (least-recently-seen evicted) because its keys are
|
|
549
|
+
attacker-chosen.
|
|
550
|
+
|
|
515
551
|
**Hosting `associate` makes the key non-optional — enforced by `lobes
|
|
516
552
|
doctor`.** The bearer gate above is opt-in fleet-wide, but the `associate`
|
|
517
553
|
lane is the one role whose exposure has already gone wrong in practice. On
|
|
@@ -656,16 +692,53 @@ policy when the forward arrives. Shedding here too would gate the role a
|
|
|
656
692
|
second time, against the wrong box's load.
|
|
657
693
|
|
|
658
694
|
**`/v1/models` and `GET /capabilities` only advertise what the peer honestly
|
|
659
|
-
serves.** A background thread probes the declared peer
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
reflects the same live peer-probe verdict, never a hardcoded `true`. See
|
|
695
|
+
serves.** A background thread probes the declared peer and lists the proxied
|
|
696
|
+
id on *this* box's `/v1/models` only when the peer honestly serves it —
|
|
697
|
+
issue #92 ("advertised implies reachable") extended across a box boundary. `GET
|
|
698
|
+
/capabilities` mirrors this: a proxied role reports `"proxied": true`
|
|
699
|
+
alongside `"hosted_by": "<peer origin>"`, and its `ready` reflects the live
|
|
700
|
+
peer-probe verdict, never a hardcoded `true`. See
|
|
666
701
|
[`docs/colleague-stack.md`](colleague-stack.md#a-third-role-state-proxied)
|
|
667
702
|
for the role-contract view.
|
|
668
703
|
|
|
704
|
+
**The advert is the PEER's, not a local guess (issue #220).** That background
|
|
705
|
+
probe reads the peer's own `GET /capabilities` and relays the role entry's
|
|
706
|
+
`ready` **and** `context`. Both halves fix a measured lie. On the DGX Spark,
|
|
707
|
+
2026-08-27, `associate` advertised `ready:false, context:1048576` against an
|
|
708
|
+
Orin reporting `ready:true, context:128000` and serving the seat in 0.6 s:
|
|
709
|
+
|
|
710
|
+
- *`ready`* — the probe used to require the peer's `/v1/models` to list the
|
|
711
|
+
id this box forwards. That is unsatisfiable whenever the box forwards an
|
|
712
|
+
**alias** rather than a raw checkpoint id, which `associate` must do (see
|
|
713
|
+
below). The `/v1/models` check is **kept as a fallback** for a peer with no
|
|
714
|
+
`/capabilities` entry for the role — an older lobes gateway, or a bare vLLM
|
|
715
|
+
someone pointed a peer origin at — so no working deployment loses its
|
|
716
|
+
signal.
|
|
717
|
+
- *`context`* — a role this box does not host has no
|
|
718
|
+
`<PREFIX>_MAX_MODEL_LEN` in this box's `.env`, so the local computation fell
|
|
719
|
+
through to the **catalog's native ceiling**: the checkpoint's maximum, not
|
|
720
|
+
the window the peer chose to serve. A peer that reports no usable context
|
|
721
|
+
leaves the local answer exactly as it was.
|
|
722
|
+
|
|
723
|
+
Only a role in the peer-proxy set reads this channel; a role this box hosts
|
|
724
|
+
always computes its own context from its own `.env`.
|
|
725
|
+
|
|
726
|
+
**Address a proxied role by its ROLE NAME.** `model=<role>` — `associate`,
|
|
727
|
+
`senses`, `worker` — is the supported way to reach a proxied lane, and for
|
|
728
|
+
some lanes it is the *only* one. Two lanes can share a checkpoint (`worker`
|
|
729
|
+
and `associate` both serve
|
|
730
|
+
`nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-NVFP4`, one checkpoint with two
|
|
731
|
+
public addresses of different authority), so the **raw model id is ambiguous**:
|
|
732
|
+
it resolves to whichever backend this box wires locally, which on a box that
|
|
733
|
+
hosts `worker` and proxies `associate` is the local `worker` — the proxied
|
|
734
|
+
role then 404s `role_infeasible` for the raw id and for the other role's name,
|
|
735
|
+
while `model=associate` routes correctly. This is why such a lane declares
|
|
736
|
+
`ASSOCIATE_SERVED_NAME=associate` (forwarding the alias, not the checkpoint
|
|
737
|
+
id), and in turn why the `/v1/models` readiness check above could never
|
|
738
|
+
succeed for it. Role-name addressing is the documented contract
|
|
739
|
+
([`docs/colleague-stack.md`](colleague-stack.md)); a raw checkpoint id is a
|
|
740
|
+
convenience that only survives while it is unambiguous.
|
|
741
|
+
|
|
669
742
|
**Default off, byte-identical.** With no `<PREFIX>_PEER_PROXY` set anywhere —
|
|
670
743
|
every deployment that predates this feature, and every referral-only
|
|
671
744
|
deployment today — this branch never fires: every response stays
|
|
@@ -45,8 +45,10 @@ two-part change (see
|
|
|
45
45
|
[`docs/gateway-fleet.md` → Adding a fallback](gateway-fleet.md#adding-a-fallback)):
|
|
46
46
|
|
|
47
47
|
1. **Add a `vllm-fallback` service** to the fleet `docker-compose.yml` (mirror
|
|
48
|
-
`vllm-primary`) that serves Mistral with its own knobs
|
|
49
|
-
`gateway` service's `depends_on
|
|
48
|
+
`vllm-primary`) that serves Mistral with its own knobs. Do **not** add it to
|
|
49
|
+
the `gateway` service's `depends_on` — the gateway deliberately declares
|
|
50
|
+
none (issue #222): `docker compose up -d gateway` walks `depends_on`, so an
|
|
51
|
+
edge there turns every gateway restart into a fleet-wide one.
|
|
50
52
|
|
|
51
53
|
```yaml
|
|
52
54
|
command:
|
|
@@ -24,6 +24,15 @@ request's `model` field. Clients point at the same URL either way.
|
|
|
24
24
|
| `/capabilities` | GET | gateway | the nine-role Colleague contract (`cortex`/`senses`/`muse`/`worker`/`embedder`/`reranker`/`stt`/`tts`) resolved to live endpoint + metadata — non-OpenAI, lobes-native |
|
|
25
25
|
| `/health` | GET | gateway | liveness |
|
|
26
26
|
|
|
27
|
+
**Unlisted POST paths pass through.** The POST router is path-agnostic: it
|
|
28
|
+
resolves the model from the request body and forwards the *original* path to
|
|
29
|
+
that model's owning lane. So a vLLM-native route the table above does not
|
|
30
|
+
list — `/tokenize` is the one seen in practice — reaches the backend and works,
|
|
31
|
+
rather than 404ing. It is a passthrough, not a contract: nothing here promises
|
|
32
|
+
it, the fleet's non-vLLM lanes need not serve it, and it is subject to the same
|
|
33
|
+
inbound bearer gate as everything else (which is how issue #228's 1190
|
|
34
|
+
unauthenticated `POST /tokenize` rejections came about).
|
|
35
|
+
|
|
27
36
|
Embeddings, rerank, score, and audio (including the `/v1/realtime` WebSocket
|
|
28
37
|
session) require the **fleet overlay** — they are not available when running
|
|
29
38
|
the raw vLLM container in single-model mode. The generate endpoints
|
|
@@ -146,6 +155,31 @@ tool-parser plugin this pairs with.
|
|
|
146
155
|
`"stream": true` requests are relayed chunk-by-chunk with per-chunk flushing.
|
|
147
156
|
Normal (non-streaming) responses are buffered with `Content-Length`.
|
|
148
157
|
|
|
158
|
+
**A streamed response always ends (issue #220).** Once the relay has started,
|
|
159
|
+
exactly one of three things happens, and the client can tell them apart:
|
|
160
|
+
|
|
161
|
+
| What happened | What the client receives |
|
|
162
|
+
|---|---|
|
|
163
|
+
| the backend finished | its own bytes (ending `data: [DONE]`), then the zero-length chunk that closes chunked framing |
|
|
164
|
+
| the backend died mid-stream | an SSE **error event** (`{"error": {"type": "upstream_error", …}}`), then `data: [DONE]`, then the terminator — and the connection is closed rather than kept alive |
|
|
165
|
+
| the client hung up | nothing (there is nowhere to write); the gateway logs the upstream status and attempt chain, and stops draining the backend |
|
|
166
|
+
|
|
167
|
+
Both frames are sent on the failure path deliberately: a caller that parses
|
|
168
|
+
error events learns *why*, and a caller that only watches for the `[DONE]`
|
|
169
|
+
sentinel still terminates.
|
|
170
|
+
|
|
171
|
+
Before #220 the failure paths sent **neither** — an exception unwound out of
|
|
172
|
+
the relay having written no terminal frame at all, leaving the client blocked
|
|
173
|
+
on a still-ESTABLISHED socket with no way to distinguish a dead upstream from
|
|
174
|
+
a slow one. Measured on the DGX Spark 2026-08-27/28: 5 of 15 streamed runs sat
|
|
175
|
+
17–24 minutes against a vLLM reporting `num_requests_running 0` and a GPU at
|
|
176
|
+
3–7 %, until cut by hand. A client-side stream-lifetime timeout is still worth
|
|
177
|
+
having (it bounds far more than this one failure), but it is no longer the
|
|
178
|
+
only thing that ends a dead stream.
|
|
179
|
+
|
|
180
|
+
The error event is generated by the gateway, and is never the upstream's own
|
|
181
|
+
error payload — by the time it fires the upstream has stopped producing bytes.
|
|
182
|
+
|
|
149
183
|
### Audio fan-out
|
|
150
184
|
|
|
151
185
|
`/v1/audio/*` requests are forwarded by the gateway to the **realtime bridge**
|