Releases: nolgiainc/nolgia-cli
Release list
v0.2.18
-
A job the server accepted is never lost again — and a wait timeout no
longer reads as a failure. These were the two behaviours that made a human
re-run a generation and pay for it twice (NOL-344 cost 84 credits exactly
this way).Previously, if anything went wrong after a submission had already succeeded,
the CLI printed a transport error and no job id — so the command looked
like it had failed before submitting, and re-running was the natural
response. And a408fromGET /jobs/{id}/wait, which only means the
server's long-poll window closed while the job kept running, surfaced as:Error: waiting for generation job Caused by: Unexpected Response: Response { url: "…/wait?timeout_seconds=300", status: 408, … }Nothing had failed, but the word
Error:is the strongest possible prompt to
try again.Four endings now deliver the same fact — work is live under this id, follow
it, do not re-submit:still running after 300s — job 60893909-3123-42bd-b04f-ed946b136c0f Nothing failed. The server's long-poll window closed while the job was still running — the job was not cancelled and is still being worked on. It will be billed once, whether or not you keep waiting. Re-running this command would start a second job. nolgia wait 60893909-… # keep waiting for it nolgia status 60893909-… # check it oncegennow prints the job id on stderr the moment the server accepts it,
before any waiting begins. This is the robust half: an error path can only
speak if the process lives long enough to reach it, and in the incident it
did not. The line is already in the operator's scrollback even if the CLI
is killed outright or the pipe is torn down.- Ctrl-C after submission, and any other post-submission failure, report the
job id and how to follow it instead of a bare error. - A duplicate submission — refused by the API with
409since NOL-344 — is
rendered as the job that already exists, restating the API's advice as
commands a shell can actually run (the server says "check it with
GET /jobs/{id}", which is true and unusable at a prompt). gen audiorefusals go through the RFC 7807 handler likeimageand
videoalready did; they previously surfaced as rawUnexpected Response
debug dumps.nolgia statuslikewise no longer dumps a raw response on a
404.
New exit code
75(sysexitsEX_TEMPFAIL) means "a job is live; do not
re-run" and is used for all four cases above. It replaces exit1only
there; every other failure still exits1with the sameError:text as
before. This also makes the situation machine-readable for the first time:
a408was previously indistinguishable from a genuine failure, which is
why nolgia-agent's CLI backend could not implement the "keep polling"
contract its SDK backend has always had. Under--json, stdout carries a
document (job_id,outcome,billed_twice,follow_up) while the human
block goes to stderr, so a program's stdout stays parseable. -
--idempotency-key(alsoNOLGIA_IDEMPOTENCY_KEY). The API's duplicate
guard fingerprints the request body, so a deliberate second take of an
identical prompt is refused too; the documented escape hatch is an
Idempotency-Keyheader, which the CLI previously had no way to send — the
header is accepted by the API but is not declared in the OpenAPI spec, so the
generated client emits no parameter for it. Passing a fresh key runs an
identical request again on purpose; reusing one collapses a client's own
retries into a single job.
v0.2.17
-
The model catalog no longer fails to parse because the API added a value
this CLI has never heard of. Generated response types treated every
OpenAPIenumas a closed set, so a single unrecognised value failed the
whole payload:unknown variant `3:1`, expected one of `16:9`, `9:16`, `1:1`, …models list,models get,gen video --cost-onlyand every capability
precheck fetchGET /modelsbefore doing anything else, so one unknown
aspect ratio took out jobs that never mentioned an aspect ratio — a startup
failure rather than a submission failure. This is the third occurrence of
the same shape (NOL-48, NOL-69, NOL-351); the first two were fixed by
re-vendoring the spec, which repairs only binaries built afterwards and has
never prevented the next one.Enums the client only ever receives are now generated as plain strings, so
an unknown value parses and is preserved verbatim — a ratio this build
cannot offer is still a ratio it can list. Enums the client sends are
unchanged and still validated client-side, so--aspect-ratiostill names
every accepted value on a miss.Behaviour change:
nolgia models get <id>printsmodality: videorather
thanmodality: Video, matchingmodels listand the--jsonoutput. JSON
output is otherwise unchanged — the same wire strings, at the same keys.
v0.2.16
-
--shotno longer submits a contradictoryduration_seconds, which was
400-ing every multi-shot job.duration_secondsis declareddefault: 5
in the OpenAPI spec — a description of what the server does when the field
is absent. The generated client materialized that default into a
non-Optionfield with noskip_serializing_if, so every request carried
duration_seconds: 5whether or not the caller asked for it, and the CLI had
no way to express "absent" at all. Any job whose--shotdurations summed to
something other than 5 was rejected:400 duration_seconds (5) must equal the sum of shot durations (10) — or omit itThat is every multi-shot job at the film pipeline's default 12s batch, so the
short-filmpreset — featured on the landing rail — could not run and had
never once completed.--cost-onlywas unaffected (it sums the shots
locally), which is why the defect never surfaced during estimation.The client now omits
duration_secondsentirely unless the caller passed
--duration-seconds, letting the server derive the length: the shot sum when
shots are given, its own 5s default when they are not. Passing
--duration-secondsalongside--shotis still allowed when it equals the
shot sum (the API accepts that, and the nolgia-agent film pipeline relies on
it); a value that contradicts the shots is now refused client-side, naming
both numbers, before any asset upload or API call happens (NOL-342). -
nolgia gen imagecan now request an aspect ratio.gen videohas had
--aspect-ratioall along;gen imagehad no way to ask for anything but
the model's native default, and putting "vertical 9:16" in the prompt does
not work (flux-pro returned 512x512, gpt-image-2 returned 1024x1024). The
three vertical UGC presets therefore had to generate square and crop in
ffmpeg, discarding ~44% of the frame, handing the composition to whoever
wrote the crop, and — on a 512x512 source — yielding a 288x512 image that
Kling rejects outright withImage pixel is invalid.--aspect-ratiomaps to the API'saspect_ratiofield, whose vocabulary is
ratios (9:16,16:9,1:1, …), not theimage_sizealiases
(portrait_16_9). The two are different knobs; the API prefers
aspect_ratioand validates it per-model, whileimage_sizeonly expresses
the 16:9/4:3/1:1 families.Bad values fail fast with a useful message instead of a server 400. A value
outside the enum lists every real ratio and points out the alias confusion; a
ratio the selected model does not publish is caught before the request is
sent and lists that model's actual options, taken fromimage.aspect_ratios
onGET /models— the same list the API validates against.nolgia models get <model>andmodels listnow show that list, which they previously
rendered nothing of for image models (NOL-345).
v0.2.15
-
Security:
--helpno longer prints the values of the environment
variables it reads. clap's default rendering for anenv-backed argument
shows the resolved value of the variable, so on any machine with
NOLGIA_TOKENexported,nolgia --helpprinted the token inline in its
options block (--token <TOKEN> [env: NOLGIA_TOKEN=...]). Help output is
the least-guarded text in a system — it lands in terminal scrollback, CI
logs, agent transcripts, screenshots and bug reports — so this defeated the
rest of the CLI's secret handling. Both env-backed globals (--token/
NOLGIA_TOKENand--api-url/NOLGIA_API_URL) now carry
hide_env_values: help still names the variable, so the flag stays
discoverable, but never shows what it holds (NOL-317).Two regression guards ship with the fix. A structural test walks the entire
clap command tree and fails if any env-backed argument — including ones
added in future, anywhere in the tree — is missinghide_env_values. A
black-box test renders the real binary's help with both variables set to
sentinel values and asserts neither value appears.Anyone who ran
nolgia --helpwith a real token exported on a released
build up to and including v0.2.14 should treat that token as disclosed and
rotate it. -
Housekeeping: version metadata now matches the tag. The v0.2.13 and
v0.2.14 tags were cut on trees whose manifests still read 0.2.12, so their
npm publish step failed the tag/version check and neither crates.io nor npm
ever received them; the binaries attached to those two GitHub releases also
self-report0.2.12. This release carries the correct version in every
manifest, so it is the first publish since v0.2.12 to reach crates.io and
npm — and it includes the vendored-spec work that was intended for v0.2.13
and v0.2.14 (MiniMax models, model-specific image aspect ratios, color
presets,start_frame_required).
v0.2.14
v0.2.13
v0.2.12
nolgia assets uploadnow accepts video and audio, not just images.
Previously the command only handledpng/jpeg/webpvia the base64
POST /assetspath, so an agent or preset workflow could never deliver its
final stitched master — the finished MP4 stayed pod-local while only the
component clips reached the Library (NOL-109). Video (mp4/mov/webm) and
audio (mp3/wav/ogg/m4a) now upload through the signed-upload flow
(POST /assets/uploads→ direct PUT to storage →POST /assets/uploads/{id}/complete), so the bytes stream straight to storage
without the base64 JSON size limit. Images keep their existing base64 path
unchanged; unknown extensions fail fast with the supported list.
v0.2.11
- Fix:
models list/models getagainst the live API. nolgia-api#158
added animagecapabilities field toGET /models; released CLIs rejected
the whole catalog withunknown field 'image'because their vendored spec
predated it. This release ships the current spec (including the new
image.aspect_ratioscapability surface). - Hardening: unknown response fields no longer break the CLI. The
generated client used to compileadditionalProperties: falseinto
deny_unknown_fields, so every additive API field broke released binaries.
Codegen now strips that strictness from response deserialization — future
additive fields are ignored instead of fatal. Covered by a regression test
that parses a catalog payload carrying unknown fields at every level.
v0.2.10
nolgia color-presets— the built-in color-grade preset looks for
Studio compositions.listprints the catalog (slug, name, description;
--jsonincludes the manifest version), andcube <slug> [-o FILE]
downloads a preset's 33-point.cubeLUT (stdout by default, so it pipes
straight into grading tools). Both endpoints are public — no login needed —
and unknown slugs surface the server's 404 detail verbatim.- Re-vendored the OpenAPI spec with the nolgia-api color-grade contract
(/color-presets,/color-presets/{slug}/cube,ColorPreset*schemas).