From 0a3f7f5edaab0217d66ae7a65a4d98d520858c59 Mon Sep 17 00:00:00 2001 From: sawka Date: Thu, 20 Nov 2025 14:46:53 -0800 Subject: [PATCH 1/2] add goid back in (set tsunami version in go.mod) --- go.mod | 3 ++- go.sum | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index ab7040c08..03b75b5ce 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( github.com/spf13/cobra v1.10.1 github.com/ubuntu/gowsl v0.0.0-20240906163211-049fd49bd93b github.com/wavetermdev/htmltoken v0.2.0 - github.com/wavetermdev/waveterm/tsunami v0.0.0-00010101000000-000000000000 + github.com/wavetermdev/waveterm/tsunami v0.12.3 golang.org/x/crypto v0.45.0 golang.org/x/mod v0.30.0 golang.org/x/sync v0.18.0 @@ -80,6 +80,7 @@ require ( github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-isatty v0.0.20 // indirect + github.com/outrigdev/goid v0.3.0 // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/sirupsen/logrus v1.9.3 // indirect diff --git a/go.sum b/go.sum index c46bd0c0e..fe81351f6 100644 --- a/go.sum +++ b/go.sum @@ -144,6 +144,8 @@ github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuE github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/outrigdev/goid v0.3.0 h1:t/otQD3EXc45cLtQVPUnNgEyRaTQA4cPeu3qVcrsIws= +github.com/outrigdev/goid v0.3.0/go.mod h1:hEH7f27ypN/GHWt/7gvkRoFYR0LZizfUBIAbak4neVE= github.com/photostorm/pty v1.1.19-0.20230903182454-31354506054b h1:cLGKfKb1uk0hxI0Q8L83UAJPpeJ+gSpn3cCU/tjd3eg= github.com/photostorm/pty v1.1.19-0.20230903182454-31354506054b/go.mod h1:KO+FcPtyLAiRC0hJwreJVvfwc7vnNz77UxBTIGHdPVk= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= From 952f980d5e8bd14fa37ca125fb9103cb4426edf0 Mon Sep 17 00:00:00 2001 From: sawka Date: Thu, 20 Nov 2025 15:32:19 -0800 Subject: [PATCH 2/2] allow initialization to complete even if tab isn't found. should unstick issue when the workspace data is messed up. --- frontend/wave.ts | 31 ++++++++++--------- .../workspaceservice/workspaceservice.go | 15 +++++---- pkg/wcore/block.go | 6 ++-- pkg/wcore/workspace.go | 17 +++++----- 4 files changed, 36 insertions(+), 33 deletions(-) diff --git a/frontend/wave.ts b/frontend/wave.ts index 6f7047fdc..448aa709a 100644 --- a/frontend/wave.ts +++ b/frontend/wave.ts @@ -181,20 +181,23 @@ async function initWave(initOpts: WaveInitOpts) { subscribeToConnEvents(); // ensures client/window/workspace are loaded into the cache before rendering - const [client, waveWindow, initialTab] = await Promise.all([ - WOS.loadAndPinWaveObject(WOS.makeORef("client", initOpts.clientId)), - WOS.loadAndPinWaveObject(WOS.makeORef("window", initOpts.windowId)), - WOS.loadAndPinWaveObject(WOS.makeORef("tab", initOpts.tabId)), - ]); - const [ws, layoutState] = await Promise.all([ - WOS.loadAndPinWaveObject(WOS.makeORef("workspace", waveWindow.workspaceid)), - WOS.reloadWaveObject(WOS.makeORef("layout", initialTab.layoutstate)), - ]); - loadAllWorkspaceTabs(ws); - WOS.wpsSubscribeToObject(WOS.makeORef("workspace", waveWindow.workspaceid)); - - document.title = `Wave Terminal - ${initialTab.name}`; // TODO update with tab name change - + try { + const [client, waveWindow, initialTab] = await Promise.all([ + WOS.loadAndPinWaveObject(WOS.makeORef("client", initOpts.clientId)), + WOS.loadAndPinWaveObject(WOS.makeORef("window", initOpts.windowId)), + WOS.loadAndPinWaveObject(WOS.makeORef("tab", initOpts.tabId)), + ]); + const [ws, layoutState] = await Promise.all([ + WOS.loadAndPinWaveObject(WOS.makeORef("workspace", waveWindow.workspaceid)), + WOS.reloadWaveObject(WOS.makeORef("layout", initialTab.layoutstate)), + ]); + loadAllWorkspaceTabs(ws); + WOS.wpsSubscribeToObject(WOS.makeORef("workspace", waveWindow.workspaceid)); + document.title = `Wave Terminal - ${initialTab.name}`; // TODO update with tab name change + } catch (e) { + console.error("Failed initialization error", e); + getApi().sendLog("Error in initialization (wave.ts, loading required objects) " + e.message + "\n" + e.stack); + } registerGlobalKeys(); registerElectronReinjectKeyHandler(); registerControlShiftStateUpdateHandler(); diff --git a/pkg/service/workspaceservice/workspaceservice.go b/pkg/service/workspaceservice/workspaceservice.go index 24ea60faf..f88875e20 100644 --- a/pkg/service/workspaceservice/workspaceservice.go +++ b/pkg/service/workspaceservice/workspaceservice.go @@ -259,15 +259,14 @@ func (svc *WorkspaceService) CloseTab_Meta() tsgenmeta.MethodMeta { // returns the new active tabid func (svc *WorkspaceService) CloseTab(ctx context.Context, workspaceId string, tabId string, fromElectron bool) (*CloseTabRtnType, waveobj.UpdatesRtnType, error) { ctx = waveobj.ContextWithUpdates(ctx) - tab, err := wstore.DBMustGet[*waveobj.Tab](ctx, tabId) - if err != nil { - return nil, nil, fmt.Errorf("error getting tab: %w", err) + tab, err := wstore.DBGet[*waveobj.Tab](ctx, tabId) + if err == nil && tab != nil { + go func() { + for _, blockId := range tab.BlockIds { + blockcontroller.StopBlockController(blockId) + } + }() } - go func() { - for _, blockId := range tab.BlockIds { - blockcontroller.StopBlockController(blockId) - } - }() newActiveTabId, err := wcore.DeleteTab(ctx, workspaceId, tabId, true) if err != nil { return nil, nil, fmt.Errorf("error closing tab: %w", err) diff --git a/pkg/wcore/block.go b/pkg/wcore/block.go index b224cd194..822779774 100644 --- a/pkg/wcore/block.go +++ b/pkg/wcore/block.go @@ -150,7 +150,7 @@ func createBlockObj(ctx context.Context, tabId string, blockDef *waveobj.BlockDe // recursive: if true, will recursively close parent tab, window, workspace, if they are empty. // Returns new active tab id, error. func DeleteBlock(ctx context.Context, blockId string, recursive bool) error { - block, err := wstore.DBMustGet[*waveobj.Block](ctx, blockId) + block, err := wstore.DBGet[*waveobj.Block](ctx, blockId) if err != nil { return fmt.Errorf("error getting block: %w", err) } @@ -223,11 +223,11 @@ func deleteBlockObj(ctx context.Context, blockId string) (int, error) { } } wstore.DBDelete(tx.Context(), waveobj.OType_Block, blockId) - + // Clean up block runtime info blockORef := waveobj.MakeORef(waveobj.OType_Block, blockId) wstore.DeleteRTInfo(blockORef) - + return parentBlockCount, nil }) } diff --git a/pkg/wcore/workspace.go b/pkg/wcore/workspace.go index 838cc7919..9037b2e5f 100644 --- a/pkg/wcore/workspace.go +++ b/pkg/wcore/workspace.go @@ -290,13 +290,12 @@ func DeleteTab(ctx context.Context, workspaceId string, tabId string, recursive // close blocks (sends events + stops block controllers) tab, _ := wstore.DBGet[*waveobj.Tab](ctx, tabId) - if tab == nil { - return "", fmt.Errorf("tab not found: %q", tabId) - } - for _, blockId := range tab.BlockIds { - err := DeleteBlock(ctx, blockId, false) - if err != nil { - return "", fmt.Errorf("error deleting block %s: %w", blockId, err) + if tab != nil { + for _, blockId := range tab.BlockIds { + err := DeleteBlock(ctx, blockId, false) + if err != nil { + return "", fmt.Errorf("error deleting block %s: %w", blockId, err) + } } } @@ -319,7 +318,9 @@ func DeleteTab(ctx context.Context, workspaceId string, tabId string, recursive wstore.DBUpdate(ctx, ws) wstore.DBDelete(ctx, waveobj.OType_Tab, tabId) - wstore.DBDelete(ctx, waveobj.OType_LayoutState, tab.LayoutState) + if tab != nil { + wstore.DBDelete(ctx, waveobj.OType_LayoutState, tab.LayoutState) + } // if no tabs remaining, close window if recursive && newActiveTabId == "" {