@sassoftware/sas-score-mcp-serverjs 0.4.1-1 → 0.4.1-15

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 (47) hide show
  1. package/cli.js +111 -31
  2. package/package.json +4 -2
  3. package/skills/sas-list-tables-smart/SKILL.md +123 -0
  4. package/skills/sas-read-and-score/SKILL.md +54 -53
  5. package/skills/sas-read-strategy/SKILL.md +10 -10
  6. package/skills/sas-score-workflow/SKILL.md +19 -2
  7. package/skills/sas-spec-migration/SKILL.md +303 -0
  8. package/src/authpkce.js +219 -0
  9. package/src/createMcpServer.js +11 -8
  10. package/src/expressMcpServer.js +354 -338
  11. package/src/oauthHandlers/authorize.js +46 -0
  12. package/src/oauthHandlers/baseUrl.js +8 -0
  13. package/src/oauthHandlers/callback.js +93 -0
  14. package/src/oauthHandlers/getMetadata.js +27 -0
  15. package/src/oauthHandlers/index.js +7 -0
  16. package/src/oauthHandlers/token.js +37 -0
  17. package/src/processHeaders.js +88 -0
  18. package/src/toolHelpers/_listLibrary.js +0 -1
  19. package/src/toolHelpers/getLogonPayload.js +5 -1
  20. package/src/toolHelpers/refreshTokenOauth.js +3 -3
  21. package/src/toolSet/.claude/settings.local.json +13 -0
  22. package/src/toolSet/devaScore.js +61 -61
  23. package/src/toolSet/findJob.js +1 -1
  24. package/src/toolSet/findJobdef.js +2 -2
  25. package/src/toolSet/findLibrary.js +68 -67
  26. package/src/toolSet/findModel.js +2 -2
  27. package/src/toolSet/findTable.js +3 -2
  28. package/src/toolSet/getEnv.js +8 -4
  29. package/src/toolSet/listJobdefs.js +61 -61
  30. package/src/toolSet/listJobs.js +61 -61
  31. package/src/toolSet/listLibraries.js +78 -78
  32. package/src/toolSet/listModels.js +56 -56
  33. package/src/toolSet/listTables.js +66 -65
  34. package/src/toolSet/modelInfo.js +2 -2
  35. package/src/toolSet/modelScore.js +6 -5
  36. package/src/toolSet/readTable.js +63 -65
  37. package/src/toolSet/runCasProgram.js +7 -6
  38. package/src/toolSet/runJob.js +81 -81
  39. package/src/toolSet/runJobdef.js +82 -82
  40. package/src/toolSet/runMacro.js +81 -80
  41. package/src/toolSet/runProgram.js +4 -8
  42. package/src/toolSet/sasQuery.js +77 -78
  43. package/src/toolSet/scrInfo.js +1 -1
  44. package/src/toolSet/scrScore.js +69 -68
  45. package/src/toolSet/setContext.js +65 -65
  46. package/src/toolSet/superstat.js +61 -59
  47. package/src/toolSet/tableInfo.js +58 -57
@@ -46,7 +46,7 @@ Returns { models: [] } if not found; { models: [name, ...] } if found. Never hal
46
46
  name: 'find-model',
47
47
  description: description,
48
48
  inputSchema: z.object({
49
- 'name': z.string()
49
+ name: z.string()
50
50
  }),
51
51
  handler: async (params) => {
52
52
  let r = await _listModels(params);
@@ -57,4 +57,4 @@ Returns { models: [] } if not found; { models: [name, ...] } if found. Never hal
57
57
  }
58
58
 
59
59
  export default findModel;
60
-
60
+
@@ -47,10 +47,11 @@ Returns { tables: [] } if not found; { tables: [name, ...] } if found. Never hal
47
47
  name: 'find-table',
48
48
  description: description,
49
49
  inputSchema: z.object({
50
- server: z.string(), // default server is 'cas',
51
50
  name: z.string(),
52
- lib: z.string()
51
+ lib: z.string(),
52
+ server: z.string().optional() // default server is 'cas'
53
53
  }),
54
+
54
55
  handler: async (params) => {
55
56
  // Check if the params.scenario is a string and parse it
56
57
  let r = await _listTables(params);
@@ -40,9 +40,13 @@ Returns variable name with current value, or null if not found. Return structure
40
40
  let spec = {
41
41
  name: 'get-env',
42
42
  description: description,
43
- inputSchema: z.object({
44
- name: z.string()
45
- }),
43
+ inputSchema: {
44
+ type: 'object',
45
+ properties: {
46
+ name: { type: 'string' }
47
+ },
48
+ required: ['name']
49
+ },
46
50
  handler: async (params) => {
47
51
  return await _getEnv(params);
48
52
  }
@@ -50,4 +54,4 @@ Returns variable name with current value, or null if not found. Return structure
50
54
  return spec;
51
55
  }
52
56
  export default getEnv;
53
-
57
+
@@ -1,61 +1,61 @@
1
- /*
2
- * Copyright © 2025, SAS Institute Inc., Cary, NC, USA. All Rights Reserved.
3
- * SPDX-License-Identifier: Apache-2.0
4
- */
5
- import { z } from 'zod';
6
- import _listJobdefs from '../toolHelpers/_listJobdefs.js';
7
- function listJobdefs(_appContext) {
8
-
9
- let description = `
10
- list-jobdefs — enumerate SAS Viya job definitions (jobdefs) assets.
11
-
12
- USE when: list jobdefs, show jobdefs, browse jobdefs, list available jobdefs, next page
13
- DO NOT USE for: find single jobdef (use find-jobdef), execute jobdef (use run-jobdef), find job (use find-job), sas code (use run-sas-program)
14
-
15
- PARAMETERS
16
- - limit: number (default: 10) — number of jobdefs per page
17
- - start: number (default: 1) — 1-based page offset
18
- - where: string (default: '') — optional filter expression
19
-
20
- ROUTING RULES
21
- - list jobdefs → { start: 1, limit: 10 }
22
- - show me 25 jobdefs → { start: 1, limit: 25 }
23
- - next jobdefs → { start: previousStart + previousLimit, limit: previousLimit }
24
-
25
- EXAMPLES
26
- - list jobdefs → { start: 1, limit: 10 }
27
- - list 25 jobdefs → { start: 1, limit: 25 }
28
- - next jobdefs → { start: 11, limit: 10 }
29
-
30
- NEGATIVE EXAMPLES (do not route here)
31
- - find jobdef abc (use find-jobdef)
32
- - list jobs (use list-jobs)
33
- - run jobdef abc (use run-jobdef)
34
- - list models (use list-models)
35
-
36
- PAGINATION
37
- If returned length === limit, hint: next start = start + limit. Empty result with start > 1 means paged past end.
38
-
39
- ERRORS
40
- Surface backend error directly; never fabricate jobdef names.
41
- `;
42
-
43
- let spec = {
44
- name: 'list-jobdefs',
45
- description: description,
46
- inputSchema: z.object({
47
- limit: z.number(),
48
- start: z.number(),
49
- where: z.string()
50
- }),
51
- // No 'server' required; backend context is implicit in helper
52
- handler: async (params) => {
53
- // _listJobdefs handles all validation and defaults
54
- const result = await _listJobdefs(params);
55
- return result;
56
- }
57
- }
58
- return spec;
59
- }
60
- export default listJobdefs;
61
-
1
+ /*
2
+ * Copyright © 2025, SAS Institute Inc., Cary, NC, USA. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import { z } from 'zod';
6
+ import _listJobdefs from '../toolHelpers/_listJobdefs.js';
7
+ function listJobdefs(_appContext) {
8
+
9
+ let description = `
10
+ list-jobdefs — enumerate SAS Viya job definitions (jobdefs) assets.
11
+
12
+ USE when: list jobdefs, show jobdefs, browse jobdefs, list available jobdefs, next page
13
+ DO NOT USE for: find single jobdef (use find-jobdef), execute jobdef (use run-jobdef), find job (use find-job), sas code (use run-sas-program)
14
+
15
+ PARAMETERS
16
+ - limit: number (default: 10) — number of jobdefs per page
17
+ - start: number (default: 1) — 1-based page offset
18
+ - where: string (default: '') — optional filter expression
19
+
20
+ ROUTING RULES
21
+ - list jobdefs → { start: 1, limit: 10 }
22
+ - show me 25 jobdefs → { start: 1, limit: 25 }
23
+ - next jobdefs → { start: previousStart + previousLimit, limit: previousLimit }
24
+
25
+ EXAMPLES
26
+ - list jobdefs → { start: 1, limit: 10 }
27
+ - list 25 jobdefs → { start: 1, limit: 25 }
28
+ - next jobdefs → { start: 11, limit: 10 }
29
+
30
+ NEGATIVE EXAMPLES (do not route here)
31
+ - find jobdef abc (use find-jobdef)
32
+ - list jobs (use list-jobs)
33
+ - run jobdef abc (use run-jobdef)
34
+ - list models (use list-models)
35
+
36
+ PAGINATION
37
+ If returned length === limit, hint: next start = start + limit. Empty result with start > 1 means paged past end.
38
+
39
+ ERRORS
40
+ Surface backend error directly; never fabricate jobdef names.
41
+ `;
42
+
43
+ let spec = {
44
+ name: 'list-jobdefs',
45
+ description: description,
46
+ inputSchema: z.object({
47
+ limit: z.number().optional(),
48
+ start: z.number().optional(),
49
+ where: z.string().optional()
50
+ }),
51
+ // No 'server' required; backend context is implicit in helper
52
+ handler: async (params) => {
53
+ // _listJobdefs handles all validation and defaults
54
+ const result = await _listJobdefs(params);
55
+ return result;
56
+ }
57
+ }
58
+ return spec;
59
+ }
60
+ export default listJobdefs;
61
+
@@ -1,61 +1,61 @@
1
- /*
2
- * Copyright © 2025, SAS Institute Inc., Cary, NC, USA. All Rights Reserved.
3
- * SPDX-License-Identifier: Apache-2.0
4
- */
5
- import { z } from 'zod';
6
- import _listJobs from '../toolHelpers/_listJobs.js';
7
- function listJobs(_appContext) {
8
-
9
- let description = `
10
- list-jobs — enumerate SAS Viya job assets.
11
-
12
- USE when: list jobs, show jobs, browse jobs, list available jobs, next page
13
- DO NOT USE for: find single job (use find-job), execute job (use run-job), run job def (use run-jobdef), sas code (use run-sas-program)
14
-
15
- PARAMETERS
16
- - limit: number (default: 10) — number of jobs per page
17
- - start: number (default: 1) — 1-based page offset
18
- - where: string (default: '') — optional filter expression
19
-
20
- ROUTING RULES
21
- - list jobs → { start: 1, limit: 10 }
22
- - show me 25 jobs → { start: 1, limit: 25 }
23
- - next jobs → { start: previousStart + previousLimit, limit: previousLimit }
24
-
25
- EXAMPLES
26
- - list jobs → { start: 1, limit: 10 }
27
- - list 25 jobs → { start: 1, limit: 25 }
28
- - next jobs → { start: 11, limit: 10 }
29
-
30
- NEGATIVE EXAMPLES (do not route here)
31
- - find job abc (use find-job)
32
- - run job abc (use run-job)
33
- - list models (use list-models)
34
- - list tables in lib xyz (use list-tables)
35
-
36
- PAGINATION
37
- If returned length === limit, hint: next start = start + limit. Empty result with start > 1 means paged past end.
38
-
39
- ERRORS
40
- Surface backend error directly; never fabricate job names.
41
- `;
42
-
43
- let spec = {
44
- name: 'list-jobs',
45
- description: description,
46
- inputSchema: z.object({
47
- limit: z.number(),
48
- start: z.number(),
49
- where: z.string()
50
- }),
51
- // No 'server' required; backend context is implicit in helper
52
- handler: async (params) => {
53
- // _listJob handles all validation and defaults
54
- const result = await _listJobs(params);
55
- return result;
56
- }
57
- }
58
- return spec;
59
- }
60
- export default listJobs;
61
-
1
+ /*
2
+ * Copyright © 2025, SAS Institute Inc., Cary, NC, USA. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import { z } from 'zod';
6
+ import _listJobs from '../toolHelpers/_listJobs.js';
7
+ function listJobs(_appContext) {
8
+
9
+ let description = `
10
+ list-jobs — enumerate SAS Viya job assets.
11
+
12
+ USE when: list jobs, show jobs, browse jobs, list available jobs, next page
13
+ DO NOT USE for: find single job (use find-job), execute job (use run-job), run job def (use run-jobdef), sas code (use run-sas-program)
14
+
15
+ PARAMETERS
16
+ - limit: number (default: 10) — number of jobs per page
17
+ - start: number (default: 1) — 1-based page offset
18
+ - where: string (default: '') — optional filter expression
19
+
20
+ ROUTING RULES
21
+ - list jobs → { start: 1, limit: 10 }
22
+ - show me 25 jobs → { start: 1, limit: 25 }
23
+ - next jobs → { start: previousStart + previousLimit, limit: previousLimit }
24
+
25
+ EXAMPLES
26
+ - list jobs → { start: 1, limit: 10 }
27
+ - list 25 jobs → { start: 1, limit: 25 }
28
+ - next jobs → { start: 11, limit: 10 }
29
+
30
+ NEGATIVE EXAMPLES (do not route here)
31
+ - find job abc (use find-job)
32
+ - run job abc (use run-job)
33
+ - list models (use list-models)
34
+ - list tables in lib xyz (use list-tables)
35
+
36
+ PAGINATION
37
+ If returned length === limit, hint: next start = start + limit. Empty result with start > 1 means paged past end.
38
+
39
+ ERRORS
40
+ Surface backend error directly; never fabricate job names.
41
+ `;
42
+
43
+ let spec = {
44
+ name: 'list-jobs',
45
+ description: description,
46
+ inputSchema: z.object({
47
+ limit: z.number().optional(),
48
+ start: z.number().optional(),
49
+ where: z.string().optional()
50
+ }),
51
+ // No 'server' required; backend context is implicit in helper
52
+ handler: async (params) => {
53
+ // _listJob handles all validation and defaults
54
+ const result = await _listJobs(params);
55
+ return result;
56
+ }
57
+ }
58
+ return spec;
59
+ }
60
+ export default listJobs;
61
+
@@ -1,78 +1,78 @@
1
- /*
2
- * Copyright © 2025, SAS Institute Inc., Cary, NC, USA. All Rights Reserved.
3
- * SPDX-License-Identifier: Apache-2.0
4
- */
5
- import { z } from 'zod';
6
- import _listLibrary from '../toolHelpers/_listLibrary.js';
7
- function listLibraries(_appContext) {
8
- let description = `
9
- list-libraries — enumerate CAS or SAS libraries.
10
-
11
- USE when user asks to: list/show/enumerate libraries, caslibs, sas libs, or available libraries.
12
- DO NOT USE for: listing tables in a library (→ list-tables), column/table metadata, job execution, models, scoring.
13
-
14
- PARAMETERS
15
- - server: 'cas' | 'sas' | 'all' (default: 'all')
16
- - limit: integer > 0 (default: 10)
17
- - start: 1-based offset (default: 1)
18
- - where: optional filter expression (default: '')
19
-
20
- ROUTING RULES
21
- - "cas libs / cas libraries / in cas" → { server: 'cas' }
22
- - "sas libs / sas libraries / in sas" → { server: 'sas' }
23
- - "all libs / all libraries" → { server: 'all' }
24
- - "list tables in <libname>" → route to list-tables, NOT here
25
- - server unspecified → default { server: 'all' }
26
- - "all cas libs" with no limit specified → { server: 'cas', limit: 50 } + paging note
27
- - "next" after prior call (start:S, limit:L) → { start: S + L, limit: L }
28
- - ambiguous "list" or "libs" with no context → assume { server: 'cas' }
29
-
30
- EXAMPLES
31
- - "list libraries" → { server: 'all', start: 1, limit: 10 }
32
- - "list libs " → { server: 'all', start: 1, limit: 10 }
33
-
34
- - "list all libs" → { server: 'all', start: 1, limit: 10 }
35
- - "list cas libraries" → { server: 'cas', start: 1, limit: 10 }
36
- - "show me 25 sas libs" → { server: 'sas', limit: 25, start: 1 }
37
- - "next" (prev: start:1,limit:10) → { server: <same>, start: 11, limit: 10 }
38
- - "filter cas libs" (no filter given) → ask: "What filter expression should I apply?"
39
-
40
- NEGATIVE EXAMPLES (do not route here)
41
- - "list tables in SASHELP" → list-tables
42
- - "list models / jobs / jobdefs"→ respective tools
43
- - "run a program to create a lib" → run-sas-program
44
-
45
- PAGINATION
46
- If returned item count === limit, hint: next start = start + limit.
47
- If start > 1 and result is empty, note paging may have exceeded available items.
48
-
49
- ERRORS
50
- Return structured error with a message field. Never hallucinate library names.
51
- `;
52
-
53
-
54
- // Canonical kebab-case tool name; legacy aliases preserved for compatibility
55
-
56
-
57
- let spec = {
58
- name: 'list-libraries',
59
- description: description,
60
- inputSchema:z.object( {
61
- server: z.string(),
62
- limit: z.number(),
63
- start: z.number(),// added default to match documentation
64
- where: z.string()
65
- }),
66
- // 'server' has a default so we don't mark it required
67
- handler: async (params) => {
68
- // normalize server just in case caller sends 'CAS'/'SAS'
69
- params.server = (params.server || 'all').toLowerCase();
70
-
71
- let r = await _listLibrary(params);
72
- return r;
73
- }
74
- };
75
- return spec;
76
- }
77
- export default listLibraries;
78
-
1
+ /*
2
+ * Copyright © 2025, SAS Institute Inc., Cary, NC, USA. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import { z } from 'zod';
6
+ import _listLibrary from '../toolHelpers/_listLibrary.js';
7
+ function listLibraries(_appContext) {
8
+ let description = `
9
+ list-libraries — enumerate CAS or SAS libraries.
10
+
11
+ USE when user asks to: list/show/enumerate libraries, caslibs, sas libs, or available libraries.
12
+ DO NOT USE for: listing tables in a library (→ list-tables), column/table metadata, job execution, models, scoring.
13
+
14
+ PARAMETERS
15
+ - server: 'cas' | 'sas' | 'all' (default: 'all')
16
+ - limit: integer > 0 (default: 10)
17
+ - start: 1-based offset (default: 1)
18
+ - where: optional filter expression (default: '')
19
+
20
+ ROUTING RULES
21
+ - "cas libs / cas libraries / in cas" → { server: 'cas' }
22
+ - "sas libs / sas libraries / in sas" → { server: 'sas' }
23
+ - "all libs / all libraries" → { server: 'all' }
24
+ - "list tables in <libname>" → route to list-tables, NOT here
25
+ - server unspecified → default { server: 'all' }
26
+ - "all cas libs" with no limit specified → { server: 'cas', limit: 50 } + paging note
27
+ - "next" after prior call (start:S, limit:L) → { start: S + L, limit: L }
28
+ - ambiguous "list" or "libs" with no context → assume { server: 'cas' }
29
+
30
+ EXAMPLES
31
+ - "list libraries" → { server: 'all', start: 1, limit: 10 }
32
+ - "list libs " → { server: 'all', start: 1, limit: 10 }
33
+
34
+ - "list all libs" → { server: 'all', start: 1, limit: 10 }
35
+ - "list cas libraries" → { server: 'cas', start: 1, limit: 10 }
36
+ - "show me 25 sas libs" → { server: 'sas', limit: 25, start: 1 }
37
+ - "next" (prev: start:1,limit:10) → { server: <same>, start: 11, limit: 10 }
38
+ - "filter cas libs" (no filter given) → ask: "What filter expression should I apply?"
39
+
40
+ NEGATIVE EXAMPLES (do not route here)
41
+ - "list tables in SASHELP" → list-tables
42
+ - "list models / jobs / jobdefs"→ respective tools
43
+ - "run a program to create a lib" → run-sas-program
44
+
45
+ PAGINATION
46
+ If returned item count === limit, hint: next start = start + limit.
47
+ If start > 1 and result is empty, note paging may have exceeded available items.
48
+
49
+ ERRORS
50
+ Return structured error with a message field. Never hallucinate library names.
51
+ `;
52
+
53
+
54
+ // Canonical kebab-case tool name; legacy aliases preserved for compatibility
55
+
56
+
57
+ let spec = {
58
+ name: 'list-libraries',
59
+ description: description,
60
+ inputSchema: z.object({
61
+ server: z.string().optional(),
62
+ limit: z.number().optional(),
63
+ start: z.number().optional(),
64
+ where: z.string().optional()
65
+ }),
66
+ // 'server' has a default so we don't mark it required
67
+ handler: async (params) => {
68
+ // normalize server just in case caller sends 'CAS'/'SAS'
69
+ params.server = (params.server || 'all').toLowerCase();
70
+
71
+ let r = await _listLibrary(params);
72
+ return r;
73
+ }
74
+ };
75
+ return spec;
76
+ }
77
+ export default listLibraries;
78
+
@@ -1,56 +1,56 @@
1
- /*
2
- * Copyright © 2025, SAS Institute Inc., Cary, NC, USA. All Rights Reserved.
3
- * SPDX-License-Identifier: Apache-2.0
4
- */
5
-
6
- import { z } from 'zod';
7
- import _listModels from '../toolHelpers/_listModels.js';
8
-
9
- function listModels(_appContext) {
10
- let description = `
11
- list-models — enumerate models published to MAS.
12
-
13
- USE when: list models, show models, browse models, next page
14
- DO NOT USE for: find model, model metadata, score model, list jobs/tables/libraries
15
-
16
- PARAMETERS
17
- - limit: number (default: 10) — page size
18
- - start: number (default: 1) — 1-based offset
19
-
20
- ROUTING RULES
21
- - "list models" → { start:1, limit:10 }
22
- - "list 25 models" → { start:1, limit:25 }
23
- - "next models" → { start: start+limit, limit:10 }
24
-
25
- EXAMPLES
26
- - "list models" → { start:1, limit:10 }
27
- - "list 25 models" → { start:1, limit:25 }
28
-
29
- NEGATIVE EXAMPLES (do not route here)
30
- - "find model X" (use find-model)
31
- - "describe model X" (use model-info)
32
- - "score model X" (use model-score)
33
- - "list jobs" (use list-jobs)
34
-
35
- ERRORS
36
- Returns empty array if no models found.
37
- `;
38
-
39
- let spec = {
40
- name: 'list-models',
41
- description: description,
42
- inputSchema: z.object({
43
- 'limit': z.number(),
44
- 'start': z.number()
45
- }),
46
- handler: async (params) => {
47
- let r = await _listModels(params);
48
- return r;
49
- }
50
- }
51
-
52
- return spec;
53
- }
54
-
55
- export default listModels;
56
-
1
+ /*
2
+ * Copyright © 2025, SAS Institute Inc., Cary, NC, USA. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+
6
+ import { z } from 'zod';
7
+ import _listModels from '../toolHelpers/_listModels.js';
8
+
9
+ function listModels(_appContext) {
10
+ let description = `
11
+ list-models — enumerate models published to MAS.
12
+
13
+ USE when: list models, show models, browse models, next page
14
+ DO NOT USE for: find model, model metadata, score model, list jobs/tables/libraries
15
+
16
+ PARAMETERS
17
+ - limit: number (default: 10) — page size
18
+ - start: number (default: 1) — 1-based offset
19
+
20
+ ROUTING RULES
21
+ - "list models" → { start:1, limit:10 }
22
+ - "list 25 models" → { start:1, limit:25 }
23
+ - "next models" → { start: start+limit, limit:10 }
24
+
25
+ EXAMPLES
26
+ - "list models" → { start:1, limit:10 }
27
+ - "list 25 models" → { start:1, limit:25 }
28
+
29
+ NEGATIVE EXAMPLES (do not route here)
30
+ - "find model X" (use find-model)
31
+ - "describe model X" (use model-info)
32
+ - "score model X" (use model-score)
33
+ - "list jobs" (use list-jobs)
34
+
35
+ ERRORS
36
+ Returns empty array if no models found.
37
+ `;
38
+
39
+ let spec = {
40
+ name: 'list-models',
41
+ description: description,
42
+ inputSchema: z.object({
43
+ limit: z.number().optional(),
44
+ start: z.number().optional()
45
+ }),
46
+ handler: async (params) => {
47
+ let r = await _listModels(params);
48
+ return r;
49
+ }
50
+ }
51
+
52
+ return spec;
53
+ }
54
+
55
+ export default listModels;
56
+