323 Commits

Author SHA1 Message Date
Calesthio
4eab34c5cf Merge pull request #466 from calesthio/codex/backlog-recovery-20260802
Recover bounded defects from the latest PR backlog
2026-08-03 14:49:08 +05:30
calesthio
9482eddeff fix: recover bounded defects from PR backlog 2026-08-03 02:14:01 -07:00
calesthio
c36e41223e Make Monty the Clapper the OpenMontage mascot
Replace the play-button logo in both READMEs with animated SVG versions of
Monty, served via <picture> + prefers-color-scheme so the mark reads on
GitHub's light and dark themes. Motion uses SMIL animateTransform rather
than CSS keyframes so it survives the <img> rendering context without
depending on transform-box: view-box.

Rebuild the 1280x640 social preview around Monty in the ink/cream/terracotta
palette, and refresh its stat row to the current counts (12 pipelines,
100+ tools, 700+ agent skills). The card's source HTML ships alongside it so
future count updates are an edit and a re-screenshot.
2026-07-24 12:25:41 -07:00
Calesthio
0af32ce5e1 Merge pull request #341 from yiyabo/feat/jimeng-video
Add Volcengine Jimeng (即梦 AI) video provider with V4 signing
2026-07-23 07:59:05 -07:00
Yiyabo
d4426f6e94 fix: declare env dependencies and map selector duration to frames
- Add env:VOLC_ACCESSKEY and env:VOLC_SECRETKEY to dependencies
- Map selector 'duration' (seconds) to Jimeng 'frames' (121/241)
- Add 4 selector duration mapping regression tests
- 59 tests pass

Fixes calesthio's third review feedback on PR #341.
2026-07-23 01:33:36 +08:00
calesthio
e0bfcb44a6 Update README capability counts 2026-07-22 07:16:53 -07:00
Calesthio
888fe5a73c Merge pull request #337 from 0xDevNinja/fix/green-screen-chromakey-1x1-collapse
fix(green_screen): scale chromakey background to frame size, not 1x1
2026-07-21 14:57:37 -07:00
Calesthio
c934116c0a Merge pull request #413 from albatrossflyon-coder/fix/skill-template-os-command-injection
fix: sanitize os.system() shell injection in manimgl scene templates
2026-07-21 14:55:43 -07:00
Chris Brown
85a63471a2 fix: sanitize os.system() shell injection in manimgl scene templates
os.system(f"manimgl {__file__} ClassName") interpolates the script's own
path into a shell string. These templates are meant to be copied and
renamed per-scene by an agent, so a scene/folder name containing shell
metacharacters is a real injection path, not just malformed input.

Switched to subprocess.run() with an argument list (no shell=True), so
there's nothing left for a shell to interpret regardless of what the
path contains. Same fix applied in both duplicate locations
(.claude/skills and .agents/skills) since the files are identical.

Reviewed scripts/lib/tts.mjs's child_process usage as part of the same
report -- not included in this PR, it already passes args as a real
array with no shell:true anywhere in the call chain, so it isn't
actually exploitable.
2026-07-21 11:26:42 -05:00
calesthio
db91727598 Add website link to README
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 15:06:44 -07:00
Calesthio
80e045a1e7 Merge pull request #404 from calesthio/codex/remove-cla
Remove the CLA contribution gate
2026-07-19 09:24:36 -07:00
calesthio
8190911ca8 chore: remove CLA contribution gate 2026-07-19 09:16:31 -07:00
Yiyabo
53773cd5fc fix: tighten input_schema per Volcengine Jimeng 3.0 Pro contract
- frames: enum [121, 241] (was minimum 1)
- prompt: maxLength 800 (was 2000)
- seed: minimum -1 (was unbounded)
- Add 9 schema validation rejection tests
- Add authoritative API reference link to PROVIDERS.md
- Document CVSync2Async* route choice and schema constraints

Fixes calesthio's second review feedback on PR #341.
2026-07-19 21:47:06 +08:00
calesthio
c2045ad5f0 Merge Lyria music generation skill 2026-07-18 17:01:58 -07:00
Calesthio
6493ca6ed3 Merge pull request #401 from calesthio/cla-setup
Add Contributor License Agreement and CLA signature gate
2026-07-18 16:48:15 -07:00
calesthio
0ff7bb30e3 feat(music): add Google Lyria generation skill 2026-07-18 16:47:35 -07:00
calesthio
9f8f99e97e Add Contributor License Agreement and CLA signature gate
Introduces CLA.md (individual CLA: contributors keep all rights to their
work, grant the project the right to offer contributions under additional
license terms; includes a written commitment in section 6 that the engine
remains open source) and a CLA Assistant Lite workflow that gates every PR
on a one-comment signature, with signatures stored in-repo on the
cla-signatures branch.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 16:44:11 -07:00
calesthio
af87fc1337 fix(backlot): surface approval artifacts before gates 2026-07-18 01:33:12 -07:00
calesthio
5072b4647c docs: update Bloome sponsor links 2026-07-17 23:10:34 -07:00
Calesthio
33c7000e68 Merge pull request #374 from ShiroKSH/fix/hyperframes-relative-output-path
fix: resolve relative HyperFrames output paths
2026-07-17 18:53:52 -07:00
Calesthio
2a6bf1e039 Merge pull request #391 from tianrking/agent/fix-delayed-audio-fades
fix(audio): schedule delayed track fades correctly
2026-07-17 18:51:56 -07:00
Calesthio
9f94c1fe0e Merge pull request #389 from 0xDevNinja/fix/imagen-multi-image-drop
fix(google_imagen): write every generated image, not just the first
2026-07-17 18:50:08 -07:00
Calesthio
39e46d78fe Merge pull request #393 from 0xDevNinja/fix/corpus-diversify-scale
fix(corpus): normalize diversify() position term so similarity can compete
2026-07-17 18:48:13 -07:00
0xDevNinja
7ad68f28ec fix(corpus): normalize diversify() position term so similarity can compete
The greedy score mixed incommensurate scales: cosine similarity bounded
to [-1, 1] against an absolute list index that grows with the pool. For
a candidate j positions later to be preferred at the default
diversity=0.5, its similarity advantage had to exceed j -- impossible for
the non-negative cosines real footage embeddings produce. diversify()
therefore returned the input order verbatim, placing exact-duplicate
clips in adjacent edit slots, the one thing its docstring promises to
prevent. The threshold where the knob started working also depended on
pool size (0.66 at 4 candidates, 0.95 at 11).

Normalize the position term to [0, 1] so both terms share a scale. The
documented endpoints hold exactly as before: diversity=0 returns input
order, diversity=1 picks the most mutually dissimilar. Enumerating the
position also drops the O(n^2) remaining.index() lookup per candidate.

Closes #392
2026-07-16 18:44:14 +05:30
tianrking
5e21f1b78a fix(audio): schedule delayed track fades correctly 2026-07-16 13:33:17 +08:00
0xDevNinja
011a27df6a fix(google_imagen): write every generated image, not just the first
execute() sends sampleCount=number_of_images and estimate_cost() bills
0.04 * n, but result handling decoded only predictions[0] and wrote it to
a single output_path. Images 2..n were dropped: never decoded, never
written, absent from artifacts. The user paid for n and received one.

The result also misreported the drop rather than failing loudly --
images_generated returned len(predictions) (what the API sent) while
artifacts held a single path, so an agent picking between variants read a
count that did not match the artifact list.

Add _output_paths() and loop over every prediction, mirroring the pattern
already used by openai_image and grok_image: suffix multi-image paths
_1/_2/... so none overwrite each other, keep the exact requested path when
n=1, return all paths in artifacts, and report images_generated as the
count actually written.

Closes #388
2026-07-15 16:30:57 +05:30
0xDevNinja
fa756fbec5 fix(green_screen): make chromakey compositing portable across FFmpeg builds
The CI Linux FFmpeg build carried the keyed frame forward without an alpha
plane, so overlay drew opaque green over the background (corner stayed green)
instead of compositing — the E2E test failed there even though it passed on
macOS/Windows.

Force `format=yuva420p` immediately after chromakey so the keyed transparency
always has an explicit alpha plane, and size the background to the frame up
front (color=...:size=WxH, passing the probed width/height into
_process_chromakey) instead of scaling a 1x1 source with scale2ref — dropping
scale2ref also removes the format negotiation that discarded the alpha on some
builds. Output is flattened to yuv420p after the overlay.
2026-07-14 14:27:40 +05:30
ShiroKSH
24617af460 fix: resolve relative HyperFrames output paths 2026-07-13 21:33:11 +03:00
Yiyabo
8414c485ad fix: restore requests module after test_lazy_imports_requests
Use monkeypatch.delitem instead of manual del sys.modules['requests']
so pytest automatically restores the module after the test. This
prevents 12 downstream Google auth/music/Veo tests from failing with
AttributeError: module 'requests' has no attribute 'exceptions'.

Fixes calesthio's review feedback on PR #341.
2026-07-13 12:55:27 +08:00
Calesthio
f8d94632ea Merge pull request #354 from amartya-dev/feat/azure-speech-to-text
feat(stt): add Azure AI Speech as an optional cloud speech-to-text provider
2026-07-12 10:48:36 -07:00
Calesthio
94f382a1b4 Merge pull request #363 from prasanthsasikumar/upstream/fix-file-uri-slashes
fix(remotion): correct file:// URI slash count for POSIX absolute paths
2026-07-12 10:46:05 -07:00
Calesthio
318e0843ee Merge pull request #325 from 0xDevNinja/fix/subtitle-ts-overflow-and-checkpoint-keyerror
fix: subtitle timestamp ms overflow; checkpoint KeyError on manifest-only stages
2026-07-12 10:45:47 -07:00
Calesthio
df3801a6b9 Merge pull request #323 from xucailiang/codex/kling-official-phase-1
Add official Kling API providers
2026-07-12 10:45:02 -07:00
Prasanth Sasikumar
9c9b1beeb5 fix(remotion): correct file:// slash count for POSIX absolute paths
resolveAsset() built `file:///` + a POSIX absolute path (which already
starts with /), yielding `file:////Users/...` (four slashes). Split the
branch: POSIX paths get `file://` + path (three slashes total), Windows
drive paths keep the explicit extra slash. Same fix across the five
compositions that share resolveAsset().

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
(cherry picked from commit 226a52d1e9b56b9da8b94e8e95ef6b753666abb0)
2026-07-11 22:33:05 -04:00
calesthio
f633b5f428 Improve Backlot light theme 2026-07-10 23:39:33 -07:00
calesthio
6aa15f6504 docs: add sponsor section 2026-07-10 21:59:33 -07:00
amartya-dev
a2a0d8c8af feat(stt): add Azure AI Speech as an optional cloud speech-to-text provider
Add an Azure AI Speech transcription tool. It is opt-in: when
AZURE_SPEECH_KEY is configured the agent may prefer it for cloud STT,
while the local faster-whisper `transcriber` stays the default offline
path. Shared pipeline manifests are intentionally left unchanged, so no
default provider selection is altered for existing users.

- tools/analysis/azure_stt.py: new `azure_stt` tool (capability=analysis,
  provider=azure) calling the Fast Transcription REST API. The local file
  is uploaded via multipart and transcribed synchronously with word-level
  timestamps and optional diarization — no Blob storage or async polling.
  Output schema mirrors `transcriber` exactly, so it is a drop-in for
  `subtitle_gen` and other transcript consumers. Follows the existing
  provider-tool conventions (env-var status check, `_transcribe` helper,
  cost_usd/model on the result, fallback="transcriber").
- Auto-discovered by the registry; no registry or selector changes.
- tests/tools/test_azure_stt.py: contract, discovery, status, response
  mapping, execute guardrails, and a mocked-network success path (no live
  API calls).
- .agents/skills + .claude/skills: azure-speech-to-text Layer-3 skill.
- docs/PROVIDERS.md: Azure AI Speech setup, API notes, and pricing.
- .env.example, skills/INDEX.md, AGENT_GUIDE.md: document the optional
  cloud STT path alongside the default whisper transcriber.
2026-07-10 23:30:19 +05:30
xucailiang
6b9ba782d8 fix: complete Kling idempotency inputs
Include every request field that can alter Kling video, image, avatar, or lip-sync media in the public idempotency contract. Add a shared regression matrix that detects future cache-key collisions while excluding transport-only controls.
2026-07-10 21:24:11 +08:00
xucailiang
b9b9b82b64 fix: harden Kling integration verification
Isolate Kling contract tests from the singleton registry so discovery state cannot leak into later selector tests. Align lip-sync face, audio, and timing payloads with the current official API and extend the live smoke coverage.
2026-07-10 20:53:45 +08:00
Yiyabo
2ad71dd591 fix: use minimax_video (not minimax_tokenplan_video) in fallback_tools
minimax_tokenplan_video does not exist in main branch (added in PR #297,
not yet merged). Use minimax_video which is the existing tool.

Fixes Copilot review comments on fallback_tools reference and
contract test assertion.
2026-07-10 18:54:25 +08:00
xucailiang
2b6d717f00 Merge remote-tracking branch 'origin/main' into codex/kling-official-phase-1
# Conflicts:
#	.agents/skills/ai-video-gen/SKILL.md
#	.env.example
#	docs/PROVIDERS.md
2026-07-10 14:02:30 +08:00
Yiyabo
e06f56d26a jimeng: add Volcengine Jimeng (即梦 AI) video provider with V4 signing
Implements the Jimeng/Volcengine part of issue #249, as agreed with
@xucailiang (who is handling the Kling provider separately).

Adds a first-class Jimeng video provider that calls the Volcengine
visual API directly (visual.volcengineapi.com) using HMAC-SHA256 V4
request signing with IAM AK/SK credentials. This is the first provider
in OpenMontage to use V4 signing (all others use Bearer token auth).

API flow: POST CVSync2AsyncSubmitTask -> poll CVSync2AsyncGetResult ->
download video_url.

Features:
- Text-to-video and image-to-video (Jimeng 3.0 Pro)
- Configurable frame count (121=5s, 241=10s at 24fps)
- Aspect ratio selection (16:9, 9:16, 1:1, etc.)
- Seed for reproducibility
- Full V4 HMAC-SHA256 request signing (not Bearer token)
- Error handling with Jimeng code 10000 success convention
- API key redaction in error messages (both env vars, no empty-string bug)

Env vars: VOLC_ACCESSKEY + VOLC_SECRETKEY (IAM AK/SK pair).
Idempotency keys include all output-affecting fields.

Files:
- tools/video/jimeng_video.py — new tool (V4 signing + submit/poll/download)
- tests/contracts/test_jimeng_video.py — 46 contract tests (no AK/SK needed)
- .env.example — VOLC_ACCESSKEY + VOLC_SECRETKEY
- docs/PROVIDERS.md — Volcengine Jimeng provider section

End-to-end tested with real Volcengine IAM credentials: generated a
1920x1088 H.264 5.04s video, ffprobe verified.

Test results:
  python -m pytest tests/contracts/test_jimeng_video.py -q  # 46 passed
2026-07-10 10:50:43 +08:00
Calesthio
2ab5773ef7 Merge pull request #270 from kweinmeister/main
feat(tools): add Google Lyria and direct Google Veo generation tools
2026-07-09 07:36:45 -07:00
calesthio
ad02ce3639 fix(ci): stabilize character HyperFrames contract test 2026-07-09 07:32:21 -07:00
calesthio
505c0faaf5 fix(ci): install Google GenAI SDK 2026-07-09 07:16:01 -07:00
Karl Weinmeister
d3d77bcc30 docs: update PROVIDERS.md with google_music and veo_video capabilities 2026-07-09 07:13:23 -07:00
Karl Weinmeister
30018a6a8f feat(tools): add Google Lyria and direct Google Veo generation tools 2026-07-09 07:11:06 -07:00
Calesthio
1a76073505 Merge pull request #333 from calesthio/feat/gemini-omni-provider
feat(video): add Gemini Omni Flash provider with conversational editing
2026-07-09 07:02:39 -07:00
0xDevNinja
df8cf21310 fix(green_screen): scale chromakey background to frame size, not 1x1
_process_chromakey built the composite background from a 1x1 lavfi color source
and tried to size it with `[0:v]scale=iw:ih`. That scale is a no-op — iw/ih are
the 1x1 source's own dimensions, and there is no cross-reference to the frame.
FFmpeg's overlay then takes the size of its first input (the 1x1 background), so
every processed frame is clipped to a single pixel. The exception fallback never
runs because the primary command exits 0 (a valid 1x1 PNG), and
_reconstruct_video upscales those 1x1 frames — producing a solid-color video
with the keyed subject entirely gone. Total data loss for method="chromakey"
(and method="auto" when it selects chromakey).

Use scale2ref to resize the background to the actual frame dimensions before
overlaying, so the keyed subject is composited at full resolution.

Verified with ffmpeg: a 320x240 green frame with a red subject now produces a
320x240 output with the subject preserved and green replaced by the background,
instead of a 1x1 (then upscaled solid-color) frame.
2026-07-09 18:15:05 +05:30
calesthio
2ef18e77a9 fix(video): normalize Gemini Omni file URIs; document provider in PROVIDERS.md
Review findings from PR #333:

P1: _download_via_uri assumed output_video.uri is always files/<id>.
The API can return a full resource URI or a ready-made
.../files/<id>:download?alt=media download URL, which produced an
invalid poll path with a second :download appended. New
_file_id_from_uri() extracts the bare id from every documented shape;
regression tests cover the full-URL form plus a parametrized matrix of
URI shapes.

P2: docs/PROVIDERS.md still described the Google key as TTS + Imagen
only. The shared-key section now covers gemini_omni_video (model id,
~$0.10/sec pricing table, paid-tier-only, edit-turn billing note), and
the env snippet, provider-to-tool mapping, and capability coverage
tables include the new provider.
2026-07-08 23:45:47 -07:00