@promptbook/openai 0.89.0-3 → 0.89.0-31

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 (50) hide show
  1. package/README.md +9 -7
  2. package/esm/index.es.js +66 -10
  3. package/esm/index.es.js.map +1 -1
  4. package/esm/typings/servers.d.ts +40 -0
  5. package/esm/typings/src/_packages/core.index.d.ts +20 -8
  6. package/esm/typings/src/_packages/remote-client.index.d.ts +6 -8
  7. package/esm/typings/src/_packages/remote-server.index.d.ts +6 -6
  8. package/esm/typings/src/_packages/types.index.d.ts +24 -12
  9. package/esm/typings/src/cli/cli-commands/login.d.ts +0 -1
  10. package/esm/typings/src/cli/common/$addGlobalOptionsToCommand.d.ts +7 -0
  11. package/esm/typings/src/cli/common/$provideLlmToolsForCli.d.ts +28 -0
  12. package/esm/typings/src/cli/test/ptbk.d.ts +1 -1
  13. package/esm/typings/src/commands/EXPECT/expectCommandParser.d.ts +2 -0
  14. package/esm/typings/src/config.d.ts +24 -26
  15. package/esm/typings/src/errors/0-index.d.ts +9 -0
  16. package/esm/typings/src/errors/AuthenticationError.d.ts +9 -0
  17. package/esm/typings/src/errors/PipelineExecutionError.d.ts +1 -1
  18. package/esm/typings/src/errors/PromptbookFetchError.d.ts +9 -0
  19. package/esm/typings/src/errors/WrappedError.d.ts +10 -0
  20. package/esm/typings/src/errors/assertsError.d.ts +11 -0
  21. package/esm/typings/src/execution/PromptbookFetch.d.ts +1 -1
  22. package/esm/typings/src/llm-providers/_common/register/$provideEnvFilename.d.ts +12 -0
  23. package/esm/typings/src/llm-providers/_common/register/$provideLlmToolsConfigurationFromEnv.d.ts +2 -8
  24. package/esm/typings/src/llm-providers/_common/register/$provideLlmToolsForTestingAndScriptsAndPlayground.d.ts +2 -0
  25. package/esm/typings/src/llm-providers/_common/register/$provideLlmToolsForWizzardOrCli.d.ts +45 -1
  26. package/esm/typings/src/llm-providers/_common/register/$provideLlmToolsFromEnv.d.ts +1 -0
  27. package/esm/typings/src/llm-providers/anthropic-claude/AnthropicClaudeExecutionToolsOptions.d.ts +1 -1
  28. package/esm/typings/src/llm-providers/anthropic-claude/register-configuration.d.ts +1 -1
  29. package/esm/typings/src/remote-server/RemoteServer.d.ts +23 -0
  30. package/esm/typings/src/remote-server/openapi-types.d.ts +284 -0
  31. package/esm/typings/src/remote-server/openapi.d.ts +187 -0
  32. package/esm/typings/src/remote-server/socket-types/_subtypes/{PromptbookServer_Identification.d.ts → Identification.d.ts} +3 -3
  33. package/esm/typings/src/remote-server/socket-types/_subtypes/identificationToPromptbookToken.d.ts +11 -0
  34. package/esm/typings/src/remote-server/socket-types/_subtypes/promptbookTokenToIdentification.d.ts +10 -0
  35. package/esm/typings/src/remote-server/socket-types/listModels/PromptbookServer_ListModels_Request.d.ts +2 -2
  36. package/esm/typings/src/remote-server/socket-types/prepare/PromptbookServer_PreparePipeline_Request.d.ts +2 -2
  37. package/esm/typings/src/remote-server/socket-types/prompt/PromptbookServer_Prompt_Request.d.ts +2 -2
  38. package/esm/typings/src/remote-server/startRemoteServer.d.ts +3 -4
  39. package/esm/typings/src/remote-server/types/RemoteClientOptions.d.ts +4 -12
  40. package/esm/typings/src/remote-server/types/RemoteServerOptions.d.ts +84 -9
  41. package/esm/typings/src/scrapers/_common/utils/{scraperFetch.d.ts → promptbookFetch.d.ts} +2 -2
  42. package/esm/typings/src/storage/env-storage/$EnvStorage.d.ts +40 -0
  43. package/esm/typings/src/types/typeAliases.d.ts +19 -0
  44. package/esm/typings/src/utils/organization/TODO_narrow.d.ts +6 -0
  45. package/package.json +7 -3
  46. package/umd/index.umd.js +66 -10
  47. package/umd/index.umd.js.map +1 -1
  48. package/esm/typings/src/cli/test/ptbk2.d.ts +0 -5
  49. package/esm/typings/src/playground/BrjappConnector.d.ts +0 -67
  50. package/esm/typings/src/playground/brjapp-api-schema.d.ts +0 -12879
@@ -0,0 +1,284 @@
1
+ /**
2
+ * This file was auto-generated by openapi-typescript.
3
+ * Do not make direct changes to the file.
4
+ */
5
+ export type paths = {
6
+ readonly "/": {
7
+ readonly parameters: {
8
+ readonly query?: never;
9
+ readonly header?: never;
10
+ readonly path?: never;
11
+ readonly cookie?: never;
12
+ };
13
+ /**
14
+ * Get server details
15
+ * @description Returns details about the Promptbook server.
16
+ */
17
+ readonly get: {
18
+ readonly parameters: {
19
+ readonly query?: never;
20
+ readonly header?: never;
21
+ readonly path?: never;
22
+ readonly cookie?: never;
23
+ };
24
+ readonly requestBody?: never;
25
+ readonly responses: {
26
+ /** @description Server details in markdown format. */
27
+ readonly 200: {
28
+ headers: {
29
+ readonly [name: string]: unknown;
30
+ };
31
+ content?: never;
32
+ };
33
+ };
34
+ };
35
+ readonly put?: never;
36
+ readonly post?: never;
37
+ readonly delete?: never;
38
+ readonly options?: never;
39
+ readonly head?: never;
40
+ readonly patch?: never;
41
+ readonly trace?: never;
42
+ };
43
+ readonly "/login": {
44
+ readonly parameters: {
45
+ readonly query?: never;
46
+ readonly header?: never;
47
+ readonly path?: never;
48
+ readonly cookie?: never;
49
+ };
50
+ readonly get?: never;
51
+ readonly put?: never;
52
+ /**
53
+ * Login to the server
54
+ * @description Login to the server and get identification.
55
+ */
56
+ readonly post: {
57
+ readonly parameters: {
58
+ readonly query?: never;
59
+ readonly header?: never;
60
+ readonly path?: never;
61
+ readonly cookie?: never;
62
+ };
63
+ readonly requestBody: {
64
+ readonly content: {
65
+ readonly "application/json": {
66
+ readonly username?: string;
67
+ readonly password?: string;
68
+ readonly appId?: string;
69
+ };
70
+ };
71
+ };
72
+ readonly responses: {
73
+ /** @description Successful login */
74
+ readonly 200: {
75
+ headers: {
76
+ readonly [name: string]: unknown;
77
+ };
78
+ content: {
79
+ readonly "application/json": {
80
+ readonly identification?: Record<string, never>;
81
+ };
82
+ };
83
+ };
84
+ };
85
+ };
86
+ readonly delete?: never;
87
+ readonly options?: never;
88
+ readonly head?: never;
89
+ readonly patch?: never;
90
+ readonly trace?: never;
91
+ };
92
+ readonly "/books": {
93
+ readonly parameters: {
94
+ readonly query?: never;
95
+ readonly header?: never;
96
+ readonly path?: never;
97
+ readonly cookie?: never;
98
+ };
99
+ /**
100
+ * List all books
101
+ * @description Returns a list of all available books in the collection.
102
+ */
103
+ readonly get: {
104
+ readonly parameters: {
105
+ readonly query?: never;
106
+ readonly header?: never;
107
+ readonly path?: never;
108
+ readonly cookie?: never;
109
+ };
110
+ readonly requestBody?: never;
111
+ readonly responses: {
112
+ /** @description A list of books. */
113
+ readonly 200: {
114
+ headers: {
115
+ readonly [name: string]: unknown;
116
+ };
117
+ content: {
118
+ readonly "application/json": readonly string[];
119
+ };
120
+ };
121
+ };
122
+ };
123
+ readonly put?: never;
124
+ readonly post?: never;
125
+ readonly delete?: never;
126
+ readonly options?: never;
127
+ readonly head?: never;
128
+ readonly patch?: never;
129
+ readonly trace?: never;
130
+ };
131
+ readonly [path: `/books/${string}`]: {
132
+ readonly parameters: {
133
+ readonly query?: never;
134
+ readonly header?: never;
135
+ readonly path?: never;
136
+ readonly cookie?: never;
137
+ };
138
+ /**
139
+ * Get book content
140
+ * @description Returns the content of a specific book.
141
+ */
142
+ readonly get: {
143
+ readonly parameters: {
144
+ readonly query?: never;
145
+ readonly header?: never;
146
+ readonly path: {
147
+ /** @description The ID of the book to retrieve. */
148
+ readonly bookId: string;
149
+ };
150
+ readonly cookie?: never;
151
+ };
152
+ readonly requestBody?: never;
153
+ readonly responses: {
154
+ /** @description The content of the book. */
155
+ readonly 200: {
156
+ headers: {
157
+ readonly [name: string]: unknown;
158
+ };
159
+ content: {
160
+ readonly "text/markdown": string;
161
+ };
162
+ };
163
+ /** @description Book not found. */
164
+ readonly 404: {
165
+ headers: {
166
+ readonly [name: string]: unknown;
167
+ };
168
+ content?: never;
169
+ };
170
+ };
171
+ };
172
+ readonly put?: never;
173
+ readonly post?: never;
174
+ readonly delete?: never;
175
+ readonly options?: never;
176
+ readonly head?: never;
177
+ readonly patch?: never;
178
+ readonly trace?: never;
179
+ };
180
+ readonly "/executions": {
181
+ readonly parameters: {
182
+ readonly query?: never;
183
+ readonly header?: never;
184
+ readonly path?: never;
185
+ readonly cookie?: never;
186
+ };
187
+ /**
188
+ * List all executions
189
+ * @description Returns a list of all running execution tasks.
190
+ */
191
+ readonly get: {
192
+ readonly parameters: {
193
+ readonly query?: never;
194
+ readonly header?: never;
195
+ readonly path?: never;
196
+ readonly cookie?: never;
197
+ };
198
+ readonly requestBody?: never;
199
+ readonly responses: {
200
+ /** @description A list of execution tasks. */
201
+ readonly 200: {
202
+ headers: {
203
+ readonly [name: string]: unknown;
204
+ };
205
+ content: {
206
+ readonly "application/json": readonly Record<string, never>[];
207
+ };
208
+ };
209
+ };
210
+ };
211
+ readonly put?: never;
212
+ readonly post?: never;
213
+ readonly delete?: never;
214
+ readonly options?: never;
215
+ readonly head?: never;
216
+ readonly patch?: never;
217
+ readonly trace?: never;
218
+ };
219
+ readonly "/executions/new": {
220
+ readonly parameters: {
221
+ readonly query?: never;
222
+ readonly header?: never;
223
+ readonly path?: never;
224
+ readonly cookie?: never;
225
+ };
226
+ readonly get?: never;
227
+ readonly put?: never;
228
+ /**
229
+ * Start a new execution
230
+ * @description Starts a new execution task for a given pipeline.
231
+ */
232
+ readonly post: {
233
+ readonly parameters: {
234
+ readonly query?: never;
235
+ readonly header?: never;
236
+ readonly path?: never;
237
+ readonly cookie?: never;
238
+ };
239
+ readonly requestBody: {
240
+ readonly content: {
241
+ readonly "application/json": {
242
+ readonly pipelineUrl?: string;
243
+ readonly inputParameters?: Record<string, never>;
244
+ readonly identification?: Record<string, never>;
245
+ };
246
+ };
247
+ };
248
+ readonly responses: {
249
+ /** @description The newly created execution task. */
250
+ readonly 200: {
251
+ headers: {
252
+ readonly [name: string]: unknown;
253
+ };
254
+ content: {
255
+ readonly "application/json": Record<string, never>;
256
+ };
257
+ };
258
+ /** @description Invalid input. */
259
+ readonly 400: {
260
+ headers: {
261
+ readonly [name: string]: unknown;
262
+ };
263
+ content?: never;
264
+ };
265
+ };
266
+ };
267
+ readonly delete?: never;
268
+ readonly options?: never;
269
+ readonly head?: never;
270
+ readonly patch?: never;
271
+ readonly trace?: never;
272
+ };
273
+ };
274
+ export type webhooks = Record<string, never>;
275
+ export type components = {
276
+ schemas: never;
277
+ responses: never;
278
+ parameters: never;
279
+ requestBodies: never;
280
+ headers: never;
281
+ pathItems: never;
282
+ };
283
+ export type $defs = Record<string, never>;
284
+ export type operations = Record<string, never>;
@@ -0,0 +1,187 @@
1
+ /**
2
+ * @private !!!! Decide how to expose this
3
+ */
4
+ export declare const openapiJson: {
5
+ openapi: string;
6
+ info: {
7
+ title: string;
8
+ version: string;
9
+ description: string;
10
+ };
11
+ paths: {
12
+ '/': {
13
+ get: {
14
+ summary: string;
15
+ description: string;
16
+ responses: {
17
+ '200': {
18
+ description: string;
19
+ };
20
+ };
21
+ };
22
+ };
23
+ '/login': {
24
+ post: {
25
+ summary: string;
26
+ description: string;
27
+ requestBody: {
28
+ required: boolean;
29
+ content: {
30
+ 'application/json': {
31
+ schema: {
32
+ type: string;
33
+ properties: {
34
+ username: {
35
+ type: string;
36
+ };
37
+ password: {
38
+ type: string;
39
+ };
40
+ appId: {
41
+ type: string;
42
+ };
43
+ };
44
+ };
45
+ };
46
+ };
47
+ };
48
+ responses: {
49
+ '200': {
50
+ description: string;
51
+ content: {
52
+ 'application/json': {
53
+ schema: {
54
+ type: string;
55
+ properties: {
56
+ identification: {
57
+ type: string;
58
+ };
59
+ };
60
+ };
61
+ };
62
+ };
63
+ };
64
+ };
65
+ };
66
+ };
67
+ '/books': {
68
+ get: {
69
+ summary: string;
70
+ description: string;
71
+ responses: {
72
+ '200': {
73
+ description: string;
74
+ content: {
75
+ 'application/json': {
76
+ schema: {
77
+ type: string;
78
+ items: {
79
+ type: string;
80
+ };
81
+ };
82
+ };
83
+ };
84
+ };
85
+ };
86
+ };
87
+ };
88
+ '/books/{bookId}': {
89
+ get: {
90
+ summary: string;
91
+ description: string;
92
+ parameters: {
93
+ in: string;
94
+ name: string;
95
+ required: boolean;
96
+ schema: {
97
+ type: string;
98
+ };
99
+ description: string;
100
+ }[];
101
+ responses: {
102
+ '200': {
103
+ description: string;
104
+ content: {
105
+ 'text/markdown': {
106
+ schema: {
107
+ type: string;
108
+ };
109
+ };
110
+ };
111
+ };
112
+ '404': {
113
+ description: string;
114
+ };
115
+ };
116
+ };
117
+ };
118
+ '/executions': {
119
+ get: {
120
+ summary: string;
121
+ description: string;
122
+ responses: {
123
+ '200': {
124
+ description: string;
125
+ content: {
126
+ 'application/json': {
127
+ schema: {
128
+ type: string;
129
+ items: {
130
+ type: string;
131
+ };
132
+ };
133
+ };
134
+ };
135
+ };
136
+ };
137
+ };
138
+ };
139
+ '/executions/new': {
140
+ post: {
141
+ summary: string;
142
+ description: string;
143
+ requestBody: {
144
+ required: boolean;
145
+ content: {
146
+ 'application/json': {
147
+ schema: {
148
+ type: string;
149
+ properties: {
150
+ pipelineUrl: {
151
+ type: string;
152
+ };
153
+ inputParameters: {
154
+ type: string;
155
+ };
156
+ identification: {
157
+ type: string;
158
+ };
159
+ };
160
+ };
161
+ };
162
+ };
163
+ };
164
+ responses: {
165
+ '200': {
166
+ description: string;
167
+ content: {
168
+ 'application/json': {
169
+ schema: {
170
+ type: string;
171
+ };
172
+ };
173
+ };
174
+ };
175
+ '400': {
176
+ description: string;
177
+ };
178
+ };
179
+ };
180
+ };
181
+ };
182
+ components: {};
183
+ tags: never[];
184
+ };
185
+ /**
186
+ * Note: [💞] Ignore a discrepancy between file name and entity name
187
+ */
@@ -7,14 +7,14 @@ import type { ApplicationRemoteServerClientOptions } from '../../types/RemoteSer
7
7
  * @public exported from `@promptbook/remote-server`
8
8
  * @public exported from `@promptbook/remote-client`
9
9
  */
10
- export type PromptbookServer_Identification<TCustomOptions> = PromptbookServer_ApplicationIdentification<TCustomOptions> | PromptbookServer_AnonymousIdentification;
10
+ export type Identification<TCustomOptions> = ApplicationModeIdentification<TCustomOptions> | AnonymousModeIdentification;
11
11
  /**
12
12
  * Application mode is situation when you run known and well-defined books with your own api keys
13
13
  *
14
14
  * @public exported from `@promptbook/remote-server`
15
15
  * @public exported from `@promptbook/remote-client`
16
16
  */
17
- export type PromptbookServer_ApplicationIdentification<TCustomOptions> = ApplicationRemoteServerClientOptions<TCustomOptions> & {
17
+ export type ApplicationModeIdentification<TCustomOptions> = ApplicationRemoteServerClientOptions<TCustomOptions> & {
18
18
  /**
19
19
  * Application mode
20
20
  */
@@ -29,7 +29,7 @@ export type PromptbookServer_ApplicationIdentification<TCustomOptions> = Applica
29
29
  * @public exported from `@promptbook/remote-server`
30
30
  * @public exported from `@promptbook/remote-client`
31
31
  */
32
- export type PromptbookServer_AnonymousIdentification = {
32
+ export type AnonymousModeIdentification = {
33
33
  /**
34
34
  * Anonymous mode
35
35
  */
@@ -0,0 +1,11 @@
1
+ import type { string_promptbook_token } from '../../../types/typeAliases';
2
+ import type { really_unknown } from '../../../utils/organization/really_unknown';
3
+ import type { ApplicationModeIdentification } from './Identification';
4
+ /**
5
+ * Convert identification to Promptbook token
6
+ *
7
+ * @param identification
8
+ *
9
+ * @public exported from `@promptbook/core`
10
+ */
11
+ export declare function identificationToPromptbookToken(identification: ApplicationModeIdentification<really_unknown>): string_promptbook_token;
@@ -0,0 +1,10 @@
1
+ import type { string_promptbook_token } from '../../../types/typeAliases';
2
+ import type { ApplicationModeIdentification } from './Identification';
3
+ /**
4
+ * Convert Promptbook token to identification
5
+ *
6
+ * @param promptbookToken
7
+ *
8
+ * @public exported from `@promptbook/core`
9
+ */
10
+ export declare function promptbookTokenToIdentification(promptbookToken: string_promptbook_token): ApplicationModeIdentification<undefined>;
@@ -1,4 +1,4 @@
1
- import type { PromptbookServer_Identification } from '../_subtypes/PromptbookServer_Identification';
1
+ import type { Identification } from '../_subtypes/Identification';
2
2
  /**
3
3
  * List models available in the server
4
4
  *
@@ -10,7 +10,7 @@ export type PromptbookServer_ListModels_Request<TCustomOptions> = {
10
10
  /**
11
11
  * Identifier of the end user or application
12
12
  */
13
- readonly identification: PromptbookServer_Identification<TCustomOptions>;
13
+ readonly identification: Identification<TCustomOptions>;
14
14
  };
15
15
  /**
16
16
  * TODO: [🧠] Listing models inanonymous mode does not make sence - keeping only to preserve consistency
@@ -1,5 +1,5 @@
1
1
  import type { PipelineJson } from '../../../pipeline/PipelineJson/PipelineJson';
2
- import type { PromptbookServer_Identification } from '../_subtypes/PromptbookServer_Identification';
2
+ import type { Identification } from '../_subtypes/Identification';
3
3
  /**
4
4
  * This is a request from client to server to prepare a pipeline
5
5
  *
@@ -9,7 +9,7 @@ export type PromptbookServer_PreparePipeline_Request<TCustomOptions> = {
9
9
  /**
10
10
  * Identifier of the end user or application
11
11
  */
12
- readonly identification: PromptbookServer_Identification<TCustomOptions>;
12
+ readonly identification: Identification<TCustomOptions>;
13
13
  /**
14
14
  * The Pipeline to prepare
15
15
  */
@@ -1,5 +1,5 @@
1
1
  import type { Prompt } from '../../../types/Prompt';
2
- import type { PromptbookServer_Identification } from '../_subtypes/PromptbookServer_Identification';
2
+ import type { Identification } from '../_subtypes/Identification';
3
3
  /**
4
4
  * This is a request from client to server to execute a prompt
5
5
  *
@@ -9,7 +9,7 @@ export type PromptbookServer_Prompt_Request<TCustomOptions> = {
9
9
  /**
10
10
  * Identifier of the end user or application
11
11
  */
12
- readonly identification: PromptbookServer_Identification<TCustomOptions>;
12
+ readonly identification: Identification<TCustomOptions>;
13
13
  /**
14
14
  * The Prompt to execute
15
15
  */
@@ -1,4 +1,4 @@
1
- import type { IDestroyable } from 'destroyable';
1
+ import type { RemoteServer } from './RemoteServer';
2
2
  import type { RemoteServerOptions } from './types/RemoteServerOptions';
3
3
  /**
4
4
  * Remote server is a proxy server that uses its execution tools internally and exposes the executor interface externally.
@@ -9,10 +9,9 @@ import type { RemoteServerOptions } from './types/RemoteServerOptions';
9
9
  * @see https://github.com/webgptorg/promptbook#remote-server
10
10
  * @public exported from `@promptbook/remote-server`
11
11
  */
12
- export declare function startRemoteServer<TCustomOptions = undefined>(options: RemoteServerOptions<TCustomOptions>): IDestroyable;
12
+ export declare function startRemoteServer<TCustomOptions = undefined>(options: RemoteServerOptions<TCustomOptions>): RemoteServer;
13
13
  /**
14
- * TODO: !! Add CORS and security - probbably via `helmet`
15
- * TODO: [👩🏾‍🤝‍🧑🏾] Allow to pass custom fetch function here - PromptbookFetch
14
+ * TODO: [🌡] Add CORS and security - probbably via `helmet`
16
15
  * TODO: Split this file into multiple functions - handler for each request
17
16
  * TODO: Maybe use `$exportJson`
18
17
  * TODO: [🧠][🛍] Maybe not `isAnonymous: boolean` BUT `mode: 'ANONYMOUS'|'COLLECTION'`
@@ -1,7 +1,6 @@
1
1
  import type { CommonToolsOptions } from '../../execution/CommonToolsOptions';
2
2
  import type { string_base_url } from '../../types/typeAliases';
3
- import type { string_uri } from '../../types/typeAliases';
4
- import type { PromptbookServer_Identification } from '../socket-types/_subtypes/PromptbookServer_Identification';
3
+ import type { Identification } from '../socket-types/_subtypes/Identification';
5
4
  /**
6
5
  * Options for `RemoteLlmExecutionTools`
7
6
  *
@@ -12,21 +11,14 @@ export type RemoteClientOptions<TCustomOptions> = CommonToolsOptions & {
12
11
  * URL of the remote server
13
12
  * On this server will be connected to the socket.io server
14
13
  */
15
- readonly remoteUrl: string_base_url;
16
- /**
17
- * Path for the Socket.io server to listen
18
- *
19
- * @default '/socket.io'
20
- * @example '/promptbook/socket.io'
21
- */
22
- readonly path: string_uri;
14
+ readonly remoteServerUrl: string_base_url;
23
15
  /**
24
16
  * Identification of client for Socket.io remote server
25
17
  */
26
- readonly identification: PromptbookServer_Identification<TCustomOptions>;
18
+ readonly identification: Identification<TCustomOptions>;
27
19
  };
28
20
  /**
29
21
  * TODO: Pass more options from Socket.io to `RemoteClientOptions` (like `transports`)
30
22
  * TODO: [🧠][🛍] Maybe not `isAnonymous: boolean` BUT `mode: 'ANONYMOUS'|'COLLECTION'`
31
- * TODO: [🧠][🧜‍♂️] Maybe join remoteUrl and path into single value
23
+ * TODO: [🧠][🧜‍♂️] Maybe join remoteServerUrl and path into single value
32
24
  */