78 Commits

Author SHA1 Message Date
sligter 564c9006ee Add Anthropic reasoning controls and completion fixes
- Pass Anthropic reasoning effort through env, settings, tests, and UI
- Allow max reasoning effort for OpenAI and Anthropic provider tests
- Open generated scripts directly and download narration without popup tabs
2026-08-02 13:54:10 +08:00
sligter a6d73b83a7 Harden AI optimize modals with safer DOM and a11y 2026-07-29 19:14:18 +08:00
sligter bf3759c72e fix(unattended): complete automated generation workflow 2026-07-28 21:08:35 +08:00
sligter d52b969323 fix: correct failure handling and validation across generation pipelines
Audit of the outline- and slide-generation paths found four systemic defects.
All are fixed here, with 244 regression tests added across 9 new test files.

Failures were being reported as successes. Every fallback path persisted
fabricated or broken content, marked the stage completed, billed the user and
returned a success message:
- Add OutlineRepairFailedError; the repair loop now raises instead of returning
  an outline that failed all 10 attempts.
- Drop the 3-page placeholder outline that replaced a failed generation.
- Track failed slides separately so they are not billed, not marked completed,
  and not skipped as "already generated" on a re-run.
- Stop decoding binary uploads as latin-1, which turned PDFs into mojibake
  outlines that were reported as successful.

Cancellation, reset and slide locks did nothing:
- Forward _is_slides_generation_cancelled through EnhancedPPTService, which has
  no __getattr__, so the stop button was a silent no-op for the whole run.
- Catch CancelledError when awaiting the cancelled lock renewer; it is a
  BaseException, so the distributed lock was never released.
- Add clear_project_outline/clear_project_slides; save_project_outline(None)
  and save_project_slides("", []) were both no-ops, so stage reset kept the
  old data and replayed it as a fresh result.
- Persist slide locks in slide_metadata and honour them in batch regeneration.

HTML validation was inverted. libxml2 only knows HTML 4.0, so strict parsing
rejected <header>/<section>/<svg> while accepting truncated documents:
- Add html_structure.py, an HTML5-aware structural check built on html.parser.
- Re-validate after auto-repair rather than treating "the string changed" as
  success, which made the retry budget unreachable.
- Prefer the last complete document when extracting HTML, so repair responses
  that echo the original no longer return the unrepaired input.

The streaming think-tag filter lost or leaked content when a marker was split
across chunks; rewrite it to buffer partial markers.

Also fixed:
- Confine client-supplied file paths to the upload roots (arbitrary file read).
- Escape model-generated content before it reaches innerHTML (stored XSS).
- Enforce ownership on the slide cancel endpoints and validate stage status.
- Give the fixed page-count mode a real branch; it behaved as ai_decide and
  overwrote the user's setting.
- Stop citation markers such as "[1]" from hijacking outline JSON extraction.
- Bill only slides that were actually persisted, and price the streaming and
  non-streaming outline routes identically.
- Cancel orphaned generation tasks when an SSE client disconnects.
- Release stale "running" tasks found in the database, not just in Valkey.
- Replace a 3s unconditional poll (which updated absent DOM nodes) with a
  stoppable 15s poll, and add an AbortController to prevent concurrent streams.
- Implement restore_project_version, which raised AttributeError on every call.
- Declare lxml, which was imported directly but only present transitively.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-26 23:01:15 +08:00
sligter 25b321b2e7 Refactor code structure for improved readability and maintainability 2026-07-26 16:15:22 +08:00
sligter 39078694aa feat(deploy): enable zero-downtime web rollouts 2026-07-10 17:38:36 -07:00
sligter e15eaf7b6c fix(helm): initialize persistent volume permissions 2026-07-10 17:26:51 -07:00
sligter 04a69fadd3 fix(docker): avoid access probe collisions 2026-07-10 20:39:33 +08:00
sligter 597c615a5b fix(docker): publish migration markers safely 2026-07-10 20:29:09 +08:00
sligter 4de9b1633c test(security): exercise permission marker behavior 2026-07-10 20:03:44 +08:00
sligter ef34ce3348 fix(helm): enforce non-root LandPPT workloads 2026-07-10 19:58:34 +08:00
sligter f6872b6afa fix(docker): harden permission migration 2026-07-10 19:49:56 +08:00
sligter d79de891b8 fix(docker): migrate volumes before non-root startup 2026-07-10 16:15:31 +08:00
sligter 431b50d615 fix(docker): run LandPPT as non-root 2026-07-10 16:05:33 +08:00
sligter 0e14c2d0ac fix(web): sync PPTX export loader version 2026-07-09 21:08:08 +08:00
sligter cd540522f1 fix: restore artifact task listing after pull 2026-07-09 20:37:02 +08:00
sligter df62205cc2 fix(slide-agent): raise loop cap and harden fallback 2026-07-07 21:39:18 +08:00
sligter dc9bc5e11f fix(slide-agent): preserve tool loop observations 2026-07-07 20:51:46 +08:00
sligter cab862e5a6 merge: feat cloud native foundation
# Conflicts:
#	src/landppt/web/templates/pages/project/project_slides_editor.html
2026-07-07 19:32:14 +08:00
sligter 7d473d3a05 feat(slide-agent): support native tool calls 2026-07-07 19:29:17 +08:00
sligter 6f76743b0e fix(projects): remove export records before deletion 2026-07-07 16:31:25 +08:00
sligter 5bc8f13fdf fix(web): bust editor export script cache 2026-07-07 15:58:56 +08:00
sligter 7a591b6bad fix(web): track queued export tasks in editor 2026-07-07 15:34:04 +08:00
sligter adc4c39916 fix(tasks): keep worker alive on queue poll timeout 2026-07-07 14:51:40 +08:00
sligter 5f465eff22 fix(config): preserve orchestrator environment values 2026-07-07 14:40:48 +08:00
sligter 84a1add0b9 Merge pull request #122 from Alixy-ai/master
feat(export): add hybrid raster mode to dom-to-pptx
2026-07-07 13:11:51 +08:00
Alixy-ai 967b3cfb8c feat(export): add hybrid raster mode to dom-to-pptx
Subtrees using CSS features OOXML cannot express (conic gradients,
multi-layer shadows, clipped badges) are now rasterized as PNG
decoration layers while their text stays native editable runs.

Bumps dom-to-pptx bundle version to 20260707-hybrid-raster-v1 across
editor/template helpers, the slides editor template, and smoke tests.
Adds hybrid raster smoke test and fixture.
2026-07-07 13:06:11 +08:00
sligter c5d2c8593b feat(tasks): persist background task state 2026-07-06 22:20:59 +08:00
sligter ec47641d59 feat(tasks): queue narration export workers 2026-07-06 22:03:41 +08:00
sligter 6094fc21d7 feat(web): disable temp static exposure for helm 2026-07-06 21:32:42 +08:00
sligter 2eba2df241 feat(observability): add prometheus metrics endpoint 2026-07-06 21:17:50 +08:00
sligter 531aee905f feat(tasks): add queued export worker 2026-07-06 21:10:05 +08:00
sligter e52fa17f81 feat(storage): add minio artifact storage 2026-07-06 20:47:16 +08:00
sligter 24a978622d feat(deploy): add migration cli and helm job 2026-07-06 20:08:45 +08:00
sligter e10b4f0aed fix(export): improve HTML projector keyboard navigation 2026-07-06 17:40:31 +08:00
sligter 82c5ea7350 fix(editor): bridge slideshow wheel events 2026-07-06 16:07:42 +08:00
sligter e051138cca fix(editor): preserve slide edit agent chat history 2026-07-06 15:57:33 +08:00
sligter ddd82c800a fix(export): preserve interactive HTML slides 2026-07-06 15:21:22 +08:00
sligter c58613ead0 fix(editor): harden slide edit html validation 2026-07-06 09:00:12 +08:00
sligter 564f87ff72 fix(editor): validate slide edit agent apply input 2026-07-05 22:07:52 +08:00
sligter e45b87b4cd fix(editor): harden slide edit agent routes 2026-07-05 21:51:08 +08:00
sligter afcc09ce0c feat(editor): add slide edit agent routes 2026-07-05 21:36:19 +08:00
sligter b82b45da3b fix(editor): harden slide edit agent loop 2026-07-05 21:10:08 +08:00
sligter 7202a82481 feat(editor): add slide edit agent loop 2026-07-05 20:53:00 +08:00
sligter 1252d2f555 fix(editor): require explicit insert targets 2026-07-05 20:36:11 +08:00
sligter f94bac03bd fix(editor): require explicit draft tool targets 2026-07-05 20:24:24 +08:00
sligter e7659d7d08 fix(editor): harden slide edit draft tools 2026-07-05 20:13:22 +08:00
sligter 0f4176c7f4 feat(editor): add slide edit draft tools 2026-07-05 19:58:31 +08:00
sligter 2eb2a9758c fix(editor): reject encoded javascript urls in slide validation 2026-07-05 19:46:23 +08:00
sligter 2152d49442 feat(editor): add slide edit agent primitives 2026-07-05 19:36:00 +08:00