Compare commits

...

7 Commits

Author SHA1 Message Date
psychedelicious
34928ee931 chore: bump version to v6.9.0rc2 2025-10-15 15:10:26 +11:00
psychedelicious
c25992de51 fix(ui): wait for nav api to be ready before loading main app component 2025-10-15 15:10:26 +11:00
psychedelicious
c2c882a306 feat(ui): add flag for connected status 2025-10-15 15:10:25 +11:00
psychedelicious
7efaffdea4 feat(mm): add model taxonomy and other classes to public API exports 2025-10-15 14:51:43 +11:00
psychedelicious
3316e05d2c tidy(mm): remove unused class 2025-10-15 14:51:23 +11:00
psychedelicious
1c73c6eb94 chore: bump version to v6.9.0rc1 2025-10-15 12:21:02 +11:00
psychedelicious
84b1590b29 chore(ui): update whatsnew 2025-10-15 12:20:55 +11:00
8 changed files with 47 additions and 17 deletions

View File

@@ -28,17 +28,6 @@ if TYPE_CHECKING:
pass
class URLModelSource(BaseModel):
type: Literal[ModelSourceType.Url] = Field(default=ModelSourceType.Url)
url: str = Field(
description="The URL from which the model was installed.",
)
api_response: str | None = Field(
default=None,
description="The original API response from the source, as stringified JSON.",
)
class Config_Base(ABC, BaseModel):
"""
Abstract base class for model configurations. A model config describes a specific combination of model base, type and

View File

@@ -2748,9 +2748,8 @@
"whatsNew": {
"whatsNewInInvoke": "What's New in Invoke",
"items": [
"Crop tool for Ref Images",
"Improved Model Manager tab UI",
"Navigate prompt history with keyboard shortcuts (alt/option + up/down)"
"Model Manager: If a model cannot be identified during installation, you can now manually select the model type and architecture.",
"Internal: Improved model identification system, making it easier for contributors to add support for new models."
],
"readReleaseNotes": "Read Release Notes",
"watchRecentReleaseVideos": "Watch Recent Release Videos",

View File

@@ -1,8 +1,11 @@
import { Box } from '@invoke-ai/ui-library';
import { useStore } from '@nanostores/react';
import { GlobalHookIsolator } from 'app/components/GlobalHookIsolator';
import { GlobalModalIsolator } from 'app/components/GlobalModalIsolator';
import { clearStorage } from 'app/store/enhancers/reduxRemember/driver';
import Loading from 'common/components/Loading/Loading';
import { AppContent } from 'features/ui/components/AppContent';
import { navigationApi } from 'features/ui/layouts/navigation-api';
import { memo } from 'react';
import { ErrorBoundary } from 'react-error-boundary';
@@ -16,11 +19,12 @@ const errorBoundaryOnReset = () => {
};
const App = () => {
const isNavigationAPIConnected = useStore(navigationApi.$isConnected);
return (
<ThemeLocaleProvider>
<ErrorBoundary onReset={errorBoundaryOnReset} FallbackComponent={AppErrorBoundaryFallback}>
<Box id="invoke-app-wrapper" w="100dvw" h="100dvh" position="relative" overflow="hidden">
<AppContent />
{isNavigationAPIConnected ? <AppContent /> : <Loading />}
</Box>
<GlobalHookIsolator />
<GlobalModalIsolator />

View File

@@ -34,6 +34,7 @@ export const GlobalHookIsolator = memo(() => {
const dispatch = useAppDispatch();
// singleton!
useNavigationApi();
useReadinessWatcher();
useSocketIO();
useGlobalModifiersInit();
@@ -41,7 +42,6 @@ export const GlobalHookIsolator = memo(() => {
useGetOpenAPISchemaQuery();
useSyncLoggingConfig();
useCloseChakraTooltipsOnDragFix();
useNavigationApi();
useDndMonitor();
useSyncNodeErrors();
useSyncLangDirection();

View File

@@ -127,6 +127,7 @@ describe('AppNavigationApi', () => {
describe('Basic Connection', () => {
it('should connect to app', () => {
expect(navigationApi.$isConnected.get()).toBe(false);
navigationApi.connectToApp(mockAppApi);
expect(navigationApi._app).not.toBeNull();
@@ -135,6 +136,7 @@ describe('AppNavigationApi', () => {
expect(navigationApi._app?.storage.set).toBe(mockSetStorage);
expect(navigationApi._app?.storage.get).toBe(mockGetStorage);
expect(navigationApi._app?.storage.delete).toBe(mockDeleteStorage);
expect(navigationApi.$isConnected.get()).toBe(true);
});
it('should disconnect from app', () => {
@@ -142,6 +144,7 @@ describe('AppNavigationApi', () => {
navigationApi.disconnectFromApp();
expect(navigationApi._app).toBeNull();
expect(navigationApi.$isConnected.get()).toBe(false);
});
});

View File

@@ -112,6 +112,12 @@ export class NavigationApi {
*/
_app: NavigationAppApi | null = null;
/**
* A flag indicating if the application is currently connected to the navigation API.
*/
private _$isConnected = atom(false);
$isConnected: Atom<boolean> = this._$isConnected;
/**
* Connect to the application to manage tab switching.
* @param api - The application API that provides methods to set and get the current app tab and manage panel
@@ -119,6 +125,7 @@ export class NavigationApi {
*/
connectToApp = (api: NavigationAppApi): void => {
this._app = api;
this._$isConnected.set(true);
};
/**
@@ -126,6 +133,7 @@ export class NavigationApi {
*/
disconnectFromApp = (): void => {
this._app = null;
this._$isConnected.set(false);
};
/**

View File

@@ -75,7 +75,20 @@ from invokeai.app.services.image_records.image_records_common import ImageCatego
from invokeai.app.services.shared.invocation_context import InvocationContext
from invokeai.app.services.workflow_records.workflow_records_common import WorkflowWithoutID
from invokeai.app.util.misc import SEED_MAX, get_random_seed
from invokeai.backend.model_manager.configs.factory import AnyModelConfig, ModelConfigFactory
from invokeai.backend.model_manager.load.load_base import LoadedModel
from invokeai.backend.model_manager.taxonomy import (
BaseModelType,
ClipVariantType,
FluxLoRAFormat,
FluxVariantType,
ModelFormat,
ModelSourceType,
ModelType,
ModelVariantType,
SchedulerPredictionType,
SubModelType,
)
from invokeai.backend.stable_diffusion.diffusers_pipeline import PipelineIntermediateState
from invokeai.backend.stable_diffusion.diffusion.conditioning_data import (
BasicConditioningInfo,
@@ -184,4 +197,18 @@ __all__ = [
# invokeai.app.util.misc
"SEED_MAX",
"get_random_seed",
# invokeai.backend.model_manager.taxonomy
"BaseModelType",
"ModelType",
"ModelSourceType",
"ModelFormat",
"ModelVariantType",
"SchedulerPredictionType",
"SubModelType",
"ClipVariantType",
"FluxLoRAFormat",
"FluxVariantType",
# invokeai.backend.model_manager.configs.factory
"AnyModelConfig",
"ModelConfigFactory",
]

View File

@@ -1 +1 @@
__version__ = "6.9.0a3"
__version__ = "6.9.0rc2"