feat(core): rework workspace integration and adaptor interface (#15895)

This commit is contained in:
James Long
2026-03-03 21:35:38 -05:00
committed by GitHub
parent e79d41c70e
commit 7f37acdaaa
23 changed files with 1720 additions and 580 deletions

View File

@@ -862,6 +862,213 @@ export class Tool extends HeyApiClient {
}
}
export class Workspace extends HeyApiClient {
/**
* List workspaces
*
* List all workspaces.
*/
public list<ThrowOnError extends boolean = false>(
parameters?: {
directory?: string
workspace?: string
},
options?: Options<never, ThrowOnError>,
) {
const params = buildClientParams(
[parameters],
[
{
args: [
{ in: "query", key: "directory" },
{ in: "query", key: "workspace" },
],
},
],
)
return (options?.client ?? this.client).get<ExperimentalWorkspaceListResponses, unknown, ThrowOnError>({
url: "/experimental/workspace",
...options,
...params,
})
}
/**
* Create workspace
*
* Create a workspace for the current project.
*/
public create<ThrowOnError extends boolean = false>(
parameters?: {
directory?: string
workspace?: string
body?: {
branch?: string | null
} & {
type: "worktree"
name: string
}
},
options?: Options<never, ThrowOnError>,
) {
const params = buildClientParams(
[parameters],
[
{
args: [
{ in: "query", key: "directory" },
{ in: "query", key: "workspace" },
{ key: "body", map: "body" },
],
},
],
)
return (options?.client ?? this.client).post<
ExperimentalWorkspaceCreateResponses,
ExperimentalWorkspaceCreateErrors,
ThrowOnError
>({
url: "/experimental/workspace",
...options,
...params,
headers: {
"Content-Type": "application/json",
...options?.headers,
...params.headers,
},
})
}
/**
* Remove workspace
*
* Remove an existing workspace.
*/
public remove<ThrowOnError extends boolean = false>(
parameters: {
id: string
directory?: string
workspace?: string
},
options?: Options<never, ThrowOnError>,
) {
const params = buildClientParams(
[parameters],
[
{
args: [
{ in: "path", key: "id" },
{ in: "query", key: "directory" },
{ in: "query", key: "workspace" },
],
},
],
)
return (options?.client ?? this.client).delete<
ExperimentalWorkspaceRemoveResponses,
ExperimentalWorkspaceRemoveErrors,
ThrowOnError
>({
url: "/experimental/workspace/{id}",
...options,
...params,
})
}
}
export class Session extends HeyApiClient {
/**
* List sessions
*
* Get a list of all OpenCode sessions across projects, sorted by most recently updated. Archived sessions are excluded by default.
*/
public list<ThrowOnError extends boolean = false>(
parameters?: {
directory?: string
workspace?: string
roots?: boolean
start?: number
cursor?: number
search?: string
limit?: number
archived?: boolean
},
options?: Options<never, ThrowOnError>,
) {
const params = buildClientParams(
[parameters],
[
{
args: [
{ in: "query", key: "directory" },
{ in: "query", key: "workspace" },
{ in: "query", key: "roots" },
{ in: "query", key: "start" },
{ in: "query", key: "cursor" },
{ in: "query", key: "search" },
{ in: "query", key: "limit" },
{ in: "query", key: "archived" },
],
},
],
)
return (options?.client ?? this.client).get<ExperimentalSessionListResponses, unknown, ThrowOnError>({
url: "/experimental/session",
...options,
...params,
})
}
}
export class Resource extends HeyApiClient {
/**
* Get MCP resources
*
* Get all available MCP resources from connected servers. Optionally filter by name.
*/
public list<ThrowOnError extends boolean = false>(
parameters?: {
directory?: string
workspace?: string
},
options?: Options<never, ThrowOnError>,
) {
const params = buildClientParams(
[parameters],
[
{
args: [
{ in: "query", key: "directory" },
{ in: "query", key: "workspace" },
],
},
],
)
return (options?.client ?? this.client).get<ExperimentalResourceListResponses, unknown, ThrowOnError>({
url: "/experimental/resource",
...options,
...params,
})
}
}
export class Experimental extends HeyApiClient {
private _workspace?: Workspace
get workspace(): Workspace {
return (this._workspace ??= new Workspace({ client: this.client }))
}
private _session?: Session
get session(): Session {
return (this._session ??= new Session({ client: this.client }))
}
private _resource?: Resource
get resource(): Resource {
return (this._resource ??= new Resource({ client: this.client }))
}
}
export class Worktree extends HeyApiClient {
/**
* Remove worktree
@@ -1005,215 +1212,6 @@ export class Worktree extends HeyApiClient {
}
}
export class Workspace extends HeyApiClient {
/**
* Remove workspace
*
* Remove an existing workspace.
*/
public remove<ThrowOnError extends boolean = false>(
parameters: {
id: string
directory?: string
workspace?: string
},
options?: Options<never, ThrowOnError>,
) {
const params = buildClientParams(
[parameters],
[
{
args: [
{ in: "path", key: "id" },
{ in: "query", key: "directory" },
{ in: "query", key: "workspace" },
],
},
],
)
return (options?.client ?? this.client).delete<
ExperimentalWorkspaceRemoveResponses,
ExperimentalWorkspaceRemoveErrors,
ThrowOnError
>({
url: "/experimental/workspace/{id}",
...options,
...params,
})
}
/**
* Create workspace
*
* Create a workspace for the current project.
*/
public create<ThrowOnError extends boolean = false>(
parameters: {
id: string
directory?: string
workspace?: string
branch?: string | null
config?: {
directory: string
type: "worktree"
}
},
options?: Options<never, ThrowOnError>,
) {
const params = buildClientParams(
[parameters],
[
{
args: [
{ in: "path", key: "id" },
{ in: "query", key: "directory" },
{ in: "query", key: "workspace" },
{ in: "body", key: "branch" },
{ in: "body", key: "config" },
],
},
],
)
return (options?.client ?? this.client).post<
ExperimentalWorkspaceCreateResponses,
ExperimentalWorkspaceCreateErrors,
ThrowOnError
>({
url: "/experimental/workspace/{id}",
...options,
...params,
headers: {
"Content-Type": "application/json",
...options?.headers,
...params.headers,
},
})
}
/**
* List workspaces
*
* List all workspaces.
*/
public list<ThrowOnError extends boolean = false>(
parameters?: {
directory?: string
workspace?: string
},
options?: Options<never, ThrowOnError>,
) {
const params = buildClientParams(
[parameters],
[
{
args: [
{ in: "query", key: "directory" },
{ in: "query", key: "workspace" },
],
},
],
)
return (options?.client ?? this.client).get<ExperimentalWorkspaceListResponses, unknown, ThrowOnError>({
url: "/experimental/workspace",
...options,
...params,
})
}
}
export class Session extends HeyApiClient {
/**
* List sessions
*
* Get a list of all OpenCode sessions across projects, sorted by most recently updated. Archived sessions are excluded by default.
*/
public list<ThrowOnError extends boolean = false>(
parameters?: {
directory?: string
workspace?: string
roots?: boolean
start?: number
cursor?: number
search?: string
limit?: number
archived?: boolean
},
options?: Options<never, ThrowOnError>,
) {
const params = buildClientParams(
[parameters],
[
{
args: [
{ in: "query", key: "directory" },
{ in: "query", key: "workspace" },
{ in: "query", key: "roots" },
{ in: "query", key: "start" },
{ in: "query", key: "cursor" },
{ in: "query", key: "search" },
{ in: "query", key: "limit" },
{ in: "query", key: "archived" },
],
},
],
)
return (options?.client ?? this.client).get<ExperimentalSessionListResponses, unknown, ThrowOnError>({
url: "/experimental/session",
...options,
...params,
})
}
}
export class Resource extends HeyApiClient {
/**
* Get MCP resources
*
* Get all available MCP resources from connected servers. Optionally filter by name.
*/
public list<ThrowOnError extends boolean = false>(
parameters?: {
directory?: string
workspace?: string
},
options?: Options<never, ThrowOnError>,
) {
const params = buildClientParams(
[parameters],
[
{
args: [
{ in: "query", key: "directory" },
{ in: "query", key: "workspace" },
],
},
],
)
return (options?.client ?? this.client).get<ExperimentalResourceListResponses, unknown, ThrowOnError>({
url: "/experimental/resource",
...options,
...params,
})
}
}
export class Experimental extends HeyApiClient {
private _workspace?: Workspace
get workspace(): Workspace {
return (this._workspace ??= new Workspace({ client: this.client }))
}
private _session?: Session
get session(): Session {
return (this._session ??= new Session({ client: this.client }))
}
private _resource?: Resource
get resource(): Resource {
return (this._resource ??= new Resource({ client: this.client }))
}
}
export class Session2 extends HeyApiClient {
/**
* List sessions
@@ -3898,16 +3896,16 @@ export class OpencodeClient extends HeyApiClient {
return (this._tool ??= new Tool({ client: this.client }))
}
private _worktree?: Worktree
get worktree(): Worktree {
return (this._worktree ??= new Worktree({ client: this.client }))
}
private _experimental?: Experimental
get experimental(): Experimental {
return (this._experimental ??= new Experimental({ client: this.client }))
}
private _worktree?: Worktree
get worktree(): Worktree {
return (this._worktree ??= new Worktree({ client: this.client }))
}
private _session?: Session2
get session(): Session2 {
return (this._session ??= new Session2({ client: this.client }))

View File

@@ -1631,6 +1631,18 @@ export type ToolListItem = {
export type ToolList = Array<ToolListItem>
export type Workspace = {
id: string
branch: string | null
projectID: string
config: {
type: "worktree"
directory: string
name: string
branch: string
}
}
export type Worktree = {
name: string
branch: string
@@ -1645,16 +1657,6 @@ export type WorktreeCreateInput = {
startCommand?: string
}
export type Workspace = {
id: string
branch: string | null
projectID: string
config: {
directory: string
type: "worktree"
}
}
export type WorktreeRemoveInput = {
directory: string
}
@@ -2444,6 +2446,93 @@ export type ToolListResponses = {
export type ToolListResponse = ToolListResponses[keyof ToolListResponses]
export type ExperimentalWorkspaceListData = {
body?: never
path?: never
query?: {
directory?: string
workspace?: string
}
url: "/experimental/workspace"
}
export type ExperimentalWorkspaceListResponses = {
/**
* Workspaces
*/
200: Array<Workspace>
}
export type ExperimentalWorkspaceListResponse =
ExperimentalWorkspaceListResponses[keyof ExperimentalWorkspaceListResponses]
export type ExperimentalWorkspaceCreateData = {
body?: {
branch?: string | null
} & {
type: "worktree"
name: string
}
path?: never
query?: {
directory?: string
workspace?: string
}
url: "/experimental/workspace"
}
export type ExperimentalWorkspaceCreateErrors = {
/**
* Bad request
*/
400: BadRequestError
}
export type ExperimentalWorkspaceCreateError =
ExperimentalWorkspaceCreateErrors[keyof ExperimentalWorkspaceCreateErrors]
export type ExperimentalWorkspaceCreateResponses = {
/**
* Workspace created
*/
200: Workspace
}
export type ExperimentalWorkspaceCreateResponse =
ExperimentalWorkspaceCreateResponses[keyof ExperimentalWorkspaceCreateResponses]
export type ExperimentalWorkspaceRemoveData = {
body?: never
path: {
id: string
}
query?: {
directory?: string
workspace?: string
}
url: "/experimental/workspace/{id}"
}
export type ExperimentalWorkspaceRemoveErrors = {
/**
* Bad request
*/
400: BadRequestError
}
export type ExperimentalWorkspaceRemoveError =
ExperimentalWorkspaceRemoveErrors[keyof ExperimentalWorkspaceRemoveErrors]
export type ExperimentalWorkspaceRemoveResponses = {
/**
* Workspace removed
*/
200: Workspace
}
export type ExperimentalWorkspaceRemoveResponse =
ExperimentalWorkspaceRemoveResponses[keyof ExperimentalWorkspaceRemoveResponses]
export type WorktreeRemoveData = {
body?: WorktreeRemoveInput
path?: never
@@ -2519,96 +2608,6 @@ export type WorktreeCreateResponses = {
export type WorktreeCreateResponse = WorktreeCreateResponses[keyof WorktreeCreateResponses]
export type ExperimentalWorkspaceRemoveData = {
body?: never
path: {
id: string
}
query?: {
directory?: string
workspace?: string
}
url: "/experimental/workspace/{id}"
}
export type ExperimentalWorkspaceRemoveErrors = {
/**
* Bad request
*/
400: BadRequestError
}
export type ExperimentalWorkspaceRemoveError =
ExperimentalWorkspaceRemoveErrors[keyof ExperimentalWorkspaceRemoveErrors]
export type ExperimentalWorkspaceRemoveResponses = {
/**
* Workspace removed
*/
200: Workspace
}
export type ExperimentalWorkspaceRemoveResponse =
ExperimentalWorkspaceRemoveResponses[keyof ExperimentalWorkspaceRemoveResponses]
export type ExperimentalWorkspaceCreateData = {
body?: {
branch: string | null
config: {
directory: string
type: "worktree"
}
}
path: {
id: string
}
query?: {
directory?: string
workspace?: string
}
url: "/experimental/workspace/{id}"
}
export type ExperimentalWorkspaceCreateErrors = {
/**
* Bad request
*/
400: BadRequestError
}
export type ExperimentalWorkspaceCreateError =
ExperimentalWorkspaceCreateErrors[keyof ExperimentalWorkspaceCreateErrors]
export type ExperimentalWorkspaceCreateResponses = {
/**
* Workspace created
*/
200: Workspace
}
export type ExperimentalWorkspaceCreateResponse =
ExperimentalWorkspaceCreateResponses[keyof ExperimentalWorkspaceCreateResponses]
export type ExperimentalWorkspaceListData = {
body?: never
path?: never
query?: {
directory?: string
workspace?: string
}
url: "/experimental/workspace"
}
export type ExperimentalWorkspaceListResponses = {
/**
* Workspaces
*/
200: Array<Workspace>
}
export type ExperimentalWorkspaceListResponse =
ExperimentalWorkspaceListResponses[keyof ExperimentalWorkspaceListResponses]
export type WorktreeResetData = {
body?: WorktreeResetInput
path?: never