{"record":{"id":"7f0785dbeabf0627","repo":"wavetermdev/waveterm","slug":"not-connected-s","errorCode":null,"errorMessage":"not connected: %s","messagePattern":"not connected: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/blockcontroller/blockcontroller.go","lineNumber":440,"sourceCode":"\tblocklogger.Infof(ctx, \"[conndebug] \"+fmtStr, args...)\n\tlog.Printf(fmtStr, args...)\n}\n\nfunc CheckConnStatus(blockId string) error {\n\tbdata, err := wstore.DBMustGet[*waveobj.Block](context.Background(), blockId)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error getting block: %w\", err)\n\t}\n\tconnName := bdata.Meta.GetString(waveobj.MetaKey_Connection, \"\")\n\tif conncontroller.IsLocalConnName(connName) {\n\t\treturn nil\n\t}\n\tif strings.HasPrefix(connName, \"wsl://\") {\n\t\tdistroName := strings.TrimPrefix(connName, \"wsl://\")\n\t\tconn := wslconn.GetWslConn(distroName)\n\t\tconnStatus := conn.DeriveConnStatus()\n\t\tif connStatus.Status != conncontroller.Status_Connected {\n\t\t\treturn fmt.Errorf(\"not connected: %s\", connStatus.Status)\n\t\t}\n\t\treturn nil\n\t}\n\topts, err := remote.ParseOpts(connName)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error parsing connection name: %w\", err)\n\t}\n\tconn := conncontroller.MaybeGetConn(opts)\n\tif conn == nil {\n\t\treturn fmt.Errorf(\"no connection found\")\n\t}\n\tconnStatus := conn.DeriveConnStatus()\n\tif connStatus.Status != conncontroller.Status_Connected {\n\t\treturn fmt.Errorf(\"not connected: %s\", connStatus.Status)\n\t}\n\treturn nil\n}\n","sourceCodeStart":422,"sourceCodeEnd":458,"githubUrl":"https://github.com/wavetermdev/waveterm/blob/a4447c1563b2df285ab89e76c82f91e1a1a49c1e/pkg/blockcontroller/blockcontroller.go#L422-L458","documentation":"For WSL connections (connName prefixed with wsl://), CheckConnStatus derives the live connection status via GetWslConn(distroName).DeriveConnStatus(). This error is returned when the derived status is anything other than Status_Connected, reporting the actual status string.","triggerScenarios":"WSL distro not started, wsl.exe unavailable or slow to start, distro name invalid/removed, WSL service shutdown while the block's connection status is polled.","commonSituations":"Machine resumed from sleep with WSL VM torn down; distro uninstalled while blocks referencing it are open; first connection to a distro still initializing; `wsl --shutdown` issued externally.","solutions":["Run `wsl --list --verbose` to confirm the distro exists and is running","Start the distro manually (`wsl -d <distro>`) or restart the WSL service (`wsl --shutdown` then reconnect)","Verify the meta connection value matches an installed distro name (wsl://<distroName>)","Retry the connection; the client usually auto-reconnects once WSL is up"],"exampleFix":"// before\nconnName := \"wsl://MyDistro\"\n// after (verify distro exists first)\nout, _ := exec.Command(\"wsl\", \"-l\", \"-q\").Output()\nif !strings.Contains(string(out), \"MyDistro\") {\n    connName = \"wsl://Ubuntu\" // fall back to an installed distro\n}","handlingStrategy":"retry","validationCode":"conn := wslconn.GetWslConn(strings.TrimPrefix(connName, \"wsl://\"))\nst := conn.DeriveConnStatus()\nif st.Status != conncontroller.Status_Connected { /* wait/retry */ }","typeGuard":null,"tryCatchPattern":"err := blockcontroller.CheckConnStatus(blockId)\nif err != nil && strings.HasPrefix(err.Error(), \"not connected:\") {\n    // surface reconnect UI or retry with backoff\n}","preventionTips":["Confirm WSL distros are installed and running before opening wsl:// terminals","Avoid `wsl --shutdown` while wave blocks are open","Auto-retry conn checks with backoff after system resume"],"tags":["wsl","connection","network","status"],"backgroundTag":"connection-not-established","analyzedSha":"a4447c1563b2df285ab89e76c82f91e1a1a49c1e","analyzedAt":"2026-09-01T15:26:23.972Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}