Commit Graph
91 Commits
Author SHA1 Message Date
maziggy 60569ee879 Version bump 2026-06-27 16:53:37 +02:00
maziggy 46a3ee3235 Bumped version 2026-06-27 12:54:59 +02:00
maziggy 74f759468c Bumped version 2026-05-19 15:11:38 +02:00
maziggy 829fbc4dcf Bumped version 2026-05-16 13:09:03 +02:00
maziggy 71ac077c0c Bumped version 2026-05-11 14:52:24 +02:00
maziggy 829bc2dd6a Bumped version 2026-05-08 12:49:12 +02:00
Sn0rrii 90743cfa39 feat(encryption): MFA at-rest encryption auto-bootstrap with status UI (#1219) (#1231)
chore(i18n): extend parity gate to all locales with strict/info tiers

  Previously the script only inspected en/zh-CN/zh-TW, leaving de/fr/it/ja/pt-BR
  drift invisible. Now locales are auto-discovered from src/i18n/locales/, and a
  STRICT list (de, zh-CN, zh-TW — currently in parity) gates CI while the rest
  report informationally until their drift is caught up. ja notably has 27 real
  placeholder bugs worth fixing before promotion to strict.
2026-05-08 09:01:51 +02:00
maziggy d5280ce21f Bumped version 2026-05-05 16:38:22 +02:00
maziggy a85855f2dd fix(updates): run pip install in app_dir, not base_dir, on native installs
Native-install upgrade via the in-app Apply Update button got the new
  code in via `git reset --hard origin/main` but then logged

    ERROR: Could not open requirements file:
    [Errno 2] No such file or directory: 'requirements.txt'

  and continued. The new deps never installed, leaving the user with
  new code but stale dependencies — surfaces as cryptic import errors
  on the next restart.

  Root cause: `pip install -r requirements.txt` ran with
  `cwd=settings.base_dir`. On a native install, systemd sets
  DATA_DIR=$INSTALL_PATH/data so base_dir resolves to the data dir
  (e.g. /opt/bambuddy/data), not the source tree. Pip doesn't walk up
  looking for the requirements file the way git walks up looking for
  .git, so it fails. Same bug affected the optional npm step
  (`frontend_dir = base_dir / "frontend"` doesn't exist).

  Fix: introduce `settings.app_dir` pointing at the source-tree root
  (distinct from `base_dir` only on native installs) and run pip +
  npm with `cwd=settings.app_dir`. Git ops keep using `base_dir`
  because they already work (git walks up).

  Docker users were unaffected — Docker doesn't use the in-app updater
  (image pull replaces it).

  Regression test in test_updates_api.py mocks every subprocess in
  _perform_update, captures their cwd, and asserts the pip step runs
  in app_dir and that requirements.txt actually exists there. Any
  future refactor that re-introduces cwd=base_dir for the pip step
  fails CI before another user trips over it.
2026-04-29 11:39:17 +02:00
maziggy eec9ef4a41 Bumped version 2026-04-29 11:28:34 +02:00
maziggy 6deaa513af ● feat(slicer): server-side slicing via OrcaSlicer / Bambu Studio sidecar
Adds an optional slicer-api/ Compose stack and wires Bambuddy's File
  Manager, Archives, and MakerWorld pages to a new server-side Slice flow.
  Slicing runs as an in-memory background job (POST returns 202 + job_id,
  polled via GET /api/v1/slice-jobs/{id}) so a multi-minute slice no
  longer pins the modal; result lands as a new .gcode.3mf in the same
  folder (or new archive for archive sources) with the embedded
  thumbnail extracted.

  Backend
  - New services: slice_dispatch (in-memory dispatcher, 30min retention
    sweep) and slicer_api (HTTP bridge with 4xx/5xx/connection error
    split that drives the 3MF embedded-settings fallback retry path).
  - New schemas: SliceRequest, SliceResponse, SliceArchiveResponse,
    SliceJobEnqueueResponse.
  - New routes: POST /library/files/{id}/slice,
    POST /archives/{id}/slice, GET /api/v1/slice-jobs/{id} (gated on
    LIBRARY_READ since job IDs are sequential and the body leaks source
    filenames and result IDs).
  - AppSettings + env defaults: use_slicer_api, orcaslicer_api_url,
    bambu_studio_api_url. DB-stored values override env defaults.

  Frontend
  - New SliceModal handles preset gating; enqueues then closes
    immediately.
  - New SliceJobTrackerProvider polls active jobs at app level, surfaces
    a single toast per job (queued -> running -> completed / failed)
    and invalidates library/archives queries on terminal status.
  - Settings -> Workflow -> Slicer card: preferred slicer dropdown,
    Use Slicer API toggle, contextual sidecar URL field.
  - File Manager / Archives / MakerWorld get a Slice button gated on
    the Use Slicer API setting.
  - gcode-viewer adapter learns ?library_file=<id> so sliced library
    files preview inline.

  i18n
  - New slice.* and settings.{useSlicerApi,slicerCard,orcaslicerApiUrl,
    bambuStudioApiUrl,slicerApiUrlDescription,useSlicerApiDescription}
    + fileManager.noPermissionSlice keys across all 8 locales (en, de,
    fr, it, ja, pt-BR, zh-CN, zh-TW). English fully translated, German
    fully translated, the other six seeded with English fallbacks
    pending native translation.

  Tests
  - 10 backend integration tests in test_library_slice_api.py covering
    validation (404/400), happy-path enqueue, sidecar-down, 3MF
    embedded-settings fallback, STL no-fallback, and preset-error ->
    failed job paths.
  - New unit tests in test_slicer_api.py for the HTTP bridge.
  - 5 new SliceModal frontend tests covering preset gating, library +
    archive enqueue paths, error surface, and preset-load failure.
  - Existing SettingsPage tests adjusted: slicer dropdown asserts now
    switch to the Workflow tab first; added a beforeEach URL reset so
    one test's tab click doesn't bleed into sibling tests.

  Sidecar
  - New slicer-api/ folder is self-contained and optional. Two services
    (orca-slicer-api on 3003, bambu-studio-api on 3001 behind --profile
    bambu) build via Docker git-build-context from
    maziggy/orca-slicer-api@bambuddy/profile-resolver. The fork patches
    the OrcaSlicer CLI's profile compatibility quirks (inherits-chain
    resolver, from:User -> system rewrite, '# ' clone-prefix strip,
    sentinel-value strip) empirically required to slice real GUI
    exports without segfaulting the CLI.

  Docs
  - CHANGELOG entry under [0.2.4b1] - Unreleased Added.
  - README File Manager bullet for the new server-side Slice button.
  - bambuddy-website features.html: new card under "Configurable Slicer".
  - bambuddy-wiki: new page features/slicer-api.md + nav entry +
    features index card.

  Notes
  - Opt-in: with Use Slicer API off, the existing "open in desktop
    slicer via URI" flow is the default and unchanged.
  - 3MF inputs that segfault the CLI on --load-settings transparently
    retry with embedded settings; the resulting job carries
    used_embedded_settings: true.
  - Sliced files always export as .gcode.3mf so File Manager picks up
    the embedded thumbnail; file_type is set to "gcode" (blue badge).
2026-04-27 15:28:37 +02:00
maziggy d17c87c982 Bumped version 2026-04-19 10:07:44 +02:00
maziggy 946ebb6307 Bumped version 2026-04-19 08:28:25 +02:00
maziggy b37d8d6a9d Bumped version 2026-04-12 14:57:15 +02:00
maziggy 100610a1ef Bumped version 2026-04-08 13:17:25 +02:00
maziggy 610431d6b7 Add optional PostgreSQL database support
Bambuddy can now use an external PostgreSQL database via the
  DATABASE_URL environment variable. SQLite remains the default.
  Dialect-aware helpers handle upserts, PRAGMAs, FTS (FTS5 vs
  tsvector+GIN), backup/restore, and health checks. All migration
  blocks use savepoints to prevent Postgres transaction poisoning.
  Backups are always portable SQLite format regardless of backend.
  Cross-database restore imports SQLite backups into PostgreSQL
  with automatic boolean/datetime conversion, NOT NULL default
  filling, and FK constraint handling.
2026-04-03 11:33:29 +02:00
maziggy 7b91cde6db Fixed typo in version 2026-03-23 16:14:44 +01:00
maziggy c42d834219 Revert "version test"
This reverts commit cf8f43169b.
2026-03-23 15:46:10 +01:00
maziggy cf8f43169b version test 2026-03-23 15:45:08 +01:00
maziggy 382daef6e2 Revert "version test"
This reverts commit 36494a6f6b.
2026-03-23 15:34:15 +01:00
maziggy 36494a6f6b version test 2026-03-23 15:33:10 +01:00
maziggy bc37c12f90 Disable service worker on SpoolBuddy kiosk to prevent stale frontend
The kiosk touchscreen has no way to hard-refresh, and the service worker
  served stale cached JS after updates. SpoolBuddy pages now unregister
  any existing SW and skip registration entirely. Regular desktop/mobile
  users still get the SW. Restored kiosk restart in SSH update flow since
  SW is no longer an obstacle.
2026-03-23 15:28:24 +01:00
maziggy c63c4fc39b version test 2026-03-23 15:21:39 +01:00
maziggy 0e44e149bd ● Compact SpoolBuddy updates tab layout to fit without scrolling
Merged version, status, and update check into a single card. Buttons
  are side by side when up to date. Reduced padding and font sizes.
  Removed separate "complete" banner since status is now cleared on
  re-registration. SSH Setup section is smaller and more compact.
2026-03-23 14:36:58 +01:00
maziggy b83a99ebab ● Fix SpoolBuddy update status stuck after restart
The SSH update set status to "complete" after the daemon had already
  restarted and re-registered, overwriting the cleared state so it stuck
  forever. Removed the post-restart "complete" write — daemon
  re-registration is now the completion signal, clearing any update status.
2026-03-23 14:26:50 +01:00
maziggy e5868b5a71 Set version 2026-03-22 14:49:11 +01:00
maziggy 988429b6e6 Set version 2026-03-22 13:29:50 +01:00
maziggy 63a905daf2 Bumped version 2026-03-16 12:46:25 +01:00
maziggy 4db87505c7 Housekeeping 2026-03-13 14:35:25 +01:00
maziggy fea6350462 Housekeeping 2026-03-12 10:50:18 +01:00
maziggy 42eab0354d Bumped version 2026-03-11 13:26:16 +01:00
maziggy 7eb82f58fa Updated CHANGELOG 2026-03-11 10:13:35 +01:00
maziggy f28421d1ae Add Home Assistant as notification provider (#656)
Sends persistent notifications to the HA dashboard using the existing
  HA connection from Settings. Zero config — just select "Home Assistant"
  as provider type. Users can forward notifications to mobile via HA
  automations.
2026-03-10 10:10:14 +01:00
maziggy 688804ac07 Housekeeping 2026-03-10 08:38:29 +01:00
maziggy f1d5ee422c Bumped version 2026-03-07 11:11:16 +01:00
maziggy 538fe4b13b Bumped version 2026-03-06 15:51:49 +01:00
maziggy dba43530cb Bumped version 2026-03-04 15:12:22 +01:00
maziggy 058f74a7da Add in-app bug reporting with relay, debug log collection, and privacy controls
Floating bug report button submits issues via bambuddy.cool relay (no GitHub
  token needed locally). Collects 30s debug logs with printer push_all, sanitizes
  all sensitive data, uploads logs as files to GitHub. Screenshot upload/paste/drag
  with JPEG compression. Translated into all 7 languages. Includes 21 tests.
2026-03-04 13:33:19 +01:00
maziggy f46c134253 Bumped version 2026-02-27 13:30:38 +01:00
maziggy c2b7b6a99a Fix inconsistent print cost calculation on reprints (#505)
Three independent code paths wrote to archive.cost with conflicting
strategies, causing the same model to produce different prices on each
reprint (e.g. £0.77, £1.54, £2.03).

- Remove add_reprint_cost (Path 3) — redundant cost accumulation that
  double-counted on top of usage tracker
- Fix usage tracker (Path 2) — compute cost from current session's
  results only, not a SUM of all historical SpoolUsageHistory rows
- Remove _reprint_archives tracking set from main.py
- Update test mocks to match simplified query pattern

archive.cost now always reflects the cost of a single print.
2026-02-24 08:58:35 +01:00
maziggy bbf539d156 Bumped version 2026-02-23 14:29:16 +01:00
maziggy 2ed32ad1e1 Bumped version 2026-02-21 16:09:31 +01:00
maziggy e948d63f9c Bumped version 2026-02-19 16:33:48 +01:00
maziggy 72d4cea467 Bumped version 2026-02-19 13:59:56 +01:00
maziggy 157dca27b7 Bumped version 2026-02-17 12:38:40 +01:00
maziggy ac2aaaac20 Bumped version 2026-02-17 12:36:53 +01:00
maziggy 905e609e19 Bumped version 2026-02-10 19:13:18 +01:00
maziggy edefce67fe Bumped version 2026-02-10 18:35:24 +01:00
maziggy 1d32efa239 Bumped version 2026-02-10 17:10:34 +01:00
maziggy 600f4261fc Bumped version 2026-02-07 10:19:21 +01:00