| 38 | } |
| 39 | |
| 40 | func (a *ManifestAPI) GetManifest(ctx context.Context, _ *agentproto.GetManifestRequest) (*agentproto.Manifest, error) { |
| 41 | var ( |
| 42 | dbApps []database.WorkspaceApp |
| 43 | scripts []database.GetWorkspaceAgentScriptsByAgentIDsRow |
| 44 | metadata []database.WorkspaceAgentMetadatum |
| 45 | workspace database.Workspace |
| 46 | devcontainers []database.WorkspaceAgentDevcontainer |
| 47 | ) |
| 48 | |
| 49 | workspaceAgent, err := a.AgentFn(ctx) |
| 50 | if err != nil { |
| 51 | return nil, xerrors.Errorf("getting workspace agent: %w", err) |
| 52 | } |
| 53 | |
| 54 | var eg errgroup.Group |
| 55 | eg.Go(func() (err error) { |
| 56 | dbApps, err = a.Database.GetWorkspaceAppsByAgentID(ctx, workspaceAgent.ID) |
| 57 | if err != nil && !xerrors.Is(err, sql.ErrNoRows) { |
| 58 | return err |
| 59 | } |
| 60 | return nil |
| 61 | }) |
| 62 | eg.Go(func() (err error) { |
| 63 | // nolint:gocritic // This is necessary to fetch agent scripts! |
| 64 | scripts, err = a.Database.GetWorkspaceAgentScriptsByAgentIDs(dbauthz.AsSystemRestricted(ctx), []uuid.UUID{workspaceAgent.ID}) |
| 65 | return err |
| 66 | }) |
| 67 | eg.Go(func() (err error) { |
| 68 | metadata, err = a.Database.GetWorkspaceAgentMetadata(ctx, database.GetWorkspaceAgentMetadataParams{ |
| 69 | WorkspaceAgentID: workspaceAgent.ID, |
| 70 | Keys: nil, // all |
| 71 | }) |
| 72 | return err |
| 73 | }) |
| 74 | eg.Go(func() (err error) { |
| 75 | workspace, err = a.Database.GetWorkspaceByID(ctx, a.WorkspaceID) |
| 76 | if err != nil { |
| 77 | return xerrors.Errorf("getting workspace by id: %w", err) |
| 78 | } |
| 79 | return err |
| 80 | }) |
| 81 | eg.Go(func() (err error) { |
| 82 | devcontainers, err = a.Database.GetWorkspaceAgentDevcontainersByAgentID(ctx, workspaceAgent.ID) |
| 83 | if err != nil && !errors.Is(err, sql.ErrNoRows) { |
| 84 | return err |
| 85 | } |
| 86 | return nil |
| 87 | }) |
| 88 | err = eg.Wait() |
| 89 | if err != nil { |
| 90 | return nil, xerrors.Errorf("fetching workspace agent data: %w", err) |
| 91 | } |
| 92 | |
| 93 | // Fetch user secrets for injection into the agent manifest. |
| 94 | // This runs after the errgroup because it needs workspace.OwnerID. |
| 95 | //nolint:gocritic // System context needed to read secrets for the workspace owner. |
| 96 | userSecrets, err := a.Database.ListUserSecretsWithValues(dbauthz.AsSystemRestricted(ctx), workspace.OwnerID) |
| 97 | if err != nil { |