{
  "_class" : "hudson.model.FreeStyleBuild",
  "actions" : [
    {
      "_class" : "hudson.model.CauseAction",
      "causes" : [
        {
          "_class" : "hudson.triggers.TimerTrigger$TimerTriggerCause",
          "shortDescription" : "Started by timer"
        }
      ]
    },
    {
      
    },
    {
      "_class" : "hudson.plugins.git.util.BuildData",
      "buildsByBranchName" : {
        "refs/remotes/origin/dev" : {
          "_class" : "hudson.plugins.git.util.Build",
          "buildNumber" : 641,
          "buildResult" : None,
          "marked" : {
            "SHA1" : "8e6de334ff1868b55765df18097a3b5d1a8581ee",
            "branch" : [
              {
                "SHA1" : "8e6de334ff1868b55765df18097a3b5d1a8581ee",
                "name" : "refs/remotes/origin/dev"
              }
            ]
          },
          "revision" : {
            "SHA1" : "8e6de334ff1868b55765df18097a3b5d1a8581ee",
            "branch" : [
              {
                "SHA1" : "8e6de334ff1868b55765df18097a3b5d1a8581ee",
                "name" : "refs/remotes/origin/dev"
              }
            ]
          }
        }
      },
      "lastBuiltRevision" : {
        "SHA1" : "8e6de334ff1868b55765df18097a3b5d1a8581ee",
        "branch" : [
          {
            "SHA1" : "8e6de334ff1868b55765df18097a3b5d1a8581ee",
            "name" : "refs/remotes/origin/dev"
          }
        ]
      },
      "remoteUrls" : [
        "https://github.com/younex1/erp-nuxt-frontend.git"
      ],
      "scmName" : ""
    },
    {
      
    },
    {
      
    },
    {
      "_class" : "org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction"
    }
  ],
  "artifacts" : [
    
  ],
  "building" : False,
  "description" : None,
  "displayName" : "#641",
  "duration" : 55017,
  "estimatedDuration" : 57393,
  "executor" : None,
  "fullDisplayName" : "build-logship-frontend #641",
  "id" : "641",
  "inProgress" : False,
  "keepLog" : False,
  "number" : 641,
  "queueId" : 5241,
  "result" : "SUCCESS",
  "timestamp" : 1781136000932,
  "url" : "https://jenkins.younex.de/job/build-logship-frontend/641/",
  "builtOn" : "",
  "changeSet" : {
    "_class" : "hudson.plugins.git.GitChangeSetList",
    "items" : [
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/generate-shipments.vue"
        ],
        "commitId" : "027ddda068804943b349120fd0573e490719ec58",
        "timestamp" : 1781076109000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "increase desktop shipment generation wrapper width\u000a",
        "date" : "2026-06-10 09:21:49 +0200",
        "id" : "027ddda068804943b349120fd0573e490719ec58",
        "msg" : "increase desktop shipment generation wrapper width",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/generate-shipments.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "android/app/build.gradle",
          "android/update-files/version.json",
          "android/app/src/main/AndroidManifest.xml",
          "capacitor.config.ts",
          "scripts/upload-mobile-update.sh",
          "android/.gitignore",
          "android/update-files/.deploy.env.example",
          "app/composables/useBarcodeScanner.js"
        ],
        "commitId" : "55462f4501d1541f21279ab0c293b906627f3f78",
        "timestamp" : 1781081372000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "add upload script for android app\u000a",
        "date" : "2026-06-10 10:49:32 +0200",
        "id" : "55462f4501d1541f21279ab0c293b906627f3f78",
        "msg" : "add upload script for android app",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "android/.gitignore"
          },
          {
            "editType" : "edit",
            "file" : "app/composables/useBarcodeScanner.js"
          },
          {
            "editType" : "edit",
            "file" : "android/app/build.gradle"
          },
          {
            "editType" : "edit",
            "file" : "android/update-files/version.json"
          },
          {
            "editType" : "add",
            "file" : "android/update-files/.deploy.env.example"
          },
          {
            "editType" : "edit",
            "file" : "android/app/src/main/AndroidManifest.xml"
          },
          {
            "editType" : "edit",
            "file" : "capacitor.config.ts"
          },
          {
            "editType" : "add",
            "file" : "scripts/upload-mobile-update.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          ".env-dev",
          "nuxt.config.ts",
          "app/pages/accounting/amazon-orders-check.vue",
          "server/api/accounting/amazon/orders-sync.post.ts",
          ".env-prod"
        ],
        "commitId" : "8b4412696fb35c3b94193818e9de2e21f6e7c21f",
        "timestamp" : 1781087960000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "change method how amazon sync to fix invoices works (adding new line instead modify existing)\u000a",
        "date" : "2026-06-10 12:39:20 +0200",
        "id" : "8b4412696fb35c3b94193818e9de2e21f6e7c21f",
        "msg" : "change method how amazon sync to fix invoices works (adding new line instead modify existing)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : ".env-dev"
          },
          {
            "editType" : "edit",
            "file" : ".env-prod"
          },
          {
            "editType" : "edit",
            "file" : "nuxt.config.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/accounting/amazon/orders-sync.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/accounting/amazon-orders-check.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/components/dashboard/PicklistGenerateModal.vue",
          "server/api/print/picklist.post.ts",
          "app/pages/index.vue",
          "app/components/dashboard/OpenShipmentsModal.vue",
          "app/composables/usePicklistPdf.ts",
          "app/composables/states.ts"
        ],
        "commitId" : "739cab2780d642dd97fc8dd8821849fca193439d",
        "timestamp" : 1781088907000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "add ordering to picklist regeneration on dashboard\u000a",
        "date" : "2026-06-10 12:55:07 +0200",
        "id" : "739cab2780d642dd97fc8dd8821849fca193439d",
        "msg" : "add ordering to picklist regeneration on dashboard",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/index.vue"
          },
          {
            "editType" : "add",
            "file" : "server/api/print/picklist.post.ts"
          },
          {
            "editType" : "add",
            "file" : "app/components/dashboard/PicklistGenerateModal.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/components/dashboard/OpenShipmentsModal.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/composables/usePicklistPdf.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/composables/states.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "server/api/accounting/ebay/orders-check.get.ts",
          "server/api/accounting/ebay/orders-sync.post.ts",
          "server/api/accounting/amazon/orders-sync.post.ts",
          "app/components/MainNavigationMenu.vue",
          "app/pages/accounting/ebay-orders-check.vue",
          "server/utils/marketplaceOrderSync.ts",
          "app/composables/menu/admin/accounting.ts",
          "server/utils/ebayOrdersApi.ts"
        ],
        "commitId" : "ab8097554e8e22722bdfb1074fa5a9f5ad538191",
        "timestamp" : 1781090532000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Add ebay invoice amount check like we have for amazon\u000a",
        "date" : "2026-06-10 13:22:12 +0200",
        "id" : "ab8097554e8e22722bdfb1074fa5a9f5ad538191",
        "msg" : "Add ebay invoice amount check like we have for amazon",
        "paths" : [
          {
            "editType" : "add",
            "file" : "server/utils/ebayOrdersApi.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/components/MainNavigationMenu.vue"
          },
          {
            "editType" : "add",
            "file" : "app/pages/accounting/ebay-orders-check.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/composables/menu/admin/accounting.ts"
          },
          {
            "editType" : "add",
            "file" : "server/utils/marketplaceOrderSync.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/accounting/ebay/orders-check.get.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/accounting/amazon/orders-sync.post.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/accounting/ebay/orders-sync.post.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          ".env-dev",
          "nuxt.config.ts",
          "server/utils/marketplaceOrderSync.ts",
          "server/api/accounting/ebay/orders-sync.post.ts",
          "server/api/accounting/amazon/orders-sync.post.ts",
          ".env-prod"
        ],
        "commitId" : "e95560cecc1aa6ed1d33aecb5fa8a230748b8754",
        "timestamp" : 1781096766000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Add ebay invoice amount check like we have for amazon\u000a",
        "date" : "2026-06-10 15:06:06 +0200",
        "id" : "e95560cecc1aa6ed1d33aecb5fa8a230748b8754",
        "msg" : "Add ebay invoice amount check like we have for amazon",
        "paths" : [
          {
            "editType" : "edit",
            "file" : ".env-dev"
          },
          {
            "editType" : "edit",
            "file" : "nuxt.config.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/accounting/amazon/orders-sync.post.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/utils/marketplaceOrderSync.ts"
          },
          {
            "editType" : "edit",
            "file" : "server/api/accounting/ebay/orders-sync.post.ts"
          },
          {
            "editType" : "edit",
            "file" : ".env-prod"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "capacitor.config.ts",
          "app/composables/useAuthSession.ts",
          "nuxt.config.ts",
          "app/router.options.ts",
          "server/api/app-auth/token-refresh.post.ts",
          "server/api/app-auth/login.post.ts",
          "app/plugins/00.capacitor-api.client.ts",
          "package.json",
          "server/middleware/00.app-auth.ts"
        ],
        "commitId" : "a56d8597a324d4f11193bd224def2d752ccfda02",
        "timestamp" : 1781101487000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "initial native step for android done\u000a",
        "date" : "2026-06-10 16:24:47 +0200",
        "id" : "a56d8597a324d4f11193bd224def2d752ccfda02",
        "msg" : "initial native step for android done",
        "paths" : [
          {
            "editType" : "add",
            "file" : "app/composables/useAuthSession.ts"
          },
          {
            "editType" : "edit",
            "file" : "capacitor.config.ts"
          },
          {
            "editType" : "edit",
            "file" : "app/router.options.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/app-auth/token-refresh.post.ts"
          },
          {
            "editType" : "add",
            "file" : "app/plugins/00.capacitor-api.client.ts"
          },
          {
            "editType" : "edit",
            "file" : "nuxt.config.ts"
          },
          {
            "editType" : "add",
            "file" : "server/api/app-auth/login.post.ts"
          },
          {
            "editType" : "add",
            "file" : "server/middleware/00.app-auth.ts"
          },
          {
            "editType" : "edit",
            "file" : "package.json"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "android/app/capacitor.build.gradle",
          "reference/recipes.md",
          "android/capacitor.settings.gradle"
        ],
        "commitId" : "3cfbf64df740073fd45c7b0224f846cf71a000cc",
        "timestamp" : 1781101738000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Wire native @capacitor/preferences + document dual build target\u000a\u000acap sync registers @capacitor/preferences for the bundled Capacitor app\u000atarget. Document the web-SSR vs bundled-app-SPA dual build in\u000areference/recipes.md (BUILD_TARGET/CAP_BUNDLED switch, the app-only fetch\u000ainterceptor + useAuthSession, the app-auth middleware/endpoints, and the\u000aops gotchas).\u000a\u000aCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\u000a",
        "date" : "2026-06-10 16:28:58 +0200",
        "id" : "3cfbf64df740073fd45c7b0224f846cf71a000cc",
        "msg" : "Wire native @capacitor/preferences + document dual build target",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "android/app/capacitor.build.gradle"
          },
          {
            "editType" : "edit",
            "file" : "android/capacitor.settings.gradle"
          },
          {
            "editType" : "edit",
            "file" : "reference/recipes.md"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "reference/app-spa-deploy.md"
        ],
        "commitId" : "c85d553185233b37c37a22f4a61c4ca1f17e6e07",
        "timestamp" : 1781102646000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Add bundled-app deploy & CORS notes (reference/app-spa-deploy.md)\u000a\u000aTailored to the current nginx: the /api Nuxt path needs NO nginx change\u000a(location / forwards OPTIONS + headers to Nitro; the app-auth middleware\u000aemits CORS + answers preflight). The one required change is Strapi's CORS\u000aallow-list (https://localhost) for /media-api uploads. Includes verify\u000acurls and the APK ship steps.\u000a\u000aCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\u000a",
        "date" : "2026-06-10 16:44:06 +0200",
        "id" : "c85d553185233b37c37a22f4a61c4ca1f17e6e07",
        "msg" : "Add bundled-app deploy & CORS notes (reference/app-spa-deploy.md)",
        "paths" : [
          {
            "editType" : "add",
            "file" : "reference/app-spa-deploy.md"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "android/update-files/version.json",
          "android/app/build.gradle"
        ],
        "commitId" : "30ae13902599097c11ea443c66363fbd7031afda",
        "timestamp" : 1781103998000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Bump app to 1.0.2 (code 3) for the bundled-SPA release\u000a\u000aFirst release of the bundled (CAP_BUNDLED) app — versionName must increase\u000aabove the deployed 1.0.1 for the in-app updater to offer it. version.json\u000aupdated to match.\u000a\u000aCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\u000a",
        "date" : "2026-06-10 17:06:38 +0200",
        "id" : "30ae13902599097c11ea443c66363fbd7031afda",
        "msg" : "Bump app to 1.0.2 (code 3) for the bundled-SPA release",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "android/update-files/version.json"
          },
          {
            "editType" : "edit",
            "file" : "android/app/build.gradle"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/composables/useAppUpdate.ts"
        ],
        "commitId" : "aa4b4ae3fb39ae37d9fd35244f02ccbf5332fc54",
        "timestamp" : 1781104498000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Fix in-app updater: offer update when installed version can't be read\u000a\u000auseAppUpdate fell into `updateAvailable = false` whenever getAppVersion()\u000areturned null (older APK without the AppUpdate plugin, or the plugin\u000arejected) — so those devices saw \"no update\" forever, contradicting the\u000acode comment's stated intent. Offer the update in that case instead, and\u000afetch the version manifest with cache: 'no-store'.\u000a\u000aCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\u000a",
        "date" : "2026-06-10 17:14:58 +0200",
        "id" : "aa4b4ae3fb39ae37d9fd35244f02ccbf5332fc54",
        "msg" : "Fix in-app updater: offer update when installed version can't be read",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/composables/useAppUpdate.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "reference/app-spa-deploy.md",
          "reference/recipes.md",
          "scripts/release-app.sh"
        ],
        "commitId" : "e8d00e506350cfcc1658e2028626e16a235ce87a",
        "timestamp" : 1781105765000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Add scripts/release-app.sh — one-command bundled-app release\u000a\u000aUnifies the release cycle into one script: bump version (build.gradle +\u000aversion.json) → npm run build:app → npm run cap:sync:app → gradle\u000aassembleDebug → stage into android/update-files/ → hand off to the existing\u000ascripts/upload-mobile-update.sh. Auto-bumps the patch (or takes an explicit\u000aversionName), with --no-upload to build/stage only. Docs updated.\u000a\u000aCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\u000a",
        "date" : "2026-06-10 17:36:05 +0200",
        "id" : "e8d00e506350cfcc1658e2028626e16a235ce87a",
        "msg" : "Add scripts/release-app.sh — one-command bundled-app release",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "reference/recipes.md"
          },
          {
            "editType" : "edit",
            "file" : "reference/app-spa-deploy.md"
          },
          {
            "editType" : "add",
            "file" : "scripts/release-app.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "android/update-files/version.json",
          "android/app/build.gradle"
        ],
        "commitId" : "c99c323c58b5098bb1cf4b758d53da61d73753c7",
        "timestamp" : 1781105930000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Add script to full build the android app\u000a",
        "date" : "2026-06-10 17:38:50 +0200",
        "id" : "c99c323c58b5098bb1cf4b758d53da61d73753c7",
        "msg" : "Add script to full build the android app",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "android/update-files/version.json"
          },
          {
            "editType" : "edit",
            "file" : "android/app/build.gradle"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/mobile/receive.vue",
          "app/app.vue",
          "app/composables/useBarcodeScanner.js",
          "app/components/MobileThemeToggle.vue",
          "app/pages/mobile/index.vue"
        ],
        "commitId" : "bb0234dfc6988e1594f91f4cc7bafb7118bb8ceb",
        "timestamp" : 1781107325000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "enhance mobile\u000a",
        "date" : "2026-06-10 18:02:05 +0200",
        "id" : "bb0234dfc6988e1594f91f4cc7bafb7118bb8ceb",
        "msg" : "enhance mobile",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/composables/useBarcodeScanner.js"
          },
          {
            "editType" : "edit",
            "file" : "app/components/MobileThemeToggle.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/receive.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/app.vue"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/mobile/index.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/signin.vue"
        ],
        "commitId" : "eb242404315fa470fe45fd44a090d13e18f926b2",
        "timestamp" : 1781107710000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Hide \"Mobile worker\" toggle in the native app (always-on there)\u000a\u000aIn the bundled Capacitor app every user is a mobile worker, so force the\u000aflag on (mobileWorker: isNativeApp) and hide the selectable chip. Web\u000asign-in is unchanged. The server enforceMobileWorkerGate stays authoritative.\u000a\u000aCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\u000a",
        "date" : "2026-06-10 18:08:30 +0200",
        "id" : "eb242404315fa470fe45fd44a090d13e18f926b2",
        "msg" : "Hide \"Mobile worker\" toggle in the native app (always-on there)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "app/pages/signin.vue"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "android/update-files/version.json",
          "android/app/build.gradle"
        ],
        "commitId" : "3c160aa33ad8e3ab999ce0100735b4b0d719709c",
        "timestamp" : 1781107776000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "enhances mobile\u000a",
        "date" : "2026-06-10 18:09:36 +0200",
        "id" : "3c160aa33ad8e3ab999ce0100735b4b0d719709c",
        "msg" : "enhances mobile",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "android/update-files/version.json"
          },
          {
            "editType" : "edit",
            "file" : "android/app/build.gradle"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "app/pages/signin.vue",
          "android/app/src/main/AndroidManifest.xml",
          "app/composables/useAuthSession.ts",
          "package.json",
          "android/app/capacitor.build.gradle",
          "android/capacitor.settings.gradle",
          "app/composables/useBiometricAuth.ts"
        ],
        "commitId" : "a2360ebe7f1f1b7a42811e74d464afe0a854d162",
        "timestamp" : 1781109514000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "Add biometric login for the native Android app (Phase 1)\u000a\u000aFingerprint/Face login via @capgo/capacitor-native-biometric. After a normal\u000apassword login the app stores a biometric-bound snapshot (refresh token +\u000acontext, never the password) in the Android Keystore (getSecureCredentials);\u000aon the next visit \"Login with fingerprint\" unlocks it, mints a fresh access\u000atoken via the existing /api/app-auth/token-refresh, and signs in — no new\u000aserver route. App-only: all logic is gated by isNativePlatform and the\u000aplugins are dynamically imported, so the web sign-in/build is unchanged\u000a(verified). Adds USE_BIOMETRIC/USE_FINGERPRINT to the manifest.\u000a\u000aCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\u000a",
        "date" : "2026-06-10 18:38:34 +0200",
        "id" : "a2360ebe7f1f1b7a42811e74d464afe0a854d162",
        "msg" : "Add biometric login for the native Android app (Phase 1)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "android/capacitor.settings.gradle"
          },
          {
            "editType" : "edit",
            "file" : "app/composables/useAuthSession.ts"
          },
          {
            "editType" : "edit",
            "file" : "package.json"
          },
          {
            "editType" : "edit",
            "file" : "app/pages/signin.vue"
          },
          {
            "editType" : "edit",
            "file" : "android/app/capacitor.build.gradle"
          },
          {
            "editType" : "edit",
            "file" : "android/app/src/main/AndroidManifest.xml"
          },
          {
            "editType" : "add",
            "file" : "app/composables/useBiometricAuth.ts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "android/update-files/version.json",
          "android/app/build.gradle"
        ],
        "commitId" : "8e6de334ff1868b55765df18097a3b5d1a8581ee",
        "timestamp" : 1781113014000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/info",
          "fullName" : "info"
        },
        "authorEmail" : "info@younex.de",
        "comment" : "add biometric\u000a",
        "date" : "2026-06-10 19:36:54 +0200",
        "id" : "8e6de334ff1868b55765df18097a3b5d1a8581ee",
        "msg" : "add biometric",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "android/update-files/version.json"
          },
          {
            "editType" : "edit",
            "file" : "android/app/build.gradle"
          }
        ]
      }
    ],
    "kind" : "git"
  },
  "culprits" : [
    {
      "absoluteUrl" : "https://jenkins.younex.de/user/info",
      "fullName" : "info"
    }
  ]
}