<freeStyleBuild _class='hudson.model.FreeStyleBuild'><action _class='hudson.model.CauseAction'><cause _class='hudson.triggers.TimerTrigger$TimerTriggerCause'><shortDescription>Started by timer</shortDescription></cause></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesorigindev _class='hudson.plugins.git.util.Build'><buildNumber>777</buildNumber><marked><SHA1>378885a48e4f902910fad004ab676b75d48e3466</SHA1><branch><SHA1>378885a48e4f902910fad004ab676b75d48e3466</SHA1><name>refs/remotes/origin/dev</name></branch></marked><revision><SHA1>378885a48e4f902910fad004ab676b75d48e3466</SHA1><branch><SHA1>378885a48e4f902910fad004ab676b75d48e3466</SHA1><name>refs/remotes/origin/dev</name></branch></revision></refsremotesorigindev></buildsByBranchName><lastBuiltRevision><SHA1>378885a48e4f902910fad004ab676b75d48e3466</SHA1><branch><SHA1>378885a48e4f902910fad004ab676b75d48e3466</SHA1><name>refs/remotes/origin/dev</name></branch></lastBuiltRevision><remoteUrl>https://github.com/younex1/erp-nuxt-frontend.git</remoteUrl><scmName></scmName></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'><artifactsUrl>https://jenkins.younex.de/job/build-logship-frontend/777/artifact</artifactsUrl><changesUrl>https://jenkins.younex.de/job/build-logship-frontend/changes</changesUrl><displayUrl>https://jenkins.younex.de/job/build-logship-frontend/777/</displayUrl><testsUrl>https://jenkins.younex.de/job/build-logship-frontend/777/testReport</testsUrl></action><building>false</building><displayName>#777</displayName><duration>62661</duration><estimatedDuration>60620</estimatedDuration><fullDisplayName>build-logship-frontend #777</fullDisplayName><id>777</id><inProgress>false</inProgress><keepLog>false</keepLog><number>777</number><queueId>5873</queueId><result>SUCCESS</result><timestamp>1792886460764</timestamp><url>https://jenkins.younex.de/job/build-logship-frontend/777/</url><builtOn></builtOn><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/AgGridServer.vue</affectedPath><affectedPath>app/pages/materials/products/index.vue</affectedPath><affectedPath>app/components/materials/ProductThumbnail.vue</affectedPath><affectedPath>app/pages/materials/products-v2/index.vue</affectedPath><commitId>a8c0fc5da44e7a162e204825515022eba07c20fa</commitId><timestamp>1792846799000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Products list: larger product thumbnails — ProductThumbnail takes a size via cellRendererParams (default 26 px unchanged elsewhere), picks the first Strapi format ≥ 2× the rendered size for sharp HiDPI output, rounded border + zoom-in cursor + hover enlarge, unscoped styles (AG Grid renderer); AgGridServer gets an optional rowHeight prop; /materials/products and /materials/products-v2 use 48 px thumbnails in a fixed 64 px column with 56 px rows
</comment><date>2026-10-24 14:59:59 +0200</date><id>a8c0fc5da44e7a162e204825515022eba07c20fa</id><msg>Products list: larger product thumbnails — ProductThumbnail takes a size via cellRendererParams (default 26 px unchanged elsewhere), picks the first Strapi format ≥ 2× the rendered size for sharp HiDPI output, rounded border + zoom-in cursor + hover enlarge, unscoped styles (AG Grid renderer); AgGridServer gets an optional rowHeight prop; /materials/products and /materials/products-v2 use 48 px thumbnails in a fixed 64 px column with 56 px rows</msg><path><editType>edit</editType><file>app/pages/materials/products/index.vue</file></path><path><editType>edit</editType><file>app/components/AgGridServer.vue</file></path><path><editType>edit</editType><file>app/components/materials/ProductThumbnail.vue</file></path><path><editType>edit</editType><file>app/pages/materials/products-v2/index.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/AgGrid/SalesOrder/AgCustomAttachment.vue</affectedPath><affectedPath>app/components/AgGrid/SalesOrder/AgCustomTrackingNo.vue</affectedPath><affectedPath>.claude/rules/sales/orders-grid.md</affectedPath><affectedPath>server/api/orders/ag-grid/summary.post.ts</affectedPath><affectedPath>app/pages/sales/orders/index.vue</affectedPath><affectedPath>app/components/AgGridServer.vue</affectedPath><affectedPath>app/components/sales/OrderAction.vue</affectedPath><commitId>1f060bd74c0e4b59ff13eceefb3cbc1a1ed1f1c2</commitId><timestamp>1792849499000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Sales orders grid: faster initial load and scroll blocks — summary endpoint enriches each 50-row block with one batched m_inout lookup (tracking no, shipment id/status, marketplace confirm log) and one batched Strapi attachments lookup (count + documentId), so the TrackingNo, Attachment and OrderAction cell renderers read row data instead of firing 3 requests per rendered row (105 on first paint, ~180 per two scroll steps); grid-ready latest-order-id now a 40 ms c_order top-1 query instead of an unfiltered summary call that summed all ~40k orders (2.5 s / 5 MB) on every page open; fees/revenue totals only on block 0 (AgGridServer sends withAggregates), $select on the view query (257 → 150 KB per block), debug log removed, organization auto-size once instead of every block, 150 ms block-load debounce; attachment files loaded on click only, per-row fallback kept when the Strapi batch is unavailable; voided check in the attachment tag now reads docStatusId; recipe .claude/rules/sales/orders-grid.md
</comment><date>2026-10-24 15:44:59 +0200</date><id>1f060bd74c0e4b59ff13eceefb3cbc1a1ed1f1c2</id><msg>Sales orders grid: faster initial load and scroll blocks — summary endpoint enriches each 50-row block with one batched m_inout lookup (tracking no, shipment id/status, marketplace confirm log) and one batched Strapi attachments lookup (count + documentId), so the TrackingNo, Attachment and OrderAction cell renderers read row data instead of firing 3 requests per rendered row (105 on first paint, ~180 per two scroll steps); grid-ready latest-order-id now a 40 ms c_order top-1 query instead of an unfiltered summary call that summed all ~40k orders (2.5 s / 5 MB) on every page open; fees/revenue totals only on block 0 (AgGridServer sends withAggregates), $select on the view query (257 → 150 KB per block), debug log removed, organization auto-size once instead of every block, 150 ms block-load debounce; attachment files loaded on click only, per-row fallback kept when the Strapi batch is unavailable; voided check in the attachment tag now reads docStatusId; recipe .claude/rules/sales/orders-grid.md</msg><path><editType>edit</editType><file>app/pages/sales/orders/index.vue</file></path><path><editType>edit</editType><file>app/components/AgGridServer.vue</file></path><path><editType>add</editType><file>.claude/rules/sales/orders-grid.md</file></path><path><editType>edit</editType><file>app/components/AgGrid/SalesOrder/AgCustomTrackingNo.vue</file></path><path><editType>edit</editType><file>server/api/orders/ag-grid/summary.post.ts</file></path><path><editType>edit</editType><file>app/components/sales/OrderAction.vue</file></path><path><editType>edit</editType><file>app/components/AgGrid/SalesOrder/AgCustomAttachment.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/orders/ag-grid/so.post.ts</affectedPath><affectedPath>server/api/orders/ag-grid/notfulfilled-5days.post.ts</affectedPath><affectedPath>server/api/orders/ag-grid/notfulfilled-fastlane.post.ts</affectedPath><affectedPath>server/api/orders/ag-grid/notfulfilled.post.ts</affectedPath><affectedPath>.claude/rules/sales/orders-grid.md</affectedPath><commitId>1b0d7dc4c3d37799ace553363f21cc62d6d1fdfb</commitId><timestamp>1792849644000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Remove unused legacy orders ag-grid routes (so, notfulfilled, notfulfilled-5days, notfulfilled-fastlane) — no caller since the 2026-06-02 cleanup (page switched to ag-grid/summary), zero hits in 59 days of prod and dev web logs; they expanded c_orderline + m_inout child tables per block and copied the whole country table into every row
</comment><date>2026-10-24 15:47:24 +0200</date><id>1b0d7dc4c3d37799ace553363f21cc62d6d1fdfb</id><msg>Remove unused legacy orders ag-grid routes (so, notfulfilled, notfulfilled-5days, notfulfilled-fastlane) — no caller since the 2026-06-02 cleanup (page switched to ag-grid/summary), zero hits in 59 days of prod and dev web logs; they expanded c_orderline + m_inout child tables per block and copied the whole country table into every row</msg><path><editType>delete</editType><file>server/api/orders/ag-grid/so.post.ts</file></path><path><editType>delete</editType><file>server/api/orders/ag-grid/notfulfilled-5days.post.ts</file></path><path><editType>delete</editType><file>server/api/orders/ag-grid/notfulfilled.post.ts</file></path><path><editType>delete</editType><file>server/api/orders/ag-grid/notfulfilled-fastlane.post.ts</file></path><path><editType>edit</editType><file>.claude/rules/sales/orders-grid.md</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/idempiere-auth/webauthn/register-verify.post.ts</affectedPath><affectedPath>server/api/admin/users/[id]/webauthn/index.get.ts</affectedPath><affectedPath>server/api/idempiere-auth/webauthn/login-verify.post.ts</affectedPath><affectedPath>server/api/idempiere-auth/webauthn/delete.delete.ts</affectedPath><affectedPath>server/api/admin/webauthn/keys.get.ts</affectedPath><affectedPath>server/api/idempiere-auth/webauthn/login-options.post.ts</affectedPath><affectedPath>android/variables.gradle</affectedPath><affectedPath>android/app/src/main/java/com/logship/mobile/WebAuthnPlugin.java</affectedPath><affectedPath>server/utils/webauthnAdmin.ts</affectedPath><affectedPath>app/composables/useWebAuthn.ts</affectedPath><affectedPath>nuxt.config.ts</affectedPath><affectedPath>android/app/src/main/java/com/logship/mobile/MainActivity.java</affectedPath><affectedPath>server/utils/webauthnReplayDb.ts</affectedPath><affectedPath>.claude/rules/auth/webauthn-security-keys.md</affectedPath><affectedPath>app/plugins/00.capacitor-api.client.ts</affectedPath><affectedPath>app/pages/users/security-keys/index.vue</affectedPath><affectedPath>server/utils/webauthnChallengeStore.ts</affectedPath><affectedPath>server/utils/adUserCredentials.ts</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><affectedPath>app/pages/signin.vue</affectedPath><affectedPath>app/pages/users/users/[id]/edit.vue</affectedPath><affectedPath>server/api/admin/users/[id]/webauthn/destroy.delete.ts</affectedPath><affectedPath>.env</affectedPath><affectedPath>server/utils/webauthnHelper.ts</affectedPath><affectedPath>app/components/users/SecurityKeys.vue</affectedPath><affectedPath>public/.well-known/assetlinks.json</affectedPath><affectedPath>android/app/build.gradle</affectedPath><affectedPath>server/utils/webauthnIndex.ts</affectedPath><affectedPath>server/api/admin/users/[id]/webauthn/register-options.post.ts</affectedPath><affectedPath>app/composables/menu/admin/users.ts</affectedPath><affectedPath>server/api/admin/users/[id]/webauthn/register-verify.post.ts</affectedPath><affectedPath>server/api/idempiere-auth/webauthn/list.get.ts</affectedPath><affectedPath>.env-prod</affectedPath><commitId>af490f06fc09c720e7b0d3acf48c0554990aa4b4</commitId><timestamp>1792853248000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Security-key login: PIN-free YubiKey tap on web + native Android app, admin enrolment and central overview — enrolment now creates non-discoverable, cross-platform credentials with userVerification 'discouraged' (a YubiKey only holds discoverable credentials with a PIN set and Chrome/Windows then prompt for it on every login); login-options sends the credential IDs of all enrolled keys (webauthnIndex.ts: service-token ad_user index, 60 s cache, cap WEBAUTHN_GLOBAL_ALLOWLIST_MAX=150, username-first fallback via needsUserName) and login-verify resolves the user by credential ID (userHandle only as legacy fallback), bumps counter + lastUsedAt; challenge token also returned in the body for cookie-less clients with a better-sqlite3 replay ledger (data/webauthn-replay.db); multiple accepted origins via WEBAUTHN_EXTRA_ORIGINS (Android android:apk-key-hash of the debug-keystore cert, assetlinks.json under public/.well-known); native app: WebAuthnPlugin.java on androidx.credentials (Credential Manager → Play services FIDO over NFC/USB), useWebAuthn routes create/get through it, login-verify delegates to app-auth/login for X-Logship-App requests and the app fetch plugin feeds that response into the session store (+ biometric unlock enrolment after a key login); tenant admins enrol/revoke keys for employees on the user edit page (admin/users/[id]/webauthn/*, isAdminRole gate, password capture with the service token) and on the new overview /users/security-keys (admin/webauthn/keys: all keys, last used, enrolled by, revoke, enrol for a picked employee; menu Users → Security Keys); sign-in page: key button first on devices that used a key before, clear cancel / not-enrolled / throttled messages, per-IP throttle on login-options; de/en/es texts reworded from passkey to security key; recipe .claude/rules/auth/webauthn-security-keys.md
</comment><date>2026-10-24 16:47:28 +0200</date><id>af490f06fc09c720e7b0d3acf48c0554990aa4b4</id><msg>Security-key login: PIN-free YubiKey tap on web + native Android app, admin enrolment and central overview — enrolment now creates non-discoverable, cross-platform credentials with userVerification 'discouraged' (a YubiKey only holds discoverable credentials with a PIN set and Chrome/Windows then prompt for it on every login); login-options sends the credential IDs of all enrolled keys (webauthnIndex.ts: service-token ad_user index, 60 s cache, cap WEBAUTHN_GLOBAL_ALLOWLIST_MAX=150, username-first fallback via needsUserName) and login-verify resolves the user by credential ID (userHandle only as legacy fallback), bumps counter + lastUsedAt; challenge token also returned in the body for cookie-less clients with a better-sqlite3 replay ledger (data/webauthn-replay.db); multiple accepted origins via WEBAUTHN_EXTRA_ORIGINS (Android android:apk-key-hash of the debug-keystore cert, assetlinks.json under public/.well-known); native app: WebAuthnPlugin.java on androidx.credentials (Credential Manager → Play services FIDO over NFC/USB), useWebAuthn routes create/get through it, login-verify delegates to app-auth/login for X-Logship-App requests and the app fetch plugin feeds that response into the session store (+ biometric unlock enrolment after a key login); tenant admins enrol/revoke keys for employees on the user edit page (admin/users/[id]/webauthn/*, isAdminRole gate, password capture with the service token) and on the new overview /users/security-keys (admin/webauthn/keys: all keys, last used, enrolled by, revoke, enrol for a picked employee; menu Users → Security Keys); sign-in page: key button first on devices that used a key before, clear cancel / not-enrolled / throttled messages, per-IP throttle on login-options; de/en/es texts reworded from passkey to security key; recipe .claude/rules/auth/webauthn-security-keys.md</msg><path><editType>edit</editType><file>android/app/src/main/java/com/logship/mobile/MainActivity.java</file></path><path><editType>edit</editType><file>app/pages/users/users/[id]/edit.vue</file></path><path><editType>add</editType><file>server/api/admin/users/[id]/webauthn/register-verify.post.ts</file></path><path><editType>add</editType><file>android/app/src/main/java/com/logship/mobile/WebAuthnPlugin.java</file></path><path><editType>edit</editType><file>nuxt.config.ts</file></path><path><editType>add</editType><file>server/api/admin/users/[id]/webauthn/destroy.delete.ts</file></path><path><editType>edit</editType><file>android/app/build.gradle</file></path><path><editType>edit</editType><file>android/variables.gradle</file></path><path><editType>edit</editType><file>server/api/idempiere-auth/webauthn/login-options.post.ts</file></path><path><editType>edit</editType><file>server/utils/adUserCredentials.ts</file></path><path><editType>add</editType><file>server/utils/webauthnIndex.ts</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>add</editType><file>server/utils/webauthnAdmin.ts</file></path><path><editType>edit</editType><file>app/composables/menu/admin/users.ts</file></path><path><editType>add</editType><file>server/api/admin/users/[id]/webauthn/register-options.post.ts</file></path><path><editType>edit</editType><file>server/utils/webauthnChallengeStore.ts</file></path><path><editType>add</editType><file>.claude/rules/auth/webauthn-security-keys.md</file></path><path><editType>edit</editType><file>server/api/idempiere-auth/webauthn/register-verify.post.ts</file></path><path><editType>edit</editType><file>server/utils/webauthnHelper.ts</file></path><path><editType>edit</editType><file>server/api/idempiere-auth/webauthn/list.get.ts</file></path><path><editType>edit</editType><file>server/api/idempiere-auth/webauthn/login-verify.post.ts</file></path><path><editType>add</editType><file>app/pages/users/security-keys/index.vue</file></path><path><editType>edit</editType><file>app/plugins/00.capacitor-api.client.ts</file></path><path><editType>edit</editType><file>server/api/idempiere-auth/webauthn/delete.delete.ts</file></path><path><editType>edit</editType><file>app/components/users/SecurityKeys.vue</file></path><path><editType>add</editType><file>server/utils/webauthnReplayDb.ts</file></path><path><editType>edit</editType><file>app/pages/signin.vue</file></path><path><editType>edit</editType><file>.env</file></path><path><editType>edit</editType><file>app/composables/useWebAuthn.ts</file></path><path><editType>add</editType><file>public/.well-known/assetlinks.json</file></path><path><editType>add</editType><file>server/api/admin/webauthn/keys.get.ts</file></path><path><editType>add</editType><file>server/api/admin/users/[id]/webauthn/index.get.ts</file></path><path><editType>edit</editType><file>.env-prod</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/utils/webauthnHelper.ts</affectedPath><commitId>94aa23a270d70300b2a4046f5e9c8c2009220e16</commitId><timestamp>1792854035000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Security-key login: allow-list always advertises usb + nfc for roaming keys — Android Credential Manager only arms NFC when 'nfc' is hinted, and keys enrolled over USB on a desktop recorded ['usb'] only, so a tap on the phone opened the YubiKey's NDEF page instead of the FIDO ceremony
</comment><date>2026-10-24 17:00:35 +0200</date><id>94aa23a270d70300b2a4046f5e9c8c2009220e16</id><msg>Security-key login: allow-list always advertises usb + nfc for roaming keys — Android Credential Manager only arms NFC when 'nfc' is hinted, and keys enrolled over USB on a desktop recorded ['usb'] only, so a tap on the phone opened the YubiKey's NDEF page instead of the FIDO ceremony</msg><path><editType>edit</editType><file>server/utils/webauthnHelper.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>.claude/rules/auth/webauthn-security-keys.md</affectedPath><affectedPath>app/pages/signin.vue</affectedPath><commitId>31ec1be9cb1a119633e43662b6c36de51ba55173</commitId><timestamp>1792854221000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Security-key login: show the Credential Manager reason behind 'Key not recognised' in the native app (asset-link / provider failures looked like a missed tap); recipe: ISPConfig nginx denies dot paths — /.well-known/assetlinks.json proxy exception added by hand on the app/dev-app vhosts, verification URL, Play-services cache note
</comment><date>2026-10-24 17:03:41 +0200</date><id>31ec1be9cb1a119633e43662b6c36de51ba55173</id><msg>Security-key login: show the Credential Manager reason behind 'Key not recognised' in the native app (asset-link / provider failures looked like a missed tap); recipe: ISPConfig nginx denies dot paths — /.well-known/assetlinks.json proxy exception added by hand on the app/dev-app vhosts, verification URL, Play-services cache note</msg><path><editType>edit</editType><file>.claude/rules/auth/webauthn-security-keys.md</file></path><path><editType>edit</editType><file>app/pages/signin.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/signin.vue</affectedPath><affectedPath>android/app/src/main/AndroidManifest.xml</affectedPath><affectedPath>android/app/build.gradle</affectedPath><affectedPath>.claude/rules/auth/webauthn-security-keys.md</affectedPath><affectedPath>android/variables.gradle</affectedPath><affectedPath>android/app/src/main/java/com/logship/mobile/WebAuthnPlugin.java</affectedPath><affectedPath>app/composables/useWebAuthn.ts</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>c3ced8b1687b420a7491420a0c67db0716aa3045</commitId><timestamp>1792859305000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Security-key login in the native app: own in-app YubiKey ceremony instead of the Android Credential Manager sheet — WebAuthnPlugin.java now runs CTAP2 getAssertion/makeCredential itself on YubiKit 3.1.0 (NFC reader mode with skipNdefCheck + USB discovery, own "hold the key to the phone" AlertDialog, raw Ctap2Session so a PIN-protected key is never asked for its PIN, allow-lists longer than maxCredentialCountInList probed in silent up=false chunks, connection loss keeps the dialog open for the next tap); the assertion signs for the web origin (public.apiBase = WEBAUTHN_ORIGIN) so no Play services, no asset links and no apk-key-hash origin are involved any more (mode 'system' keeps the Credential Manager path as fallback); NFC permission + optional nfc/usb-host features in the manifest; useWebAuthn passes origin, localized dialog texts and exposes cancelNative/capabilities, sign-in page cancels an open dialog on unmount; mobile web sign-in (≤768 px, not iOS, not in the app) shows an Android APK download card with the public manifest's version; de/en/es texts; recipe updated
</comment><date>2026-10-24 18:28:25 +0200</date><id>c3ced8b1687b420a7491420a0c67db0716aa3045</id><msg>Security-key login in the native app: own in-app YubiKey ceremony instead of the Android Credential Manager sheet — WebAuthnPlugin.java now runs CTAP2 getAssertion/makeCredential itself on YubiKit 3.1.0 (NFC reader mode with skipNdefCheck + USB discovery, own "hold the key to the phone" AlertDialog, raw Ctap2Session so a PIN-protected key is never asked for its PIN, allow-lists longer than maxCredentialCountInList probed in silent up=false chunks, connection loss keeps the dialog open for the next tap); the assertion signs for the web origin (public.apiBase = WEBAUTHN_ORIGIN) so no Play services, no asset links and no apk-key-hash origin are involved any more (mode 'system' keeps the Credential Manager path as fallback); NFC permission + optional nfc/usb-host features in the manifest; useWebAuthn passes origin, localized dialog texts and exposes cancelNative/capabilities, sign-in page cancels an open dialog on unmount; mobile web sign-in (≤768 px, not iOS, not in the app) shows an Android APK download card with the public manifest's version; de/en/es texts; recipe updated</msg><path><editType>edit</editType><file>android/app/src/main/java/com/logship/mobile/WebAuthnPlugin.java</file></path><path><editType>edit</editType><file>.claude/rules/auth/webauthn-security-keys.md</file></path><path><editType>edit</editType><file>app/pages/signin.vue</file></path><path><editType>edit</editType><file>android/app/src/main/AndroidManifest.xml</file></path><path><editType>edit</editType><file>android/app/build.gradle</file></path><path><editType>edit</editType><file>app/composables/useWebAuthn.ts</file></path><path><editType>edit</editType><file>android/variables.gradle</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/composables/useWebAuthn.ts</affectedPath><affectedPath>android/app/src/main/java/com/logship/mobile/WebAuthnPlugin.java</affectedPath><commitId>8c5b5df7a2a21edbe63c6414c5a30f67e4fc6787</commitId><timestamp>1792861176000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Security-key login (native app): never hide the key button — the YubiKit manager is created lazily (a throwing Plugin.load() makes Capacitor drop the whole plugin and the sign-in page silently lost the button), isAvailable() always resolves and reports nfc/usb/yubikit flags plus the init error text, the composable treats a rejected availability call as "plugin unavailable" and surfaces that reason on tap instead of hiding the button, dialog.show() guarded
</comment><date>2026-10-24 18:59:36 +0200</date><id>8c5b5df7a2a21edbe63c6414c5a30f67e4fc6787</id><msg>Security-key login (native app): never hide the key button — the YubiKit manager is created lazily (a throwing Plugin.load() makes Capacitor drop the whole plugin and the sign-in page silently lost the button), isAvailable() always resolves and reports nfc/usb/yubikit flags plus the init error text, the composable treats a rejected availability call as "plugin unavailable" and surfaces that reason on tap instead of hiding the button, dialog.show() guarded</msg><path><editType>edit</editType><file>app/composables/useWebAuthn.ts</file></path><path><editType>edit</editType><file>android/app/src/main/java/com/logship/mobile/WebAuthnPlugin.java</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/signin.vue</affectedPath><affectedPath>server/api/mobile/app-download.get.ts</affectedPath><commitId>e63b9d8bf517b17933a3beb7e4eef53d80275198</commitId><timestamp>1792861753000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Sign-in Android download card: point at the CURRENT build in the ERP release channel — new public GET /api/mobile/app-download returns version + a 24 h signed download URL (data/mobile-releases via mobileReleases.ts), legacy www.logyou.de manifest only as fallback; the old public web root still served the September build 1.0.45, so the card would have handed out a stale APK
</comment><date>2026-10-24 19:09:13 +0200</date><id>e63b9d8bf517b17933a3beb7e4eef53d80275198</id><msg>Sign-in Android download card: point at the CURRENT build in the ERP release channel — new public GET /api/mobile/app-download returns version + a 24 h signed download URL (data/mobile-releases via mobileReleases.ts), legacy www.logyou.de manifest only as fallback; the old public web root still served the September build 1.0.45, so the card would have handed out a stale APK</msg><path><editType>edit</editType><file>app/pages/signin.vue</file></path><path><editType>add</editType><file>server/api/mobile/app-download.get.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>android/update-files/version.json</affectedPath><affectedPath>android/app/build.gradle</affectedPath><commitId>378885a48e4f902910fad004ab676b75d48e3466</commitId><timestamp>1792861879000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>release app 1.0.67 (code 68): in-app YubiKey security-key ceremony, Android download card
</comment><date>2026-10-24 19:11:19 +0200</date><id>378885a48e4f902910fad004ab676b75d48e3466</id><msg>release app 1.0.67 (code 68): in-app YubiKey security-key ceremony, Android download card</msg><path><editType>edit</editType><file>android/update-files/version.json</file></path><path><editType>edit</editType><file>android/app/build.gradle</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName><id>info</id></culprit></freeStyleBuild>