{"record":{"id":"ed729c6020364a41","repo":"dagger/dagger","slug":"resolve-session-socket-q-empty-session-id","errorCode":null,"errorMessage":"resolve session socket %q: empty session ID","messagePattern":"resolve session socket %q: empty session ID","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/socket.go","lineNumber":107,"sourceCode":"\t\tPortForwardVal: persisted.PortForward,\n\t}, nil\n}\n\n//nolint:dupl // symmetric with resolveSessionSecret; sharing hides Socket vs Secret semantics\nfunc ResolveSessionSocket(ctx context.Context, socket *Socket) (*Socket, error) {\n\tif socket == nil {\n\t\treturn nil, nil\n\t}\n\tif socket.Handle == \"\" {\n\t\treturn socket, nil\n\t}\n\n\tclientMetadata, err := engine.ClientMetadataFromContext(ctx)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"resolve session socket %q: current client metadata: %w\", socket.Handle, err)\n\t}\n\tif clientMetadata.SessionID == \"\" {\n\t\treturn nil, fmt.Errorf(\"resolve session socket %q: empty session ID\", socket.Handle)\n\t}\n\tcache, err := dagql.EngineCache(ctx)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"resolve session socket %q: current dagql cache: %w\", socket.Handle, err)\n\t}\n\tresolvedAny, err := cache.ResolveSessionResource(ctx, clientMetadata.SessionID, clientMetadata.ClientID, socket.Handle)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresolved, ok := resolvedAny.(*Socket)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"resolve session socket %q: bound value is %T\", socket.Handle, resolvedAny)\n\t}\n\tif resolved.Handle != \"\" {\n\t\treturn nil, fmt.Errorf(\"resolve session socket %q: bound socket is still a handle\", socket.Handle)\n\t}\n\treturn resolved, nil\n}","sourceCodeStart":89,"sourceCodeEnd":125,"githubUrl":"https://github.com/dagger/dagger/blob/82ba2681dbe30d3547a1dc50ea495900ab5b6047/core/socket.go#L89-L125","documentation":"ResolveSessionSocket found client metadata but its SessionID is empty, so the socket handle cannot be keyed to a session for lookup. The request carries a malformed/partial session identity rather than a missing one — a guard against resolving a session socket under an anonymous context.","triggerScenarios":"Thrown at core/socket.go:107 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Ensure the client establishes a real session (SessionID set) before using host sockets","Re-run the call from a properly initialized CLI/session context","Check for middleware or custom API clients that strip the session ID from metadata"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"82ba2681dbe30d3547a1dc50ea495900ab5b6047","analyzedAt":"2026-09-05T07:21:37.930Z","contentChangedAt":"2026-09-05T07:21:37.930Z","schemaVersion":2},"datasetVersion":"2026-09-12T12:17:11.808Z"}