@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.
Files changed (226) hide show
  1. package/FUNCTIONS.md +16 -39
  2. package/README.md +96 -148
  3. package/RUNTIMES.md +6 -6
  4. package/bin/mcp-server.js +1482 -1400
  5. package/bin/mcp-server.js.map +33 -23
  6. package/dist/commonjs/funcs/createPepperConsumer.d.ts +16 -0
  7. package/dist/commonjs/funcs/createPepperConsumer.d.ts.map +1 -0
  8. package/dist/commonjs/funcs/{consumersCreatePepper.js → createPepperConsumer.js} +7 -5
  9. package/dist/commonjs/funcs/createPepperConsumer.js.map +1 -0
  10. package/dist/commonjs/hooks/hooks.d.ts +3 -2
  11. package/dist/commonjs/hooks/hooks.d.ts.map +1 -1
  12. package/dist/commonjs/hooks/hooks.js.map +1 -1
  13. package/dist/commonjs/hooks/types.d.ts +4 -6
  14. package/dist/commonjs/hooks/types.d.ts.map +1 -1
  15. package/dist/commonjs/index.d.ts +2 -0
  16. package/dist/commonjs/index.d.ts.map +1 -1
  17. package/dist/commonjs/index.js +3 -1
  18. package/dist/commonjs/index.js.map +1 -1
  19. package/dist/commonjs/lib/config.d.ts +7 -3
  20. package/dist/commonjs/lib/config.d.ts.map +1 -1
  21. package/dist/commonjs/lib/config.js +3 -3
  22. package/dist/commonjs/lib/config.js.map +1 -1
  23. package/dist/commonjs/lib/files.d.ts +5 -0
  24. package/dist/commonjs/lib/files.d.ts.map +1 -1
  25. package/dist/commonjs/lib/files.js +41 -0
  26. package/dist/commonjs/lib/files.js.map +1 -1
  27. package/dist/commonjs/lib/matchers.d.ts +6 -11
  28. package/dist/commonjs/lib/matchers.d.ts.map +1 -1
  29. package/dist/commonjs/lib/matchers.js +45 -31
  30. package/dist/commonjs/lib/matchers.js.map +1 -1
  31. package/dist/commonjs/lib/sdks.d.ts +4 -1
  32. package/dist/commonjs/lib/sdks.d.ts.map +1 -1
  33. package/dist/commonjs/lib/sdks.js +21 -22
  34. package/dist/commonjs/lib/sdks.js.map +1 -1
  35. package/dist/commonjs/lib/security.d.ts +2 -2
  36. package/dist/commonjs/lib/security.d.ts.map +1 -1
  37. package/dist/commonjs/lib/security.js.map +1 -1
  38. package/dist/commonjs/lib/url.js +1 -1
  39. package/dist/commonjs/lib/url.js.map +1 -1
  40. package/dist/commonjs/mcp-server/cli/start/command.d.ts.map +1 -1
  41. package/dist/commonjs/mcp-server/cli/start/command.js +0 -12
  42. package/dist/commonjs/mcp-server/cli/start/command.js.map +1 -1
  43. package/dist/commonjs/mcp-server/cli/start/impl.d.ts +0 -2
  44. package/dist/commonjs/mcp-server/cli/start/impl.d.ts.map +1 -1
  45. package/dist/commonjs/mcp-server/cli/start/impl.js +0 -2
  46. package/dist/commonjs/mcp-server/cli/start/impl.js.map +1 -1
  47. package/dist/commonjs/mcp-server/mcp-server.js +1 -1
  48. package/dist/commonjs/mcp-server/server.js +3 -3
  49. package/dist/commonjs/mcp-server/server.js.map +1 -1
  50. package/dist/commonjs/mcp-server/tools/{consumersCreatePepper.d.ts → createPepperConsumer.d.ts} +2 -2
  51. package/dist/commonjs/mcp-server/tools/createPepperConsumer.d.ts.map +1 -0
  52. package/dist/commonjs/mcp-server/tools/{consumersCreatePepper.js → createPepperConsumer.js} +6 -6
  53. package/dist/commonjs/mcp-server/tools/createPepperConsumer.js.map +1 -0
  54. package/dist/commonjs/models/components/apierrorcodes.d.ts +21 -0
  55. package/dist/commonjs/models/components/apierrorcodes.d.ts.map +1 -1
  56. package/dist/commonjs/models/components/apierrorcodes.js +7 -0
  57. package/dist/commonjs/models/components/apierrorcodes.js.map +1 -1
  58. package/dist/commonjs/models/components/lenders.d.ts +57 -3
  59. package/dist/commonjs/models/components/lenders.d.ts.map +1 -1
  60. package/dist/commonjs/models/components/lenders.js +19 -1
  61. package/dist/commonjs/models/components/lenders.js.map +1 -1
  62. package/dist/commonjs/models/errors/apierror.d.ts +8 -6
  63. package/dist/commonjs/models/errors/apierror.d.ts.map +1 -1
  64. package/dist/commonjs/models/errors/apierror.js +23 -10
  65. package/dist/commonjs/models/errors/apierror.js.map +1 -1
  66. package/dist/commonjs/models/errors/createpepperconsumer.d.ts +79 -58
  67. package/dist/commonjs/models/errors/createpepperconsumer.d.ts.map +1 -1
  68. package/dist/commonjs/models/errors/createpepperconsumer.js +101 -65
  69. package/dist/commonjs/models/errors/createpepperconsumer.js.map +1 -1
  70. package/dist/commonjs/models/errors/financeablelenderserror.d.ts +19 -0
  71. package/dist/commonjs/models/errors/financeablelenderserror.d.ts.map +1 -0
  72. package/dist/commonjs/models/errors/financeablelenderserror.js +20 -0
  73. package/dist/commonjs/models/errors/financeablelenderserror.js.map +1 -0
  74. package/dist/commonjs/models/errors/index.d.ts +2 -0
  75. package/dist/commonjs/models/errors/index.d.ts.map +1 -1
  76. package/dist/commonjs/models/errors/index.js +2 -0
  77. package/dist/commonjs/models/errors/index.js.map +1 -1
  78. package/dist/commonjs/models/errors/responsevalidationerror.d.ts +26 -0
  79. package/dist/commonjs/models/errors/responsevalidationerror.d.ts.map +1 -0
  80. package/dist/commonjs/models/errors/responsevalidationerror.js +66 -0
  81. package/dist/commonjs/models/errors/responsevalidationerror.js.map +1 -0
  82. package/dist/commonjs/models/errors/sdkvalidationerror.d.ts +1 -0
  83. package/dist/commonjs/models/errors/sdkvalidationerror.d.ts.map +1 -1
  84. package/dist/commonjs/models/errors/sdkvalidationerror.js +14 -0
  85. package/dist/commonjs/models/errors/sdkvalidationerror.js.map +1 -1
  86. package/dist/commonjs/sdk/sdk.d.ts +7 -4
  87. package/dist/commonjs/sdk/sdk.d.ts.map +1 -1
  88. package/dist/commonjs/sdk/sdk.js +7 -3
  89. package/dist/commonjs/sdk/sdk.js.map +1 -1
  90. package/dist/commonjs/types/constdatetime.js +1 -1
  91. package/dist/esm/funcs/createPepperConsumer.d.ts +16 -0
  92. package/dist/esm/funcs/createPepperConsumer.d.ts.map +1 -0
  93. package/dist/esm/funcs/{consumersCreatePepper.js → createPepperConsumer.js} +6 -4
  94. package/dist/esm/funcs/createPepperConsumer.js.map +1 -0
  95. package/dist/esm/hooks/hooks.d.ts +3 -2
  96. package/dist/esm/hooks/hooks.d.ts.map +1 -1
  97. package/dist/esm/hooks/hooks.js.map +1 -1
  98. package/dist/esm/hooks/types.d.ts +4 -6
  99. package/dist/esm/hooks/types.d.ts.map +1 -1
  100. package/dist/esm/index.d.ts +2 -0
  101. package/dist/esm/index.d.ts.map +1 -1
  102. package/dist/esm/index.js +1 -0
  103. package/dist/esm/index.js.map +1 -1
  104. package/dist/esm/lib/config.d.ts +7 -3
  105. package/dist/esm/lib/config.d.ts.map +1 -1
  106. package/dist/esm/lib/config.js +3 -3
  107. package/dist/esm/lib/config.js.map +1 -1
  108. package/dist/esm/lib/files.d.ts +5 -0
  109. package/dist/esm/lib/files.d.ts.map +1 -1
  110. package/dist/esm/lib/files.js +40 -0
  111. package/dist/esm/lib/files.js.map +1 -1
  112. package/dist/esm/lib/matchers.d.ts +6 -11
  113. package/dist/esm/lib/matchers.d.ts.map +1 -1
  114. package/dist/esm/lib/matchers.js +43 -30
  115. package/dist/esm/lib/matchers.js.map +1 -1
  116. package/dist/esm/lib/sdks.d.ts +4 -1
  117. package/dist/esm/lib/sdks.d.ts.map +1 -1
  118. package/dist/esm/lib/sdks.js +21 -22
  119. package/dist/esm/lib/sdks.js.map +1 -1
  120. package/dist/esm/lib/security.d.ts +2 -2
  121. package/dist/esm/lib/security.d.ts.map +1 -1
  122. package/dist/esm/lib/security.js.map +1 -1
  123. package/dist/esm/lib/url.js +1 -1
  124. package/dist/esm/lib/url.js.map +1 -1
  125. package/dist/esm/mcp-server/cli/start/command.d.ts.map +1 -1
  126. package/dist/esm/mcp-server/cli/start/command.js +0 -12
  127. package/dist/esm/mcp-server/cli/start/command.js.map +1 -1
  128. package/dist/esm/mcp-server/cli/start/impl.d.ts +0 -2
  129. package/dist/esm/mcp-server/cli/start/impl.d.ts.map +1 -1
  130. package/dist/esm/mcp-server/cli/start/impl.js +0 -2
  131. package/dist/esm/mcp-server/cli/start/impl.js.map +1 -1
  132. package/dist/esm/mcp-server/mcp-server.js +1 -1
  133. package/dist/esm/mcp-server/server.js +3 -3
  134. package/dist/esm/mcp-server/server.js.map +1 -1
  135. package/dist/esm/mcp-server/tools/{consumersCreatePepper.d.ts → createPepperConsumer.d.ts} +2 -2
  136. package/dist/esm/mcp-server/tools/createPepperConsumer.d.ts.map +1 -0
  137. package/dist/esm/mcp-server/tools/{consumersCreatePepper.js → createPepperConsumer.js} +5 -5
  138. package/dist/esm/mcp-server/tools/createPepperConsumer.js.map +1 -0
  139. package/dist/esm/models/components/apierrorcodes.d.ts +21 -0
  140. package/dist/esm/models/components/apierrorcodes.d.ts.map +1 -1
  141. package/dist/esm/models/components/apierrorcodes.js +7 -0
  142. package/dist/esm/models/components/apierrorcodes.js.map +1 -1
  143. package/dist/esm/models/components/lenders.d.ts +57 -3
  144. package/dist/esm/models/components/lenders.d.ts.map +1 -1
  145. package/dist/esm/models/components/lenders.js +19 -1
  146. package/dist/esm/models/components/lenders.js.map +1 -1
  147. package/dist/esm/models/errors/apierror.d.ts +8 -6
  148. package/dist/esm/models/errors/apierror.d.ts.map +1 -1
  149. package/dist/esm/models/errors/apierror.js +23 -10
  150. package/dist/esm/models/errors/apierror.js.map +1 -1
  151. package/dist/esm/models/errors/createpepperconsumer.d.ts +79 -58
  152. package/dist/esm/models/errors/createpepperconsumer.d.ts.map +1 -1
  153. package/dist/esm/models/errors/createpepperconsumer.js +96 -60
  154. package/dist/esm/models/errors/createpepperconsumer.js.map +1 -1
  155. package/dist/esm/models/errors/financeablelenderserror.d.ts +19 -0
  156. package/dist/esm/models/errors/financeablelenderserror.d.ts.map +1 -0
  157. package/dist/esm/models/errors/financeablelenderserror.js +16 -0
  158. package/dist/esm/models/errors/financeablelenderserror.js.map +1 -0
  159. package/dist/esm/models/errors/index.d.ts +2 -0
  160. package/dist/esm/models/errors/index.d.ts.map +1 -1
  161. package/dist/esm/models/errors/index.js +2 -0
  162. package/dist/esm/models/errors/index.js.map +1 -1
  163. package/dist/esm/models/errors/responsevalidationerror.d.ts +26 -0
  164. package/dist/esm/models/errors/responsevalidationerror.d.ts.map +1 -0
  165. package/dist/esm/models/errors/responsevalidationerror.js +29 -0
  166. package/dist/esm/models/errors/responsevalidationerror.js.map +1 -0
  167. package/dist/esm/models/errors/sdkvalidationerror.d.ts +1 -0
  168. package/dist/esm/models/errors/sdkvalidationerror.d.ts.map +1 -1
  169. package/dist/esm/models/errors/sdkvalidationerror.js +14 -0
  170. package/dist/esm/models/errors/sdkvalidationerror.js.map +1 -1
  171. package/dist/esm/sdk/sdk.d.ts +7 -4
  172. package/dist/esm/sdk/sdk.d.ts.map +1 -1
  173. package/dist/esm/sdk/sdk.js +7 -3
  174. package/dist/esm/sdk/sdk.js.map +1 -1
  175. package/dist/esm/types/constdatetime.js +1 -1
  176. package/docs/sdks/financeablelenders/README.md +142 -0
  177. package/examples/README.md +31 -0
  178. package/examples/createPepperConsumer.example.ts +59 -0
  179. package/examples/package.json +18 -0
  180. package/jsr.json +1 -1
  181. package/package.json +10 -10
  182. package/src/funcs/{consumersCreatePepper.ts → createPepperConsumer.ts} +41 -35
  183. package/src/hooks/hooks.ts +2 -2
  184. package/src/hooks/types.ts +4 -7
  185. package/src/index.ts +2 -0
  186. package/src/lib/config.ts +7 -3
  187. package/src/lib/files.ts +42 -0
  188. package/src/lib/matchers.ts +64 -41
  189. package/src/lib/sdks.ts +33 -22
  190. package/src/lib/security.ts +6 -3
  191. package/src/lib/url.ts +1 -1
  192. package/src/mcp-server/cli/start/command.ts +0 -13
  193. package/src/mcp-server/cli/start/impl.ts +0 -4
  194. package/src/mcp-server/mcp-server.ts +1 -1
  195. package/src/mcp-server/server.ts +3 -3
  196. package/src/mcp-server/tools/{consumersCreatePepper.ts → createPepperConsumer.ts} +4 -4
  197. package/src/models/components/apierrorcodes.ts +7 -0
  198. package/src/models/components/lenders.ts +19 -1
  199. package/src/models/errors/apierror.ts +29 -16
  200. package/src/models/errors/createpepperconsumer.ts +151 -105
  201. package/src/models/errors/financeablelenderserror.ts +35 -0
  202. package/src/models/errors/index.ts +2 -0
  203. package/src/models/errors/responsevalidationerror.ts +50 -0
  204. package/src/models/errors/sdkvalidationerror.ts +12 -0
  205. package/src/sdk/sdk.ts +17 -5
  206. package/src/types/constdatetime.ts +1 -1
  207. package/dist/commonjs/funcs/consumersCreatePepper.d.ts +0 -15
  208. package/dist/commonjs/funcs/consumersCreatePepper.d.ts.map +0 -1
  209. package/dist/commonjs/funcs/consumersCreatePepper.js.map +0 -1
  210. package/dist/commonjs/mcp-server/tools/consumersCreatePepper.d.ts.map +0 -1
  211. package/dist/commonjs/mcp-server/tools/consumersCreatePepper.js.map +0 -1
  212. package/dist/commonjs/sdk/consumers.d.ts +0 -10
  213. package/dist/commonjs/sdk/consumers.d.ts.map +0 -1
  214. package/dist/commonjs/sdk/consumers.js +0 -19
  215. package/dist/commonjs/sdk/consumers.js.map +0 -1
  216. package/dist/esm/funcs/consumersCreatePepper.d.ts +0 -15
  217. package/dist/esm/funcs/consumersCreatePepper.d.ts.map +0 -1
  218. package/dist/esm/funcs/consumersCreatePepper.js.map +0 -1
  219. package/dist/esm/mcp-server/tools/consumersCreatePepper.d.ts.map +0 -1
  220. package/dist/esm/mcp-server/tools/consumersCreatePepper.js.map +0 -1
  221. package/dist/esm/sdk/consumers.d.ts +0 -10
  222. package/dist/esm/sdk/consumers.d.ts.map +0 -1
  223. package/dist/esm/sdk/consumers.js +0 -15
  224. package/dist/esm/sdk/consumers.js.map +0 -1
  225. package/docs/sdks/consumers/README.md +0 -163
  226. package/src/sdk/consumers.ts +0 -25
@@ -3,13 +3,13 @@
3
3
  */
4
4
 
5
5
  import { APIError } from "../models/errors/apierror.js";
6
- import { SDKValidationError } from "../models/errors/sdkvalidationerror.js";
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 | SDKValidationError> {
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 | SDKValidationError>, raw: unknown]
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
- responseBody,
198
- ),
199
- }, responseBody];
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
- raw = await response.json();
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
- raw = await response.text();
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
- raw = await discardResponseBody(response);
243
+ body = await response.text();
244
+ raw = undefined;
221
245
  break;
222
246
  case "fail":
223
- raw = await response.text();
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 = safeParse(
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
- safeParse(
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
- * Discards the response body to free up resources.
303
- *
304
- * To learn why this is need, see the undici docs:
305
- * https://undici.nodejs.org/#/?id=garbage-collection
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
- let done = false;
315
- while (!done) {
316
- const res = await reader.read();
317
- done = res.done;
318
- }
319
- } finally {
320
- reader.releaseLock();
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
- this._options = { ...options, hooks: this.#hooks };
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
- const { baseURL, client } = this.#hooks.sdkInit({
104
- baseURL: url,
105
- client: options.httpClient || new HTTPClient(),
106
- });
107
- this._baseURL = baseURL;
108
- this.#httpClient = client;
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(options?.fetchOptions?.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(conf.uaHeader ?? "user-agent", SDK_METADATA.userAgent);
189
+ headers.set(
190
+ conf.uaHeader ?? "user-agent",
191
+ conf.userAgent ?? SDK_METADATA.userAgent,
192
+ );
184
193
  }
185
194
 
186
- let fetchOptions = options?.fetchOptions;
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
- if (!fetchOptions) {
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 = /^application\/(?:.{0,100}\+)?json/;
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;
@@ -4,8 +4,8 @@
4
4
 
5
5
  type OAuth2PasswordFlow = {
6
6
  username: string;
7
- password?: string | undefined;
8
- clientID: string;
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
- | { clientID?: string | undefined; clientSecret?: string | undefined }
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_]+?)\}/g;
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
  });
@@ -19,7 +19,7 @@ const routes = buildRouteMap({
19
19
  export const app = buildApplication(routes, {
20
20
  name: "mcp",
21
21
  versionInfo: {
22
- currentVersion: "0.0.4",
22
+ currentVersion: "0.1.1",
23
23
  },
24
24
  });
25
25
 
@@ -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$consumersCreatePepper } from "./tools/consumersCreatePepper.js";
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.0.4",
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$consumersCreatePepper);
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 { consumersCreatePepper } from "../../funcs/consumersCreatePepper.js";
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$consumersCreatePepper: ToolDefinition<typeof args> = {
14
- name: "consumers-create-pepper",
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 consumersCreatePepper(
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
- export class APIError extends Error {
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
- public readonly rawResponse: Response,
12
- public readonly body: string = "",
11
+ httpMeta: {
12
+ response: Response;
13
+ request: Request;
14
+ body: string;
15
+ },
13
16
  ) {
14
- const statusCode = rawResponse.status;
15
- const contentType = rawResponse.headers.get("content-type") || "";
16
- const bodyString = body.length > 0 ? `\n${body}` : "";
17
-
18
- super(
19
- `${message}: Status ${statusCode} Content-Type ${contentType} Body ${bodyString}`,
20
- );
21
-
22
- this.statusCode = statusCode;
23
- this.contentType = contentType;
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
  }