{"record":{"id":"6539c4a265a505d2","repo":"wavetermdev/waveterm","slug":"error-inserting-window-w","errorCode":null,"errorMessage":"error inserting window: %w","messagePattern":"error inserting window: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/wcore/window.go","lineNumber":116,"sourceCode":"\tif winSize == nil {\n\t\twinSize = &waveobj.WinSize{\n\t\t\tWidth:  0,\n\t\t\tHeight: 0,\n\t\t}\n\t}\n\twindow := &waveobj.Window{\n\t\tOID:         windowId,\n\t\tWorkspaceId: ws.OID,\n\t\tIsNew:       true,\n\t\tPos: waveobj.Point{\n\t\t\tX: 0,\n\t\t\tY: 0,\n\t\t},\n\t\tWinSize: *winSize,\n\t}\n\terr := wstore.DBInsert(ctx, window)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error inserting window: %w\", err)\n\t}\n\tclient, err := GetClientData(ctx)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error getting client: %w\", err)\n\t}\n\tclient.WindowIds = append(client.WindowIds, windowId)\n\terr = wstore.DBUpdate(ctx, client)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error updating client: %w\", err)\n\t}\n\treturn GetWindow(ctx, windowId)\n}\n\n// CloseWindow closes a window and deletes its workspace if it is empty and not named.\n// If fromElectron is true, it does not send an event to Electron.\nfunc CloseWindow(ctx context.Context, windowId string, fromElectron bool) error {\n\tlog.Printf(\"CloseWindow %s\\n\", windowId)\n\twindow, err := GetWindow(ctx, windowId)","sourceCodeStart":98,"sourceCodeEnd":134,"githubUrl":"https://github.com/wavetermdev/waveterm/blob/a4447c1563b2df285ab89e76c82f91e1a1a49c1e/pkg/wcore/window.go#L98-L134","documentation":"CreateWindow builds a new waveobj.Window and inserts it via wstore.DBInsert; this error wraps the insert failure. The workspace may have already been created (and is then orphaned), since the insert happens after workspace setup.","triggerScenarios":"wcore.CreateWindow(ctx, winSize, workspaceId) where DBInsert(ctx, window) fails — duplicate OID (astronomically unlikely with uuid.NewString), DB closed/corrupted, validation failure in wstore for the Window object.","commonSituations":"Disk full or read-only state directory; DB corruption from a crashed write; wstore schema mismatch after a Wave Terminal version upgrade changed the Window object format.","solutions":["Check the wrapped %w error for the root insert failure","Verify free disk space and write permissions on the waveterm state directory","After a version upgrade, check for schema-migration issues in the DB","Retry CreateWindow; note any workspace created in step 1 may need cleanup"],"exampleFix":"// before\nerr := wstore.DBInsert(ctx, window)\nif err != nil {\n\treturn nil, fmt.Errorf(\"error inserting window: %w\", err)\n}\n// after\nif err := wstore.DBInsert(ctx, window); err != nil {\n\t_ = DeleteWorkspace(ctx, ws.OID, false) // don't orphan the fresh workspace\n\treturn nil, fmt.Errorf(\"error inserting window: %w\", err)\n}","handlingStrategy":"retry","validationCode":"if err := checkDiskSpace(waveStateDir); err != nil {\n\treturn fmt.Errorf(\"insufficient disk space before window creation: %w\", err)\n}","typeGuard":null,"tryCatchPattern":"win, err := wcore.CreateWindow(ctx, winSize, workspaceId)\nif err != nil && strings.Contains(err.Error(), \"error inserting window\") {\n\tif isTransient(err) {\n\t\ttime.Sleep(time.Second)\n\t\twin, err = wcore.CreateWindow(ctx, winSize, workspaceId)\n\t}\n\tif err != nil {\n\t\treturn err\n\t}\n}","preventionTips":["Monitor disk space on the waveterm state directory","Run schema migrations when upgrading Wave Terminal versions","Detect and clean up orphaned workspaces after failed inserts"],"tags":["database","wave-terminal","window-creation","persistence"],"backgroundTag":"database-insert-failed","analyzedSha":"a4447c1563b2df285ab89e76c82f91e1a1a49c1e","analyzedAt":"2026-09-01T15:26:23.972Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}