Conversation
Attach the connection-owned launch provider before handshake and require an explicit v1 acknowledgement before session creation or resume. Expose global and scoped no-turn retention with canonical null results, and forward initial script-safety configuration before new extension work. Make cancellation teardown safe before registration and under overlapping request/connection cancellation, preserving synchronous resolver errors. Add focused public loopback coverage and document runtime/release limits. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Preserve both upstream FFI lifecycle test typechecking and the canvas launch-provider regressions when reconciling the test configuration. Inherit main's released CLI 1.0.84-5 pin and generated updates unchanged. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
Generated by SDK Consistency Review Agent for #2637 · copilot · sonnet50 · 85.3 AIC · ⌖ 12.5 AIC · ⊞ 8.3K
Comments that could not be inline-anchored
nodejs/src/types.ts:2611
enableScriptSafety is added here for Node.js session config, and the underlying wire field already exists in the generated RPC types for Go, .NET, Python, Java, and Rust. However, none of those SDKs expose it on their public session-open/resume option types yet (e.g. go/types.go SessionOpenOptions, dotnet/src/Types.cs, python/copilot/client.py kwargs, java/sdk/.../SessionConfig.java + SessionRequestBuilder, rust/src/types.rs). Consider a follow-up to wire this through the other SDKs…
nodejs/src/client.ts:520
The new extensionLaunchProvider connection option (with contractVersion-gated registration, session.retain, cancellation-token propagation, and explicit launch: null deny semantics) is only exposed here in Node.js in this PR. Rust already has an earlier equivalent (ClientOptions::with_extension_launch_provider) but does not yet include these new capabilities, and Go/.NET/Python/Java have no public API surface for registering a launch provider at all (only generated RPC types). If this c…
Check in the reviewed experimental schema fragments and their exact released predecessor fingerprints. Apply them in ordinary Node codegen without modifying release inputs or overriding an unexpected new contract. Keep explicit schema inputs and the other SDK generators unchanged. Add regression coverage for revision drift, idempotence, source isolation, and retained-event insertion. Document the Node-only experimental scope and preserve the compatible-runtime negotiation and release requirements. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
Generated by SDK Consistency Review Agent for #2637 · copilot · sonnet50 · 126.1 AIC · ⌖ 12.5 AIC · ⊞ 8.3K
Merge main cb6fc66 and remove the deferred retention RPC/event projections. Preserve launch-v1 admission, initial script safety and cancellation lifecycle behavior for already-durable chats, with reproducible canonical schema generation. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
This comment has been minimized.
This comment has been minimized.
Keep strict version-1 negotiation in the dedicated provider mock. Exercise unrelated factory and workflow tests through the existing Node-hosted legacy runtime path without opting into experimental admission. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
SDK Consistency Review — PR #2637Scope of this PR: Only What changed
Cross-SDK findings
Suggestion (non-blocking)Since the PR itself flags the other-SDK follow-up as future work, no inline changes are requested. Consider opening a tracking issue for "extension launch admission contract v1 + Conclusion: This PR does not introduce a silent/undocumented parity gap — the Node-only scope is intentional and explicitly documented. No inline review comments needed.
|
Node canvas launch admission for persisted chats
Approved release boundary
This draft supports canvases in existing, already-persisted chats only.
The caller must establish that the session is already durable through the
ordinary chat/session lifecycle before approving an extension launch. Resuming
an arbitrary session ID or receiving a create/resume response is not itself
proof of durability or canvas-registry readiness.
Canvas-first and zero-turn durability are deferred. This revision removes the
branch-added
client.rpc.session.retain(...),session.rpc.retain(),SessionRetainRequest,session.retained,RetainedEvent, andRetainedDatasurfaces, plus their dedicated schema projection, generator machinery, fixtures,
tests, and documentation. It does not replace them with another persistence API.
Ordinary session persistence, save, detach, and resume behavior remains intact.
Launch contract preserved
The SDK still attaches the launch provider before the RPC handshake and requires
an explicit
{ contractVersion: 1 }acknowledgement. The original sourceidentity,
sessionId, anddefaultLaunchremain available. Missing or invalidacknowledgements fail closed. Absent/null grants, resolver errors, cancellation,
disconnect, and repeated teardown must not produce a late or replayed grant.
The cancellation fix preserves synchronous resolver entry and
original errors.
enableScriptSafetyremains a canonical optional initial create/resume setting.True, false, and omission are forwarded without an SDK default. Read-only command
classification is subject to runtime and managed policy, not a sandbox or policy
override. Cold omission and resident-memory preservation retain their existing
runtime-defined semantics.
Generated contract and provenance
The prior published source head is
861f7794257745126c03bff5ade9070de4a65646. The fetched main input iscb6fc666cc45175adb11fa9e5021b96d7d37d298, whose source package remains0.0.0-devand whose CLI pin is1.0.89-0. This P3 source revision reconcilesthat main through a normal signed merge, without changing dependency pins or
rebasing, amending, force pushing, or bypassing signing/hooks.
Published scope commit:
daa5c4fa55b4162ab6f5ad0911dd6afff4cc655b.Signed fixture-only follow-up/current head:
cb0a1ef84236fdb9f4000274ac1cdae2d9c1eb73.The launch schema fragments do not depend on retention event definitions.
Generation keeps only seven reviewed launch-v1 API fragments and restores
session-event generation to the unmodified release input. Every fragment matches
the published retention-free runtime source at
ef0ce220610ceedc7243e2eaedaf75ea403248b5(github/copilot-agent-runtime#20368), including its current descriptions.
Canonical API schema SHA-256:
7f1a7491eb34b4b7552a2af49b993fe3718bb476d3ae241c6842048956126335.The guarded projection accepts only the recorded released predecessor or the
exact canonical value; unexpected drift fails generation. Explicit schema
arguments remain complete caller-supplied inputs. All six SDK projections and
protocol constants were regenerated, not hand-edited. Only Node RPC output
differs from the fetched main; Node session events and other-language generated
outputs match main. Launch callback cancellation is preserved because it is
required for admission, not because of retention.
The source CLI pin is not a claim that the corresponding release implements
launch-v1 admission. A compatible runtime must acknowledge version 1 before
session startup. Without it, an explicitly configured provider fails closed.
Same-runtime disconnected ownership may remain sticky; replacement refusal is
propagated. No registry-readiness or source-file immutability guarantee is added.
The historical R2, B1/B2/B3, P1, and P2 receipts stay unchanged. They describe
their original source/package/native images, not this narrowed revision.
The separate installed public
1.0.13+B3carrier is consumer-owned and is notupdated or requalified by this SDK change. A separately built B4 retention-free
backport against public source
f13e4a2cc7e4e220974d2333142234e162a3252eis delivered as private qualification artifacts, not as this PR's source base
or as a package release. It preserves public
1.0.13metadata, CLI1.0.83,the dependency graph, and the B3 client/cancellation implementation.
Validation and publication
P3 validation passed: 348 focused tests across eight files; source/test typecheck;
lint and format checks; ordinary code generation; ESM/CJS/declaration build;
dependency policy; 22 strict public loopback groups per module format; and public
type consumers proving the removed exports, RPC methods, and event listeners
are unavailable. Existing-session resume, initial safety forwarding, startup
negotiation, overlapping cancellation, repeated teardown, reconnect, and
no-late-grant behavior remain covered. Six inherited lint warnings are unchanged.
A supplemental strict compilation of the whole legacy generator still reports
four diagnostics identical to unmodified main; it is not an existing repository
check and no check was disabled. The new schema helper passes strict checking.
Fresh CI exposed two inherited E2E fixture assumptions that conflict with strict
launch admission. The dedicated fake now acknowledges version 1 before issuing
a resolve request and waits for callback completion independently. Unrelated
factory/workflow fixtures no longer opt into the experimental provider and use
the established Node-hosted legacy-runtime resolver. Production negotiation,
generated/package bytes, and B4 are unchanged. The complete affected E2E files
passed locally: 26 tests, with one unchanged inherited skip; no new skips,
live-model traffic, credential use, or fabricated runtime capability.
The initial P3 schema-freshness CI job also exposed an independent main baseline
failure:
runtime-artifact.test.mjspassesenvironmentFile: undefined, causingthe helper to append temporary archive paths to the inherited
GITHUB_ENV.Later Java schema acquisition reads a fixture archive already deleted by test
cleanup. This independently reproduces with the exact unchanged test/helper
bytes from main
cb6fc666; it is left unchanged under the bounded scope.Local all-language generation passed, but CI is not represented as green.
B4 separately passed 94 targeted source tests, source/test typecheck, lint/format,
22 strict public loopback groups per module format, and public declaration
checks. Both complete-image patch routes were applied, checked, reversed, and
reapplied. A fresh exact release export plus the portable source patch, ordinary
generation, and build reproduced all 55 emitted files and modes. Unrelated client
cases were not selected for that bounded run. None of these results relabels
historical B3/native evidence or establishes a new native/platform/model matrix.
The existing PR remains a WIP draft. Current-head CI, ordinary reviewer approval,
compatible-runtime availability, and consumer/native OSS qualification remain
separate gates, recorded in the final receipt. No runtime/VS Code/AHP checkout,
installed carrier, historical receipt, or original PR #2630 was modified.
No release, feature enablement, new PR, or replacement durability mechanism is
part of this task.