github/copilot-sdk · error

reading runtime assets

Error message

reading runtime assets: %w

What it means

installRuntimeAssets slurps the entire runtime archive from config.RuntimeAssets via io.ReadAll. Any read failure is wrapped as "reading runtime assets". This is the first integrity step before hash verification and extraction.

Solutions

  1. Verify RuntimeAssets points to a valid, open reader (e.g. bytes.NewReader or embed.FS Open)
  2. If sourced over the network, retry the download before install
  3. Confirm the embedded runtime asset exists in the build (go:embed pattern matches)
  4. Wrap the source in a buffered reader built from a complete local copy

Example fix

// before
cfg.RuntimeAssets = closedReader // read failed
// after
f, err := assets.Open("runtime.tar.gz")
if err != nil { return err }
defer f.Close()
cfg.RuntimeAssets = f
Defensive patterns

Strategy: try-catch

Validate before calling

if cfg.RuntimeAssets == nil { return errors.New("RuntimeAssets reader not set") }
if c, ok := cfg.RuntimeAssets.(io.Closer); ok { /* ensure not already closed */ _ = c }

Type guard

func hasRuntimeAssets(cfg embeddedcli.Config) bool {
    return cfg.RuntimeAssets != nil && cfg.RuntimeAssetsHash != nil
}

Try / catch

err := embeddedcli.InstallRuntime(ctx, cfg, dir)
if err != nil && strings.Contains(err.Error(), "reading runtime assets") {
    return retryWithFreshReader(ctx) // rebuild the reader and retry once
}

Prevention

When it happens

Trigger: io.ReadAll(config.RuntimeAssets) errors: the embedded asset reader is nil-backed/closed, a network/HTTP body reader was interrupted, or an fs.File/bytes source hit an I/O error.

Common situations: Embedding an asset via a flaky network fetch at startup; passing an already-closed reader as RuntimeAssets; interrupted download of runtime archives.

Understand the failure class

Background: "failed to read file", EACCES, ENOENT and "could not read <path>" errors: when a program can't read a file from disk — this error's family across 49 libraries.

Related errors


AI-assisted analysis of github/copilot-sdk@cd8cf15dc3 (2026-09-09). Data as JSON: /api/errors/8d95c040e57b1d34. Report an issue: GitHub.

Appendix: source

Thrown at go/internal/embeddedcli/embeddedcli.go:372

	return path, nil
}

func validateOptionalHash(reader io.Reader, hash []byte, name string) {
	if reader != nil && len(hash) != sha256.Size {
		panic(fmt.Sprintf("%s must be a SHA-256 hash (%d bytes), got %d bytes", name, sha256.Size, len(hash)))
	}
}

func installRuntimeAssets(installDir string) error {
	if config.RuntimeAssets == nil || runtimeAssetsInstalled {
		return nil
	}
	archiveBytes, err := io.ReadAll(config.RuntimeAssets)
	if closer, ok := config.RuntimeAssets.(io.Closer); ok {
		closer.Close()
	}
	if err != nil {
		return fmt.Errorf("reading runtime assets: %w", err)
	}
	actual := sha256.Sum256(archiveBytes)
	if !bytes.Equal(actual[:], config.RuntimeAssetsHash) {
		return fmt.Errorf("runtime assets hash mismatch")
	}
	gzipReader, err := gzip.NewReader(bytes.NewReader(archiveBytes))
	if err != nil {
		return fmt.Errorf("opening runtime assets: %w", err)
	}
	defer gzipReader.Close()
	tarReader := tar.NewReader(gzipReader)
	for {
		header, err := tarReader.Next()
		if err == io.EOF {
			break
		}
		if err != nil {
			return fmt.Errorf("reading runtime assets: %w", err)

View on GitHub (pinned to cd8cf15dc3)