From 96866e52ce4b28d8f380d84722f411e786781f51 Mon Sep 17 00:00:00 2001 From: Dax Date: Wed, 23 Jul 2025 20:30:46 -0400 Subject: basic undo feature (#1268) Co-authored-by: adamdotdevin <2363879+adamdottv@users.noreply.github.com> Co-authored-by: Jay V Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Co-authored-by: Andrew Joslin Co-authored-by: GitHub Action Co-authored-by: Tobias Walle <9933601+tobias-walle@users.noreply.github.com> --- packages/sdk/.stats.yml | 8 +++---- packages/sdk/api.md | 2 ++ packages/sdk/src/client.ts | 2 ++ packages/sdk/src/resources/config.ts | 12 +++++++++- packages/sdk/src/resources/index.ts | 1 + packages/sdk/src/resources/session.ts | 23 ++++++++++++++++++- packages/sdk/tests/api-resources/session.test.ts | 29 ++++++++++++++++++++++++ 7 files changed, 71 insertions(+), 6 deletions(-) (limited to 'packages/sdk') diff --git a/packages/sdk/.stats.yml b/packages/sdk/.stats.yml index f9f86831f..da0b08b5a 100644 --- a/packages/sdk/.stats.yml +++ b/packages/sdk/.stats.yml @@ -1,4 +1,4 @@ -configured_endpoints: 24 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/opencode%2Fopencode-9574184bd9e916aa69eae8e26e0679556038d3fcfb4009a445c97c6cc3e4f3ee.yml -openapi_spec_hash: 93ba1215ab0dc853a1691b049cc47d75 -config_hash: 09e4835d57ec7ed0b2d316c6815bcf0a +configured_endpoints: 26 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/opencode%2Fopencode-1efc45c35b58e88b0550fbb0c7a204ef66522742f87c9e29c76a18b120c0d945.yml +openapi_spec_hash: 5e15d85e4704624f9b13bae1c71aa416 +config_hash: 1ae82c93499b9f0b9ba828b8919f9cb3 diff --git a/packages/sdk/api.md b/packages/sdk/api.md index 7cbaaf6c5..d1f4a482f 100644 --- a/packages/sdk/api.md +++ b/packages/sdk/api.md @@ -121,8 +121,10 @@ Methods: - client.session.chat(id, { ...params }) -> AssistantMessage - client.session.init(id, { ...params }) -> SessionInitResponse - client.session.messages(id) -> SessionMessagesResponse +- client.session.revert(id, { ...params }) -> Session - client.session.share(id) -> Session - client.session.summarize(id, { ...params }) -> SessionSummarizeResponse +- client.session.unrevert(id) -> Session - client.session.unshare(id) -> Session # Tui diff --git a/packages/sdk/src/client.ts b/packages/sdk/src/client.ts index c514ca877..7045719f6 100644 --- a/packages/sdk/src/client.ts +++ b/packages/sdk/src/client.ts @@ -67,6 +67,7 @@ import { SessionListResponse, SessionMessagesResponse, SessionResource, + SessionRevertParams, SessionSummarizeParams, SessionSummarizeResponse, SnapshotPart, @@ -846,6 +847,7 @@ export declare namespace Opencode { type SessionSummarizeResponse as SessionSummarizeResponse, type SessionChatParams as SessionChatParams, type SessionInitParams as SessionInitParams, + type SessionRevertParams as SessionRevertParams, type SessionSummarizeParams as SessionSummarizeParams, }; diff --git a/packages/sdk/src/resources/config.ts b/packages/sdk/src/resources/config.ts index e1fc09de5..638af98f8 100644 --- a/packages/sdk/src/resources/config.ts +++ b/packages/sdk/src/resources/config.ts @@ -305,10 +305,20 @@ export interface KeybindsConfig { messages_previous: string; /** - * Revert message + * Redo message + */ + messages_redo: string; + + /** + * @deprecated use messages_undo. Revert message */ messages_revert: string; + /** + * Undo message + */ + messages_undo: string; + /** * List available models */ diff --git a/packages/sdk/src/resources/index.ts b/packages/sdk/src/resources/index.ts index 50df8ff46..db8bde9b4 100644 --- a/packages/sdk/src/resources/index.ts +++ b/packages/sdk/src/resources/index.ts @@ -71,6 +71,7 @@ export { type SessionSummarizeResponse, type SessionChatParams, type SessionInitParams, + type SessionRevertParams, type SessionSummarizeParams, } from './session'; export { diff --git a/packages/sdk/src/resources/session.ts b/packages/sdk/src/resources/session.ts index 6e160321d..bb761033a 100644 --- a/packages/sdk/src/resources/session.ts +++ b/packages/sdk/src/resources/session.ts @@ -57,6 +57,13 @@ export class SessionResource extends APIResource { return this._client.get(path`/session/${id}/message`, options); } + /** + * Revert a message + */ + revert(id: string, body: SessionRevertParams, options?: RequestOptions): APIPromise { + return this._client.post(path`/session/${id}/revert`, { body, ...options }); + } + /** * Share a session */ @@ -75,6 +82,13 @@ export class SessionResource extends APIResource { return this._client.post(path`/session/${id}/summarize`, { body, ...options }); } + /** + * Restore all reverted messages + */ + unrevert(id: string, options?: RequestOptions): APIPromise { + return this._client.post(path`/session/${id}/unrevert`, options); + } + /** * Unshare the session */ @@ -231,7 +245,7 @@ export namespace Session { export interface Revert { messageID: string; - part: number; + partID?: string; snapshot?: string; } @@ -513,6 +527,12 @@ export interface SessionInitParams { providerID: string; } +export interface SessionRevertParams { + messageID: string; + + partID?: string; +} + export interface SessionSummarizeParams { modelID: string; @@ -550,6 +570,7 @@ export declare namespace SessionResource { type SessionSummarizeResponse as SessionSummarizeResponse, type SessionChatParams as SessionChatParams, type SessionInitParams as SessionInitParams, + type SessionRevertParams as SessionRevertParams, type SessionSummarizeParams as SessionSummarizeParams, }; } diff --git a/packages/sdk/tests/api-resources/session.test.ts b/packages/sdk/tests/api-resources/session.test.ts index efa1d9db4..1c4984a62 100644 --- a/packages/sdk/tests/api-resources/session.test.ts +++ b/packages/sdk/tests/api-resources/session.test.ts @@ -118,6 +118,23 @@ describe('resource session', () => { expect(dataAndResponse.response).toBe(rawResponse); }); + // skipped: tests are disabled for the time being + test.skip('revert: only required params', async () => { + const responsePromise = client.session.revert('id', { messageID: 'msg' }); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // skipped: tests are disabled for the time being + test.skip('revert: required and optional params', async () => { + const response = await client.session.revert('id', { messageID: 'msg', partID: 'prt' }); + }); + // skipped: tests are disabled for the time being test.skip('share', async () => { const responsePromise = client.session.share('id'); @@ -147,6 +164,18 @@ describe('resource session', () => { const response = await client.session.summarize('id', { modelID: 'modelID', providerID: 'providerID' }); }); + // skipped: tests are disabled for the time being + test.skip('unrevert', async () => { + const responsePromise = client.session.unrevert('id'); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + // skipped: tests are disabled for the time being test.skip('unshare', async () => { const responsePromise = client.session.unshare('id'); -- cgit v1.2.3