Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 2 additions & 2 deletions extensions/code-tutor/canvas-kit/.kit-version.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"version": "2026-07-20.1",
"syncedAt": "2026-07-20T16:19:40.187Z",
"version": "2026-08-25.1",
"syncedAt": "2026-08-25T16:40:45.244Z",
"source": "create-canvas-app/kit"
}
1 change: 1 addition & 0 deletions extensions/code-tutor/canvas-kit/client.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ export {
hostedLauncherUrl,
buildSessionDeepLink,
buildSessionDetailDeepLink,
buildSessionRestartDeepLink,
buildChatsDeepLink,
buildNewChatDeepLink,
buildNewAutomationDeepLink,
Expand Down
25 changes: 25 additions & 0 deletions extensions/code-tutor/canvas-kit/deeplinks.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,31 @@ export function buildSessionDetailDeepLink(sessionId) {
return safeDeepLinkUrl(`${APP_DEEP_LINK_SCHEME}://sessions/${sessionId}`);
}

/**
* `ghapp://sessions/:sessionId/restart`: restart a session's Copilot CLI process
* — kill the child process and spawn a fresh one, the same operation as the
* `/restart-session` slash command. Reach for this when a canvas needs the app to
* pick up process-start-resolved state (MCP servers, extensions resolved at
* launch) that a plain `plugins.reload()` / `skills.reload()` re-reads from disk
* but can't actually respawn.
*
* The route is DESTRUCTIVE (queued input and any in-flight response are discarded)
* and a global entry point, so the app ALWAYS shows a confirmation dialog before
* restarting and never navigates or self-approves — the canvas only BUILDS the
* URL. The id is resolved against the app's own live sessions, so an id that is
* not a session on this device (or one that runs on a remote host) is rejected
* before the dialog rather than prompting for something known to fail. `sessionId`
* must be the same safe token shape as {@link buildSessionDetailDeepLink} (so it
* can't smuggle extra path segments or query keys); returns null otherwise, so a
* caller can withhold the control instead of rendering a dead link.
* @param {string} sessionId
* @returns {string|null}
*/
export function buildSessionRestartDeepLink(sessionId) {
if (!isSafeSessionId(sessionId)) return null;
return safeDeepLinkUrl(`${APP_DEEP_LINK_SCHEME}://sessions/${sessionId}/restart`);
}

/** `ghapp://chats`: open the Chats surface. */
export function buildChatsDeepLink() {
return safeDeepLinkUrl(`${APP_DEEP_LINK_SCHEME}://chats`);
Expand Down
2 changes: 1 addition & 1 deletion extensions/code-tutor/canvas-kit/version.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@
// convention (the skill ships as files, not an npm version); a commit short-sha
// works too. Re-exported from client.mjs so a canvas can read it at runtime.

export const KIT_VERSION = "2026-07-20.1";
export const KIT_VERSION = "2026-08-25.1";
4 changes: 2 additions & 2 deletions extensions/language-tutor/canvas-kit/.kit-version.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"version": "2026-07-20.1",
"syncedAt": "2026-07-20T16:19:40.314Z",
"version": "2026-08-25.1",
"syncedAt": "2026-08-25T16:40:45.410Z",
"source": "create-canvas-app/kit"
}
1 change: 1 addition & 0 deletions extensions/language-tutor/canvas-kit/client.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ export {
hostedLauncherUrl,
buildSessionDeepLink,
buildSessionDetailDeepLink,
buildSessionRestartDeepLink,
buildChatsDeepLink,
buildNewChatDeepLink,
buildNewAutomationDeepLink,
Expand Down
25 changes: 25 additions & 0 deletions extensions/language-tutor/canvas-kit/deeplinks.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,31 @@ export function buildSessionDetailDeepLink(sessionId) {
return safeDeepLinkUrl(`${APP_DEEP_LINK_SCHEME}://sessions/${sessionId}`);
}

/**
* `ghapp://sessions/:sessionId/restart`: restart a session's Copilot CLI process
* — kill the child process and spawn a fresh one, the same operation as the
* `/restart-session` slash command. Reach for this when a canvas needs the app to
* pick up process-start-resolved state (MCP servers, extensions resolved at
* launch) that a plain `plugins.reload()` / `skills.reload()` re-reads from disk
* but can't actually respawn.
*
* The route is DESTRUCTIVE (queued input and any in-flight response are discarded)
* and a global entry point, so the app ALWAYS shows a confirmation dialog before
* restarting and never navigates or self-approves — the canvas only BUILDS the
* URL. The id is resolved against the app's own live sessions, so an id that is
* not a session on this device (or one that runs on a remote host) is rejected
* before the dialog rather than prompting for something known to fail. `sessionId`
* must be the same safe token shape as {@link buildSessionDetailDeepLink} (so it
* can't smuggle extra path segments or query keys); returns null otherwise, so a
* caller can withhold the control instead of rendering a dead link.
* @param {string} sessionId
* @returns {string|null}
*/
export function buildSessionRestartDeepLink(sessionId) {
if (!isSafeSessionId(sessionId)) return null;
return safeDeepLinkUrl(`${APP_DEEP_LINK_SCHEME}://sessions/${sessionId}/restart`);
}

/** `ghapp://chats`: open the Chats surface. */
export function buildChatsDeepLink() {
return safeDeepLinkUrl(`${APP_DEEP_LINK_SCHEME}://chats`);
Expand Down
2 changes: 1 addition & 1 deletion extensions/language-tutor/canvas-kit/version.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@
// convention (the skill ships as files, not an npm version); a commit short-sha
// works too. Re-exported from client.mjs so a canvas can read it at runtime.

export const KIT_VERSION = "2026-07-20.1";
export const KIT_VERSION = "2026-08-25.1";
4 changes: 2 additions & 2 deletions extensions/news-aggregator/canvas-kit/.kit-version.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"version": "2026-07-20.1",
"syncedAt": "2026-07-20T16:19:40.446Z",
"version": "2026-08-25.1",
"syncedAt": "2026-08-25T16:40:45.556Z",
"source": "create-canvas-app/kit"
}
1 change: 1 addition & 0 deletions extensions/news-aggregator/canvas-kit/client.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ export {
hostedLauncherUrl,
buildSessionDeepLink,
buildSessionDetailDeepLink,
buildSessionRestartDeepLink,
buildChatsDeepLink,
buildNewChatDeepLink,
buildNewAutomationDeepLink,
Expand Down
25 changes: 25 additions & 0 deletions extensions/news-aggregator/canvas-kit/deeplinks.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,31 @@ export function buildSessionDetailDeepLink(sessionId) {
return safeDeepLinkUrl(`${APP_DEEP_LINK_SCHEME}://sessions/${sessionId}`);
}

/**
* `ghapp://sessions/:sessionId/restart`: restart a session's Copilot CLI process
* — kill the child process and spawn a fresh one, the same operation as the
* `/restart-session` slash command. Reach for this when a canvas needs the app to
* pick up process-start-resolved state (MCP servers, extensions resolved at
* launch) that a plain `plugins.reload()` / `skills.reload()` re-reads from disk
* but can't actually respawn.
*
* The route is DESTRUCTIVE (queued input and any in-flight response are discarded)
* and a global entry point, so the app ALWAYS shows a confirmation dialog before
* restarting and never navigates or self-approves — the canvas only BUILDS the
* URL. The id is resolved against the app's own live sessions, so an id that is
* not a session on this device (or one that runs on a remote host) is rejected
* before the dialog rather than prompting for something known to fail. `sessionId`
* must be the same safe token shape as {@link buildSessionDetailDeepLink} (so it
* can't smuggle extra path segments or query keys); returns null otherwise, so a
* caller can withhold the control instead of rendering a dead link.
* @param {string} sessionId
* @returns {string|null}
*/
export function buildSessionRestartDeepLink(sessionId) {
if (!isSafeSessionId(sessionId)) return null;
return safeDeepLinkUrl(`${APP_DEEP_LINK_SCHEME}://sessions/${sessionId}/restart`);
}

/** `ghapp://chats`: open the Chats surface. */
export function buildChatsDeepLink() {
return safeDeepLinkUrl(`${APP_DEEP_LINK_SCHEME}://chats`);
Expand Down
2 changes: 1 addition & 1 deletion extensions/news-aggregator/canvas-kit/version.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@
// convention (the skill ships as files, not an npm version); a commit short-sha
// works too. Re-exported from client.mjs so a canvas can read it at runtime.

export const KIT_VERSION = "2026-07-20.1";
export const KIT_VERSION = "2026-08-25.1";
4 changes: 2 additions & 2 deletions extensions/random-animal/canvas-kit/.kit-version.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"version": "2026-07-20.1",
"syncedAt": "2026-07-20T16:19:40.575Z",
"version": "2026-08-25.1",
"syncedAt": "2026-08-25T16:40:45.702Z",
"source": "create-canvas-app/kit"
}
1 change: 1 addition & 0 deletions extensions/random-animal/canvas-kit/client.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ export {
hostedLauncherUrl,
buildSessionDeepLink,
buildSessionDetailDeepLink,
buildSessionRestartDeepLink,
buildChatsDeepLink,
buildNewChatDeepLink,
buildNewAutomationDeepLink,
Expand Down
25 changes: 25 additions & 0 deletions extensions/random-animal/canvas-kit/deeplinks.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,31 @@ export function buildSessionDetailDeepLink(sessionId) {
return safeDeepLinkUrl(`${APP_DEEP_LINK_SCHEME}://sessions/${sessionId}`);
}

/**
* `ghapp://sessions/:sessionId/restart`: restart a session's Copilot CLI process
* — kill the child process and spawn a fresh one, the same operation as the
* `/restart-session` slash command. Reach for this when a canvas needs the app to
* pick up process-start-resolved state (MCP servers, extensions resolved at
* launch) that a plain `plugins.reload()` / `skills.reload()` re-reads from disk
* but can't actually respawn.
*
* The route is DESTRUCTIVE (queued input and any in-flight response are discarded)
* and a global entry point, so the app ALWAYS shows a confirmation dialog before
* restarting and never navigates or self-approves — the canvas only BUILDS the
* URL. The id is resolved against the app's own live sessions, so an id that is
* not a session on this device (or one that runs on a remote host) is rejected
* before the dialog rather than prompting for something known to fail. `sessionId`
* must be the same safe token shape as {@link buildSessionDetailDeepLink} (so it
* can't smuggle extra path segments or query keys); returns null otherwise, so a
* caller can withhold the control instead of rendering a dead link.
* @param {string} sessionId
* @returns {string|null}
*/
export function buildSessionRestartDeepLink(sessionId) {
if (!isSafeSessionId(sessionId)) return null;
return safeDeepLinkUrl(`${APP_DEEP_LINK_SCHEME}://sessions/${sessionId}/restart`);
}

/** `ghapp://chats`: open the Chats surface. */
export function buildChatsDeepLink() {
return safeDeepLinkUrl(`${APP_DEEP_LINK_SCHEME}://chats`);
Expand Down
2 changes: 1 addition & 1 deletion extensions/random-animal/canvas-kit/version.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@
// convention (the skill ships as files, not an npm version); a commit short-sha
// works too. Re-exported from client.mjs so a canvas can read it at runtime.

export const KIT_VERSION = "2026-07-20.1";
export const KIT_VERSION = "2026-08-25.1";
4 changes: 2 additions & 2 deletions extensions/stock-ticker/canvas-kit/.kit-version.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"version": "2026-07-20.1",
"syncedAt": "2026-07-20T16:19:40.710Z",
"version": "2026-08-25.1",
"syncedAt": "2026-08-25T16:40:45.847Z",
"source": "create-canvas-app/kit"
}
1 change: 1 addition & 0 deletions extensions/stock-ticker/canvas-kit/client.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ export {
hostedLauncherUrl,
buildSessionDeepLink,
buildSessionDetailDeepLink,
buildSessionRestartDeepLink,
buildChatsDeepLink,
buildNewChatDeepLink,
buildNewAutomationDeepLink,
Expand Down
25 changes: 25 additions & 0 deletions extensions/stock-ticker/canvas-kit/deeplinks.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,31 @@ export function buildSessionDetailDeepLink(sessionId) {
return safeDeepLinkUrl(`${APP_DEEP_LINK_SCHEME}://sessions/${sessionId}`);
}

/**
* `ghapp://sessions/:sessionId/restart`: restart a session's Copilot CLI process
* — kill the child process and spawn a fresh one, the same operation as the
* `/restart-session` slash command. Reach for this when a canvas needs the app to
* pick up process-start-resolved state (MCP servers, extensions resolved at
* launch) that a plain `plugins.reload()` / `skills.reload()` re-reads from disk
* but can't actually respawn.
*
* The route is DESTRUCTIVE (queued input and any in-flight response are discarded)
* and a global entry point, so the app ALWAYS shows a confirmation dialog before
* restarting and never navigates or self-approves — the canvas only BUILDS the
* URL. The id is resolved against the app's own live sessions, so an id that is
* not a session on this device (or one that runs on a remote host) is rejected
* before the dialog rather than prompting for something known to fail. `sessionId`
* must be the same safe token shape as {@link buildSessionDetailDeepLink} (so it
* can't smuggle extra path segments or query keys); returns null otherwise, so a
* caller can withhold the control instead of rendering a dead link.
* @param {string} sessionId
* @returns {string|null}
*/
export function buildSessionRestartDeepLink(sessionId) {
if (!isSafeSessionId(sessionId)) return null;
return safeDeepLinkUrl(`${APP_DEEP_LINK_SCHEME}://sessions/${sessionId}/restart`);
}

/** `ghapp://chats`: open the Chats surface. */
export function buildChatsDeepLink() {
return safeDeepLinkUrl(`${APP_DEEP_LINK_SCHEME}://chats`);
Expand Down
2 changes: 1 addition & 1 deletion extensions/stock-ticker/canvas-kit/version.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@
// convention (the skill ships as files, not an npm version); a commit short-sha
// works too. Re-exported from client.mjs so a canvas can read it at runtime.

export const KIT_VERSION = "2026-07-20.1";
export const KIT_VERSION = "2026-08-25.1";
4 changes: 2 additions & 2 deletions extensions/wiki-discover/canvas-kit/.kit-version.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"version": "2026-07-20.1",
"syncedAt": "2026-07-20T16:19:40.842Z",
"version": "2026-08-25.1",
"syncedAt": "2026-08-25T16:40:45.985Z",
"source": "create-canvas-app/kit"
}
1 change: 1 addition & 0 deletions extensions/wiki-discover/canvas-kit/client.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ export {
hostedLauncherUrl,
buildSessionDeepLink,
buildSessionDetailDeepLink,
buildSessionRestartDeepLink,
buildChatsDeepLink,
buildNewChatDeepLink,
buildNewAutomationDeepLink,
Expand Down
25 changes: 25 additions & 0 deletions extensions/wiki-discover/canvas-kit/deeplinks.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,31 @@ export function buildSessionDetailDeepLink(sessionId) {
return safeDeepLinkUrl(`${APP_DEEP_LINK_SCHEME}://sessions/${sessionId}`);
}

/**
* `ghapp://sessions/:sessionId/restart`: restart a session's Copilot CLI process
* — kill the child process and spawn a fresh one, the same operation as the
* `/restart-session` slash command. Reach for this when a canvas needs the app to
* pick up process-start-resolved state (MCP servers, extensions resolved at
* launch) that a plain `plugins.reload()` / `skills.reload()` re-reads from disk
* but can't actually respawn.
*
* The route is DESTRUCTIVE (queued input and any in-flight response are discarded)
* and a global entry point, so the app ALWAYS shows a confirmation dialog before
* restarting and never navigates or self-approves — the canvas only BUILDS the
* URL. The id is resolved against the app's own live sessions, so an id that is
* not a session on this device (or one that runs on a remote host) is rejected
* before the dialog rather than prompting for something known to fail. `sessionId`
* must be the same safe token shape as {@link buildSessionDetailDeepLink} (so it
* can't smuggle extra path segments or query keys); returns null otherwise, so a
* caller can withhold the control instead of rendering a dead link.
* @param {string} sessionId
* @returns {string|null}
*/
export function buildSessionRestartDeepLink(sessionId) {
if (!isSafeSessionId(sessionId)) return null;
return safeDeepLinkUrl(`${APP_DEEP_LINK_SCHEME}://sessions/${sessionId}/restart`);
}

/** `ghapp://chats`: open the Chats surface. */
export function buildChatsDeepLink() {
return safeDeepLinkUrl(`${APP_DEEP_LINK_SCHEME}://chats`);
Expand Down
2 changes: 1 addition & 1 deletion extensions/wiki-discover/canvas-kit/version.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@
// convention (the skill ships as files, not an npm version); a commit short-sha
// works too. Re-exported from client.mjs so a canvas can read it at runtime.

export const KIT_VERSION = "2026-07-20.1";
export const KIT_VERSION = "2026-08-25.1";
Loading