Skip to content

Commit 5dacaca

Browse files
jmoseleyCopilot
andcommitted
Merge origin/main and re-apply canvas SDK followups
Main's #1413 aligned canvas with the codegen pipeline. Re-applied followups on top: - Re-applied Experimental markers to hand-written canvas surfaces (Rust doc-comments, Node @experimental JSDoc, Python module/class docstrings, Go per-symbol doc comments). - Re-applied Default derive on CanvasDeclaration in Rust. - Re-applied .NET CanvasError -> CanvasException rename across Canvas.cs, Session.cs, and CanvasTests.cs. - Re-applied CanvasErrorHelpers.Build simplification (JsonObject + TypesJsonContext.Default.JsonObject); removed CanvasErrorPayload and CanvasJsonContext partial. - Re-applied Session.cs NullJsonElement cache and simplified SerializeActionResult. - Updated index.ts re-export to CanvasHostContextCapabilities to match codegen rename. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2 parents e996788 + 3dd7b01 commit 5dacaca

112 files changed

Lines changed: 15654 additions & 1961 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

docs/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# GitHub Copilot SDK documentation
1+
# Copilot SDK
22

33
Welcome to the GitHub Copilot SDK docs. Whether you're building your first Copilot-powered app or deploying to production, you'll find what you need here.
44

dotnet/src/Canvas.cs

Lines changed: 10 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -57,111 +57,7 @@ public sealed class ExtensionInfo
5757
public string Name { get; set; } = string.Empty;
5858
}
5959

60-
/// <summary>Response returned from <see cref="ICanvasHandler.OnOpenAsync"/>.</summary>
61-
[Experimental(Diagnostics.Experimental)]
62-
public sealed class CanvasOpenResponse
63-
{
64-
/// <summary>URL the host should render. Optional for canvases with no visual surface.</summary>
65-
[JsonPropertyName("url")]
66-
public string? Url { get; set; }
67-
68-
/// <summary>Provider-supplied title shown in host chrome.</summary>
69-
[JsonPropertyName("title")]
70-
public string? Title { get; set; }
71-
72-
/// <summary>Provider-supplied status text shown in host chrome.</summary>
73-
[JsonPropertyName("status")]
74-
public string? Status { get; set; }
75-
}
76-
77-
/// <summary>Host capabilities passed to canvas provider callbacks.</summary>
78-
[Experimental(Diagnostics.Experimental)]
79-
public sealed class CanvasHostContext
80-
{
81-
/// <summary>Host capability details.</summary>
82-
[JsonPropertyName("capabilities")]
83-
public CanvasHostCapabilities Capabilities { get; set; } = new();
84-
}
85-
86-
/// <summary>Host capability details passed to canvas provider callbacks.</summary>
87-
[Experimental(Diagnostics.Experimental)]
88-
public sealed class CanvasHostCapabilities
89-
{
90-
/// <summary>Whether the host supports canvas rendering.</summary>
91-
[JsonPropertyName("canvases")]
92-
public bool Canvases { get; set; }
93-
}
94-
95-
/// <summary>Context handed to <see cref="ICanvasHandler.OnOpenAsync"/>.</summary>
96-
[Experimental(Diagnostics.Experimental)]
97-
public sealed class CanvasOpenContext
98-
{
99-
/// <summary>Session that requested the canvas.</summary>
100-
public string SessionId { get; set; } = string.Empty;
101-
102-
/// <summary>Owning provider identifier.</summary>
103-
public string ExtensionId { get; set; } = string.Empty;
104-
105-
/// <summary>Canvas id from the declaring <see cref="CanvasDeclaration"/>.</summary>
106-
public string CanvasId { get; set; } = string.Empty;
107-
108-
/// <summary>Stable instance id supplied by the runtime.</summary>
109-
public string InstanceId { get; set; } = string.Empty;
110-
111-
/// <summary>Validated input payload.</summary>
112-
public JsonElement Input { get; set; }
113-
114-
/// <summary>Host capabilities supplied by the runtime.</summary>
115-
public CanvasHostContext? Host { get; set; }
116-
}
117-
118-
/// <summary>Context handed to <see cref="ICanvasHandler.OnActionAsync"/>.</summary>
119-
[Experimental(Diagnostics.Experimental)]
120-
public sealed class CanvasActionContext
121-
{
122-
/// <summary>Session that invoked the action.</summary>
123-
public string SessionId { get; set; } = string.Empty;
124-
125-
/// <summary>Owning provider identifier.</summary>
126-
public string ExtensionId { get; set; } = string.Empty;
127-
128-
/// <summary>Canvas id targeted by the action.</summary>
129-
public string CanvasId { get; set; } = string.Empty;
130-
131-
/// <summary>Instance id targeted by the action.</summary>
132-
public string InstanceId { get; set; } = string.Empty;
133-
134-
/// <summary>Action name from <see cref="CanvasAction.Name"/>.</summary>
135-
public string ActionName { get; set; } = string.Empty;
136-
137-
/// <summary>Validated input payload.</summary>
138-
public JsonElement Input { get; set; }
139-
140-
/// <summary>Host capabilities supplied by the runtime.</summary>
141-
public CanvasHostContext? Host { get; set; }
142-
}
143-
144-
/// <summary>Context handed to a canvas's close lifecycle hook.</summary>
145-
[Experimental(Diagnostics.Experimental)]
146-
public sealed class CanvasLifecycleContext
147-
{
148-
/// <summary>Session owning the canvas instance.</summary>
149-
public string SessionId { get; set; } = string.Empty;
150-
151-
/// <summary>Owning provider identifier.</summary>
152-
public string ExtensionId { get; set; } = string.Empty;
153-
154-
/// <summary>Canvas id from the declaring <see cref="CanvasDeclaration"/>.</summary>
155-
public string CanvasId { get; set; } = string.Empty;
156-
157-
/// <summary>Instance id this lifecycle event applies to.</summary>
158-
public string InstanceId { get; set; } = string.Empty;
159-
160-
/// <summary>Host capabilities supplied by the runtime.</summary>
161-
public CanvasHostContext? Host { get; set; }
162-
}
163-
164-
/// <summary>Structured error returned from canvas handlers.</summary>
60+
/// <summary>Structured exception returned from canvas handlers.</summary>
16561
/// <remarks>
16662
/// Throw this from <see cref="ICanvasHandler"/> implementations to surface a
16763
/// machine-readable error code to the runtime. Any other exception is wrapped
@@ -182,7 +78,7 @@ public CanvasException(string code, string message) : base(message)
18278
public string Code { get; }
18379

18480
/// <summary>
185-
/// Default error returned when a custom action has no handler.
81+
/// Default exception returned when a custom action has no handler.
18682
/// </summary>
18783
public static CanvasException NoHandler() => new(
18884
"canvas_action_no_handler",
@@ -222,9 +118,9 @@ private static LocalRpcInvocationException Build(string code, string message)
222118
/// <remarks>
223119
/// A session installs a single <see cref="ICanvasHandler"/> via
224120
/// <c>SessionConfigBase.CanvasHandler</c>. The handler receives every
225-
/// inbound <c>canvas.open</c> / <c>canvas.close</c> / <c>canvas.action.invoke</c>
121+
/// inbound <c>canvas.open</c> / <c>canvas.close</c> / <c>canvas.invokeAction</c>
226122
/// JSON-RPC request the runtime issues for this session and decides — typically
227-
/// by inspecting <see cref="CanvasOpenContext.CanvasId"/> — which
123+
/// by inspecting <see cref="CanvasProviderOpenRequest.CanvasId"/> — which
228124
/// application-side canvas should handle the call.
229125
/// <para>
230126
/// The SDK does not maintain a per-canvas registry; multiplexing across
@@ -240,16 +136,16 @@ private static LocalRpcInvocationException Build(string code, string message)
240136
public interface ICanvasHandler
241137
{
242138
/// <summary>Open a new canvas instance.</summary>
243-
Task<CanvasOpenResponse> OnOpenAsync(CanvasOpenContext context, CancellationToken cancellationToken);
139+
Task<CanvasProviderOpenResult> OnOpenAsync(CanvasProviderOpenRequest context, CancellationToken cancellationToken);
244140

245141
/// <summary>Canvas was closed by the user or agent. Default: no-op.</summary>
246-
Task OnCloseAsync(CanvasLifecycleContext context, CancellationToken cancellationToken);
142+
Task OnCloseAsync(CanvasProviderCloseRequest context, CancellationToken cancellationToken);
247143

248144
/// <summary>
249145
/// Handle a non-lifecycle action declared by the canvas.
250146
/// Default: throws <see cref="CanvasException.NoHandler"/>.
251147
/// </summary>
252-
Task<object?> OnActionAsync(CanvasActionContext context, CancellationToken cancellationToken);
148+
Task<object?> OnActionAsync(CanvasProviderInvokeActionRequest context, CancellationToken cancellationToken);
253149
}
254150

255151
/// <summary>
@@ -260,17 +156,17 @@ public interface ICanvasHandler
260156
public abstract class CanvasHandlerBase : ICanvasHandler
261157
{
262158
/// <inheritdoc />
263-
public abstract Task<CanvasOpenResponse> OnOpenAsync(CanvasOpenContext context, CancellationToken cancellationToken);
159+
public abstract Task<CanvasProviderOpenResult> OnOpenAsync(CanvasProviderOpenRequest context, CancellationToken cancellationToken);
264160

265161
/// <inheritdoc />
266-
public virtual Task OnCloseAsync(CanvasLifecycleContext context, CancellationToken cancellationToken)
162+
public virtual Task OnCloseAsync(CanvasProviderCloseRequest context, CancellationToken cancellationToken)
267163
#if NET8_0_OR_GREATER
268164
=> Task.CompletedTask;
269165
#else
270166
=> Task.FromResult<object?>(null);
271167
#endif
272168

273169
/// <inheritdoc />
274-
public virtual Task<object?> OnActionAsync(CanvasActionContext context, CancellationToken cancellationToken)
170+
public virtual Task<object?> OnActionAsync(CanvasProviderInvokeActionRequest context, CancellationToken cancellationToken)
275171
=> Task.FromException<object?>(CanvasException.NoHandler());
276172
}

dotnet/src/Client.cs

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1625,9 +1625,6 @@ private async Task<Connection> ConnectToServerAsync(Process? cliProcess, string?
16251625
rpc.SetLocalRpcMethod("autoModeSwitch.request", handler.OnAutoModeSwitchRequest);
16261626
rpc.SetLocalRpcMethod("hooks.invoke", handler.OnHooksInvoke);
16271627
rpc.SetLocalRpcMethod("systemMessage.transform", handler.OnSystemMessageTransform);
1628-
rpc.SetLocalRpcMethod("canvas.open", handler.OnCanvasOpen);
1629-
rpc.SetLocalRpcMethod("canvas.close", handler.OnCanvasClose);
1630-
rpc.SetLocalRpcMethod("canvas.action.invoke", handler.OnCanvasInvokeAction);
16311628
ClientSessionApiRegistration.RegisterClientSessionApiHandlers(rpc, sessionId =>
16321629
{
16331630
var session = GetSession(sessionId) ?? throw new ArgumentException($"Unknown session {sessionId}");
@@ -1821,46 +1818,6 @@ public async ValueTask<SystemMessageTransformRpcResponse> OnSystemMessageTransfo
18211818
return await session.HandleSystemMessageTransformAsync(sections);
18221819
}
18231820

1824-
#pragma warning disable GHCP001
1825-
public ValueTask<CanvasOpenResponse> OnCanvasOpen(
1826-
string sessionId,
1827-
string extensionId,
1828-
string canvasId,
1829-
string instanceId,
1830-
JsonElement? input = null,
1831-
CanvasHostContext? host = null)
1832-
{
1833-
var session = client.GetSession(sessionId) ?? throw new ArgumentException($"Unknown session {sessionId}");
1834-
return session.HandleCanvasOpenAsync(
1835-
extensionId, canvasId, instanceId, input ?? default, host);
1836-
}
1837-
1838-
public async ValueTask OnCanvasClose(
1839-
string sessionId,
1840-
string extensionId,
1841-
string canvasId,
1842-
string instanceId,
1843-
JsonElement? input = null,
1844-
CanvasHostContext? host = null)
1845-
{
1846-
var session = client.GetSession(sessionId) ?? throw new ArgumentException($"Unknown session {sessionId}");
1847-
await session.HandleCanvasCloseAsync(extensionId, canvasId, instanceId, host);
1848-
}
1849-
1850-
public ValueTask<JsonElement> OnCanvasInvokeAction(
1851-
string sessionId,
1852-
string extensionId,
1853-
string canvasId,
1854-
string instanceId,
1855-
string actionName,
1856-
JsonElement? input = null,
1857-
CanvasHostContext? host = null)
1858-
{
1859-
var session = client.GetSession(sessionId) ?? throw new ArgumentException($"Unknown session {sessionId}");
1860-
return session.HandleCanvasActionAsync(
1861-
extensionId, canvasId, instanceId, actionName, input ?? default, host);
1862-
}
1863-
#pragma warning restore GHCP001
18641821
}
18651822

18661823
private class Connection(

0 commit comments

Comments
 (0)