@opencode/protocol 0.0.0-reserved → 2.0.1
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 +56 -0
- package/dist/api.js +79 -0
- package/dist/client.d.ts +64 -0
- package/dist/client.js +50 -0
- package/dist/errors.d.ts +153 -0
- package/dist/errors.js +122 -0
- package/dist/groups/agent.d.ts +194 -0
- package/dist/groups/agent.js +30 -0
- package/dist/groups/command.d.ts +15 -0
- package/dist/groups/command.js +20 -0
- package/dist/groups/config.d.ts +9 -0
- package/dist/groups/config.js +16 -0
- package/dist/groups/credential.d.ts +32 -0
- package/dist/groups/credential.js +40 -0
- package/dist/groups/debug.d.ts +17 -0
- package/dist/groups/debug.js +23 -0
- package/dist/groups/event.d.ts +14643 -0
- package/dist/groups/event.js +51 -0
- package/dist/groups/form.d.ts +781 -0
- package/dist/groups/form.js +95 -0
- package/dist/groups/fs.d.ts +35 -0
- package/dist/groups/fs.js +53 -0
- package/dist/groups/generate.d.ts +33 -0
- package/dist/groups/generate.js +23 -0
- package/dist/groups/health.d.ts +15 -0
- package/dist/groups/health.js +20 -0
- package/dist/groups/integration.d.ts +1154 -0
- package/dist/groups/integration.js +149 -0
- package/dist/groups/location.d.ts +16 -0
- package/dist/groups/location.js +34 -0
- package/dist/groups/mcp.d.ts +82 -0
- package/dist/groups/mcp.js +78 -0
- package/dist/groups/message.d.ts +734 -0
- package/dist/groups/message.js +51 -0
- package/dist/groups/migration.d.ts +28 -0
- package/dist/groups/migration.js +21 -0
- package/dist/groups/model.d.ts +314 -0
- package/dist/groups/model.js +33 -0
- package/dist/groups/permission.d.ts +167 -0
- package/dist/groups/permission.js +109 -0
- package/dist/groups/persistent-pty.d.ts +249 -0
- package/dist/groups/persistent-pty.js +91 -0
- package/dist/groups/plugin.d.ts +91 -0
- package/dist/groups/plugin.js +55 -0
- package/dist/groups/project.d.ts +90 -0
- package/dist/groups/project.js +39 -0
- package/dist/groups/provider.d.ts +156 -0
- package/dist/groups/provider.js +34 -0
- package/dist/groups/pty.d.ts +147 -0
- package/dist/groups/pty.js +113 -0
- package/dist/groups/reference.d.ts +29 -0
- package/dist/groups/reference.js +20 -0
- package/dist/groups/rpc.d.ts +22 -0
- package/dist/groups/rpc.js +24 -0
- package/dist/groups/server.d.ts +5 -0
- package/dist/groups/server.js +11 -0
- package/dist/groups/session.d.ts +10794 -0
- package/dist/groups/session.js +549 -0
- package/dist/groups/shell.d.ts +152 -0
- package/dist/groups/shell.js +82 -0
- package/dist/groups/skill.d.ts +20 -0
- package/dist/groups/skill.js +20 -0
- package/dist/groups/vcs.d.ts +70 -0
- package/dist/groups/vcs.js +76 -0
- package/dist/groups/websearch.d.ts +28 -0
- package/dist/groups/websearch.js +34 -0
- package/dist/groups/workspace.d.ts +22 -0
- package/dist/groups/workspace.js +27 -0
- package/dist/groups/worktree.d.ts +47 -0
- package/dist/groups/worktree.js +61 -0
- package/dist/middleware/authorization.d.ts +13 -0
- package/dist/middleware/authorization.js +6 -0
- package/dist/middleware/schema-error.d.ts +13 -0
- package/dist/middleware/schema-error.js +4 -0
- package/dist/simulation.d.ts +1801 -0
- package/dist/simulation.js +487 -0
- package/package.json +36 -6
- package/README.md +0 -5
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { Form } from "@opencode/schema/form";
|
|
2
|
+
import { Location } from "@opencode/schema/location";
|
|
3
|
+
import { Context, Schema } from "effect";
|
|
4
|
+
import { HttpApiEndpoint, HttpApiGroup, HttpApiMiddleware, HttpApiSchema, OpenApi } from "effect/unstable/httpapi";
|
|
5
|
+
import { ConflictError, FormAlreadySettledError, FormInvalidAnswerError, FormNotFoundError, InvalidRequestError, SessionNotFoundError, } from "../errors.js";
|
|
6
|
+
import { LocationQuery, locationQueryOpenApi } from "./location.js";
|
|
7
|
+
const CreatePayload = Schema.Struct({
|
|
8
|
+
id: Form.ID.pipe(Schema.optional),
|
|
9
|
+
title: Form.Info.fields.title,
|
|
10
|
+
metadata: Form.Info.fields.metadata,
|
|
11
|
+
fields: Form.Info.fields.fields,
|
|
12
|
+
}).annotate({ identifier: "Form.CreatePayload" });
|
|
13
|
+
// Form routes intentionally look session-scoped, but use a form-specific middleware instead of
|
|
14
|
+
// SessionLocationMiddleware. The middleware treats real session IDs normally and has an
|
|
15
|
+
// undocumented `global` sentinel branch for MCP elicitation forms that are still Location-scoped
|
|
16
|
+
// but not session-owned. This is temporary and should disappear once elicitations are attributable.
|
|
17
|
+
export const makeFormGroup = (locationMiddleware, formLocationMiddleware) => HttpApiGroup.make("server.form")
|
|
18
|
+
.add(HttpApiEndpoint.get("form.request.list", "/api/form/request", {
|
|
19
|
+
query: LocationQuery,
|
|
20
|
+
success: Location.response(Schema.Array(Form.Info)),
|
|
21
|
+
})
|
|
22
|
+
.annotateMerge(locationQueryOpenApi)
|
|
23
|
+
.annotateMerge(OpenApi.annotations({
|
|
24
|
+
identifier: "v2.form.request.list",
|
|
25
|
+
summary: "List pending form requests",
|
|
26
|
+
description: "Retrieve pending forms for a location.",
|
|
27
|
+
})))
|
|
28
|
+
.middleware(locationMiddleware)
|
|
29
|
+
.add(HttpApiEndpoint.get("session.form.list", "/api/session/:sessionID/form", {
|
|
30
|
+
params: { sessionID: Schema.String },
|
|
31
|
+
success: Schema.Struct({ data: Schema.Array(Form.Info) }),
|
|
32
|
+
error: SessionNotFoundError,
|
|
33
|
+
}).annotateMerge(OpenApi.annotations({
|
|
34
|
+
identifier: "v2.session.form.list",
|
|
35
|
+
summary: "List session forms",
|
|
36
|
+
description: "Retrieve pending forms for a session.",
|
|
37
|
+
})))
|
|
38
|
+
.add(HttpApiEndpoint.post("session.form.create", "/api/session/:sessionID/form", {
|
|
39
|
+
params: { sessionID: Schema.String },
|
|
40
|
+
payload: CreatePayload,
|
|
41
|
+
success: Schema.Struct({ data: Form.Info }),
|
|
42
|
+
error: [SessionNotFoundError, ConflictError, InvalidRequestError],
|
|
43
|
+
})
|
|
44
|
+
.middleware(formLocationMiddleware)
|
|
45
|
+
.annotateMerge(OpenApi.annotations({
|
|
46
|
+
identifier: "v2.session.form.create",
|
|
47
|
+
summary: "Create session form",
|
|
48
|
+
description: "Create a form for a session.",
|
|
49
|
+
})))
|
|
50
|
+
.add(HttpApiEndpoint.get("session.form.get", "/api/session/:sessionID/form/:formID", {
|
|
51
|
+
params: { sessionID: Schema.String, formID: Form.ID },
|
|
52
|
+
success: Schema.Struct({ data: Form.Info }),
|
|
53
|
+
error: [SessionNotFoundError, FormNotFoundError],
|
|
54
|
+
})
|
|
55
|
+
.middleware(formLocationMiddleware)
|
|
56
|
+
.annotateMerge(OpenApi.annotations({
|
|
57
|
+
identifier: "v2.session.form.get",
|
|
58
|
+
summary: "Get session form",
|
|
59
|
+
description: "Retrieve a form for a session.",
|
|
60
|
+
})))
|
|
61
|
+
.add(HttpApiEndpoint.get("session.form.state", "/api/session/:sessionID/form/:formID/state", {
|
|
62
|
+
params: { sessionID: Schema.String, formID: Form.ID },
|
|
63
|
+
success: Schema.Struct({ data: Form.State }),
|
|
64
|
+
error: [SessionNotFoundError, FormNotFoundError],
|
|
65
|
+
})
|
|
66
|
+
.middleware(formLocationMiddleware)
|
|
67
|
+
.annotateMerge(OpenApi.annotations({
|
|
68
|
+
identifier: "v2.session.form.state",
|
|
69
|
+
summary: "Get form state",
|
|
70
|
+
description: "Retrieve the current state for a form.",
|
|
71
|
+
})))
|
|
72
|
+
.add(HttpApiEndpoint.post("session.form.reply", "/api/session/:sessionID/form/:formID/reply", {
|
|
73
|
+
params: { sessionID: Schema.String, formID: Form.ID },
|
|
74
|
+
payload: Form.Reply,
|
|
75
|
+
success: HttpApiSchema.NoContent,
|
|
76
|
+
error: [SessionNotFoundError, FormAlreadySettledError, FormInvalidAnswerError, FormNotFoundError],
|
|
77
|
+
})
|
|
78
|
+
.middleware(formLocationMiddleware)
|
|
79
|
+
.annotateMerge(OpenApi.annotations({
|
|
80
|
+
identifier: "v2.session.form.reply",
|
|
81
|
+
summary: "Reply to form",
|
|
82
|
+
description: "Submit an answer to a pending form.",
|
|
83
|
+
})))
|
|
84
|
+
.add(HttpApiEndpoint.post("session.form.cancel", "/api/session/:sessionID/form/:formID/cancel", {
|
|
85
|
+
params: { sessionID: Schema.String, formID: Form.ID },
|
|
86
|
+
success: HttpApiSchema.NoContent,
|
|
87
|
+
error: [SessionNotFoundError, FormAlreadySettledError, FormNotFoundError],
|
|
88
|
+
})
|
|
89
|
+
.middleware(formLocationMiddleware)
|
|
90
|
+
.annotateMerge(OpenApi.annotations({
|
|
91
|
+
identifier: "v2.session.form.cancel",
|
|
92
|
+
summary: "Cancel form",
|
|
93
|
+
description: "Cancel a pending form.",
|
|
94
|
+
})))
|
|
95
|
+
.annotateMerge(OpenApi.annotations({ title: "form", description: "Session form routes." }));
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Location } from "@opencode/schema/location";
|
|
2
|
+
import { Schema } from "effect";
|
|
3
|
+
import { HttpApiEndpoint, HttpApiGroup } from "effect/unstable/httpapi";
|
|
4
|
+
export declare const FileSystemGroup: HttpApiGroup.HttpApiGroup<"server.fs", HttpApiEndpoint.HttpApiEndpoint<"fs.read", "GET", "/api/fs/read/*", never, Schema.toCodecStringTree<Schema.Struct<{
|
|
5
|
+
readonly location: Schema.optional<Schema.Struct<{
|
|
6
|
+
readonly directory: Schema.optional<Schema.String>;
|
|
7
|
+
readonly workspace: Schema.optional<Schema.String>;
|
|
8
|
+
}>>;
|
|
9
|
+
}>>, never, never, Schema.toCodecJson<Schema.Uint8Array>, never, never, never> | HttpApiEndpoint.HttpApiEndpoint<"fs.list", "GET", "/api/fs/list", never, Schema.toCodecStringTree<Schema.Struct<{
|
|
10
|
+
readonly path: Schema.optional<Schema.String>;
|
|
11
|
+
readonly location: Schema.optional<Schema.Struct<{
|
|
12
|
+
readonly directory: Schema.optional<Schema.String>;
|
|
13
|
+
readonly workspace: Schema.optional<Schema.String>;
|
|
14
|
+
}>>;
|
|
15
|
+
}>>, never, never, Schema.toCodecJson<Schema.Struct<{
|
|
16
|
+
readonly location: typeof Location.Info;
|
|
17
|
+
readonly data: Schema.$Array<Schema.Struct<{
|
|
18
|
+
readonly path: Schema.brand<Schema.String, "RelativePath">;
|
|
19
|
+
readonly type: Schema.Literals<readonly ["file", "directory"]>;
|
|
20
|
+
}>>;
|
|
21
|
+
}>>, never, never, never> | HttpApiEndpoint.HttpApiEndpoint<"fs.find", "GET", "/api/fs/find", never, Schema.toCodecStringTree<Schema.Struct<{
|
|
22
|
+
readonly query: Schema.String;
|
|
23
|
+
readonly type: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Literals<readonly ["file", "directory"]>>>, Schema.optionalKey<Schema.Literals<readonly ["file", "directory"]>>, never, never>;
|
|
24
|
+
readonly limit: Schema.optional<Schema.compose<Schema.Int, Schema.NumberFromString>>;
|
|
25
|
+
readonly location: Schema.optional<Schema.Struct<{
|
|
26
|
+
readonly directory: Schema.optional<Schema.String>;
|
|
27
|
+
readonly workspace: Schema.optional<Schema.String>;
|
|
28
|
+
}>>;
|
|
29
|
+
}>>, never, never, Schema.toCodecJson<Schema.Struct<{
|
|
30
|
+
readonly location: typeof Location.Info;
|
|
31
|
+
readonly data: Schema.$Array<Schema.Struct<{
|
|
32
|
+
readonly path: Schema.brand<Schema.String, "RelativePath">;
|
|
33
|
+
readonly type: Schema.Literals<readonly ["file", "directory"]>;
|
|
34
|
+
}>>;
|
|
35
|
+
}>>, never, never, never>, false>;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { FileSystem } from "@opencode/schema/filesystem";
|
|
2
|
+
import { Location } from "@opencode/schema/location";
|
|
3
|
+
import { PositiveInt } from "@opencode/schema/schema";
|
|
4
|
+
import { Schema } from "effect";
|
|
5
|
+
import { HttpApiEndpoint, HttpApiGroup, HttpApiSchema, OpenApi } from "effect/unstable/httpapi";
|
|
6
|
+
import { LocationQuery, locationQueryOpenApi } from "./location.js";
|
|
7
|
+
const ListQuery = Schema.Struct({
|
|
8
|
+
...LocationQuery.fields,
|
|
9
|
+
path: Schema.String.pipe(Schema.optional).annotate({
|
|
10
|
+
description: "An absolute path or a path relative to the requested location. Defaults to the location directory.",
|
|
11
|
+
}),
|
|
12
|
+
});
|
|
13
|
+
const FindQuery = Schema.Struct({
|
|
14
|
+
...LocationQuery.fields,
|
|
15
|
+
query: FileSystem.FindInput.fields.query,
|
|
16
|
+
type: FileSystem.FindInput.fields.type,
|
|
17
|
+
limit: Schema.NumberFromString.pipe(Schema.decodeTo(PositiveInt), Schema.optional),
|
|
18
|
+
});
|
|
19
|
+
export const FileSystemGroup = HttpApiGroup.make("server.fs")
|
|
20
|
+
.add(HttpApiEndpoint.get("fs.read", "/api/fs/read/*", {
|
|
21
|
+
query: LocationQuery,
|
|
22
|
+
success: Schema.Uint8Array.pipe(HttpApiSchema.asUint8Array()),
|
|
23
|
+
})
|
|
24
|
+
.annotateMerge(locationQueryOpenApi)
|
|
25
|
+
.annotateMerge(OpenApi.annotations({
|
|
26
|
+
identifier: "v2.fs.read",
|
|
27
|
+
summary: "Read file",
|
|
28
|
+
description: "Serve one file relative to the requested location.",
|
|
29
|
+
})))
|
|
30
|
+
.add(HttpApiEndpoint.get("fs.list", "/api/fs/list", {
|
|
31
|
+
query: ListQuery,
|
|
32
|
+
success: Location.response(Schema.Array(FileSystem.Entry)),
|
|
33
|
+
})
|
|
34
|
+
.annotateMerge(locationQueryOpenApi)
|
|
35
|
+
.annotateMerge(OpenApi.annotations({
|
|
36
|
+
identifier: "v2.fs.list",
|
|
37
|
+
summary: "List directory",
|
|
38
|
+
description: "List direct children using an absolute path or a path relative to the requested location, including parents and siblings outside its directory. Entry paths remain relative to the requested location; listing does not switch locations.",
|
|
39
|
+
})))
|
|
40
|
+
.add(HttpApiEndpoint.get("fs.find", "/api/fs/find", {
|
|
41
|
+
query: FindQuery,
|
|
42
|
+
success: Location.response(Schema.Array(FileSystem.Entry)),
|
|
43
|
+
})
|
|
44
|
+
.annotateMerge(locationQueryOpenApi)
|
|
45
|
+
.annotateMerge(OpenApi.annotations({
|
|
46
|
+
identifier: "v2.fs.find",
|
|
47
|
+
summary: "Find files",
|
|
48
|
+
description: "Find recursively ranked filesystem entries relative to the requested location.",
|
|
49
|
+
})))
|
|
50
|
+
.annotateMerge(OpenApi.annotations({
|
|
51
|
+
title: "filesystem",
|
|
52
|
+
description: "Experimental location-scoped filesystem routes.",
|
|
53
|
+
}));
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
import { HttpApiEndpoint, HttpApiGroup } from "effect/unstable/httpapi";
|
|
3
|
+
import { InvalidRequestError, ServiceUnavailableError } from "../errors.js";
|
|
4
|
+
export declare const GenerateGroup: HttpApiGroup.HttpApiGroup<"server.generate", HttpApiEndpoint.HttpApiEndpoint<"generate.text", "POST", "/api/generate", never, never, Schema.toCodecJson<Schema.Struct<{
|
|
5
|
+
readonly prompt: Schema.String;
|
|
6
|
+
readonly model: Schema.optional<Schema.Struct<{
|
|
7
|
+
readonly id: Schema.brand<Schema.String, "Model.ID">;
|
|
8
|
+
readonly providerID: Schema.brand<Schema.String, "Provider.ID"> & {
|
|
9
|
+
opencode: string & import("effect/Brand").Brand<"Provider.ID">;
|
|
10
|
+
anthropic: string & import("effect/Brand").Brand<"Provider.ID">;
|
|
11
|
+
openai: string & import("effect/Brand").Brand<"Provider.ID">;
|
|
12
|
+
google: string & import("effect/Brand").Brand<"Provider.ID">;
|
|
13
|
+
googleVertex: string & import("effect/Brand").Brand<"Provider.ID">;
|
|
14
|
+
githubCopilot: string & import("effect/Brand").Brand<"Provider.ID">;
|
|
15
|
+
amazonBedrock: string & import("effect/Brand").Brand<"Provider.ID">;
|
|
16
|
+
azure: string & import("effect/Brand").Brand<"Provider.ID">;
|
|
17
|
+
openrouter: string & import("effect/Brand").Brand<"Provider.ID">;
|
|
18
|
+
mistral: string & import("effect/Brand").Brand<"Provider.ID">;
|
|
19
|
+
gitlab: string & import("effect/Brand").Brand<"Provider.ID">;
|
|
20
|
+
};
|
|
21
|
+
readonly variant: Schema.decodeTo<Schema.optional<Schema.toType<Schema.brand<Schema.String, "Model.VariantID">>>, Schema.optionalKey<Schema.brand<Schema.String, "Model.VariantID">>, never, never>;
|
|
22
|
+
}> & {
|
|
23
|
+
parse: (input: string) => {
|
|
24
|
+
readonly id: string & import("effect/Brand").Brand<"Model.ID">;
|
|
25
|
+
readonly providerID: string & import("effect/Brand").Brand<"Provider.ID">;
|
|
26
|
+
readonly variant?: (string & import("effect/Brand").Brand<"Model.VariantID">) | undefined;
|
|
27
|
+
};
|
|
28
|
+
}>;
|
|
29
|
+
}>>, never, Schema.toCodecJson<Schema.Struct<{
|
|
30
|
+
readonly data: Schema.Struct<{
|
|
31
|
+
readonly text: Schema.String;
|
|
32
|
+
}>;
|
|
33
|
+
}>>, Schema.toCodecJson<typeof InvalidRequestError | typeof ServiceUnavailableError>, never, never>, false>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Model } from "@opencode/schema/model";
|
|
2
|
+
import { Schema } from "effect";
|
|
3
|
+
import { HttpApiEndpoint, HttpApiGroup, OpenApi } from "effect/unstable/httpapi";
|
|
4
|
+
import { InvalidRequestError, ServiceUnavailableError } from "../errors.js";
|
|
5
|
+
export const GenerateGroup = HttpApiGroup.make("server.generate")
|
|
6
|
+
.add(HttpApiEndpoint.post("generate.text", "/api/generate", {
|
|
7
|
+
payload: Schema.Struct({
|
|
8
|
+
prompt: Schema.String,
|
|
9
|
+
model: Model.Ref.pipe(Schema.optional),
|
|
10
|
+
}),
|
|
11
|
+
success: Schema.Struct({
|
|
12
|
+
data: Schema.Struct({ text: Schema.String }),
|
|
13
|
+
}).annotate({ identifier: "GenerateTextResponse" }),
|
|
14
|
+
error: [InvalidRequestError, ServiceUnavailableError],
|
|
15
|
+
}).annotateMerge(OpenApi.annotations({
|
|
16
|
+
identifier: "v2.generate.text",
|
|
17
|
+
summary: "Generate text",
|
|
18
|
+
description: "Run one stateless model generation using the server's base configuration and return the assistant text. Uses the base configuration's default model when none is specified.",
|
|
19
|
+
})))
|
|
20
|
+
.annotateMerge(OpenApi.annotations({
|
|
21
|
+
title: "generate",
|
|
22
|
+
description: "Experimental one-shot generation routes.",
|
|
23
|
+
}));
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
import { HttpApiEndpoint, HttpApiGroup } from "effect/unstable/httpapi";
|
|
3
|
+
export declare namespace ServiceStatus {
|
|
4
|
+
const Health: Schema.Struct<{
|
|
5
|
+
readonly healthy: Schema.Literal<true>;
|
|
6
|
+
readonly version: Schema.String;
|
|
7
|
+
readonly pid: Schema.Int;
|
|
8
|
+
}>;
|
|
9
|
+
type Health = typeof Health.Type;
|
|
10
|
+
}
|
|
11
|
+
export declare const HealthGroup: HttpApiGroup.HttpApiGroup<"server.health", HttpApiEndpoint.HttpApiEndpoint<"health.get", "GET", "/api/health", never, never, never, never, Schema.toCodecJson<Schema.Struct<{
|
|
12
|
+
readonly healthy: Schema.Literal<true>;
|
|
13
|
+
readonly version: Schema.String;
|
|
14
|
+
readonly pid: Schema.Int;
|
|
15
|
+
}>>, never, never, never>, false>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
import { HttpApiEndpoint, HttpApiGroup, OpenApi } from "effect/unstable/httpapi";
|
|
3
|
+
export var ServiceStatus;
|
|
4
|
+
(function (ServiceStatus) {
|
|
5
|
+
ServiceStatus.Health = Schema.Struct({
|
|
6
|
+
healthy: Schema.Literal(true),
|
|
7
|
+
version: Schema.String,
|
|
8
|
+
// 0 means the runtime has no OS process identity (e.g. workerd).
|
|
9
|
+
pid: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),
|
|
10
|
+
}).annotate({ identifier: "ServiceHealth" });
|
|
11
|
+
})(ServiceStatus || (ServiceStatus = {}));
|
|
12
|
+
export const HealthGroup = HttpApiGroup.make("server.health")
|
|
13
|
+
.add(HttpApiEndpoint.get("health.get", "/api/health", {
|
|
14
|
+
success: ServiceStatus.Health,
|
|
15
|
+
}).annotateMerge(OpenApi.annotations({
|
|
16
|
+
identifier: "v2.health.get",
|
|
17
|
+
summary: "Check server health",
|
|
18
|
+
description: "Report the owning server process and its application status.",
|
|
19
|
+
})))
|
|
20
|
+
.annotateMerge(OpenApi.annotations({ title: "health" }));
|