mthds 0.0.3 → 0.0.4

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.
Files changed (35) hide show
  1. package/README.md +80 -3
  2. package/dist/client/client.d.ts +15 -0
  3. package/dist/client/client.js +64 -0
  4. package/dist/client/client.js.map +1 -0
  5. package/dist/client/exceptions.d.ts +6 -0
  6. package/dist/client/exceptions.js +13 -0
  7. package/dist/client/exceptions.js.map +1 -0
  8. package/dist/client/index.d.ts +5 -0
  9. package/dist/client/index.js +3 -0
  10. package/dist/client/index.js.map +1 -0
  11. package/dist/client/models/index.d.ts +4 -0
  12. package/dist/client/models/index.js +2 -0
  13. package/dist/client/models/index.js.map +1 -0
  14. package/dist/client/models/pipe_output.d.ts +2 -0
  15. package/dist/client/models/pipe_output.js +2 -0
  16. package/dist/client/models/pipe_output.js.map +1 -0
  17. package/dist/client/models/pipeline_inputs.d.ts +3 -0
  18. package/dist/client/models/pipeline_inputs.js +2 -0
  19. package/dist/client/models/pipeline_inputs.js.map +1 -0
  20. package/dist/client/models/stuff.d.ts +1 -0
  21. package/dist/client/models/stuff.js +2 -0
  22. package/dist/client/models/stuff.js.map +1 -0
  23. package/dist/client/models/working_memory.d.ts +1 -0
  24. package/dist/client/models/working_memory.js +2 -0
  25. package/dist/client/models/working_memory.js.map +1 -0
  26. package/dist/client/pipeline.d.ts +36 -0
  27. package/dist/client/pipeline.js +2 -0
  28. package/dist/client/pipeline.js.map +1 -0
  29. package/dist/client/protocol.d.ts +5 -0
  30. package/dist/client/protocol.js +2 -0
  31. package/dist/client/protocol.js.map +1 -0
  32. package/dist/index.d.ts +1 -0
  33. package/dist/index.js +2 -0
  34. package/dist/index.js.map +1 -0
  35. package/package.json +13 -3
package/README.md CHANGED
@@ -1,12 +1,14 @@
1
1
  # mthds
2
2
 
3
- CLI for installing and managing **methods** — reusable workflows for AI coding agents.
3
+ CLI and SDK for **methods** — reusable workflows for AI coding agents.
4
4
 
5
5
  ## What is a method?
6
6
 
7
7
  A method is a packaged workflow that an AI agent (like Claude Code) can use. Methods are stored in a registry and installed locally via their unique slug.
8
8
 
9
- ## Install a method
9
+ ## CLI Usage
10
+
11
+ ### Install a method
10
12
 
11
13
  ```bash
12
14
  npx mthds install <slug>
@@ -27,7 +29,7 @@ The CLI will:
27
29
  | Local | `<cwd>/.claude/methods/<slug>/` |
28
30
  | Global | `~/.claude/methods/<slug>/` |
29
31
 
30
- ## Install software runtime
32
+ ### Install software runtime
31
33
 
32
34
  ```bash
33
35
  npx mthds setup software pipelex
@@ -35,6 +37,81 @@ npx mthds setup software pipelex
35
37
 
36
38
  Installs [uv](https://docs.astral.sh/uv/) and [pipelex](https://pipelex.dev) so methods that depend on them can run.
37
39
 
40
+ ## SDK Usage
41
+
42
+ Install the package:
43
+
44
+ ```bash
45
+ npm install mthds
46
+ ```
47
+
48
+ ### Basic example
49
+
50
+ ```typescript
51
+ import { MthdsApiClient } from "mthds";
52
+
53
+ const client = new MthdsApiClient({
54
+ apiBaseUrl: "https://api.pipelex.com",
55
+ apiToken: "your-api-key",
56
+ });
57
+
58
+ const result = await client.executePipeline({
59
+ pipe_code: "my-pipeline",
60
+ inputs: {
61
+ topic: "quantum computing",
62
+ },
63
+ });
64
+
65
+ console.log(result.pipe_output);
66
+ ```
67
+
68
+ The hosted API at `https://api.pipelex.com` is coming soon. In the meantime, you can run the API yourself.
69
+
70
+ ### Self-hosted API
71
+
72
+ Point the client to your own server:
73
+
74
+ ```typescript
75
+ const client = new MthdsApiClient({
76
+ apiBaseUrl: "http://localhost:8081",
77
+ apiToken: "your-api-key",
78
+ });
79
+ ```
80
+
81
+ ### Environment variables
82
+
83
+ Instead of passing options to the constructor, you can set environment variables:
84
+
85
+ | Variable | Description |
86
+ |----------|-------------|
87
+ | `MTHDS_API_BASE_URL` | Base URL of the API |
88
+ | `MTHDS_API_KEY` | API authentication token |
89
+
90
+ ```typescript
91
+ // Reads MTHDS_API_BASE_URL and MTHDS_API_KEY from the environment
92
+ const client = new MthdsApiClient();
93
+ ```
94
+
95
+ ### Methods
96
+
97
+ | Method | Description |
98
+ |--------|-------------|
99
+ | `executePipeline(options)` | Execute a pipeline and wait for the result |
100
+ | `startPipeline(options)` | Start a pipeline asynchronously |
101
+
102
+ ### Pipeline options
103
+
104
+ | Option | Type | Description |
105
+ |--------|------|-------------|
106
+ | `pipe_code` | `string` | Pipeline code to execute |
107
+ | `mthds_content` | `string` | Raw method content (alternative to `pipe_code`) |
108
+ | `inputs` | `Record<string, string \| string[] \| object>` | Pipeline input variables |
109
+ | `output_name` | `string` | Name of the output to return |
110
+ | `output_multiplicity` | `boolean \| number` | Expected output multiplicity |
111
+ | `dynamic_output_concept_code` | `string` | Dynamic output concept code |
112
+
113
+ Either `pipe_code` or `mthds_content` must be provided.
114
+
38
115
  ## Telemetry
39
116
 
40
117
  Anonymous usage data (method slug + timestamp) is collected to help rank methods on the leaderboard. No personal or device information is collected.
@@ -0,0 +1,15 @@
1
+ import type { RunnerProtocol } from "./protocol.js";
2
+ import type { ExecutePipelineOptions, PipelineExecuteResponse, PipelineStartResponse } from "./pipeline.js";
3
+ interface MthdsApiClientOptions {
4
+ apiToken?: string;
5
+ apiBaseUrl?: string;
6
+ }
7
+ export declare class MthdsApiClient implements RunnerProtocol {
8
+ private readonly apiToken;
9
+ private readonly apiBaseUrl;
10
+ constructor(options?: MthdsApiClientOptions);
11
+ private makeApiCall;
12
+ executePipeline(options: ExecutePipelineOptions): Promise<PipelineExecuteResponse>;
13
+ startPipeline(options: ExecutePipelineOptions): Promise<PipelineStartResponse>;
14
+ }
15
+ export {};
@@ -0,0 +1,64 @@
1
+ import { ClientAuthenticationError, PipelineRequestError, } from "./exceptions.js";
2
+ export class MthdsApiClient {
3
+ apiToken;
4
+ apiBaseUrl;
5
+ constructor(options = {}) {
6
+ this.apiToken = options.apiToken ?? process.env.MTHDS_API_KEY;
7
+ const resolvedBaseUrl = options.apiBaseUrl ?? process.env.MTHDS_API_BASE_URL;
8
+ if (!resolvedBaseUrl) {
9
+ throw new ClientAuthenticationError("API base URL is required for API execution");
10
+ }
11
+ this.apiBaseUrl = resolvedBaseUrl.replace(/\/+$/, "");
12
+ }
13
+ async makeApiCall(endpoint, pipelineRequest) {
14
+ const url = `${this.apiBaseUrl}/${endpoint}`;
15
+ const headers = {
16
+ "Content-Type": "application/json",
17
+ };
18
+ if (this.apiToken) {
19
+ headers["Authorization"] = `Bearer ${this.apiToken}`;
20
+ }
21
+ const response = await fetch(url, {
22
+ method: "POST",
23
+ headers,
24
+ body: JSON.stringify(pipelineRequest),
25
+ signal: AbortSignal.timeout(1_200_000),
26
+ });
27
+ if (!response.ok) {
28
+ const text = await response.text().catch(() => "");
29
+ throw new PipelineRequestError(`API POST /${endpoint} failed (${response.status}): ${text || response.statusText}`);
30
+ }
31
+ return response.json();
32
+ }
33
+ async executePipeline(options) {
34
+ if (!options.pipe_code && !options.mthds_content) {
35
+ throw new PipelineRequestError("Either pipe_code or mthds_content must be provided to executePipeline.");
36
+ }
37
+ const request = {
38
+ pipe_code: options.pipe_code,
39
+ mthds_content: options.mthds_content,
40
+ inputs: options.inputs,
41
+ output_name: options.output_name,
42
+ output_multiplicity: options.output_multiplicity,
43
+ dynamic_output_concept_code: options.dynamic_output_concept_code,
44
+ };
45
+ const data = await this.makeApiCall("api/v1/pipeline/execute", request);
46
+ return data;
47
+ }
48
+ async startPipeline(options) {
49
+ if (!options.pipe_code && !options.mthds_content) {
50
+ throw new PipelineRequestError("Either pipe_code or mthds_content must be provided to startPipeline.");
51
+ }
52
+ const request = {
53
+ pipe_code: options.pipe_code,
54
+ mthds_content: options.mthds_content,
55
+ inputs: options.inputs,
56
+ output_name: options.output_name,
57
+ output_multiplicity: options.output_multiplicity,
58
+ dynamic_output_concept_code: options.dynamic_output_concept_code,
59
+ };
60
+ const data = await this.makeApiCall("api/v1/pipeline/start", request);
61
+ return data;
62
+ }
63
+ }
64
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAOzB,MAAM,OAAO,cAAc;IACR,QAAQ,CAAqB;IAC7B,UAAU,CAAS;IAEpC,YAAY,UAAiC,EAAE;QAC7C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QAE9D,MAAM,eAAe,GACnB,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACvD,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,yBAAyB,CACjC,4CAA4C,CAC7C,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxD,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,QAAgB,EAChB,eAAgC;QAEhC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,IAAI,QAAQ,EAAE,CAAC;QAE7C,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QACF,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;YACrC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;SACvC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACnD,MAAM,IAAI,oBAAoB,CAC5B,aAAa,QAAQ,YAAY,QAAQ,CAAC,MAAM,MAAM,IAAI,IAAI,QAAQ,CAAC,UAAU,EAAE,CACpF,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,OAA+B;QAE/B,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YACjD,MAAM,IAAI,oBAAoB,CAC5B,wEAAwE,CACzE,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAoB;YAC/B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;YAChD,2BAA2B,EAAE,OAAO,CAAC,2BAA2B;SACjE,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC;QACxE,OAAO,IAA+B,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,OAA+B;QAE/B,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YACjD,MAAM,IAAI,oBAAoB,CAC5B,sEAAsE,CACvE,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAoB;YAC/B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;YAChD,2BAA2B,EAAE,OAAO,CAAC,2BAA2B;SACjE,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;QACtE,OAAO,IAA6B,CAAC;IACvC,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ export declare class ClientAuthenticationError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare class PipelineRequestError extends Error {
5
+ constructor(message: string);
6
+ }
@@ -0,0 +1,13 @@
1
+ export class ClientAuthenticationError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = "ClientAuthenticationError";
5
+ }
6
+ }
7
+ export class PipelineRequestError extends Error {
8
+ constructor(message) {
9
+ super(message);
10
+ this.name = "PipelineRequestError";
11
+ }
12
+ }
13
+ //# sourceMappingURL=exceptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exceptions.js","sourceRoot":"","sources":["../../src/client/exceptions.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAClD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ export { MthdsApiClient } from "./client.js";
2
+ export type { RunnerProtocol } from "./protocol.js";
3
+ export { ClientAuthenticationError, PipelineRequestError, } from "./exceptions.js";
4
+ export type { PipelineState, PipelineRequest, PipelineExecuteResponse, PipelineStartResponse, ExecutePipelineOptions, } from "./pipeline.js";
5
+ export type { DictStuff, DictWorkingMemory, DictPipeOutput, VariableMultiplicity, StuffContentOrData, PipelineInputs, } from "./models/index.js";
@@ -0,0 +1,3 @@
1
+ export { MthdsApiClient } from "./client.js";
2
+ export { ClientAuthenticationError, PipelineRequestError, } from "./exceptions.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EACL,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export type { DictStuff } from "./stuff.js";
2
+ export type { DictWorkingMemory } from "./working_memory.js";
3
+ export type { DictPipeOutput, VariableMultiplicity } from "./pipe_output.js";
4
+ export type { StuffContentOrData, PipelineInputs } from "./pipeline_inputs.js";
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/models/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export type { DictPipeOutput } from "../../runners/types.js";
2
+ export type VariableMultiplicity = boolean | number;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pipe_output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipe_output.js","sourceRoot":"","sources":["../../../src/client/models/pipe_output.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { DictStuff } from "./stuff.js";
2
+ export type StuffContentOrData = string | string[] | Record<string, unknown> | DictStuff;
3
+ export type PipelineInputs = Record<string, StuffContentOrData>;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pipeline_inputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline_inputs.js","sourceRoot":"","sources":["../../../src/client/models/pipeline_inputs.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ export type { DictStuff } from "../../runners/types.js";
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stuff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stuff.js","sourceRoot":"","sources":["../../../src/client/models/stuff.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ export type { DictWorkingMemory } from "../../runners/types.js";
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=working_memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"working_memory.js","sourceRoot":"","sources":["../../../src/client/models/working_memory.ts"],"names":[],"mappings":""}
@@ -0,0 +1,36 @@
1
+ import type { DictPipeOutput } from "./models/pipe_output.js";
2
+ import type { VariableMultiplicity } from "./models/pipe_output.js";
3
+ import type { PipelineInputs } from "./models/pipeline_inputs.js";
4
+ export type { PipelineState } from "../runners/types.js";
5
+ export interface PipelineRequest {
6
+ pipe_code?: string | null;
7
+ mthds_content?: string | null;
8
+ inputs?: PipelineInputs | null;
9
+ output_name?: string | null;
10
+ output_multiplicity?: VariableMultiplicity | null;
11
+ dynamic_output_concept_code?: string | null;
12
+ }
13
+ export interface PipelineExecuteResponse {
14
+ pipeline_run_id: string;
15
+ created_at: string;
16
+ pipeline_state: string;
17
+ finished_at?: string | null;
18
+ main_stuff_name?: string | null;
19
+ pipe_output: DictPipeOutput;
20
+ }
21
+ export interface PipelineStartResponse {
22
+ pipeline_run_id: string;
23
+ created_at: string;
24
+ pipeline_state: string;
25
+ finished_at?: string | null;
26
+ main_stuff_name?: string | null;
27
+ pipe_output?: DictPipeOutput | null;
28
+ }
29
+ export interface ExecutePipelineOptions {
30
+ pipe_code?: string | null;
31
+ mthds_content?: string | null;
32
+ inputs?: PipelineInputs | null;
33
+ output_name?: string | null;
34
+ output_multiplicity?: VariableMultiplicity | null;
35
+ dynamic_output_concept_code?: string | null;
36
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/client/pipeline.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import type { ExecutePipelineOptions, PipelineExecuteResponse, PipelineStartResponse } from "./pipeline.js";
2
+ export interface RunnerProtocol {
3
+ executePipeline(options: ExecutePipelineOptions): Promise<PipelineExecuteResponse>;
4
+ startPipeline(options: ExecutePipelineOptions): Promise<PipelineStartResponse>;
5
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/client/protocol.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ export * from "./client/index.js";
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from "./client/index.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
package/package.json CHANGED
@@ -1,18 +1,27 @@
1
1
  {
2
2
  "name": "mthds",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "description": "CLI for composable methods for AI agents. Turn your knowledge processes into executable methods.",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
8
- "url": "https://github.com/Pipelex/mthds-js"
8
+ "url": "https://github.com/mthds-ai/mthds-js"
9
9
  },
10
10
  "type": "module",
11
+ "main": "./dist/index.js",
12
+ "types": "./dist/index.d.ts",
13
+ "exports": {
14
+ ".": {
15
+ "import": "./dist/index.js",
16
+ "types": "./dist/index.d.ts"
17
+ }
18
+ },
11
19
  "bin": {
12
20
  "mthds": "./dist/cli.js"
13
21
  },
14
22
  "scripts": {
15
- "build": "tsc"
23
+ "build": "tsc",
24
+ "example": "npx tsx examples/call_api.ts"
16
25
  },
17
26
  "files": [
18
27
  "dist/"
@@ -30,6 +39,7 @@
30
39
  },
31
40
  "devDependencies": {
32
41
  "@types/node": "^22.12.0",
42
+ "tsx": "^4.19.0",
33
43
  "typescript": "^5.7.3"
34
44
  }
35
45
  }