summaryrefslogtreecommitdiffhomepage
path: root/packages/sdk
diff options
context:
space:
mode:
authorDax <[email protected]>2025-07-23 20:30:46 -0400
committerGitHub <[email protected]>2025-07-23 20:30:46 -0400
commit96866e52ce4b28d8f380d84722f411e786781f51 (patch)
treefbe8df4e706510b3158d1659d8aa54b0c533c849 /packages/sdk
parent507c975e929d1d8bd58ae26e7bbcf9537daaf5b6 (diff)
downloadopencode-96866e52ce4b28d8f380d84722f411e786781f51.tar.gz
opencode-96866e52ce4b28d8f380d84722f411e786781f51.zip
basic undo feature (#1268)
Co-authored-by: adamdotdevin <[email protected]> Co-authored-by: Jay V <[email protected]> Co-authored-by: Aiden Cline <[email protected]> Co-authored-by: Andrew Joslin <[email protected]> Co-authored-by: GitHub Action <[email protected]> Co-authored-by: Tobias Walle <[email protected]>
Diffstat (limited to 'packages/sdk')
-rw-r--r--packages/sdk/.stats.yml8
-rw-r--r--packages/sdk/api.md2
-rw-r--r--packages/sdk/src/client.ts2
-rw-r--r--packages/sdk/src/resources/config.ts12
-rw-r--r--packages/sdk/src/resources/index.ts1
-rw-r--r--packages/sdk/src/resources/session.ts23
-rw-r--r--packages/sdk/tests/api-resources/session.test.ts29
7 files changed, 71 insertions, 6 deletions
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:
- <code title="post /session/{id}/message">client.session.<a href="./src/resources/session.ts">chat</a>(id, { ...params }) -> AssistantMessage</code>
- <code title="post /session/{id}/init">client.session.<a href="./src/resources/session.ts">init</a>(id, { ...params }) -> SessionInitResponse</code>
- <code title="get /session/{id}/message">client.session.<a href="./src/resources/session.ts">messages</a>(id) -> SessionMessagesResponse</code>
+- <code title="post /session/{id}/revert">client.session.<a href="./src/resources/session.ts">revert</a>(id, { ...params }) -> Session</code>
- <code title="post /session/{id}/share">client.session.<a href="./src/resources/session.ts">share</a>(id) -> Session</code>
- <code title="post /session/{id}/summarize">client.session.<a href="./src/resources/session.ts">summarize</a>(id, { ...params }) -> SessionSummarizeResponse</code>
+- <code title="post /session/{id}/unrevert">client.session.<a href="./src/resources/session.ts">unrevert</a>(id) -> Session</code>
- <code title="delete /session/{id}/share">client.session.<a href="./src/resources/session.ts">unshare</a>(id) -> Session</code>
# 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,11 +305,21 @@ 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
*/
model_list: string;
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
@@ -58,6 +58,13 @@ export class SessionResource extends APIResource {
}
/**
+ * Revert a message
+ */
+ revert(id: string, body: SessionRevertParams, options?: RequestOptions): APIPromise<Session> {
+ return this._client.post(path`/session/${id}/revert`, { body, ...options });
+ }
+
+ /**
* Share a session
*/
share(id: string, options?: RequestOptions): APIPromise<Session> {
@@ -76,6 +83,13 @@ export class SessionResource extends APIResource {
}
/**
+ * Restore all reverted messages
+ */
+ unrevert(id: string, options?: RequestOptions): APIPromise<Session> {
+ return this._client.post(path`/session/${id}/unrevert`, options);
+ }
+
+ /**
* Unshare the session
*/
unshare(id: string, options?: RequestOptions): APIPromise<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
@@ -119,6 +119,23 @@ describe('resource session', () => {
});
// 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');
const rawResponse = await responsePromise.asResponse();
@@ -148,6 +165,18 @@ describe('resource session', () => {
});
// 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');
const rawResponse = await responsePromise.asResponse();