@financeable/lenders 0.0.4 → 0.1.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/FUNCTIONS.md +16 -39
- package/README.md +96 -148
- package/RUNTIMES.md +6 -6
- package/bin/mcp-server.js +1482 -1400
- package/bin/mcp-server.js.map +33 -23
- package/dist/commonjs/funcs/createPepperConsumer.d.ts +16 -0
- package/dist/commonjs/funcs/createPepperConsumer.d.ts.map +1 -0
- package/dist/commonjs/funcs/{consumersCreatePepper.js → createPepperConsumer.js} +7 -5
- package/dist/commonjs/funcs/createPepperConsumer.js.map +1 -0
- package/dist/commonjs/hooks/hooks.d.ts +3 -2
- package/dist/commonjs/hooks/hooks.d.ts.map +1 -1
- package/dist/commonjs/hooks/hooks.js.map +1 -1
- package/dist/commonjs/hooks/types.d.ts +4 -6
- package/dist/commonjs/hooks/types.d.ts.map +1 -1
- package/dist/commonjs/index.d.ts +2 -0
- package/dist/commonjs/index.d.ts.map +1 -1
- package/dist/commonjs/index.js +3 -1
- package/dist/commonjs/index.js.map +1 -1
- package/dist/commonjs/lib/config.d.ts +7 -3
- package/dist/commonjs/lib/config.d.ts.map +1 -1
- package/dist/commonjs/lib/config.js +3 -3
- package/dist/commonjs/lib/config.js.map +1 -1
- package/dist/commonjs/lib/files.d.ts +5 -0
- package/dist/commonjs/lib/files.d.ts.map +1 -1
- package/dist/commonjs/lib/files.js +41 -0
- package/dist/commonjs/lib/files.js.map +1 -1
- package/dist/commonjs/lib/matchers.d.ts +6 -11
- package/dist/commonjs/lib/matchers.d.ts.map +1 -1
- package/dist/commonjs/lib/matchers.js +45 -31
- package/dist/commonjs/lib/matchers.js.map +1 -1
- package/dist/commonjs/lib/sdks.d.ts +4 -1
- package/dist/commonjs/lib/sdks.d.ts.map +1 -1
- package/dist/commonjs/lib/sdks.js +21 -22
- package/dist/commonjs/lib/sdks.js.map +1 -1
- package/dist/commonjs/lib/security.d.ts +2 -2
- package/dist/commonjs/lib/security.d.ts.map +1 -1
- package/dist/commonjs/lib/security.js.map +1 -1
- package/dist/commonjs/lib/url.js +1 -1
- package/dist/commonjs/lib/url.js.map +1 -1
- package/dist/commonjs/mcp-server/cli/start/command.d.ts.map +1 -1
- package/dist/commonjs/mcp-server/cli/start/command.js +0 -12
- package/dist/commonjs/mcp-server/cli/start/command.js.map +1 -1
- package/dist/commonjs/mcp-server/cli/start/impl.d.ts +0 -2
- package/dist/commonjs/mcp-server/cli/start/impl.d.ts.map +1 -1
- package/dist/commonjs/mcp-server/cli/start/impl.js +0 -2
- package/dist/commonjs/mcp-server/cli/start/impl.js.map +1 -1
- package/dist/commonjs/mcp-server/mcp-server.js +1 -1
- package/dist/commonjs/mcp-server/server.js +3 -3
- package/dist/commonjs/mcp-server/server.js.map +1 -1
- package/dist/commonjs/mcp-server/tools/{consumersCreatePepper.d.ts → createPepperConsumer.d.ts} +2 -2
- package/dist/commonjs/mcp-server/tools/createPepperConsumer.d.ts.map +1 -0
- package/dist/commonjs/mcp-server/tools/{consumersCreatePepper.js → createPepperConsumer.js} +6 -6
- package/dist/commonjs/mcp-server/tools/createPepperConsumer.js.map +1 -0
- package/dist/commonjs/models/components/apierrorcodes.d.ts +21 -0
- package/dist/commonjs/models/components/apierrorcodes.d.ts.map +1 -1
- package/dist/commonjs/models/components/apierrorcodes.js +7 -0
- package/dist/commonjs/models/components/apierrorcodes.js.map +1 -1
- package/dist/commonjs/models/components/lenders.d.ts +57 -3
- package/dist/commonjs/models/components/lenders.d.ts.map +1 -1
- package/dist/commonjs/models/components/lenders.js +19 -1
- package/dist/commonjs/models/components/lenders.js.map +1 -1
- package/dist/commonjs/models/errors/apierror.d.ts +8 -6
- package/dist/commonjs/models/errors/apierror.d.ts.map +1 -1
- package/dist/commonjs/models/errors/apierror.js +23 -10
- package/dist/commonjs/models/errors/apierror.js.map +1 -1
- package/dist/commonjs/models/errors/createpepperconsumer.d.ts +79 -58
- package/dist/commonjs/models/errors/createpepperconsumer.d.ts.map +1 -1
- package/dist/commonjs/models/errors/createpepperconsumer.js +101 -65
- package/dist/commonjs/models/errors/createpepperconsumer.js.map +1 -1
- package/dist/commonjs/models/errors/financeablelenderserror.d.ts +19 -0
- package/dist/commonjs/models/errors/financeablelenderserror.d.ts.map +1 -0
- package/dist/commonjs/models/errors/financeablelenderserror.js +20 -0
- package/dist/commonjs/models/errors/financeablelenderserror.js.map +1 -0
- package/dist/commonjs/models/errors/index.d.ts +2 -0
- package/dist/commonjs/models/errors/index.d.ts.map +1 -1
- package/dist/commonjs/models/errors/index.js +2 -0
- package/dist/commonjs/models/errors/index.js.map +1 -1
- package/dist/commonjs/models/errors/responsevalidationerror.d.ts +26 -0
- package/dist/commonjs/models/errors/responsevalidationerror.d.ts.map +1 -0
- package/dist/commonjs/models/errors/responsevalidationerror.js +66 -0
- package/dist/commonjs/models/errors/responsevalidationerror.js.map +1 -0
- package/dist/commonjs/models/errors/sdkvalidationerror.d.ts +1 -0
- package/dist/commonjs/models/errors/sdkvalidationerror.d.ts.map +1 -1
- package/dist/commonjs/models/errors/sdkvalidationerror.js +14 -0
- package/dist/commonjs/models/errors/sdkvalidationerror.js.map +1 -1
- package/dist/commonjs/sdk/sdk.d.ts +7 -4
- package/dist/commonjs/sdk/sdk.d.ts.map +1 -1
- package/dist/commonjs/sdk/sdk.js +7 -3
- package/dist/commonjs/sdk/sdk.js.map +1 -1
- package/dist/commonjs/types/constdatetime.js +1 -1
- package/dist/esm/funcs/createPepperConsumer.d.ts +16 -0
- package/dist/esm/funcs/createPepperConsumer.d.ts.map +1 -0
- package/dist/esm/funcs/{consumersCreatePepper.js → createPepperConsumer.js} +6 -4
- package/dist/esm/funcs/createPepperConsumer.js.map +1 -0
- package/dist/esm/hooks/hooks.d.ts +3 -2
- package/dist/esm/hooks/hooks.d.ts.map +1 -1
- package/dist/esm/hooks/hooks.js.map +1 -1
- package/dist/esm/hooks/types.d.ts +4 -6
- package/dist/esm/hooks/types.d.ts.map +1 -1
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/config.d.ts +7 -3
- package/dist/esm/lib/config.d.ts.map +1 -1
- package/dist/esm/lib/config.js +3 -3
- package/dist/esm/lib/config.js.map +1 -1
- package/dist/esm/lib/files.d.ts +5 -0
- package/dist/esm/lib/files.d.ts.map +1 -1
- package/dist/esm/lib/files.js +40 -0
- package/dist/esm/lib/files.js.map +1 -1
- package/dist/esm/lib/matchers.d.ts +6 -11
- package/dist/esm/lib/matchers.d.ts.map +1 -1
- package/dist/esm/lib/matchers.js +43 -30
- package/dist/esm/lib/matchers.js.map +1 -1
- package/dist/esm/lib/sdks.d.ts +4 -1
- package/dist/esm/lib/sdks.d.ts.map +1 -1
- package/dist/esm/lib/sdks.js +21 -22
- package/dist/esm/lib/sdks.js.map +1 -1
- package/dist/esm/lib/security.d.ts +2 -2
- package/dist/esm/lib/security.d.ts.map +1 -1
- package/dist/esm/lib/security.js.map +1 -1
- package/dist/esm/lib/url.js +1 -1
- package/dist/esm/lib/url.js.map +1 -1
- package/dist/esm/mcp-server/cli/start/command.d.ts.map +1 -1
- package/dist/esm/mcp-server/cli/start/command.js +0 -12
- package/dist/esm/mcp-server/cli/start/command.js.map +1 -1
- package/dist/esm/mcp-server/cli/start/impl.d.ts +0 -2
- package/dist/esm/mcp-server/cli/start/impl.d.ts.map +1 -1
- package/dist/esm/mcp-server/cli/start/impl.js +0 -2
- package/dist/esm/mcp-server/cli/start/impl.js.map +1 -1
- package/dist/esm/mcp-server/mcp-server.js +1 -1
- package/dist/esm/mcp-server/server.js +3 -3
- package/dist/esm/mcp-server/server.js.map +1 -1
- package/dist/esm/mcp-server/tools/{consumersCreatePepper.d.ts → createPepperConsumer.d.ts} +2 -2
- package/dist/esm/mcp-server/tools/createPepperConsumer.d.ts.map +1 -0
- package/dist/esm/mcp-server/tools/{consumersCreatePepper.js → createPepperConsumer.js} +5 -5
- package/dist/esm/mcp-server/tools/createPepperConsumer.js.map +1 -0
- package/dist/esm/models/components/apierrorcodes.d.ts +21 -0
- package/dist/esm/models/components/apierrorcodes.d.ts.map +1 -1
- package/dist/esm/models/components/apierrorcodes.js +7 -0
- package/dist/esm/models/components/apierrorcodes.js.map +1 -1
- package/dist/esm/models/components/lenders.d.ts +57 -3
- package/dist/esm/models/components/lenders.d.ts.map +1 -1
- package/dist/esm/models/components/lenders.js +19 -1
- package/dist/esm/models/components/lenders.js.map +1 -1
- package/dist/esm/models/errors/apierror.d.ts +8 -6
- package/dist/esm/models/errors/apierror.d.ts.map +1 -1
- package/dist/esm/models/errors/apierror.js +23 -10
- package/dist/esm/models/errors/apierror.js.map +1 -1
- package/dist/esm/models/errors/createpepperconsumer.d.ts +79 -58
- package/dist/esm/models/errors/createpepperconsumer.d.ts.map +1 -1
- package/dist/esm/models/errors/createpepperconsumer.js +96 -60
- package/dist/esm/models/errors/createpepperconsumer.js.map +1 -1
- package/dist/esm/models/errors/financeablelenderserror.d.ts +19 -0
- package/dist/esm/models/errors/financeablelenderserror.d.ts.map +1 -0
- package/dist/esm/models/errors/financeablelenderserror.js +16 -0
- package/dist/esm/models/errors/financeablelenderserror.js.map +1 -0
- package/dist/esm/models/errors/index.d.ts +2 -0
- package/dist/esm/models/errors/index.d.ts.map +1 -1
- package/dist/esm/models/errors/index.js +2 -0
- package/dist/esm/models/errors/index.js.map +1 -1
- package/dist/esm/models/errors/responsevalidationerror.d.ts +26 -0
- package/dist/esm/models/errors/responsevalidationerror.d.ts.map +1 -0
- package/dist/esm/models/errors/responsevalidationerror.js +29 -0
- package/dist/esm/models/errors/responsevalidationerror.js.map +1 -0
- package/dist/esm/models/errors/sdkvalidationerror.d.ts +1 -0
- package/dist/esm/models/errors/sdkvalidationerror.d.ts.map +1 -1
- package/dist/esm/models/errors/sdkvalidationerror.js +14 -0
- package/dist/esm/models/errors/sdkvalidationerror.js.map +1 -1
- package/dist/esm/sdk/sdk.d.ts +7 -4
- package/dist/esm/sdk/sdk.d.ts.map +1 -1
- package/dist/esm/sdk/sdk.js +7 -3
- package/dist/esm/sdk/sdk.js.map +1 -1
- package/dist/esm/types/constdatetime.js +1 -1
- package/docs/sdks/financeablelenders/README.md +142 -0
- package/examples/README.md +31 -0
- package/examples/createPepperConsumer.example.ts +59 -0
- package/examples/package.json +18 -0
- package/jsr.json +1 -1
- package/package.json +10 -10
- package/src/funcs/{consumersCreatePepper.ts → createPepperConsumer.ts} +41 -35
- package/src/hooks/hooks.ts +2 -2
- package/src/hooks/types.ts +4 -7
- package/src/index.ts +2 -0
- package/src/lib/config.ts +7 -3
- package/src/lib/files.ts +42 -0
- package/src/lib/matchers.ts +64 -41
- package/src/lib/sdks.ts +33 -22
- package/src/lib/security.ts +6 -3
- package/src/lib/url.ts +1 -1
- package/src/mcp-server/cli/start/command.ts +0 -13
- package/src/mcp-server/cli/start/impl.ts +0 -4
- package/src/mcp-server/mcp-server.ts +1 -1
- package/src/mcp-server/server.ts +3 -3
- package/src/mcp-server/tools/{consumersCreatePepper.ts → createPepperConsumer.ts} +4 -4
- package/src/models/components/apierrorcodes.ts +7 -0
- package/src/models/components/lenders.ts +19 -1
- package/src/models/errors/apierror.ts +29 -16
- package/src/models/errors/createpepperconsumer.ts +151 -105
- package/src/models/errors/financeablelenderserror.ts +35 -0
- package/src/models/errors/index.ts +2 -0
- package/src/models/errors/responsevalidationerror.ts +50 -0
- package/src/models/errors/sdkvalidationerror.ts +12 -0
- package/src/sdk/sdk.ts +17 -5
- package/src/types/constdatetime.ts +1 -1
- package/dist/commonjs/funcs/consumersCreatePepper.d.ts +0 -15
- package/dist/commonjs/funcs/consumersCreatePepper.d.ts.map +0 -1
- package/dist/commonjs/funcs/consumersCreatePepper.js.map +0 -1
- package/dist/commonjs/mcp-server/tools/consumersCreatePepper.d.ts.map +0 -1
- package/dist/commonjs/mcp-server/tools/consumersCreatePepper.js.map +0 -1
- package/dist/commonjs/sdk/consumers.d.ts +0 -10
- package/dist/commonjs/sdk/consumers.d.ts.map +0 -1
- package/dist/commonjs/sdk/consumers.js +0 -19
- package/dist/commonjs/sdk/consumers.js.map +0 -1
- package/dist/esm/funcs/consumersCreatePepper.d.ts +0 -15
- package/dist/esm/funcs/consumersCreatePepper.d.ts.map +0 -1
- package/dist/esm/funcs/consumersCreatePepper.js.map +0 -1
- package/dist/esm/mcp-server/tools/consumersCreatePepper.d.ts.map +0 -1
- package/dist/esm/mcp-server/tools/consumersCreatePepper.js.map +0 -1
- package/dist/esm/sdk/consumers.d.ts +0 -10
- package/dist/esm/sdk/consumers.d.ts.map +0 -1
- package/dist/esm/sdk/consumers.js +0 -15
- package/dist/esm/sdk/consumers.js.map +0 -1
- package/docs/sdks/consumers/README.md +0 -163
- package/src/sdk/consumers.ts +0 -25
package/src/lib/matchers.ts
CHANGED
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { APIError } from "../models/errors/apierror.js";
|
|
6
|
-
import {
|
|
7
|
-
import { Result } from "../types/fp.js";
|
|
6
|
+
import { ResponseValidationError } from "../models/errors/responsevalidationerror.js";
|
|
7
|
+
import { ERR, OK, Result } from "../types/fp.js";
|
|
8
8
|
import { matchResponse, matchStatusCode, StatusCodePredicate } from "./http.js";
|
|
9
9
|
import { isPlainObject } from "./is-plain-object.js";
|
|
10
|
-
import { safeParse } from "./schemas.js";
|
|
11
10
|
|
|
12
11
|
export type Encoding =
|
|
12
|
+
| "jsonl"
|
|
13
13
|
| "json"
|
|
14
14
|
| "text"
|
|
15
15
|
| "bytes"
|
|
@@ -19,6 +19,7 @@ export type Encoding =
|
|
|
19
19
|
| "fail";
|
|
20
20
|
|
|
21
21
|
const DEFAULT_CONTENT_TYPES: Record<Encoding, string> = {
|
|
22
|
+
jsonl: "application/jsonl",
|
|
22
23
|
json: "application/json",
|
|
23
24
|
text: "text/plain",
|
|
24
25
|
bytes: "application/octet-stream",
|
|
@@ -72,6 +73,21 @@ export function json<T>(
|
|
|
72
73
|
return { ...options, enc: "json", codes, schema };
|
|
73
74
|
}
|
|
74
75
|
|
|
76
|
+
export function jsonl<T>(
|
|
77
|
+
codes: StatusCodePredicate,
|
|
78
|
+
schema: Schema<T>,
|
|
79
|
+
options?: MatchOptions,
|
|
80
|
+
): ValueMatcher<T> {
|
|
81
|
+
return { ...options, enc: "jsonl", codes, schema };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function jsonlErr<E>(
|
|
85
|
+
codes: StatusCodePredicate,
|
|
86
|
+
schema: Schema<E>,
|
|
87
|
+
options?: MatchOptions,
|
|
88
|
+
): ErrorMatcher<E> {
|
|
89
|
+
return { ...options, err: true, enc: "jsonl", codes, schema };
|
|
90
|
+
}
|
|
75
91
|
export function textErr<E>(
|
|
76
92
|
codes: StatusCodePredicate,
|
|
77
93
|
schema: Schema<E>,
|
|
@@ -159,17 +175,19 @@ export type MatchedError<Matchers> = Matchers extends Matcher<any, infer E>[]
|
|
|
159
175
|
: never;
|
|
160
176
|
export type MatchFunc<T, E> = (
|
|
161
177
|
response: Response,
|
|
178
|
+
request: Request,
|
|
162
179
|
options?: { resultKey?: string; extraFields?: Record<string, unknown> },
|
|
163
180
|
) => Promise<[result: Result<T, E>, raw: unknown]>;
|
|
164
181
|
|
|
165
182
|
export function match<T, E>(
|
|
166
183
|
...matchers: Array<Matcher<T, E>>
|
|
167
|
-
): MatchFunc<T, E | APIError |
|
|
184
|
+
): MatchFunc<T, E | APIError | ResponseValidationError> {
|
|
168
185
|
return async function matchFunc(
|
|
169
186
|
response: Response,
|
|
187
|
+
request: Request,
|
|
170
188
|
options?: { resultKey?: string; extraFields?: Record<string, unknown> },
|
|
171
189
|
): Promise<
|
|
172
|
-
[result: Result<T, E | APIError |
|
|
190
|
+
[result: Result<T, E | APIError | ResponseValidationError>, raw: unknown]
|
|
173
191
|
> {
|
|
174
192
|
let raw: unknown;
|
|
175
193
|
let matcher: Matcher<T, E> | undefined;
|
|
@@ -188,21 +206,25 @@ export function match<T, E>(
|
|
|
188
206
|
}
|
|
189
207
|
|
|
190
208
|
if (!matcher) {
|
|
191
|
-
const responseBody = await response.text();
|
|
192
209
|
return [{
|
|
193
210
|
ok: false,
|
|
194
|
-
error: new APIError(
|
|
195
|
-
"Unexpected API response status or content-type",
|
|
211
|
+
error: new APIError("Unexpected Status or Content-Type", {
|
|
196
212
|
response,
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
213
|
+
request,
|
|
214
|
+
body: await response.text().catch(() => ""),
|
|
215
|
+
}),
|
|
216
|
+
}, raw];
|
|
200
217
|
}
|
|
201
218
|
|
|
202
219
|
const encoding = matcher.enc;
|
|
220
|
+
let body = "";
|
|
203
221
|
switch (encoding) {
|
|
204
222
|
case "json":
|
|
205
|
-
|
|
223
|
+
body = await response.text();
|
|
224
|
+
raw = JSON.parse(body);
|
|
225
|
+
break;
|
|
226
|
+
case "jsonl":
|
|
227
|
+
raw = response.body;
|
|
206
228
|
break;
|
|
207
229
|
case "bytes":
|
|
208
230
|
raw = new Uint8Array(await response.arrayBuffer());
|
|
@@ -211,16 +233,19 @@ export function match<T, E>(
|
|
|
211
233
|
raw = response.body;
|
|
212
234
|
break;
|
|
213
235
|
case "text":
|
|
214
|
-
|
|
236
|
+
body = await response.text();
|
|
237
|
+
raw = body;
|
|
215
238
|
break;
|
|
216
239
|
case "sse":
|
|
217
240
|
raw = response.body;
|
|
218
241
|
break;
|
|
219
242
|
case "nil":
|
|
220
|
-
|
|
243
|
+
body = await response.text();
|
|
244
|
+
raw = undefined;
|
|
221
245
|
break;
|
|
222
246
|
case "fail":
|
|
223
|
-
|
|
247
|
+
body = await response.text();
|
|
248
|
+
raw = body;
|
|
224
249
|
break;
|
|
225
250
|
default:
|
|
226
251
|
encoding satisfies never;
|
|
@@ -230,11 +255,7 @@ export function match<T, E>(
|
|
|
230
255
|
if (matcher.enc === "fail") {
|
|
231
256
|
return [{
|
|
232
257
|
ok: false,
|
|
233
|
-
error: new APIError(
|
|
234
|
-
"API error occurred",
|
|
235
|
-
response,
|
|
236
|
-
typeof raw === "string" ? raw : "",
|
|
237
|
-
),
|
|
258
|
+
error: new APIError("API error occurred", { request, response, body }),
|
|
238
259
|
}, raw];
|
|
239
260
|
}
|
|
240
261
|
|
|
@@ -246,6 +267,9 @@ export function match<T, E>(
|
|
|
246
267
|
...options?.extraFields,
|
|
247
268
|
...(matcher.hdrs ? { Headers: unpackHeaders(response.headers) } : null),
|
|
248
269
|
...(isPlainObject(raw) ? raw : null),
|
|
270
|
+
request$: request,
|
|
271
|
+
response$: response,
|
|
272
|
+
body$: body,
|
|
249
273
|
};
|
|
250
274
|
} else if (resultKey) {
|
|
251
275
|
data = {
|
|
@@ -264,18 +288,20 @@ export function match<T, E>(
|
|
|
264
288
|
}
|
|
265
289
|
|
|
266
290
|
if ("err" in matcher) {
|
|
267
|
-
const result =
|
|
291
|
+
const result = safeParseResponse(
|
|
268
292
|
data,
|
|
269
293
|
(v: unknown) => matcher.schema.parse(v),
|
|
270
294
|
"Response validation failed",
|
|
295
|
+
{ request, response, body },
|
|
271
296
|
);
|
|
272
297
|
return [result.ok ? { ok: false, error: result.value } : result, raw];
|
|
273
298
|
} else {
|
|
274
299
|
return [
|
|
275
|
-
|
|
300
|
+
safeParseResponse(
|
|
276
301
|
data,
|
|
277
302
|
(v: unknown) => matcher.schema.parse(v),
|
|
278
303
|
"Response validation failed",
|
|
304
|
+
{ request, response, body },
|
|
279
305
|
),
|
|
280
306
|
raw,
|
|
281
307
|
];
|
|
@@ -298,25 +324,22 @@ export function unpackHeaders(headers: Headers): Record<string, string[]> {
|
|
|
298
324
|
return out;
|
|
299
325
|
}
|
|
300
326
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
export async function discardResponseBody(res: Response) {
|
|
308
|
-
const reader = res.body?.getReader();
|
|
309
|
-
if (reader == null) {
|
|
310
|
-
return;
|
|
311
|
-
}
|
|
312
|
-
|
|
327
|
+
function safeParseResponse<Inp, Out>(
|
|
328
|
+
rawValue: Inp,
|
|
329
|
+
fn: (value: Inp) => Out,
|
|
330
|
+
errorMessage: string,
|
|
331
|
+
httpMeta: { response: Response; request: Request; body: string },
|
|
332
|
+
): Result<Out, ResponseValidationError> {
|
|
313
333
|
try {
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
334
|
+
return OK(fn(rawValue));
|
|
335
|
+
} catch (err) {
|
|
336
|
+
return ERR(
|
|
337
|
+
new ResponseValidationError(errorMessage, {
|
|
338
|
+
cause: err,
|
|
339
|
+
rawValue,
|
|
340
|
+
rawMessage: errorMessage,
|
|
341
|
+
...httpMeta,
|
|
342
|
+
}),
|
|
343
|
+
);
|
|
321
344
|
}
|
|
322
345
|
}
|
package/src/lib/sdks.ts
CHANGED
|
@@ -47,12 +47,14 @@ export type RequestOptions = {
|
|
|
47
47
|
*/
|
|
48
48
|
serverURL?: string | URL;
|
|
49
49
|
/**
|
|
50
|
+
* @deprecated `fetchOptions` has been flattened into `RequestOptions`.
|
|
51
|
+
*
|
|
50
52
|
* Sets various request options on the `fetch` call made by an SDK method.
|
|
51
53
|
*
|
|
52
54
|
* @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Request/Request#options|Request}
|
|
53
55
|
*/
|
|
54
56
|
fetchOptions?: Omit<RequestInit, "method" | "body">;
|
|
55
|
-
}
|
|
57
|
+
} & Omit<RequestInit, "method" | "body">;
|
|
56
58
|
|
|
57
59
|
type RequestConfig = {
|
|
58
60
|
method: string;
|
|
@@ -63,6 +65,7 @@ type RequestConfig = {
|
|
|
63
65
|
headers?: HeadersInit;
|
|
64
66
|
security?: SecurityState | null;
|
|
65
67
|
uaHeader?: string;
|
|
68
|
+
userAgent?: string | undefined;
|
|
66
69
|
timeoutMs?: number;
|
|
67
70
|
};
|
|
68
71
|
|
|
@@ -94,19 +97,20 @@ export class ClientSDK {
|
|
|
94
97
|
} else {
|
|
95
98
|
this.#hooks = new SDKHooks();
|
|
96
99
|
}
|
|
97
|
-
|
|
100
|
+
const defaultHttpClient = new HTTPClient();
|
|
101
|
+
options.httpClient = options.httpClient || defaultHttpClient;
|
|
102
|
+
options = this.#hooks.sdkInit(options);
|
|
98
103
|
|
|
99
104
|
const url = serverURLFromOptions(options);
|
|
100
105
|
if (url) {
|
|
101
106
|
url.pathname = url.pathname.replace(/\/+$/, "") + "/";
|
|
102
107
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
this.#
|
|
109
|
-
this.#logger = options.debugLogger;
|
|
108
|
+
this._baseURL = url;
|
|
109
|
+
this.#httpClient = options.httpClient || defaultHttpClient;
|
|
110
|
+
|
|
111
|
+
this._options = { ...options, hooks: this.#hooks };
|
|
112
|
+
|
|
113
|
+
this.#logger = this._options.debugLogger;
|
|
110
114
|
if (!this.#logger && env().FINACEABLELENDERS_DEBUG) {
|
|
111
115
|
this.#logger = console;
|
|
112
116
|
}
|
|
@@ -172,7 +176,9 @@ export class ClientSDK {
|
|
|
172
176
|
cookie = cookie.startsWith("; ") ? cookie.slice(2) : cookie;
|
|
173
177
|
headers.set("cookie", cookie);
|
|
174
178
|
|
|
175
|
-
const userHeaders = new Headers(
|
|
179
|
+
const userHeaders = new Headers(
|
|
180
|
+
options?.headers ?? options?.fetchOptions?.headers,
|
|
181
|
+
);
|
|
176
182
|
for (const [k, v] of userHeaders) {
|
|
177
183
|
headers.set(k, v);
|
|
178
184
|
}
|
|
@@ -180,23 +186,22 @@ export class ClientSDK {
|
|
|
180
186
|
// Only set user agent header in non-browser-like environments since CORS
|
|
181
187
|
// policy disallows setting it in browsers e.g. Chrome throws an error.
|
|
182
188
|
if (!isBrowserLike) {
|
|
183
|
-
headers.set(
|
|
189
|
+
headers.set(
|
|
190
|
+
conf.uaHeader ?? "user-agent",
|
|
191
|
+
conf.userAgent ?? SDK_METADATA.userAgent,
|
|
192
|
+
);
|
|
184
193
|
}
|
|
185
194
|
|
|
186
|
-
|
|
195
|
+
const fetchOptions: Omit<RequestInit, "method" | "body"> = {
|
|
196
|
+
...options?.fetchOptions,
|
|
197
|
+
...options,
|
|
198
|
+
};
|
|
187
199
|
if (!fetchOptions?.signal && conf.timeoutMs && conf.timeoutMs > 0) {
|
|
188
200
|
const timeoutSignal = AbortSignal.timeout(conf.timeoutMs);
|
|
189
|
-
|
|
190
|
-
fetchOptions = { signal: timeoutSignal };
|
|
191
|
-
} else {
|
|
192
|
-
fetchOptions.signal = timeoutSignal;
|
|
193
|
-
}
|
|
201
|
+
fetchOptions.signal = timeoutSignal;
|
|
194
202
|
}
|
|
195
203
|
|
|
196
204
|
if (conf.body instanceof ReadableStream) {
|
|
197
|
-
if (!fetchOptions) {
|
|
198
|
-
fetchOptions = {};
|
|
199
|
-
}
|
|
200
205
|
Object.assign(fetchOptions, { duplex: "half" });
|
|
201
206
|
}
|
|
202
207
|
|
|
@@ -302,7 +307,9 @@ export class ClientSDK {
|
|
|
302
307
|
}
|
|
303
308
|
}
|
|
304
309
|
|
|
305
|
-
const jsonLikeContentTypeRE =
|
|
310
|
+
const jsonLikeContentTypeRE = /(application|text)\/.*?\+*json.*/;
|
|
311
|
+
const jsonlLikeContentTypeRE =
|
|
312
|
+
/(application|text)\/(.*?\+*\bjsonl\b.*|.*?\+*\bx-ndjson\b.*)/;
|
|
306
313
|
async function logRequest(logger: Logger | undefined, req: Request) {
|
|
307
314
|
if (!logger) {
|
|
308
315
|
return;
|
|
@@ -368,9 +375,13 @@ async function logResponse(
|
|
|
368
375
|
logger.group("Body:");
|
|
369
376
|
switch (true) {
|
|
370
377
|
case matchContentType(res, "application/json")
|
|
371
|
-
|| jsonLikeContentTypeRE.test(ct):
|
|
378
|
+
|| jsonLikeContentTypeRE.test(ct) && !jsonlLikeContentTypeRE.test(ct):
|
|
372
379
|
logger.log(await res.clone().json());
|
|
373
380
|
break;
|
|
381
|
+
case matchContentType(res, "application/jsonl")
|
|
382
|
+
|| jsonlLikeContentTypeRE.test(ct):
|
|
383
|
+
logger.log(await res.clone().text());
|
|
384
|
+
break;
|
|
374
385
|
case matchContentType(res, "text/event-stream"):
|
|
375
386
|
logger.log(`<${contentType}>`);
|
|
376
387
|
break;
|
package/src/lib/security.ts
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
type OAuth2PasswordFlow = {
|
|
6
6
|
username: string;
|
|
7
|
-
password
|
|
8
|
-
clientID
|
|
7
|
+
password: string;
|
|
8
|
+
clientID?: string | undefined;
|
|
9
9
|
clientSecret?: string | undefined;
|
|
10
10
|
tokenURL: string;
|
|
11
11
|
};
|
|
@@ -81,7 +81,10 @@ type SecurityInputOAuth2 = {
|
|
|
81
81
|
type SecurityInputOAuth2ClientCredentials = {
|
|
82
82
|
type: "oauth2:client_credentials";
|
|
83
83
|
value:
|
|
84
|
-
| {
|
|
84
|
+
| {
|
|
85
|
+
clientID?: string | undefined;
|
|
86
|
+
clientSecret?: string | undefined;
|
|
87
|
+
}
|
|
85
88
|
| null
|
|
86
89
|
| string
|
|
87
90
|
| undefined;
|
package/src/lib/url.ts
CHANGED
|
@@ -10,7 +10,7 @@ export function pathToFunc(
|
|
|
10
10
|
pathPattern: string,
|
|
11
11
|
options?: { charEncoding?: "percent" | "none" },
|
|
12
12
|
): (params?: Params) => string {
|
|
13
|
-
const paramRE = /\{([a-zA-Z0-9_]
|
|
13
|
+
const paramRE = /\{([a-zA-Z0-9_][a-zA-Z0-9_-]*?)\}/g;
|
|
14
14
|
|
|
15
15
|
return function buildURLPath(params: Record<string, unknown> = {}): string {
|
|
16
16
|
return pathPattern.replace(paramRE, function (_, placeholder) {
|
|
@@ -6,7 +6,6 @@ import { buildCommand } from "@stricli/core";
|
|
|
6
6
|
import { numberParser } from "@stricli/core";
|
|
7
7
|
import * as z from "zod";
|
|
8
8
|
import { consoleLoggerLevels } from "../../console-logger.js";
|
|
9
|
-
import { mcpScopes } from "../../scopes.js";
|
|
10
9
|
|
|
11
10
|
export const startCommand = buildCommand({
|
|
12
11
|
loader: async () => {
|
|
@@ -37,18 +36,6 @@ export const startCommand = buildCommand({
|
|
|
37
36
|
return z.string().parse(value);
|
|
38
37
|
},
|
|
39
38
|
},
|
|
40
|
-
...(mcpScopes.length
|
|
41
|
-
? {
|
|
42
|
-
scope: {
|
|
43
|
-
kind: "enum",
|
|
44
|
-
brief:
|
|
45
|
-
"Mount tools/resources that match given scope (repeatable flag)",
|
|
46
|
-
values: mcpScopes,
|
|
47
|
-
variadic: true,
|
|
48
|
-
optional: true,
|
|
49
|
-
},
|
|
50
|
-
}
|
|
51
|
-
: {}),
|
|
52
39
|
"server-url": {
|
|
53
40
|
kind: "parsed",
|
|
54
41
|
brief: "Overrides the default server URL used by the SDK",
|
|
@@ -11,14 +11,12 @@ import {
|
|
|
11
11
|
ConsoleLoggerLevel,
|
|
12
12
|
createConsoleLogger,
|
|
13
13
|
} from "../../console-logger.js";
|
|
14
|
-
import { MCPScope } from "../../scopes.js";
|
|
15
14
|
import { createMCPServer } from "../../server.js";
|
|
16
15
|
|
|
17
16
|
interface StartCommandFlags {
|
|
18
17
|
readonly transport: "stdio" | "sse";
|
|
19
18
|
readonly port: number;
|
|
20
19
|
readonly tool?: string[];
|
|
21
|
-
readonly scope?: MCPScope[];
|
|
22
20
|
readonly "server-url"?: string;
|
|
23
21
|
readonly "server-index"?: SDKOptions["serverIdx"];
|
|
24
22
|
readonly "log-level": ConsoleLoggerLevel;
|
|
@@ -48,7 +46,6 @@ async function startStdio(flags: StartCommandFlags) {
|
|
|
48
46
|
const server = createMCPServer({
|
|
49
47
|
logger,
|
|
50
48
|
allowedTools: flags.tool,
|
|
51
|
-
scopes: flags.scope,
|
|
52
49
|
serverURL: flags["server-url"],
|
|
53
50
|
serverIdx: flags["server-index"],
|
|
54
51
|
});
|
|
@@ -68,7 +65,6 @@ async function startSSE(flags: StartCommandFlags) {
|
|
|
68
65
|
const mcpServer = createMCPServer({
|
|
69
66
|
logger,
|
|
70
67
|
allowedTools: flags.tool,
|
|
71
|
-
scopes: flags.scope,
|
|
72
68
|
serverURL: flags["server-url"],
|
|
73
69
|
serverIdx: flags["server-index"],
|
|
74
70
|
});
|
package/src/mcp-server/server.ts
CHANGED
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
} from "./resources.js";
|
|
14
14
|
import { MCPScope } from "./scopes.js";
|
|
15
15
|
import { createRegisterTool } from "./tools.js";
|
|
16
|
-
import { tool$
|
|
16
|
+
import { tool$createPepperConsumer } from "./tools/createPepperConsumer.js";
|
|
17
17
|
|
|
18
18
|
export function createMCPServer(deps: {
|
|
19
19
|
logger: ConsoleLogger;
|
|
@@ -24,7 +24,7 @@ export function createMCPServer(deps: {
|
|
|
24
24
|
}) {
|
|
25
25
|
const server = new McpServer({
|
|
26
26
|
name: "FinanceableLenders",
|
|
27
|
-
version: "0.
|
|
27
|
+
version: "0.1.1",
|
|
28
28
|
});
|
|
29
29
|
|
|
30
30
|
const client = new FinanceableLendersCore({
|
|
@@ -53,7 +53,7 @@ export function createMCPServer(deps: {
|
|
|
53
53
|
const register = { tool, resource, resourceTemplate, prompt };
|
|
54
54
|
void register; // suppress unused warnings
|
|
55
55
|
|
|
56
|
-
tool(tool$
|
|
56
|
+
tool(tool$createPepperConsumer);
|
|
57
57
|
|
|
58
58
|
return server;
|
|
59
59
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { createPepperConsumer } from "../../funcs/createPepperConsumer.js";
|
|
6
6
|
import * as components from "../../models/components/index.js";
|
|
7
7
|
import { formatResult, ToolDefinition } from "../tools.js";
|
|
8
8
|
|
|
@@ -10,12 +10,12 @@ const args = {
|
|
|
10
10
|
request: components.PepperConsumerRequest$inboundSchema,
|
|
11
11
|
};
|
|
12
12
|
|
|
13
|
-
export const tool$
|
|
14
|
-
name: "
|
|
13
|
+
export const tool$createPepperConsumer: ToolDefinition<typeof args> = {
|
|
14
|
+
name: "create-pepper-consumer",
|
|
15
15
|
description: `Pepper Consumer route`,
|
|
16
16
|
args,
|
|
17
17
|
tool: async (client, args, ctx) => {
|
|
18
|
-
const [result, apiCall] = await
|
|
18
|
+
const [result, apiCall] = await createPepperConsumer(
|
|
19
19
|
client,
|
|
20
20
|
args.request,
|
|
21
21
|
{ fetchOptions: { signal: ctx.signal } },
|
|
@@ -18,6 +18,13 @@ export const ApiErrorCodes = {
|
|
|
18
18
|
NotFound: "NOT_FOUND",
|
|
19
19
|
MethodNotAllowed: "METHOD_NOT_ALLOWED",
|
|
20
20
|
Conflict: "CONFLICT",
|
|
21
|
+
MissingDocumentError: "MISSING_DOCUMENT_ERROR",
|
|
22
|
+
MaxRetriesExceededError: "MAX_RETRIES_EXCEEDED_ERROR",
|
|
23
|
+
DocumentFileTransferError: "DOCUMENT_FILE_TRANSFER_ERROR",
|
|
24
|
+
DocumentProcessingError: "DOCUMENT_PROCESSING_ERROR",
|
|
25
|
+
DocumentValidationError: "DOCUMENT_VALIDATION_ERROR",
|
|
26
|
+
DocumentExpiredError: "DOCUMENT_EXPIRED_ERROR",
|
|
27
|
+
DocumentInvalidError: "DOCUMENT_INVALID_ERROR",
|
|
21
28
|
} as const;
|
|
22
29
|
export type ApiErrorCodes = ClosedEnum<typeof ApiErrorCodes>;
|
|
23
30
|
|
|
@@ -15,11 +15,29 @@ export const Lenders = {
|
|
|
15
15
|
Wisr: "Wisr",
|
|
16
16
|
Latitude: "Latitude",
|
|
17
17
|
Dynamoney: "Dynamoney",
|
|
18
|
-
Metro: "Metro",
|
|
19
18
|
FinanceOne: "FinanceOne",
|
|
20
19
|
Westpac: "Westpac",
|
|
21
20
|
Money3: "Money3",
|
|
22
21
|
Plenti: "Plenti",
|
|
22
|
+
Now: "Now",
|
|
23
|
+
Flexi: "Flexi",
|
|
24
|
+
Metro: "Metro",
|
|
25
|
+
Angle: "Angle",
|
|
26
|
+
Financeone: "Financeone",
|
|
27
|
+
Eastcap: "Eastcap",
|
|
28
|
+
Branded: "Branded",
|
|
29
|
+
Liberty: "Liberty",
|
|
30
|
+
Moneyme: "Moneyme",
|
|
31
|
+
Autopay: "Autopay",
|
|
32
|
+
Firstmac: "Firstmac",
|
|
33
|
+
Moneyplace: "Moneyplace",
|
|
34
|
+
Azora: "Azora",
|
|
35
|
+
Resimac: "Resimac",
|
|
36
|
+
Ammf: "Ammf",
|
|
37
|
+
Scotpac: "Scotpac",
|
|
38
|
+
Afs: "Afs",
|
|
39
|
+
WestpacDriveExpress: "WestpacDriveExpress",
|
|
40
|
+
WestpacEF: "WestpacEF",
|
|
23
41
|
} as const;
|
|
24
42
|
/**
|
|
25
43
|
* Lenders
|
|
@@ -2,26 +2,39 @@
|
|
|
2
2
|
* Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
public readonly statusCode: number;
|
|
7
|
-
public readonly contentType: string;
|
|
5
|
+
import { FinanceableLendersError } from "./financeablelenderserror.js";
|
|
8
6
|
|
|
7
|
+
/** The fallback error class if no more specific error class is matched */
|
|
8
|
+
export class APIError extends FinanceableLendersError {
|
|
9
9
|
constructor(
|
|
10
10
|
message: string,
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
httpMeta: {
|
|
12
|
+
response: Response;
|
|
13
|
+
request: Request;
|
|
14
|
+
body: string;
|
|
15
|
+
},
|
|
13
16
|
) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
17
|
+
if (message) {
|
|
18
|
+
message += `: `;
|
|
19
|
+
}
|
|
20
|
+
message += `Status ${httpMeta.response.status}`;
|
|
21
|
+
const contentType = httpMeta.response.headers.get("content-type") || `""`;
|
|
22
|
+
if (contentType !== "application/json") {
|
|
23
|
+
message += ` Content-Type ${
|
|
24
|
+
contentType.includes(" ") ? `"${contentType}"` : contentType
|
|
25
|
+
}`;
|
|
26
|
+
}
|
|
27
|
+
const body = httpMeta.body || `""`;
|
|
28
|
+
message += body.length > 100 ? "\n" : ". ";
|
|
29
|
+
let bodyDisplay = body;
|
|
30
|
+
if (body.length > 10000) {
|
|
31
|
+
const truncated = body.substring(0, 10000);
|
|
32
|
+
const remaining = body.length - 10000;
|
|
33
|
+
bodyDisplay = `${truncated}...and ${remaining} more chars`;
|
|
34
|
+
}
|
|
35
|
+
message += `Body: ${bodyDisplay}`;
|
|
36
|
+
message = message.trim();
|
|
37
|
+
super(message, httpMeta);
|
|
25
38
|
this.name = "APIError";
|
|
26
39
|
}
|
|
27
40
|
}
|