@opencode-ai/server 0.0.0-beta-18155 → 0.0.0-beta-18230
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api.d.ts +393 -29
- package/dist/handlers/credential.js +3 -0
- package/dist/handlers/persistent-pty.d.ts +3 -0
- package/dist/handlers/persistent-pty.js +126 -0
- package/dist/handlers/project.d.ts +1 -1
- package/dist/handlers/project.js +5 -1
- package/dist/handlers/session.js +6 -1
- package/dist/handlers/vcs.js +2 -0
- package/dist/handlers.d.ts +1 -1
- package/dist/handlers.js +2 -1
- package/dist/location.d.ts +2 -2
- package/dist/middleware/authorization.js +3 -2
- package/dist/middleware/form-location.d.ts +2 -2
- package/dist/middleware/session-location.d.ts +2 -2
- package/dist/process.js +2 -1
- package/dist/routes.d.ts +3 -2
- package/dist/routes.js +2 -0
- package/dist/workerd.js +3 -0
- package/package.json +7 -6
package/dist/api.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { LocationMiddleware } from "./location";
|
|
2
2
|
import { FormLocationMiddleware } from "./middleware/form-location";
|
|
3
3
|
import { SessionLocationMiddleware } from "./middleware/session-location";
|
|
4
|
-
export declare const Api: import("@opencode-ai/protocol/api").Api<LocationMiddleware, import("effect/unstable/httpapi/HttpApiMiddleware").HttpApiMiddleware<import("@opencode-ai/core/location").Service | import("@opencode-ai/core/agent").Service | import("@opencode-ai/core/aisdk").Service | import("@opencode-ai/core/form").Service | import("@opencode-ai/core/integration").Service | import("@opencode-ai/core/catalog").Service | import("@opencode-ai/core/command").Service | import("@opencode-ai/core/config").Service | import("@opencode-ai/core/environment/environment").Service | import("@opencode-ai/core/file-mutation").Service | import("@opencode-ai/core/formatter").Service | import("@opencode-ai/core/filesystem/search").Service | import("@opencode-ai/core/filesystem").Service | import("@opencode-ai/core/model-resolver").Service | import("@opencode-ai/core/generate").Service | import("@opencode-ai/core/image").Service | import("@opencode-ai/core/plugin/supervisor-service").Service | import("@opencode-ai/core/mcp/index").Service | import("@opencode-ai/core/reference").Service | import("@opencode-ai/core/websearch").Service | import("@opencode-ai/core/plugin").Service | import("@opencode-ai/core/skill").Service | import("@opencode-ai/core/tool").Service | import("@opencode-ai/core/
|
|
4
|
+
export declare const Api: import("@opencode-ai/protocol/api").Api<LocationMiddleware, import("effect/unstable/httpapi/HttpApiMiddleware").HttpApiMiddleware<import("@opencode-ai/core/location").Service | import("@opencode-ai/core/agent").Service | import("@opencode-ai/core/aisdk").Service | import("@opencode-ai/core/form").Service | import("@opencode-ai/core/integration").Service | import("@opencode-ai/core/catalog").Service | import("@opencode-ai/core/command").Service | import("@opencode-ai/core/config").Service | import("@opencode-ai/core/environment/environment").Service | import("@opencode-ai/core/file-mutation").Service | import("@opencode-ai/core/formatter").Service | import("@opencode-ai/core/filesystem/search").Service | import("@opencode-ai/core/filesystem").Service | import("@opencode-ai/core/model-resolver").Service | import("@opencode-ai/core/generate").Service | import("@opencode-ai/core/image").Service | import("@opencode-ai/core/plugin/supervisor-service").Service | import("@opencode-ai/core/mcp/index").Service | import("@opencode-ai/core/reference").Service | import("@opencode-ai/core/websearch").Service | import("@opencode-ai/core/plugin").Service | import("@opencode-ai/core/permission").Service | import("@opencode-ai/core/skill").Service | import("@opencode-ai/core/tool").Service | import("@opencode-ai/core/vcs").Service | import("@opencode-ai/core/location-mutation").Service | import("@opencode-ai/core/tool/read-filesystem").Service | import("@opencode-ai/core/session/instructions").Service | import("@opencode-ai/core/shell").Service | import("@opencode-ai/core/shell/select").Service | import("@opencode-ai/core/instruction-discovery").Service | import("@opencode-ai/core/session/compaction").Service | import("@opencode-ai/core/snapshot").Service | import("@opencode-ai/core/tool-output").Service | import("@opencode-ai/core/session/runner/model").Service | import("@opencode-ai/core/session/model-transport").Service | import("@opencode-ai/core/pty").Service | import("@opencode-ai/core/instructions/builtins").Service | import("@opencode-ai/core/skill/instructions").Service | import("@opencode-ai/core/reference/instructions").Service | import("@opencode-ai/core/session/instruction-entry").Service | import("@opencode-ai/core/session/generate").Service | import("@opencode-ai/core/tool/mcp").Service | import("@opencode-ai/core/session/title").Service | import("@opencode-ai/core/session/runner/index").Service | import("@opencode-ai/core/filesystem/location-watcher").Service, never, never>, FormLocationMiddleware, import("effect/unstable/httpapi/HttpApiMiddleware").HttpApiMiddleware<import("@opencode-ai/core/location").Service | import("@opencode-ai/core/agent").Service | import("@opencode-ai/core/aisdk").Service | import("@opencode-ai/core/form").Service | import("@opencode-ai/core/integration").Service | import("@opencode-ai/core/catalog").Service | import("@opencode-ai/core/command").Service | import("@opencode-ai/core/config").Service | import("@opencode-ai/core/environment/environment").Service | import("@opencode-ai/core/file-mutation").Service | import("@opencode-ai/core/formatter").Service | import("@opencode-ai/core/filesystem/search").Service | import("@opencode-ai/core/filesystem").Service | import("@opencode-ai/core/model-resolver").Service | import("@opencode-ai/core/generate").Service | import("@opencode-ai/core/image").Service | import("@opencode-ai/core/plugin/supervisor-service").Service | import("@opencode-ai/core/mcp/index").Service | import("@opencode-ai/core/reference").Service | import("@opencode-ai/core/websearch").Service | import("@opencode-ai/core/plugin").Service | import("@opencode-ai/core/permission").Service | import("@opencode-ai/core/skill").Service | import("@opencode-ai/core/tool").Service | import("@opencode-ai/core/vcs").Service | import("@opencode-ai/core/location-mutation").Service | import("@opencode-ai/core/tool/read-filesystem").Service | import("@opencode-ai/core/session/instructions").Service | import("@opencode-ai/core/shell").Service | import("@opencode-ai/core/shell/select").Service | import("@opencode-ai/core/instruction-discovery").Service | import("@opencode-ai/core/session/compaction").Service | import("@opencode-ai/core/snapshot").Service | import("@opencode-ai/core/tool-output").Service | import("@opencode-ai/core/session/runner/model").Service | import("@opencode-ai/core/session/model-transport").Service | import("@opencode-ai/core/pty").Service | import("@opencode-ai/core/instructions/builtins").Service | import("@opencode-ai/core/skill/instructions").Service | import("@opencode-ai/core/reference/instructions").Service | import("@opencode-ai/core/session/instruction-entry").Service | import("@opencode-ai/core/session/generate").Service | import("@opencode-ai/core/tool/mcp").Service | import("@opencode-ai/core/session/title").Service | import("@opencode-ai/core/session/runner/index").Service | import("@opencode-ai/core/filesystem/location-watcher").Service, readonly [typeof import("@opencode-ai/protocol/errors").InvalidRequestError, typeof import("@opencode-ai/protocol/errors").SessionNotFoundError], never>, SessionLocationMiddleware, import("effect/unstable/httpapi/HttpApiMiddleware").HttpApiMiddleware<import("@opencode-ai/core/location").Service | import("@opencode-ai/core/agent").Service | import("@opencode-ai/core/aisdk").Service | import("@opencode-ai/core/form").Service | import("@opencode-ai/core/integration").Service | import("@opencode-ai/core/catalog").Service | import("@opencode-ai/core/command").Service | import("@opencode-ai/core/config").Service | import("@opencode-ai/core/environment/environment").Service | import("@opencode-ai/core/file-mutation").Service | import("@opencode-ai/core/formatter").Service | import("@opencode-ai/core/filesystem/search").Service | import("@opencode-ai/core/filesystem").Service | import("@opencode-ai/core/model-resolver").Service | import("@opencode-ai/core/generate").Service | import("@opencode-ai/core/image").Service | import("@opencode-ai/core/plugin/supervisor-service").Service | import("@opencode-ai/core/mcp/index").Service | import("@opencode-ai/core/reference").Service | import("@opencode-ai/core/websearch").Service | import("@opencode-ai/core/plugin").Service | import("@opencode-ai/core/permission").Service | import("@opencode-ai/core/skill").Service | import("@opencode-ai/core/tool").Service | import("@opencode-ai/core/vcs").Service | import("@opencode-ai/core/location-mutation").Service | import("@opencode-ai/core/tool/read-filesystem").Service | import("@opencode-ai/core/session/instructions").Service | import("@opencode-ai/core/shell").Service | import("@opencode-ai/core/shell/select").Service | import("@opencode-ai/core/instruction-discovery").Service | import("@opencode-ai/core/session/compaction").Service | import("@opencode-ai/core/snapshot").Service | import("@opencode-ai/core/tool-output").Service | import("@opencode-ai/core/session/runner/model").Service | import("@opencode-ai/core/session/model-transport").Service | import("@opencode-ai/core/pty").Service | import("@opencode-ai/core/instructions/builtins").Service | import("@opencode-ai/core/skill/instructions").Service | import("@opencode-ai/core/reference/instructions").Service | import("@opencode-ai/core/session/instruction-entry").Service | import("@opencode-ai/core/session/generate").Service | import("@opencode-ai/core/tool/mcp").Service | import("@opencode-ai/core/session/title").Service | import("@opencode-ai/core/session/runner/index").Service | import("@opencode-ai/core/filesystem/location-watcher").Service, readonly [typeof import("@opencode-ai/protocol/errors").InvalidRequestError, typeof import("@opencode-ai/protocol/errors").SessionNotFoundError], never>, import("effect/unstable/httpapi/HttpApiGroup").HttpApiGroup<"server.event", import("effect/unstable/httpapi/HttpApiEndpoint").HttpApiEndpoint<"event.subscribe", "GET", "/api/event", never, never, never, never, import("effect/unstable/httpapi/HttpApiSchema").StreamSse<import("effect/unstable/httpapi/HttpApiSchema").SseEventFromData<import("effect/Schema").Union<readonly [import("effect/Schema").Struct<{
|
|
5
5
|
readonly id: import("effect/Schema").brand<import("effect/Schema").String, "Event.ID"> & {
|
|
6
6
|
create: () => string & import("effect/Brand").Brand<"Event.ID">;
|
|
7
7
|
};
|
|
@@ -39,7 +39,7 @@ export declare const Api: import("@opencode-ai/protocol/api").Api<LocationMiddle
|
|
|
39
39
|
};
|
|
40
40
|
readonly created: import("effect/Schema").Finite;
|
|
41
41
|
readonly metadata: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").$Record<import("effect/Schema").String, import("effect/Schema").Unknown>>>, import("effect/Schema").optionalKey<import("effect/Schema").$Record<import("effect/Schema").String, import("effect/Schema").Unknown>>, never, never>;
|
|
42
|
-
readonly type: import("effect/Schema").Literal<"
|
|
42
|
+
readonly type: import("effect/Schema").Literal<"credential.updated">;
|
|
43
43
|
readonly location: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").Struct<{
|
|
44
44
|
readonly directory: import("effect/Schema").brand<import("effect/Schema").String, "AbsolutePath">;
|
|
45
45
|
readonly workspaceID: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").brand<import("effect/Schema").String, "Workspace.ID"> & {
|
|
@@ -61,7 +61,7 @@ export declare const Api: import("@opencode-ai/protocol/api").Api<LocationMiddle
|
|
|
61
61
|
}>>, never, never>;
|
|
62
62
|
readonly data: import("effect/Schema").Struct<{}>;
|
|
63
63
|
}> & {
|
|
64
|
-
type: "
|
|
64
|
+
type: "credential.updated";
|
|
65
65
|
durability: "ephemeral";
|
|
66
66
|
durable: undefined;
|
|
67
67
|
data: import("effect/Schema").Struct<{}>;
|
|
@@ -71,7 +71,7 @@ export declare const Api: import("@opencode-ai/protocol/api").Api<LocationMiddle
|
|
|
71
71
|
};
|
|
72
72
|
readonly created: import("effect/Schema").Finite;
|
|
73
73
|
readonly metadata: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").$Record<import("effect/Schema").String, import("effect/Schema").Unknown>>>, import("effect/Schema").optionalKey<import("effect/Schema").$Record<import("effect/Schema").String, import("effect/Schema").Unknown>>, never, never>;
|
|
74
|
-
readonly type: import("effect/Schema").Literal<"
|
|
74
|
+
readonly type: import("effect/Schema").Literal<"credential.switched">;
|
|
75
75
|
readonly location: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").Struct<{
|
|
76
76
|
readonly directory: import("effect/Schema").brand<import("effect/Schema").String, "AbsolutePath">;
|
|
77
77
|
readonly workspaceID: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").brand<import("effect/Schema").String, "Workspace.ID"> & {
|
|
@@ -93,14 +93,52 @@ export declare const Api: import("@opencode-ai/protocol/api").Api<LocationMiddle
|
|
|
93
93
|
}>>, never, never>;
|
|
94
94
|
readonly data: import("effect/Schema").Struct<{
|
|
95
95
|
readonly integrationID: import("effect/Schema").brand<import("effect/Schema").String, "Integration.ID">;
|
|
96
|
+
readonly credentialID: import("effect/Schema").NullOr<import("effect/Schema").brand<import("effect/Schema").String, "Credential.ID"> & {
|
|
97
|
+
create: () => string & import("effect/Brand").Brand<"Credential.ID">;
|
|
98
|
+
}>;
|
|
96
99
|
}>;
|
|
97
100
|
}> & {
|
|
98
|
-
type: "
|
|
101
|
+
type: "credential.switched";
|
|
99
102
|
durability: "ephemeral";
|
|
100
103
|
durable: undefined;
|
|
101
104
|
data: import("effect/Schema").Struct<{
|
|
102
105
|
readonly integrationID: import("effect/Schema").brand<import("effect/Schema").String, "Integration.ID">;
|
|
106
|
+
readonly credentialID: import("effect/Schema").NullOr<import("effect/Schema").brand<import("effect/Schema").String, "Credential.ID"> & {
|
|
107
|
+
create: () => string & import("effect/Brand").Brand<"Credential.ID">;
|
|
108
|
+
}>;
|
|
103
109
|
}>;
|
|
110
|
+
}, import("effect/Schema").Struct<{
|
|
111
|
+
readonly id: import("effect/Schema").brand<import("effect/Schema").String, "Event.ID"> & {
|
|
112
|
+
create: () => string & import("effect/Brand").Brand<"Event.ID">;
|
|
113
|
+
};
|
|
114
|
+
readonly created: import("effect/Schema").Finite;
|
|
115
|
+
readonly metadata: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").$Record<import("effect/Schema").String, import("effect/Schema").Unknown>>>, import("effect/Schema").optionalKey<import("effect/Schema").$Record<import("effect/Schema").String, import("effect/Schema").Unknown>>, never, never>;
|
|
116
|
+
readonly type: import("effect/Schema").Literal<"integration.updated">;
|
|
117
|
+
readonly location: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").Struct<{
|
|
118
|
+
readonly directory: import("effect/Schema").brand<import("effect/Schema").String, "AbsolutePath">;
|
|
119
|
+
readonly workspaceID: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").brand<import("effect/Schema").String, "Workspace.ID"> & {
|
|
120
|
+
ascending: (id?: string) => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
121
|
+
create: () => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
122
|
+
}>>, import("effect/Schema").optionalKey<import("effect/Schema").brand<import("effect/Schema").String, "Workspace.ID"> & {
|
|
123
|
+
ascending: (id?: string) => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
124
|
+
create: () => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
125
|
+
}>, never, never>;
|
|
126
|
+
}>>>, import("effect/Schema").optionalKey<import("effect/Schema").Struct<{
|
|
127
|
+
readonly directory: import("effect/Schema").brand<import("effect/Schema").String, "AbsolutePath">;
|
|
128
|
+
readonly workspaceID: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").brand<import("effect/Schema").String, "Workspace.ID"> & {
|
|
129
|
+
ascending: (id?: string) => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
130
|
+
create: () => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
131
|
+
}>>, import("effect/Schema").optionalKey<import("effect/Schema").brand<import("effect/Schema").String, "Workspace.ID"> & {
|
|
132
|
+
ascending: (id?: string) => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
133
|
+
create: () => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
134
|
+
}>, never, never>;
|
|
135
|
+
}>>, never, never>;
|
|
136
|
+
readonly data: import("effect/Schema").Struct<{}>;
|
|
137
|
+
}> & {
|
|
138
|
+
type: "integration.updated";
|
|
139
|
+
durability: "ephemeral";
|
|
140
|
+
durable: undefined;
|
|
141
|
+
data: import("effect/Schema").Struct<{}>;
|
|
104
142
|
}, import("effect/Schema").Struct<{
|
|
105
143
|
readonly id: import("effect/Schema").brand<import("effect/Schema").String, "Event.ID"> & {
|
|
106
144
|
create: () => string & import("effect/Brand").Brand<"Event.ID">;
|
|
@@ -3923,6 +3961,7 @@ export declare const Api: import("@opencode-ai/protocol/api").Api<LocationMiddle
|
|
|
3923
3961
|
readonly messageID: import("effect/Schema").String;
|
|
3924
3962
|
readonly id: import("effect/Schema").String;
|
|
3925
3963
|
}>]>>, never, never>;
|
|
3964
|
+
readonly message: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").String>>, import("effect/Schema").optionalKey<import("effect/Schema").String>, never, never>;
|
|
3926
3965
|
readonly id: import("effect/Schema").brand<import("effect/Schema").String, "Permission.ID"> & {
|
|
3927
3966
|
create: (id?: string) => string & import("effect/Brand").Brand<"Permission.ID">;
|
|
3928
3967
|
};
|
|
@@ -3949,6 +3988,7 @@ export declare const Api: import("@opencode-ai/protocol/api").Api<LocationMiddle
|
|
|
3949
3988
|
readonly messageID: import("effect/Schema").String;
|
|
3950
3989
|
readonly id: import("effect/Schema").String;
|
|
3951
3990
|
}>]>>, never, never>;
|
|
3991
|
+
readonly message: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").String>>, import("effect/Schema").optionalKey<import("effect/Schema").String>, never, never>;
|
|
3952
3992
|
readonly id: import("effect/Schema").brand<import("effect/Schema").String, "Permission.ID"> & {
|
|
3953
3993
|
create: (id?: string) => string & import("effect/Brand").Brand<"Permission.ID">;
|
|
3954
3994
|
};
|
|
@@ -4071,6 +4111,92 @@ export declare const Api: import("@opencode-ai/protocol/api").Api<LocationMiddle
|
|
|
4071
4111
|
durability: "ephemeral";
|
|
4072
4112
|
durable: undefined;
|
|
4073
4113
|
data: import("effect/Schema").Struct<{}>;
|
|
4114
|
+
}, import("effect/Schema").Struct<{
|
|
4115
|
+
readonly id: import("effect/Schema").brand<import("effect/Schema").String, "Event.ID"> & {
|
|
4116
|
+
create: () => string & import("effect/Brand").Brand<"Event.ID">;
|
|
4117
|
+
};
|
|
4118
|
+
readonly created: import("effect/Schema").Finite;
|
|
4119
|
+
readonly metadata: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").$Record<import("effect/Schema").String, import("effect/Schema").Unknown>>>, import("effect/Schema").optionalKey<import("effect/Schema").$Record<import("effect/Schema").String, import("effect/Schema").Unknown>>, never, never>;
|
|
4120
|
+
readonly type: import("effect/Schema").Literal<"project.updated">;
|
|
4121
|
+
readonly location: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").Struct<{
|
|
4122
|
+
readonly directory: import("effect/Schema").brand<import("effect/Schema").String, "AbsolutePath">;
|
|
4123
|
+
readonly workspaceID: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").brand<import("effect/Schema").String, "Workspace.ID"> & {
|
|
4124
|
+
ascending: (id?: string) => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
4125
|
+
create: () => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
4126
|
+
}>>, import("effect/Schema").optionalKey<import("effect/Schema").brand<import("effect/Schema").String, "Workspace.ID"> & {
|
|
4127
|
+
ascending: (id?: string) => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
4128
|
+
create: () => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
4129
|
+
}>, never, never>;
|
|
4130
|
+
}>>>, import("effect/Schema").optionalKey<import("effect/Schema").Struct<{
|
|
4131
|
+
readonly directory: import("effect/Schema").brand<import("effect/Schema").String, "AbsolutePath">;
|
|
4132
|
+
readonly workspaceID: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").brand<import("effect/Schema").String, "Workspace.ID"> & {
|
|
4133
|
+
ascending: (id?: string) => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
4134
|
+
create: () => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
4135
|
+
}>>, import("effect/Schema").optionalKey<import("effect/Schema").brand<import("effect/Schema").String, "Workspace.ID"> & {
|
|
4136
|
+
ascending: (id?: string) => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
4137
|
+
create: () => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
4138
|
+
}>, never, never>;
|
|
4139
|
+
}>>, never, never>;
|
|
4140
|
+
readonly data: import("effect/Schema").Struct<{
|
|
4141
|
+
readonly id: import("effect/Schema").brand<import("effect/Schema").String, "Project.ID"> & {
|
|
4142
|
+
global: string & import("effect/Brand").Brand<"Project.ID">;
|
|
4143
|
+
};
|
|
4144
|
+
readonly canonical: import("effect/Schema").brand<import("effect/Schema").String, "AbsolutePath">;
|
|
4145
|
+
readonly vcs: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").Literals<readonly ["git", "hg"]>>>, import("effect/Schema").optionalKey<import("effect/Schema").Literals<readonly ["git", "hg"]>>, never, never>;
|
|
4146
|
+
readonly name: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").String>>, import("effect/Schema").optionalKey<import("effect/Schema").String>, never, never>;
|
|
4147
|
+
readonly icon: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").Struct<{
|
|
4148
|
+
readonly url: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").String>>, import("effect/Schema").optionalKey<import("effect/Schema").String>, never, never>;
|
|
4149
|
+
readonly override: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").String>>, import("effect/Schema").optionalKey<import("effect/Schema").String>, never, never>;
|
|
4150
|
+
readonly color: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").String>>, import("effect/Schema").optionalKey<import("effect/Schema").String>, never, never>;
|
|
4151
|
+
}>>>, import("effect/Schema").optionalKey<import("effect/Schema").Struct<{
|
|
4152
|
+
readonly url: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").String>>, import("effect/Schema").optionalKey<import("effect/Schema").String>, never, never>;
|
|
4153
|
+
readonly override: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").String>>, import("effect/Schema").optionalKey<import("effect/Schema").String>, never, never>;
|
|
4154
|
+
readonly color: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").String>>, import("effect/Schema").optionalKey<import("effect/Schema").String>, never, never>;
|
|
4155
|
+
}>>, never, never>;
|
|
4156
|
+
readonly commands: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").Struct<{
|
|
4157
|
+
readonly start: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").String>>, import("effect/Schema").optionalKey<import("effect/Schema").String>, never, never>;
|
|
4158
|
+
}>>>, import("effect/Schema").optionalKey<import("effect/Schema").Struct<{
|
|
4159
|
+
readonly start: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").String>>, import("effect/Schema").optionalKey<import("effect/Schema").String>, never, never>;
|
|
4160
|
+
}>>, never, never>;
|
|
4161
|
+
readonly time: import("effect/Schema").Struct<{
|
|
4162
|
+
readonly created: import("effect/Schema").Int;
|
|
4163
|
+
readonly updated: import("effect/Schema").Int;
|
|
4164
|
+
readonly initialized: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").Int>>, import("effect/Schema").optionalKey<import("effect/Schema").Int>, never, never>;
|
|
4165
|
+
}>;
|
|
4166
|
+
readonly sandboxes: import("effect/Schema").$Array<import("effect/Schema").String>;
|
|
4167
|
+
}>;
|
|
4168
|
+
}> & {
|
|
4169
|
+
type: "project.updated";
|
|
4170
|
+
durability: "ephemeral";
|
|
4171
|
+
durable: undefined;
|
|
4172
|
+
data: import("effect/Schema").Struct<{
|
|
4173
|
+
readonly id: import("effect/Schema").brand<import("effect/Schema").String, "Project.ID"> & {
|
|
4174
|
+
global: string & import("effect/Brand").Brand<"Project.ID">;
|
|
4175
|
+
};
|
|
4176
|
+
readonly canonical: import("effect/Schema").brand<import("effect/Schema").String, "AbsolutePath">;
|
|
4177
|
+
readonly vcs: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").Literals<readonly ["git", "hg"]>>>, import("effect/Schema").optionalKey<import("effect/Schema").Literals<readonly ["git", "hg"]>>, never, never>;
|
|
4178
|
+
readonly name: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").String>>, import("effect/Schema").optionalKey<import("effect/Schema").String>, never, never>;
|
|
4179
|
+
readonly icon: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").Struct<{
|
|
4180
|
+
readonly url: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").String>>, import("effect/Schema").optionalKey<import("effect/Schema").String>, never, never>;
|
|
4181
|
+
readonly override: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").String>>, import("effect/Schema").optionalKey<import("effect/Schema").String>, never, never>;
|
|
4182
|
+
readonly color: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").String>>, import("effect/Schema").optionalKey<import("effect/Schema").String>, never, never>;
|
|
4183
|
+
}>>>, import("effect/Schema").optionalKey<import("effect/Schema").Struct<{
|
|
4184
|
+
readonly url: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").String>>, import("effect/Schema").optionalKey<import("effect/Schema").String>, never, never>;
|
|
4185
|
+
readonly override: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").String>>, import("effect/Schema").optionalKey<import("effect/Schema").String>, never, never>;
|
|
4186
|
+
readonly color: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").String>>, import("effect/Schema").optionalKey<import("effect/Schema").String>, never, never>;
|
|
4187
|
+
}>>, never, never>;
|
|
4188
|
+
readonly commands: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").Struct<{
|
|
4189
|
+
readonly start: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").String>>, import("effect/Schema").optionalKey<import("effect/Schema").String>, never, never>;
|
|
4190
|
+
}>>>, import("effect/Schema").optionalKey<import("effect/Schema").Struct<{
|
|
4191
|
+
readonly start: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").String>>, import("effect/Schema").optionalKey<import("effect/Schema").String>, never, never>;
|
|
4192
|
+
}>>, never, never>;
|
|
4193
|
+
readonly time: import("effect/Schema").Struct<{
|
|
4194
|
+
readonly created: import("effect/Schema").Int;
|
|
4195
|
+
readonly updated: import("effect/Schema").Int;
|
|
4196
|
+
readonly initialized: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").Int>>, import("effect/Schema").optionalKey<import("effect/Schema").Int>, never, never>;
|
|
4197
|
+
}>;
|
|
4198
|
+
readonly sandboxes: import("effect/Schema").$Array<import("effect/Schema").String>;
|
|
4199
|
+
}>;
|
|
4074
4200
|
}, import("effect/Schema").Struct<{
|
|
4075
4201
|
readonly id: import("effect/Schema").brand<import("effect/Schema").String, "Event.ID"> & {
|
|
4076
4202
|
create: () => string & import("effect/Brand").Brand<"Event.ID">;
|
|
@@ -4469,6 +4595,150 @@ export declare const Api: import("@opencode-ai/protocol/api").Api<LocationMiddle
|
|
|
4469
4595
|
ascending: (id?: string) => string & import("effect/Brand").Brand<"PtyID">;
|
|
4470
4596
|
};
|
|
4471
4597
|
}>;
|
|
4598
|
+
}, import("effect/Schema").Struct<{
|
|
4599
|
+
readonly id: import("effect/Schema").brand<import("effect/Schema").String, "Event.ID"> & {
|
|
4600
|
+
create: () => string & import("effect/Brand").Brand<"Event.ID">;
|
|
4601
|
+
};
|
|
4602
|
+
readonly created: import("effect/Schema").Finite;
|
|
4603
|
+
readonly metadata: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").$Record<import("effect/Schema").String, import("effect/Schema").Unknown>>>, import("effect/Schema").optionalKey<import("effect/Schema").$Record<import("effect/Schema").String, import("effect/Schema").Unknown>>, never, never>;
|
|
4604
|
+
readonly type: import("effect/Schema").Literal<"persistent-pty.added">;
|
|
4605
|
+
readonly location: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").Struct<{
|
|
4606
|
+
readonly directory: import("effect/Schema").brand<import("effect/Schema").String, "AbsolutePath">;
|
|
4607
|
+
readonly workspaceID: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").brand<import("effect/Schema").String, "Workspace.ID"> & {
|
|
4608
|
+
ascending: (id?: string) => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
4609
|
+
create: () => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
4610
|
+
}>>, import("effect/Schema").optionalKey<import("effect/Schema").brand<import("effect/Schema").String, "Workspace.ID"> & {
|
|
4611
|
+
ascending: (id?: string) => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
4612
|
+
create: () => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
4613
|
+
}>, never, never>;
|
|
4614
|
+
}>>>, import("effect/Schema").optionalKey<import("effect/Schema").Struct<{
|
|
4615
|
+
readonly directory: import("effect/Schema").brand<import("effect/Schema").String, "AbsolutePath">;
|
|
4616
|
+
readonly workspaceID: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").brand<import("effect/Schema").String, "Workspace.ID"> & {
|
|
4617
|
+
ascending: (id?: string) => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
4618
|
+
create: () => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
4619
|
+
}>>, import("effect/Schema").optionalKey<import("effect/Schema").brand<import("effect/Schema").String, "Workspace.ID"> & {
|
|
4620
|
+
ascending: (id?: string) => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
4621
|
+
create: () => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
4622
|
+
}>, never, never>;
|
|
4623
|
+
}>>, never, never>;
|
|
4624
|
+
readonly data: import("effect/Schema").Struct<{
|
|
4625
|
+
readonly sessionID: import("effect/Schema").brand<import("effect/Schema").String, "SessionID"> & {
|
|
4626
|
+
create: () => string & import("effect/Brand").Brand<"SessionID">;
|
|
4627
|
+
descending: (id?: string) => string & import("effect/Brand").Brand<"SessionID">;
|
|
4628
|
+
};
|
|
4629
|
+
readonly terminal: import("effect/Schema").Struct<{
|
|
4630
|
+
readonly sessionID: import("effect/Schema").brand<import("effect/Schema").String, "SessionID"> & {
|
|
4631
|
+
create: () => string & import("effect/Brand").Brand<"SessionID">;
|
|
4632
|
+
descending: (id?: string) => string & import("effect/Brand").Brand<"SessionID">;
|
|
4633
|
+
};
|
|
4634
|
+
readonly foregroundProcess: import("effect/Schema").NullOr<import("effect/Schema").String>;
|
|
4635
|
+
readonly size: import("effect/Schema").Struct<{
|
|
4636
|
+
readonly cols: import("effect/Schema").Int;
|
|
4637
|
+
readonly rows: import("effect/Schema").Int;
|
|
4638
|
+
}>;
|
|
4639
|
+
readonly output: import("effect/Schema").Struct<{
|
|
4640
|
+
readonly head: import("effect/Schema").Int;
|
|
4641
|
+
readonly tail: import("effect/Schema").Int;
|
|
4642
|
+
}>;
|
|
4643
|
+
readonly id: import("effect/Schema").brand<import("effect/Schema").String, "PtyID"> & {
|
|
4644
|
+
create: () => string & import("effect/Brand").Brand<"PtyID">;
|
|
4645
|
+
ascending: (id?: string) => string & import("effect/Brand").Brand<"PtyID">;
|
|
4646
|
+
};
|
|
4647
|
+
readonly title: import("effect/Schema").String;
|
|
4648
|
+
readonly command: import("effect/Schema").String;
|
|
4649
|
+
readonly args: import("effect/Schema").$Array<import("effect/Schema").String>;
|
|
4650
|
+
readonly cwd: import("effect/Schema").String;
|
|
4651
|
+
readonly status: import("effect/Schema").Literals<readonly ["running", "exited"]>;
|
|
4652
|
+
readonly pid: import("effect/Schema").Int;
|
|
4653
|
+
readonly exitCode: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").Int>>, import("effect/Schema").optionalKey<import("effect/Schema").Int>, never, never>;
|
|
4654
|
+
}>;
|
|
4655
|
+
}>;
|
|
4656
|
+
}> & {
|
|
4657
|
+
type: "persistent-pty.added";
|
|
4658
|
+
durability: "ephemeral";
|
|
4659
|
+
durable: undefined;
|
|
4660
|
+
data: import("effect/Schema").Struct<{
|
|
4661
|
+
readonly sessionID: import("effect/Schema").brand<import("effect/Schema").String, "SessionID"> & {
|
|
4662
|
+
create: () => string & import("effect/Brand").Brand<"SessionID">;
|
|
4663
|
+
descending: (id?: string) => string & import("effect/Brand").Brand<"SessionID">;
|
|
4664
|
+
};
|
|
4665
|
+
readonly terminal: import("effect/Schema").Struct<{
|
|
4666
|
+
readonly sessionID: import("effect/Schema").brand<import("effect/Schema").String, "SessionID"> & {
|
|
4667
|
+
create: () => string & import("effect/Brand").Brand<"SessionID">;
|
|
4668
|
+
descending: (id?: string) => string & import("effect/Brand").Brand<"SessionID">;
|
|
4669
|
+
};
|
|
4670
|
+
readonly foregroundProcess: import("effect/Schema").NullOr<import("effect/Schema").String>;
|
|
4671
|
+
readonly size: import("effect/Schema").Struct<{
|
|
4672
|
+
readonly cols: import("effect/Schema").Int;
|
|
4673
|
+
readonly rows: import("effect/Schema").Int;
|
|
4674
|
+
}>;
|
|
4675
|
+
readonly output: import("effect/Schema").Struct<{
|
|
4676
|
+
readonly head: import("effect/Schema").Int;
|
|
4677
|
+
readonly tail: import("effect/Schema").Int;
|
|
4678
|
+
}>;
|
|
4679
|
+
readonly id: import("effect/Schema").brand<import("effect/Schema").String, "PtyID"> & {
|
|
4680
|
+
create: () => string & import("effect/Brand").Brand<"PtyID">;
|
|
4681
|
+
ascending: (id?: string) => string & import("effect/Brand").Brand<"PtyID">;
|
|
4682
|
+
};
|
|
4683
|
+
readonly title: import("effect/Schema").String;
|
|
4684
|
+
readonly command: import("effect/Schema").String;
|
|
4685
|
+
readonly args: import("effect/Schema").$Array<import("effect/Schema").String>;
|
|
4686
|
+
readonly cwd: import("effect/Schema").String;
|
|
4687
|
+
readonly status: import("effect/Schema").Literals<readonly ["running", "exited"]>;
|
|
4688
|
+
readonly pid: import("effect/Schema").Int;
|
|
4689
|
+
readonly exitCode: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").Int>>, import("effect/Schema").optionalKey<import("effect/Schema").Int>, never, never>;
|
|
4690
|
+
}>;
|
|
4691
|
+
}>;
|
|
4692
|
+
}, import("effect/Schema").Struct<{
|
|
4693
|
+
readonly id: import("effect/Schema").brand<import("effect/Schema").String, "Event.ID"> & {
|
|
4694
|
+
create: () => string & import("effect/Brand").Brand<"Event.ID">;
|
|
4695
|
+
};
|
|
4696
|
+
readonly created: import("effect/Schema").Finite;
|
|
4697
|
+
readonly metadata: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").$Record<import("effect/Schema").String, import("effect/Schema").Unknown>>>, import("effect/Schema").optionalKey<import("effect/Schema").$Record<import("effect/Schema").String, import("effect/Schema").Unknown>>, never, never>;
|
|
4698
|
+
readonly type: import("effect/Schema").Literal<"persistent-pty.removed">;
|
|
4699
|
+
readonly location: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").Struct<{
|
|
4700
|
+
readonly directory: import("effect/Schema").brand<import("effect/Schema").String, "AbsolutePath">;
|
|
4701
|
+
readonly workspaceID: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").brand<import("effect/Schema").String, "Workspace.ID"> & {
|
|
4702
|
+
ascending: (id?: string) => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
4703
|
+
create: () => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
4704
|
+
}>>, import("effect/Schema").optionalKey<import("effect/Schema").brand<import("effect/Schema").String, "Workspace.ID"> & {
|
|
4705
|
+
ascending: (id?: string) => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
4706
|
+
create: () => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
4707
|
+
}>, never, never>;
|
|
4708
|
+
}>>>, import("effect/Schema").optionalKey<import("effect/Schema").Struct<{
|
|
4709
|
+
readonly directory: import("effect/Schema").brand<import("effect/Schema").String, "AbsolutePath">;
|
|
4710
|
+
readonly workspaceID: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").brand<import("effect/Schema").String, "Workspace.ID"> & {
|
|
4711
|
+
ascending: (id?: string) => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
4712
|
+
create: () => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
4713
|
+
}>>, import("effect/Schema").optionalKey<import("effect/Schema").brand<import("effect/Schema").String, "Workspace.ID"> & {
|
|
4714
|
+
ascending: (id?: string) => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
4715
|
+
create: () => string & import("effect/Brand").Brand<"Workspace.ID">;
|
|
4716
|
+
}>, never, never>;
|
|
4717
|
+
}>>, never, never>;
|
|
4718
|
+
readonly data: import("effect/Schema").Struct<{
|
|
4719
|
+
readonly sessionID: import("effect/Schema").brand<import("effect/Schema").String, "SessionID"> & {
|
|
4720
|
+
create: () => string & import("effect/Brand").Brand<"SessionID">;
|
|
4721
|
+
descending: (id?: string) => string & import("effect/Brand").Brand<"SessionID">;
|
|
4722
|
+
};
|
|
4723
|
+
readonly ptyID: import("effect/Schema").brand<import("effect/Schema").String, "PtyID"> & {
|
|
4724
|
+
create: () => string & import("effect/Brand").Brand<"PtyID">;
|
|
4725
|
+
ascending: (id?: string) => string & import("effect/Brand").Brand<"PtyID">;
|
|
4726
|
+
};
|
|
4727
|
+
}>;
|
|
4728
|
+
}> & {
|
|
4729
|
+
type: "persistent-pty.removed";
|
|
4730
|
+
durability: "ephemeral";
|
|
4731
|
+
durable: undefined;
|
|
4732
|
+
data: import("effect/Schema").Struct<{
|
|
4733
|
+
readonly sessionID: import("effect/Schema").brand<import("effect/Schema").String, "SessionID"> & {
|
|
4734
|
+
create: () => string & import("effect/Brand").Brand<"SessionID">;
|
|
4735
|
+
descending: (id?: string) => string & import("effect/Brand").Brand<"SessionID">;
|
|
4736
|
+
};
|
|
4737
|
+
readonly ptyID: import("effect/Schema").brand<import("effect/Schema").String, "PtyID"> & {
|
|
4738
|
+
create: () => string & import("effect/Brand").Brand<"PtyID">;
|
|
4739
|
+
ascending: (id?: string) => string & import("effect/Brand").Brand<"PtyID">;
|
|
4740
|
+
};
|
|
4741
|
+
}>;
|
|
4472
4742
|
}, import("effect/Schema").Struct<{
|
|
4473
4743
|
readonly id: import("effect/Schema").brand<import("effect/Schema").String, "Event.ID"> & {
|
|
4474
4744
|
create: () => string & import("effect/Brand").Brand<"Event.ID">;
|
|
@@ -5752,7 +6022,7 @@ export declare const Api: import("@opencode-ai/protocol/api").Api<LocationMiddle
|
|
|
5752
6022
|
} | {
|
|
5753
6023
|
readonly id: string & import("effect/Brand").Brand<"Event.ID">;
|
|
5754
6024
|
readonly data: {};
|
|
5755
|
-
readonly type: "
|
|
6025
|
+
readonly type: "credential.updated";
|
|
5756
6026
|
readonly created: number;
|
|
5757
6027
|
readonly location?: {
|
|
5758
6028
|
readonly directory: string & import("effect/Brand").Brand<"AbsolutePath">;
|
|
@@ -5765,8 +6035,21 @@ export declare const Api: import("@opencode-ai/protocol/api").Api<LocationMiddle
|
|
|
5765
6035
|
readonly id: string & import("effect/Brand").Brand<"Event.ID">;
|
|
5766
6036
|
readonly data: {
|
|
5767
6037
|
readonly integrationID: string & import("effect/Brand").Brand<"Integration.ID">;
|
|
6038
|
+
readonly credentialID: (string & import("effect/Brand").Brand<"Credential.ID">) | null;
|
|
5768
6039
|
};
|
|
5769
|
-
readonly type: "
|
|
6040
|
+
readonly type: "credential.switched";
|
|
6041
|
+
readonly created: number;
|
|
6042
|
+
readonly location?: {
|
|
6043
|
+
readonly directory: string & import("effect/Brand").Brand<"AbsolutePath">;
|
|
6044
|
+
readonly workspaceID?: (string & import("effect/Brand").Brand<"Workspace.ID">) | undefined;
|
|
6045
|
+
} | undefined;
|
|
6046
|
+
readonly metadata?: {
|
|
6047
|
+
readonly [x: string]: unknown;
|
|
6048
|
+
} | undefined;
|
|
6049
|
+
} | {
|
|
6050
|
+
readonly id: string & import("effect/Brand").Brand<"Event.ID">;
|
|
6051
|
+
readonly data: {};
|
|
6052
|
+
readonly type: "integration.updated";
|
|
5770
6053
|
readonly created: number;
|
|
5771
6054
|
readonly location?: {
|
|
5772
6055
|
readonly directory: string & import("effect/Brand").Brand<"AbsolutePath">;
|
|
@@ -5785,6 +6068,7 @@ export declare const Api: import("@opencode-ai/protocol/api").Api<LocationMiddle
|
|
|
5785
6068
|
readonly metadata?: {
|
|
5786
6069
|
readonly [x: string]: unknown;
|
|
5787
6070
|
} | undefined;
|
|
6071
|
+
readonly message?: string | undefined;
|
|
5788
6072
|
readonly save?: readonly string[] | undefined;
|
|
5789
6073
|
readonly source?: {
|
|
5790
6074
|
readonly type: "tool";
|
|
@@ -5829,6 +6113,37 @@ export declare const Api: import("@opencode-ai/protocol/api").Api<LocationMiddle
|
|
|
5829
6113
|
readonly metadata?: {
|
|
5830
6114
|
readonly [x: string]: unknown;
|
|
5831
6115
|
} | undefined;
|
|
6116
|
+
} | {
|
|
6117
|
+
readonly id: string & import("effect/Brand").Brand<"Event.ID">;
|
|
6118
|
+
readonly data: {
|
|
6119
|
+
readonly id: string & import("effect/Brand").Brand<"Project.ID">;
|
|
6120
|
+
readonly canonical: string & import("effect/Brand").Brand<"AbsolutePath">;
|
|
6121
|
+
readonly time: {
|
|
6122
|
+
readonly created: number;
|
|
6123
|
+
readonly updated: number;
|
|
6124
|
+
readonly initialized?: number | undefined;
|
|
6125
|
+
};
|
|
6126
|
+
readonly sandboxes: readonly string[];
|
|
6127
|
+
readonly name?: string | undefined;
|
|
6128
|
+
readonly vcs?: "git" | "hg" | undefined;
|
|
6129
|
+
readonly icon?: {
|
|
6130
|
+
readonly url?: string | undefined;
|
|
6131
|
+
readonly color?: string | undefined;
|
|
6132
|
+
readonly override?: string | undefined;
|
|
6133
|
+
} | undefined;
|
|
6134
|
+
readonly commands?: {
|
|
6135
|
+
readonly start?: string | undefined;
|
|
6136
|
+
} | undefined;
|
|
6137
|
+
};
|
|
6138
|
+
readonly type: "project.updated";
|
|
6139
|
+
readonly created: number;
|
|
6140
|
+
readonly location?: {
|
|
6141
|
+
readonly directory: string & import("effect/Brand").Brand<"AbsolutePath">;
|
|
6142
|
+
readonly workspaceID?: (string & import("effect/Brand").Brand<"Workspace.ID">) | undefined;
|
|
6143
|
+
} | undefined;
|
|
6144
|
+
readonly metadata?: {
|
|
6145
|
+
readonly [x: string]: unknown;
|
|
6146
|
+
} | undefined;
|
|
5832
6147
|
} | {
|
|
5833
6148
|
readonly id: string & import("effect/Brand").Brand<"Event.ID">;
|
|
5834
6149
|
readonly data: {
|
|
@@ -7285,21 +7600,18 @@ export declare const Api: import("@opencode-ai/protocol/api").Api<LocationMiddle
|
|
|
7285
7600
|
} | {
|
|
7286
7601
|
readonly id: string & import("effect/Brand").Brand<"Event.ID">;
|
|
7287
7602
|
readonly data: {
|
|
7288
|
-
readonly
|
|
7603
|
+
readonly info: {
|
|
7604
|
+
readonly id: string & import("effect/Brand").Brand<"PtyID">;
|
|
7605
|
+
readonly command: string;
|
|
7606
|
+
readonly title: string;
|
|
7607
|
+
readonly status: "running" | "exited";
|
|
7608
|
+
readonly pid: number;
|
|
7609
|
+
readonly cwd: string;
|
|
7610
|
+
readonly args: readonly string[];
|
|
7611
|
+
readonly exitCode?: number | undefined;
|
|
7612
|
+
};
|
|
7289
7613
|
};
|
|
7290
|
-
readonly type: "
|
|
7291
|
-
readonly created: number;
|
|
7292
|
-
readonly location?: {
|
|
7293
|
-
readonly directory: string & import("effect/Brand").Brand<"AbsolutePath">;
|
|
7294
|
-
readonly workspaceID?: (string & import("effect/Brand").Brand<"Workspace.ID">) | undefined;
|
|
7295
|
-
} | undefined;
|
|
7296
|
-
readonly metadata?: {
|
|
7297
|
-
readonly [x: string]: unknown;
|
|
7298
|
-
} | undefined;
|
|
7299
|
-
} | {
|
|
7300
|
-
readonly id: string & import("effect/Brand").Brand<"Event.ID">;
|
|
7301
|
-
readonly data: {};
|
|
7302
|
-
readonly type: "plugin.updated";
|
|
7614
|
+
readonly type: "pty.created";
|
|
7303
7615
|
readonly created: number;
|
|
7304
7616
|
readonly location?: {
|
|
7305
7617
|
readonly directory: string & import("effect/Brand").Brand<"AbsolutePath">;
|
|
@@ -7322,7 +7634,7 @@ export declare const Api: import("@opencode-ai/protocol/api").Api<LocationMiddle
|
|
|
7322
7634
|
readonly exitCode?: number | undefined;
|
|
7323
7635
|
};
|
|
7324
7636
|
};
|
|
7325
|
-
readonly type: "pty.
|
|
7637
|
+
readonly type: "pty.updated";
|
|
7326
7638
|
readonly created: number;
|
|
7327
7639
|
readonly location?: {
|
|
7328
7640
|
readonly directory: string & import("effect/Brand").Brand<"AbsolutePath">;
|
|
@@ -7334,18 +7646,58 @@ export declare const Api: import("@opencode-ai/protocol/api").Api<LocationMiddle
|
|
|
7334
7646
|
} | {
|
|
7335
7647
|
readonly id: string & import("effect/Brand").Brand<"Event.ID">;
|
|
7336
7648
|
readonly data: {
|
|
7337
|
-
readonly
|
|
7649
|
+
readonly id: string & import("effect/Brand").Brand<"PtyID">;
|
|
7650
|
+
readonly exitCode: number;
|
|
7651
|
+
};
|
|
7652
|
+
readonly type: "pty.exited";
|
|
7653
|
+
readonly created: number;
|
|
7654
|
+
readonly location?: {
|
|
7655
|
+
readonly directory: string & import("effect/Brand").Brand<"AbsolutePath">;
|
|
7656
|
+
readonly workspaceID?: (string & import("effect/Brand").Brand<"Workspace.ID">) | undefined;
|
|
7657
|
+
} | undefined;
|
|
7658
|
+
readonly metadata?: {
|
|
7659
|
+
readonly [x: string]: unknown;
|
|
7660
|
+
} | undefined;
|
|
7661
|
+
} | {
|
|
7662
|
+
readonly id: string & import("effect/Brand").Brand<"Event.ID">;
|
|
7663
|
+
readonly data: {
|
|
7664
|
+
readonly id: string & import("effect/Brand").Brand<"PtyID">;
|
|
7665
|
+
};
|
|
7666
|
+
readonly type: "pty.deleted";
|
|
7667
|
+
readonly created: number;
|
|
7668
|
+
readonly location?: {
|
|
7669
|
+
readonly directory: string & import("effect/Brand").Brand<"AbsolutePath">;
|
|
7670
|
+
readonly workspaceID?: (string & import("effect/Brand").Brand<"Workspace.ID">) | undefined;
|
|
7671
|
+
} | undefined;
|
|
7672
|
+
readonly metadata?: {
|
|
7673
|
+
readonly [x: string]: unknown;
|
|
7674
|
+
} | undefined;
|
|
7675
|
+
} | {
|
|
7676
|
+
readonly id: string & import("effect/Brand").Brand<"Event.ID">;
|
|
7677
|
+
readonly data: {
|
|
7678
|
+
readonly sessionID: string & import("effect/Brand").Brand<"SessionID">;
|
|
7679
|
+
readonly terminal: {
|
|
7338
7680
|
readonly id: string & import("effect/Brand").Brand<"PtyID">;
|
|
7681
|
+
readonly size: {
|
|
7682
|
+
readonly cols: number;
|
|
7683
|
+
readonly rows: number;
|
|
7684
|
+
};
|
|
7685
|
+
readonly sessionID: string & import("effect/Brand").Brand<"SessionID">;
|
|
7339
7686
|
readonly command: string;
|
|
7340
7687
|
readonly title: string;
|
|
7341
7688
|
readonly status: "running" | "exited";
|
|
7689
|
+
readonly output: {
|
|
7690
|
+
readonly head: number;
|
|
7691
|
+
readonly tail: number;
|
|
7692
|
+
};
|
|
7342
7693
|
readonly pid: number;
|
|
7343
7694
|
readonly cwd: string;
|
|
7344
7695
|
readonly args: readonly string[];
|
|
7696
|
+
readonly foregroundProcess: string | null;
|
|
7345
7697
|
readonly exitCode?: number | undefined;
|
|
7346
7698
|
};
|
|
7347
7699
|
};
|
|
7348
|
-
readonly type: "pty.
|
|
7700
|
+
readonly type: "persistent-pty.added";
|
|
7349
7701
|
readonly created: number;
|
|
7350
7702
|
readonly location?: {
|
|
7351
7703
|
readonly directory: string & import("effect/Brand").Brand<"AbsolutePath">;
|
|
@@ -7357,10 +7709,10 @@ export declare const Api: import("@opencode-ai/protocol/api").Api<LocationMiddle
|
|
|
7357
7709
|
} | {
|
|
7358
7710
|
readonly id: string & import("effect/Brand").Brand<"Event.ID">;
|
|
7359
7711
|
readonly data: {
|
|
7360
|
-
readonly
|
|
7361
|
-
readonly
|
|
7712
|
+
readonly sessionID: string & import("effect/Brand").Brand<"SessionID">;
|
|
7713
|
+
readonly ptyID: string & import("effect/Brand").Brand<"PtyID">;
|
|
7362
7714
|
};
|
|
7363
|
-
readonly type: "pty.
|
|
7715
|
+
readonly type: "persistent-pty.removed";
|
|
7364
7716
|
readonly created: number;
|
|
7365
7717
|
readonly location?: {
|
|
7366
7718
|
readonly directory: string & import("effect/Brand").Brand<"AbsolutePath">;
|
|
@@ -7372,9 +7724,21 @@ export declare const Api: import("@opencode-ai/protocol/api").Api<LocationMiddle
|
|
|
7372
7724
|
} | {
|
|
7373
7725
|
readonly id: string & import("effect/Brand").Brand<"Event.ID">;
|
|
7374
7726
|
readonly data: {
|
|
7375
|
-
readonly id: string & import("effect/Brand").Brand<"
|
|
7727
|
+
readonly id: string & import("effect/Brand").Brand<"Plugin.ID">;
|
|
7376
7728
|
};
|
|
7377
|
-
readonly type: "
|
|
7729
|
+
readonly type: "plugin.added";
|
|
7730
|
+
readonly created: number;
|
|
7731
|
+
readonly location?: {
|
|
7732
|
+
readonly directory: string & import("effect/Brand").Brand<"AbsolutePath">;
|
|
7733
|
+
readonly workspaceID?: (string & import("effect/Brand").Brand<"Workspace.ID">) | undefined;
|
|
7734
|
+
} | undefined;
|
|
7735
|
+
readonly metadata?: {
|
|
7736
|
+
readonly [x: string]: unknown;
|
|
7737
|
+
} | undefined;
|
|
7738
|
+
} | {
|
|
7739
|
+
readonly id: string & import("effect/Brand").Brand<"Event.ID">;
|
|
7740
|
+
readonly data: {};
|
|
7741
|
+
readonly type: "plugin.updated";
|
|
7378
7742
|
readonly created: number;
|
|
7379
7743
|
readonly location?: {
|
|
7380
7744
|
readonly directory: string & import("effect/Brand").Brand<"AbsolutePath">;
|
|
@@ -5,6 +5,9 @@ import { Api } from "../api";
|
|
|
5
5
|
export const CredentialHandler = HttpApiBuilder.group(Api, "server.credential", (handlers) => handlers.handle("credential.update", Effect.fn(function* (ctx) {
|
|
6
6
|
yield* (yield* Integration.Service).connection.update(ctx.params.credentialID, { label: ctx.payload.label });
|
|
7
7
|
return HttpApiSchema.NoContent.make();
|
|
8
|
+
})).handle("credential.activate", Effect.fn(function* (ctx) {
|
|
9
|
+
yield* (yield* Integration.Service).connection.activate(ctx.params.credentialID);
|
|
10
|
+
return HttpApiSchema.NoContent.make();
|
|
8
11
|
})).handle("credential.remove", Effect.fn(function* (ctx) {
|
|
9
12
|
yield* (yield* Integration.Service).connection.remove(ctx.params.credentialID);
|
|
10
13
|
return HttpApiSchema.NoContent.make();
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { PersistentPty } from "@opencode-ai/core/persistent-pty";
|
|
2
|
+
import { PtyTicket } from "@opencode-ai/core/pty/ticket";
|
|
3
|
+
export declare const PersistentPtyHandler: import("effect/Layer").Layer<import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.experimental">, never, PtyTicket.Service | PersistentPty.Service | (import("@opencode-ai/protocol/middleware/schema-error").SchemaErrorMiddleware | import("@opencode-ai/protocol/middleware/authorization").Authorization)>;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { PersistentPty } from "@opencode-ai/core/persistent-pty";
|
|
2
|
+
import { PtyTicket } from "@opencode-ai/core/pty/ticket";
|
|
3
|
+
import { ForbiddenError, PtyNotFoundError, ServiceUnavailableError } from "@opencode-ai/protocol/errors";
|
|
4
|
+
import {
|
|
5
|
+
PTY_CONNECT_TICKET_QUERY,
|
|
6
|
+
PTY_CONNECT_TOKEN_HEADER,
|
|
7
|
+
PTY_CONNECT_TOKEN_HEADER_VALUE
|
|
8
|
+
} from "@opencode-ai/protocol/groups/persistent-pty";
|
|
9
|
+
import { Effect, Queue, Semaphore } from "effect";
|
|
10
|
+
import { HttpServerRequest, HttpServerResponse } from "effect/unstable/http";
|
|
11
|
+
import { HttpApiBuilder, HttpApiSchema } from "effect/unstable/httpapi";
|
|
12
|
+
import { Socket } from "effect/unstable/socket";
|
|
13
|
+
import { Api } from "../api";
|
|
14
|
+
import { CorsConfig, isAllowedRequestOrigin } from "../cors";
|
|
15
|
+
export const PersistentPtyHandler = HttpApiBuilder.group(Api, "server.experimental", (handlers) => Effect.gen(function* () {
|
|
16
|
+
const tickets = yield* PtyTicket.Service, cors = yield* CorsConfig, pty = yield* PersistentPty.Service;
|
|
17
|
+
return handlers.handle("persistentPty.list", Effect.fn(function* (ctx) {
|
|
18
|
+
return { data: yield* pty.list(ctx.params.sessionID).pipe(mapUnavailable) };
|
|
19
|
+
})).handle("persistentPty.create", Effect.fn(function* (ctx) {
|
|
20
|
+
return {
|
|
21
|
+
data: yield* pty.create(ctx.params.sessionID, {
|
|
22
|
+
command: ctx.payload.command,
|
|
23
|
+
args: ctx.payload.args,
|
|
24
|
+
cwd: ctx.payload.cwd,
|
|
25
|
+
title: ctx.payload.title,
|
|
26
|
+
env: ctx.payload.env,
|
|
27
|
+
cols: ctx.payload.size?.cols,
|
|
28
|
+
rows: ctx.payload.size?.rows
|
|
29
|
+
}).pipe(Effect.catchTag("PersistentPty.UnavailableError", unavailable))
|
|
30
|
+
};
|
|
31
|
+
})).handle("persistentPty.shutdown", Effect.fn(function* () {
|
|
32
|
+
yield* pty.shutdown().pipe(mapUnavailable);
|
|
33
|
+
return HttpApiSchema.NoContent.make();
|
|
34
|
+
})).handle("persistentPty.get", Effect.fn(function* (ctx) {
|
|
35
|
+
return { data: yield* pty.get(ctx.params.ptyID).pipe(mapTerminalError) };
|
|
36
|
+
})).handle("persistentPty.update", Effect.fn(function* (ctx) {
|
|
37
|
+
yield* pty.resize(ctx.params.ptyID, ctx.payload.size.cols, ctx.payload.size.rows, ctx.payload.attachmentID).pipe(mapTerminalError);
|
|
38
|
+
return { data: yield* pty.get(ctx.params.ptyID).pipe(mapTerminalError) };
|
|
39
|
+
})).handle("persistentPty.snapshot", Effect.fn(function* (ctx) {
|
|
40
|
+
return { data: yield* pty.snapshot(ctx.params.ptyID).pipe(mapTerminalError) };
|
|
41
|
+
})).handle("persistentPty.remove", Effect.fn(function* (ctx) {
|
|
42
|
+
yield* pty.remove(ctx.params.ptyID).pipe(mapTerminalError);
|
|
43
|
+
return HttpApiSchema.NoContent.make();
|
|
44
|
+
})).handle("persistentPty.connectToken", Effect.fn(function* (ctx) {
|
|
45
|
+
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
46
|
+
if (request.headers[PTY_CONNECT_TOKEN_HEADER] !== PTY_CONNECT_TOKEN_HEADER_VALUE || !isAllowedRequestOrigin(request.headers.origin, request.headers.host, cors))
|
|
47
|
+
return yield* new ForbiddenError({ message: "Invalid persistent PTY connect token request" });
|
|
48
|
+
yield* pty.get(ctx.params.ptyID).pipe(mapTerminalError);
|
|
49
|
+
return { data: yield* tickets.issue({ ptyID: ctx.params.ptyID }) };
|
|
50
|
+
})).handleRaw("persistentPty.connect", Effect.fn("PersistentPtyHandler.connect")(function* (ctx) {
|
|
51
|
+
if (!(yield* pty.get(ctx.params.ptyID).pipe(Effect.as(!0), Effect.catchTag("PersistentPty.NotFoundError", () => Effect.succeed(!1)), Effect.catchTag("PersistentPty.UnavailableError", () => Effect.succeed(!1)))))
|
|
52
|
+
return HttpServerResponse.empty({ status: 404 });
|
|
53
|
+
const url = new URL(ctx.request.url, "http://localhost"), ticket = url.searchParams.get(PTY_CONNECT_TICKET_QUERY);
|
|
54
|
+
if (ticket) {
|
|
55
|
+
if (!(isAllowedRequestOrigin(ctx.request.headers.origin, ctx.request.headers.host, cors) ? yield* tickets.consume({ ticket, ptyID: ctx.params.ptyID }) : !1))
|
|
56
|
+
return HttpServerResponse.empty({ status: 403 });
|
|
57
|
+
}
|
|
58
|
+
const cursor = Number(url.searchParams.get("cursor") ?? "0"), role = url.searchParams.get("role") === "observer" ? "observer" : "controller", framedInput = url.searchParams.get("input_protocol") === "1", attachmentID = url.searchParams.get("attachment_id") ?? crypto.randomUUID();
|
|
59
|
+
if (!Number.isSafeInteger(cursor) || cursor < 0)
|
|
60
|
+
return HttpServerResponse.empty({ status: 400 });
|
|
61
|
+
const socket = yield* Effect.orDie(ctx.request.upgrade), write = yield* socket.writer, outbox = yield* Queue.unbounded(), input = yield* Semaphore.make(1), attachment = yield* pty.attach(ctx.params.ptyID, {
|
|
62
|
+
cursor,
|
|
63
|
+
attachmentID,
|
|
64
|
+
role,
|
|
65
|
+
takeover: url.searchParams.get("takeover") === "true",
|
|
66
|
+
onEvent: (event) => {
|
|
67
|
+
if (event.type === "output")
|
|
68
|
+
Queue.offerUnsafe(outbox, event.data);
|
|
69
|
+
if (event.type === "resized")
|
|
70
|
+
Queue.offerUnsafe(outbox, JSON.stringify({ ...event, checkpoint: Buffer.from(event.checkpoint).toString("base64") }));
|
|
71
|
+
if (event.type !== "output" && event.type !== "resized")
|
|
72
|
+
Queue.offerUnsafe(outbox, JSON.stringify(event));
|
|
73
|
+
},
|
|
74
|
+
onEnd: () => Queue.offerUnsafe(outbox, new Socket.CloseEvent(1000))
|
|
75
|
+
}).pipe(Effect.catchTags({
|
|
76
|
+
"PersistentPty.NotFoundError": () => Effect.succeed(void 0),
|
|
77
|
+
"PersistentPty.UnavailableError": () => Effect.succeed(void 0)
|
|
78
|
+
}));
|
|
79
|
+
if (!attachment)
|
|
80
|
+
return HttpServerResponse.empty({ status: 404 });
|
|
81
|
+
Queue.offerUnsafe(outbox, JSON.stringify({
|
|
82
|
+
type: "attached",
|
|
83
|
+
attachmentID,
|
|
84
|
+
inputProtocol: framedInput ? 1 : 0,
|
|
85
|
+
info: attachment.info,
|
|
86
|
+
role: attachment.role,
|
|
87
|
+
generation: attachment.generation,
|
|
88
|
+
replay: {
|
|
89
|
+
requestedOffset: attachment.replay.requestedOffset,
|
|
90
|
+
availableOffset: attachment.replay.availableOffset,
|
|
91
|
+
endOffset: attachment.replay.endOffset,
|
|
92
|
+
truncated: attachment.replay.truncated
|
|
93
|
+
}
|
|
94
|
+
}));
|
|
95
|
+
if (attachment.replay.data.length > 0)
|
|
96
|
+
Queue.offerUnsafe(outbox, attachment.replay.data);
|
|
97
|
+
Queue.offerUnsafe(outbox, JSON.stringify({ type: "replay_complete", endOffset: attachment.replay.endOffset }));
|
|
98
|
+
attachment.activate();
|
|
99
|
+
const drain = Effect.gen(function* () {
|
|
100
|
+
while (!0) {
|
|
101
|
+
const item = yield* Queue.take(outbox);
|
|
102
|
+
yield* write(item);
|
|
103
|
+
if (item instanceof Socket.CloseEvent)
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
yield* Effect.race(drain, socket.runRaw((message) => input.withPermit(Effect.suspend(() => {
|
|
108
|
+
const data = typeof message === "string" ? Buffer.from(message) : message;
|
|
109
|
+
if (!framedInput)
|
|
110
|
+
return pty.input(ctx.params.ptyID, attachmentID, attachment.info.size.cols, attachment.info.size.rows, data).pipe(Effect.ignore);
|
|
111
|
+
if (data.byteLength < 5)
|
|
112
|
+
return Effect.void;
|
|
113
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength), type = data[0], cols = view.getUint16(1), rows = view.getUint16(3);
|
|
114
|
+
if (type !== 0 && type !== 1 || cols === 0 || rows === 0)
|
|
115
|
+
return Effect.void;
|
|
116
|
+
if (type === 0)
|
|
117
|
+
return pty.control(ctx.params.ptyID, attachmentID, cols, rows).pipe(Effect.ignore);
|
|
118
|
+
return pty.input(ctx.params.ptyID, attachmentID, cols, rows, data.subarray(5)).pipe(Effect.ignore);
|
|
119
|
+
})))).pipe(Effect.catchReason("SocketError", "SocketCloseError", () => Effect.void), Effect.ensuring(Effect.sync(() => attachment.detach())), Effect.orDie);
|
|
120
|
+
return HttpServerResponse.empty();
|
|
121
|
+
}));
|
|
122
|
+
}));
|
|
123
|
+
const mapUnavailable = (effect) => effect.pipe(Effect.catchTag("PersistentPty.UnavailableError", unavailable)), mapTerminalError = (effect) => effect.pipe(Effect.catchTags({
|
|
124
|
+
"PersistentPty.NotFoundError": (error) => new PtyNotFoundError({ ptyID: error.ptyID, message: `PTY session not found: ${error.ptyID}` }),
|
|
125
|
+
"PersistentPty.UnavailableError": unavailable
|
|
126
|
+
})), unavailable = (error) => new ServiceUnavailableError({ message: error.message, service: "opencode-pty" });
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { Project } from "@opencode-ai/core/project";
|
|
2
|
-
export declare const ProjectHandler: import("effect/Layer").Layer<import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.project">, never, import("@opencode-ai/protocol/middleware/schema-error").SchemaErrorMiddleware | import("@opencode-ai/protocol/middleware/authorization").Authorization | import("../location").LocationMiddleware
|
|
2
|
+
export declare const ProjectHandler: import("effect/Layer").Layer<import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.project">, never, import("effect/unstable/http/HttpRouter").Request<"Requires", Project.Service> | (import("@opencode-ai/protocol/middleware/schema-error").SchemaErrorMiddleware | import("@opencode-ai/protocol/middleware/authorization").Authorization | import("../location").LocationMiddleware)>;
|
package/dist/handlers/project.js
CHANGED
|
@@ -3,7 +3,11 @@ import { Project } from "@opencode-ai/core/project";
|
|
|
3
3
|
import { Effect } from "effect";
|
|
4
4
|
import { HttpApiBuilder } from "effect/unstable/httpapi";
|
|
5
5
|
import { Api } from "../api";
|
|
6
|
-
|
|
6
|
+
import { ProjectNotFoundError } from "@opencode-ai/protocol/errors";
|
|
7
|
+
export const ProjectHandler = HttpApiBuilder.group(Api, "server.project", (handlers) => handlers.handle("project.list", () => Project.Service.use((project) => project.list())).handle("project.update", (ctx) => Project.Service.use((project) => project.update({ ...ctx.payload, projectID: ctx.params.projectID }).pipe(Effect.mapError(() => new ProjectNotFoundError({
|
|
8
|
+
projectID: ctx.params.projectID,
|
|
9
|
+
message: `Project not found: ${ctx.params.projectID}`
|
|
10
|
+
}))))).handle("project.current", () => Location.Service.use((location) => Effect.succeed({
|
|
7
11
|
id: location.project.id,
|
|
8
12
|
directory: location.project.directory,
|
|
9
13
|
canonical: location.project.canonical
|
package/dist/handlers/session.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Session } from "@opencode-ai/core/session";
|
|
2
2
|
import { SessionStats } from "@opencode-ai/core/session/stats";
|
|
3
|
+
import { SessionTitle } from "@opencode-ai/core/session/title";
|
|
3
4
|
import { SessionTransfer } from "@opencode-ai/core/session/transfer";
|
|
4
5
|
import { InstructionEntry } from "@opencode-ai/core/session/instruction-entry";
|
|
5
6
|
import { DateTime, Effect, Stream } from "effect";
|
|
@@ -125,7 +126,11 @@ export const SessionHandler = HttpApiBuilder.group(Api, "server.session", (handl
|
|
|
125
126
|
yield* session.switchModel({ sessionID: ctx.params.sessionID, model: ctx.payload.model }).pipe(Effect.catchTag("Session.NotFoundError", missingSession));
|
|
126
127
|
return HttpApiSchema.NoContent.make();
|
|
127
128
|
})).handle("session.rename", Effect.fn(function* (ctx) {
|
|
128
|
-
|
|
129
|
+
if (ctx.payload.title) {
|
|
130
|
+
yield* session.rename({ sessionID: ctx.params.sessionID, title: ctx.payload.title }).pipe(Effect.catchTag("Session.NotFoundError", missingSession));
|
|
131
|
+
return HttpApiSchema.NoContent.make();
|
|
132
|
+
}
|
|
133
|
+
yield* (yield* SessionTitle.Service).generate(ctx.params.sessionID);
|
|
129
134
|
return HttpApiSchema.NoContent.make();
|
|
130
135
|
})).handle("session.move", Effect.fn(function* (ctx) {
|
|
131
136
|
yield* session.move({
|
package/dist/handlers/vcs.js
CHANGED
|
@@ -8,6 +8,8 @@ export const VcsHandler = HttpApiBuilder.group(Api, "server.vcs", (handlers) =>
|
|
|
8
8
|
return yield* (yield* Vcs.Service).info();
|
|
9
9
|
}))).handle("vcs.status", () => response(Effect.gen(function* () {
|
|
10
10
|
return yield* (yield* Vcs.Service).status();
|
|
11
|
+
}))).handle("vcs.branches", (ctx) => response(Effect.gen(function* () {
|
|
12
|
+
return yield* (yield* Vcs.Service).branches({ search: ctx.query.search, limit: Math.min(ctx.query.limit ?? 50, 100) });
|
|
11
13
|
}))).handle("vcs.diff", (ctx) => response(Effect.gen(function* () {
|
|
12
14
|
return yield* (yield* Vcs.Service).diff(ctx.query.mode, { context: ctx.query.context });
|
|
13
15
|
})));
|
package/dist/handlers.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { Layer } from "effect";
|
|
2
|
-
export declare const handlers: Layer.Layer<import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.generate"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.message"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.model"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.provider"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.session"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.permission"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.fs"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.form"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.command"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.skill"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.event"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.agent"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.plugin"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.health"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.server"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.debug"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.pty"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.shell"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.reference"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.location"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.integration"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.websearch"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.mcp"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.credential"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.project"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.worktree"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.vcs"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.migration"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.config"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.workspace">, never, import("@opencode-ai/protocol/middleware/schema-error").SchemaErrorMiddleware | import("@opencode-ai/protocol/middleware/authorization").Authorization | import("@opencode-ai/util/global").Service | import("@opencode-ai/core/bus").Service | import("@opencode-ai/core/workspace").Service | import("@opencode-ai/core/location-service-map").Service | import("@opencode-ai/core/worktree").Service | import("@opencode-ai/core/session").Service | import("./location").LocationMiddleware | import("./middleware/form-location").FormLocationMiddleware | import("./middleware/session-location").SessionLocationMiddleware | import("@opencode-ai/core/pty/ticket").Service | import("@opencode-ai/core/session/transfer").Service | import("effect/unstable/http/HttpRouter").Request<"Requires", import("@opencode-ai/core/database/database").Service> | import("effect/unstable/http/HttpRouter").Request<"Requires", import("@opencode-ai/core/permission/saved").Service> | import("effect/unstable/http/HttpRouter").Request<"Requires", import("./server-info").Service> | import("./pty-environment").Service | import("effect/unstable/http/HttpRouter").Request<"Requires", import("@opencode-ai/core/wellknown").Service> | import("effect/unstable/http/HttpRouter").Request<"Requires", import("@opencode-ai/core/project").Service>>;
|
|
2
|
+
export declare const handlers: Layer.Layer<import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.generate"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.message"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.model"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.provider"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.session"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.permission"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.fs"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.form"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.command"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.skill"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.event"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.agent"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.plugin"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.health"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.server"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.debug"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.pty"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.experimental"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.shell"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.reference"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.location"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.integration"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.websearch"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.mcp"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.credential"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.project"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.worktree"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.vcs"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.migration"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.config"> | import("effect/unstable/httpapi/HttpApiGroup").Service<"server", "server.workspace">, never, import("@opencode-ai/protocol/middleware/schema-error").SchemaErrorMiddleware | import("@opencode-ai/protocol/middleware/authorization").Authorization | import("@opencode-ai/util/global").Service | import("@opencode-ai/core/bus").Service | import("@opencode-ai/core/workspace").Service | import("@opencode-ai/core/location-service-map").Service | import("@opencode-ai/core/worktree").Service | import("@opencode-ai/core/session").Service | import("./location").LocationMiddleware | import("./middleware/form-location").FormLocationMiddleware | import("./middleware/session-location").SessionLocationMiddleware | import("@opencode-ai/core/pty/ticket").Service | import("@opencode-ai/core/persistent-pty/index").Service | import("@opencode-ai/core/session/transfer").Service | import("effect/unstable/http/HttpRouter").Request<"Requires", import("@opencode-ai/core/database/database").Service> | import("effect/unstable/http/HttpRouter").Request<"Requires", import("@opencode-ai/core/permission/saved").Service> | import("effect/unstable/http/HttpRouter").Request<"Requires", import("./server-info").Service> | import("./pty-environment").Service | import("effect/unstable/http/HttpRouter").Request<"Requires", import("@opencode-ai/core/wellknown").Service> | import("effect/unstable/http/HttpRouter").Request<"Requires", import("@opencode-ai/core/project").Service>>;
|
package/dist/handlers.js
CHANGED
|
@@ -16,6 +16,7 @@ import { HealthHandler } from "./handlers/health";
|
|
|
16
16
|
import { ServerHandler } from "./handlers/server";
|
|
17
17
|
import { DebugHandler } from "./handlers/debug";
|
|
18
18
|
import { PtyHandler } from "./handlers/pty";
|
|
19
|
+
import { PersistentPtyHandler } from "./handlers/persistent-pty";
|
|
19
20
|
import { ShellHandler } from "./handlers/shell";
|
|
20
21
|
import { ReferenceHandler } from "./handlers/reference";
|
|
21
22
|
import { LocationHandler } from "./handlers/location";
|
|
@@ -30,4 +31,4 @@ import { EventFeed } from "./event-feed";
|
|
|
30
31
|
import { MigrationHandler } from "./handlers/migration";
|
|
31
32
|
import { ConfigHandler } from "./handlers/config";
|
|
32
33
|
import { WorkspaceHandler } from "./handlers/workspace";
|
|
33
|
-
export const handlers = Layer.mergeAll(HealthHandler, ServerHandler, DebugHandler, MigrationHandler, LocationHandler, AgentHandler, PluginHandler, SessionHandler, MessageHandler, ModelHandler, GenerateHandler, ProviderHandler, IntegrationHandler, WebSearchHandler, McpHandler, CredentialHandler, ProjectHandler, FormHandler, PermissionHandler, FileSystemHandler, CommandHandler, SkillHandler, EventHandler.pipe(Layer.provide(EventFeed.layer)), PtyHandler, ShellHandler, ReferenceHandler, WorktreeHandler, WorkspaceHandler, VcsHandler, ConfigHandler);
|
|
34
|
+
export const handlers = Layer.mergeAll(HealthHandler, ServerHandler, DebugHandler, MigrationHandler, LocationHandler, AgentHandler, PluginHandler, SessionHandler, MessageHandler, ModelHandler, GenerateHandler, ProviderHandler, IntegrationHandler, WebSearchHandler, McpHandler, CredentialHandler, ProjectHandler, FormHandler, PermissionHandler, FileSystemHandler, CommandHandler, SkillHandler, EventHandler.pipe(Layer.provide(EventFeed.layer)), PtyHandler, PersistentPtyHandler, ShellHandler, ReferenceHandler, WorktreeHandler, WorkspaceHandler, VcsHandler, ConfigHandler);
|
package/dist/location.d.ts
CHANGED
|
@@ -6,12 +6,12 @@ import { HttpApiMiddleware } from "effect/unstable/httpapi";
|
|
|
6
6
|
export type LocationServices = Layer.Success<ReturnType<(typeof LocationServiceMap.Service)["get"]>>;
|
|
7
7
|
declare const LocationMiddleware_base: HttpApiMiddleware.ServiceClass<LocationMiddleware, "@opencode/HttpApiLocation", {
|
|
8
8
|
requires: never;
|
|
9
|
-
provides: Location.Service | import("@opencode-ai/core/agent").Service | import("@opencode-ai/core/aisdk").Service | import("@opencode-ai/core/form").Service | import("@opencode-ai/core/integration").Service | import("@opencode-ai/core/catalog").Service | import("@opencode-ai/core/command").Service | import("@opencode-ai/core/config").Service | import("@opencode-ai/core/environment/environment").Service | import("@opencode-ai/core/file-mutation").Service | import("@opencode-ai/core/formatter").Service | import("@opencode-ai/core/filesystem/search").Service | import("@opencode-ai/core/filesystem").Service | import("@opencode-ai/core/model-resolver").Service | import("@opencode-ai/core/generate").Service | import("@opencode-ai/core/image").Service | import("@opencode-ai/core/plugin/supervisor-service").Service | import("@opencode-ai/core/mcp/index").Service | import("@opencode-ai/core/reference").Service | import("@opencode-ai/core/websearch").Service | import("@opencode-ai/core/plugin").Service | import("@opencode-ai/core/skill").Service | import("@opencode-ai/core/tool").Service | import("@opencode-ai/core/
|
|
9
|
+
provides: Location.Service | import("@opencode-ai/core/agent").Service | import("@opencode-ai/core/aisdk").Service | import("@opencode-ai/core/form").Service | import("@opencode-ai/core/integration").Service | import("@opencode-ai/core/catalog").Service | import("@opencode-ai/core/command").Service | import("@opencode-ai/core/config").Service | import("@opencode-ai/core/environment/environment").Service | import("@opencode-ai/core/file-mutation").Service | import("@opencode-ai/core/formatter").Service | import("@opencode-ai/core/filesystem/search").Service | import("@opencode-ai/core/filesystem").Service | import("@opencode-ai/core/model-resolver").Service | import("@opencode-ai/core/generate").Service | import("@opencode-ai/core/image").Service | import("@opencode-ai/core/plugin/supervisor-service").Service | import("@opencode-ai/core/mcp/index").Service | import("@opencode-ai/core/reference").Service | import("@opencode-ai/core/websearch").Service | import("@opencode-ai/core/plugin").Service | import("@opencode-ai/core/permission").Service | import("@opencode-ai/core/skill").Service | import("@opencode-ai/core/tool").Service | import("@opencode-ai/core/vcs").Service | import("@opencode-ai/core/location-mutation").Service | import("@opencode-ai/core/tool/read-filesystem").Service | import("@opencode-ai/core/session/instructions").Service | import("@opencode-ai/core/shell").Service | import("@opencode-ai/core/shell/select").Service | import("@opencode-ai/core/instruction-discovery").Service | import("@opencode-ai/core/session/compaction").Service | import("@opencode-ai/core/snapshot").Service | import("@opencode-ai/core/tool-output").Service | import("@opencode-ai/core/session/runner/model").Service | import("@opencode-ai/core/session/model-transport").Service | import("@opencode-ai/core/pty").Service | import("@opencode-ai/core/instructions/builtins").Service | import("@opencode-ai/core/skill/instructions").Service | import("@opencode-ai/core/reference/instructions").Service | import("@opencode-ai/core/session/instruction-entry").Service | import("@opencode-ai/core/session/generate").Service | import("@opencode-ai/core/tool/mcp").Service | import("@opencode-ai/core/session/title").Service | import("@opencode-ai/core/session/runner/index").Service | import("@opencode-ai/core/filesystem/location-watcher").Service;
|
|
10
10
|
error: never;
|
|
11
11
|
clientError: never;
|
|
12
12
|
requiredForClient: false;
|
|
13
13
|
security: never;
|
|
14
|
-
}, HttpApiMiddleware.HttpApiMiddleware<Location.Service | import("@opencode-ai/core/agent").Service | import("@opencode-ai/core/aisdk").Service | import("@opencode-ai/core/form").Service | import("@opencode-ai/core/integration").Service | import("@opencode-ai/core/catalog").Service | import("@opencode-ai/core/command").Service | import("@opencode-ai/core/config").Service | import("@opencode-ai/core/environment/environment").Service | import("@opencode-ai/core/file-mutation").Service | import("@opencode-ai/core/formatter").Service | import("@opencode-ai/core/filesystem/search").Service | import("@opencode-ai/core/filesystem").Service | import("@opencode-ai/core/model-resolver").Service | import("@opencode-ai/core/generate").Service | import("@opencode-ai/core/image").Service | import("@opencode-ai/core/plugin/supervisor-service").Service | import("@opencode-ai/core/mcp/index").Service | import("@opencode-ai/core/reference").Service | import("@opencode-ai/core/websearch").Service | import("@opencode-ai/core/plugin").Service | import("@opencode-ai/core/skill").Service | import("@opencode-ai/core/tool").Service | import("@opencode-ai/core/
|
|
14
|
+
}, HttpApiMiddleware.HttpApiMiddleware<Location.Service | import("@opencode-ai/core/agent").Service | import("@opencode-ai/core/aisdk").Service | import("@opencode-ai/core/form").Service | import("@opencode-ai/core/integration").Service | import("@opencode-ai/core/catalog").Service | import("@opencode-ai/core/command").Service | import("@opencode-ai/core/config").Service | import("@opencode-ai/core/environment/environment").Service | import("@opencode-ai/core/file-mutation").Service | import("@opencode-ai/core/formatter").Service | import("@opencode-ai/core/filesystem/search").Service | import("@opencode-ai/core/filesystem").Service | import("@opencode-ai/core/model-resolver").Service | import("@opencode-ai/core/generate").Service | import("@opencode-ai/core/image").Service | import("@opencode-ai/core/plugin/supervisor-service").Service | import("@opencode-ai/core/mcp/index").Service | import("@opencode-ai/core/reference").Service | import("@opencode-ai/core/websearch").Service | import("@opencode-ai/core/plugin").Service | import("@opencode-ai/core/permission").Service | import("@opencode-ai/core/skill").Service | import("@opencode-ai/core/tool").Service | import("@opencode-ai/core/vcs").Service | import("@opencode-ai/core/location-mutation").Service | import("@opencode-ai/core/tool/read-filesystem").Service | import("@opencode-ai/core/session/instructions").Service | import("@opencode-ai/core/shell").Service | import("@opencode-ai/core/shell/select").Service | import("@opencode-ai/core/instruction-discovery").Service | import("@opencode-ai/core/session/compaction").Service | import("@opencode-ai/core/snapshot").Service | import("@opencode-ai/core/tool-output").Service | import("@opencode-ai/core/session/runner/model").Service | import("@opencode-ai/core/session/model-transport").Service | import("@opencode-ai/core/pty").Service | import("@opencode-ai/core/instructions/builtins").Service | import("@opencode-ai/core/skill/instructions").Service | import("@opencode-ai/core/reference/instructions").Service | import("@opencode-ai/core/session/instruction-entry").Service | import("@opencode-ai/core/session/generate").Service | import("@opencode-ai/core/tool/mcp").Service | import("@opencode-ai/core/session/title").Service | import("@opencode-ai/core/session/runner/index").Service | import("@opencode-ai/core/filesystem/location-watcher").Service, never, never>>;
|
|
15
15
|
export declare class LocationMiddleware extends LocationMiddleware_base {
|
|
16
16
|
}
|
|
17
17
|
export declare function response<A, E, R>(data: Effect.Effect<A, E, R>): Effect.Effect<{
|
|
@@ -3,6 +3,7 @@ import { UnauthorizedError } from "@opencode-ai/protocol/errors";
|
|
|
3
3
|
import { Authorization } from "@opencode-ai/protocol/middleware/authorization";
|
|
4
4
|
export { Authorization } from "@opencode-ai/protocol/middleware/authorization";
|
|
5
5
|
import { hasPtyConnectTicketURL } from "@opencode-ai/protocol/groups/pty";
|
|
6
|
+
import { hasPersistentPtyConnectTicketURL } from "@opencode-ai/protocol/groups/persistent-pty";
|
|
6
7
|
import { Effect, Encoding, Layer, Redacted } from "effect";
|
|
7
8
|
import { HttpEffect, HttpServerRequest, HttpServerResponse } from "effect/unstable/http";
|
|
8
9
|
const AUTH_TOKEN_QUERY = "auth_token", WWW_AUTHENTICATE = 'Basic realm="Secure Area"';
|
|
@@ -37,8 +38,8 @@ export const authorizationLayer = Layer.effect(Authorization, Effect.gen(functio
|
|
|
37
38
|
if (!ServerAuth.required(config))
|
|
38
39
|
return Authorization.of((effect) => effect);
|
|
39
40
|
return Authorization.of((effect) => Effect.gen(function* () {
|
|
40
|
-
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
41
|
-
if (hasPtyConnectTicketURL(
|
|
41
|
+
const request = yield* HttpServerRequest.HttpServerRequest, url = new URL(request.url, "http://localhost");
|
|
42
|
+
if (hasPtyConnectTicketURL(url) || hasPersistentPtyConnectTicketURL(url))
|
|
42
43
|
return yield* effect;
|
|
43
44
|
if (yield* authorizedRequest(request, config))
|
|
44
45
|
return yield* effect;
|
|
@@ -6,12 +6,12 @@ import { Layer } from "effect";
|
|
|
6
6
|
import { HttpApiMiddleware } from "effect/unstable/httpapi";
|
|
7
7
|
declare const FormLocationMiddleware_base: HttpApiMiddleware.ServiceClass<FormLocationMiddleware, "@opencode/HttpApiFormLocation", {
|
|
8
8
|
requires: never;
|
|
9
|
-
provides: Location.Service | import("@opencode-ai/core/agent").Service | import("@opencode-ai/core/aisdk").Service | import("@opencode-ai/core/form").Service | import("@opencode-ai/core/integration").Service | import("@opencode-ai/core/catalog").Service | import("@opencode-ai/core/command").Service | import("@opencode-ai/core/config").Service | import("@opencode-ai/core/environment/environment").Service | import("@opencode-ai/core/file-mutation").Service | import("@opencode-ai/core/formatter").Service | import("@opencode-ai/core/filesystem/search").Service | import("@opencode-ai/core/filesystem").Service | import("@opencode-ai/core/model-resolver").Service | import("@opencode-ai/core/generate").Service | import("@opencode-ai/core/image").Service | import("@opencode-ai/core/plugin/supervisor-service").Service | import("@opencode-ai/core/mcp/index").Service | import("@opencode-ai/core/reference").Service | import("@opencode-ai/core/websearch").Service | import("@opencode-ai/core/plugin").Service | import("@opencode-ai/core/skill").Service | import("@opencode-ai/core/tool").Service | import("@opencode-ai/core/
|
|
9
|
+
provides: Location.Service | import("@opencode-ai/core/agent").Service | import("@opencode-ai/core/aisdk").Service | import("@opencode-ai/core/form").Service | import("@opencode-ai/core/integration").Service | import("@opencode-ai/core/catalog").Service | import("@opencode-ai/core/command").Service | import("@opencode-ai/core/config").Service | import("@opencode-ai/core/environment/environment").Service | import("@opencode-ai/core/file-mutation").Service | import("@opencode-ai/core/formatter").Service | import("@opencode-ai/core/filesystem/search").Service | import("@opencode-ai/core/filesystem").Service | import("@opencode-ai/core/model-resolver").Service | import("@opencode-ai/core/generate").Service | import("@opencode-ai/core/image").Service | import("@opencode-ai/core/plugin/supervisor-service").Service | import("@opencode-ai/core/mcp/index").Service | import("@opencode-ai/core/reference").Service | import("@opencode-ai/core/websearch").Service | import("@opencode-ai/core/plugin").Service | import("@opencode-ai/core/permission").Service | import("@opencode-ai/core/skill").Service | import("@opencode-ai/core/tool").Service | import("@opencode-ai/core/vcs").Service | import("@opencode-ai/core/location-mutation").Service | import("@opencode-ai/core/tool/read-filesystem").Service | import("@opencode-ai/core/session/instructions").Service | import("@opencode-ai/core/shell").Service | import("@opencode-ai/core/shell/select").Service | import("@opencode-ai/core/instruction-discovery").Service | import("@opencode-ai/core/session/compaction").Service | import("@opencode-ai/core/snapshot").Service | import("@opencode-ai/core/tool-output").Service | import("@opencode-ai/core/session/runner/model").Service | import("@opencode-ai/core/session/model-transport").Service | import("@opencode-ai/core/pty").Service | import("@opencode-ai/core/instructions/builtins").Service | import("@opencode-ai/core/skill/instructions").Service | import("@opencode-ai/core/reference/instructions").Service | import("@opencode-ai/core/session/instruction-entry").Service | import("@opencode-ai/core/session/generate").Service | import("@opencode-ai/core/tool/mcp").Service | import("@opencode-ai/core/session/title").Service | import("@opencode-ai/core/session/runner/index").Service | import("@opencode-ai/core/filesystem/location-watcher").Service;
|
|
10
10
|
error: readonly [typeof InvalidRequestError, typeof SessionNotFoundError];
|
|
11
11
|
clientError: never;
|
|
12
12
|
requiredForClient: false;
|
|
13
13
|
security: never;
|
|
14
|
-
}, HttpApiMiddleware.HttpApiMiddleware<Location.Service | import("@opencode-ai/core/agent").Service | import("@opencode-ai/core/aisdk").Service | import("@opencode-ai/core/form").Service | import("@opencode-ai/core/integration").Service | import("@opencode-ai/core/catalog").Service | import("@opencode-ai/core/command").Service | import("@opencode-ai/core/config").Service | import("@opencode-ai/core/environment/environment").Service | import("@opencode-ai/core/file-mutation").Service | import("@opencode-ai/core/formatter").Service | import("@opencode-ai/core/filesystem/search").Service | import("@opencode-ai/core/filesystem").Service | import("@opencode-ai/core/model-resolver").Service | import("@opencode-ai/core/generate").Service | import("@opencode-ai/core/image").Service | import("@opencode-ai/core/plugin/supervisor-service").Service | import("@opencode-ai/core/mcp/index").Service | import("@opencode-ai/core/reference").Service | import("@opencode-ai/core/websearch").Service | import("@opencode-ai/core/plugin").Service | import("@opencode-ai/core/skill").Service | import("@opencode-ai/core/tool").Service | import("@opencode-ai/core/
|
|
14
|
+
}, HttpApiMiddleware.HttpApiMiddleware<Location.Service | import("@opencode-ai/core/agent").Service | import("@opencode-ai/core/aisdk").Service | import("@opencode-ai/core/form").Service | import("@opencode-ai/core/integration").Service | import("@opencode-ai/core/catalog").Service | import("@opencode-ai/core/command").Service | import("@opencode-ai/core/config").Service | import("@opencode-ai/core/environment/environment").Service | import("@opencode-ai/core/file-mutation").Service | import("@opencode-ai/core/formatter").Service | import("@opencode-ai/core/filesystem/search").Service | import("@opencode-ai/core/filesystem").Service | import("@opencode-ai/core/model-resolver").Service | import("@opencode-ai/core/generate").Service | import("@opencode-ai/core/image").Service | import("@opencode-ai/core/plugin/supervisor-service").Service | import("@opencode-ai/core/mcp/index").Service | import("@opencode-ai/core/reference").Service | import("@opencode-ai/core/websearch").Service | import("@opencode-ai/core/plugin").Service | import("@opencode-ai/core/permission").Service | import("@opencode-ai/core/skill").Service | import("@opencode-ai/core/tool").Service | import("@opencode-ai/core/vcs").Service | import("@opencode-ai/core/location-mutation").Service | import("@opencode-ai/core/tool/read-filesystem").Service | import("@opencode-ai/core/session/instructions").Service | import("@opencode-ai/core/shell").Service | import("@opencode-ai/core/shell/select").Service | import("@opencode-ai/core/instruction-discovery").Service | import("@opencode-ai/core/session/compaction").Service | import("@opencode-ai/core/snapshot").Service | import("@opencode-ai/core/tool-output").Service | import("@opencode-ai/core/session/runner/model").Service | import("@opencode-ai/core/session/model-transport").Service | import("@opencode-ai/core/pty").Service | import("@opencode-ai/core/instructions/builtins").Service | import("@opencode-ai/core/skill/instructions").Service | import("@opencode-ai/core/reference/instructions").Service | import("@opencode-ai/core/session/instruction-entry").Service | import("@opencode-ai/core/session/generate").Service | import("@opencode-ai/core/tool/mcp").Service | import("@opencode-ai/core/session/title").Service | import("@opencode-ai/core/session/runner/index").Service | import("@opencode-ai/core/filesystem/location-watcher").Service, readonly [typeof InvalidRequestError, typeof SessionNotFoundError], never>>;
|
|
15
15
|
export declare class FormLocationMiddleware extends FormLocationMiddleware_base {
|
|
16
16
|
}
|
|
17
17
|
export declare const formLocationLayer: Layer.Layer<FormLocationMiddleware, never, Database.Service | LocationServiceMap.Service>;
|
|
@@ -6,12 +6,12 @@ import { HttpApiMiddleware } from "effect/unstable/httpapi";
|
|
|
6
6
|
import { InvalidRequestError, SessionNotFoundError } from "@opencode-ai/protocol/errors";
|
|
7
7
|
declare const SessionLocationMiddleware_base: HttpApiMiddleware.ServiceClass<SessionLocationMiddleware, "@opencode/HttpApiSessionLocation", {
|
|
8
8
|
requires: never;
|
|
9
|
-
provides: Location.Service | import("@opencode-ai/core/agent").Service | import("@opencode-ai/core/aisdk").Service | import("@opencode-ai/core/form").Service | import("@opencode-ai/core/integration").Service | import("@opencode-ai/core/catalog").Service | import("@opencode-ai/core/command").Service | import("@opencode-ai/core/config").Service | import("@opencode-ai/core/environment/environment").Service | import("@opencode-ai/core/file-mutation").Service | import("@opencode-ai/core/formatter").Service | import("@opencode-ai/core/filesystem/search").Service | import("@opencode-ai/core/filesystem").Service | import("@opencode-ai/core/model-resolver").Service | import("@opencode-ai/core/generate").Service | import("@opencode-ai/core/image").Service | import("@opencode-ai/core/plugin/supervisor-service").Service | import("@opencode-ai/core/mcp/index").Service | import("@opencode-ai/core/reference").Service | import("@opencode-ai/core/websearch").Service | import("@opencode-ai/core/plugin").Service | import("@opencode-ai/core/skill").Service | import("@opencode-ai/core/tool").Service | import("@opencode-ai/core/
|
|
9
|
+
provides: Location.Service | import("@opencode-ai/core/agent").Service | import("@opencode-ai/core/aisdk").Service | import("@opencode-ai/core/form").Service | import("@opencode-ai/core/integration").Service | import("@opencode-ai/core/catalog").Service | import("@opencode-ai/core/command").Service | import("@opencode-ai/core/config").Service | import("@opencode-ai/core/environment/environment").Service | import("@opencode-ai/core/file-mutation").Service | import("@opencode-ai/core/formatter").Service | import("@opencode-ai/core/filesystem/search").Service | import("@opencode-ai/core/filesystem").Service | import("@opencode-ai/core/model-resolver").Service | import("@opencode-ai/core/generate").Service | import("@opencode-ai/core/image").Service | import("@opencode-ai/core/plugin/supervisor-service").Service | import("@opencode-ai/core/mcp/index").Service | import("@opencode-ai/core/reference").Service | import("@opencode-ai/core/websearch").Service | import("@opencode-ai/core/plugin").Service | import("@opencode-ai/core/permission").Service | import("@opencode-ai/core/skill").Service | import("@opencode-ai/core/tool").Service | import("@opencode-ai/core/vcs").Service | import("@opencode-ai/core/location-mutation").Service | import("@opencode-ai/core/tool/read-filesystem").Service | import("@opencode-ai/core/session/instructions").Service | import("@opencode-ai/core/shell").Service | import("@opencode-ai/core/shell/select").Service | import("@opencode-ai/core/instruction-discovery").Service | import("@opencode-ai/core/session/compaction").Service | import("@opencode-ai/core/snapshot").Service | import("@opencode-ai/core/tool-output").Service | import("@opencode-ai/core/session/runner/model").Service | import("@opencode-ai/core/session/model-transport").Service | import("@opencode-ai/core/pty").Service | import("@opencode-ai/core/instructions/builtins").Service | import("@opencode-ai/core/skill/instructions").Service | import("@opencode-ai/core/reference/instructions").Service | import("@opencode-ai/core/session/instruction-entry").Service | import("@opencode-ai/core/session/generate").Service | import("@opencode-ai/core/tool/mcp").Service | import("@opencode-ai/core/session/title").Service | import("@opencode-ai/core/session/runner/index").Service | import("@opencode-ai/core/filesystem/location-watcher").Service;
|
|
10
10
|
error: readonly [typeof InvalidRequestError, typeof SessionNotFoundError];
|
|
11
11
|
clientError: never;
|
|
12
12
|
requiredForClient: false;
|
|
13
13
|
security: never;
|
|
14
|
-
}, HttpApiMiddleware.HttpApiMiddleware<Location.Service | import("@opencode-ai/core/agent").Service | import("@opencode-ai/core/aisdk").Service | import("@opencode-ai/core/form").Service | import("@opencode-ai/core/integration").Service | import("@opencode-ai/core/catalog").Service | import("@opencode-ai/core/command").Service | import("@opencode-ai/core/config").Service | import("@opencode-ai/core/environment/environment").Service | import("@opencode-ai/core/file-mutation").Service | import("@opencode-ai/core/formatter").Service | import("@opencode-ai/core/filesystem/search").Service | import("@opencode-ai/core/filesystem").Service | import("@opencode-ai/core/model-resolver").Service | import("@opencode-ai/core/generate").Service | import("@opencode-ai/core/image").Service | import("@opencode-ai/core/plugin/supervisor-service").Service | import("@opencode-ai/core/mcp/index").Service | import("@opencode-ai/core/reference").Service | import("@opencode-ai/core/websearch").Service | import("@opencode-ai/core/plugin").Service | import("@opencode-ai/core/skill").Service | import("@opencode-ai/core/tool").Service | import("@opencode-ai/core/
|
|
14
|
+
}, HttpApiMiddleware.HttpApiMiddleware<Location.Service | import("@opencode-ai/core/agent").Service | import("@opencode-ai/core/aisdk").Service | import("@opencode-ai/core/form").Service | import("@opencode-ai/core/integration").Service | import("@opencode-ai/core/catalog").Service | import("@opencode-ai/core/command").Service | import("@opencode-ai/core/config").Service | import("@opencode-ai/core/environment/environment").Service | import("@opencode-ai/core/file-mutation").Service | import("@opencode-ai/core/formatter").Service | import("@opencode-ai/core/filesystem/search").Service | import("@opencode-ai/core/filesystem").Service | import("@opencode-ai/core/model-resolver").Service | import("@opencode-ai/core/generate").Service | import("@opencode-ai/core/image").Service | import("@opencode-ai/core/plugin/supervisor-service").Service | import("@opencode-ai/core/mcp/index").Service | import("@opencode-ai/core/reference").Service | import("@opencode-ai/core/websearch").Service | import("@opencode-ai/core/plugin").Service | import("@opencode-ai/core/permission").Service | import("@opencode-ai/core/skill").Service | import("@opencode-ai/core/tool").Service | import("@opencode-ai/core/vcs").Service | import("@opencode-ai/core/location-mutation").Service | import("@opencode-ai/core/tool/read-filesystem").Service | import("@opencode-ai/core/session/instructions").Service | import("@opencode-ai/core/shell").Service | import("@opencode-ai/core/shell/select").Service | import("@opencode-ai/core/instruction-discovery").Service | import("@opencode-ai/core/session/compaction").Service | import("@opencode-ai/core/snapshot").Service | import("@opencode-ai/core/tool-output").Service | import("@opencode-ai/core/session/runner/model").Service | import("@opencode-ai/core/session/model-transport").Service | import("@opencode-ai/core/pty").Service | import("@opencode-ai/core/instructions/builtins").Service | import("@opencode-ai/core/skill/instructions").Service | import("@opencode-ai/core/reference/instructions").Service | import("@opencode-ai/core/session/instruction-entry").Service | import("@opencode-ai/core/session/generate").Service | import("@opencode-ai/core/tool/mcp").Service | import("@opencode-ai/core/session/title").Service | import("@opencode-ai/core/session/runner/index").Service | import("@opencode-ai/core/filesystem/location-watcher").Service, readonly [typeof InvalidRequestError, typeof SessionNotFoundError], never>>;
|
|
15
15
|
export declare class SessionLocationMiddleware extends SessionLocationMiddleware_base {
|
|
16
16
|
}
|
|
17
17
|
export declare const sessionLocationLayer: Layer.Layer<SessionLocationMiddleware, never, Database.Service | LocationServiceMap.Service>;
|
package/dist/process.js
CHANGED
|
@@ -2,6 +2,7 @@ export * as ServerProcess from "./process";
|
|
|
2
2
|
import { NodeHttpServer } from "@effect/platform-node";
|
|
3
3
|
import { SessionRestart } from "@opencode-ai/core/session/execution/restart";
|
|
4
4
|
import { hasPtyConnectTicketURL } from "@opencode-ai/protocol/groups/pty";
|
|
5
|
+
import { hasPersistentPtyConnectTicketURL } from "@opencode-ai/protocol/groups/persistent-pty";
|
|
5
6
|
import { Cause, Context, Effect, Exit, Latch, Layer, Option, Ref, Scope } from "effect";
|
|
6
7
|
import {
|
|
7
8
|
HttpMiddleware,
|
|
@@ -88,7 +89,7 @@ function dispatch(password, status, application, version) {
|
|
|
88
89
|
return yield* healthResponse(status, version);
|
|
89
90
|
}
|
|
90
91
|
const state = yield* status.current, app = yield* Ref.get(application), ready = state.type === "ready" && Option.isSome(app);
|
|
91
|
-
if ((!ready || !hasPtyConnectTicketURL(url)) && !(yield* authorizedRequest(request, auth)))
|
|
92
|
+
if ((!ready || !hasPtyConnectTicketURL(url) && !hasPersistentPtyConnectTicketURL(url)) && !(yield* authorizedRequest(request, auth)))
|
|
92
93
|
return unauthorized();
|
|
93
94
|
if (ready)
|
|
94
95
|
return yield* app.value;
|
package/dist/routes.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { Bus } from "@opencode-ai/core/bus";
|
|
|
4
4
|
import { Credential } from "@opencode-ai/core/credential";
|
|
5
5
|
import { PermissionSaved } from "@opencode-ai/core/permission/saved";
|
|
6
6
|
import { PtyTicket } from "@opencode-ai/core/pty/ticket";
|
|
7
|
+
import { PersistentPty } from "@opencode-ai/core/persistent-pty";
|
|
7
8
|
import { Project } from "@opencode-ai/core/project";
|
|
8
9
|
import { Session } from "@opencode-ai/core/session";
|
|
9
10
|
import { SessionTransfer } from "@opencode-ai/core/session/transfer";
|
|
@@ -20,5 +21,5 @@ import { HttpRouter } from "effect/unstable/http";
|
|
|
20
21
|
import { Layer } from "effect";
|
|
21
22
|
import { PtyEnvironment } from "./pty-environment";
|
|
22
23
|
import type { ServerOptions } from "./options";
|
|
23
|
-
export declare function createRoutes(options?: ServerOptions, serviceURLs?: () => ReadonlyArray<string>, overrides?: LayerNode.Replacements): Layer.Layer<Global.Service | Database.Service | Bus.Service | import("effect/unstable/http/HttpClient").HttpClient | Project.Service | Credential.Service | WellKnown.Service | Workspace.Service | Job.Service | LocationServiceMap.Service |
|
|
24
|
-
export declare function createEmbeddedRoutes(options?: ServerOptions, overrides?: LayerNode.Replacements): Layer.Layer<Global.Service | Database.Service | Bus.Service | import("effect/unstable/http/HttpClient").HttpClient | Project.Service | Credential.Service | WellKnown.Service | Workspace.Service | Job.Service | LocationServiceMap.Service |
|
|
24
|
+
export declare function createRoutes(options?: ServerOptions, serviceURLs?: () => ReadonlyArray<string>, overrides?: LayerNode.Replacements): Layer.Layer<Global.Service | Database.Service | Bus.Service | import("effect/unstable/http/HttpClient").HttpClient | Project.Service | Credential.Service | WellKnown.Service | Workspace.Service | Job.Service | LocationServiceMap.Service | PermissionSaved.Service | SdkPlugins.Service | Worktree.Service | Session.Service | SessionRestart.Service | PtyTicket.Service | PersistentPty.Service | SessionTransfer.Service | LocationActivity.Service | PtyEnvironment.Service | HttpRouter.HttpRouter, Error, import("effect/FileSystem").FileSystem | import("effect/Path").Path | import("effect/unstable/http/Etag").Generator | import("effect/unstable/http/HttpPlatform").HttpPlatform>;
|
|
25
|
+
export declare function createEmbeddedRoutes(options?: ServerOptions, overrides?: LayerNode.Replacements): Layer.Layer<Global.Service | Database.Service | Bus.Service | import("effect/unstable/http/HttpClient").HttpClient | Project.Service | Credential.Service | WellKnown.Service | Workspace.Service | Job.Service | LocationServiceMap.Service | PermissionSaved.Service | SdkPlugins.Service | Worktree.Service | Session.Service | SessionRestart.Service | PtyTicket.Service | PersistentPty.Service | SessionTransfer.Service | LocationActivity.Service | PtyEnvironment.Service | HttpRouter.HttpRouter, Error, import("effect/FileSystem").FileSystem | import("effect/Path").Path | import("effect/unstable/http/Etag").Generator | import("effect/unstable/http/HttpPlatform").HttpPlatform>;
|
package/dist/routes.js
CHANGED
|
@@ -11,6 +11,7 @@ import { Credential } from "@opencode-ai/core/credential";
|
|
|
11
11
|
import { Config } from "@opencode-ai/core/config";
|
|
12
12
|
import { PermissionSaved } from "@opencode-ai/core/permission/saved";
|
|
13
13
|
import { PtyTicket } from "@opencode-ai/core/pty/ticket";
|
|
14
|
+
import { PersistentPty } from "@opencode-ai/core/persistent-pty";
|
|
14
15
|
import { Project } from "@opencode-ai/core/project";
|
|
15
16
|
import { Session } from "@opencode-ai/core/session";
|
|
16
17
|
import { SessionTransfer } from "@opencode-ai/core/session/transfer";
|
|
@@ -57,6 +58,7 @@ const applicationServiceNodes = [
|
|
|
57
58
|
SdkPlugins.node,
|
|
58
59
|
PermissionSaved.node,
|
|
59
60
|
PtyTicket.node,
|
|
61
|
+
PersistentPty.node,
|
|
60
62
|
Credential.node,
|
|
61
63
|
WellKnown.node,
|
|
62
64
|
PtyEnvironment.node,
|
package/dist/workerd.js
CHANGED
|
@@ -37,7 +37,10 @@ export function replacements(options) {
|
|
|
37
37
|
];
|
|
38
38
|
}
|
|
39
39
|
const unavailable = (what) => Effect.die(Error(`${what} is unavailable in the workerd profile`)), vcsLayer = Layer.succeed(Vcs.Service, Vcs.Service.of({
|
|
40
|
+
transform: () => Effect.succeed({ dispose: Effect.void }),
|
|
41
|
+
reload: () => Effect.void,
|
|
40
42
|
info: () => Effect.succeed({ branch: {} }),
|
|
43
|
+
branches: () => Effect.succeed([]),
|
|
41
44
|
status: () => Effect.succeed([]),
|
|
42
45
|
diff: () => Effect.succeed([])
|
|
43
46
|
})), fileSystemLayer = Layer.succeed(FileSystem.Service, FileSystem.Service.of({
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "@opencode-ai/server",
|
|
4
|
-
"version": "0.0.0-beta-
|
|
4
|
+
"version": "0.0.0-beta-18230",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -29,11 +29,12 @@
|
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@effect/platform-node": "4.0.0-rc.111",
|
|
32
|
-
"@
|
|
33
|
-
"@opencode-ai/
|
|
34
|
-
"@opencode-ai/
|
|
35
|
-
"@opencode-ai/
|
|
36
|
-
"@opencode-ai/
|
|
32
|
+
"@effect/platform-node-shared": "4.0.0-rc.111",
|
|
33
|
+
"@opencode-ai/core": "0.0.0-beta-18230",
|
|
34
|
+
"@opencode-ai/protocol": "0.0.0-beta-18230",
|
|
35
|
+
"@opencode-ai/schema": "0.0.0-beta-18230",
|
|
36
|
+
"@opencode-ai/simulation": "0.0.0-beta-18230",
|
|
37
|
+
"@opencode-ai/util": "0.0.0-beta-18230",
|
|
37
38
|
"drizzle-orm": "1.0.0-rc.5-169397b",
|
|
38
39
|
"effect": "4.0.0-rc.111"
|
|
39
40
|
},
|