Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
6561490
Initial plan
Copilot Apr 12, 2026
3ef1b22
Add Java code generation from JSON schemas
Copilot Apr 12, 2026
6e3c50c
Add comment explaining npm install before npm ci in update workflow
Copilot Apr 13, 2026
75e5dba
Improve Java code generator: sealed hierarchy, records, Long for inte…
Copilot Apr 13, 2026
e9c0bf7
Add @JsonInclude(NON_NULL) to all generated event classes and warn on…
edburns Apr 14, 2026
da9ec9c
Migrate events package to auto-generated SessionEvent types
Copilot Apr 14, 2026
7e7b283
Fix residual old-package references and rename SessionEventParserTest
edburns Apr 15, 2026
6d35942
Generate typed RPC wrapper classes (ServerRpc, SessionRpc) from api.s…
Copilot Apr 15, 2026
e4dc6e5
Fix race condition in SessionEventsE2ETest: wait for own listener to …
Copilot Apr 16, 2026
a2712a7
Chunk 3: Wire generated RPC wrappers into CopilotClient and CopilotSe…
Copilot Apr 16, 2026
f21a5ae
Merge remote-tracking branch 'upstream/main' into copilot/copilot-pr-70
edburns Apr 16, 2026
cc3e09a
Chunk 3 improvements: lazy getRpc() init, full internal RPC migration…
Copilot Apr 17, 2026
5ba95f6
Fix Windows CLI path resolution and extract shared TestUtil
edburns Apr 17, 2026
265eec4
Apply Spotless formatting fixes to TestUtil.java
edburns Apr 17, 2026
cf7d988
Merge branch 'main' into copilot/copilot-pr-70
edburns Apr 17, 2026
ed1b1e3
Forbid agentic sync from modifying src/generated/java/ files
Copilot Apr 17, 2026
9ec2478
Remove duplicate Javadoc block on sendExpandedToolResult()
edburns Apr 17, 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
Prev Previous commit
Next Next commit
Add @JsonInclude(NON_NULL) to all generated event classes and warn on…
… Object fallbacks

The code generator (scripts/codegen/java.ts) had two gaps identified
during report-card grading against the Epic #69 rubric:

1. Silent Object fallbacks: When schemaTypeToJava() fell back to
   List<Object> (untyped array) or Map<String, Object> (untyped object
   without properties or additionalProperties), it did so silently.
   Added console.warn() at both sites so type erasure is visible during
   generation, matching the existing warnings for anyOf and unrecognized
   schema patterns.

2. Missing @JsonInclude(NON_NULL) on outer event classes: The annotation
   was present on inner data records and RPC records but missing from
   the SessionEvent sealed base class and all outer event variant
   classes (e.g., AssistantMessageEvent, ToolExecutionStartEvent). Added
   the import and annotation to generateSessionEventBaseClass() and
   generateEventVariantClass().

After regenerating, all 75 session event files and 111 RPC type files
were updated. mvn verify passes with 556 tests, 0 failures, 0 errors.
  • Loading branch information
edburns committed Apr 14, 2026
commit e9c0bf760147556213168da746cd05000b4b4850
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ examples-test/
blog-copilotsdk/
.claude/worktrees
smoke-test
*job-logs.txt
*job-logs.txt*
temporary-prompts/
changebundle.txt*
.classpath
Expand Down
5 changes: 5 additions & 0 deletions scripts/codegen/java.ts
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ function schemaTypeToJava(
return { javaType: `List<${itemResult.javaType}>`, imports };
}
imports.add("java.util.List");
console.warn(`[codegen] ${context}.${propName}: array without typed items — falling back to List<Object>`);
return { javaType: "List<Object>", imports };
}

Expand All @@ -205,6 +206,7 @@ function schemaTypeToJava(
return { javaType: `Map<String, ${valueResult.javaType}>`, imports };
}
imports.add("java.util.Map");
console.warn(`[codegen] ${context}.${propName}: object without typed properties or additionalProperties — falling back to Map<String, Object>`);
return { javaType: "Map<String, Object>", imports };
}

Expand Down Expand Up @@ -291,6 +293,7 @@ async function generateSessionEventBaseClass(
lines.push(`package ${packageName};`);
lines.push("");
lines.push(`import com.fasterxml.jackson.annotation.JsonIgnoreProperties;`);
lines.push(`import com.fasterxml.jackson.annotation.JsonInclude;`);
lines.push(`import com.fasterxml.jackson.annotation.JsonProperty;`);
lines.push(`import com.fasterxml.jackson.annotation.JsonSubTypes;`);
lines.push(`import com.fasterxml.jackson.annotation.JsonTypeInfo;`);
Expand All @@ -304,6 +307,7 @@ async function generateSessionEventBaseClass(
lines.push(` * @since 1.0.0`);
lines.push(` */`);
lines.push(`@JsonIgnoreProperties(ignoreUnknown = true)`);
lines.push(`@JsonInclude(JsonInclude.Include.NON_NULL)`);
lines.push(`@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", defaultImpl = UnknownSessionEvent.class)`);
lines.push(`@JsonSubTypes({`);
for (let i = 0; i < variants.length; i++) {
Expand Down Expand Up @@ -539,6 +543,7 @@ async function generateEventVariantClass(
lines.push(` */`);
}
lines.push(`@JsonIgnoreProperties(ignoreUnknown = true)`);
lines.push(`@JsonInclude(JsonInclude.Include.NON_NULL)`);
lines.push(GENERATED_ANNOTATION);
lines.push(`public final class ${variant.className} extends SessionEvent {`);
lines.push("");
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading