From fffbdf5fa3ddd706218159f4d7f454ee9b6f2076 Mon Sep 17 00:00:00 2001 From: esto Date: Mon, 29 Jun 2026 15:28:12 +0200 Subject: [PATCH 1/3] Add Debian package build support, update workflows, and enhance SPA build process --- .github/workflows/build.yml | 11 ++++++--- app/README.md | 6 +++++ app/package.json | 2 ++ app/scripts/package-deb.sh | 45 +++++++++++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 3 deletions(-) create mode 100755 app/scripts/package-deb.sh diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0cd5e1d..1749018 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -37,8 +37,11 @@ jobs: npm install -g @quasar/cli npm ci - - name: Build SPA zip - run: npm run build:zip + - name: Build SPA artifacts + run: | + npm run build + npm run zip:spa + npm run deb:spa - name: Compute release name id: version @@ -67,4 +70,6 @@ jobs: with: tag_name: ${{ steps.version.outputs.release_name }} name: ${{ steps.version.outputs.release_name }} - files: app/dist/spa.zip + files: | + app/dist/spa.zip + app/dist/*.deb diff --git a/app/README.md b/app/README.md index a509266..82edae3 100644 --- a/app/README.md +++ b/app/README.md @@ -54,6 +54,12 @@ npm run build:zip ``` This produces `dist/spa.zip`. Requires the `zip` command to be available on the system. +### Build and create Debian package for updater deployment +```bash +npm run build:deb +``` +This produces `dist/openscan3-client__all.deb`. The package installs the built SPA assets into `/usr/share/openscan3-client` and intentionally does not ship nginx configuration or services. + ### Regenerate API client and schema helpers ```bash npm run api:gen diff --git a/app/package.json b/app/package.json index ee88a3d..1ab7432 100644 --- a/app/package.json +++ b/app/package.json @@ -9,7 +9,9 @@ "scripts": { "api:gen": "node scripts/generate-api.mjs", "build": "quasar build", + "build:deb": "quasar build && npm run deb:spa", "build:zip": "quasar build && npm run zip:spa", + "deb:spa": "sh scripts/package-deb.sh", "dev": "quasar dev", "lint": "eslint .", "format": "prettier --write \"**/*.{js,ts,vue,scss,html,md,json}\" --ignore-path .gitignore", diff --git a/app/scripts/package-deb.sh b/app/scripts/package-deb.sh new file mode 100755 index 0000000..234c44e --- /dev/null +++ b/app/scripts/package-deb.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env sh +set -eu + +APP_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) +DIST_DIR="$APP_DIR/dist" +SPA_DIR="$DIST_DIR/spa" +PKG_ROOT="$DIST_DIR/deb-root" +INSTALL_DIR="$PKG_ROOT/usr/share/openscan3-client" +DEBIAN_DIR="$PKG_ROOT/DEBIAN" + +if ! command -v dpkg-deb >/dev/null 2>&1; then + echo "dpkg-deb command not found (required to create .deb package)" >&2 + exit 1 +fi + +if [ ! -d "$SPA_DIR" ]; then + echo "SPA build not found at $SPA_DIR. Run npm run build first." >&2 + exit 1 +fi + +PACKAGE_NAME=$(node -p "require('$APP_DIR/package.json').name") +VERSION=$(node -p "require('$APP_DIR/package.json').version") +DESCRIPTION=$(node -p "require('$APP_DIR/package.json').description || 'Frontend client for OpenScan3 firmware devices'") +AUTHOR=$(node -p "require('$APP_DIR/package.json').author || 'OpenScan.eu Team '") +DEB_FILE="$DIST_DIR/${PACKAGE_NAME}_${VERSION}_all.deb" + +rm -rf "$PKG_ROOT" "$DEB_FILE" +mkdir -p "$INSTALL_DIR" "$DEBIAN_DIR" +cp -a "$SPA_DIR/." "$INSTALL_DIR/" +find "$PKG_ROOT" -type d -exec chmod 755 {} + +find "$PKG_ROOT" -type f -exec chmod 644 {} + + +cat > "$DEBIAN_DIR/control" < Date: Mon, 27 Jul 2026 10:49:45 +0200 Subject: [PATCH 2/3] feat: add native software update panel Replace the embedded legacy updater with a native update status, check, installation, and repair interface. Update generated API clients and bump the client version to 0.7.0. --- app/package-lock.json | 4 +- app/package.json | 2 +- app/quasar.config.js | 8 +- .../components/base/BaseVersionInfoCard.vue | 8 - app/src/generated/api/latest/sdk.gen.ts | 40 +- app/src/generated/api/latest/types.gen.ts | 198 ++++++ app/src/generated/api/next/sdk.gen.ts | 40 +- app/src/generated/api/next/types.gen.ts | 198 ++++++ app/src/generated/api/sdk.gen.ts | 40 +- app/src/generated/api/types.gen.ts | 198 ++++++ app/src/generated/api/v0_8/sdk.gen.ts | 2 +- app/src/generated/api/v0_9/sdk.gen.ts | 40 +- app/src/generated/api/v0_9/types.gen.ts | 198 ++++++ app/src/layouts/MainLayout.vue | 45 +- app/src/pages/UpdatePage.vue | 565 ++++++++++++++++++ app/src/router/routes.ts | 1 + openapi_latest.json | 287 ++++++++- openapi_next.json | 287 ++++++++- openapi_v0.8.json | 2 +- openapi_v0.9.json | 287 ++++++++- 20 files changed, 2389 insertions(+), 61 deletions(-) create mode 100644 app/src/pages/UpdatePage.vue diff --git a/app/package-lock.json b/app/package-lock.json index 79b6785..0d011b8 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -1,12 +1,12 @@ { "name": "openscan3-client", - "version": "0.6.0", + "version": "0.7.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "openscan3-client", - "version": "0.6.0", + "version": "0.7.0", "dependencies": { "@quasar/extras": "^1.17.0", "axios": "^1.13.2", diff --git a/app/package.json b/app/package.json index c58c426..4d838ea 100644 --- a/app/package.json +++ b/app/package.json @@ -1,6 +1,6 @@ { "name": "openscan3-client", - "version": "0.6.0", + "version": "0.7.0", "apiVersion": "0.9.0", "description": "Frontend client for OpenScan3 firmware devices", "productName": "OpenScan3", diff --git a/app/quasar.config.js b/app/quasar.config.js index aa0e6bd..09898ea 100644 --- a/app/quasar.config.js +++ b/app/quasar.config.js @@ -94,7 +94,13 @@ export default configure(function (/* ctx */) { // Full list of options: https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#devServer devServer: { // https: true - open: true // opens browser window automatically + open: true, // opens browser window automatically + watch: { + // Use polling so development still works on hosts with a low inotify + // watch limit (otherwise Vite can terminate with EMFILE). + usePolling: true, + interval: 500 + } }, // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#framework diff --git a/app/src/components/base/BaseVersionInfoCard.vue b/app/src/components/base/BaseVersionInfoCard.vue index 6c2cb64..359e800 100644 --- a/app/src/components/base/BaseVersionInfoCard.vue +++ b/app/src/components/base/BaseVersionInfoCard.vue @@ -24,13 +24,5 @@ void versionStore.initialize()
{{ apiConfigStore.version }}
- -
Stable release coming soon
-
- OpenScan is moving from beta to its stable release. Updates are temporarily paused while we prepare the new version. - You can continue using your scanner as usual. Installing the stable release will require flashing a new system image. - We will provide instructions when it is ready. -
-
diff --git a/app/src/generated/api/latest/sdk.gen.ts b/app/src/generated/api/latest/sdk.gen.ts index d4e5b58..4588f05 100644 --- a/app/src/generated/api/latest/sdk.gen.ts +++ b/app/src/generated/api/latest/sdk.gen.ts @@ -2,7 +2,7 @@ import type { Client, Options as Options2, TDataShape } from './client'; import { client } from './client.gen'; -import type { AddConfigJsonData, AddConfigJsonErrors, AddConfigJsonResponses, AddScanWithDescriptionData, AddScanWithDescriptionErrors, AddScanWithDescriptionResponses, AutoCalibrateAwbData, AutoCalibrateAwbErrors, AutoCalibrateAwbResponses, CancelFocusStackingData, CancelFocusStackingErrors, CancelFocusStackingResponses, CancelScanData, CancelScanErrors, CancelScanResponses, CancelTaskData, CancelTaskErrors, CancelTaskResponses, CreateTaskData, CreateTaskErrors, CreateTaskResponses, CropImageData, CropImageErrors, CropImageResponses, DeleteCloudSettingsData, DeleteCloudSettingsErrors, DeleteCloudSettingsResponses, DeletePhotosData, DeletePhotosErrors, DeletePhotosResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponses, DeleteScanData, DeleteScanErrors, DeleteScanResponses, DeleteTaskData, DeleteTaskErrors, DeleteTaskResponses, DownloadLogsArchiveData, DownloadLogsArchiveErrors, DownloadLogsArchiveResponses, DownloadProjectData, DownloadProjectErrors, DownloadProjectFromCloudData, DownloadProjectFromCloudErrors, DownloadProjectFromCloudResponses, DownloadProjectModelData, DownloadProjectModelErrors, DownloadProjectModelResponses, DownloadProjectResponses, DownloadScansData, DownloadScansErrors, DownloadScansResponses, GetAllTasksData, GetAllTasksErrors, GetAllTasksResponses, GetCameraData, GetCameraErrors, GetCameraNameSettingsData, GetCameraNameSettingsErrors, GetCameraNameSettingsResponses, GetCameraReportData, GetCameraReportErrors, GetCameraReportResponses, GetCameraResponses, GetCamerasData, GetCamerasErrors, GetCamerasResponses, GetCloudProjectData, GetCloudProjectErrors, GetCloudProjectResponses, GetCloudSettingsData, GetCloudSettingsErrors, GetCloudSettingsResponses, GetCloudStatusData, GetCloudStatusErrors, GetCloudStatusResponses, GetConfigFileData, GetConfigFileErrors, GetConfigFileResponses, GetCurrentConfigData, GetCurrentConfigErrors, GetCurrentConfigResponses, GetDeviceInfoData, GetDeviceInfoErrors, GetDeviceInfoResponses, GetLightData, GetLightErrors, GetLightNameSettingsData, GetLightNameSettingsErrors, GetLightNameSettingsResponses, GetLightResponses, GetLightsData, GetLightsErrors, GetLightsResponses, GetMotorData, GetMotorErrors, GetMotorNameSettingsData, GetMotorNameSettingsErrors, GetMotorNameSettingsResponses, GetMotorResponses, GetMotorsData, GetMotorsErrors, GetMotorsResponses, GetPathData, GetPathErrors, GetPathResponses, GetPhotoData, GetPhotoErrors, GetPhotoPayloadData, GetPhotoPayloadErrors, GetPhotoPayloadResponses, GetPhotoResponses, GetPinData, GetPinErrors, GetPinResponses, GetPinsData, GetPinsErrors, GetPinsResponses, GetPreviewData, GetPreviewErrors, GetPreviewResponses, GetProjectData, GetProjectErrors, GetProjectResponses, GetProjectsData, GetProjectsErrors, GetProjectsResponses, GetProjectThumbnailData, GetProjectThumbnailErrors, GetProjectThumbnailResponses, GetScanData, GetScanErrors, GetScanPathData, GetScanPathErrors, GetScanPathResponses, GetScanPhotoData, GetScanPhotoErrors, GetScanPhotoResponses, GetScanResponses, GetScanStatusData, GetScanStatusErrors, GetScanStatusResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponses, GetSoftwareInfoData, GetSoftwareInfoErrors, GetSoftwareInfoResponses, GetTaskStatusData, GetTaskStatusErrors, GetTaskStatusResponses, HelloWorldAsyncData, HelloWorldAsyncErrors, HelloWorldAsyncResponses, ListCloudProjectsData, ListCloudProjectsErrors, ListCloudProjectsResponses, ListConfigFilesData, ListConfigFilesErrors, ListConfigFilesResponses, MotorEndstopCalibrationData, MotorEndstopCalibrationErrors, MotorEndstopCalibrationResponses, MotorMoveHomeData, MotorMoveHomeErrors, MotorMoveHomeResponses, MoveMotorByDegreeData, MoveMotorByDegreeErrors, MoveMotorByDegreeResponses, MoveMotorToAngleData, MoveMotorToAngleErrors, MoveMotorToAngleResponses, MoveToPositionData, MoveToPositionErrors, MoveToPositionResponses, NewProjectData, NewProjectErrors, NewProjectResponses, OverrideMotorAngleData, OverrideMotorAngleErrors, OverrideMotorAngleResponses, PauseFocusStackingData, PauseFocusStackingErrors, PauseFocusStackingResponses, PauseScanData, PauseScanErrors, PauseScanResponses, PauseTaskData, PauseTaskErrors, PauseTaskResponses, RebootData, RebootErrors, RebootResponses, ReinitializeHardwareData, ReinitializeHardwareErrors, ReinitializeHardwareResponses, ReplaceCameraNameSettingsData, ReplaceCameraNameSettingsErrors, ReplaceCameraNameSettingsResponses, ReplaceLightNameSettingsData, ReplaceLightNameSettingsErrors, ReplaceLightNameSettingsResponses, ReplaceMotorNameSettingsData, ReplaceMotorNameSettingsErrors, ReplaceMotorNameSettingsResponses, ReplaceSettingsData, ReplaceSettingsErrors, ReplaceSettingsResponses, ResetCloudProjectData, ResetCloudProjectErrors, ResetCloudProjectResponses, RestartApplicationData, RestartApplicationErrors, RestartApplicationResponses, RestartCameraData, RestartCameraErrors, RestartCameraResponses, ResumeFocusStackingData, ResumeFocusStackingErrors, ResumeFocusStackingResponses, ResumeScanData, ResumeScanErrors, ResumeScanResponses, ResumeTaskData, ResumeTaskErrors, ResumeTaskResponses, SaveDeviceConfigData, SaveDeviceConfigErrors, SaveDeviceConfigResponses, SetConfigFileData, SetConfigFileErrors, SetConfigFileResponses, SetPinData, SetPinErrors, SetPinResponses, ShutdownData, ShutdownErrors, ShutdownResponses, StartFocusStackingData, StartFocusStackingErrors, StartFocusStackingResponses, StartQrScanData, StartQrScanErrors, StartQrScanResponses, TailLogsData, TailLogsErrors, TailLogsResponses, ToggleLightData, ToggleLightErrors, ToggleLightResponses, TogglePinData, TogglePinErrors, TogglePinResponses, TurnOffLightData, TurnOffLightErrors, TurnOffLightResponses, TurnOnLightData, TurnOnLightErrors, TurnOnLightResponses, UpdateCameraNameSettingsData, UpdateCameraNameSettingsErrors, UpdateCameraNameSettingsResponses, UpdateCloudSettingsData, UpdateCloudSettingsErrors, UpdateCloudSettingsResponses, UpdateLightNameSettingsData, UpdateLightNameSettingsErrors, UpdateLightNameSettingsResponses, UpdateMotorNameSettingsData, UpdateMotorNameSettingsErrors, UpdateMotorNameSettingsResponses, UpdateSettingData, UpdateSettingErrors, UpdateSettingResponses, UploadProjectToCloudData, UploadProjectToCloudErrors, UploadProjectToCloudResponses, WakeupDeviceData, WakeupDeviceErrors, WakeupDeviceResponses } from './types.gen'; +import type { AddConfigJsonData, AddConfigJsonErrors, AddConfigJsonResponses, AddScanWithDescriptionData, AddScanWithDescriptionErrors, AddScanWithDescriptionResponses, ApplyUpdatesData, ApplyUpdatesErrors, ApplyUpdatesResponses, AutoCalibrateAwbData, AutoCalibrateAwbErrors, AutoCalibrateAwbResponses, CancelFocusStackingData, CancelFocusStackingErrors, CancelFocusStackingResponses, CancelScanData, CancelScanErrors, CancelScanResponses, CancelTaskData, CancelTaskErrors, CancelTaskResponses, CheckForUpdatesData, CheckForUpdatesErrors, CheckForUpdatesResponses, CreateTaskData, CreateTaskErrors, CreateTaskResponses, CropImageData, CropImageErrors, CropImageResponses, DeleteCloudSettingsData, DeleteCloudSettingsErrors, DeleteCloudSettingsResponses, DeletePhotosData, DeletePhotosErrors, DeletePhotosResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponses, DeleteScanData, DeleteScanErrors, DeleteScanResponses, DeleteTaskData, DeleteTaskErrors, DeleteTaskResponses, DownloadLogsArchiveData, DownloadLogsArchiveErrors, DownloadLogsArchiveResponses, DownloadProjectData, DownloadProjectErrors, DownloadProjectFromCloudData, DownloadProjectFromCloudErrors, DownloadProjectFromCloudResponses, DownloadProjectModelData, DownloadProjectModelErrors, DownloadProjectModelResponses, DownloadProjectResponses, DownloadScansData, DownloadScansErrors, DownloadScansResponses, GetAllTasksData, GetAllTasksErrors, GetAllTasksResponses, GetCameraData, GetCameraErrors, GetCameraNameSettingsData, GetCameraNameSettingsErrors, GetCameraNameSettingsResponses, GetCameraReportData, GetCameraReportErrors, GetCameraReportResponses, GetCameraResponses, GetCamerasData, GetCamerasErrors, GetCamerasResponses, GetCloudProjectData, GetCloudProjectErrors, GetCloudProjectResponses, GetCloudSettingsData, GetCloudSettingsErrors, GetCloudSettingsResponses, GetCloudStatusData, GetCloudStatusErrors, GetCloudStatusResponses, GetConfigFileData, GetConfigFileErrors, GetConfigFileResponses, GetCurrentConfigData, GetCurrentConfigErrors, GetCurrentConfigResponses, GetDeviceInfoData, GetDeviceInfoErrors, GetDeviceInfoResponses, GetLightData, GetLightErrors, GetLightNameSettingsData, GetLightNameSettingsErrors, GetLightNameSettingsResponses, GetLightResponses, GetLightsData, GetLightsErrors, GetLightsResponses, GetMotorData, GetMotorErrors, GetMotorNameSettingsData, GetMotorNameSettingsErrors, GetMotorNameSettingsResponses, GetMotorResponses, GetMotorsData, GetMotorsErrors, GetMotorsResponses, GetPathData, GetPathErrors, GetPathResponses, GetPhotoData, GetPhotoErrors, GetPhotoPayloadData, GetPhotoPayloadErrors, GetPhotoPayloadResponses, GetPhotoResponses, GetPinData, GetPinErrors, GetPinResponses, GetPinsData, GetPinsErrors, GetPinsResponses, GetPreviewData, GetPreviewErrors, GetPreviewResponses, GetProjectData, GetProjectErrors, GetProjectResponses, GetProjectsData, GetProjectsErrors, GetProjectsResponses, GetProjectThumbnailData, GetProjectThumbnailErrors, GetProjectThumbnailResponses, GetScanData, GetScanErrors, GetScanPathData, GetScanPathErrors, GetScanPathResponses, GetScanPhotoData, GetScanPhotoErrors, GetScanPhotoResponses, GetScanResponses, GetScanStatusData, GetScanStatusErrors, GetScanStatusResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponses, GetSoftwareInfoData, GetSoftwareInfoErrors, GetSoftwareInfoResponses, GetTaskStatusData, GetTaskStatusErrors, GetTaskStatusResponses, GetUpdateStatusData, GetUpdateStatusErrors, GetUpdateStatusResponses, HelloWorldAsyncData, HelloWorldAsyncErrors, HelloWorldAsyncResponses, ListCloudProjectsData, ListCloudProjectsErrors, ListCloudProjectsResponses, ListConfigFilesData, ListConfigFilesErrors, ListConfigFilesResponses, MotorEndstopCalibrationData, MotorEndstopCalibrationErrors, MotorEndstopCalibrationResponses, MotorMoveHomeData, MotorMoveHomeErrors, MotorMoveHomeResponses, MoveMotorByDegreeData, MoveMotorByDegreeErrors, MoveMotorByDegreeResponses, MoveMotorToAngleData, MoveMotorToAngleErrors, MoveMotorToAngleResponses, MoveToPositionData, MoveToPositionErrors, MoveToPositionResponses, NewProjectData, NewProjectErrors, NewProjectResponses, OverrideMotorAngleData, OverrideMotorAngleErrors, OverrideMotorAngleResponses, PauseFocusStackingData, PauseFocusStackingErrors, PauseFocusStackingResponses, PauseScanData, PauseScanErrors, PauseScanResponses, PauseTaskData, PauseTaskErrors, PauseTaskResponses, RebootData, RebootErrors, RebootResponses, ReinitializeHardwareData, ReinitializeHardwareErrors, ReinitializeHardwareResponses, RepairOpenscan3Data, RepairOpenscan3Errors, RepairOpenscan3Responses, ReplaceCameraNameSettingsData, ReplaceCameraNameSettingsErrors, ReplaceCameraNameSettingsResponses, ReplaceLightNameSettingsData, ReplaceLightNameSettingsErrors, ReplaceLightNameSettingsResponses, ReplaceMotorNameSettingsData, ReplaceMotorNameSettingsErrors, ReplaceMotorNameSettingsResponses, ReplaceSettingsData, ReplaceSettingsErrors, ReplaceSettingsResponses, ResetCloudProjectData, ResetCloudProjectErrors, ResetCloudProjectResponses, RestartApplicationData, RestartApplicationErrors, RestartApplicationResponses, RestartCameraData, RestartCameraErrors, RestartCameraResponses, ResumeFocusStackingData, ResumeFocusStackingErrors, ResumeFocusStackingResponses, ResumeScanData, ResumeScanErrors, ResumeScanResponses, ResumeTaskData, ResumeTaskErrors, ResumeTaskResponses, SaveDeviceConfigData, SaveDeviceConfigErrors, SaveDeviceConfigResponses, SetConfigFileData, SetConfigFileErrors, SetConfigFileResponses, SetPinData, SetPinErrors, SetPinResponses, ShutdownData, ShutdownErrors, ShutdownResponses, StartFocusStackingData, StartFocusStackingErrors, StartFocusStackingResponses, StartQrScanData, StartQrScanErrors, StartQrScanResponses, TailLogsData, TailLogsErrors, TailLogsResponses, ToggleLightData, ToggleLightErrors, ToggleLightResponses, TogglePinData, TogglePinErrors, TogglePinResponses, TurnOffLightData, TurnOffLightErrors, TurnOffLightResponses, TurnOnLightData, TurnOnLightErrors, TurnOnLightResponses, UpdateCameraNameSettingsData, UpdateCameraNameSettingsErrors, UpdateCameraNameSettingsResponses, UpdateCloudSettingsData, UpdateCloudSettingsErrors, UpdateCloudSettingsResponses, UpdateLightNameSettingsData, UpdateLightNameSettingsErrors, UpdateLightNameSettingsResponses, UpdateMotorNameSettingsData, UpdateMotorNameSettingsErrors, UpdateMotorNameSettingsResponses, UpdateSettingData, UpdateSettingErrors, UpdateSettingResponses, UploadProjectToCloudData, UploadProjectToCloudErrors, UploadProjectToCloudResponses, WakeupDeviceData, WakeupDeviceErrors, WakeupDeviceResponses } from './types.gen'; export type Options = Options2 & { /** @@ -538,6 +538,42 @@ export const updateSetting = (options: Opt } }); +/** + * Get Update Status + */ +export const getUpdateStatus = (options?: Options) => (options?.client ?? client).get({ + responseType: 'json', + url: '/system/update/status', + ...options +}); + +/** + * Check For Updates + */ +export const checkForUpdates = (options?: Options) => (options?.client ?? client).post({ + responseType: 'json', + url: '/system/update/check', + ...options +}); + +/** + * Apply Updates + */ +export const applyUpdates = (options?: Options) => (options?.client ?? client).post({ + responseType: 'json', + url: '/system/update/apply', + ...options +}); + +/** + * Repair Openscan3 + */ +export const repairOpenscan3 = (options?: Options) => (options?.client ?? client).post({ + responseType: 'json', + url: '/system/repair/openscan3', + ...options +}); + /** * Get Projects * @@ -1332,7 +1368,7 @@ export const cropImage = (options: Options /** * Hello World Async * - * Start the async hello world demo task. + * Start the async hello world progress demo task. */ export const helloWorldAsync = (options: Options) => (options.client ?? client).post({ responseType: 'json', diff --git a/app/src/generated/api/latest/types.gen.ts b/app/src/generated/api/latest/types.gen.ts index a111c53..700c8e0 100644 --- a/app/src/generated/api/latest/types.gen.ts +++ b/app/src/generated/api/latest/types.gen.ts @@ -785,6 +785,44 @@ export type MotorStatusResponse = { endstop: EndstopStatusResponse | null; }; +/** + * OpenScanUpdatePackage + * + * One optional OpenScan component update for the details view. + */ +export type OpenScanUpdatePackage = { + /** + * Id + */ + id: 'firmware' | 'client' | 'updater' | 'system_config' | 'camera_stack'; + /** + * Installed Version + */ + installed_version: string | null; + /** + * Available Version + */ + available_version: string | null; + /** + * Update Available + */ + update_available: boolean; +}; + +/** + * OpenScanUpdateSummary + */ +export type OpenScanUpdateSummary = { + /** + * Updates Available + */ + updates_available: boolean; + /** + * Packages + */ + packages: Array; +}; + /** * PathMethod */ @@ -1225,6 +1263,24 @@ export type StackingTaskStatus = { status?: TaskStatus | null; }; +/** + * SystemUpdateSummary + */ +export type SystemUpdateSummary = { + /** + * Updates Available + */ + updates_available: boolean; + /** + * Count + */ + count: number; + /** + * Reboot Required After Install + */ + reboot_required_after_install: boolean; +}; + /** * Task * @@ -1357,6 +1413,52 @@ export type TriggerConfig = { pulse_width_ms?: number; }; +/** + * UpdateInstallResponse + * + * Result of a synchronous user-requested update installation. + */ +export type UpdateInstallResponse = { + /** + * Status + */ + status: 'completed' | 'install_failed' | 'install_blocked'; + /** + * Reboot Required + */ + reboot_required: boolean; +}; + +/** + * UpdateStatusResponse + * + * Cached, user-facing software update status. + */ +export type UpdateStatusResponse = { + /** + * Status + */ + status: 'unknown' | 'up_to_date' | 'updates_available' | 'status_unavailable' | 'check_failed'; + /** + * Checked At + */ + checked_at: string | null; + /** + * Stale + */ + stale: boolean; + /** + * Release Channel + */ + release_channel: 'stable' | 'nightly' | 'unknown'; + openscan: OpenScanUpdateSummary; + system: SystemUpdateSummary; + /** + * Reboot Required + */ + reboot_required: boolean; +}; + /** * ValidationError */ @@ -2440,6 +2542,96 @@ export type UpdateSettingResponses = { export type UpdateSettingResponse = UpdateSettingResponses[keyof UpdateSettingResponses]; +export type GetUpdateStatusData = { + body?: never; + path?: never; + query?: never; + url: '/system/update/status'; +}; + +export type GetUpdateStatusErrors = { + /** + * Not found + */ + 404: unknown; +}; + +export type GetUpdateStatusResponses = { + /** + * Successful Response + */ + 200: UpdateStatusResponse; +}; + +export type GetUpdateStatusResponse = GetUpdateStatusResponses[keyof GetUpdateStatusResponses]; + +export type CheckForUpdatesData = { + body?: never; + path?: never; + query?: never; + url: '/system/update/check'; +}; + +export type CheckForUpdatesErrors = { + /** + * Not found + */ + 404: unknown; +}; + +export type CheckForUpdatesResponses = { + /** + * Successful Response + */ + 200: UpdateStatusResponse; +}; + +export type CheckForUpdatesResponse = CheckForUpdatesResponses[keyof CheckForUpdatesResponses]; + +export type ApplyUpdatesData = { + body?: never; + path?: never; + query?: never; + url: '/system/update/apply'; +}; + +export type ApplyUpdatesErrors = { + /** + * Not found + */ + 404: unknown; +}; + +export type ApplyUpdatesResponses = { + /** + * Successful Response + */ + 200: UpdateInstallResponse; +}; + +export type ApplyUpdatesResponse = ApplyUpdatesResponses[keyof ApplyUpdatesResponses]; + +export type RepairOpenscan3Data = { + body?: never; + path?: never; + query?: never; + url: '/system/repair/openscan3'; +}; + +export type RepairOpenscan3Errors = { + /** + * Not found + */ + 404: unknown; +}; + +export type RepairOpenscan3Responses = { + /** + * Successful Response + */ + 200: unknown; +}; + export type GetProjectsData = { body?: never; path?: never; @@ -4003,6 +4195,12 @@ export type GetCameraReportData = { * Format */ format?: 'json' | 'text'; + /** + * Release Cameras + * + * Temporarily release OpenScan camera controllers so rpicam/libcamera probes can acquire cameras. + */ + release_cameras?: boolean; }; url: '/develop/camera-report'; }; diff --git a/app/src/generated/api/next/sdk.gen.ts b/app/src/generated/api/next/sdk.gen.ts index 8bdaa39..f27c663 100644 --- a/app/src/generated/api/next/sdk.gen.ts +++ b/app/src/generated/api/next/sdk.gen.ts @@ -2,7 +2,7 @@ import type { Client, Options as Options2, TDataShape } from './client'; import { client } from './client.gen'; -import type { AddConfigJsonData, AddConfigJsonErrors, AddConfigJsonResponses, AddScanWithDescriptionData, AddScanWithDescriptionErrors, AddScanWithDescriptionResponses, AutoCalibrateAwbData, AutoCalibrateAwbErrors, AutoCalibrateAwbResponses, CancelExternalTriggerRunEndpointData, CancelExternalTriggerRunEndpointErrors, CancelExternalTriggerRunEndpointResponses, CancelFocusStackingData, CancelFocusStackingErrors, CancelFocusStackingResponses, CancelScanData, CancelScanErrors, CancelScanResponses, CancelTaskData, CancelTaskErrors, CancelTaskResponses, CreateExternalTriggerRunData, CreateExternalTriggerRunErrors, CreateExternalTriggerRunResponses, CreateTaskData, CreateTaskErrors, CreateTaskResponses, CropImageData, CropImageErrors, CropImageResponses, DeleteCloudSettingsData, DeleteCloudSettingsErrors, DeleteCloudSettingsResponses, DeletePhotosData, DeletePhotosErrors, DeletePhotosResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponses, DeleteScanData, DeleteScanErrors, DeleteScanResponses, DeleteTaskData, DeleteTaskErrors, DeleteTaskResponses, DownloadLogsArchiveData, DownloadLogsArchiveErrors, DownloadLogsArchiveResponses, DownloadProjectData, DownloadProjectErrors, DownloadProjectFromCloudData, DownloadProjectFromCloudErrors, DownloadProjectFromCloudResponses, DownloadProjectModelData, DownloadProjectModelErrors, DownloadProjectModelResponses, DownloadProjectResponses, DownloadScansData, DownloadScansErrors, DownloadScansResponses, GetAllTasksData, GetAllTasksErrors, GetAllTasksResponses, GetCameraData, GetCameraErrors, GetCameraNameSettingsData, GetCameraNameSettingsErrors, GetCameraNameSettingsResponses, GetCameraReportData, GetCameraReportErrors, GetCameraReportResponses, GetCameraResponses, GetCamerasData, GetCamerasErrors, GetCamerasResponses, GetCloudProjectData, GetCloudProjectErrors, GetCloudProjectResponses, GetCloudSettingsData, GetCloudSettingsErrors, GetCloudSettingsResponses, GetCloudStatusData, GetCloudStatusErrors, GetCloudStatusResponses, GetConfigFileData, GetConfigFileErrors, GetConfigFileResponses, GetCurrentConfigData, GetCurrentConfigErrors, GetCurrentConfigResponses, GetDeviceInfoData, GetDeviceInfoErrors, GetDeviceInfoResponses, GetExternalTriggerRunData, GetExternalTriggerRunErrors, GetExternalTriggerRunPathData, GetExternalTriggerRunPathErrors, GetExternalTriggerRunPathResponses, GetExternalTriggerRunResponses, GetLightData, GetLightErrors, GetLightNameSettingsData, GetLightNameSettingsErrors, GetLightNameSettingsResponses, GetLightResponses, GetLightsData, GetLightsErrors, GetLightsResponses, GetMotorData, GetMotorErrors, GetMotorNameSettingsData, GetMotorNameSettingsErrors, GetMotorNameSettingsResponses, GetMotorResponses, GetMotorsData, GetMotorsErrors, GetMotorsResponses, GetPathData, GetPathErrors, GetPathResponses, GetPhotoData, GetPhotoErrors, GetPhotoPayloadData, GetPhotoPayloadErrors, GetPhotoPayloadResponses, GetPhotoResponses, GetPinData, GetPinErrors, GetPinResponses, GetPinsData, GetPinsErrors, GetPinsResponses, GetPreviewData, GetPreviewErrors, GetPreviewResponses, GetProjectData, GetProjectErrors, GetProjectResponses, GetProjectsData, GetProjectsErrors, GetProjectsResponses, GetProjectThumbnailData, GetProjectThumbnailErrors, GetProjectThumbnailResponses, GetScanData, GetScanErrors, GetScanPathData, GetScanPathErrors, GetScanPathResponses, GetScanPhotoData, GetScanPhotoErrors, GetScanPhotoResponses, GetScanResponses, GetScanStatusData, GetScanStatusErrors, GetScanStatusResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponses, GetSoftwareInfoData, GetSoftwareInfoErrors, GetSoftwareInfoResponses, GetTaskStatusData, GetTaskStatusErrors, GetTaskStatusResponses, GetTriggerData, GetTriggerErrors, GetTriggerNameSettingsData, GetTriggerNameSettingsErrors, GetTriggerNameSettingsResponses, GetTriggerResponses, GetTriggersData, GetTriggersErrors, GetTriggersResponses, HelloWorldAsyncData, HelloWorldAsyncErrors, HelloWorldAsyncResponses, ListCloudProjectsData, ListCloudProjectsErrors, ListCloudProjectsResponses, ListConfigFilesData, ListConfigFilesErrors, ListConfigFilesResponses, ListExternalTriggerRunsData, ListExternalTriggerRunsErrors, ListExternalTriggerRunsResponses, MotorEndstopCalibrationData, MotorEndstopCalibrationErrors, MotorEndstopCalibrationResponses, MotorMoveHomeData, MotorMoveHomeErrors, MotorMoveHomeResponses, MoveMotorByDegreeData, MoveMotorByDegreeErrors, MoveMotorByDegreeResponses, MoveMotorToAngleData, MoveMotorToAngleErrors, MoveMotorToAngleResponses, MoveToPositionData, MoveToPositionErrors, MoveToPositionResponses, NewProjectData, NewProjectErrors, NewProjectResponses, OverrideMotorAngleData, OverrideMotorAngleErrors, OverrideMotorAngleResponses, PauseExternalTriggerRunEndpointData, PauseExternalTriggerRunEndpointErrors, PauseExternalTriggerRunEndpointResponses, PauseFocusStackingData, PauseFocusStackingErrors, PauseFocusStackingResponses, PauseScanData, PauseScanErrors, PauseScanResponses, PauseTaskData, PauseTaskErrors, PauseTaskResponses, PwmLightData, PwmLightErrors, PwmLightResponses, RebootData, RebootErrors, RebootResponses, ReinitializeHardwareData, ReinitializeHardwareErrors, ReinitializeHardwareResponses, ReplaceCameraNameSettingsData, ReplaceCameraNameSettingsErrors, ReplaceCameraNameSettingsResponses, ReplaceLightNameSettingsData, ReplaceLightNameSettingsErrors, ReplaceLightNameSettingsResponses, ReplaceMotorNameSettingsData, ReplaceMotorNameSettingsErrors, ReplaceMotorNameSettingsResponses, ReplaceSettingsData, ReplaceSettingsErrors, ReplaceSettingsResponses, ReplaceTriggerNameSettingsData, ReplaceTriggerNameSettingsErrors, ReplaceTriggerNameSettingsResponses, ResetCloudProjectData, ResetCloudProjectErrors, ResetCloudProjectResponses, RestartApplicationData, RestartApplicationErrors, RestartApplicationResponses, RestartCameraData, RestartCameraErrors, RestartCameraResponses, ResumeExternalTriggerRunEndpointData, ResumeExternalTriggerRunEndpointErrors, ResumeExternalTriggerRunEndpointResponses, ResumeFocusStackingData, ResumeFocusStackingErrors, ResumeFocusStackingResponses, ResumeScanData, ResumeScanErrors, ResumeScanResponses, ResumeTaskData, ResumeTaskErrors, ResumeTaskResponses, SaveDeviceConfigData, SaveDeviceConfigErrors, SaveDeviceConfigResponses, SetConfigFileData, SetConfigFileErrors, SetConfigFileResponses, SetPinData, SetPinErrors, SetPinResponses, ShutdownData, ShutdownErrors, ShutdownResponses, StartFocusStackingData, StartFocusStackingErrors, StartFocusStackingResponses, StartQrScanData, StartQrScanErrors, StartQrScanResponses, TailLogsData, TailLogsErrors, TailLogsResponses, ToggleLightData, ToggleLightErrors, ToggleLightResponses, TogglePinData, TogglePinErrors, TogglePinResponses, TriggerOnceData, TriggerOnceErrors, TriggerOnceResponses, TurnOffLightData, TurnOffLightErrors, TurnOffLightResponses, TurnOnLightData, TurnOnLightErrors, TurnOnLightResponses, UpdateCameraNameSettingsData, UpdateCameraNameSettingsErrors, UpdateCameraNameSettingsResponses, UpdateCloudSettingsData, UpdateCloudSettingsErrors, UpdateCloudSettingsResponses, UpdateLightNameSettingsData, UpdateLightNameSettingsErrors, UpdateLightNameSettingsResponses, UpdateMotorNameSettingsData, UpdateMotorNameSettingsErrors, UpdateMotorNameSettingsResponses, UpdateSettingData, UpdateSettingErrors, UpdateSettingResponses, UpdateTriggerNameSettingsData, UpdateTriggerNameSettingsErrors, UpdateTriggerNameSettingsResponses, UploadProjectToCloudData, UploadProjectToCloudErrors, UploadProjectToCloudResponses, WakeupDeviceData, WakeupDeviceErrors, WakeupDeviceResponses } from './types.gen'; +import type { AddConfigJsonData, AddConfigJsonErrors, AddConfigJsonResponses, AddScanWithDescriptionData, AddScanWithDescriptionErrors, AddScanWithDescriptionResponses, ApplyUpdatesData, ApplyUpdatesErrors, ApplyUpdatesResponses, AutoCalibrateAwbData, AutoCalibrateAwbErrors, AutoCalibrateAwbResponses, CancelExternalTriggerRunEndpointData, CancelExternalTriggerRunEndpointErrors, CancelExternalTriggerRunEndpointResponses, CancelFocusStackingData, CancelFocusStackingErrors, CancelFocusStackingResponses, CancelScanData, CancelScanErrors, CancelScanResponses, CancelTaskData, CancelTaskErrors, CancelTaskResponses, CheckForUpdatesData, CheckForUpdatesErrors, CheckForUpdatesResponses, CreateExternalTriggerRunData, CreateExternalTriggerRunErrors, CreateExternalTriggerRunResponses, CreateTaskData, CreateTaskErrors, CreateTaskResponses, CropImageData, CropImageErrors, CropImageResponses, DeleteCloudSettingsData, DeleteCloudSettingsErrors, DeleteCloudSettingsResponses, DeletePhotosData, DeletePhotosErrors, DeletePhotosResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponses, DeleteScanData, DeleteScanErrors, DeleteScanResponses, DeleteTaskData, DeleteTaskErrors, DeleteTaskResponses, DownloadLogsArchiveData, DownloadLogsArchiveErrors, DownloadLogsArchiveResponses, DownloadProjectData, DownloadProjectErrors, DownloadProjectFromCloudData, DownloadProjectFromCloudErrors, DownloadProjectFromCloudResponses, DownloadProjectModelData, DownloadProjectModelErrors, DownloadProjectModelResponses, DownloadProjectResponses, DownloadScansData, DownloadScansErrors, DownloadScansResponses, GetAllTasksData, GetAllTasksErrors, GetAllTasksResponses, GetCameraData, GetCameraErrors, GetCameraNameSettingsData, GetCameraNameSettingsErrors, GetCameraNameSettingsResponses, GetCameraReportData, GetCameraReportErrors, GetCameraReportResponses, GetCameraResponses, GetCamerasData, GetCamerasErrors, GetCamerasResponses, GetCloudProjectData, GetCloudProjectErrors, GetCloudProjectResponses, GetCloudSettingsData, GetCloudSettingsErrors, GetCloudSettingsResponses, GetCloudStatusData, GetCloudStatusErrors, GetCloudStatusResponses, GetConfigFileData, GetConfigFileErrors, GetConfigFileResponses, GetCurrentConfigData, GetCurrentConfigErrors, GetCurrentConfigResponses, GetDeviceInfoData, GetDeviceInfoErrors, GetDeviceInfoResponses, GetExternalTriggerRunData, GetExternalTriggerRunErrors, GetExternalTriggerRunPathData, GetExternalTriggerRunPathErrors, GetExternalTriggerRunPathResponses, GetExternalTriggerRunResponses, GetLightData, GetLightErrors, GetLightNameSettingsData, GetLightNameSettingsErrors, GetLightNameSettingsResponses, GetLightResponses, GetLightsData, GetLightsErrors, GetLightsResponses, GetMotorData, GetMotorErrors, GetMotorNameSettingsData, GetMotorNameSettingsErrors, GetMotorNameSettingsResponses, GetMotorResponses, GetMotorsData, GetMotorsErrors, GetMotorsResponses, GetPathData, GetPathErrors, GetPathResponses, GetPhotoData, GetPhotoErrors, GetPhotoPayloadData, GetPhotoPayloadErrors, GetPhotoPayloadResponses, GetPhotoResponses, GetPinData, GetPinErrors, GetPinResponses, GetPinsData, GetPinsErrors, GetPinsResponses, GetPreviewData, GetPreviewErrors, GetPreviewResponses, GetProjectData, GetProjectErrors, GetProjectResponses, GetProjectsData, GetProjectsErrors, GetProjectsResponses, GetProjectThumbnailData, GetProjectThumbnailErrors, GetProjectThumbnailResponses, GetScanData, GetScanErrors, GetScanPathData, GetScanPathErrors, GetScanPathResponses, GetScanPhotoData, GetScanPhotoErrors, GetScanPhotoResponses, GetScanResponses, GetScanStatusData, GetScanStatusErrors, GetScanStatusResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponses, GetSoftwareInfoData, GetSoftwareInfoErrors, GetSoftwareInfoResponses, GetTaskStatusData, GetTaskStatusErrors, GetTaskStatusResponses, GetTriggerData, GetTriggerErrors, GetTriggerNameSettingsData, GetTriggerNameSettingsErrors, GetTriggerNameSettingsResponses, GetTriggerResponses, GetTriggersData, GetTriggersErrors, GetTriggersResponses, GetUpdateStatusData, GetUpdateStatusErrors, GetUpdateStatusResponses, HelloWorldAsyncData, HelloWorldAsyncErrors, HelloWorldAsyncResponses, ListCloudProjectsData, ListCloudProjectsErrors, ListCloudProjectsResponses, ListConfigFilesData, ListConfigFilesErrors, ListConfigFilesResponses, ListExternalTriggerRunsData, ListExternalTriggerRunsErrors, ListExternalTriggerRunsResponses, MotorEndstopCalibrationData, MotorEndstopCalibrationErrors, MotorEndstopCalibrationResponses, MotorMoveHomeData, MotorMoveHomeErrors, MotorMoveHomeResponses, MoveMotorByDegreeData, MoveMotorByDegreeErrors, MoveMotorByDegreeResponses, MoveMotorToAngleData, MoveMotorToAngleErrors, MoveMotorToAngleResponses, MoveToPositionData, MoveToPositionErrors, MoveToPositionResponses, NewProjectData, NewProjectErrors, NewProjectResponses, OverrideMotorAngleData, OverrideMotorAngleErrors, OverrideMotorAngleResponses, PauseExternalTriggerRunEndpointData, PauseExternalTriggerRunEndpointErrors, PauseExternalTriggerRunEndpointResponses, PauseFocusStackingData, PauseFocusStackingErrors, PauseFocusStackingResponses, PauseScanData, PauseScanErrors, PauseScanResponses, PauseTaskData, PauseTaskErrors, PauseTaskResponses, PwmLightData, PwmLightErrors, PwmLightResponses, RebootData, RebootErrors, RebootResponses, ReinitializeHardwareData, ReinitializeHardwareErrors, ReinitializeHardwareResponses, RepairOpenscan3Data, RepairOpenscan3Errors, RepairOpenscan3Responses, ReplaceCameraNameSettingsData, ReplaceCameraNameSettingsErrors, ReplaceCameraNameSettingsResponses, ReplaceLightNameSettingsData, ReplaceLightNameSettingsErrors, ReplaceLightNameSettingsResponses, ReplaceMotorNameSettingsData, ReplaceMotorNameSettingsErrors, ReplaceMotorNameSettingsResponses, ReplaceSettingsData, ReplaceSettingsErrors, ReplaceSettingsResponses, ReplaceTriggerNameSettingsData, ReplaceTriggerNameSettingsErrors, ReplaceTriggerNameSettingsResponses, ResetCloudProjectData, ResetCloudProjectErrors, ResetCloudProjectResponses, RestartApplicationData, RestartApplicationErrors, RestartApplicationResponses, RestartCameraData, RestartCameraErrors, RestartCameraResponses, ResumeExternalTriggerRunEndpointData, ResumeExternalTriggerRunEndpointErrors, ResumeExternalTriggerRunEndpointResponses, ResumeFocusStackingData, ResumeFocusStackingErrors, ResumeFocusStackingResponses, ResumeScanData, ResumeScanErrors, ResumeScanResponses, ResumeTaskData, ResumeTaskErrors, ResumeTaskResponses, SaveDeviceConfigData, SaveDeviceConfigErrors, SaveDeviceConfigResponses, SetConfigFileData, SetConfigFileErrors, SetConfigFileResponses, SetPinData, SetPinErrors, SetPinResponses, ShutdownData, ShutdownErrors, ShutdownResponses, StartFocusStackingData, StartFocusStackingErrors, StartFocusStackingResponses, StartQrScanData, StartQrScanErrors, StartQrScanResponses, TailLogsData, TailLogsErrors, TailLogsResponses, ToggleLightData, ToggleLightErrors, ToggleLightResponses, TogglePinData, TogglePinErrors, TogglePinResponses, TriggerOnceData, TriggerOnceErrors, TriggerOnceResponses, TurnOffLightData, TurnOffLightErrors, TurnOffLightResponses, TurnOnLightData, TurnOnLightErrors, TurnOnLightResponses, UpdateCameraNameSettingsData, UpdateCameraNameSettingsErrors, UpdateCameraNameSettingsResponses, UpdateCloudSettingsData, UpdateCloudSettingsErrors, UpdateCloudSettingsResponses, UpdateLightNameSettingsData, UpdateLightNameSettingsErrors, UpdateLightNameSettingsResponses, UpdateMotorNameSettingsData, UpdateMotorNameSettingsErrors, UpdateMotorNameSettingsResponses, UpdateSettingData, UpdateSettingErrors, UpdateSettingResponses, UpdateTriggerNameSettingsData, UpdateTriggerNameSettingsErrors, UpdateTriggerNameSettingsResponses, UploadProjectToCloudData, UploadProjectToCloudErrors, UploadProjectToCloudResponses, WakeupDeviceData, WakeupDeviceErrors, WakeupDeviceResponses } from './types.gen'; export type Options = Options2 & { /** @@ -556,6 +556,42 @@ export const updateSetting = (options: Opt } }); +/** + * Get Update Status + */ +export const getUpdateStatus = (options?: Options) => (options?.client ?? client).get({ + responseType: 'json', + url: '/system/update/status', + ...options +}); + +/** + * Check For Updates + */ +export const checkForUpdates = (options?: Options) => (options?.client ?? client).post({ + responseType: 'json', + url: '/system/update/check', + ...options +}); + +/** + * Apply Updates + */ +export const applyUpdates = (options?: Options) => (options?.client ?? client).post({ + responseType: 'json', + url: '/system/update/apply', + ...options +}); + +/** + * Repair Openscan3 + */ +export const repairOpenscan3 = (options?: Options) => (options?.client ?? client).post({ + responseType: 'json', + url: '/system/repair/openscan3', + ...options +}); + /** * Get Projects * @@ -1496,7 +1532,7 @@ export const cropImage = (options: Options /** * Hello World Async * - * Start the async hello world demo task. + * Start the async hello world progress demo task. */ export const helloWorldAsync = (options: Options) => (options.client ?? client).post({ responseType: 'json', diff --git a/app/src/generated/api/next/types.gen.ts b/app/src/generated/api/next/types.gen.ts index 1473716..e015b2d 100644 --- a/app/src/generated/api/next/types.gen.ts +++ b/app/src/generated/api/next/types.gen.ts @@ -922,6 +922,44 @@ export type MotorStatusResponse = { endstop: EndstopStatusResponse | null; }; +/** + * OpenScanUpdatePackage + * + * One optional OpenScan component update for the details view. + */ +export type OpenScanUpdatePackage = { + /** + * Id + */ + id: 'firmware' | 'client' | 'updater' | 'system_config' | 'camera_stack'; + /** + * Installed Version + */ + installed_version: string | null; + /** + * Available Version + */ + available_version: string | null; + /** + * Update Available + */ + update_available: boolean; +}; + +/** + * OpenScanUpdateSummary + */ +export type OpenScanUpdateSummary = { + /** + * Updates Available + */ + updates_available: boolean; + /** + * Packages + */ + packages: Array; +}; + /** * PathMethod */ @@ -1362,6 +1400,24 @@ export type StackingTaskStatus = { status?: TaskStatus | null; }; +/** + * SystemUpdateSummary + */ +export type SystemUpdateSummary = { + /** + * Updates Available + */ + updates_available: boolean; + /** + * Count + */ + count: number; + /** + * Reboot Required After Install + */ + reboot_required_after_install: boolean; +}; + /** * Task * @@ -1557,6 +1613,52 @@ export type TriggerStatusResponse = { last_duration_ms?: number | null; }; +/** + * UpdateInstallResponse + * + * Result of a synchronous user-requested update installation. + */ +export type UpdateInstallResponse = { + /** + * Status + */ + status: 'completed' | 'install_failed' | 'install_blocked'; + /** + * Reboot Required + */ + reboot_required: boolean; +}; + +/** + * UpdateStatusResponse + * + * Cached, user-facing software update status. + */ +export type UpdateStatusResponse = { + /** + * Status + */ + status: 'unknown' | 'up_to_date' | 'updates_available' | 'status_unavailable' | 'check_failed'; + /** + * Checked At + */ + checked_at: string | null; + /** + * Stale + */ + stale: boolean; + /** + * Release Channel + */ + release_channel: 'stable' | 'nightly' | 'unknown'; + openscan: OpenScanUpdateSummary; + system: SystemUpdateSummary; + /** + * Reboot Required + */ + reboot_required: boolean; +}; + /** * ValidationError */ @@ -2681,6 +2783,96 @@ export type UpdateSettingResponses = { export type UpdateSettingResponse = UpdateSettingResponses[keyof UpdateSettingResponses]; +export type GetUpdateStatusData = { + body?: never; + path?: never; + query?: never; + url: '/system/update/status'; +}; + +export type GetUpdateStatusErrors = { + /** + * Not found + */ + 404: unknown; +}; + +export type GetUpdateStatusResponses = { + /** + * Successful Response + */ + 200: UpdateStatusResponse; +}; + +export type GetUpdateStatusResponse = GetUpdateStatusResponses[keyof GetUpdateStatusResponses]; + +export type CheckForUpdatesData = { + body?: never; + path?: never; + query?: never; + url: '/system/update/check'; +}; + +export type CheckForUpdatesErrors = { + /** + * Not found + */ + 404: unknown; +}; + +export type CheckForUpdatesResponses = { + /** + * Successful Response + */ + 200: UpdateStatusResponse; +}; + +export type CheckForUpdatesResponse = CheckForUpdatesResponses[keyof CheckForUpdatesResponses]; + +export type ApplyUpdatesData = { + body?: never; + path?: never; + query?: never; + url: '/system/update/apply'; +}; + +export type ApplyUpdatesErrors = { + /** + * Not found + */ + 404: unknown; +}; + +export type ApplyUpdatesResponses = { + /** + * Successful Response + */ + 200: UpdateInstallResponse; +}; + +export type ApplyUpdatesResponse = ApplyUpdatesResponses[keyof ApplyUpdatesResponses]; + +export type RepairOpenscan3Data = { + body?: never; + path?: never; + query?: never; + url: '/system/repair/openscan3'; +}; + +export type RepairOpenscan3Errors = { + /** + * Not found + */ + 404: unknown; +}; + +export type RepairOpenscan3Responses = { + /** + * Successful Response + */ + 200: unknown; +}; + export type GetProjectsData = { body?: never; path?: never; @@ -4673,6 +4865,12 @@ export type GetCameraReportData = { * Format */ format?: 'json' | 'text'; + /** + * Release Cameras + * + * Temporarily release OpenScan camera controllers so rpicam/libcamera probes can acquire cameras. + */ + release_cameras?: boolean; }; url: '/develop/camera-report'; }; diff --git a/app/src/generated/api/sdk.gen.ts b/app/src/generated/api/sdk.gen.ts index d4e5b58..4588f05 100644 --- a/app/src/generated/api/sdk.gen.ts +++ b/app/src/generated/api/sdk.gen.ts @@ -2,7 +2,7 @@ import type { Client, Options as Options2, TDataShape } from './client'; import { client } from './client.gen'; -import type { AddConfigJsonData, AddConfigJsonErrors, AddConfigJsonResponses, AddScanWithDescriptionData, AddScanWithDescriptionErrors, AddScanWithDescriptionResponses, AutoCalibrateAwbData, AutoCalibrateAwbErrors, AutoCalibrateAwbResponses, CancelFocusStackingData, CancelFocusStackingErrors, CancelFocusStackingResponses, CancelScanData, CancelScanErrors, CancelScanResponses, CancelTaskData, CancelTaskErrors, CancelTaskResponses, CreateTaskData, CreateTaskErrors, CreateTaskResponses, CropImageData, CropImageErrors, CropImageResponses, DeleteCloudSettingsData, DeleteCloudSettingsErrors, DeleteCloudSettingsResponses, DeletePhotosData, DeletePhotosErrors, DeletePhotosResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponses, DeleteScanData, DeleteScanErrors, DeleteScanResponses, DeleteTaskData, DeleteTaskErrors, DeleteTaskResponses, DownloadLogsArchiveData, DownloadLogsArchiveErrors, DownloadLogsArchiveResponses, DownloadProjectData, DownloadProjectErrors, DownloadProjectFromCloudData, DownloadProjectFromCloudErrors, DownloadProjectFromCloudResponses, DownloadProjectModelData, DownloadProjectModelErrors, DownloadProjectModelResponses, DownloadProjectResponses, DownloadScansData, DownloadScansErrors, DownloadScansResponses, GetAllTasksData, GetAllTasksErrors, GetAllTasksResponses, GetCameraData, GetCameraErrors, GetCameraNameSettingsData, GetCameraNameSettingsErrors, GetCameraNameSettingsResponses, GetCameraReportData, GetCameraReportErrors, GetCameraReportResponses, GetCameraResponses, GetCamerasData, GetCamerasErrors, GetCamerasResponses, GetCloudProjectData, GetCloudProjectErrors, GetCloudProjectResponses, GetCloudSettingsData, GetCloudSettingsErrors, GetCloudSettingsResponses, GetCloudStatusData, GetCloudStatusErrors, GetCloudStatusResponses, GetConfigFileData, GetConfigFileErrors, GetConfigFileResponses, GetCurrentConfigData, GetCurrentConfigErrors, GetCurrentConfigResponses, GetDeviceInfoData, GetDeviceInfoErrors, GetDeviceInfoResponses, GetLightData, GetLightErrors, GetLightNameSettingsData, GetLightNameSettingsErrors, GetLightNameSettingsResponses, GetLightResponses, GetLightsData, GetLightsErrors, GetLightsResponses, GetMotorData, GetMotorErrors, GetMotorNameSettingsData, GetMotorNameSettingsErrors, GetMotorNameSettingsResponses, GetMotorResponses, GetMotorsData, GetMotorsErrors, GetMotorsResponses, GetPathData, GetPathErrors, GetPathResponses, GetPhotoData, GetPhotoErrors, GetPhotoPayloadData, GetPhotoPayloadErrors, GetPhotoPayloadResponses, GetPhotoResponses, GetPinData, GetPinErrors, GetPinResponses, GetPinsData, GetPinsErrors, GetPinsResponses, GetPreviewData, GetPreviewErrors, GetPreviewResponses, GetProjectData, GetProjectErrors, GetProjectResponses, GetProjectsData, GetProjectsErrors, GetProjectsResponses, GetProjectThumbnailData, GetProjectThumbnailErrors, GetProjectThumbnailResponses, GetScanData, GetScanErrors, GetScanPathData, GetScanPathErrors, GetScanPathResponses, GetScanPhotoData, GetScanPhotoErrors, GetScanPhotoResponses, GetScanResponses, GetScanStatusData, GetScanStatusErrors, GetScanStatusResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponses, GetSoftwareInfoData, GetSoftwareInfoErrors, GetSoftwareInfoResponses, GetTaskStatusData, GetTaskStatusErrors, GetTaskStatusResponses, HelloWorldAsyncData, HelloWorldAsyncErrors, HelloWorldAsyncResponses, ListCloudProjectsData, ListCloudProjectsErrors, ListCloudProjectsResponses, ListConfigFilesData, ListConfigFilesErrors, ListConfigFilesResponses, MotorEndstopCalibrationData, MotorEndstopCalibrationErrors, MotorEndstopCalibrationResponses, MotorMoveHomeData, MotorMoveHomeErrors, MotorMoveHomeResponses, MoveMotorByDegreeData, MoveMotorByDegreeErrors, MoveMotorByDegreeResponses, MoveMotorToAngleData, MoveMotorToAngleErrors, MoveMotorToAngleResponses, MoveToPositionData, MoveToPositionErrors, MoveToPositionResponses, NewProjectData, NewProjectErrors, NewProjectResponses, OverrideMotorAngleData, OverrideMotorAngleErrors, OverrideMotorAngleResponses, PauseFocusStackingData, PauseFocusStackingErrors, PauseFocusStackingResponses, PauseScanData, PauseScanErrors, PauseScanResponses, PauseTaskData, PauseTaskErrors, PauseTaskResponses, RebootData, RebootErrors, RebootResponses, ReinitializeHardwareData, ReinitializeHardwareErrors, ReinitializeHardwareResponses, ReplaceCameraNameSettingsData, ReplaceCameraNameSettingsErrors, ReplaceCameraNameSettingsResponses, ReplaceLightNameSettingsData, ReplaceLightNameSettingsErrors, ReplaceLightNameSettingsResponses, ReplaceMotorNameSettingsData, ReplaceMotorNameSettingsErrors, ReplaceMotorNameSettingsResponses, ReplaceSettingsData, ReplaceSettingsErrors, ReplaceSettingsResponses, ResetCloudProjectData, ResetCloudProjectErrors, ResetCloudProjectResponses, RestartApplicationData, RestartApplicationErrors, RestartApplicationResponses, RestartCameraData, RestartCameraErrors, RestartCameraResponses, ResumeFocusStackingData, ResumeFocusStackingErrors, ResumeFocusStackingResponses, ResumeScanData, ResumeScanErrors, ResumeScanResponses, ResumeTaskData, ResumeTaskErrors, ResumeTaskResponses, SaveDeviceConfigData, SaveDeviceConfigErrors, SaveDeviceConfigResponses, SetConfigFileData, SetConfigFileErrors, SetConfigFileResponses, SetPinData, SetPinErrors, SetPinResponses, ShutdownData, ShutdownErrors, ShutdownResponses, StartFocusStackingData, StartFocusStackingErrors, StartFocusStackingResponses, StartQrScanData, StartQrScanErrors, StartQrScanResponses, TailLogsData, TailLogsErrors, TailLogsResponses, ToggleLightData, ToggleLightErrors, ToggleLightResponses, TogglePinData, TogglePinErrors, TogglePinResponses, TurnOffLightData, TurnOffLightErrors, TurnOffLightResponses, TurnOnLightData, TurnOnLightErrors, TurnOnLightResponses, UpdateCameraNameSettingsData, UpdateCameraNameSettingsErrors, UpdateCameraNameSettingsResponses, UpdateCloudSettingsData, UpdateCloudSettingsErrors, UpdateCloudSettingsResponses, UpdateLightNameSettingsData, UpdateLightNameSettingsErrors, UpdateLightNameSettingsResponses, UpdateMotorNameSettingsData, UpdateMotorNameSettingsErrors, UpdateMotorNameSettingsResponses, UpdateSettingData, UpdateSettingErrors, UpdateSettingResponses, UploadProjectToCloudData, UploadProjectToCloudErrors, UploadProjectToCloudResponses, WakeupDeviceData, WakeupDeviceErrors, WakeupDeviceResponses } from './types.gen'; +import type { AddConfigJsonData, AddConfigJsonErrors, AddConfigJsonResponses, AddScanWithDescriptionData, AddScanWithDescriptionErrors, AddScanWithDescriptionResponses, ApplyUpdatesData, ApplyUpdatesErrors, ApplyUpdatesResponses, AutoCalibrateAwbData, AutoCalibrateAwbErrors, AutoCalibrateAwbResponses, CancelFocusStackingData, CancelFocusStackingErrors, CancelFocusStackingResponses, CancelScanData, CancelScanErrors, CancelScanResponses, CancelTaskData, CancelTaskErrors, CancelTaskResponses, CheckForUpdatesData, CheckForUpdatesErrors, CheckForUpdatesResponses, CreateTaskData, CreateTaskErrors, CreateTaskResponses, CropImageData, CropImageErrors, CropImageResponses, DeleteCloudSettingsData, DeleteCloudSettingsErrors, DeleteCloudSettingsResponses, DeletePhotosData, DeletePhotosErrors, DeletePhotosResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponses, DeleteScanData, DeleteScanErrors, DeleteScanResponses, DeleteTaskData, DeleteTaskErrors, DeleteTaskResponses, DownloadLogsArchiveData, DownloadLogsArchiveErrors, DownloadLogsArchiveResponses, DownloadProjectData, DownloadProjectErrors, DownloadProjectFromCloudData, DownloadProjectFromCloudErrors, DownloadProjectFromCloudResponses, DownloadProjectModelData, DownloadProjectModelErrors, DownloadProjectModelResponses, DownloadProjectResponses, DownloadScansData, DownloadScansErrors, DownloadScansResponses, GetAllTasksData, GetAllTasksErrors, GetAllTasksResponses, GetCameraData, GetCameraErrors, GetCameraNameSettingsData, GetCameraNameSettingsErrors, GetCameraNameSettingsResponses, GetCameraReportData, GetCameraReportErrors, GetCameraReportResponses, GetCameraResponses, GetCamerasData, GetCamerasErrors, GetCamerasResponses, GetCloudProjectData, GetCloudProjectErrors, GetCloudProjectResponses, GetCloudSettingsData, GetCloudSettingsErrors, GetCloudSettingsResponses, GetCloudStatusData, GetCloudStatusErrors, GetCloudStatusResponses, GetConfigFileData, GetConfigFileErrors, GetConfigFileResponses, GetCurrentConfigData, GetCurrentConfigErrors, GetCurrentConfigResponses, GetDeviceInfoData, GetDeviceInfoErrors, GetDeviceInfoResponses, GetLightData, GetLightErrors, GetLightNameSettingsData, GetLightNameSettingsErrors, GetLightNameSettingsResponses, GetLightResponses, GetLightsData, GetLightsErrors, GetLightsResponses, GetMotorData, GetMotorErrors, GetMotorNameSettingsData, GetMotorNameSettingsErrors, GetMotorNameSettingsResponses, GetMotorResponses, GetMotorsData, GetMotorsErrors, GetMotorsResponses, GetPathData, GetPathErrors, GetPathResponses, GetPhotoData, GetPhotoErrors, GetPhotoPayloadData, GetPhotoPayloadErrors, GetPhotoPayloadResponses, GetPhotoResponses, GetPinData, GetPinErrors, GetPinResponses, GetPinsData, GetPinsErrors, GetPinsResponses, GetPreviewData, GetPreviewErrors, GetPreviewResponses, GetProjectData, GetProjectErrors, GetProjectResponses, GetProjectsData, GetProjectsErrors, GetProjectsResponses, GetProjectThumbnailData, GetProjectThumbnailErrors, GetProjectThumbnailResponses, GetScanData, GetScanErrors, GetScanPathData, GetScanPathErrors, GetScanPathResponses, GetScanPhotoData, GetScanPhotoErrors, GetScanPhotoResponses, GetScanResponses, GetScanStatusData, GetScanStatusErrors, GetScanStatusResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponses, GetSoftwareInfoData, GetSoftwareInfoErrors, GetSoftwareInfoResponses, GetTaskStatusData, GetTaskStatusErrors, GetTaskStatusResponses, GetUpdateStatusData, GetUpdateStatusErrors, GetUpdateStatusResponses, HelloWorldAsyncData, HelloWorldAsyncErrors, HelloWorldAsyncResponses, ListCloudProjectsData, ListCloudProjectsErrors, ListCloudProjectsResponses, ListConfigFilesData, ListConfigFilesErrors, ListConfigFilesResponses, MotorEndstopCalibrationData, MotorEndstopCalibrationErrors, MotorEndstopCalibrationResponses, MotorMoveHomeData, MotorMoveHomeErrors, MotorMoveHomeResponses, MoveMotorByDegreeData, MoveMotorByDegreeErrors, MoveMotorByDegreeResponses, MoveMotorToAngleData, MoveMotorToAngleErrors, MoveMotorToAngleResponses, MoveToPositionData, MoveToPositionErrors, MoveToPositionResponses, NewProjectData, NewProjectErrors, NewProjectResponses, OverrideMotorAngleData, OverrideMotorAngleErrors, OverrideMotorAngleResponses, PauseFocusStackingData, PauseFocusStackingErrors, PauseFocusStackingResponses, PauseScanData, PauseScanErrors, PauseScanResponses, PauseTaskData, PauseTaskErrors, PauseTaskResponses, RebootData, RebootErrors, RebootResponses, ReinitializeHardwareData, ReinitializeHardwareErrors, ReinitializeHardwareResponses, RepairOpenscan3Data, RepairOpenscan3Errors, RepairOpenscan3Responses, ReplaceCameraNameSettingsData, ReplaceCameraNameSettingsErrors, ReplaceCameraNameSettingsResponses, ReplaceLightNameSettingsData, ReplaceLightNameSettingsErrors, ReplaceLightNameSettingsResponses, ReplaceMotorNameSettingsData, ReplaceMotorNameSettingsErrors, ReplaceMotorNameSettingsResponses, ReplaceSettingsData, ReplaceSettingsErrors, ReplaceSettingsResponses, ResetCloudProjectData, ResetCloudProjectErrors, ResetCloudProjectResponses, RestartApplicationData, RestartApplicationErrors, RestartApplicationResponses, RestartCameraData, RestartCameraErrors, RestartCameraResponses, ResumeFocusStackingData, ResumeFocusStackingErrors, ResumeFocusStackingResponses, ResumeScanData, ResumeScanErrors, ResumeScanResponses, ResumeTaskData, ResumeTaskErrors, ResumeTaskResponses, SaveDeviceConfigData, SaveDeviceConfigErrors, SaveDeviceConfigResponses, SetConfigFileData, SetConfigFileErrors, SetConfigFileResponses, SetPinData, SetPinErrors, SetPinResponses, ShutdownData, ShutdownErrors, ShutdownResponses, StartFocusStackingData, StartFocusStackingErrors, StartFocusStackingResponses, StartQrScanData, StartQrScanErrors, StartQrScanResponses, TailLogsData, TailLogsErrors, TailLogsResponses, ToggleLightData, ToggleLightErrors, ToggleLightResponses, TogglePinData, TogglePinErrors, TogglePinResponses, TurnOffLightData, TurnOffLightErrors, TurnOffLightResponses, TurnOnLightData, TurnOnLightErrors, TurnOnLightResponses, UpdateCameraNameSettingsData, UpdateCameraNameSettingsErrors, UpdateCameraNameSettingsResponses, UpdateCloudSettingsData, UpdateCloudSettingsErrors, UpdateCloudSettingsResponses, UpdateLightNameSettingsData, UpdateLightNameSettingsErrors, UpdateLightNameSettingsResponses, UpdateMotorNameSettingsData, UpdateMotorNameSettingsErrors, UpdateMotorNameSettingsResponses, UpdateSettingData, UpdateSettingErrors, UpdateSettingResponses, UploadProjectToCloudData, UploadProjectToCloudErrors, UploadProjectToCloudResponses, WakeupDeviceData, WakeupDeviceErrors, WakeupDeviceResponses } from './types.gen'; export type Options = Options2 & { /** @@ -538,6 +538,42 @@ export const updateSetting = (options: Opt } }); +/** + * Get Update Status + */ +export const getUpdateStatus = (options?: Options) => (options?.client ?? client).get({ + responseType: 'json', + url: '/system/update/status', + ...options +}); + +/** + * Check For Updates + */ +export const checkForUpdates = (options?: Options) => (options?.client ?? client).post({ + responseType: 'json', + url: '/system/update/check', + ...options +}); + +/** + * Apply Updates + */ +export const applyUpdates = (options?: Options) => (options?.client ?? client).post({ + responseType: 'json', + url: '/system/update/apply', + ...options +}); + +/** + * Repair Openscan3 + */ +export const repairOpenscan3 = (options?: Options) => (options?.client ?? client).post({ + responseType: 'json', + url: '/system/repair/openscan3', + ...options +}); + /** * Get Projects * @@ -1332,7 +1368,7 @@ export const cropImage = (options: Options /** * Hello World Async * - * Start the async hello world demo task. + * Start the async hello world progress demo task. */ export const helloWorldAsync = (options: Options) => (options.client ?? client).post({ responseType: 'json', diff --git a/app/src/generated/api/types.gen.ts b/app/src/generated/api/types.gen.ts index a111c53..700c8e0 100644 --- a/app/src/generated/api/types.gen.ts +++ b/app/src/generated/api/types.gen.ts @@ -785,6 +785,44 @@ export type MotorStatusResponse = { endstop: EndstopStatusResponse | null; }; +/** + * OpenScanUpdatePackage + * + * One optional OpenScan component update for the details view. + */ +export type OpenScanUpdatePackage = { + /** + * Id + */ + id: 'firmware' | 'client' | 'updater' | 'system_config' | 'camera_stack'; + /** + * Installed Version + */ + installed_version: string | null; + /** + * Available Version + */ + available_version: string | null; + /** + * Update Available + */ + update_available: boolean; +}; + +/** + * OpenScanUpdateSummary + */ +export type OpenScanUpdateSummary = { + /** + * Updates Available + */ + updates_available: boolean; + /** + * Packages + */ + packages: Array; +}; + /** * PathMethod */ @@ -1225,6 +1263,24 @@ export type StackingTaskStatus = { status?: TaskStatus | null; }; +/** + * SystemUpdateSummary + */ +export type SystemUpdateSummary = { + /** + * Updates Available + */ + updates_available: boolean; + /** + * Count + */ + count: number; + /** + * Reboot Required After Install + */ + reboot_required_after_install: boolean; +}; + /** * Task * @@ -1357,6 +1413,52 @@ export type TriggerConfig = { pulse_width_ms?: number; }; +/** + * UpdateInstallResponse + * + * Result of a synchronous user-requested update installation. + */ +export type UpdateInstallResponse = { + /** + * Status + */ + status: 'completed' | 'install_failed' | 'install_blocked'; + /** + * Reboot Required + */ + reboot_required: boolean; +}; + +/** + * UpdateStatusResponse + * + * Cached, user-facing software update status. + */ +export type UpdateStatusResponse = { + /** + * Status + */ + status: 'unknown' | 'up_to_date' | 'updates_available' | 'status_unavailable' | 'check_failed'; + /** + * Checked At + */ + checked_at: string | null; + /** + * Stale + */ + stale: boolean; + /** + * Release Channel + */ + release_channel: 'stable' | 'nightly' | 'unknown'; + openscan: OpenScanUpdateSummary; + system: SystemUpdateSummary; + /** + * Reboot Required + */ + reboot_required: boolean; +}; + /** * ValidationError */ @@ -2440,6 +2542,96 @@ export type UpdateSettingResponses = { export type UpdateSettingResponse = UpdateSettingResponses[keyof UpdateSettingResponses]; +export type GetUpdateStatusData = { + body?: never; + path?: never; + query?: never; + url: '/system/update/status'; +}; + +export type GetUpdateStatusErrors = { + /** + * Not found + */ + 404: unknown; +}; + +export type GetUpdateStatusResponses = { + /** + * Successful Response + */ + 200: UpdateStatusResponse; +}; + +export type GetUpdateStatusResponse = GetUpdateStatusResponses[keyof GetUpdateStatusResponses]; + +export type CheckForUpdatesData = { + body?: never; + path?: never; + query?: never; + url: '/system/update/check'; +}; + +export type CheckForUpdatesErrors = { + /** + * Not found + */ + 404: unknown; +}; + +export type CheckForUpdatesResponses = { + /** + * Successful Response + */ + 200: UpdateStatusResponse; +}; + +export type CheckForUpdatesResponse = CheckForUpdatesResponses[keyof CheckForUpdatesResponses]; + +export type ApplyUpdatesData = { + body?: never; + path?: never; + query?: never; + url: '/system/update/apply'; +}; + +export type ApplyUpdatesErrors = { + /** + * Not found + */ + 404: unknown; +}; + +export type ApplyUpdatesResponses = { + /** + * Successful Response + */ + 200: UpdateInstallResponse; +}; + +export type ApplyUpdatesResponse = ApplyUpdatesResponses[keyof ApplyUpdatesResponses]; + +export type RepairOpenscan3Data = { + body?: never; + path?: never; + query?: never; + url: '/system/repair/openscan3'; +}; + +export type RepairOpenscan3Errors = { + /** + * Not found + */ + 404: unknown; +}; + +export type RepairOpenscan3Responses = { + /** + * Successful Response + */ + 200: unknown; +}; + export type GetProjectsData = { body?: never; path?: never; @@ -4003,6 +4195,12 @@ export type GetCameraReportData = { * Format */ format?: 'json' | 'text'; + /** + * Release Cameras + * + * Temporarily release OpenScan camera controllers so rpicam/libcamera probes can acquire cameras. + */ + release_cameras?: boolean; }; url: '/develop/camera-report'; }; diff --git a/app/src/generated/api/v0_8/sdk.gen.ts b/app/src/generated/api/v0_8/sdk.gen.ts index 63eb5c4..1929c84 100644 --- a/app/src/generated/api/v0_8/sdk.gen.ts +++ b/app/src/generated/api/v0_8/sdk.gen.ts @@ -1249,7 +1249,7 @@ export const cropImage = (options: Options /** * Hello World Async * - * Start the async hello world demo task. + * Start the async hello world progress demo task. */ export const helloWorldAsync = (options: Options) => (options.client ?? client).post({ responseType: 'json', diff --git a/app/src/generated/api/v0_9/sdk.gen.ts b/app/src/generated/api/v0_9/sdk.gen.ts index d4e5b58..4588f05 100644 --- a/app/src/generated/api/v0_9/sdk.gen.ts +++ b/app/src/generated/api/v0_9/sdk.gen.ts @@ -2,7 +2,7 @@ import type { Client, Options as Options2, TDataShape } from './client'; import { client } from './client.gen'; -import type { AddConfigJsonData, AddConfigJsonErrors, AddConfigJsonResponses, AddScanWithDescriptionData, AddScanWithDescriptionErrors, AddScanWithDescriptionResponses, AutoCalibrateAwbData, AutoCalibrateAwbErrors, AutoCalibrateAwbResponses, CancelFocusStackingData, CancelFocusStackingErrors, CancelFocusStackingResponses, CancelScanData, CancelScanErrors, CancelScanResponses, CancelTaskData, CancelTaskErrors, CancelTaskResponses, CreateTaskData, CreateTaskErrors, CreateTaskResponses, CropImageData, CropImageErrors, CropImageResponses, DeleteCloudSettingsData, DeleteCloudSettingsErrors, DeleteCloudSettingsResponses, DeletePhotosData, DeletePhotosErrors, DeletePhotosResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponses, DeleteScanData, DeleteScanErrors, DeleteScanResponses, DeleteTaskData, DeleteTaskErrors, DeleteTaskResponses, DownloadLogsArchiveData, DownloadLogsArchiveErrors, DownloadLogsArchiveResponses, DownloadProjectData, DownloadProjectErrors, DownloadProjectFromCloudData, DownloadProjectFromCloudErrors, DownloadProjectFromCloudResponses, DownloadProjectModelData, DownloadProjectModelErrors, DownloadProjectModelResponses, DownloadProjectResponses, DownloadScansData, DownloadScansErrors, DownloadScansResponses, GetAllTasksData, GetAllTasksErrors, GetAllTasksResponses, GetCameraData, GetCameraErrors, GetCameraNameSettingsData, GetCameraNameSettingsErrors, GetCameraNameSettingsResponses, GetCameraReportData, GetCameraReportErrors, GetCameraReportResponses, GetCameraResponses, GetCamerasData, GetCamerasErrors, GetCamerasResponses, GetCloudProjectData, GetCloudProjectErrors, GetCloudProjectResponses, GetCloudSettingsData, GetCloudSettingsErrors, GetCloudSettingsResponses, GetCloudStatusData, GetCloudStatusErrors, GetCloudStatusResponses, GetConfigFileData, GetConfigFileErrors, GetConfigFileResponses, GetCurrentConfigData, GetCurrentConfigErrors, GetCurrentConfigResponses, GetDeviceInfoData, GetDeviceInfoErrors, GetDeviceInfoResponses, GetLightData, GetLightErrors, GetLightNameSettingsData, GetLightNameSettingsErrors, GetLightNameSettingsResponses, GetLightResponses, GetLightsData, GetLightsErrors, GetLightsResponses, GetMotorData, GetMotorErrors, GetMotorNameSettingsData, GetMotorNameSettingsErrors, GetMotorNameSettingsResponses, GetMotorResponses, GetMotorsData, GetMotorsErrors, GetMotorsResponses, GetPathData, GetPathErrors, GetPathResponses, GetPhotoData, GetPhotoErrors, GetPhotoPayloadData, GetPhotoPayloadErrors, GetPhotoPayloadResponses, GetPhotoResponses, GetPinData, GetPinErrors, GetPinResponses, GetPinsData, GetPinsErrors, GetPinsResponses, GetPreviewData, GetPreviewErrors, GetPreviewResponses, GetProjectData, GetProjectErrors, GetProjectResponses, GetProjectsData, GetProjectsErrors, GetProjectsResponses, GetProjectThumbnailData, GetProjectThumbnailErrors, GetProjectThumbnailResponses, GetScanData, GetScanErrors, GetScanPathData, GetScanPathErrors, GetScanPathResponses, GetScanPhotoData, GetScanPhotoErrors, GetScanPhotoResponses, GetScanResponses, GetScanStatusData, GetScanStatusErrors, GetScanStatusResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponses, GetSoftwareInfoData, GetSoftwareInfoErrors, GetSoftwareInfoResponses, GetTaskStatusData, GetTaskStatusErrors, GetTaskStatusResponses, HelloWorldAsyncData, HelloWorldAsyncErrors, HelloWorldAsyncResponses, ListCloudProjectsData, ListCloudProjectsErrors, ListCloudProjectsResponses, ListConfigFilesData, ListConfigFilesErrors, ListConfigFilesResponses, MotorEndstopCalibrationData, MotorEndstopCalibrationErrors, MotorEndstopCalibrationResponses, MotorMoveHomeData, MotorMoveHomeErrors, MotorMoveHomeResponses, MoveMotorByDegreeData, MoveMotorByDegreeErrors, MoveMotorByDegreeResponses, MoveMotorToAngleData, MoveMotorToAngleErrors, MoveMotorToAngleResponses, MoveToPositionData, MoveToPositionErrors, MoveToPositionResponses, NewProjectData, NewProjectErrors, NewProjectResponses, OverrideMotorAngleData, OverrideMotorAngleErrors, OverrideMotorAngleResponses, PauseFocusStackingData, PauseFocusStackingErrors, PauseFocusStackingResponses, PauseScanData, PauseScanErrors, PauseScanResponses, PauseTaskData, PauseTaskErrors, PauseTaskResponses, RebootData, RebootErrors, RebootResponses, ReinitializeHardwareData, ReinitializeHardwareErrors, ReinitializeHardwareResponses, ReplaceCameraNameSettingsData, ReplaceCameraNameSettingsErrors, ReplaceCameraNameSettingsResponses, ReplaceLightNameSettingsData, ReplaceLightNameSettingsErrors, ReplaceLightNameSettingsResponses, ReplaceMotorNameSettingsData, ReplaceMotorNameSettingsErrors, ReplaceMotorNameSettingsResponses, ReplaceSettingsData, ReplaceSettingsErrors, ReplaceSettingsResponses, ResetCloudProjectData, ResetCloudProjectErrors, ResetCloudProjectResponses, RestartApplicationData, RestartApplicationErrors, RestartApplicationResponses, RestartCameraData, RestartCameraErrors, RestartCameraResponses, ResumeFocusStackingData, ResumeFocusStackingErrors, ResumeFocusStackingResponses, ResumeScanData, ResumeScanErrors, ResumeScanResponses, ResumeTaskData, ResumeTaskErrors, ResumeTaskResponses, SaveDeviceConfigData, SaveDeviceConfigErrors, SaveDeviceConfigResponses, SetConfigFileData, SetConfigFileErrors, SetConfigFileResponses, SetPinData, SetPinErrors, SetPinResponses, ShutdownData, ShutdownErrors, ShutdownResponses, StartFocusStackingData, StartFocusStackingErrors, StartFocusStackingResponses, StartQrScanData, StartQrScanErrors, StartQrScanResponses, TailLogsData, TailLogsErrors, TailLogsResponses, ToggleLightData, ToggleLightErrors, ToggleLightResponses, TogglePinData, TogglePinErrors, TogglePinResponses, TurnOffLightData, TurnOffLightErrors, TurnOffLightResponses, TurnOnLightData, TurnOnLightErrors, TurnOnLightResponses, UpdateCameraNameSettingsData, UpdateCameraNameSettingsErrors, UpdateCameraNameSettingsResponses, UpdateCloudSettingsData, UpdateCloudSettingsErrors, UpdateCloudSettingsResponses, UpdateLightNameSettingsData, UpdateLightNameSettingsErrors, UpdateLightNameSettingsResponses, UpdateMotorNameSettingsData, UpdateMotorNameSettingsErrors, UpdateMotorNameSettingsResponses, UpdateSettingData, UpdateSettingErrors, UpdateSettingResponses, UploadProjectToCloudData, UploadProjectToCloudErrors, UploadProjectToCloudResponses, WakeupDeviceData, WakeupDeviceErrors, WakeupDeviceResponses } from './types.gen'; +import type { AddConfigJsonData, AddConfigJsonErrors, AddConfigJsonResponses, AddScanWithDescriptionData, AddScanWithDescriptionErrors, AddScanWithDescriptionResponses, ApplyUpdatesData, ApplyUpdatesErrors, ApplyUpdatesResponses, AutoCalibrateAwbData, AutoCalibrateAwbErrors, AutoCalibrateAwbResponses, CancelFocusStackingData, CancelFocusStackingErrors, CancelFocusStackingResponses, CancelScanData, CancelScanErrors, CancelScanResponses, CancelTaskData, CancelTaskErrors, CancelTaskResponses, CheckForUpdatesData, CheckForUpdatesErrors, CheckForUpdatesResponses, CreateTaskData, CreateTaskErrors, CreateTaskResponses, CropImageData, CropImageErrors, CropImageResponses, DeleteCloudSettingsData, DeleteCloudSettingsErrors, DeleteCloudSettingsResponses, DeletePhotosData, DeletePhotosErrors, DeletePhotosResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponses, DeleteScanData, DeleteScanErrors, DeleteScanResponses, DeleteTaskData, DeleteTaskErrors, DeleteTaskResponses, DownloadLogsArchiveData, DownloadLogsArchiveErrors, DownloadLogsArchiveResponses, DownloadProjectData, DownloadProjectErrors, DownloadProjectFromCloudData, DownloadProjectFromCloudErrors, DownloadProjectFromCloudResponses, DownloadProjectModelData, DownloadProjectModelErrors, DownloadProjectModelResponses, DownloadProjectResponses, DownloadScansData, DownloadScansErrors, DownloadScansResponses, GetAllTasksData, GetAllTasksErrors, GetAllTasksResponses, GetCameraData, GetCameraErrors, GetCameraNameSettingsData, GetCameraNameSettingsErrors, GetCameraNameSettingsResponses, GetCameraReportData, GetCameraReportErrors, GetCameraReportResponses, GetCameraResponses, GetCamerasData, GetCamerasErrors, GetCamerasResponses, GetCloudProjectData, GetCloudProjectErrors, GetCloudProjectResponses, GetCloudSettingsData, GetCloudSettingsErrors, GetCloudSettingsResponses, GetCloudStatusData, GetCloudStatusErrors, GetCloudStatusResponses, GetConfigFileData, GetConfigFileErrors, GetConfigFileResponses, GetCurrentConfigData, GetCurrentConfigErrors, GetCurrentConfigResponses, GetDeviceInfoData, GetDeviceInfoErrors, GetDeviceInfoResponses, GetLightData, GetLightErrors, GetLightNameSettingsData, GetLightNameSettingsErrors, GetLightNameSettingsResponses, GetLightResponses, GetLightsData, GetLightsErrors, GetLightsResponses, GetMotorData, GetMotorErrors, GetMotorNameSettingsData, GetMotorNameSettingsErrors, GetMotorNameSettingsResponses, GetMotorResponses, GetMotorsData, GetMotorsErrors, GetMotorsResponses, GetPathData, GetPathErrors, GetPathResponses, GetPhotoData, GetPhotoErrors, GetPhotoPayloadData, GetPhotoPayloadErrors, GetPhotoPayloadResponses, GetPhotoResponses, GetPinData, GetPinErrors, GetPinResponses, GetPinsData, GetPinsErrors, GetPinsResponses, GetPreviewData, GetPreviewErrors, GetPreviewResponses, GetProjectData, GetProjectErrors, GetProjectResponses, GetProjectsData, GetProjectsErrors, GetProjectsResponses, GetProjectThumbnailData, GetProjectThumbnailErrors, GetProjectThumbnailResponses, GetScanData, GetScanErrors, GetScanPathData, GetScanPathErrors, GetScanPathResponses, GetScanPhotoData, GetScanPhotoErrors, GetScanPhotoResponses, GetScanResponses, GetScanStatusData, GetScanStatusErrors, GetScanStatusResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponses, GetSoftwareInfoData, GetSoftwareInfoErrors, GetSoftwareInfoResponses, GetTaskStatusData, GetTaskStatusErrors, GetTaskStatusResponses, GetUpdateStatusData, GetUpdateStatusErrors, GetUpdateStatusResponses, HelloWorldAsyncData, HelloWorldAsyncErrors, HelloWorldAsyncResponses, ListCloudProjectsData, ListCloudProjectsErrors, ListCloudProjectsResponses, ListConfigFilesData, ListConfigFilesErrors, ListConfigFilesResponses, MotorEndstopCalibrationData, MotorEndstopCalibrationErrors, MotorEndstopCalibrationResponses, MotorMoveHomeData, MotorMoveHomeErrors, MotorMoveHomeResponses, MoveMotorByDegreeData, MoveMotorByDegreeErrors, MoveMotorByDegreeResponses, MoveMotorToAngleData, MoveMotorToAngleErrors, MoveMotorToAngleResponses, MoveToPositionData, MoveToPositionErrors, MoveToPositionResponses, NewProjectData, NewProjectErrors, NewProjectResponses, OverrideMotorAngleData, OverrideMotorAngleErrors, OverrideMotorAngleResponses, PauseFocusStackingData, PauseFocusStackingErrors, PauseFocusStackingResponses, PauseScanData, PauseScanErrors, PauseScanResponses, PauseTaskData, PauseTaskErrors, PauseTaskResponses, RebootData, RebootErrors, RebootResponses, ReinitializeHardwareData, ReinitializeHardwareErrors, ReinitializeHardwareResponses, RepairOpenscan3Data, RepairOpenscan3Errors, RepairOpenscan3Responses, ReplaceCameraNameSettingsData, ReplaceCameraNameSettingsErrors, ReplaceCameraNameSettingsResponses, ReplaceLightNameSettingsData, ReplaceLightNameSettingsErrors, ReplaceLightNameSettingsResponses, ReplaceMotorNameSettingsData, ReplaceMotorNameSettingsErrors, ReplaceMotorNameSettingsResponses, ReplaceSettingsData, ReplaceSettingsErrors, ReplaceSettingsResponses, ResetCloudProjectData, ResetCloudProjectErrors, ResetCloudProjectResponses, RestartApplicationData, RestartApplicationErrors, RestartApplicationResponses, RestartCameraData, RestartCameraErrors, RestartCameraResponses, ResumeFocusStackingData, ResumeFocusStackingErrors, ResumeFocusStackingResponses, ResumeScanData, ResumeScanErrors, ResumeScanResponses, ResumeTaskData, ResumeTaskErrors, ResumeTaskResponses, SaveDeviceConfigData, SaveDeviceConfigErrors, SaveDeviceConfigResponses, SetConfigFileData, SetConfigFileErrors, SetConfigFileResponses, SetPinData, SetPinErrors, SetPinResponses, ShutdownData, ShutdownErrors, ShutdownResponses, StartFocusStackingData, StartFocusStackingErrors, StartFocusStackingResponses, StartQrScanData, StartQrScanErrors, StartQrScanResponses, TailLogsData, TailLogsErrors, TailLogsResponses, ToggleLightData, ToggleLightErrors, ToggleLightResponses, TogglePinData, TogglePinErrors, TogglePinResponses, TurnOffLightData, TurnOffLightErrors, TurnOffLightResponses, TurnOnLightData, TurnOnLightErrors, TurnOnLightResponses, UpdateCameraNameSettingsData, UpdateCameraNameSettingsErrors, UpdateCameraNameSettingsResponses, UpdateCloudSettingsData, UpdateCloudSettingsErrors, UpdateCloudSettingsResponses, UpdateLightNameSettingsData, UpdateLightNameSettingsErrors, UpdateLightNameSettingsResponses, UpdateMotorNameSettingsData, UpdateMotorNameSettingsErrors, UpdateMotorNameSettingsResponses, UpdateSettingData, UpdateSettingErrors, UpdateSettingResponses, UploadProjectToCloudData, UploadProjectToCloudErrors, UploadProjectToCloudResponses, WakeupDeviceData, WakeupDeviceErrors, WakeupDeviceResponses } from './types.gen'; export type Options = Options2 & { /** @@ -538,6 +538,42 @@ export const updateSetting = (options: Opt } }); +/** + * Get Update Status + */ +export const getUpdateStatus = (options?: Options) => (options?.client ?? client).get({ + responseType: 'json', + url: '/system/update/status', + ...options +}); + +/** + * Check For Updates + */ +export const checkForUpdates = (options?: Options) => (options?.client ?? client).post({ + responseType: 'json', + url: '/system/update/check', + ...options +}); + +/** + * Apply Updates + */ +export const applyUpdates = (options?: Options) => (options?.client ?? client).post({ + responseType: 'json', + url: '/system/update/apply', + ...options +}); + +/** + * Repair Openscan3 + */ +export const repairOpenscan3 = (options?: Options) => (options?.client ?? client).post({ + responseType: 'json', + url: '/system/repair/openscan3', + ...options +}); + /** * Get Projects * @@ -1332,7 +1368,7 @@ export const cropImage = (options: Options /** * Hello World Async * - * Start the async hello world demo task. + * Start the async hello world progress demo task. */ export const helloWorldAsync = (options: Options) => (options.client ?? client).post({ responseType: 'json', diff --git a/app/src/generated/api/v0_9/types.gen.ts b/app/src/generated/api/v0_9/types.gen.ts index a111c53..700c8e0 100644 --- a/app/src/generated/api/v0_9/types.gen.ts +++ b/app/src/generated/api/v0_9/types.gen.ts @@ -785,6 +785,44 @@ export type MotorStatusResponse = { endstop: EndstopStatusResponse | null; }; +/** + * OpenScanUpdatePackage + * + * One optional OpenScan component update for the details view. + */ +export type OpenScanUpdatePackage = { + /** + * Id + */ + id: 'firmware' | 'client' | 'updater' | 'system_config' | 'camera_stack'; + /** + * Installed Version + */ + installed_version: string | null; + /** + * Available Version + */ + available_version: string | null; + /** + * Update Available + */ + update_available: boolean; +}; + +/** + * OpenScanUpdateSummary + */ +export type OpenScanUpdateSummary = { + /** + * Updates Available + */ + updates_available: boolean; + /** + * Packages + */ + packages: Array; +}; + /** * PathMethod */ @@ -1225,6 +1263,24 @@ export type StackingTaskStatus = { status?: TaskStatus | null; }; +/** + * SystemUpdateSummary + */ +export type SystemUpdateSummary = { + /** + * Updates Available + */ + updates_available: boolean; + /** + * Count + */ + count: number; + /** + * Reboot Required After Install + */ + reboot_required_after_install: boolean; +}; + /** * Task * @@ -1357,6 +1413,52 @@ export type TriggerConfig = { pulse_width_ms?: number; }; +/** + * UpdateInstallResponse + * + * Result of a synchronous user-requested update installation. + */ +export type UpdateInstallResponse = { + /** + * Status + */ + status: 'completed' | 'install_failed' | 'install_blocked'; + /** + * Reboot Required + */ + reboot_required: boolean; +}; + +/** + * UpdateStatusResponse + * + * Cached, user-facing software update status. + */ +export type UpdateStatusResponse = { + /** + * Status + */ + status: 'unknown' | 'up_to_date' | 'updates_available' | 'status_unavailable' | 'check_failed'; + /** + * Checked At + */ + checked_at: string | null; + /** + * Stale + */ + stale: boolean; + /** + * Release Channel + */ + release_channel: 'stable' | 'nightly' | 'unknown'; + openscan: OpenScanUpdateSummary; + system: SystemUpdateSummary; + /** + * Reboot Required + */ + reboot_required: boolean; +}; + /** * ValidationError */ @@ -2440,6 +2542,96 @@ export type UpdateSettingResponses = { export type UpdateSettingResponse = UpdateSettingResponses[keyof UpdateSettingResponses]; +export type GetUpdateStatusData = { + body?: never; + path?: never; + query?: never; + url: '/system/update/status'; +}; + +export type GetUpdateStatusErrors = { + /** + * Not found + */ + 404: unknown; +}; + +export type GetUpdateStatusResponses = { + /** + * Successful Response + */ + 200: UpdateStatusResponse; +}; + +export type GetUpdateStatusResponse = GetUpdateStatusResponses[keyof GetUpdateStatusResponses]; + +export type CheckForUpdatesData = { + body?: never; + path?: never; + query?: never; + url: '/system/update/check'; +}; + +export type CheckForUpdatesErrors = { + /** + * Not found + */ + 404: unknown; +}; + +export type CheckForUpdatesResponses = { + /** + * Successful Response + */ + 200: UpdateStatusResponse; +}; + +export type CheckForUpdatesResponse = CheckForUpdatesResponses[keyof CheckForUpdatesResponses]; + +export type ApplyUpdatesData = { + body?: never; + path?: never; + query?: never; + url: '/system/update/apply'; +}; + +export type ApplyUpdatesErrors = { + /** + * Not found + */ + 404: unknown; +}; + +export type ApplyUpdatesResponses = { + /** + * Successful Response + */ + 200: UpdateInstallResponse; +}; + +export type ApplyUpdatesResponse = ApplyUpdatesResponses[keyof ApplyUpdatesResponses]; + +export type RepairOpenscan3Data = { + body?: never; + path?: never; + query?: never; + url: '/system/repair/openscan3'; +}; + +export type RepairOpenscan3Errors = { + /** + * Not found + */ + 404: unknown; +}; + +export type RepairOpenscan3Responses = { + /** + * Successful Response + */ + 200: unknown; +}; + export type GetProjectsData = { body?: never; path?: never; @@ -4003,6 +4195,12 @@ export type GetCameraReportData = { * Format */ format?: 'json' | 'text'; + /** + * Release Cameras + * + * Temporarily release OpenScan camera controllers so rpicam/libcamera probes can acquire cameras. + */ + release_cameras?: boolean; }; url: '/develop/camera-report'; }; diff --git a/app/src/layouts/MainLayout.vue b/app/src/layouts/MainLayout.vue index 079021b..426a211 100644 --- a/app/src/layouts/MainLayout.vue +++ b/app/src/layouts/MainLayout.vue @@ -45,20 +45,7 @@ - - - - - - Update - - Updates are unavailable - + @@ -103,23 +90,6 @@ - - - -
Stable release coming soon
- - -
- - OpenScan is moving from beta to its stable release. Updates are temporarily paused while we prepare the new version. - You can continue using your scanner as usual. Installing the stable release will require flashing a new system image. - We will provide instructions when it is ready. - - - - -
-
@@ -165,9 +135,16 @@ const upperLinks: EssentialLinkProps[] = [ }, ]; +const lowerLinks: EssentialLinkProps[] = [ + { + title: 'Update', + icon: 'system_update', + link: '/update' + } +] + const leftDrawerOpen = ref(true) const rightDrawerOpen = ref(false) -const updateInfoDialog = ref(false) const deviceStore = useDeviceStore() void deviceStore.ensureConnected() @@ -197,8 +174,4 @@ function toggleRightDrawer() { height: 40px; } -.update-link--paused { - opacity: 0.7; -} - diff --git a/app/src/pages/UpdatePage.vue b/app/src/pages/UpdatePage.vue new file mode 100644 index 0000000..d064d12 --- /dev/null +++ b/app/src/pages/UpdatePage.vue @@ -0,0 +1,565 @@ + + + + + diff --git a/app/src/router/routes.ts b/app/src/router/routes.ts index b3ccb72..59f0f39 100644 --- a/app/src/router/routes.ts +++ b/app/src/router/routes.ts @@ -10,6 +10,7 @@ const routes: RouteRecordRaw[] = [ { path: 'scan/progress/:taskId?', component: () => import('pages/ScanProgressPage.vue') }, { path: 'setup', component: () => import('pages/SetupPage.vue') }, { path: 'settings', component: () => import('pages/SettingsPage.vue') }, + { path: 'update', component: () => import('pages/UpdatePage.vue') }, { path: 'logs', component: () => import('pages/LogsPage.vue') }, { path: 'projects', component: () => import('pages/ProjectsPage.vue') }, { path: 'donate', component: () => import('pages/DonationPage.vue') }, diff --git a/openapi_latest.json b/openapi_latest.json index 57e1166..ceede64 100644 --- a/openapi_latest.json +++ b/openapi_latest.json @@ -1540,6 +1540,100 @@ } } }, + "/system/update/status": { + "get": { + "tags": [ + "system update" + ], + "summary": "Get Update Status", + "operationId": "get_update_status", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusResponse" + } + } + } + }, + "404": { + "description": "Not found" + } + } + } + }, + "/system/update/check": { + "post": { + "tags": [ + "system update" + ], + "summary": "Check For Updates", + "operationId": "check_for_updates", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusResponse" + } + } + } + }, + "404": { + "description": "Not found" + } + } + } + }, + "/system/update/apply": { + "post": { + "tags": [ + "system update" + ], + "summary": "Apply Updates", + "operationId": "apply_updates", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateInstallResponse" + } + } + } + }, + "404": { + "description": "Not found" + } + } + } + }, + "/system/repair/openscan3": { + "post": { + "tags": [ + "system repair" + ], + "summary": "Repair Openscan3", + "operationId": "repair_openscan3", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "404": { + "description": "Not found" + } + } + } + }, "/projects/": { "get": { "tags": [ @@ -3723,6 +3817,18 @@ "default": "json", "title": "Format" } + }, + { + "name": "release_cameras", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "description": "Temporarily release OpenScan camera controllers so rpicam/libcamera probes can acquire cameras.", + "default": true, + "title": "Release Cameras" + }, + "description": "Temporarily release OpenScan camera controllers so rpicam/libcamera probes can acquire cameras." } ], "responses": { @@ -3813,7 +3919,7 @@ "develop" ], "summary": "Hello World Async", - "description": "Start the async hello world demo task.", + "description": "Start the async hello world progress demo task.", "operationId": "hello_world_async", "parameters": [ { @@ -5703,6 +5809,77 @@ ], "title": "MotorStatusResponse" }, + "OpenScanUpdatePackage": { + "properties": { + "id": { + "type": "string", + "enum": [ + "firmware", + "client", + "updater", + "system_config", + "camera_stack" + ], + "title": "Id" + }, + "installed_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Installed Version" + }, + "available_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Available Version" + }, + "update_available": { + "type": "boolean", + "title": "Update Available" + } + }, + "type": "object", + "required": [ + "id", + "installed_version", + "available_version", + "update_available" + ], + "title": "OpenScanUpdatePackage", + "description": "One optional OpenScan component update for the details view." + }, + "OpenScanUpdateSummary": { + "properties": { + "updates_available": { + "type": "boolean", + "title": "Updates Available" + }, + "packages": { + "items": { + "$ref": "#/components/schemas/OpenScanUpdatePackage" + }, + "type": "array", + "title": "Packages" + } + }, + "type": "object", + "required": [ + "updates_available", + "packages" + ], + "title": "OpenScanUpdateSummary" + }, "PathMethod": { "type": "string", "enum": [ @@ -6400,6 +6577,29 @@ "type": "object", "title": "StackingTaskStatus" }, + "SystemUpdateSummary": { + "properties": { + "updates_available": { + "type": "boolean", + "title": "Updates Available" + }, + "count": { + "type": "integer", + "title": "Count" + }, + "reboot_required_after_install": { + "type": "boolean", + "title": "Reboot Required After Install" + } + }, + "type": "object", + "required": [ + "updates_available", + "count", + "reboot_required_after_install" + ], + "title": "SystemUpdateSummary" + }, "Task": { "properties": { "id": { @@ -6583,6 +6783,91 @@ ], "title": "TriggerConfig" }, + "UpdateInstallResponse": { + "properties": { + "status": { + "type": "string", + "enum": [ + "completed", + "install_failed", + "install_blocked" + ], + "title": "Status" + }, + "reboot_required": { + "type": "boolean", + "title": "Reboot Required" + } + }, + "type": "object", + "required": [ + "status", + "reboot_required" + ], + "title": "UpdateInstallResponse", + "description": "Result of a synchronous user-requested update installation." + }, + "UpdateStatusResponse": { + "properties": { + "status": { + "type": "string", + "enum": [ + "unknown", + "up_to_date", + "updates_available", + "status_unavailable", + "check_failed" + ], + "title": "Status" + }, + "checked_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Checked At" + }, + "stale": { + "type": "boolean", + "title": "Stale" + }, + "release_channel": { + "type": "string", + "enum": [ + "stable", + "nightly", + "unknown" + ], + "title": "Release Channel" + }, + "openscan": { + "$ref": "#/components/schemas/OpenScanUpdateSummary" + }, + "system": { + "$ref": "#/components/schemas/SystemUpdateSummary" + }, + "reboot_required": { + "type": "boolean", + "title": "Reboot Required" + } + }, + "type": "object", + "required": [ + "status", + "checked_at", + "stale", + "release_channel", + "openscan", + "system", + "reboot_required" + ], + "title": "UpdateStatusResponse", + "description": "Cached, user-facing software update status." + }, "ValidationError": { "properties": { "loc": { diff --git a/openapi_next.json b/openapi_next.json index 9a7c0a1..0fec19c 100644 --- a/openapi_next.json +++ b/openapi_next.json @@ -1599,6 +1599,100 @@ } } }, + "/system/update/status": { + "get": { + "tags": [ + "system update" + ], + "summary": "Get Update Status", + "operationId": "get_update_status", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusResponse" + } + } + } + }, + "404": { + "description": "Not found" + } + } + } + }, + "/system/update/check": { + "post": { + "tags": [ + "system update" + ], + "summary": "Check For Updates", + "operationId": "check_for_updates", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusResponse" + } + } + } + }, + "404": { + "description": "Not found" + } + } + } + }, + "/system/update/apply": { + "post": { + "tags": [ + "system update" + ], + "summary": "Apply Updates", + "operationId": "apply_updates", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateInstallResponse" + } + } + } + }, + "404": { + "description": "Not found" + } + } + } + }, + "/system/repair/openscan3": { + "post": { + "tags": [ + "system repair" + ], + "summary": "Repair Openscan3", + "operationId": "repair_openscan3", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "404": { + "description": "Not found" + } + } + } + }, "/projects/": { "get": { "tags": [ @@ -4373,6 +4467,18 @@ "default": "json", "title": "Format" } + }, + { + "name": "release_cameras", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "description": "Temporarily release OpenScan camera controllers so rpicam/libcamera probes can acquire cameras.", + "default": true, + "title": "Release Cameras" + }, + "description": "Temporarily release OpenScan camera controllers so rpicam/libcamera probes can acquire cameras." } ], "responses": { @@ -4463,7 +4569,7 @@ "develop" ], "summary": "Hello World Async", - "description": "Start the async hello world demo task.", + "description": "Start the async hello world progress demo task.", "operationId": "hello_world_async", "parameters": [ { @@ -6561,6 +6667,77 @@ ], "title": "MotorStatusResponse" }, + "OpenScanUpdatePackage": { + "properties": { + "id": { + "type": "string", + "enum": [ + "firmware", + "client", + "updater", + "system_config", + "camera_stack" + ], + "title": "Id" + }, + "installed_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Installed Version" + }, + "available_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Available Version" + }, + "update_available": { + "type": "boolean", + "title": "Update Available" + } + }, + "type": "object", + "required": [ + "id", + "installed_version", + "available_version", + "update_available" + ], + "title": "OpenScanUpdatePackage", + "description": "One optional OpenScan component update for the details view." + }, + "OpenScanUpdateSummary": { + "properties": { + "updates_available": { + "type": "boolean", + "title": "Updates Available" + }, + "packages": { + "items": { + "$ref": "#/components/schemas/OpenScanUpdatePackage" + }, + "type": "array", + "title": "Packages" + } + }, + "type": "object", + "required": [ + "updates_available", + "packages" + ], + "title": "OpenScanUpdateSummary" + }, "PathMethod": { "type": "string", "enum": [ @@ -7258,6 +7435,29 @@ "type": "object", "title": "StackingTaskStatus" }, + "SystemUpdateSummary": { + "properties": { + "updates_available": { + "type": "boolean", + "title": "Updates Available" + }, + "count": { + "type": "integer", + "title": "Count" + }, + "reboot_required_after_install": { + "type": "boolean", + "title": "Reboot Required After Install" + } + }, + "type": "object", + "required": [ + "updates_available", + "count", + "reboot_required_after_install" + ], + "title": "SystemUpdateSummary" + }, "Task": { "properties": { "id": { @@ -7548,6 +7748,91 @@ ], "title": "TriggerStatusResponse" }, + "UpdateInstallResponse": { + "properties": { + "status": { + "type": "string", + "enum": [ + "completed", + "install_failed", + "install_blocked" + ], + "title": "Status" + }, + "reboot_required": { + "type": "boolean", + "title": "Reboot Required" + } + }, + "type": "object", + "required": [ + "status", + "reboot_required" + ], + "title": "UpdateInstallResponse", + "description": "Result of a synchronous user-requested update installation." + }, + "UpdateStatusResponse": { + "properties": { + "status": { + "type": "string", + "enum": [ + "unknown", + "up_to_date", + "updates_available", + "status_unavailable", + "check_failed" + ], + "title": "Status" + }, + "checked_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Checked At" + }, + "stale": { + "type": "boolean", + "title": "Stale" + }, + "release_channel": { + "type": "string", + "enum": [ + "stable", + "nightly", + "unknown" + ], + "title": "Release Channel" + }, + "openscan": { + "$ref": "#/components/schemas/OpenScanUpdateSummary" + }, + "system": { + "$ref": "#/components/schemas/SystemUpdateSummary" + }, + "reboot_required": { + "type": "boolean", + "title": "Reboot Required" + } + }, + "type": "object", + "required": [ + "status", + "checked_at", + "stale", + "release_channel", + "openscan", + "system", + "reboot_required" + ], + "title": "UpdateStatusResponse", + "description": "Cached, user-facing software update status." + }, "ValidationError": { "properties": { "loc": { diff --git a/openapi_v0.8.json b/openapi_v0.8.json index 8afa6ee..bae2118 100644 --- a/openapi_v0.8.json +++ b/openapi_v0.8.json @@ -3493,7 +3493,7 @@ "develop" ], "summary": "Hello World Async", - "description": "Start the async hello world demo task.", + "description": "Start the async hello world progress demo task.", "operationId": "hello_world_async", "parameters": [ { diff --git a/openapi_v0.9.json b/openapi_v0.9.json index 57e1166..ceede64 100644 --- a/openapi_v0.9.json +++ b/openapi_v0.9.json @@ -1540,6 +1540,100 @@ } } }, + "/system/update/status": { + "get": { + "tags": [ + "system update" + ], + "summary": "Get Update Status", + "operationId": "get_update_status", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusResponse" + } + } + } + }, + "404": { + "description": "Not found" + } + } + } + }, + "/system/update/check": { + "post": { + "tags": [ + "system update" + ], + "summary": "Check For Updates", + "operationId": "check_for_updates", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusResponse" + } + } + } + }, + "404": { + "description": "Not found" + } + } + } + }, + "/system/update/apply": { + "post": { + "tags": [ + "system update" + ], + "summary": "Apply Updates", + "operationId": "apply_updates", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateInstallResponse" + } + } + } + }, + "404": { + "description": "Not found" + } + } + } + }, + "/system/repair/openscan3": { + "post": { + "tags": [ + "system repair" + ], + "summary": "Repair Openscan3", + "operationId": "repair_openscan3", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "404": { + "description": "Not found" + } + } + } + }, "/projects/": { "get": { "tags": [ @@ -3723,6 +3817,18 @@ "default": "json", "title": "Format" } + }, + { + "name": "release_cameras", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "description": "Temporarily release OpenScan camera controllers so rpicam/libcamera probes can acquire cameras.", + "default": true, + "title": "Release Cameras" + }, + "description": "Temporarily release OpenScan camera controllers so rpicam/libcamera probes can acquire cameras." } ], "responses": { @@ -3813,7 +3919,7 @@ "develop" ], "summary": "Hello World Async", - "description": "Start the async hello world demo task.", + "description": "Start the async hello world progress demo task.", "operationId": "hello_world_async", "parameters": [ { @@ -5703,6 +5809,77 @@ ], "title": "MotorStatusResponse" }, + "OpenScanUpdatePackage": { + "properties": { + "id": { + "type": "string", + "enum": [ + "firmware", + "client", + "updater", + "system_config", + "camera_stack" + ], + "title": "Id" + }, + "installed_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Installed Version" + }, + "available_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Available Version" + }, + "update_available": { + "type": "boolean", + "title": "Update Available" + } + }, + "type": "object", + "required": [ + "id", + "installed_version", + "available_version", + "update_available" + ], + "title": "OpenScanUpdatePackage", + "description": "One optional OpenScan component update for the details view." + }, + "OpenScanUpdateSummary": { + "properties": { + "updates_available": { + "type": "boolean", + "title": "Updates Available" + }, + "packages": { + "items": { + "$ref": "#/components/schemas/OpenScanUpdatePackage" + }, + "type": "array", + "title": "Packages" + } + }, + "type": "object", + "required": [ + "updates_available", + "packages" + ], + "title": "OpenScanUpdateSummary" + }, "PathMethod": { "type": "string", "enum": [ @@ -6400,6 +6577,29 @@ "type": "object", "title": "StackingTaskStatus" }, + "SystemUpdateSummary": { + "properties": { + "updates_available": { + "type": "boolean", + "title": "Updates Available" + }, + "count": { + "type": "integer", + "title": "Count" + }, + "reboot_required_after_install": { + "type": "boolean", + "title": "Reboot Required After Install" + } + }, + "type": "object", + "required": [ + "updates_available", + "count", + "reboot_required_after_install" + ], + "title": "SystemUpdateSummary" + }, "Task": { "properties": { "id": { @@ -6583,6 +6783,91 @@ ], "title": "TriggerConfig" }, + "UpdateInstallResponse": { + "properties": { + "status": { + "type": "string", + "enum": [ + "completed", + "install_failed", + "install_blocked" + ], + "title": "Status" + }, + "reboot_required": { + "type": "boolean", + "title": "Reboot Required" + } + }, + "type": "object", + "required": [ + "status", + "reboot_required" + ], + "title": "UpdateInstallResponse", + "description": "Result of a synchronous user-requested update installation." + }, + "UpdateStatusResponse": { + "properties": { + "status": { + "type": "string", + "enum": [ + "unknown", + "up_to_date", + "updates_available", + "status_unavailable", + "check_failed" + ], + "title": "Status" + }, + "checked_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Checked At" + }, + "stale": { + "type": "boolean", + "title": "Stale" + }, + "release_channel": { + "type": "string", + "enum": [ + "stable", + "nightly", + "unknown" + ], + "title": "Release Channel" + }, + "openscan": { + "$ref": "#/components/schemas/OpenScanUpdateSummary" + }, + "system": { + "$ref": "#/components/schemas/SystemUpdateSummary" + }, + "reboot_required": { + "type": "boolean", + "title": "Reboot Required" + } + }, + "type": "object", + "required": [ + "status", + "checked_at", + "stale", + "release_channel", + "openscan", + "system", + "reboot_required" + ], + "title": "UpdateStatusResponse", + "description": "Cached, user-facing software update status." + }, "ValidationError": { "properties": { "loc": { From bc30a7822113861485aec32a29a15c8dae9d8d90 Mon Sep 17 00:00:00 2001 From: esto Date: Tue, 28 Jul 2026 13:03:50 +0200 Subject: [PATCH 3/3] Add support for new updater to frontend (#29) * feat: add real-time update progress with polling and enhanced error handling Introduce a new update progress UI, real-time polling for update status, and improved handling of installation errors. * refactor: replace legacy components with `BaseSection`, enhance update progress parsing, and clean up UI logic Streamline the update interface by replacing `q-card` components with `BaseSection`, improving data parsing for update progress, and simplifying related UI interactions. Add OpenAPI schema for update progress to enhance API consistency. * feat: add update availability polling and dynamic UI updates Introduce `useUpdatesStore` for managing update status, including periodic polling and state tracking. Enhance the `MainLayout` and `UpdatePage` UI with real-time update indicators and dynamic badge visibility. --- app/src/layouts/MainLayout.vue | 11 +- app/src/pages/UpdatePage.vue | 290 ++++++++++++++++++++++++--------- app/src/stores/updates.ts | 77 +++++++++ openapi_update_status.json | 108 ++++++++++++ 4 files changed, 407 insertions(+), 79 deletions(-) create mode 100644 app/src/stores/updates.ts create mode 100644 openapi_update_status.json diff --git a/app/src/layouts/MainLayout.vue b/app/src/layouts/MainLayout.vue index 426a211..ba22f58 100644 --- a/app/src/layouts/MainLayout.vue +++ b/app/src/layouts/MainLayout.vue @@ -101,6 +101,7 @@ import { useDeviceStore } from 'src/stores/device'; import { useTaskStore } from 'src/stores/tasks'; import PowerControls from 'components/PowerControls.vue'; import TaskDrawerPanel from 'components/task/TaskDrawerPanel.vue'; +import { useUpdatesStore } from 'src/stores/updates'; const upperLinks: EssentialLinkProps[] = [ { @@ -135,13 +136,14 @@ const upperLinks: EssentialLinkProps[] = [ }, ]; -const lowerLinks: EssentialLinkProps[] = [ +const lowerLinks = computed(() => [ { title: 'Update', icon: 'system_update', - link: '/update' + link: '/update', + badge: updatesStore.updatesAvailable ? 'Updates available' : '' } -] +]) const leftDrawerOpen = ref(true) const rightDrawerOpen = ref(false) @@ -152,6 +154,9 @@ void deviceStore.ensureConnected() const taskStore = useTaskStore() void taskStore.ensureConnected() +const updatesStore = useUpdatesStore() +updatesStore.startPolling() + const runningTaskCount = computed(() => taskStore.runningTasks.length) const pausedTaskCount = computed(() => taskStore.tasks.filter((task) => task.status === 'paused').length) diff --git a/app/src/pages/UpdatePage.vue b/app/src/pages/UpdatePage.vue index d064d12..45f3889 100644 --- a/app/src/pages/UpdatePage.vue +++ b/app/src/pages/UpdatePage.vue @@ -49,11 +49,11 @@ class="status-orb" :class="`status-orb--${updateStatus.status}`" > - + +
-
Update status
-
+
{{ statusHeadline }}
{{ statusMessage }}
@@ -85,15 +85,43 @@ A restart is required to finish a previously installed update. + + +
{{ installProgress.lines.join('\n') }}
+
+
- - -
OpenScan components
-
- Versions supplied by the last update check. -
-
+ + - + {{ packageLabel(pkg.id) }} {{ pkg.installed_version ?? '—' }} @@ -129,36 +154,13 @@ - No OpenScan component version details are - available. -
+
+ No OpenScan component version details are available. +
+
-
-
-
Ready to check again?
-
- Finish active scans before installing updates. -
-
- - Last update check: - {{ lastCheckedLabel }} -
-
- -
@@ -207,28 +209,48 @@