@vibesdotdev/vessel 0.0.0-stage → 1.0.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +18 -0
- package/README.md +90 -2
- package/dist/apps/filesystem.vessel.plugin.d.ts +307 -0
- package/dist/apps/filesystem.vessel.plugin.d.ts.map +1 -0
- package/dist/apps/filesystem.vessel.plugin.js +134 -0
- package/dist/apps/filesystem.vessel.plugin.js.map +1 -0
- package/dist/apps/storage.vessel.plugin.d.ts +318 -0
- package/dist/apps/storage.vessel.plugin.d.ts.map +1 -0
- package/dist/apps/storage.vessel.plugin.js +132 -0
- package/dist/apps/storage.vessel.plugin.js.map +1 -0
- package/dist/apps/terminal.vessel.plugin.d.ts +306 -0
- package/dist/apps/terminal.vessel.plugin.d.ts.map +1 -0
- package/dist/apps/terminal.vessel.plugin.js +112 -0
- package/dist/apps/terminal.vessel.plugin.js.map +1 -0
- package/dist/boundary.d.ts +10 -0
- package/dist/boundary.d.ts.map +1 -0
- package/dist/boundary.js +43 -0
- package/dist/boundary.js.map +1 -0
- package/dist/client/helper.d.ts +4 -0
- package/dist/client/helper.d.ts.map +1 -0
- package/dist/client/helper.js +5 -0
- package/dist/client/helper.js.map +1 -0
- package/dist/client/index.d.ts +3 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +3 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/vessel-client.d.ts +39 -0
- package/dist/client/vessel-client.d.ts.map +1 -0
- package/dist/client/vessel-client.js +101 -0
- package/dist/client/vessel-client.js.map +1 -0
- package/dist/docs/vessel.docs.descriptor.d.ts +4 -0
- package/dist/docs/vessel.docs.descriptor.d.ts.map +1 -0
- package/dist/docs/vessel.docs.descriptor.js +96 -0
- package/dist/docs/vessel.docs.descriptor.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/kinds.d.ts +24 -0
- package/dist/kinds.d.ts.map +1 -0
- package/dist/kinds.js +78 -0
- package/dist/kinds.js.map +1 -0
- package/dist/launch/cli/descriptor.d.ts +3 -0
- package/dist/launch/cli/descriptor.d.ts.map +1 -0
- package/dist/launch/cli/descriptor.js +24 -0
- package/dist/launch/cli/descriptor.js.map +1 -0
- package/dist/launch/cli/implementation.d.ts +7 -0
- package/dist/launch/cli/implementation.d.ts.map +1 -0
- package/dist/launch/cli/implementation.js +14 -0
- package/dist/launch/cli/implementation.js.map +1 -0
- package/dist/launch/cli/options.d.ts +10 -0
- package/dist/launch/cli/options.d.ts.map +1 -0
- package/dist/launch/cli/options.js +12 -0
- package/dist/launch/cli/options.js.map +1 -0
- package/dist/launch/cli/plugin.d.ts +4 -0
- package/dist/launch/cli/plugin.d.ts.map +1 -0
- package/dist/launch/cli/plugin.js +12 -0
- package/dist/launch/cli/plugin.js.map +1 -0
- package/dist/launch/cli/request.d.ts +23 -0
- package/dist/launch/cli/request.d.ts.map +1 -0
- package/dist/launch/cli/request.js +27 -0
- package/dist/launch/cli/request.js.map +1 -0
- package/dist/launch/ensure-host.d.ts +48 -0
- package/dist/launch/ensure-host.d.ts.map +1 -0
- package/dist/launch/ensure-host.js +54 -0
- package/dist/launch/ensure-host.js.map +1 -0
- package/dist/launch/index.d.ts +9 -0
- package/dist/launch/index.d.ts.map +1 -0
- package/dist/launch/index.js +52 -0
- package/dist/launch/index.js.map +1 -0
- package/dist/launch/plugin.d.ts +6 -0
- package/dist/launch/plugin.d.ts.map +1 -0
- package/dist/launch/plugin.js +20 -0
- package/dist/launch/plugin.js.map +1 -0
- package/dist/launch/schema.d.ts +66 -0
- package/dist/launch/schema.d.ts.map +1 -0
- package/dist/launch/schema.js +71 -0
- package/dist/launch/schema.js.map +1 -0
- package/dist/launch/workspaces.d.ts +134 -0
- package/dist/launch/workspaces.d.ts.map +1 -0
- package/dist/launch/workspaces.js +60 -0
- package/dist/launch/workspaces.js.map +1 -0
- package/dist/module-not-found.d.ts +3 -0
- package/dist/module-not-found.d.ts.map +1 -0
- package/dist/module-not-found.js +18 -0
- package/dist/module-not-found.js.map +1 -0
- package/dist/schemas/platform.config.descriptor.d.ts +34 -0
- package/dist/schemas/platform.config.descriptor.d.ts.map +1 -0
- package/dist/schemas/platform.config.descriptor.js +13 -0
- package/dist/schemas/platform.config.descriptor.js.map +1 -0
- package/dist/schemas.d.ts +2213 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +661 -0
- package/dist/schemas.js.map +1 -0
- package/dist/shell/app-surface.d.ts +55 -0
- package/dist/shell/app-surface.d.ts.map +1 -0
- package/dist/shell/app-surface.js +159 -0
- package/dist/shell/app-surface.js.map +1 -0
- package/dist/shell/dock.d.ts +30 -0
- package/dist/shell/dock.d.ts.map +1 -0
- package/dist/shell/dock.js +75 -0
- package/dist/shell/dock.js.map +1 -0
- package/dist/shell/index.d.ts +11 -0
- package/dist/shell/index.d.ts.map +1 -0
- package/dist/shell/index.js +10 -0
- package/dist/shell/index.js.map +1 -0
- package/dist/shell/launch-resolution.d.ts +49 -0
- package/dist/shell/launch-resolution.d.ts.map +1 -0
- package/dist/shell/launch-resolution.js +163 -0
- package/dist/shell/launch-resolution.js.map +1 -0
- package/dist/shell/layout-grid.d.ts +30 -0
- package/dist/shell/layout-grid.d.ts.map +1 -0
- package/dist/shell/layout-grid.js +56 -0
- package/dist/shell/layout-grid.js.map +1 -0
- package/dist/shell/owner-surface-lifecycle.d.ts +30 -0
- package/dist/shell/owner-surface-lifecycle.d.ts.map +1 -0
- package/dist/shell/owner-surface-lifecycle.js +54 -0
- package/dist/shell/owner-surface-lifecycle.js.map +1 -0
- package/dist/shell/ports.d.ts +107 -0
- package/dist/shell/ports.d.ts.map +1 -0
- package/dist/shell/ports.js +154 -0
- package/dist/shell/ports.js.map +1 -0
- package/dist/shell/types.d.ts +7 -0
- package/dist/shell/types.d.ts.map +1 -0
- package/dist/shell/types.js +2 -0
- package/dist/shell/types.js.map +1 -0
- package/dist/shell/window-manager.d.ts +82 -0
- package/dist/shell/window-manager.d.ts.map +1 -0
- package/dist/shell/window-manager.js +285 -0
- package/dist/shell/window-manager.js.map +1 -0
- package/dist/shell/workspace-memory.d.ts +42 -0
- package/dist/shell/workspace-memory.d.ts.map +1 -0
- package/dist/shell/workspace-memory.js +65 -0
- package/dist/shell/workspace-memory.js.map +1 -0
- package/dist/shell/workspace-state.d.ts +47 -0
- package/dist/shell/workspace-state.d.ts.map +1 -0
- package/dist/shell/workspace-state.js +137 -0
- package/dist/shell/workspace-state.js.map +1 -0
- package/dist/vessel.docs.plugin.d.ts +4 -0
- package/dist/vessel.docs.plugin.d.ts.map +1 -0
- package/dist/vessel.docs.plugin.js +11 -0
- package/dist/vessel.docs.plugin.js.map +1 -0
- package/dist/vessel.plugin.d.ts +3 -0
- package/dist/vessel.plugin.d.ts.map +1 -0
- package/dist/vessel.plugin.js +23 -0
- package/dist/vessel.plugin.js.map +1 -0
- package/dist/vessel.runtime-client.descriptor.d.ts +4 -0
- package/dist/vessel.runtime-client.descriptor.d.ts.map +1 -0
- package/dist/vessel.runtime-client.descriptor.js +13 -0
- package/dist/vessel.runtime-client.descriptor.js.map +1 -0
- package/dist/vessel.workspace-state.plugin.d.ts +4 -0
- package/dist/vessel.workspace-state.plugin.d.ts.map +1 -0
- package/dist/vessel.workspace-state.plugin.js +12 -0
- package/dist/vessel.workspace-state.plugin.js.map +1 -0
- package/dist/vessel.workspace.plugin.d.ts +3 -0
- package/dist/vessel.workspace.plugin.d.ts.map +1 -0
- package/dist/vessel.workspace.plugin.js +17 -0
- package/dist/vessel.workspace.plugin.js.map +1 -0
- package/dist/whiteboard/client.d.ts +35 -0
- package/dist/whiteboard/client.d.ts.map +1 -0
- package/dist/whiteboard/client.js +185 -0
- package/dist/whiteboard/client.js.map +1 -0
- package/dist/whiteboard/descriptor.d.ts +5 -0
- package/dist/whiteboard/descriptor.d.ts.map +1 -0
- package/dist/whiteboard/descriptor.js +14 -0
- package/dist/whiteboard/descriptor.js.map +1 -0
- package/dist/whiteboard/index.d.ts +7 -0
- package/dist/whiteboard/index.d.ts.map +1 -0
- package/dist/whiteboard/index.js +7 -0
- package/dist/whiteboard/index.js.map +1 -0
- package/dist/whiteboard/plugin.d.ts +3 -0
- package/dist/whiteboard/plugin.d.ts.map +1 -0
- package/dist/whiteboard/plugin.js +42 -0
- package/dist/whiteboard/plugin.js.map +1 -0
- package/dist/whiteboard/schemas.d.ts +479 -0
- package/dist/whiteboard/schemas.d.ts.map +1 -0
- package/dist/whiteboard/schemas.js +55 -0
- package/dist/whiteboard/schemas.js.map +1 -0
- package/dist/whiteboard/tools/apply.impl.d.ts +7 -0
- package/dist/whiteboard/tools/apply.impl.d.ts.map +1 -0
- package/dist/whiteboard/tools/apply.impl.js +12 -0
- package/dist/whiteboard/tools/apply.impl.js.map +1 -0
- package/dist/whiteboard/tools/descriptors.d.ts +489 -0
- package/dist/whiteboard/tools/descriptors.d.ts.map +1 -0
- package/dist/whiteboard/tools/descriptors.js +72 -0
- package/dist/whiteboard/tools/descriptors.js.map +1 -0
- package/dist/whiteboard/tools/get.impl.d.ts +7 -0
- package/dist/whiteboard/tools/get.impl.d.ts.map +1 -0
- package/dist/whiteboard/tools/get.impl.js +12 -0
- package/dist/whiteboard/tools/get.impl.js.map +1 -0
- package/dist/whiteboard/tools/open.impl.d.ts +7 -0
- package/dist/whiteboard/tools/open.impl.d.ts.map +1 -0
- package/dist/whiteboard/tools/open.impl.js +12 -0
- package/dist/whiteboard/tools/open.impl.js.map +1 -0
- package/dist/whiteboard/tools/signal.impl.d.ts +7 -0
- package/dist/whiteboard/tools/signal.impl.d.ts.map +1 -0
- package/dist/whiteboard/tools/signal.impl.js +11 -0
- package/dist/whiteboard/tools/signal.impl.js.map +1 -0
- package/dist/whiteboard/vessel-whiteboard.descriptors.d.ts +4 -0
- package/dist/whiteboard/vessel-whiteboard.descriptors.d.ts.map +1 -0
- package/dist/whiteboard/vessel-whiteboard.descriptors.js +61 -0
- package/dist/whiteboard/vessel-whiteboard.descriptors.js.map +1 -0
- package/dist/workspace/vessel-hub.descriptors.d.ts +543 -0
- package/dist/workspace/vessel-hub.descriptors.d.ts.map +1 -0
- package/dist/workspace/vessel-hub.descriptors.js +544 -0
- package/dist/workspace/vessel-hub.descriptors.js.map +1 -0
- package/dist/workspace/vessel-platform.descriptors.d.ts +809 -0
- package/dist/workspace/vessel-platform.descriptors.d.ts.map +1 -0
- package/dist/workspace/vessel-platform.descriptors.js +207 -0
- package/dist/workspace/vessel-platform.descriptors.js.map +1 -0
- package/dist/workspace/vessel-workspace.descriptors.d.ts +537 -0
- package/dist/workspace/vessel-workspace.descriptors.d.ts.map +1 -0
- package/dist/workspace/vessel-workspace.descriptors.js +115 -0
- package/dist/workspace/vessel-workspace.descriptors.js.map +1 -0
- package/dist/workspace-state/index.d.ts +3 -0
- package/dist/workspace-state/index.d.ts.map +1 -0
- package/dist/workspace-state/index.js +3 -0
- package/dist/workspace-state/index.js.map +1 -0
- package/dist/workspace-state/vessel.workspace-state.storage.descriptor.d.ts +51 -0
- package/dist/workspace-state/vessel.workspace-state.storage.descriptor.d.ts.map +1 -0
- package/dist/workspace-state/vessel.workspace-state.storage.descriptor.js +24 -0
- package/dist/workspace-state/vessel.workspace-state.storage.descriptor.js.map +1 -0
- package/package.json +207 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shell/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure Vessel desktop window manager.
|
|
3
|
+
*
|
|
4
|
+
* Framework-neutral open/close/focus/z-order/minimize/maximize/move/resize for hosts.
|
|
5
|
+
* Geometry defaults come from vessel/app descriptors; this module never imports Svelte.
|
|
6
|
+
*/
|
|
7
|
+
import { type VesselAppDescriptor, type VesselRouteState, type VesselRuntimePlaceId } from '../schemas.ts';
|
|
8
|
+
export interface VesselWindowRect {
|
|
9
|
+
x: number;
|
|
10
|
+
y: number;
|
|
11
|
+
width: number;
|
|
12
|
+
height: number;
|
|
13
|
+
}
|
|
14
|
+
export interface VesselWindowState {
|
|
15
|
+
instanceId: string;
|
|
16
|
+
appId: string;
|
|
17
|
+
title: string;
|
|
18
|
+
/** Exact runtime place pinned when this window was created. */
|
|
19
|
+
runtimePlaceId?: VesselRuntimePlaceId;
|
|
20
|
+
x: number;
|
|
21
|
+
y: number;
|
|
22
|
+
width: number;
|
|
23
|
+
height: number;
|
|
24
|
+
minWidth: number;
|
|
25
|
+
minHeight: number;
|
|
26
|
+
zIndex: number;
|
|
27
|
+
focused: boolean;
|
|
28
|
+
minimized: boolean;
|
|
29
|
+
/** Maximization is live shell presentation; restoreRect preserves the floating geometry. */
|
|
30
|
+
maximized?: boolean;
|
|
31
|
+
restoreRect?: VesselWindowRect;
|
|
32
|
+
routeParams: VesselRouteState;
|
|
33
|
+
}
|
|
34
|
+
export interface VesselWindowManagerState {
|
|
35
|
+
windows: readonly VesselWindowState[];
|
|
36
|
+
focusedInstanceId: string | null;
|
|
37
|
+
nextZIndex: number;
|
|
38
|
+
nextInstanceSeq: number;
|
|
39
|
+
}
|
|
40
|
+
export interface OpenWindowOptions {
|
|
41
|
+
/** Force a new instance even if the app already has a window. Default false → focus existing. */
|
|
42
|
+
forceNew?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Explicit host-resolved runtime place for this new window. When supplied,
|
|
45
|
+
* only an existing window pinned to the same place is eligible for reuse.
|
|
46
|
+
*/
|
|
47
|
+
runtimePlaceId?: VesselRuntimePlaceId;
|
|
48
|
+
rect?: Partial<VesselWindowRect>;
|
|
49
|
+
/** Reference-only owner navigation state for this surface instance. */
|
|
50
|
+
routeParams?: VesselRouteState;
|
|
51
|
+
/** Replace existing route params instead of merging when re-opening an app. */
|
|
52
|
+
replaceRouteParams?: boolean;
|
|
53
|
+
}
|
|
54
|
+
export declare function createWindowManagerState(): VesselWindowManagerState;
|
|
55
|
+
export declare function openWindow(state: VesselWindowManagerState, app: VesselAppDescriptor, options?: OpenWindowOptions): VesselWindowManagerState;
|
|
56
|
+
export declare function updateWindowRouteParams(state: VesselWindowManagerState, instanceId: string, routeParams: VesselRouteState, options?: {
|
|
57
|
+
replace?: boolean;
|
|
58
|
+
}): VesselWindowManagerState;
|
|
59
|
+
export declare function closeWindow(state: VesselWindowManagerState, instanceId: string): VesselWindowManagerState;
|
|
60
|
+
export declare function focusWindow(state: VesselWindowManagerState, instanceId: string): VesselWindowManagerState;
|
|
61
|
+
export declare function minimizeWindow(state: VesselWindowManagerState, instanceId: string): VesselWindowManagerState;
|
|
62
|
+
/**
|
|
63
|
+
* Fill the available shell canvas while retaining the exact floating rectangle.
|
|
64
|
+
* Calling this again updates the canvas bounds without replacing the restore point.
|
|
65
|
+
*/
|
|
66
|
+
export declare function maximizeWindow(state: VesselWindowManagerState, instanceId: string, bounds: {
|
|
67
|
+
width: number;
|
|
68
|
+
height: number;
|
|
69
|
+
}): VesselWindowManagerState;
|
|
70
|
+
/** Restore a maximized window to the floating rectangle captured at maximize time. */
|
|
71
|
+
export declare function restoreWindow(state: VesselWindowManagerState, instanceId: string): VesselWindowManagerState;
|
|
72
|
+
export declare function moveWindow(state: VesselWindowManagerState, instanceId: string, x: number, y: number): VesselWindowManagerState;
|
|
73
|
+
export declare function resizeWindow(state: VesselWindowManagerState, instanceId: string, width: number, height: number): VesselWindowManagerState;
|
|
74
|
+
export declare function orderedWindows(state: VesselWindowManagerState, options?: {
|
|
75
|
+
includeMinimized?: boolean;
|
|
76
|
+
}): VesselWindowState[];
|
|
77
|
+
export declare function findWindowsForApp(state: VesselWindowManagerState, appId: string): VesselWindowState[];
|
|
78
|
+
export declare function clampWindowToBounds(win: VesselWindowState, bounds: {
|
|
79
|
+
width: number;
|
|
80
|
+
height: number;
|
|
81
|
+
}): VesselWindowState;
|
|
82
|
+
//# sourceMappingURL=window-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"window-manager.d.ts","sourceRoot":"","sources":["../../src/shell/window-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure Vessel desktop window manager.
|
|
3
|
+
*
|
|
4
|
+
* Framework-neutral open/close/focus/z-order/minimize/maximize/move/resize for hosts.
|
|
5
|
+
* Geometry defaults come from vessel/app descriptors; this module never imports Svelte.
|
|
6
|
+
*/
|
|
7
|
+
import { vesselRuntimePlaceIdSchema } from "../schemas.js";
|
|
8
|
+
import { cascadeOrigin, VESSEL_DEFAULT_GRID } from "./layout-grid.js";
|
|
9
|
+
function clamp(n, min, max) {
|
|
10
|
+
return Math.min(max, Math.max(min, n));
|
|
11
|
+
}
|
|
12
|
+
export function createWindowManagerState() {
|
|
13
|
+
return {
|
|
14
|
+
windows: [],
|
|
15
|
+
focusedInstanceId: null,
|
|
16
|
+
nextZIndex: 1,
|
|
17
|
+
nextInstanceSeq: 1
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function withFocus(windows, instanceId) {
|
|
21
|
+
return windows.map((win) => ({
|
|
22
|
+
...win,
|
|
23
|
+
focused: instanceId !== null && win.instanceId === instanceId,
|
|
24
|
+
minimized: instanceId !== null && win.instanceId === instanceId ? false : win.minimized
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
export function openWindow(state, app, options = {}) {
|
|
28
|
+
const runtimePlaceId = options.runtimePlaceId === undefined
|
|
29
|
+
? undefined
|
|
30
|
+
: vesselRuntimePlaceIdSchema.parse(options.runtimePlaceId);
|
|
31
|
+
if (!options.forceNew) {
|
|
32
|
+
const existing = [...state.windows]
|
|
33
|
+
.filter((win) => win.appId === app.id &&
|
|
34
|
+
!win.minimized &&
|
|
35
|
+
(runtimePlaceId === undefined || win.runtimePlaceId === runtimePlaceId))
|
|
36
|
+
.sort((a, b) => Number(b.focused) - Number(a.focused) || b.zIndex - a.zIndex)[0];
|
|
37
|
+
if (existing) {
|
|
38
|
+
const next = options.routeParams
|
|
39
|
+
? updateWindowRouteParams(state, existing.instanceId, options.routeParams, {
|
|
40
|
+
replace: options.replaceRouteParams
|
|
41
|
+
})
|
|
42
|
+
: state;
|
|
43
|
+
return focusWindow(next, existing.instanceId);
|
|
44
|
+
}
|
|
45
|
+
const minimized = [...state.windows]
|
|
46
|
+
.filter((win) => win.appId === app.id &&
|
|
47
|
+
win.minimized &&
|
|
48
|
+
(runtimePlaceId === undefined || win.runtimePlaceId === runtimePlaceId))
|
|
49
|
+
.sort((a, b) => b.zIndex - a.zIndex)[0];
|
|
50
|
+
if (minimized) {
|
|
51
|
+
const next = options.routeParams
|
|
52
|
+
? updateWindowRouteParams(state, minimized.instanceId, options.routeParams, {
|
|
53
|
+
replace: options.replaceRouteParams
|
|
54
|
+
})
|
|
55
|
+
: state;
|
|
56
|
+
return focusWindow(next, minimized.instanceId);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const defaults = app.defaultWindow;
|
|
60
|
+
const width = Math.max(options.rect?.width ?? defaults.width, defaults.minWidth);
|
|
61
|
+
const height = Math.max(options.rect?.height ?? defaults.height, defaults.minHeight);
|
|
62
|
+
// Cascade from the topmost open window so stacks stay readable regardless of
|
|
63
|
+
// per-app defaultWindow bases. Explicit rect.x / rect.y still win.
|
|
64
|
+
const open = state.windows.filter((w) => !w.minimized);
|
|
65
|
+
let x;
|
|
66
|
+
let y;
|
|
67
|
+
if (options.rect?.x != null && options.rect?.y != null) {
|
|
68
|
+
x = options.rect.x;
|
|
69
|
+
y = options.rect.y;
|
|
70
|
+
}
|
|
71
|
+
else if (open.length === 0) {
|
|
72
|
+
x = defaults.x;
|
|
73
|
+
y = defaults.y;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
const top = open.reduce((a, b) => (a.zIndex >= b.zIndex ? a : b));
|
|
77
|
+
const cascaded = cascadeOrigin(1, { x: top.x, y: top.y }, VESSEL_DEFAULT_GRID.cascadeStep);
|
|
78
|
+
x = cascaded.x;
|
|
79
|
+
y = cascaded.y;
|
|
80
|
+
}
|
|
81
|
+
const instanceId = `${app.id}#${state.nextInstanceSeq}`;
|
|
82
|
+
const zIndex = state.nextZIndex;
|
|
83
|
+
// Seed from the app's own surface state; explicit route params still win.
|
|
84
|
+
const initialState = app.launch.type === 'vessel-surface' ? app.launch.initialState : undefined;
|
|
85
|
+
const next = {
|
|
86
|
+
instanceId,
|
|
87
|
+
appId: app.id,
|
|
88
|
+
title: app.name,
|
|
89
|
+
runtimePlaceId,
|
|
90
|
+
x,
|
|
91
|
+
y,
|
|
92
|
+
width,
|
|
93
|
+
height,
|
|
94
|
+
minWidth: defaults.minWidth,
|
|
95
|
+
minHeight: defaults.minHeight,
|
|
96
|
+
zIndex,
|
|
97
|
+
focused: true,
|
|
98
|
+
minimized: false,
|
|
99
|
+
maximized: false,
|
|
100
|
+
routeParams: { ...initialState, ...options.routeParams }
|
|
101
|
+
};
|
|
102
|
+
const windows = withFocus([...state.windows, next], instanceId);
|
|
103
|
+
return {
|
|
104
|
+
windows,
|
|
105
|
+
focusedInstanceId: instanceId,
|
|
106
|
+
nextZIndex: zIndex + 1,
|
|
107
|
+
nextInstanceSeq: state.nextInstanceSeq + 1
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
export function updateWindowRouteParams(state, instanceId, routeParams, options = {}) {
|
|
111
|
+
const target = state.windows.find((win) => win.instanceId === instanceId);
|
|
112
|
+
if (!target)
|
|
113
|
+
return state;
|
|
114
|
+
return {
|
|
115
|
+
...state,
|
|
116
|
+
windows: state.windows.map((win) => win.instanceId === instanceId
|
|
117
|
+
? {
|
|
118
|
+
...win,
|
|
119
|
+
routeParams: options.replace
|
|
120
|
+
? { ...routeParams }
|
|
121
|
+
: { ...win.routeParams, ...routeParams }
|
|
122
|
+
}
|
|
123
|
+
: win)
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
export function closeWindow(state, instanceId) {
|
|
127
|
+
const remaining = state.windows.filter((win) => win.instanceId !== instanceId);
|
|
128
|
+
if (remaining.length === state.windows.length)
|
|
129
|
+
return state;
|
|
130
|
+
const wasFocused = state.focusedInstanceId === instanceId;
|
|
131
|
+
if (!wasFocused) {
|
|
132
|
+
return { ...state, windows: remaining };
|
|
133
|
+
}
|
|
134
|
+
const top = [...remaining].sort((a, b) => b.zIndex - a.zIndex)[0] ?? null;
|
|
135
|
+
const focusedInstanceId = top?.instanceId ?? null;
|
|
136
|
+
return {
|
|
137
|
+
...state,
|
|
138
|
+
windows: withFocus(remaining, focusedInstanceId),
|
|
139
|
+
focusedInstanceId
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
export function focusWindow(state, instanceId) {
|
|
143
|
+
const target = state.windows.find((win) => win.instanceId === instanceId);
|
|
144
|
+
if (!target)
|
|
145
|
+
return state;
|
|
146
|
+
const zIndex = state.nextZIndex;
|
|
147
|
+
const windows = state.windows.map((win) => {
|
|
148
|
+
if (win.instanceId !== instanceId) {
|
|
149
|
+
return { ...win, focused: false };
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
...win,
|
|
153
|
+
focused: true,
|
|
154
|
+
minimized: false,
|
|
155
|
+
zIndex
|
|
156
|
+
};
|
|
157
|
+
});
|
|
158
|
+
return {
|
|
159
|
+
...state,
|
|
160
|
+
windows,
|
|
161
|
+
focusedInstanceId: instanceId,
|
|
162
|
+
nextZIndex: zIndex + 1
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
export function minimizeWindow(state, instanceId) {
|
|
166
|
+
const target = state.windows.find((win) => win.instanceId === instanceId);
|
|
167
|
+
if (!target || target.minimized)
|
|
168
|
+
return state;
|
|
169
|
+
const windows = state.windows.map((win) => win.instanceId === instanceId ? { ...win, minimized: true, focused: false } : win);
|
|
170
|
+
const wasFocused = state.focusedInstanceId === instanceId;
|
|
171
|
+
if (!wasFocused) {
|
|
172
|
+
return { ...state, windows };
|
|
173
|
+
}
|
|
174
|
+
const top = [...windows].filter((win) => !win.minimized).sort((a, b) => b.zIndex - a.zIndex)[0] ?? null;
|
|
175
|
+
return {
|
|
176
|
+
...state,
|
|
177
|
+
windows: withFocus(windows, top?.instanceId ?? null),
|
|
178
|
+
focusedInstanceId: top?.instanceId ?? null
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Fill the available shell canvas while retaining the exact floating rectangle.
|
|
183
|
+
* Calling this again updates the canvas bounds without replacing the restore point.
|
|
184
|
+
*/
|
|
185
|
+
export function maximizeWindow(state, instanceId, bounds) {
|
|
186
|
+
const width = Math.round(bounds.width);
|
|
187
|
+
const height = Math.round(bounds.height);
|
|
188
|
+
if (width < 1 || height < 1)
|
|
189
|
+
return state;
|
|
190
|
+
const target = state.windows.find((win) => win.instanceId === instanceId);
|
|
191
|
+
if (!target)
|
|
192
|
+
return state;
|
|
193
|
+
if (target.maximized &&
|
|
194
|
+
target.x === 0 &&
|
|
195
|
+
target.y === 0 &&
|
|
196
|
+
target.width === width &&
|
|
197
|
+
target.height === height) {
|
|
198
|
+
return state;
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
...state,
|
|
202
|
+
windows: state.windows.map((win) => {
|
|
203
|
+
if (win.instanceId !== instanceId)
|
|
204
|
+
return win;
|
|
205
|
+
return {
|
|
206
|
+
...win,
|
|
207
|
+
x: 0,
|
|
208
|
+
y: 0,
|
|
209
|
+
width,
|
|
210
|
+
height,
|
|
211
|
+
maximized: true,
|
|
212
|
+
restoreRect: win.maximized
|
|
213
|
+
? win.restoreRect
|
|
214
|
+
: { x: win.x, y: win.y, width: win.width, height: win.height }
|
|
215
|
+
};
|
|
216
|
+
})
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
/** Restore a maximized window to the floating rectangle captured at maximize time. */
|
|
220
|
+
export function restoreWindow(state, instanceId) {
|
|
221
|
+
const target = state.windows.find((win) => win.instanceId === instanceId);
|
|
222
|
+
if (!target?.maximized || !target.restoreRect)
|
|
223
|
+
return state;
|
|
224
|
+
const restoreRect = target.restoreRect;
|
|
225
|
+
return {
|
|
226
|
+
...state,
|
|
227
|
+
windows: state.windows.map((win) => win.instanceId === instanceId
|
|
228
|
+
? { ...win, ...restoreRect, maximized: false, restoreRect: undefined }
|
|
229
|
+
: win)
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
export function moveWindow(state, instanceId, x, y) {
|
|
233
|
+
const target = state.windows.find((win) => win.instanceId === instanceId);
|
|
234
|
+
if (!target || target.maximized)
|
|
235
|
+
return state;
|
|
236
|
+
return {
|
|
237
|
+
...state,
|
|
238
|
+
windows: state.windows.map((win) => win.instanceId === instanceId
|
|
239
|
+
? { ...win, x: Math.max(0, Math.round(x)), y: Math.max(0, Math.round(y)) }
|
|
240
|
+
: win)
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
export function resizeWindow(state, instanceId, width, height) {
|
|
244
|
+
const target = state.windows.find((win) => win.instanceId === instanceId);
|
|
245
|
+
if (!target || target.maximized)
|
|
246
|
+
return state;
|
|
247
|
+
return {
|
|
248
|
+
...state,
|
|
249
|
+
windows: state.windows.map((win) => {
|
|
250
|
+
if (win.instanceId !== instanceId)
|
|
251
|
+
return win;
|
|
252
|
+
return {
|
|
253
|
+
...win,
|
|
254
|
+
width: Math.max(win.minWidth, Math.round(width)),
|
|
255
|
+
height: Math.max(win.minHeight, Math.round(height))
|
|
256
|
+
};
|
|
257
|
+
})
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
export function orderedWindows(state, options = {}) {
|
|
261
|
+
const list = options.includeMinimized
|
|
262
|
+
? state.windows
|
|
263
|
+
: state.windows.filter((win) => !win.minimized);
|
|
264
|
+
return [...list].sort((a, b) => a.zIndex - b.zIndex);
|
|
265
|
+
}
|
|
266
|
+
export function findWindowsForApp(state, appId) {
|
|
267
|
+
return state.windows.filter((win) => win.appId === appId);
|
|
268
|
+
}
|
|
269
|
+
export function clampWindowToBounds(win, bounds) {
|
|
270
|
+
if (win.maximized) {
|
|
271
|
+
return {
|
|
272
|
+
...win,
|
|
273
|
+
x: 0,
|
|
274
|
+
y: 0,
|
|
275
|
+
width: Math.max(1, Math.round(bounds.width)),
|
|
276
|
+
height: Math.max(1, Math.round(bounds.height))
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
const width = clamp(win.width, win.minWidth, Math.max(win.minWidth, bounds.width));
|
|
280
|
+
const height = clamp(win.height, win.minHeight, Math.max(win.minHeight, bounds.height));
|
|
281
|
+
const x = clamp(win.x, 0, Math.max(0, bounds.width - 80));
|
|
282
|
+
const y = clamp(win.y, 0, Math.max(0, bounds.height - 48));
|
|
283
|
+
return { ...win, x, y, width, height };
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=window-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"window-manager.js","sourceRoot":"","sources":["../../src/shell/window-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** Current health of the device-local workspace-memory projection. */
|
|
2
|
+
export type VesselWorkspaceMemoryStatus = 'checking' | 'empty' | 'saving' | 'saved' | 'error';
|
|
3
|
+
export interface VesselWorkspaceMemoryState {
|
|
4
|
+
status: VesselWorkspaceMemoryStatus;
|
|
5
|
+
/** Last confirmed persisted revision time, retained even if a later write fails. */
|
|
6
|
+
lastSavedAt: string | null;
|
|
7
|
+
/** Current write/load failure; never converts stale success into green status. */
|
|
8
|
+
error: string | null;
|
|
9
|
+
/** Latest in-flight write token. Zero means no write is pending. */
|
|
10
|
+
activeRequestId: number;
|
|
11
|
+
}
|
|
12
|
+
export type VesselWorkspaceMemoryEvent = {
|
|
13
|
+
type: 'load-started';
|
|
14
|
+
} | {
|
|
15
|
+
type: 'loaded';
|
|
16
|
+
savedAt: string | null;
|
|
17
|
+
} | {
|
|
18
|
+
type: 'load-failed';
|
|
19
|
+
error: string;
|
|
20
|
+
} | {
|
|
21
|
+
type: 'save-started';
|
|
22
|
+
requestId: number;
|
|
23
|
+
} | {
|
|
24
|
+
type: 'save-succeeded';
|
|
25
|
+
requestId: number;
|
|
26
|
+
savedAt: string;
|
|
27
|
+
} | {
|
|
28
|
+
type: 'save-failed';
|
|
29
|
+
requestId: number;
|
|
30
|
+
error: string;
|
|
31
|
+
} | {
|
|
32
|
+
type: 'cleared';
|
|
33
|
+
requestId: number;
|
|
34
|
+
};
|
|
35
|
+
export declare function createVesselWorkspaceMemoryState(): VesselWorkspaceMemoryState;
|
|
36
|
+
/**
|
|
37
|
+
* Pure state machine for workspace-memory health. Return history and current
|
|
38
|
+
* persistence health are deliberately separate facts; stale writes are ignored.
|
|
39
|
+
*/
|
|
40
|
+
export declare function reduceVesselWorkspaceMemory(state: VesselWorkspaceMemoryState, event: VesselWorkspaceMemoryEvent): VesselWorkspaceMemoryState;
|
|
41
|
+
export declare function vesselWorkspaceMemoryStatusLabel(status: VesselWorkspaceMemoryStatus): string;
|
|
42
|
+
//# sourceMappingURL=workspace-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-memory.d.ts","sourceRoot":"","sources":["../../src/shell/workspace-memory.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,MAAM,2BAA2B,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;AAE9F,MAAM,WAAW,0BAA0B;IAC1C,MAAM,EAAE,2BAA2B,CAAC;IACpC,oFAAoF;IACpF,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,kFAAkF;IAClF,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,oEAAoE;IACpE,eAAe,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,0BAA0B,GACnC;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1C,wBAAgB,gCAAgC,IAAI,0BAA0B,CAO7E;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAC1C,KAAK,EAAE,0BAA0B,EACjC,KAAK,EAAE,0BAA0B,GAC/B,0BAA0B,CAoC5B;AAED,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,2BAA2B,GAAG,MAAM,CAM5F"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export function createVesselWorkspaceMemoryState() {
|
|
2
|
+
return {
|
|
3
|
+
status: 'checking',
|
|
4
|
+
lastSavedAt: null,
|
|
5
|
+
error: null,
|
|
6
|
+
activeRequestId: 0
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Pure state machine for workspace-memory health. Return history and current
|
|
11
|
+
* persistence health are deliberately separate facts; stale writes are ignored.
|
|
12
|
+
*/
|
|
13
|
+
export function reduceVesselWorkspaceMemory(state, event) {
|
|
14
|
+
if (event.type === 'load-started') {
|
|
15
|
+
return state.status === 'saving'
|
|
16
|
+
? state
|
|
17
|
+
: { ...state, status: 'checking', error: null, activeRequestId: 0 };
|
|
18
|
+
}
|
|
19
|
+
if (event.type === 'loaded') {
|
|
20
|
+
if (state.status === 'saving')
|
|
21
|
+
return state;
|
|
22
|
+
return {
|
|
23
|
+
status: event.savedAt ? 'saved' : 'empty',
|
|
24
|
+
lastSavedAt: event.savedAt,
|
|
25
|
+
error: null,
|
|
26
|
+
activeRequestId: 0
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
if (event.type === 'load-failed') {
|
|
30
|
+
if (state.status === 'saving')
|
|
31
|
+
return state;
|
|
32
|
+
return { ...state, status: 'error', error: event.error, activeRequestId: 0 };
|
|
33
|
+
}
|
|
34
|
+
if (event.type === 'save-started') {
|
|
35
|
+
if (event.requestId < state.activeRequestId)
|
|
36
|
+
return state;
|
|
37
|
+
return { ...state, status: 'saving', error: null, activeRequestId: event.requestId };
|
|
38
|
+
}
|
|
39
|
+
if (event.requestId !== state.activeRequestId)
|
|
40
|
+
return state;
|
|
41
|
+
if (event.type === 'save-succeeded') {
|
|
42
|
+
return {
|
|
43
|
+
status: 'saved',
|
|
44
|
+
lastSavedAt: event.savedAt,
|
|
45
|
+
error: null,
|
|
46
|
+
activeRequestId: 0
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
if (event.type === 'save-failed') {
|
|
50
|
+
return { ...state, status: 'error', error: event.error, activeRequestId: 0 };
|
|
51
|
+
}
|
|
52
|
+
return { status: 'empty', lastSavedAt: null, error: null, activeRequestId: 0 };
|
|
53
|
+
}
|
|
54
|
+
export function vesselWorkspaceMemoryStatusLabel(status) {
|
|
55
|
+
if (status === 'checking')
|
|
56
|
+
return 'Checking this device…';
|
|
57
|
+
if (status === 'empty')
|
|
58
|
+
return 'No saved workspace';
|
|
59
|
+
if (status === 'saving')
|
|
60
|
+
return 'Saving…';
|
|
61
|
+
if (status === 'error')
|
|
62
|
+
return 'Workspace memory needs attention';
|
|
63
|
+
return 'Saved on this device';
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=workspace-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-memory.js","sourceRoot":"","sources":["../../src/shell/workspace-memory.ts"],"names":[],"mappings":"AAsBA,MAAM,UAAU,gCAAgC;IAC/C,OAAO;QACN,MAAM,EAAE,UAAU;QAClB,WAAW,EAAE,IAAI;QACjB,KAAK,EAAE,IAAI;QACX,eAAe,EAAE,CAAC;KAClB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CAC1C,KAAiC,EACjC,KAAiC;IAEjC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;YAC/B,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC;IACtE,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5C,OAAO;YACN,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;YACzC,WAAW,EAAE,KAAK,CAAC,OAAO;YAC1B,KAAK,EAAE,IAAI;YACX,eAAe,EAAE,CAAC;SAClB,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAClC,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5C,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC;IAC9E,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,eAAe;YAAE,OAAO,KAAK,CAAC;QAC1D,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;IACtF,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,eAAe;QAAE,OAAO,KAAK,CAAC;IAC5D,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACrC,OAAO;YACN,MAAM,EAAE,OAAO;YACf,WAAW,EAAE,KAAK,CAAC,OAAO;YAC1B,KAAK,EAAE,IAAI;YACX,eAAe,EAAE,CAAC;SAClB,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAClC,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC;IAC9E,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,MAAmC;IACnF,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,uBAAuB,CAAC;IAC1D,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,oBAAoB,CAAC;IACpD,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,kCAAkC,CAAC;IAClE,OAAO,sBAAsB,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type VesselAppDescriptor, type VesselWorkspaceAnchor, type VesselWorkspaceChronologicalCue, type VesselWorkspaceFocus, type VesselWorkspaceReceipt, type VesselWorkspaceState } from '../schemas.ts';
|
|
2
|
+
import { type VesselWindowManagerState } from './window-manager.ts';
|
|
3
|
+
export interface CaptureVesselWorkspaceStateInput {
|
|
4
|
+
workspaceId: string;
|
|
5
|
+
manager: VesselWindowManagerState;
|
|
6
|
+
apps: readonly VesselAppDescriptor[];
|
|
7
|
+
previous?: VesselWorkspaceState | null;
|
|
8
|
+
savedAt: string;
|
|
9
|
+
chronologicalCue?: VesselWorkspaceChronologicalCue;
|
|
10
|
+
/** New owner receipts to append to the bounded structural history. */
|
|
11
|
+
receipts?: readonly VesselWorkspaceReceipt[];
|
|
12
|
+
/**
|
|
13
|
+
* Previously stored anchors whose owner surface is unavailable in this
|
|
14
|
+
* runtime. Retaining them prevents a partial restore from erasing intent.
|
|
15
|
+
*/
|
|
16
|
+
retainedUnavailableAnchors?: readonly RetainedUnavailableVesselWorkspaceAnchor[];
|
|
17
|
+
/** Preserve an unavailable focused anchor until the user chooses a new focus. */
|
|
18
|
+
retainedUnavailableFocus?: VesselWorkspaceFocus;
|
|
19
|
+
}
|
|
20
|
+
export interface RetainedUnavailableVesselWorkspaceAnchor {
|
|
21
|
+
anchor: VesselWorkspaceAnchor;
|
|
22
|
+
/** Position in the stored ordered anchor list. */
|
|
23
|
+
index: number;
|
|
24
|
+
}
|
|
25
|
+
export interface RestoreVesselWorkspaceStateResult {
|
|
26
|
+
manager: VesselWindowManagerState;
|
|
27
|
+
droppedSurfaceIds: string[];
|
|
28
|
+
/** Exact missing anchors, suitable for retention in the next capture. */
|
|
29
|
+
unavailableAnchors: RetainedUnavailableVesselWorkspaceAnchor[];
|
|
30
|
+
unavailableLastFocus?: VesselWorkspaceFocus;
|
|
31
|
+
restoredAnchorCount: number;
|
|
32
|
+
}
|
|
33
|
+
export interface RestoreVesselWorkspaceStateOptions {
|
|
34
|
+
/** Host/runtime preflight for this exact anchor and its route-selected providers. */
|
|
35
|
+
isAnchorAvailable?: (anchor: VesselWorkspaceAnchor, index: number) => boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Capture only windows backed by stable `vessel/surface` identities. Import
|
|
39
|
+
* paths, package names, app ids, and runtime instance ids never enter storage.
|
|
40
|
+
*/
|
|
41
|
+
export declare function captureVesselWorkspaceState(input: CaptureVesselWorkspaceStateInput): VesselWorkspaceState;
|
|
42
|
+
/**
|
|
43
|
+
* Restore against the app descriptors available now. Missing providers are
|
|
44
|
+
* reported and omitted; every surviving instance receives fresh ids and z-order.
|
|
45
|
+
*/
|
|
46
|
+
export declare function restoreVesselWorkspaceState(stored: VesselWorkspaceState, apps: readonly VesselAppDescriptor[], options?: RestoreVesselWorkspaceStateOptions): RestoreVesselWorkspaceStateResult;
|
|
47
|
+
//# sourceMappingURL=workspace-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-state.d.ts","sourceRoot":"","sources":["../../src/shell/workspace-state.ts"],"names":[],"mappings":"AACA,OAAO,EAKN,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,+BAA+B,EACpC,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAMN,KAAK,wBAAwB,EAC7B,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,gCAAgC;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,wBAAwB,CAAC;IAClC,IAAI,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACrC,QAAQ,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,+BAA+B,CAAC;IACnD,sEAAsE;IACtE,QAAQ,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC7C;;;OAGG;IACH,0BAA0B,CAAC,EAAE,SAAS,wCAAwC,EAAE,CAAC;IACjF,iFAAiF;IACjF,wBAAwB,CAAC,EAAE,oBAAoB,CAAC;CAChD;AAED,MAAM,WAAW,wCAAwC;IACxD,MAAM,EAAE,qBAAqB,CAAC;IAC9B,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iCAAiC;IACjD,OAAO,EAAE,wBAAwB,CAAC;IAClC,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,yEAAyE;IACzE,kBAAkB,EAAE,wCAAwC,EAAE,CAAC;IAC/D,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,mBAAmB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,kCAAkC;IAClD,qFAAqF;IACrF,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;CAC9E;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAC1C,KAAK,EAAE,gCAAgC,GACrC,oBAAoB,CA0EtB;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAC1C,MAAM,EAAE,oBAAoB,EAC5B,IAAI,EAAE,SAAS,mBAAmB,EAAE,EACpC,OAAO,GAAE,kCAAuC,GAC9C,iCAAiC,CAgEnC"}
|