Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
60b0a7b
chore: run connect-migrate automated tool (V1 → V2)
JivusAyrus Mar 20, 2026
85c8e37
feat: regenerate protobuf stubs with protoc-gen-es v2, remove protoc-…
JivusAyrus Mar 20, 2026
7219683
feat: upgrade shared package to Connect V2 / protobuf V2
JivusAyrus Mar 20, 2026
46497a1
feat: remove PlainMessage wrappers from controlplane for Connect V2
JivusAyrus Mar 20, 2026
e02cd86
feat: fix controlplane V2 types - remove explicit return types, fix c…
JivusAyrus Mar 30, 2026
389d511
feat: upgrade protographic to protobuf V2
JivusAyrus Mar 30, 2026
0fff74c
feat: upgrade CLI to Connect V2
JivusAyrus Mar 30, 2026
34a2726
feat: upgrade studio to Connect V2
JivusAyrus Mar 30, 2026
193dcf9
feat: fix composition-go/shim toJsonString for protobuf V2
JivusAyrus Mar 30, 2026
3118c57
fix: resolve CLI lint errors from Connect V2 migration
JivusAyrus Mar 30, 2026
4e893e9
fix: update CLI tests and serializer for protobuf V2
JivusAyrus Mar 30, 2026
457c892
fix: fix controlplane test compilation errors for protobuf V2
JivusAyrus Mar 30, 2026
c7464e2
fix: remove unnecessary blank line in changelog command
JivusAyrus Mar 30, 2026
7f50ffa
Merge branch 'main' of github.com:wundergraph/cosmo into suvij/eng-62…
JivusAyrus Mar 30, 2026
387be9e
chore: remove ClickHouse ORDER BY analysis document
JivusAyrus Mar 30, 2026
595800a
fix: ci
JivusAyrus Mar 30, 2026
2261829
fix: ci
JivusAyrus Mar 30, 2026
16cb5c0
fix: test
JivusAyrus Mar 30, 2026
f4810c1
chore: generate composition go
JivusAyrus Mar 30, 2026
0849d56
fix: lint
JivusAyrus Mar 30, 2026
232cd9b
fix: lint
JivusAyrus Mar 30, 2026
d846afb
feat: add TextEncoder/TextDecoder polyfill and fix BigInt return type
JivusAyrus Mar 30, 2026
de02fae
fix: update generated files to include import_extension=js in options
JivusAyrus Mar 30, 2026
81b41ee
fix: pr suggestions
JivusAyrus Mar 30, 2026
49f7c32
fix: update pnpm-lock.yaml to include '@bufbuild/protobuf' dependency
JivusAyrus Mar 30, 2026
ec6b97e
refactor: update request creation to use new request classes in plugi…
JivusAyrus Mar 30, 2026
db3fd4d
Refactor service functions to return PlainMessage types
JivusAyrus Mar 30, 2026
3f107ae
refactor: change import statements to use 'import type' for type-only…
JivusAyrus Mar 31, 2026
b3bea53
fix: pr suggestion
JivusAyrus Apr 1, 2026
fac0a8b
refactor: update event metadata handling to use new protobuf schemas
JivusAyrus Apr 7, 2026
205bc08
refactor: enhance transaction handling in setGraphRouterCompatibility…
JivusAyrus Apr 7, 2026
ce205df
Merge branch 'main' of github.com:wundergraph/cosmo into suvij/eng-62…
JivusAyrus Apr 7, 2026
3f7a3a3
fix: lint
JivusAyrus Apr 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 2 additions & 5 deletions buf.ts.gen.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@ version: v2
plugins:
- local: protoc-gen-es
out: connect/src
opt: target=ts
- local: protoc-gen-connect-es
out: connect/src
opt: target=ts
opt: target=ts,import_extension=js
- local: protoc-gen-connect-query
out: connect/src
opt: target=ts
opt: target=ts,import_extension=js
6 changes: 3 additions & 3 deletions cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,9 @@
],
"license": "Apache-2.0",
"dependencies": {
"@bufbuild/protobuf": "1.9.0",
"@connectrpc/connect": "1.4.0",
"@connectrpc/connect-node": "1.4.0",
"@bufbuild/protobuf": "^2.2.2",
"@connectrpc/connect": "^2.0.0",
"@connectrpc/connect-node": "^2.0.0",
"@graphql-tools/utils": "11.0.0",
"@modelcontextprotocol/sdk": "1.26.0",
"@octokit/rest": "22.0.0",
Expand Down
2 changes: 1 addition & 1 deletion cli/src/commands/graph/federated-graph/utils.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb';
import { Subgraph as ProtoSubgraph } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';
import type { Subgraph as ProtoSubgraph } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';
import { program } from 'commander';
import jwtDecode from 'jwt-decode';
import pc from 'picocolors';
Expand Down
2 changes: 1 addition & 1 deletion cli/src/commands/mcp/tools/get-subgraphs.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb';
import { z } from 'zod';
import { Subgraph } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';
import type { Subgraph } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';
import { getBaseHeaders } from '../../../core/config.js';
import { ToolContext } from './types.js';

Expand Down
14 changes: 8 additions & 6 deletions cli/src/commands/operations/commands/push.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
import crypto from 'node:crypto';
import { readFile } from 'node:fs/promises';

import { create } from '@bufbuild/protobuf';

import { Command } from 'commander';
import pc from 'picocolors';
import cliProgress from 'cli-progress';

import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb';
import {
PublishedOperation,
PersistedOperationSchema,
PublishedOperationStatus,
PersistedOperation,
} from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';
import type { PublishedOperation, PersistedOperation } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';

import { BaseCommandOptions } from '../../../core/types/types.js';
import { getBaseHeaders } from '../../../core/config.js';
Expand Down Expand Up @@ -50,7 +52,7 @@ const parseApolloPersistedQueryManifest = (data: ApolloPersistedQueryManifest):
return (
data.operations
?.filter((op) => op.id && op.body)
.map((op) => new PersistedOperation({ id: op.id, contents: op.body })) ?? []
.map((op) => create(PersistedOperationSchema, { id: op.id, contents: op.body })) ?? []
);
};

Expand All @@ -66,15 +68,15 @@ const isRelayQueryMap = (data: any): boolean => {
};

const parseRelayQueryMap = (data: Array<any>): PersistedOperation[] => {
return data.map((x: any) => new PersistedOperation({ id: x[0], contents: x[1] }));
return data.map((x: any) => create(PersistedOperationSchema, { id: x[0], contents: x[1] }));
};

const isRelayQueryObject = (data: any): boolean => {
return Object.keys(data).every((key) => typeof key === 'string' && typeof data[key] === 'string');
};

const parseRelayQueryObject = (data: any): PersistedOperation[] => {
return Object.keys(data).map((key) => new PersistedOperation({ id: key, contents: data[key] }));
return Object.keys(data).map((key) => create(PersistedOperationSchema, { id: key, contents: data[key] }));
};

const parseOperationsJson = (data: any): PersistedOperation[] => {
Expand Down Expand Up @@ -127,7 +129,7 @@ export const parseOperations = (contents: string): PersistedOperation[] => {
} catch {
// Assume it's plain graphql
const id = crypto.createHash('sha256').update(contents).digest('hex');
return [new PersistedOperation({ id, contents })];
return [create(PersistedOperationSchema, { id, contents })];
}
return parseOperationsJson(data);
};
Expand Down
6 changes: 4 additions & 2 deletions cli/src/commands/proposal/utils.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { existsSync } from 'node:fs';
import { readFile } from 'node:fs/promises';
import { create } from '@bufbuild/protobuf';
import { program } from 'commander';
import pc from 'picocolors';
import { resolve } from 'pathe';
import { Label } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';
import { LabelSchema } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';
import type { Label } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';
import { splitLabel } from '@wundergraph/cosmo-shared';

// Define interfaces for parsing parameters
Expand Down Expand Up @@ -82,7 +84,7 @@ export const processProposalSubgraphs = async ({
if (part.startsWith('labels:')) {
const labelsStr = part.slice('labels:'.length);
const labelStrings = labelsStr.trim().split(' ');
labels = labelStrings.map((label: string) => new Label(splitLabel(label)));
labels = labelStrings.map((label: string) => create(LabelSchema, splitLabel(label)));
} else {
const [key, value] = part.split(':');
if (key && value) {
Expand Down
22 changes: 16 additions & 6 deletions cli/src/commands/router/commands/compose.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { existsSync } from 'node:fs';
import { readFile, writeFile } from 'node:fs/promises';
import { create, fromJsonString, toJsonString } from '@bufbuild/protobuf';
import {
buildRouterConfig,
type ComposedSubgraph,
Expand All @@ -18,11 +19,20 @@ import * as yaml from 'js-yaml';
import { basename, dirname, resolve } from 'pathe';
import pc from 'picocolors';
import { printSchemaWithDirectives } from '@graphql-tools/utils';

import {
FeatureFlagRouterExecutionConfigSchema,
FeatureFlagRouterExecutionConfigsSchema,
GRPCMappingSchema,
RouterConfigSchema,
} from '@wundergraph/cosmo-connect/dist/node/v1/node_pb';

import type {
FeatureFlagRouterExecutionConfig,
FeatureFlagRouterExecutionConfigs,
GRPCMapping,
} from '@wundergraph/cosmo-connect/dist/node/v1/node_pb';

import Table from 'cli-table3';
import { FederationSuccess, ROUTER_COMPATIBILITY_VERSION_ONE } from '@wundergraph/composition';
import { BaseCommandOptions } from '../../../core/types/types.js';
Expand Down Expand Up @@ -269,10 +279,10 @@ export default (opts: BaseCommandOptions) => {
}

if (options.out) {
await writeFile(options.out, routerConfig.toJsonString());
await writeFile(options.out, toJsonString(RouterConfigSchema, routerConfig));
console.log(pc.green(`Router config successfully written to ${pc.bold(options.out)}`));
} else {
console.log(routerConfig.toJsonString());
console.log(toJsonString(RouterConfigSchema, routerConfig));
}
});

Expand Down Expand Up @@ -300,7 +310,7 @@ async function toSubgraphMetadataGRPC(inputFileLocation: string, s: GRPCSubgraph
validateGRPCSubgraph(inputFileLocation, s);

const mappingFileContent = await readFile(resolve(inputFileLocation, s.grpc.mapping_file), 'utf8');
const mapping = GRPCMapping.fromJsonString(mappingFileContent);
const mapping = fromJsonString(GRPCMappingSchema, mappingFileContent);

const protoSchemaFileContent = await readFile(resolve(inputFileLocation, s.grpc.proto_file), 'utf8');
const sdl = await readFile(resolve(inputFileLocation, s.grpc.schema_file), 'utf8');
Expand Down Expand Up @@ -345,7 +355,7 @@ async function toSubgraphMetadataPlugin(
protoSchema,
version: s.plugin.version,
sdl,
mapping: GRPCMapping.fromJsonString(mappingFile),
mapping: fromJsonString(GRPCMappingSchema, mappingFile),
};
}

Expand Down Expand Up @@ -513,7 +523,7 @@ async function buildFeatureFlagsConfig(
subgraphs: SubgraphMetadata[],
options: any,
): Promise<FeatureFlagRouterExecutionConfigs> {
const ffConfigs: FeatureFlagRouterExecutionConfigs = new FeatureFlagRouterExecutionConfigs();
const ffConfigs: FeatureFlagRouterExecutionConfigs = create(FeatureFlagRouterExecutionConfigsSchema);

// @TODO This logic should exist only once in the shared package and reused across
// control-plane and cli
Expand Down Expand Up @@ -671,7 +681,7 @@ async function buildFeatureFlagsConfig(
}),
});

ffConfigs.configByFeatureFlagName[ff.name] = new FeatureFlagRouterExecutionConfig({
ffConfigs.configByFeatureFlagName[ff.name] = create(FeatureFlagRouterExecutionConfigSchema, {
version: featureRouterConfig.version,
subgraphs: featureRouterConfig.subgraphs,
engineConfig: featureRouterConfig.engineConfig,
Expand Down
6 changes: 4 additions & 2 deletions cli/src/commands/subgraph/commands/check.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { existsSync } from 'node:fs';
import { readFile } from 'node:fs/promises';
import { create } from '@bufbuild/protobuf';
import { Command, program } from 'commander';
import { resolve } from 'pathe';
import pc from 'picocolors';
import { VCSContext } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';
import { VCSContextSchema } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';
import type { VCSContext } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';
import { splitLabel } from '@wundergraph/cosmo-shared';
import { config, getBaseHeaders } from '../../../core/config.js';
import { BaseCommandOptions } from '../../../core/types/types.js';
Expand Down Expand Up @@ -70,7 +72,7 @@ export default (opts: BaseCommandOptions) => {
let vcsContext: VCSContext | undefined;

if (config.checkAuthor || config.checkCommitSha || config.checkBranch) {
vcsContext = new VCSContext({
vcsContext = create(VCSContextSchema, {
author: config.checkAuthor,
commitSha: config.checkCommitSha,
branch: config.checkBranch,
Expand Down
2 changes: 1 addition & 1 deletion cli/src/commands/subgraph/commands/fetch.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { writeFile } from 'node:fs/promises';
import { Response } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';
import type { Response } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';
import { Command, program } from 'commander';
import { resolve } from 'pathe';
import pc from 'picocolors';
Expand Down
11 changes: 6 additions & 5 deletions cli/src/commands/subgraph/commands/publish.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { readFile } from 'node:fs/promises';
import { existsSync } from 'node:fs';
import { readFile } from 'node:fs/promises';
import { create } from '@bufbuild/protobuf';
import Table from 'cli-table3';
import { Command, program } from 'commander';
import ora from 'ora';
Expand All @@ -11,7 +12,7 @@ import {
parseGraphQLWebsocketSubprotocol,
splitLabel,
} from '@wundergraph/cosmo-shared';
import { SubgraphPublishStats, SubgraphType } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';
import { SubgraphPublishStatsSchema, SubgraphType } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';
import { BaseCommandOptions } from '../../../core/types/types.js';
import { getBaseHeaders } from '../../../core/config.js';
import { printTruncationWarning, validateSubscriptionProtocols } from '../../../utils.js';
Expand Down Expand Up @@ -192,7 +193,7 @@ export default (opts: BaseCommandOptions) => {
if (options.failOnCompositionError) {
// Only composition errors were displayed at this point, warnings come after switch
printTruncationWarning({
displayedErrorCounts: new SubgraphPublishStats({
displayedErrorCounts: create(SubgraphPublishStatsSchema, {
compositionErrors: resp.compositionErrors.length,
compositionWarnings: 0,
deploymentErrors: 0,
Expand Down Expand Up @@ -232,7 +233,7 @@ export default (opts: BaseCommandOptions) => {
if (options.failOnAdmissionWebhookError) {
// Only deployment errors were displayed at this point, warnings come after switch
printTruncationWarning({
displayedErrorCounts: new SubgraphPublishStats({
displayedErrorCounts: create(SubgraphPublishStatsSchema, {
compositionErrors: 0,
compositionWarnings: 0,
deploymentErrors: resp.deploymentErrors.length,
Expand Down Expand Up @@ -282,7 +283,7 @@ export default (opts: BaseCommandOptions) => {
}

// Determine what was actually displayed based on the response code
const displayedErrorCounts = new SubgraphPublishStats({
const displayedErrorCounts = create(SubgraphPublishStatsSchema, {
compositionErrors:
resp.response?.code === EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED ? resp.compositionErrors.length : 0,
compositionWarnings: displayedWarnings,
Expand Down
14 changes: 7 additions & 7 deletions cli/src/core/client/client.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { compressionBrotli, compressionGzip, createConnectTransport } from '@connectrpc/connect-node';
import { createPromiseClient, PromiseClient } from '@connectrpc/connect';
import { PlatformService } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_connect';
import { NodeService } from '@wundergraph/cosmo-connect/dist/node/v1/node_connect';
import { createClient, Client as ConnectClient } from '@connectrpc/connect';
import { PlatformService } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';
import { NodeService } from '@wundergraph/cosmo-connect/dist/node/v1/node_pb';
import { HttpsProxyAgent } from 'https-proxy-agent';

export interface ClientOptions {
Expand All @@ -11,8 +11,8 @@ export interface ClientOptions {
}

export interface Client {
platform: PromiseClient<typeof PlatformService>;
node?: PromiseClient<typeof NodeService>;
platform: ConnectClient<typeof PlatformService>;
node?: ConnectClient<typeof NodeService>;
}

export const CreateClient = (opts: ClientOptions): Client => {
Expand Down Expand Up @@ -41,7 +41,7 @@ export const CreateClient = (opts: ClientOptions): Client => {
});

return {
platform: createPromiseClient(PlatformService, transport),
node: createPromiseClient(NodeService, transport),
platform: createClient(PlatformService, transport),
node: createClient(NodeService, transport),
};
};
2 changes: 1 addition & 1 deletion cli/src/core/types/types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {
import type {
CompositionError,
CompositionWarning,
DeploymentError,
Expand Down
11 changes: 6 additions & 5 deletions cli/src/github.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { readFileSync } from 'node:fs';
import { PartialMessage } from '@bufbuild/protobuf';
import { GitInfo } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';
import { create } from '@bufbuild/protobuf';
import { GitInfoSchema } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';
import type { GitInfo } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';
import envCi from 'env-ci';
import { Client } from './core/client/client.js';
import { getBaseHeaders } from './core/config.js';
Expand Down Expand Up @@ -44,16 +45,16 @@ export function useGitHub() {
}

export const verifyGitHubIntegration = async (client: Client) => {
let gitInfo: PartialMessage<GitInfo> | undefined;
let gitInfo: GitInfo | undefined;
const { isPr, commit: commitSha, repository, accountId } = useGitHub();
if (isPr && commitSha && repository && accountId) {
const [ownerSlug, repositorySlug] = repository?.split('/');
gitInfo = {
gitInfo = create(GitInfoSchema, {
commitSha,
accountId,
ownerSlug,
repositorySlug,
};
});
}

let ignoreErrorsDueToGitHubIntegration = false;
Expand Down
13 changes: 9 additions & 4 deletions cli/src/handle-composition-result.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb';
import { create } from '@bufbuild/protobuf';
// eslint-disable-next-line import/named
import { Ora } from 'ora';
import Table from 'cli-table3';
import pc from 'picocolors';
import {

import { SubgraphPublishStatsSchema } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';

import type {
CompositionError,
CompositionWarning,
DeploymentError,
SubgraphPublishStats,
} from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';

import { SubgraphCommandJsonOutput } from './core/types/types.js';
import { printTruncationWarning } from './utils.js';

Expand Down Expand Up @@ -110,7 +115,7 @@ export function handleCompositionResult({
if (failOnCompositionError) {
// Only composition errors were displayed at this point; warnings come after the switch statement
printTruncationWarning({
displayedErrorCounts: new SubgraphPublishStats({
displayedErrorCounts: create(SubgraphPublishStatsSchema, {
compositionErrors: compositionErrors.length,
compositionWarnings: 0,
deploymentErrors: 0,
Expand Down Expand Up @@ -160,7 +165,7 @@ export function handleCompositionResult({
if (failOnAdmissionWebhookError) {
// Only deployment errors were displayed at this point; warnings come after the switch statement
printTruncationWarning({
displayedErrorCounts: new SubgraphPublishStats({
displayedErrorCounts: create(SubgraphPublishStatsSchema, {
compositionErrors: 0,
compositionWarnings: 0,
deploymentErrors: deploymentErrors.length,
Expand Down Expand Up @@ -225,7 +230,7 @@ export function handleCompositionResult({
}

// Determine what was actually displayed based on the response code
const displayedErrorCounts = new SubgraphPublishStats({
const displayedErrorCounts = create(SubgraphPublishStatsSchema, {
compositionErrors: responseCode === EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED ? compositionErrors.length : 0,
compositionWarnings: displayedWarnings,
deploymentErrors: responseCode === EnumStatusCode.ERR_DEPLOYMENT_FAILED ? deploymentErrors.length : 0,
Expand Down
2 changes: 1 addition & 1 deletion cli/src/handle-proposal-result.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb';
import {
import type {
CreateProposalResponse,
UpdateProposalResponse,
} from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';
Expand Down
Loading
Loading