wavetermdev/waveterm · error

error inserting window: %w

Error message

error inserting window: %w

What it means

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.

Source

Thrown at pkg/wcore/window.go:116

	if winSize == nil {
		winSize = &waveobj.WinSize{
			Width:  0,
			Height: 0,
		}
	}
	window := &waveobj.Window{
		OID:         windowId,
		WorkspaceId: ws.OID,
		IsNew:       true,
		Pos: waveobj.Point{
			X: 0,
			Y: 0,
		},
		WinSize: *winSize,
	}
	err := wstore.DBInsert(ctx, window)
	if err != nil {
		return nil, fmt.Errorf("error inserting window: %w", err)
	}
	client, err := GetClientData(ctx)
	if err != nil {
		return nil, fmt.Errorf("error getting client: %w", err)
	}
	client.WindowIds = append(client.WindowIds, windowId)
	err = wstore.DBUpdate(ctx, client)
	if err != nil {
		return nil, fmt.Errorf("error updating client: %w", err)
	}
	return GetWindow(ctx, windowId)
}

// CloseWindow closes a window and deletes its workspace if it is empty and not named.
// If fromElectron is true, it does not send an event to Electron.
func CloseWindow(ctx context.Context, windowId string, fromElectron bool) error {
	log.Printf("CloseWindow %s\n", windowId)
	window, err := GetWindow(ctx, windowId)

View on GitHub (pinned to a4447c1563)

Solutions

  1. Check the wrapped %w error for the root insert failure
  2. Verify free disk space and write permissions on the waveterm state directory
  3. After a version upgrade, check for schema-migration issues in the DB
  4. Retry CreateWindow; note any workspace created in step 1 may need cleanup

Example fix

// before
err := wstore.DBInsert(ctx, window)
if err != nil {
	return nil, fmt.Errorf("error inserting window: %w", err)
}
// after
if err := wstore.DBInsert(ctx, window); err != nil {
	_ = DeleteWorkspace(ctx, ws.OID, false) // don't orphan the fresh workspace
	return nil, fmt.Errorf("error inserting window: %w", err)
}
Defensive patterns

Strategy: retry

Validate before calling

if err := checkDiskSpace(waveStateDir); err != nil {
	return fmt.Errorf("insufficient disk space before window creation: %w", err)
}

Try / catch

win, err := wcore.CreateWindow(ctx, winSize, workspaceId)
if err != nil && strings.Contains(err.Error(), "error inserting window") {
	if isTransient(err) {
		time.Sleep(time.Second)
		win, err = wcore.CreateWindow(ctx, winSize, workspaceId)
	}
	if err != nil {
		return err
	}
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of wavetermdev/waveterm@a4447c1563 (2026-09-01). Data as JSON: /api/errors/6539c4a265a505d2. Report an issue: GitHub.