Skip to content

Preserve typed catalogue unions in SDK codegen - #2486

Open
gokhanarkan wants to merge 2 commits into
mainfrom
gokhanarkan/expose-catalogue-search
Open

Preserve typed catalogue unions in SDK codegen#2486
gokhanarkan wants to merge 2 commits into
mainfrom
gokhanarkan/expose-catalogue-search

Conversation

@gokhanarkan

@gokhanarkan gokhanarkan commented Sep 2, 2026

Copy link
Copy Markdown
Member

Summary

  • preserve MCP server and AI skill candidate variants in Python codegen instead of flattening them
  • promote nested catalogue candidate and source unions in Java instead of generating List<Object>
  • strip forbidden raw-card fields from TypeScript catalogue responses and reject unknown Go candidate kinds before raw payloads can escape
  • keep Java's schema package exact through its Maven update profile
  • generate explicit Python catalogue failure paths that satisfy CodeQL
  • add published-schema validation and focused semantic conformance across all six SDKs

Part of #2106.

Unique files

Generator and build sources

  • scripts/codegen/catalogue-conformance.ts
  • scripts/codegen/go.ts
  • scripts/codegen/package.json
  • scripts/codegen/python.ts
  • scripts/codegen/typescript.ts
  • java/scripts/codegen/java.ts
  • java/scripts/codegen/package.json
  • java/scripts/codegen/package-lock.json
  • java/sdk/pom.xml

Directly generated output

  • go/rpc/zrpc.go
  • go/rpc/zrpc_encoding.go
  • nodejs/src/generated/rpc.ts
  • python/copilot/generated/rpc.py
  • java/sdk/src/generated/java/com/github/copilot/generated/rpc/CatalogAiSkillCandidate.java
  • java/sdk/src/generated/java/com/github/copilot/generated/rpc/CatalogAiSkillCandidateProvenance.java
  • java/sdk/src/generated/java/com/github/copilot/generated/rpc/CatalogCandidate.java
  • java/sdk/src/generated/java/com/github/copilot/generated/rpc/CatalogCandidateSource.java
  • java/sdk/src/generated/java/com/github/copilot/generated/rpc/CatalogCandidateSourceEmbedded.java
  • java/sdk/src/generated/java/com/github/copilot/generated/rpc/CatalogCandidateSourceUrl.java
  • java/sdk/src/generated/java/com/github/copilot/generated/rpc/CatalogMcpServerCandidate.java
  • java/sdk/src/generated/java/com/github/copilot/generated/rpc/CatalogMcpServerCandidateProvenance.java
  • java/sdk/src/generated/java/com/github/copilot/generated/rpc/CatalogMcpServerInstallability.java
  • java/sdk/src/generated/java/com/github/copilot/generated/rpc/CatalogSearchSucceeded.java

Conformance tests

  • nodejs/test/catalogue-conformance.test.ts
  • python/test_rpc_generated.py
  • go/rpc/catalogue_conformance_test.go
  • dotnet/test/Unit/CatalogueConformanceTests.cs
  • rust/tests/catalogue_conformance_test.rs
  • java/sdk/src/test/java/com/github/copilot/generated/CatalogConformanceTest.java

No generated session-event files, runtime pins, downloaders, materialisation policy, planning, or apply logic are included.

Validation

  • shared and Java generation drift: clean against @github/copilot 1.0.83-3
  • Node: type check and 1 focused conformance test passed
  • Python: Ruff, ty, and 4 focused conformance tests passed
  • Go: 3 focused catalogue conformance tests passed
  • .NET: 2 focused conformance tests passed
  • Rust: 2 focused conformance tests passed
  • Java: 2 focused conformance tests passed; exact schema-update Maven profile passed
  • all three review findings replied to and resolved

@gokhanarkan
gokhanarkan requested a review from a team as a code owner September 2, 2026 15:30
Copilot AI balanced review requested due to automatic review settings September 2, 2026 15:30
@github-actions

This comment has been minimized.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Go can still expose raw catalogue fields, Rust gains a source-breaking public field, and Java’s update profile can undo the exact schema pin.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Review tier: Balanced
Findings: 2 Medium severity

New issues introduced by this change (2)
Severity Finding
Medium severity go/​rpc/​catalogue_conformance_test.go — This assertion only exercises the two known candidate variants, which decode into typed structs and…
Medium severity java/​scripts/​codegen/​package.json — The documented Java schema-update profile does not preserve this exact pin:…
What changed in this PR

Adds schema-pinned, typed catalog.search bindings across all SDKs, including union generation, raw-card filtering, and conformance tests.

Changes:

  • Pins code generation to @github/copilot@1.0.83-2.
  • Generates catalogue APIs and nested candidate/result types for six languages.
  • Adds cross-language conformance coverage and regenerates newer schema surfaces.
File Description
.github/​workflows/​update-copilot-dependency.yml Updates codegen dependencies exactly.
dotnet/​src/​Generated/​Rpc.cs Generates catalogue and newer RPC types.
dotnet/​src/​Generated/​SessionEvents.cs Regenerates session events.
dotnet/​test/​Unit/​CatalogueConformanceTests.cs Tests catalogue model conformance.
go/​rpc/​catalogue_conformance_test.go Tests catalogue decoding and leakage.
go/​rpc/​zrpc.go Generates catalogue and newer RPC APIs.
go/​rpc/​zsession_encoding.go Encodes added session events.
go/​rpc/​zsession_events.go Generates session-event models.
go/​zsession_events.go Exports added event types.
java/​scripts/​codegen/​java.ts Supports nested discriminated unions.
java/​scripts/​codegen/​package-lock.json Locks the schema package.
java/​scripts/​codegen/​package.json Pins the Java schema dependency.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​AgentModelPolicy.java Adds generated model policy.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​AssistantFusionPhaseActivityEvent.java Adds Fusion activity event.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​CompletionReceiptEventRange.java Adds receipt range type.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​CompletionReceiptFinalTool.java Adds receipt tool type.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​CompletionReceiptStopReason.java Adds receipt stop reasons.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​CompletionReceiptToolStatus.java Adds receipt tool statuses.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​CustomAgentsUpdatedAgent.java Regenerates agent event data.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​FusionPhaseActivityKind.java Adds Fusion activity kinds.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​FusionPhasePlanStep.java Adds Fusion plan steps.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​PermissionRequestedEvent.java Regenerates permission events.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​SessionCompletionReceiptEvent.java Adds completion receipt event.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​SessionEvent.java Registers added event variants.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​SessionFusionResolvedEvent.java Regenerates Fusion event data.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​SubagentCompletedEvent.java Regenerates completion data.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​SubagentFailedEvent.java Regenerates failure data.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​UserMessageEvent.java Regenerates message event data.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​AgentInfo.java Adds model policy metadata.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​AgentModelPolicy.java Adds RPC model policy.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​CatalogAiSkillCandidate.java Models AI skill candidates.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​CatalogAiSkillCandidateProvenance.java Models skill provenance.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​CatalogCandidate.java Adds candidate union base.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​CatalogCandidateSource.java Adds source union base.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​CatalogCandidateSourceEmbedded.java Models embedded sources.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​CatalogCandidateSourceUrl.java Models URL sources.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​CatalogMcpServerCandidate.java Models MCP candidates.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​CatalogMcpServerCandidateProvenance.java Models MCP provenance.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​CatalogMcpServerInstallability.java Models installation status.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​CatalogSearchSucceeded.java Models successful searches.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​DiscoveredHook.java Adds hook discovery type.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​HookOrigin.java Adds hook origins.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​HookType.java Regenerates hook types.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​HooksDiscoverParams.java Adds hook discovery input.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​HooksDiscoverResult.java Adds hook discovery output.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​QueuePendingItems.java Adds queued-message identity.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​SandboxConfigUserPolicyNetwork.java Updates network documentation.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​SandboxConfigUserPolicyNetworkProxy.java Updates proxy constraints.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​ServerHooksApi.java Adds hook discovery API.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​ServerRpc.java Exposes generated namespaces.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​ServerSessionsApi.java Adds persisted-event reads.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​SessionModelSwitchToParams.java Updates model-switch semantics.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​SessionsReadPersistedEventsParams.java Adds persisted-event parameters.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​SessionsReadPersistedEventsResult.java Adds persisted-event results.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​SubagentSettingsEntry.java Adds subagent model policy.
java/​sdk/​src/​test/​java/​com/​github/​copilot/​RpcSessionStateExtrasE2ETest.java Updates session-state fixtures.
java/​sdk/​src/​test/​java/​com/​github/​copilot/​generated/​CatalogConformanceTest.java Tests Java catalogue semantics.
java/​sdk/​src/​test/​java/​com/​github/​copilot/​generated/​rpc/​GeneratedRpcRecordsCoverageTest.java Updates generated-record coverage.
nodejs/​src/​generated/​rpc.ts Adds typed catalogue RPC and filtering.
nodejs/​src/​generated/​session-events.ts Regenerates session-event types.
nodejs/​test/​catalogue-conformance.test.ts Tests TypeScript catalogue behavior.
nodejs/​test/​e2e/​disabled_mcp_servers.e2e.test.ts Updates E2E configuration.
nodejs/​test/​e2e/​session_config.e2e.test.ts Updates E2E configuration.
python/​copilot/​generated/​rpc.py Generates catalogue and newer RPC types.
python/​copilot/​generated/​session_events.py Regenerates session events.
python/​test_rpc_generated.py Tests generated catalogue behavior.
rust/​src/​generated/​api_types.rs Generates catalogue and newer API types.
rust/​src/​generated/​rpc.rs Adds typed catalogue RPC access.
rust/​src/​generated/​session_events.rs Regenerates session events.
rust/​tests/​catalogue_conformance_test.rs Tests Rust catalogue semantics.
rust/​tests/​e2e/​rpc_session_state_extras.rs Updates subagent settings fixture.
scripts/​codegen/​catalogue-conformance.ts Validates catalogue schema invariants.
scripts/​codegen/​package-lock.json Locks codegen schema dependencies.
scripts/​codegen/​package.json Adds schema pin and conformance command.
scripts/​codegen/​python.ts Normalizes the AI acronym.
scripts/​codegen/​typescript.ts Generates catalogue response sanitization.
scripts/​codegen/​utils.ts Uses dedicated codegen dependencies.
Files not reviewed (5)
  • go/rpc/zsession_encoding.go: Generated file
  • go/rpc/zsession_events.go: Generated file
  • go/zsession_events.go: Generated file
  • java/scripts/codegen/package-lock.json: Generated file
  • scripts/codegen/package-lock.json: Generated file

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread go/rpc/catalogue_conformance_test.go
Comment thread java/scripts/codegen/package.json Outdated
@gokhanarkan
gokhanarkan marked this pull request as draft September 2, 2026 15:42
@gokhanarkan
gokhanarkan force-pushed the gokhanarkan/expose-catalogue-search branch from bc93c27 to de78eae Compare September 2, 2026 15:43
@gokhanarkan
gokhanarkan changed the base branch from main to update-copilot-1.0.83-2 September 2, 2026 15:43
@gokhanarkan gokhanarkan changed the title Expose typed catalogue search bindings Preserve typed catalogue unions in SDK codegen Sep 2, 2026
Comment thread python/copilot/generated/rpc.py Fixed
@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Cross-SDK Consistency Review — PR #2486

Reviewed the authoritative diff (get_files/get_diff) covering the catalog.search polymorphic candidate typing fix and its conformance tests.

Findings: no consistency issues. This PR achieves full parity across all six SDKs:

  • Root cause fix: Java's codegen (java.ts) previously fell back to List<Object> for the CatalogSearchSucceeded.candidates field because its resolveAnyOfVariants/nested-union handling didn't support oneOf or promote nested discriminated unions to standalone polymorphic types. The PR generalizes this to resolveUnionVariants (handles anyOf + oneOf) and adds collectPromotedNestedUnionTypes, bringing Java's generated CatalogCandidate typing in line with what Go, .NET, Python, and Rust already produced (confirmed by inspecting go.ts, csharp.ts, python.ts, rust.ts — they already handle oneOf).
  • Conformance tests added in all 6 languages (dotnet/test/Unit/CatalogueConformanceTests.cs, go/rpc/catalogue_conformance_test.go, java/.../CatalogConformanceTest.java, nodejs/test/catalogue-conformance.test.ts, python/test_rpc_generated.py, rust/tests/catalogue_conformance_test.rs), each asserting the same three behaviors: typed candidate polymorphism, opaque handle preservation, and that forbidden raw-card fields (card, cardData, rawCard) never leak on the wire.
  • New scripts/codegen/catalogue-conformance.ts enforces at generation time that the schema itself never (re-)introduces those forbidden fields — a shared source of truth all generators run against (wired into npm run generate via package.json).
  • Node-specific runtime sanitizer (sanitizeCatalogSearchResult/FORBIDDEN_CATALOG_RESPONSE_FIELDS in nodejs/src/generated/rpc.ts, emitted by typescript.ts): this is a legitimate language-idiom difference, not a gap. TypeScript's structural typing is erased at runtime, so a stray extra field from the wire would otherwise pass through untouched. The other five SDKs get equivalent protection for free from their typed deserialization paths (Python from_dict only reads declared keys, Rust serde drops unknown fields by default, Java's ObjectMapper is configured with FAIL_ON_UNKNOWN_PROPERTIES=false, .NET/Go typed structs ignore unmapped JSON keys). No action needed there.

No API naming/shape drift, no single-language-only feature additions. Nice work keeping this in sync — nothing further to flag.

Generated by SDK Consistency Review Agent for #2486 · sonnet50 64.3 AIC · ⌖ 3.93 AIC · ⊞ 8.8K ·

@stephentoub
stephentoub force-pushed the update-copilot-1.0.83-2 branch from b2ac890 to 0cc1b2c Compare September 2, 2026 17:19
Base automatically changed from update-copilot-1.0.83-2 to main September 2, 2026 23:31
@gokhanarkan
gokhanarkan force-pushed the gokhanarkan/expose-catalogue-search branch from de78eae to c0813e4 Compare September 3, 2026 07:35
@gokhanarkan
gokhanarkan marked this pull request as ready for review September 3, 2026 07:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants