dagger/dagger · error

source socket is nil

Error message

source socket is nil

What it means

After loading the Source socket argument, sshAuthSocket unwraps it to *core.Socket with dagql.UnwrapAs. This error means the loaded value decoded successfully but is not a *core.Socket (or unwrapped to nil), so there is no concrete socket to work with.

Source

Thrown at core/schema/host.go:479

	cache, err := dagql.EngineCache(ctx)
	if err != nil {
		return inst, fmt.Errorf("failed to get dagql cache: %w", err)
	}

	clientMetadata, err := engine.ClientMetadataFromContext(ctx)
	if err != nil {
		return inst, fmt.Errorf("failed to get client metadata: %w", err)
	}

	var concreteSelf *core.Socket
	if args.Source.Valid {
		concrete, err := args.Source.Value.Load(ctx, srv)
		if err != nil {
			return inst, fmt.Errorf("failed to load source socket: %w", err)
		}
		concreteSelf, _ = dagql.UnwrapAs[*core.Socket](concrete)
		if concreteSelf == nil {
			return inst, errors.New("source socket is nil")
		}
		concreteSelf, err = core.ResolveSessionSocket(ctx, concreteSelf)
		if err != nil {
			return inst, fmt.Errorf("failed to resolve source socket: %w", err)
		}
		if concreteSelf == nil {
			return inst, errors.New("resolved source socket is nil")
		}
	} else {
		if clientMetadata.SSHAuthSocketPath == "" {
			return inst, errors.New("SSH_AUTH_SOCK is not set")
		}
		concreteVal := &core.Socket{
			Kind:           core.SocketKindUnixOpaque,
			URLVal:         (&url.URL{Scheme: "unix", Path: clientMetadata.SSHAuthSocketPath}).String(),
			SourceClientID: clientMetadata.ClientID,
		}
		concreteSelf = concreteVal

View on GitHub (pinned to 82ba2681db)

Solutions

  1. Ensure the Source argument is genuinely a Host socket reference (e.g. from host.unixSocket or a prior sshAuthSocket call), not another type
  2. Regenerate the client/upgrade SDK so socket IDs match the engine's concrete type
  3. Check that the ID was not manually constructed
Defensive patterns

Strategy: type-guard

Validate before calling

if !isSocketRef(src) { return errors.New("source must be a Socket") }

Type guard

func isSocketRef(v dagql.Typed) bool {
    _, ok := dagql.UnwrapAs[*core.Socket](v)
    return ok
}

Try / catch

if err != nil && strings.Contains(err.Error(), "source socket is nil") {
    // passed a non-socket object; pass a genuine Host socket instead
}

Prevention

When it happens

Trigger: Passing a Source object that is a Socket instance but whose underlying value fails to unwrap as *core.Socket — e.g. an ID that resolves to a different concrete type or a nil payload.

Common situations: Mixing object kinds (passing a secret, service, or directory ID where a socket is expected); engine/SDK version skew changing the socket concrete type.

Related errors


AI-assisted analysis of dagger/dagger@82ba2681db (2026-09-05). Data as JSON: /api/errors/f83f2aca36ad7990. Report an issue: GitHub.