@opencode/protocol 2.0.15 → 2.0.17

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.
@@ -2265,6 +2265,7 @@ export declare const EventGroup: HttpApiGroup.HttpApiGroup<"server.event", HttpA
2265
2265
  readonly file: Schema.String;
2266
2266
  readonly pid: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Int>>, Schema.optionalKey<Schema.Int>, never, never>;
2267
2267
  readonly exit: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Finite>>, Schema.optionalKey<Schema.Finite>, never, never>;
2268
+ readonly signal: Schema.decodeTo<Schema.optional<Schema.toType<Schema.String>>, Schema.optionalKey<Schema.String>, never, never>;
2268
2269
  readonly metadata: Schema.$Record<Schema.String, Schema.Unknown>;
2269
2270
  readonly time: Schema.Struct<{
2270
2271
  readonly started: Schema.Finite;
@@ -2296,6 +2297,7 @@ export declare const EventGroup: HttpApiGroup.HttpApiGroup<"server.event", HttpA
2296
2297
  readonly file: Schema.String;
2297
2298
  readonly pid: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Int>>, Schema.optionalKey<Schema.Int>, never, never>;
2298
2299
  readonly exit: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Finite>>, Schema.optionalKey<Schema.Finite>, never, never>;
2300
+ readonly signal: Schema.decodeTo<Schema.optional<Schema.toType<Schema.String>>, Schema.optionalKey<Schema.String>, never, never>;
2299
2301
  readonly metadata: Schema.$Record<Schema.String, Schema.Unknown>;
2300
2302
  readonly time: Schema.Struct<{
2301
2303
  readonly started: Schema.Finite;
@@ -2351,6 +2353,7 @@ export declare const EventGroup: HttpApiGroup.HttpApiGroup<"server.event", HttpA
2351
2353
  readonly file: Schema.String;
2352
2354
  readonly pid: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Int>>, Schema.optionalKey<Schema.Int>, never, never>;
2353
2355
  readonly exit: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Finite>>, Schema.optionalKey<Schema.Finite>, never, never>;
2356
+ readonly signal: Schema.decodeTo<Schema.optional<Schema.toType<Schema.String>>, Schema.optionalKey<Schema.String>, never, never>;
2354
2357
  readonly metadata: Schema.$Record<Schema.String, Schema.Unknown>;
2355
2358
  readonly time: Schema.Struct<{
2356
2359
  readonly started: Schema.Finite;
@@ -2388,6 +2391,7 @@ export declare const EventGroup: HttpApiGroup.HttpApiGroup<"server.event", HttpA
2388
2391
  readonly file: Schema.String;
2389
2392
  readonly pid: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Int>>, Schema.optionalKey<Schema.Int>, never, never>;
2390
2393
  readonly exit: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Finite>>, Schema.optionalKey<Schema.Finite>, never, never>;
2394
+ readonly signal: Schema.decodeTo<Schema.optional<Schema.toType<Schema.String>>, Schema.optionalKey<Schema.String>, never, never>;
2391
2395
  readonly metadata: Schema.$Record<Schema.String, Schema.Unknown>;
2392
2396
  readonly time: Schema.Struct<{
2393
2397
  readonly started: Schema.Finite;
@@ -5332,6 +5336,7 @@ export declare const EventGroup: HttpApiGroup.HttpApiGroup<"server.event", HttpA
5332
5336
  readonly file: Schema.String;
5333
5337
  readonly pid: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Int>>, Schema.optionalKey<Schema.Int>, never, never>;
5334
5338
  readonly exit: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Finite>>, Schema.optionalKey<Schema.Finite>, never, never>;
5339
+ readonly signal: Schema.decodeTo<Schema.optional<Schema.toType<Schema.String>>, Schema.optionalKey<Schema.String>, never, never>;
5335
5340
  readonly metadata: Schema.$Record<Schema.String, Schema.Unknown>;
5336
5341
  readonly time: Schema.Struct<{
5337
5342
  readonly started: Schema.Finite;
@@ -5356,6 +5361,7 @@ export declare const EventGroup: HttpApiGroup.HttpApiGroup<"server.event", HttpA
5356
5361
  readonly file: Schema.String;
5357
5362
  readonly pid: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Int>>, Schema.optionalKey<Schema.Int>, never, never>;
5358
5363
  readonly exit: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Finite>>, Schema.optionalKey<Schema.Finite>, never, never>;
5364
+ readonly signal: Schema.decodeTo<Schema.optional<Schema.toType<Schema.String>>, Schema.optionalKey<Schema.String>, never, never>;
5359
5365
  readonly metadata: Schema.$Record<Schema.String, Schema.Unknown>;
5360
5366
  readonly time: Schema.Struct<{
5361
5367
  readonly started: Schema.Finite;
@@ -6765,6 +6771,7 @@ export declare const EventGroup: HttpApiGroup.HttpApiGroup<"server.event", HttpA
6765
6771
  readonly file: string;
6766
6772
  readonly pid?: number | undefined;
6767
6773
  readonly exit?: number | undefined;
6774
+ readonly signal?: string | undefined;
6768
6775
  };
6769
6776
  };
6770
6777
  readonly type: "shell.created";
@@ -7409,6 +7416,7 @@ export declare const EventGroup: HttpApiGroup.HttpApiGroup<"server.event", HttpA
7409
7416
  readonly file: string;
7410
7417
  readonly pid?: number | undefined;
7411
7418
  readonly exit?: number | undefined;
7419
+ readonly signal?: string | undefined;
7412
7420
  };
7413
7421
  readonly sessionID: string & import("effect/Brand").Brand<"SessionID">;
7414
7422
  };
@@ -7445,6 +7453,7 @@ export declare const EventGroup: HttpApiGroup.HttpApiGroup<"server.event", HttpA
7445
7453
  readonly file: string;
7446
7454
  readonly pid?: number | undefined;
7447
7455
  readonly exit?: number | undefined;
7456
+ readonly signal?: string | undefined;
7448
7457
  };
7449
7458
  readonly output: {
7450
7459
  readonly output: string;
@@ -10825,6 +10834,7 @@ export declare const OpenCodeEvent: Schema.Union<readonly [Schema.Struct<{
10825
10834
  readonly file: Schema.String;
10826
10835
  readonly pid: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Int>>, Schema.optionalKey<Schema.Int>, never, never>;
10827
10836
  readonly exit: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Finite>>, Schema.optionalKey<Schema.Finite>, never, never>;
10837
+ readonly signal: Schema.decodeTo<Schema.optional<Schema.toType<Schema.String>>, Schema.optionalKey<Schema.String>, never, never>;
10828
10838
  readonly metadata: Schema.$Record<Schema.String, Schema.Unknown>;
10829
10839
  readonly time: Schema.Struct<{
10830
10840
  readonly started: Schema.Finite;
@@ -10856,6 +10866,7 @@ export declare const OpenCodeEvent: Schema.Union<readonly [Schema.Struct<{
10856
10866
  readonly file: Schema.String;
10857
10867
  readonly pid: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Int>>, Schema.optionalKey<Schema.Int>, never, never>;
10858
10868
  readonly exit: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Finite>>, Schema.optionalKey<Schema.Finite>, never, never>;
10869
+ readonly signal: Schema.decodeTo<Schema.optional<Schema.toType<Schema.String>>, Schema.optionalKey<Schema.String>, never, never>;
10859
10870
  readonly metadata: Schema.$Record<Schema.String, Schema.Unknown>;
10860
10871
  readonly time: Schema.Struct<{
10861
10872
  readonly started: Schema.Finite;
@@ -10911,6 +10922,7 @@ export declare const OpenCodeEvent: Schema.Union<readonly [Schema.Struct<{
10911
10922
  readonly file: Schema.String;
10912
10923
  readonly pid: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Int>>, Schema.optionalKey<Schema.Int>, never, never>;
10913
10924
  readonly exit: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Finite>>, Schema.optionalKey<Schema.Finite>, never, never>;
10925
+ readonly signal: Schema.decodeTo<Schema.optional<Schema.toType<Schema.String>>, Schema.optionalKey<Schema.String>, never, never>;
10914
10926
  readonly metadata: Schema.$Record<Schema.String, Schema.Unknown>;
10915
10927
  readonly time: Schema.Struct<{
10916
10928
  readonly started: Schema.Finite;
@@ -10948,6 +10960,7 @@ export declare const OpenCodeEvent: Schema.Union<readonly [Schema.Struct<{
10948
10960
  readonly file: Schema.String;
10949
10961
  readonly pid: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Int>>, Schema.optionalKey<Schema.Int>, never, never>;
10950
10962
  readonly exit: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Finite>>, Schema.optionalKey<Schema.Finite>, never, never>;
10963
+ readonly signal: Schema.decodeTo<Schema.optional<Schema.toType<Schema.String>>, Schema.optionalKey<Schema.String>, never, never>;
10951
10964
  readonly metadata: Schema.$Record<Schema.String, Schema.Unknown>;
10952
10965
  readonly time: Schema.Struct<{
10953
10966
  readonly started: Schema.Finite;
@@ -13892,6 +13905,7 @@ export declare const OpenCodeEvent: Schema.Union<readonly [Schema.Struct<{
13892
13905
  readonly file: Schema.String;
13893
13906
  readonly pid: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Int>>, Schema.optionalKey<Schema.Int>, never, never>;
13894
13907
  readonly exit: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Finite>>, Schema.optionalKey<Schema.Finite>, never, never>;
13908
+ readonly signal: Schema.decodeTo<Schema.optional<Schema.toType<Schema.String>>, Schema.optionalKey<Schema.String>, never, never>;
13895
13909
  readonly metadata: Schema.$Record<Schema.String, Schema.Unknown>;
13896
13910
  readonly time: Schema.Struct<{
13897
13911
  readonly started: Schema.Finite;
@@ -13916,6 +13930,7 @@ export declare const OpenCodeEvent: Schema.Union<readonly [Schema.Struct<{
13916
13930
  readonly file: Schema.String;
13917
13931
  readonly pid: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Int>>, Schema.optionalKey<Schema.Int>, never, never>;
13918
13932
  readonly exit: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Finite>>, Schema.optionalKey<Schema.Finite>, never, never>;
13933
+ readonly signal: Schema.decodeTo<Schema.optional<Schema.toType<Schema.String>>, Schema.optionalKey<Schema.String>, never, never>;
13919
13934
  readonly metadata: Schema.$Record<Schema.String, Schema.Unknown>;
13920
13935
  readonly time: Schema.Struct<{
13921
13936
  readonly started: Schema.Finite;
@@ -1,5 +1,6 @@
1
1
  import { Schema } from "effect";
2
2
  import { HttpApiEndpoint, HttpApiGroup } from "effect/unstable/httpapi";
3
+ import { UnauthorizedError } from "../errors.js";
3
4
  export declare const ServerInfo: Schema.Struct<{
4
5
  readonly version: Schema.String;
5
6
  readonly pid: Schema.Int;
@@ -9,6 +10,16 @@ export declare const ServerInfo: Schema.Struct<{
9
10
  }>;
10
11
  }>;
11
12
  export type ServerInfo = typeof ServerInfo.Type;
13
+ export declare const PairingCode: Schema.Struct<{
14
+ readonly code: Schema.String;
15
+ readonly expires_in: Schema.Int;
16
+ }>;
17
+ export type PairingCode = typeof PairingCode.Type;
18
+ export declare const PairingSession: Schema.Struct<{
19
+ readonly token: Schema.String;
20
+ }>;
21
+ export type PairingSession = typeof PairingSession.Type;
22
+ export declare function isPairingConnectURL(url: URL): boolean;
12
23
  export declare const ServerGroup: HttpApiGroup.HttpApiGroup<"server.server", HttpApiEndpoint.HttpApiEndpoint<"server.info", "GET", "/api/info", never, never, never, never, Schema.toCodecJson<Schema.Struct<{
13
24
  readonly version: Schema.String;
14
25
  readonly pid: Schema.Int;
@@ -16,4 +27,11 @@ export declare const ServerGroup: HttpApiGroup.HttpApiGroup<"server.server", Htt
16
27
  readonly paths: Schema.Struct<{
17
28
  readonly tmp: Schema.String;
18
29
  }>;
19
- }>>, never, never, never>, false>;
30
+ }>>, never, never, never> | HttpApiEndpoint.HttpApiEndpoint<"server.pair", "POST", "/api/pair", never, never, never, never, Schema.toCodecJson<Schema.Struct<{
31
+ readonly code: Schema.String;
32
+ readonly expires_in: Schema.Int;
33
+ }>>, never, never, never> | HttpApiEndpoint.HttpApiEndpoint<"server.connect", "GET", "/auth/connect/:code", Schema.toCodecStringTree<Schema.Struct<{
34
+ code: Schema.String;
35
+ }>>, never, never, never, Schema.toCodecJson<Schema.Struct<{
36
+ readonly token: Schema.String;
37
+ }>>, Schema.toCodecJson<typeof UnauthorizedError>, never, never>, false>;
@@ -1,5 +1,6 @@
1
1
  import { Schema } from "effect";
2
2
  import { HttpApiEndpoint, HttpApiGroup, OpenApi } from "effect/unstable/httpapi";
3
+ import { UnauthorizedError } from "../errors.js";
3
4
  export const ServerInfo = Schema.Struct({
4
5
  version: Schema.String,
5
6
  // 0 means the runtime has no OS process identity (e.g. workerd).
@@ -9,6 +10,18 @@ export const ServerInfo = Schema.Struct({
9
10
  tmp: Schema.String,
10
11
  }),
11
12
  }).annotate({ identifier: "ServerInfo" });
13
+ export const PairingCode = Schema.Struct({
14
+ code: Schema.String,
15
+ expires_in: Schema.Int,
16
+ }).annotate({ identifier: "PairingCode" });
17
+ export const PairingSession = Schema.Struct({
18
+ token: Schema.String,
19
+ }).annotate({ identifier: "PairingSession" });
20
+ const PAIRING_CONNECT_PATH = /^\/auth\/connect\/[^/]+$/;
21
+ // Authorization middleware skips credential checks for pairing links; the connect handler consumes the code instead.
22
+ export function isPairingConnectURL(url) {
23
+ return PAIRING_CONNECT_PATH.test(url.pathname);
24
+ }
12
25
  export const ServerGroup = HttpApiGroup.make("server.server")
13
26
  .add(HttpApiEndpoint.get("server.info", "/api/info", {
14
27
  success: ServerInfo,
@@ -16,5 +29,21 @@ export const ServerGroup = HttpApiGroup.make("server.server")
16
29
  identifier: "server.info",
17
30
  summary: "Get server info",
18
31
  description: "Return the server identity, connection URLs, paths, and readiness status.",
32
+ })))
33
+ .add(HttpApiEndpoint.post("server.pair", "/api/pair", {
34
+ success: PairingCode,
35
+ }).annotateMerge(OpenApi.annotations({
36
+ identifier: "server.pair",
37
+ summary: "Create pairing code",
38
+ description: "Create a short-lived, single-use code for a /auth/connect/:code pairing link.",
39
+ })))
40
+ .add(HttpApiEndpoint.get("server.connect", "/auth/connect/:code", {
41
+ params: { code: Schema.String },
42
+ success: PairingSession,
43
+ error: UnauthorizedError,
44
+ }).annotateMerge(OpenApi.annotations({
45
+ identifier: "server.connect",
46
+ summary: "Redeem pairing code",
47
+ description: "Redeem a pairing code. Browsers receive a session cookie and a redirect to the web app; requests that accept JSON receive a session token to use as the password.",
19
48
  })))
20
49
  .annotateMerge(OpenApi.annotations({ title: "server" }));
@@ -6404,6 +6404,7 @@ export declare const makeSessionGroup: <I extends HttpApiMiddleware.AnyId, S, Fo
6404
6404
  readonly file: Schema.String;
6405
6405
  readonly pid: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Int>>, Schema.optionalKey<Schema.Int>, never, never>;
6406
6406
  readonly exit: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Finite>>, Schema.optionalKey<Schema.Finite>, never, never>;
6407
+ readonly signal: Schema.decodeTo<Schema.optional<Schema.toType<Schema.String>>, Schema.optionalKey<Schema.String>, never, never>;
6407
6408
  readonly metadata: Schema.$Record<Schema.String, Schema.Unknown>;
6408
6409
  readonly time: Schema.Struct<{
6409
6410
  readonly started: Schema.Finite;
@@ -6435,6 +6436,7 @@ export declare const makeSessionGroup: <I extends HttpApiMiddleware.AnyId, S, Fo
6435
6436
  readonly file: Schema.String;
6436
6437
  readonly pid: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Int>>, Schema.optionalKey<Schema.Int>, never, never>;
6437
6438
  readonly exit: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Finite>>, Schema.optionalKey<Schema.Finite>, never, never>;
6439
+ readonly signal: Schema.decodeTo<Schema.optional<Schema.toType<Schema.String>>, Schema.optionalKey<Schema.String>, never, never>;
6438
6440
  readonly metadata: Schema.$Record<Schema.String, Schema.Unknown>;
6439
6441
  readonly time: Schema.Struct<{
6440
6442
  readonly started: Schema.Finite;
@@ -6490,6 +6492,7 @@ export declare const makeSessionGroup: <I extends HttpApiMiddleware.AnyId, S, Fo
6490
6492
  readonly file: Schema.String;
6491
6493
  readonly pid: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Int>>, Schema.optionalKey<Schema.Int>, never, never>;
6492
6494
  readonly exit: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Finite>>, Schema.optionalKey<Schema.Finite>, never, never>;
6495
+ readonly signal: Schema.decodeTo<Schema.optional<Schema.toType<Schema.String>>, Schema.optionalKey<Schema.String>, never, never>;
6493
6496
  readonly metadata: Schema.$Record<Schema.String, Schema.Unknown>;
6494
6497
  readonly time: Schema.Struct<{
6495
6498
  readonly started: Schema.Finite;
@@ -6527,6 +6530,7 @@ export declare const makeSessionGroup: <I extends HttpApiMiddleware.AnyId, S, Fo
6527
6530
  readonly file: Schema.String;
6528
6531
  readonly pid: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Int>>, Schema.optionalKey<Schema.Int>, never, never>;
6529
6532
  readonly exit: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Finite>>, Schema.optionalKey<Schema.Finite>, never, never>;
6533
+ readonly signal: Schema.decodeTo<Schema.optional<Schema.toType<Schema.String>>, Schema.optionalKey<Schema.String>, never, never>;
6530
6534
  readonly metadata: Schema.$Record<Schema.String, Schema.Unknown>;
6531
6535
  readonly time: Schema.Struct<{
6532
6536
  readonly started: Schema.Finite;
@@ -9323,6 +9327,7 @@ export declare const makeSessionGroup: <I extends HttpApiMiddleware.AnyId, S, Fo
9323
9327
  readonly file: string;
9324
9328
  readonly pid?: number | undefined;
9325
9329
  readonly exit?: number | undefined;
9330
+ readonly signal?: string | undefined;
9326
9331
  };
9327
9332
  readonly sessionID: string & import("effect/Brand").Brand<"SessionID">;
9328
9333
  };
@@ -9359,6 +9364,7 @@ export declare const makeSessionGroup: <I extends HttpApiMiddleware.AnyId, S, Fo
9359
9364
  readonly file: string;
9360
9365
  readonly pid?: number | undefined;
9361
9366
  readonly exit?: number | undefined;
9367
+ readonly signal?: string | undefined;
9362
9368
  };
9363
9369
  readonly output: {
9364
9370
  readonly output: string;
@@ -21,6 +21,7 @@ export declare const ShellGroup: HttpApiGroup.HttpApiGroup<"server.shell", HttpA
21
21
  readonly file: Schema.String;
22
22
  readonly pid: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Int>>, Schema.optionalKey<Schema.Int>, never, never>;
23
23
  readonly exit: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Finite>>, Schema.optionalKey<Schema.Finite>, never, never>;
24
+ readonly signal: Schema.decodeTo<Schema.optional<Schema.toType<Schema.String>>, Schema.optionalKey<Schema.String>, never, never>;
24
25
  readonly metadata: Schema.$Record<Schema.String, Schema.Unknown>;
25
26
  readonly time: Schema.Struct<{
26
27
  readonly started: Schema.Finite;
@@ -52,6 +53,7 @@ export declare const ShellGroup: HttpApiGroup.HttpApiGroup<"server.shell", HttpA
52
53
  readonly file: Schema.String;
53
54
  readonly pid: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Int>>, Schema.optionalKey<Schema.Int>, never, never>;
54
55
  readonly exit: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Finite>>, Schema.optionalKey<Schema.Finite>, never, never>;
56
+ readonly signal: Schema.decodeTo<Schema.optional<Schema.toType<Schema.String>>, Schema.optionalKey<Schema.String>, never, never>;
55
57
  readonly metadata: Schema.$Record<Schema.String, Schema.Unknown>;
56
58
  readonly time: Schema.Struct<{
57
59
  readonly started: Schema.Finite;
@@ -83,6 +85,7 @@ export declare const ShellGroup: HttpApiGroup.HttpApiGroup<"server.shell", HttpA
83
85
  readonly file: Schema.String;
84
86
  readonly pid: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Int>>, Schema.optionalKey<Schema.Int>, never, never>;
85
87
  readonly exit: Schema.decodeTo<Schema.optional<Schema.toType<Schema.Finite>>, Schema.optionalKey<Schema.Finite>, never, never>;
88
+ readonly signal: Schema.decodeTo<Schema.optional<Schema.toType<Schema.String>>, Schema.optionalKey<Schema.String>, never, never>;
86
89
  readonly metadata: Schema.$Record<Schema.String, Schema.Unknown>;
87
90
  readonly time: Schema.Struct<{
88
91
  readonly started: Schema.Finite;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@opencode/protocol",
4
- "version": "2.0.15",
4
+ "version": "2.0.17",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -32,7 +32,7 @@
32
32
  "typecheck": "tsgo --noEmit"
33
33
  },
34
34
  "dependencies": {
35
- "@opencode/schema": "2.0.15",
35
+ "@opencode/schema": "2.0.17",
36
36
  "effect": "4.0.0-rc.112"
37
37
  },
38
38
  "devDependencies": {