@lssm/lib.contracts 0.0.0-canary-20251217063201 → 0.0.0-canary-20251217072406

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 (239) hide show
  1. package/dist/app-config/app-config.feature.js +53 -1
  2. package/dist/app-config/contracts.d.ts +50 -50
  3. package/dist/app-config/contracts.js +396 -1
  4. package/dist/app-config/docs/app-config.docblock.js +22 -220
  5. package/dist/app-config/events.d.ts +27 -27
  6. package/dist/app-config/events.js +168 -1
  7. package/dist/app-config/index.js +8 -1
  8. package/dist/app-config/lifecycle-contracts.d.ts +80 -80
  9. package/dist/app-config/lifecycle-contracts.js +441 -1
  10. package/dist/app-config/runtime.js +617 -1
  11. package/dist/app-config/spec.js +36 -1
  12. package/dist/app-config/validation.js +538 -1
  13. package/dist/capabilities/docs/capabilities.docblock.js +22 -1
  14. package/dist/capabilities/openbanking.js +92 -1
  15. package/dist/capabilities.js +50 -1
  16. package/dist/client/index.js +9 -1
  17. package/dist/client/react/drivers/rn-reusables.js +21 -1
  18. package/dist/client/react/drivers/shadcn.js +11 -1
  19. package/dist/client/react/feature-render.js +43 -1
  20. package/dist/client/react/form-render.js +298 -1
  21. package/dist/client/react/index.js +8 -1
  22. package/dist/contract-registry/index.js +3 -1
  23. package/dist/contract-registry/schemas.js +61 -1
  24. package/dist/contracts-adapter-hydration.js +41 -1
  25. package/dist/contracts-adapter-input.js +77 -1
  26. package/dist/data-views/docs/data-views.docblock.js +22 -1
  27. package/dist/data-views/query-generator.js +48 -1
  28. package/dist/data-views/runtime.js +39 -1
  29. package/dist/data-views.js +35 -1
  30. package/dist/docs/PUBLISHING.docblock.js +17 -76
  31. package/dist/docs/accessibility_wcag_compliance_specs.docblock.js +17 -350
  32. package/dist/docs/index.js +33 -1
  33. package/dist/docs/meta.docs.js +15 -2
  34. package/dist/docs/presentations.js +77 -1
  35. package/dist/docs/registry.js +51 -1
  36. package/dist/docs/tech/PHASE_1_QUICKSTART.docblock.js +17 -383
  37. package/dist/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS.docblock.js +17 -68
  38. package/dist/docs/tech/PHASE_3_AUTO_EVOLUTION.docblock.js +17 -140
  39. package/dist/docs/tech/PHASE_4_PERSONALIZATION_ENGINE.docblock.js +17 -86
  40. package/dist/docs/tech/PHASE_5_ZERO_TOUCH_OPERATIONS.docblock.js +17 -1
  41. package/dist/docs/tech/auth/better-auth-nextjs.docblock.js +25 -2
  42. package/dist/docs/tech/contracts/README.docblock.js +21 -1
  43. package/dist/docs/tech/contracts/create-subscription.docblock.js +21 -1
  44. package/dist/docs/tech/contracts/graphql-typed-outputs.docblock.js +21 -180
  45. package/dist/docs/tech/contracts/migrations.docblock.js +21 -1
  46. package/dist/docs/tech/contracts/openapi-export.docblock.js +22 -2
  47. package/dist/docs/tech/contracts/ops-to-presentation-linking.docblock.js +19 -60
  48. package/dist/docs/tech/contracts/overlays.docblock.js +21 -68
  49. package/dist/docs/tech/contracts/tests.docblock.js +21 -132
  50. package/dist/docs/tech/contracts/themes.docblock.js +21 -1
  51. package/dist/docs/tech/contracts/vertical-pocket-family-office.docblock.js +21 -106
  52. package/dist/docs/tech/lifecycle-stage-system.docblock.js +17 -213
  53. package/dist/docs/tech/llm/llm-integration.docblock.js +74 -5
  54. package/dist/docs/tech/mcp-endpoints.docblock.js +38 -1
  55. package/dist/docs/tech/presentation-runtime.docblock.js +17 -1
  56. package/dist/docs/tech/schema/README.docblock.js +21 -262
  57. package/dist/docs/tech/studio/learning-events.docblock.js +49 -1
  58. package/dist/docs/tech/studio/learning-journeys.docblock.js +25 -2
  59. package/dist/docs/tech/studio/platform-admin-panel.docblock.js +24 -2
  60. package/dist/docs/tech/studio/project-access-teams.docblock.js +26 -16
  61. package/dist/docs/tech/studio/project-routing.docblock.js +68 -1
  62. package/dist/docs/tech/studio/sandbox-unlogged.docblock.js +23 -2
  63. package/dist/docs/tech/studio/team-invitations.docblock.js +41 -36
  64. package/dist/docs/tech/studio/workspace-ops.docblock.js +48 -1
  65. package/dist/docs/tech/studio/workspaces.docblock.js +24 -2
  66. package/dist/docs/tech/telemetry-ingest.docblock.js +37 -3
  67. package/dist/docs/tech/templates/runtime.docblock.js +21 -1
  68. package/dist/docs/tech/vscode-extension.docblock.js +37 -3
  69. package/dist/docs/tech/workflows/overview.docblock.js +21 -1
  70. package/dist/docs/tech-contracts.docs.js +19 -2
  71. package/dist/events.js +12 -1
  72. package/dist/experiments/docs/experiments.docblock.js +22 -128
  73. package/dist/experiments/evaluator.js +101 -1
  74. package/dist/experiments/spec.js +33 -1
  75. package/dist/features.js +68 -1
  76. package/dist/forms/docs/forms.docblock.js +22 -1
  77. package/dist/forms.js +119 -1
  78. package/dist/index.js +107 -1
  79. package/dist/install.js +40 -1
  80. package/dist/integrations/contracts.d.ts +102 -102
  81. package/dist/integrations/contracts.js +388 -1
  82. package/dist/integrations/docs/integrations.docblock.js +95 -1
  83. package/dist/integrations/health.js +69 -1
  84. package/dist/integrations/index.js +23 -1
  85. package/dist/integrations/openbanking/contracts/accounts.d.ts +66 -66
  86. package/dist/integrations/openbanking/contracts/accounts.js +237 -1
  87. package/dist/integrations/openbanking/contracts/balances.d.ts +34 -34
  88. package/dist/integrations/openbanking/contracts/balances.js +167 -1
  89. package/dist/integrations/openbanking/contracts/index.js +12 -1
  90. package/dist/integrations/openbanking/contracts/transactions.d.ts +48 -48
  91. package/dist/integrations/openbanking/contracts/transactions.js +218 -1
  92. package/dist/integrations/openbanking/guards.js +32 -1
  93. package/dist/integrations/openbanking/models.d.ts +55 -55
  94. package/dist/integrations/openbanking/models.js +242 -1
  95. package/dist/integrations/openbanking/openbanking.feature.js +68 -1
  96. package/dist/integrations/openbanking/telemetry.js +39 -1
  97. package/dist/integrations/providers/elevenlabs.js +56 -1
  98. package/dist/integrations/providers/gcs-storage.js +79 -1
  99. package/dist/integrations/providers/gmail.js +91 -1
  100. package/dist/integrations/providers/google-calendar.js +70 -1
  101. package/dist/integrations/providers/impls/elevenlabs-voice.js +95 -1
  102. package/dist/integrations/providers/impls/gcs-storage.js +88 -1
  103. package/dist/integrations/providers/impls/gmail-inbound.js +200 -1
  104. package/dist/integrations/providers/impls/gmail-outbound.js +104 -5
  105. package/dist/integrations/providers/impls/google-calendar.js +154 -1
  106. package/dist/integrations/providers/impls/index.js +16 -1
  107. package/dist/integrations/providers/impls/mistral-embedding.js +41 -1
  108. package/dist/integrations/providers/impls/mistral-llm.js +247 -1
  109. package/dist/integrations/providers/impls/postmark-email.js +55 -1
  110. package/dist/integrations/providers/impls/powens-client.js +171 -1
  111. package/dist/integrations/providers/impls/powens-openbanking.js +218 -1
  112. package/dist/integrations/providers/impls/provider-factory.js +142 -1
  113. package/dist/integrations/providers/impls/qdrant-vector.js +69 -1
  114. package/dist/integrations/providers/impls/stripe-payments.js +202 -1
  115. package/dist/integrations/providers/impls/twilio-sms.js +58 -1
  116. package/dist/integrations/providers/index.js +13 -1
  117. package/dist/integrations/providers/mistral.js +72 -1
  118. package/dist/integrations/providers/postmark.js +72 -1
  119. package/dist/integrations/providers/powens.js +120 -1
  120. package/dist/integrations/providers/qdrant.js +77 -1
  121. package/dist/integrations/providers/registry.js +34 -1
  122. package/dist/integrations/providers/stripe.js +87 -1
  123. package/dist/integrations/providers/twilio-sms.js +65 -1
  124. package/dist/integrations/runtime.js +186 -1
  125. package/dist/integrations/secrets/aws-secret-manager.js +231 -1
  126. package/dist/integrations/secrets/env-secret-provider.js +81 -1
  127. package/dist/integrations/secrets/gcp-secret-manager.js +229 -1
  128. package/dist/integrations/secrets/index.js +8 -1
  129. package/dist/integrations/secrets/manager.js +103 -1
  130. package/dist/integrations/secrets/provider.js +58 -1
  131. package/dist/integrations/secrets/scaleway-secret-manager.js +247 -1
  132. package/dist/integrations/spec.js +39 -1
  133. package/dist/jobs/define-job.js +16 -1
  134. package/dist/jobs/gcp-cloud-tasks.js +53 -1
  135. package/dist/jobs/gcp-pubsub.js +39 -1
  136. package/dist/jobs/handlers/gmail-sync-handler.js +9 -1
  137. package/dist/jobs/handlers/index.js +12 -1
  138. package/dist/jobs/handlers/ping-handler.js +15 -1
  139. package/dist/jobs/handlers/storage-document-handler.js +14 -1
  140. package/dist/jobs/index.js +4 -1
  141. package/dist/jobs/memory-queue.js +71 -1
  142. package/dist/jobs/queue.js +33 -1
  143. package/dist/jobs/scaleway-sqs-queue.js +153 -1
  144. package/dist/jsonschema.d.ts +3 -3
  145. package/dist/jsonschema.js +32 -1
  146. package/dist/knowledge/contracts.d.ts +66 -66
  147. package/dist/knowledge/contracts.js +317 -1
  148. package/dist/knowledge/docs/knowledge.docblock.js +22 -138
  149. package/dist/knowledge/index.js +10 -1
  150. package/dist/knowledge/ingestion/document-processor.js +54 -1
  151. package/dist/knowledge/ingestion/embedding-service.js +25 -1
  152. package/dist/knowledge/ingestion/gmail-adapter.js +50 -5
  153. package/dist/knowledge/ingestion/index.js +7 -1
  154. package/dist/knowledge/ingestion/storage-adapter.js +26 -1
  155. package/dist/knowledge/ingestion/vector-indexer.js +32 -1
  156. package/dist/knowledge/query/index.js +3 -1
  157. package/dist/knowledge/query/service.js +64 -2
  158. package/dist/knowledge/runtime.js +49 -1
  159. package/dist/knowledge/spaces/email-threads.js +38 -1
  160. package/dist/knowledge/spaces/financial-docs.js +38 -1
  161. package/dist/knowledge/spaces/financial-overview.js +42 -1
  162. package/dist/knowledge/spaces/index.js +8 -1
  163. package/dist/knowledge/spaces/product-canon.js +38 -1
  164. package/dist/knowledge/spaces/support-faq.js +41 -1
  165. package/dist/knowledge/spaces/uploaded-docs.js +38 -1
  166. package/dist/knowledge/spec.js +39 -1
  167. package/dist/llm/exporters.js +541 -8
  168. package/dist/llm/index.js +4 -1
  169. package/dist/llm/prompts.js +246 -56
  170. package/dist/markdown.js +116 -3
  171. package/dist/migrations.js +33 -1
  172. package/dist/onboarding-base.d.ts +29 -29
  173. package/dist/onboarding-base.js +196 -1
  174. package/dist/openapi.js +75 -1
  175. package/dist/openbanking/docs/openbanking.docblock.js +22 -109
  176. package/dist/ownership.js +40 -1
  177. package/dist/policy/docs/policy.docblock.js +22 -1
  178. package/dist/policy/engine.js +223 -1
  179. package/dist/policy/opa-adapter.js +71 -1
  180. package/dist/policy/spec.js +33 -1
  181. package/dist/presentations/docs/presentations-conventions.docblock.js +21 -7
  182. package/dist/presentations.backcompat.js +47 -1
  183. package/dist/presentations.d.ts +3 -3
  184. package/dist/presentations.js +66 -1
  185. package/dist/presentations.v2.js +278 -6
  186. package/dist/prompt.js +10 -1
  187. package/dist/promptRegistry.js +34 -1
  188. package/dist/regenerator/docs/regenerator.docblock.js +22 -184
  189. package/dist/regenerator/executor.js +86 -1
  190. package/dist/regenerator/index.js +6 -1
  191. package/dist/regenerator/service.js +92 -1
  192. package/dist/regenerator/sinks.js +32 -1
  193. package/dist/regenerator/utils.js +51 -1
  194. package/dist/registry.js +208 -1
  195. package/dist/resources.js +47 -1
  196. package/dist/schema/dist/EnumType.js +2 -1
  197. package/dist/schema/dist/FieldType.js +49 -1
  198. package/dist/schema/dist/ScalarTypeEnum.js +236 -1
  199. package/dist/schema/dist/SchemaModel.js +39 -1
  200. package/dist/schema/dist/entity/defineEntity.js +1 -1
  201. package/dist/schema/dist/entity/index.js +2 -1
  202. package/dist/schema/dist/entity/types.js +1 -1
  203. package/dist/schema/dist/index.js +6 -1
  204. package/dist/schema-to-markdown.js +214 -10
  205. package/dist/server/graphql-pothos.js +128 -1
  206. package/dist/server/index.js +10 -1
  207. package/dist/server/mcp/createMcpServer.js +28 -1
  208. package/dist/server/mcp/registerPresentations.js +151 -1
  209. package/dist/server/mcp/registerPrompts.js +36 -2
  210. package/dist/server/mcp/registerResources.js +35 -1
  211. package/dist/server/mcp/registerTools.js +22 -1
  212. package/dist/server/provider-mcp.js +3 -1
  213. package/dist/server/rest-elysia.js +20 -1
  214. package/dist/server/rest-express.js +39 -1
  215. package/dist/server/rest-generic.js +125 -1
  216. package/dist/server/rest-next-app.js +38 -1
  217. package/dist/server/rest-next-mcp.js +45 -1
  218. package/dist/server/rest-next-pages.js +25 -1
  219. package/dist/spec.js +35 -1
  220. package/dist/telemetry/anomaly.js +48 -1
  221. package/dist/telemetry/docs/telemetry.docblock.js +22 -139
  222. package/dist/telemetry/index.js +5 -1
  223. package/dist/telemetry/spec.js +69 -1
  224. package/dist/telemetry/tracker.js +76 -1
  225. package/dist/tests/index.js +4 -1
  226. package/dist/tests/runner.js +150 -1
  227. package/dist/tests/spec.js +33 -1
  228. package/dist/themes.js +39 -1
  229. package/dist/workflow/adapters/db-adapter.js +83 -1
  230. package/dist/workflow/adapters/file-adapter.js +11 -1
  231. package/dist/workflow/adapters/index.js +5 -1
  232. package/dist/workflow/adapters/memory-store.js +58 -1
  233. package/dist/workflow/expression.js +98 -1
  234. package/dist/workflow/index.js +9 -1
  235. package/dist/workflow/runner.js +337 -1
  236. package/dist/workflow/sla-monitor.js +47 -1
  237. package/dist/workflow/spec.js +32 -1
  238. package/dist/workflow/validation.js +175 -1
  239. package/package.json +11 -4
@@ -1 +1,16 @@
1
- import{ElevenLabsVoiceProvider as e}from"./elevenlabs-voice.js";import{GoogleCloudStorageProvider as t}from"./gcs-storage.js";import{GmailInboundProvider as n}from"./gmail-inbound.js";import{GmailOutboundProvider as r}from"./gmail-outbound.js";import{GoogleCalendarProvider as i}from"./google-calendar.js";import{MistralLLMProvider as a}from"./mistral-llm.js";import{MistralEmbeddingProvider as o}from"./mistral-embedding.js";import{QdrantVectorProvider as s}from"./qdrant-vector.js";import{StripePaymentsProvider as c}from"./stripe-payments.js";import{PostmarkEmailProvider as l}from"./postmark-email.js";import{TwilioSmsProvider as u}from"./twilio-sms.js";import{PowensClient as d,PowensClientError as f}from"./powens-client.js";import{PowensOpenBankingProvider as p}from"./powens-openbanking.js";import{IntegrationProviderFactory as m}from"./provider-factory.js";export{e as ElevenLabsVoiceProvider,n as GmailInboundProvider,r as GmailOutboundProvider,i as GoogleCalendarProvider,t as GoogleCloudStorageProvider,m as IntegrationProviderFactory,o as MistralEmbeddingProvider,a as MistralLLMProvider,l as PostmarkEmailProvider,d as PowensClient,f as PowensClientError,p as PowensOpenBankingProvider,s as QdrantVectorProvider,c as StripePaymentsProvider,u as TwilioSmsProvider};
1
+ import { ElevenLabsVoiceProvider } from "./elevenlabs-voice.js";
2
+ import { GoogleCloudStorageProvider } from "./gcs-storage.js";
3
+ import { GmailInboundProvider } from "./gmail-inbound.js";
4
+ import { GmailOutboundProvider } from "./gmail-outbound.js";
5
+ import { GoogleCalendarProvider } from "./google-calendar.js";
6
+ import { MistralLLMProvider } from "./mistral-llm.js";
7
+ import { MistralEmbeddingProvider } from "./mistral-embedding.js";
8
+ import { QdrantVectorProvider } from "./qdrant-vector.js";
9
+ import { StripePaymentsProvider } from "./stripe-payments.js";
10
+ import { PostmarkEmailProvider } from "./postmark-email.js";
11
+ import { TwilioSmsProvider } from "./twilio-sms.js";
12
+ import { PowensClient, PowensClientError } from "./powens-client.js";
13
+ import { PowensOpenBankingProvider } from "./powens-openbanking.js";
14
+ import { IntegrationProviderFactory } from "./provider-factory.js";
15
+
16
+ export { ElevenLabsVoiceProvider, GmailInboundProvider, GmailOutboundProvider, GoogleCalendarProvider, GoogleCloudStorageProvider, IntegrationProviderFactory, MistralEmbeddingProvider, MistralLLMProvider, PostmarkEmailProvider, PowensClient, PowensClientError, PowensOpenBankingProvider, QdrantVectorProvider, StripePaymentsProvider, TwilioSmsProvider };
@@ -1 +1,41 @@
1
- import{Mistral as e}from"@mistralai/mistralai";var t=class{client;defaultModel;constructor(t){if(!t.apiKey)throw Error(`MistralEmbeddingProvider requires an apiKey`);this.client=t.client??new e({apiKey:t.apiKey,serverURL:t.serverURL}),this.defaultModel=t.defaultModel??`mistral-embed`}async embedDocuments(e,t){if(e.length===0)return[];let n=t?.model??this.defaultModel,r=await this.client.embeddings.create({model:n,inputs:e.map(e=>e.text)});return r.data.map((t,n)=>({id:e[n]?.id??(t.index==null?`embedding-${n}`:`embedding-${t.index}`),vector:t.embedding??[],dimensions:t.embedding?.length??0,model:r.model,metadata:e[n]?.metadata?Object.fromEntries(Object.entries(e[n]?.metadata??{}).map(([e,t])=>[e,String(t)])):void 0}))}async embedQuery(e,t){let[n]=await this.embedDocuments([{id:`query`,text:e}],t);if(!n)throw Error(`Failed to compute embedding for query`);return n}};export{t as MistralEmbeddingProvider};
1
+ import { Mistral } from "@mistralai/mistralai";
2
+
3
+ //#region src/integrations/providers/impls/mistral-embedding.ts
4
+ var MistralEmbeddingProvider = class {
5
+ client;
6
+ defaultModel;
7
+ constructor(options) {
8
+ if (!options.apiKey) throw new Error("MistralEmbeddingProvider requires an apiKey");
9
+ this.client = options.client ?? new Mistral({
10
+ apiKey: options.apiKey,
11
+ serverURL: options.serverURL
12
+ });
13
+ this.defaultModel = options.defaultModel ?? "mistral-embed";
14
+ }
15
+ async embedDocuments(documents, options) {
16
+ if (documents.length === 0) return [];
17
+ const model = options?.model ?? this.defaultModel;
18
+ const response = await this.client.embeddings.create({
19
+ model,
20
+ inputs: documents.map((doc) => doc.text)
21
+ });
22
+ return response.data.map((item, index) => ({
23
+ id: documents[index]?.id ?? (item.index != null ? `embedding-${item.index}` : `embedding-${index}`),
24
+ vector: item.embedding ?? [],
25
+ dimensions: item.embedding?.length ?? 0,
26
+ model: response.model,
27
+ metadata: documents[index]?.metadata ? Object.fromEntries(Object.entries(documents[index]?.metadata ?? {}).map(([key, value]) => [key, String(value)])) : void 0
28
+ }));
29
+ }
30
+ async embedQuery(query, options) {
31
+ const [result] = await this.embedDocuments([{
32
+ id: "query",
33
+ text: query
34
+ }], options);
35
+ if (!result) throw new Error("Failed to compute embedding for query");
36
+ return result;
37
+ }
38
+ };
39
+
40
+ //#endregion
41
+ export { MistralEmbeddingProvider };
@@ -1 +1,247 @@
1
- import{Mistral as e}from"@mistralai/mistralai";var t=class{client;defaultModel;constructor(t){if(!t.apiKey)throw Error(`MistralLLMProvider requires an apiKey`);this.client=t.client??new e({apiKey:t.apiKey,serverURL:t.serverURL,userAgent:t.userAgentSuffix?`${t.userAgentSuffix}`:void 0}),this.defaultModel=t.defaultModel??`mistral-large-latest`}async chat(e,t={}){let n=this.buildChatRequest(e,t),r=await this.client.chat.complete(n);return this.buildLLMResponse(r)}async*stream(e,t={}){let r=this.buildChatRequest(e,t);r.stream=!0;let i=await this.client.chat.stream(r),a=[],o=[],s,c;for await(let e of i){for(let t of e.data.choices){let e=t.delta;if(typeof e.content==`string`)e.content.length>0&&(a.push({type:`text`,text:e.content}),yield{type:`message_delta`,delta:{type:`text`,text:e.content},index:t.index});else if(Array.isArray(e.content))for(let n of e.content)n.type===`text`&&`text`in n&&(a.push({type:`text`,text:n.text}),yield{type:`message_delta`,delta:{type:`text`,text:n.text},index:t.index});if(e.toolCalls){let n=0;for(let r of e.toolCalls){let e=this.fromMistralToolCall(r,n);o.push(e),yield{type:`tool_call`,call:e,index:t.index},n+=1}}t.finishReason&&t.finishReason!==`null`&&(c=t.finishReason)}if(e.data.usage){let t=this.fromUsage(e.data.usage);t&&(s=t,yield{type:`usage`,usage:t})}}let l={role:`assistant`,content:a.length?a:[{type:`text`,text:``}]};o.length>0&&(l.content=[...o,...a.length?a:[]]),yield{type:`end`,response:{message:l,usage:s,finishReason:n(c)}}}async countTokens(e){throw Error(`Mistral API does not currently support token counting`)}buildChatRequest(e,t){let n={model:t.model??this.defaultModel,messages:e.map(e=>this.toMistralMessage(e))};return t.temperature!=null&&(n.temperature=t.temperature),t.topP!=null&&(n.topP=t.topP),t.maxOutputTokens!=null&&(n.maxTokens=t.maxOutputTokens),t.stopSequences?.length&&(n.stop=t.stopSequences.length===1?t.stopSequences[0]:t.stopSequences),t.tools?.length&&(n.tools=t.tools.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:typeof e.inputSchema==`object`&&e.inputSchema!==null?e.inputSchema:{}}}))),t.responseFormat===`json`&&(n.responseFormat={type:`json_object`}),n}buildLLMResponse(e){let t=e.choices[0];return t?{message:this.fromAssistantMessage(t.message),usage:this.fromUsage(e.usage),finishReason:n(t.finishReason),raw:e}:{message:{role:`assistant`,content:[{type:`text`,text:``}]},usage:this.fromUsage(e.usage),raw:e}}fromUsage(e){if(e)return{promptTokens:e.promptTokens??0,completionTokens:e.completionTokens??0,totalTokens:e.totalTokens??0}}fromAssistantMessage(e){let t=[];typeof e.content==`string`?t.push({type:`text`,text:e.content}):Array.isArray(e.content)&&e.content.forEach(e=>{e.type===`text`&&`text`in e&&t.push({type:`text`,text:e.text})});let n=e.toolCalls?.map((e,t)=>this.fromMistralToolCall(e,t))??[];return n.length>0&&t.splice(0,0,...n),t.length===0&&t.push({type:`text`,text:``}),{role:`assistant`,content:t}}fromMistralToolCall(e,t){let n=typeof e.function.arguments==`string`?e.function.arguments:JSON.stringify(e.function.arguments);return{type:`tool-call`,id:e.id??`tool-call-${t}`,name:e.function.name,arguments:n}}toMistralMessage(e){let t=this.extractText(e.content),n=this.extractToolCalls(e);switch(e.role){case`system`:return{role:`system`,content:t??``};case`user`:return{role:`user`,content:t??``};case`assistant`:return{role:`assistant`,content:n.length>0?null:t??``,toolCalls:n.length>0?n:void 0};case`tool`:return{role:`tool`,content:t??``,toolCallId:e.toolCallId??n[0]?.id};default:return{role:`user`,content:t??``}}}extractText(e){let t=e.filter(e=>e.type===`text`).map(e=>e.text);return t.length===0?null:t.join(``)}extractToolCalls(e){return e.content.filter(e=>e.type===`tool-call`).map((e,t)=>({id:e.id??`call_${t}`,type:`function`,index:t,function:{name:e.name,arguments:e.arguments}}))}};function n(e){if(e)switch(e.toLowerCase()){case`stop`:return`stop`;case`length`:return`length`;case`tool_call`:case`tool_calls`:return`tool_call`;case`content_filter`:return`content_filter`;default:return}}export{t as MistralLLMProvider};
1
+ import { Mistral } from "@mistralai/mistralai";
2
+
3
+ //#region src/integrations/providers/impls/mistral-llm.ts
4
+ var MistralLLMProvider = class {
5
+ client;
6
+ defaultModel;
7
+ constructor(options) {
8
+ if (!options.apiKey) throw new Error("MistralLLMProvider requires an apiKey");
9
+ this.client = options.client ?? new Mistral({
10
+ apiKey: options.apiKey,
11
+ serverURL: options.serverURL,
12
+ userAgent: options.userAgentSuffix ? `${options.userAgentSuffix}` : void 0
13
+ });
14
+ this.defaultModel = options.defaultModel ?? "mistral-large-latest";
15
+ }
16
+ async chat(messages, options = {}) {
17
+ const request = this.buildChatRequest(messages, options);
18
+ const response = await this.client.chat.complete(request);
19
+ return this.buildLLMResponse(response);
20
+ }
21
+ async *stream(messages, options = {}) {
22
+ const request = this.buildChatRequest(messages, options);
23
+ request.stream = true;
24
+ const stream = await this.client.chat.stream(request);
25
+ const aggregatedParts = [];
26
+ const aggregatedToolCalls = [];
27
+ let usage;
28
+ let finishReason;
29
+ for await (const event of stream) {
30
+ for (const choice of event.data.choices) {
31
+ const delta = choice.delta;
32
+ if (typeof delta.content === "string") {
33
+ if (delta.content.length > 0) {
34
+ aggregatedParts.push({
35
+ type: "text",
36
+ text: delta.content
37
+ });
38
+ yield {
39
+ type: "message_delta",
40
+ delta: {
41
+ type: "text",
42
+ text: delta.content
43
+ },
44
+ index: choice.index
45
+ };
46
+ }
47
+ } else if (Array.isArray(delta.content)) {
48
+ for (const chunk of delta.content) if (chunk.type === "text" && "text" in chunk) {
49
+ aggregatedParts.push({
50
+ type: "text",
51
+ text: chunk.text
52
+ });
53
+ yield {
54
+ type: "message_delta",
55
+ delta: {
56
+ type: "text",
57
+ text: chunk.text
58
+ },
59
+ index: choice.index
60
+ };
61
+ }
62
+ }
63
+ if (delta.toolCalls) {
64
+ let localIndex = 0;
65
+ for (const call of delta.toolCalls) {
66
+ const toolCall = this.fromMistralToolCall(call, localIndex);
67
+ aggregatedToolCalls.push(toolCall);
68
+ yield {
69
+ type: "tool_call",
70
+ call: toolCall,
71
+ index: choice.index
72
+ };
73
+ localIndex += 1;
74
+ }
75
+ }
76
+ if (choice.finishReason && choice.finishReason !== "null") finishReason = choice.finishReason;
77
+ }
78
+ if (event.data.usage) {
79
+ const usageEntry = this.fromUsage(event.data.usage);
80
+ if (usageEntry) {
81
+ usage = usageEntry;
82
+ yield {
83
+ type: "usage",
84
+ usage: usageEntry
85
+ };
86
+ }
87
+ }
88
+ }
89
+ const message = {
90
+ role: "assistant",
91
+ content: aggregatedParts.length ? aggregatedParts : [{
92
+ type: "text",
93
+ text: ""
94
+ }]
95
+ };
96
+ if (aggregatedToolCalls.length > 0) message.content = [...aggregatedToolCalls, ...aggregatedParts.length ? aggregatedParts : []];
97
+ yield {
98
+ type: "end",
99
+ response: {
100
+ message,
101
+ usage,
102
+ finishReason: mapFinishReason(finishReason)
103
+ }
104
+ };
105
+ }
106
+ async countTokens(messages) {
107
+ throw new Error("Mistral API does not currently support token counting");
108
+ }
109
+ buildChatRequest(messages, options) {
110
+ const request = {
111
+ model: options.model ?? this.defaultModel,
112
+ messages: messages.map((message) => this.toMistralMessage(message))
113
+ };
114
+ if (options.temperature != null) request.temperature = options.temperature;
115
+ if (options.topP != null) request.topP = options.topP;
116
+ if (options.maxOutputTokens != null) request.maxTokens = options.maxOutputTokens;
117
+ if (options.stopSequences?.length) request.stop = options.stopSequences.length === 1 ? options.stopSequences[0] : options.stopSequences;
118
+ if (options.tools?.length) request.tools = options.tools.map((tool) => ({
119
+ type: "function",
120
+ function: {
121
+ name: tool.name,
122
+ description: tool.description,
123
+ parameters: typeof tool.inputSchema === "object" && tool.inputSchema !== null ? tool.inputSchema : {}
124
+ }
125
+ }));
126
+ if (options.responseFormat === "json") request.responseFormat = { type: "json_object" };
127
+ return request;
128
+ }
129
+ buildLLMResponse(response) {
130
+ const firstChoice = response.choices[0];
131
+ if (!firstChoice) return {
132
+ message: {
133
+ role: "assistant",
134
+ content: [{
135
+ type: "text",
136
+ text: ""
137
+ }]
138
+ },
139
+ usage: this.fromUsage(response.usage),
140
+ raw: response
141
+ };
142
+ return {
143
+ message: this.fromAssistantMessage(firstChoice.message),
144
+ usage: this.fromUsage(response.usage),
145
+ finishReason: mapFinishReason(firstChoice.finishReason),
146
+ raw: response
147
+ };
148
+ }
149
+ fromUsage(usage) {
150
+ if (!usage) return void 0;
151
+ return {
152
+ promptTokens: usage.promptTokens ?? 0,
153
+ completionTokens: usage.completionTokens ?? 0,
154
+ totalTokens: usage.totalTokens ?? 0
155
+ };
156
+ }
157
+ fromAssistantMessage(message) {
158
+ const parts = [];
159
+ if (typeof message.content === "string") parts.push({
160
+ type: "text",
161
+ text: message.content
162
+ });
163
+ else if (Array.isArray(message.content)) message.content.forEach((chunk) => {
164
+ if (chunk.type === "text" && "text" in chunk) parts.push({
165
+ type: "text",
166
+ text: chunk.text
167
+ });
168
+ });
169
+ const toolCalls = message.toolCalls?.map((call, index) => this.fromMistralToolCall(call, index)) ?? [];
170
+ if (toolCalls.length > 0) parts.splice(0, 0, ...toolCalls);
171
+ if (parts.length === 0) parts.push({
172
+ type: "text",
173
+ text: ""
174
+ });
175
+ return {
176
+ role: "assistant",
177
+ content: parts
178
+ };
179
+ }
180
+ fromMistralToolCall(call, index) {
181
+ const args = typeof call.function.arguments === "string" ? call.function.arguments : JSON.stringify(call.function.arguments);
182
+ return {
183
+ type: "tool-call",
184
+ id: call.id ?? `tool-call-${index}`,
185
+ name: call.function.name,
186
+ arguments: args
187
+ };
188
+ }
189
+ toMistralMessage(message) {
190
+ const textContent = this.extractText(message.content);
191
+ const toolCalls = this.extractToolCalls(message);
192
+ switch (message.role) {
193
+ case "system": return {
194
+ role: "system",
195
+ content: textContent ?? ""
196
+ };
197
+ case "user": return {
198
+ role: "user",
199
+ content: textContent ?? ""
200
+ };
201
+ case "assistant": return {
202
+ role: "assistant",
203
+ content: toolCalls.length > 0 ? null : textContent ?? "",
204
+ toolCalls: toolCalls.length > 0 ? toolCalls : void 0
205
+ };
206
+ case "tool": return {
207
+ role: "tool",
208
+ content: textContent ?? "",
209
+ toolCallId: message.toolCallId ?? toolCalls[0]?.id
210
+ };
211
+ default: return {
212
+ role: "user",
213
+ content: textContent ?? ""
214
+ };
215
+ }
216
+ }
217
+ extractText(parts) {
218
+ const textParts = parts.filter((part) => part.type === "text").map((part) => part.text);
219
+ if (textParts.length === 0) return null;
220
+ return textParts.join("");
221
+ }
222
+ extractToolCalls(message) {
223
+ return message.content.filter((part) => part.type === "tool-call").map((call, index) => ({
224
+ id: call.id ?? `call_${index}`,
225
+ type: "function",
226
+ index,
227
+ function: {
228
+ name: call.name,
229
+ arguments: call.arguments
230
+ }
231
+ }));
232
+ }
233
+ };
234
+ function mapFinishReason(reason) {
235
+ if (!reason) return void 0;
236
+ switch (reason.toLowerCase()) {
237
+ case "stop": return "stop";
238
+ case "length": return "length";
239
+ case "tool_call":
240
+ case "tool_calls": return "tool_call";
241
+ case "content_filter": return "content_filter";
242
+ default: return;
243
+ }
244
+ }
245
+
246
+ //#endregion
247
+ export { MistralLLMProvider };
@@ -1 +1,55 @@
1
- import{ServerClient as e}from"postmark";var t=class{client;defaultFromEmail;messageStream;constructor(t){this.client=t.client??new e(t.serverToken,{useHttps:!0}),this.defaultFromEmail=t.defaultFromEmail,this.messageStream=t.messageStream}async sendEmail(e){let t={From:n(e.from)??this.defaultFromEmail,To:e.to.map(e=>n(e)).join(`, `),Cc:e.cc?.map(e=>n(e)).join(`, `)||void 0,Bcc:e.bcc?.map(e=>n(e)).join(`, `)||void 0,ReplyTo:e.replyTo?n(e.replyTo):void 0,Subject:e.subject,TextBody:e.textBody,HtmlBody:e.htmlBody,Headers:e.headers?Object.entries(e.headers).map(([e,t])=>({Name:e,Value:t})):void 0,MessageStream:this.messageStream,Attachments:r(e)},i=await this.client.sendEmail(t);return{id:i.MessageID,providerMessageId:i.MessageID,queuedAt:new Date(i.SubmittedAt??new Date().toISOString())}}};function n(e){return e.name?`"${e.name}" <${e.email}>`:e.email}function r(e){if(e.attachments?.length)return e.attachments.filter(e=>e.data).map(e=>({Name:e.filename,Content:Buffer.from(e.data??new Uint8Array).toString(`base64`),ContentType:e.contentType,ContentID:null,ContentLength:e.sizeBytes,Disposition:`attachment`}))}export{t as PostmarkEmailProvider};
1
+ import { ServerClient } from "postmark";
2
+
3
+ //#region src/integrations/providers/impls/postmark-email.ts
4
+ var PostmarkEmailProvider = class {
5
+ client;
6
+ defaultFromEmail;
7
+ messageStream;
8
+ constructor(options) {
9
+ this.client = options.client ?? new ServerClient(options.serverToken, { useHttps: true });
10
+ this.defaultFromEmail = options.defaultFromEmail;
11
+ this.messageStream = options.messageStream;
12
+ }
13
+ async sendEmail(message) {
14
+ const request = {
15
+ From: formatAddress(message.from) ?? this.defaultFromEmail,
16
+ To: message.to.map((addr) => formatAddress(addr)).join(", "),
17
+ Cc: message.cc?.map((addr) => formatAddress(addr)).join(", ") || void 0,
18
+ Bcc: message.bcc?.map((addr) => formatAddress(addr)).join(", ") || void 0,
19
+ ReplyTo: message.replyTo ? formatAddress(message.replyTo) : void 0,
20
+ Subject: message.subject,
21
+ TextBody: message.textBody,
22
+ HtmlBody: message.htmlBody,
23
+ Headers: message.headers ? Object.entries(message.headers).map(([name, value]) => ({
24
+ Name: name,
25
+ Value: value
26
+ })) : void 0,
27
+ MessageStream: this.messageStream,
28
+ Attachments: buildAttachments(message)
29
+ };
30
+ const response = await this.client.sendEmail(request);
31
+ return {
32
+ id: response.MessageID,
33
+ providerMessageId: response.MessageID,
34
+ queuedAt: new Date(response.SubmittedAt ?? (/* @__PURE__ */ new Date()).toISOString())
35
+ };
36
+ }
37
+ };
38
+ function formatAddress(address) {
39
+ if (address.name) return `"${address.name}" <${address.email}>`;
40
+ return address.email;
41
+ }
42
+ function buildAttachments(message) {
43
+ if (!message.attachments?.length) return void 0;
44
+ return message.attachments.filter((attachment) => attachment.data).map((attachment) => ({
45
+ Name: attachment.filename,
46
+ Content: Buffer.from(attachment.data ?? new Uint8Array()).toString("base64"),
47
+ ContentType: attachment.contentType,
48
+ ContentID: null,
49
+ ContentLength: attachment.sizeBytes,
50
+ Disposition: "attachment"
51
+ }));
52
+ }
53
+
54
+ //#endregion
55
+ export { PostmarkEmailProvider };
@@ -1 +1,171 @@
1
- import{URL as e}from"node:url";const t={sandbox:`https://api-sandbox.powens.com/v2`,production:`https://api.powens.com/v2`};var n=class extends Error{status;code;requestId;response;constructor(e,t,n,r,i){super(e),this.name=`PowensClientError`,this.status=t,this.code=n,this.requestId=r,this.response=i}},r=class{clientId;clientSecret;apiKey;fetchImpl;logger;defaultTimeoutMs;token;baseUrl;constructor(e){this.clientId=e.clientId,this.clientSecret=e.clientSecret,this.apiKey=e.apiKey,this.fetchImpl=e.fetchImpl??fetch,this.logger=e.logger,this.defaultTimeoutMs=e.defaultTimeoutMs??15e3,this.baseUrl=e.baseUrl??t[e.environment]??t.production}async listAccounts(e){let t={cursor:e.cursor,limit:e.limit,include_balances:e.includeBalances,institution_uuid:e.institutionUuid};return await this.request({method:`GET`,path:`/users/${encodeURIComponent(e.userUuid)}/accounts`,searchParams:t})}async getAccount(e){return this.request({method:`GET`,path:`/accounts/${encodeURIComponent(e)}`})}async listTransactions(e){let t={cursor:e.cursor,limit:e.limit,from:e.from,to:e.to,include_pending:e.includePending};return this.request({method:`GET`,path:`/accounts/${encodeURIComponent(e.accountUuid)}/transactions`,searchParams:t})}async getBalances(e){return this.request({method:`GET`,path:`/accounts/${encodeURIComponent(e)}/balances`})}async getConnectionStatus(e){return this.request({method:`GET`,path:`/connections/${encodeURIComponent(e)}`})}async request(t){let r=new e(t.path,this.baseUrl);if(t.searchParams)for(let[e,n]of Object.entries(t.searchParams))n!=null&&r.searchParams.set(e,String(n));let i={Accept:`application/json`,"Content-Type":`application/json`,...t.headers};this.apiKey&&(i[`x-api-key`]=this.apiKey),t.skipAuth||(i.Authorization=`Bearer ${await this.ensureAccessToken()}`);let a=new AbortController,o=setTimeout(()=>a.abort(),t.timeoutMs??this.defaultTimeoutMs);try{let e=await this.fetchImpl(r,{method:t.method,headers:i,body:t.body?JSON.stringify(t.body):void 0,signal:a.signal}),o=e.headers.get(`x-request-id`)??void 0;if(!e.ok){let t;try{t=await e.json()}catch{}let r=typeof t==`object`&&t?t:void 0,i=typeof r?.message==`string`?r.message:`Powens API request failed with status ${e.status}`,a=typeof r?.code==`string`?r.code:void 0;throw new n(i,e.status,a,o,t)}if(e.status===204)return;try{return await e.json()}catch(t){throw this.logger?.error?.(`[PowensClient] Failed to parse JSON response`,t),new n(`Failed to parse Powens response payload as JSON`,e.status,void 0,o)}}catch(e){throw e instanceof n?e:e.name===`AbortError`?new n(`Powens API request timed out after ${t.timeoutMs??this.defaultTimeoutMs}ms`,408):(this.logger?.error?.(`[PowensClient] Request failed`,e),new n(e.message??`Powens API request failed`,500))}finally{clearTimeout(o)}}async ensureAccessToken(){return this.token&&Date.now()<this.token.expiresAt-5e3||(this.token=await this.fetchAccessToken()),this.token.accessToken}async fetchAccessToken(){let t=new e(`/oauth/token`,this.baseUrl),r=Buffer.from(`${this.clientId}:${this.clientSecret}`,`utf-8`).toString(`base64`),i=await this.fetchImpl(t,{method:`POST`,headers:{Authorization:`Basic ${r}`,"Content-Type":`application/x-www-form-urlencoded`,Accept:`application/json`},body:new URLSearchParams({grant_type:`client_credentials`}).toString()});if(!i.ok){let e;try{e=await i.json()}catch{}let t=typeof e==`object`&&e?e:void 0;throw new n(typeof t?.error_description==`string`?t.error_description:`Failed to obtain Powens access token`,i.status,void 0,void 0,e)}let a=await i.json(),o=Date.now()+a.expires_in*1e3;return this.logger?.debug?.(`[PowensClient] Received access token`,{expiresIn:a.expires_in}),{accessToken:a.access_token,expiresAt:o,scope:a.scope}}};export{r as PowensClient,n as PowensClientError};
1
+ import { URL } from "node:url";
2
+
3
+ //#region src/integrations/providers/impls/powens-client.ts
4
+ const POWENS_BASE_URL = {
5
+ sandbox: "https://api-sandbox.powens.com/v2",
6
+ production: "https://api.powens.com/v2"
7
+ };
8
+ var PowensClientError = class extends Error {
9
+ status;
10
+ code;
11
+ requestId;
12
+ response;
13
+ constructor(message, status, code, requestId, response) {
14
+ super(message);
15
+ this.name = "PowensClientError";
16
+ this.status = status;
17
+ this.code = code;
18
+ this.requestId = requestId;
19
+ this.response = response;
20
+ }
21
+ };
22
+ var PowensClient = class {
23
+ clientId;
24
+ clientSecret;
25
+ apiKey;
26
+ fetchImpl;
27
+ logger;
28
+ defaultTimeoutMs;
29
+ token;
30
+ baseUrl;
31
+ constructor(options) {
32
+ this.clientId = options.clientId;
33
+ this.clientSecret = options.clientSecret;
34
+ this.apiKey = options.apiKey;
35
+ this.fetchImpl = options.fetchImpl ?? fetch;
36
+ this.logger = options.logger;
37
+ this.defaultTimeoutMs = options.defaultTimeoutMs ?? 15e3;
38
+ this.baseUrl = options.baseUrl ?? POWENS_BASE_URL[options.environment] ?? POWENS_BASE_URL.production;
39
+ }
40
+ async listAccounts(params) {
41
+ const searchParams = {
42
+ cursor: params.cursor,
43
+ limit: params.limit,
44
+ include_balances: params.includeBalances,
45
+ institution_uuid: params.institutionUuid
46
+ };
47
+ return await this.request({
48
+ method: "GET",
49
+ path: `/users/${encodeURIComponent(params.userUuid)}/accounts`,
50
+ searchParams
51
+ });
52
+ }
53
+ async getAccount(accountUuid) {
54
+ return this.request({
55
+ method: "GET",
56
+ path: `/accounts/${encodeURIComponent(accountUuid)}`
57
+ });
58
+ }
59
+ async listTransactions(params) {
60
+ const searchParams = {
61
+ cursor: params.cursor,
62
+ limit: params.limit,
63
+ from: params.from,
64
+ to: params.to,
65
+ include_pending: params.includePending
66
+ };
67
+ return this.request({
68
+ method: "GET",
69
+ path: `/accounts/${encodeURIComponent(params.accountUuid)}/transactions`,
70
+ searchParams
71
+ });
72
+ }
73
+ async getBalances(accountUuid) {
74
+ return this.request({
75
+ method: "GET",
76
+ path: `/accounts/${encodeURIComponent(accountUuid)}/balances`
77
+ });
78
+ }
79
+ async getConnectionStatus(connectionUuid) {
80
+ return this.request({
81
+ method: "GET",
82
+ path: `/connections/${encodeURIComponent(connectionUuid)}`
83
+ });
84
+ }
85
+ async request(options) {
86
+ const url = new URL(options.path, this.baseUrl);
87
+ if (options.searchParams) for (const [key, value] of Object.entries(options.searchParams)) {
88
+ if (value === void 0 || value === null) continue;
89
+ url.searchParams.set(key, String(value));
90
+ }
91
+ const headers = {
92
+ Accept: "application/json",
93
+ "Content-Type": "application/json",
94
+ ...options.headers
95
+ };
96
+ if (this.apiKey) headers["x-api-key"] = this.apiKey;
97
+ if (!options.skipAuth) headers.Authorization = `Bearer ${await this.ensureAccessToken()}`;
98
+ const controller = new AbortController();
99
+ const timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? this.defaultTimeoutMs);
100
+ try {
101
+ const response = await this.fetchImpl(url, {
102
+ method: options.method,
103
+ headers,
104
+ body: options.body ? JSON.stringify(options.body) : void 0,
105
+ signal: controller.signal
106
+ });
107
+ const requestId = response.headers.get("x-request-id") ?? void 0;
108
+ if (!response.ok) {
109
+ let errorBody;
110
+ try {
111
+ errorBody = await response.json();
112
+ } catch {}
113
+ const errorObject = typeof errorBody === "object" && errorBody !== null ? errorBody : void 0;
114
+ const message = typeof errorObject?.message === "string" ? errorObject.message : `Powens API request failed with status ${response.status}`;
115
+ const code = typeof errorObject?.code === "string" ? errorObject.code : void 0;
116
+ throw new PowensClientError(message, response.status, code, requestId, errorBody);
117
+ }
118
+ if (response.status === 204) return;
119
+ try {
120
+ return await response.json();
121
+ } catch (error) {
122
+ this.logger?.error?.("[PowensClient] Failed to parse JSON response", error);
123
+ throw new PowensClientError("Failed to parse Powens response payload as JSON", response.status, void 0, requestId);
124
+ }
125
+ } catch (error) {
126
+ if (error instanceof PowensClientError) throw error;
127
+ if (error.name === "AbortError") throw new PowensClientError(`Powens API request timed out after ${options.timeoutMs ?? this.defaultTimeoutMs}ms`, 408);
128
+ this.logger?.error?.("[PowensClient] Request failed", error);
129
+ throw new PowensClientError(error.message ?? "Powens API request failed", 500);
130
+ } finally {
131
+ clearTimeout(timeout);
132
+ }
133
+ }
134
+ async ensureAccessToken() {
135
+ if (this.token && Date.now() < this.token.expiresAt - 5e3) return this.token.accessToken;
136
+ this.token = await this.fetchAccessToken();
137
+ return this.token.accessToken;
138
+ }
139
+ async fetchAccessToken() {
140
+ const url = new URL("/oauth/token", this.baseUrl);
141
+ const basicAuth = Buffer.from(`${this.clientId}:${this.clientSecret}`, "utf-8").toString("base64");
142
+ const response = await this.fetchImpl(url, {
143
+ method: "POST",
144
+ headers: {
145
+ Authorization: `Basic ${basicAuth}`,
146
+ "Content-Type": "application/x-www-form-urlencoded",
147
+ Accept: "application/json"
148
+ },
149
+ body: new URLSearchParams({ grant_type: "client_credentials" }).toString()
150
+ });
151
+ if (!response.ok) {
152
+ let errorBody;
153
+ try {
154
+ errorBody = await response.json();
155
+ } catch {}
156
+ const errorObject = typeof errorBody === "object" && errorBody !== null ? errorBody : void 0;
157
+ throw new PowensClientError(typeof errorObject?.error_description === "string" ? errorObject.error_description : "Failed to obtain Powens access token", response.status, void 0, void 0, errorBody);
158
+ }
159
+ const payload = await response.json();
160
+ const expiresAt = Date.now() + payload.expires_in * 1e3;
161
+ this.logger?.debug?.("[PowensClient] Received access token", { expiresIn: payload.expires_in });
162
+ return {
163
+ accessToken: payload.access_token,
164
+ expiresAt,
165
+ scope: payload.scope
166
+ };
167
+ }
168
+ };
169
+
170
+ //#endregion
171
+ export { PowensClient, PowensClientError };