@contractspec/lib.contracts-integrations 2.0.0

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 (240) hide show
  1. package/README.md +3 -0
  2. package/dist/index.d.ts +11 -0
  3. package/dist/index.js +3676 -0
  4. package/dist/integrations/binding.d.ts +14 -0
  5. package/dist/integrations/binding.js +1 -0
  6. package/dist/integrations/connection.d.ts +47 -0
  7. package/dist/integrations/connection.js +1 -0
  8. package/dist/integrations/docs/integrations.docblock.d.ts +2 -0
  9. package/dist/integrations/docs/integrations.docblock.js +110 -0
  10. package/dist/integrations/health.d.ts +17 -0
  11. package/dist/integrations/health.js +73 -0
  12. package/dist/integrations/health.test.d.ts +1 -0
  13. package/dist/integrations/index.d.ts +11 -0
  14. package/dist/integrations/index.js +3264 -0
  15. package/dist/integrations/integrations.capability.d.ts +1 -0
  16. package/dist/integrations/integrations.capability.js +18 -0
  17. package/dist/integrations/integrations.feature.d.ts +5 -0
  18. package/dist/integrations/integrations.feature.js +33 -0
  19. package/dist/integrations/meeting-recorder/contracts/index.d.ts +7 -0
  20. package/dist/integrations/meeting-recorder/contracts/index.js +474 -0
  21. package/dist/integrations/meeting-recorder/contracts/meetings.d.ts +451 -0
  22. package/dist/integrations/meeting-recorder/contracts/meetings.js +219 -0
  23. package/dist/integrations/meeting-recorder/contracts/transcripts.d.ts +166 -0
  24. package/dist/integrations/meeting-recorder/contracts/transcripts.js +287 -0
  25. package/dist/integrations/meeting-recorder/contracts/webhooks.d.ts +85 -0
  26. package/dist/integrations/meeting-recorder/contracts/webhooks.js +172 -0
  27. package/dist/integrations/meeting-recorder/meeting-recorder.capability.d.ts +1 -0
  28. package/dist/integrations/meeting-recorder/meeting-recorder.capability.js +18 -0
  29. package/dist/integrations/meeting-recorder/meeting-recorder.feature.d.ts +5 -0
  30. package/dist/integrations/meeting-recorder/meeting-recorder.feature.js +33 -0
  31. package/dist/integrations/meeting-recorder/models.d.ts +402 -0
  32. package/dist/integrations/meeting-recorder/models.js +122 -0
  33. package/dist/integrations/meeting-recorder/telemetry.d.ts +13 -0
  34. package/dist/integrations/meeting-recorder/telemetry.js +54 -0
  35. package/dist/integrations/openbanking/contracts/accounts.d.ts +282 -0
  36. package/dist/integrations/openbanking/contracts/accounts.js +328 -0
  37. package/dist/integrations/openbanking/contracts/balances.d.ts +158 -0
  38. package/dist/integrations/openbanking/contracts/balances.js +292 -0
  39. package/dist/integrations/openbanking/contracts/index.d.ts +7 -0
  40. package/dist/integrations/openbanking/contracts/index.js +644 -0
  41. package/dist/integrations/openbanking/contracts/transactions.d.ts +206 -0
  42. package/dist/integrations/openbanking/contracts/transactions.js +298 -0
  43. package/dist/integrations/openbanking/guards.d.ts +8 -0
  44. package/dist/integrations/openbanking/guards.js +42 -0
  45. package/dist/integrations/openbanking/guards.test.d.ts +1 -0
  46. package/dist/integrations/openbanking/models.d.ts +223 -0
  47. package/dist/integrations/openbanking/models.js +110 -0
  48. package/dist/integrations/openbanking/openbanking.capability.d.ts +1 -0
  49. package/dist/integrations/openbanking/openbanking.capability.js +18 -0
  50. package/dist/integrations/openbanking/openbanking.feature.d.ts +5 -0
  51. package/dist/integrations/openbanking/openbanking.feature.js +35 -0
  52. package/dist/integrations/openbanking/telemetry.d.ts +12 -0
  53. package/dist/integrations/openbanking/telemetry.js +51 -0
  54. package/dist/integrations/operations.d.ts +430 -0
  55. package/dist/integrations/operations.js +297 -0
  56. package/dist/integrations/operations.test.d.ts +1 -0
  57. package/dist/integrations/providers/analytics-reader.d.ts +103 -0
  58. package/dist/integrations/providers/analytics-reader.js +1 -0
  59. package/dist/integrations/providers/analytics-writer.d.ts +6 -0
  60. package/dist/integrations/providers/analytics-writer.js +1 -0
  61. package/dist/integrations/providers/analytics.d.ts +47 -0
  62. package/dist/integrations/providers/analytics.js +1 -0
  63. package/dist/integrations/providers/calendar.d.ts +75 -0
  64. package/dist/integrations/providers/calendar.js +1 -0
  65. package/dist/integrations/providers/database.d.ts +12 -0
  66. package/dist/integrations/providers/database.js +1 -0
  67. package/dist/integrations/providers/elevenlabs.d.ts +3 -0
  68. package/dist/integrations/providers/elevenlabs.js +86 -0
  69. package/dist/integrations/providers/email.d.ts +83 -0
  70. package/dist/integrations/providers/email.js +1 -0
  71. package/dist/integrations/providers/embedding.d.ts +21 -0
  72. package/dist/integrations/providers/embedding.js +1 -0
  73. package/dist/integrations/providers/fal.d.ts +3 -0
  74. package/dist/integrations/providers/fal.js +112 -0
  75. package/dist/integrations/providers/fathom.d.ts +3 -0
  76. package/dist/integrations/providers/fathom.js +126 -0
  77. package/dist/integrations/providers/fireflies.d.ts +3 -0
  78. package/dist/integrations/providers/fireflies.js +106 -0
  79. package/dist/integrations/providers/gcs-storage.d.ts +3 -0
  80. package/dist/integrations/providers/gcs-storage.js +97 -0
  81. package/dist/integrations/providers/gmail.d.ts +3 -0
  82. package/dist/integrations/providers/gmail.js +109 -0
  83. package/dist/integrations/providers/google-calendar.d.ts +3 -0
  84. package/dist/integrations/providers/google-calendar.js +92 -0
  85. package/dist/integrations/providers/gradium.d.ts +3 -0
  86. package/dist/integrations/providers/gradium.js +110 -0
  87. package/dist/integrations/providers/granola.d.ts +3 -0
  88. package/dist/integrations/providers/granola.js +107 -0
  89. package/dist/integrations/providers/index.d.ts +38 -0
  90. package/dist/integrations/providers/index.js +2094 -0
  91. package/dist/integrations/providers/jira.d.ts +3 -0
  92. package/dist/integrations/providers/jira.js +108 -0
  93. package/dist/integrations/providers/linear.d.ts +3 -0
  94. package/dist/integrations/providers/linear.js +107 -0
  95. package/dist/integrations/providers/llm.d.ts +79 -0
  96. package/dist/integrations/providers/llm.js +1 -0
  97. package/dist/integrations/providers/meeting-recorder.d.ts +129 -0
  98. package/dist/integrations/providers/meeting-recorder.js +1 -0
  99. package/dist/integrations/providers/mistral.d.ts +3 -0
  100. package/dist/integrations/providers/mistral.js +94 -0
  101. package/dist/integrations/providers/notion.d.ts +3 -0
  102. package/dist/integrations/providers/notion.js +113 -0
  103. package/dist/integrations/providers/openbanking.d.ts +125 -0
  104. package/dist/integrations/providers/openbanking.js +1 -0
  105. package/dist/integrations/providers/payments.d.ts +106 -0
  106. package/dist/integrations/providers/payments.js +1 -0
  107. package/dist/integrations/providers/posthog-llm-telemetry.d.ts +51 -0
  108. package/dist/integrations/providers/posthog-llm-telemetry.js +176 -0
  109. package/dist/integrations/providers/posthog.d.ts +3 -0
  110. package/dist/integrations/providers/posthog.js +106 -0
  111. package/dist/integrations/providers/postmark.d.ts +3 -0
  112. package/dist/integrations/providers/postmark.js +98 -0
  113. package/dist/integrations/providers/powens.d.ts +3 -0
  114. package/dist/integrations/providers/powens.js +124 -0
  115. package/dist/integrations/providers/project-management.d.ts +32 -0
  116. package/dist/integrations/providers/project-management.js +1 -0
  117. package/dist/integrations/providers/providers.test.d.ts +1 -0
  118. package/dist/integrations/providers/qdrant.d.ts +3 -0
  119. package/dist/integrations/providers/qdrant.js +101 -0
  120. package/dist/integrations/providers/registry.d.ts +6 -0
  121. package/dist/integrations/providers/registry.js +1878 -0
  122. package/dist/integrations/providers/sms.d.ts +31 -0
  123. package/dist/integrations/providers/sms.js +1 -0
  124. package/dist/integrations/providers/storage.d.ts +57 -0
  125. package/dist/integrations/providers/storage.js +1 -0
  126. package/dist/integrations/providers/stripe.d.ts +3 -0
  127. package/dist/integrations/providers/stripe.js +105 -0
  128. package/dist/integrations/providers/supabase-postgres.d.ts +3 -0
  129. package/dist/integrations/providers/supabase-postgres.js +87 -0
  130. package/dist/integrations/providers/supabase-vector.d.ts +3 -0
  131. package/dist/integrations/providers/supabase-vector.js +107 -0
  132. package/dist/integrations/providers/tldv.d.ts +3 -0
  133. package/dist/integrations/providers/tldv.js +106 -0
  134. package/dist/integrations/providers/twilio-sms.d.ts +3 -0
  135. package/dist/integrations/providers/twilio-sms.js +91 -0
  136. package/dist/integrations/providers/vector-store.d.ts +39 -0
  137. package/dist/integrations/providers/vector-store.js +1 -0
  138. package/dist/integrations/providers/voice.d.ts +31 -0
  139. package/dist/integrations/providers/voice.js +1 -0
  140. package/dist/integrations/runtime.d.ts +95 -0
  141. package/dist/integrations/runtime.js +209 -0
  142. package/dist/integrations/runtime.test.d.ts +1 -0
  143. package/dist/integrations/secrets/aws-secret-manager.d.ts +28 -0
  144. package/dist/integrations/secrets/aws-secret-manager.js +346 -0
  145. package/dist/integrations/secrets/env-secret-provider.d.ts +28 -0
  146. package/dist/integrations/secrets/env-secret-provider.js +159 -0
  147. package/dist/integrations/secrets/gcp-secret-manager.d.ts +29 -0
  148. package/dist/integrations/secrets/gcp-secret-manager.js +347 -0
  149. package/dist/integrations/secrets/index.d.ts +6 -0
  150. package/dist/integrations/secrets/index.js +1129 -0
  151. package/dist/integrations/secrets/manager.d.ts +44 -0
  152. package/dist/integrations/secrets/manager.js +183 -0
  153. package/dist/integrations/secrets/provider.d.ts +49 -0
  154. package/dist/integrations/secrets/provider.js +74 -0
  155. package/dist/integrations/secrets/provider.test.d.ts +1 -0
  156. package/dist/integrations/secrets/scaleway-secret-manager.d.ts +35 -0
  157. package/dist/integrations/secrets/scaleway-secret-manager.js +375 -0
  158. package/dist/integrations/secrets-types.d.ts +14 -0
  159. package/dist/integrations/secrets-types.js +1 -0
  160. package/dist/integrations/spec.d.ts +72 -0
  161. package/dist/integrations/spec.js +22 -0
  162. package/dist/integrations/spec.test.d.ts +1 -0
  163. package/dist/node/index.js +3675 -0
  164. package/dist/node/integrations/binding.js +0 -0
  165. package/dist/node/integrations/connection.js +0 -0
  166. package/dist/node/integrations/docs/integrations.docblock.js +109 -0
  167. package/dist/node/integrations/health.js +72 -0
  168. package/dist/node/integrations/index.js +3263 -0
  169. package/dist/node/integrations/integrations.capability.js +17 -0
  170. package/dist/node/integrations/integrations.feature.js +32 -0
  171. package/dist/node/integrations/meeting-recorder/contracts/index.js +473 -0
  172. package/dist/node/integrations/meeting-recorder/contracts/meetings.js +218 -0
  173. package/dist/node/integrations/meeting-recorder/contracts/transcripts.js +286 -0
  174. package/dist/node/integrations/meeting-recorder/contracts/webhooks.js +171 -0
  175. package/dist/node/integrations/meeting-recorder/meeting-recorder.capability.js +17 -0
  176. package/dist/node/integrations/meeting-recorder/meeting-recorder.feature.js +32 -0
  177. package/dist/node/integrations/meeting-recorder/models.js +121 -0
  178. package/dist/node/integrations/meeting-recorder/telemetry.js +53 -0
  179. package/dist/node/integrations/openbanking/contracts/accounts.js +327 -0
  180. package/dist/node/integrations/openbanking/contracts/balances.js +291 -0
  181. package/dist/node/integrations/openbanking/contracts/index.js +643 -0
  182. package/dist/node/integrations/openbanking/contracts/transactions.js +297 -0
  183. package/dist/node/integrations/openbanking/guards.js +41 -0
  184. package/dist/node/integrations/openbanking/models.js +109 -0
  185. package/dist/node/integrations/openbanking/openbanking.capability.js +17 -0
  186. package/dist/node/integrations/openbanking/openbanking.feature.js +34 -0
  187. package/dist/node/integrations/openbanking/telemetry.js +50 -0
  188. package/dist/node/integrations/operations.js +296 -0
  189. package/dist/node/integrations/providers/analytics-reader.js +0 -0
  190. package/dist/node/integrations/providers/analytics-writer.js +0 -0
  191. package/dist/node/integrations/providers/analytics.js +0 -0
  192. package/dist/node/integrations/providers/calendar.js +0 -0
  193. package/dist/node/integrations/providers/database.js +0 -0
  194. package/dist/node/integrations/providers/elevenlabs.js +85 -0
  195. package/dist/node/integrations/providers/email.js +0 -0
  196. package/dist/node/integrations/providers/embedding.js +0 -0
  197. package/dist/node/integrations/providers/fal.js +111 -0
  198. package/dist/node/integrations/providers/fathom.js +125 -0
  199. package/dist/node/integrations/providers/fireflies.js +105 -0
  200. package/dist/node/integrations/providers/gcs-storage.js +96 -0
  201. package/dist/node/integrations/providers/gmail.js +108 -0
  202. package/dist/node/integrations/providers/google-calendar.js +91 -0
  203. package/dist/node/integrations/providers/gradium.js +109 -0
  204. package/dist/node/integrations/providers/granola.js +106 -0
  205. package/dist/node/integrations/providers/index.js +2093 -0
  206. package/dist/node/integrations/providers/jira.js +107 -0
  207. package/dist/node/integrations/providers/linear.js +106 -0
  208. package/dist/node/integrations/providers/llm.js +0 -0
  209. package/dist/node/integrations/providers/meeting-recorder.js +0 -0
  210. package/dist/node/integrations/providers/mistral.js +93 -0
  211. package/dist/node/integrations/providers/notion.js +112 -0
  212. package/dist/node/integrations/providers/openbanking.js +0 -0
  213. package/dist/node/integrations/providers/payments.js +0 -0
  214. package/dist/node/integrations/providers/posthog-llm-telemetry.js +175 -0
  215. package/dist/node/integrations/providers/posthog.js +105 -0
  216. package/dist/node/integrations/providers/postmark.js +97 -0
  217. package/dist/node/integrations/providers/powens.js +123 -0
  218. package/dist/node/integrations/providers/project-management.js +0 -0
  219. package/dist/node/integrations/providers/qdrant.js +100 -0
  220. package/dist/node/integrations/providers/registry.js +1877 -0
  221. package/dist/node/integrations/providers/sms.js +0 -0
  222. package/dist/node/integrations/providers/storage.js +0 -0
  223. package/dist/node/integrations/providers/stripe.js +104 -0
  224. package/dist/node/integrations/providers/supabase-postgres.js +86 -0
  225. package/dist/node/integrations/providers/supabase-vector.js +106 -0
  226. package/dist/node/integrations/providers/tldv.js +105 -0
  227. package/dist/node/integrations/providers/twilio-sms.js +90 -0
  228. package/dist/node/integrations/providers/vector-store.js +0 -0
  229. package/dist/node/integrations/providers/voice.js +0 -0
  230. package/dist/node/integrations/runtime.js +208 -0
  231. package/dist/node/integrations/secrets/aws-secret-manager.js +345 -0
  232. package/dist/node/integrations/secrets/env-secret-provider.js +158 -0
  233. package/dist/node/integrations/secrets/gcp-secret-manager.js +346 -0
  234. package/dist/node/integrations/secrets/index.js +1128 -0
  235. package/dist/node/integrations/secrets/manager.js +182 -0
  236. package/dist/node/integrations/secrets/provider.js +73 -0
  237. package/dist/node/integrations/secrets/scaleway-secret-manager.js +374 -0
  238. package/dist/node/integrations/secrets-types.js +0 -0
  239. package/dist/node/integrations/spec.js +21 -0
  240. package/package.json +1029 -0
@@ -0,0 +1,44 @@
1
+ import type { SecretProvider, SecretReference, SecretRotationResult, SecretValue, SecretWritePayload } from './provider';
2
+ interface RegisterOptions {
3
+ /**
4
+ * Larger priority values are attempted first. Defaults to 0.
5
+ */
6
+ priority?: number;
7
+ }
8
+ export interface SecretProviderManagerOptions {
9
+ /**
10
+ * Override manager identifier. Defaults to "secret-provider-manager".
11
+ */
12
+ id?: string;
13
+ /**
14
+ * Providers to pre-register. They are registered in array order with
15
+ * descending priority (first entry wins ties).
16
+ */
17
+ providers?: {
18
+ provider: SecretProvider;
19
+ priority?: number;
20
+ }[];
21
+ }
22
+ /**
23
+ * Composite secret provider that delegates to registered providers.
24
+ * Providers are attempted in order of descending priority, respecting the
25
+ * registration order for ties. This enables privileged overrides (e.g.
26
+ * environment variables) while still supporting durable backends like GCP
27
+ * Secret Manager.
28
+ */
29
+ export declare class SecretProviderManager implements SecretProvider {
30
+ readonly id: string;
31
+ private readonly providers;
32
+ private registrationCounter;
33
+ constructor(options?: SecretProviderManagerOptions);
34
+ register(provider: SecretProvider, options?: RegisterOptions): this;
35
+ canHandle(reference: SecretReference): boolean;
36
+ getSecret(reference: SecretReference, options?: SecretFetchOptions): Promise<SecretValue>;
37
+ setSecret(reference: SecretReference, payload: SecretWritePayload): Promise<SecretRotationResult>;
38
+ rotateSecret(reference: SecretReference, payload: SecretWritePayload): Promise<SecretRotationResult>;
39
+ deleteSecret(reference: SecretReference): Promise<void>;
40
+ private delegateToFirst;
41
+ private composeError;
42
+ }
43
+ type SecretFetchOptions = Parameters<SecretProvider['getSecret']>[1];
44
+ export {};
@@ -0,0 +1,183 @@
1
+ // @bun
2
+ // src/integrations/secrets/provider.ts
3
+ import { Buffer } from "buffer";
4
+
5
+ class SecretProviderError extends Error {
6
+ provider;
7
+ reference;
8
+ code;
9
+ cause;
10
+ constructor(params) {
11
+ super(params.message);
12
+ this.name = "SecretProviderError";
13
+ this.provider = params.provider;
14
+ this.reference = params.reference;
15
+ this.code = params.code ?? "UNKNOWN";
16
+ this.cause = params.cause;
17
+ }
18
+ }
19
+ function parseSecretUri(reference) {
20
+ if (!reference) {
21
+ throw new SecretProviderError({
22
+ message: "Secret reference cannot be empty",
23
+ provider: "unknown",
24
+ reference,
25
+ code: "INVALID"
26
+ });
27
+ }
28
+ const [scheme, rest] = reference.split("://");
29
+ if (!scheme || !rest) {
30
+ throw new SecretProviderError({
31
+ message: `Invalid secret reference: ${reference}`,
32
+ provider: "unknown",
33
+ reference,
34
+ code: "INVALID"
35
+ });
36
+ }
37
+ const queryIndex = rest.indexOf("?");
38
+ if (queryIndex === -1) {
39
+ return {
40
+ provider: scheme,
41
+ path: rest
42
+ };
43
+ }
44
+ const path = rest.slice(0, queryIndex);
45
+ const query = rest.slice(queryIndex + 1);
46
+ const extras = Object.fromEntries(query.split("&").filter(Boolean).map((pair) => {
47
+ const [keyRaw, valueRaw] = pair.split("=");
48
+ const key = keyRaw ?? "";
49
+ const value = valueRaw ?? "";
50
+ return [decodeURIComponent(key), decodeURIComponent(value)];
51
+ }));
52
+ return {
53
+ provider: scheme,
54
+ path,
55
+ extras
56
+ };
57
+ }
58
+ function normalizeSecretPayload(payload) {
59
+ if (payload.data instanceof Uint8Array) {
60
+ return payload.data;
61
+ }
62
+ if (payload.encoding === "base64") {
63
+ return Buffer.from(payload.data, "base64");
64
+ }
65
+ if (payload.encoding === "binary") {
66
+ return Buffer.from(payload.data, "binary");
67
+ }
68
+ return Buffer.from(payload.data, "utf-8");
69
+ }
70
+
71
+ // src/integrations/secrets/manager.ts
72
+ class SecretProviderManager {
73
+ id;
74
+ providers = [];
75
+ registrationCounter = 0;
76
+ constructor(options = {}) {
77
+ this.id = options.id ?? "secret-provider-manager";
78
+ const initialProviders = options.providers ?? [];
79
+ for (const entry of initialProviders) {
80
+ this.register(entry.provider, { priority: entry.priority });
81
+ }
82
+ }
83
+ register(provider, options = {}) {
84
+ this.providers.push({
85
+ provider,
86
+ priority: options.priority ?? 0,
87
+ order: this.registrationCounter++
88
+ });
89
+ this.providers.sort((a, b) => {
90
+ if (a.priority !== b.priority) {
91
+ return b.priority - a.priority;
92
+ }
93
+ return a.order - b.order;
94
+ });
95
+ return this;
96
+ }
97
+ canHandle(reference) {
98
+ return this.providers.some(({ provider }) => safeCanHandle(provider, reference));
99
+ }
100
+ async getSecret(reference, options) {
101
+ const errors = [];
102
+ for (const { provider } of this.providers) {
103
+ if (!safeCanHandle(provider, reference)) {
104
+ continue;
105
+ }
106
+ try {
107
+ return await provider.getSecret(reference, options);
108
+ } catch (error) {
109
+ if (error instanceof SecretProviderError) {
110
+ errors.push(error);
111
+ if (error.code !== "NOT_FOUND") {
112
+ break;
113
+ }
114
+ continue;
115
+ }
116
+ throw error;
117
+ }
118
+ }
119
+ throw this.composeError("getSecret", reference, errors, options?.version);
120
+ }
121
+ async setSecret(reference, payload) {
122
+ return this.delegateToFirst("setSecret", reference, (provider) => provider.setSecret(reference, payload));
123
+ }
124
+ async rotateSecret(reference, payload) {
125
+ return this.delegateToFirst("rotateSecret", reference, (provider) => provider.rotateSecret(reference, payload));
126
+ }
127
+ async deleteSecret(reference) {
128
+ await this.delegateToFirst("deleteSecret", reference, (provider) => provider.deleteSecret(reference));
129
+ }
130
+ async delegateToFirst(operation, reference, invoker) {
131
+ const errors = [];
132
+ for (const { provider } of this.providers) {
133
+ if (!safeCanHandle(provider, reference)) {
134
+ continue;
135
+ }
136
+ try {
137
+ return await invoker(provider);
138
+ } catch (error) {
139
+ if (error instanceof SecretProviderError) {
140
+ errors.push(error);
141
+ continue;
142
+ }
143
+ throw error;
144
+ }
145
+ }
146
+ throw this.composeError(operation, reference, errors);
147
+ }
148
+ composeError(operation, reference, errors, version) {
149
+ if (errors.length === 1) {
150
+ const [singleError] = errors;
151
+ if (singleError) {
152
+ return singleError;
153
+ }
154
+ }
155
+ const messageParts = [
156
+ `No registered secret provider could ${operation}`,
157
+ `reference "${reference}"`
158
+ ];
159
+ if (version) {
160
+ messageParts.push(`(version: ${version})`);
161
+ }
162
+ if (errors.length > 1) {
163
+ messageParts.push(`Attempts: ${errors.map((error) => `${error.provider}:${error.code}`).join(", ")}`);
164
+ }
165
+ return new SecretProviderError({
166
+ message: messageParts.join(" "),
167
+ provider: this.id,
168
+ reference,
169
+ code: errors.length > 0 ? errors[errors.length - 1]?.code ?? "UNKNOWN" : "UNKNOWN",
170
+ cause: errors
171
+ });
172
+ }
173
+ }
174
+ function safeCanHandle(provider, reference) {
175
+ try {
176
+ return provider.canHandle(reference);
177
+ } catch {
178
+ return false;
179
+ }
180
+ }
181
+ export {
182
+ SecretProviderManager
183
+ };
@@ -0,0 +1,49 @@
1
+ export type SecretReference = string;
2
+ export interface SecretValue {
3
+ data: Uint8Array;
4
+ version?: string;
5
+ metadata?: Record<string, string>;
6
+ retrievedAt: Date;
7
+ }
8
+ export interface SecretFetchOptions {
9
+ version?: string;
10
+ }
11
+ export type SecretPayloadEncoding = 'utf-8' | 'base64' | 'binary';
12
+ export interface SecretWritePayload {
13
+ data: string | Uint8Array;
14
+ encoding?: SecretPayloadEncoding;
15
+ contentType?: string;
16
+ labels?: Record<string, string>;
17
+ }
18
+ export interface SecretRotationResult {
19
+ reference: SecretReference;
20
+ version: string;
21
+ }
22
+ export interface SecretProvider {
23
+ readonly id: string;
24
+ canHandle(reference: SecretReference): boolean;
25
+ getSecret(reference: SecretReference, options?: SecretFetchOptions): Promise<SecretValue>;
26
+ setSecret(reference: SecretReference, payload: SecretWritePayload): Promise<SecretRotationResult>;
27
+ rotateSecret(reference: SecretReference, payload: SecretWritePayload): Promise<SecretRotationResult>;
28
+ deleteSecret(reference: SecretReference): Promise<void>;
29
+ }
30
+ export interface ParsedSecretUri {
31
+ provider: string;
32
+ path: string;
33
+ extras?: Record<string, string>;
34
+ }
35
+ export declare class SecretProviderError extends Error {
36
+ readonly provider: string;
37
+ readonly reference: SecretReference;
38
+ readonly code: 'NOT_FOUND' | 'FORBIDDEN' | 'INVALID' | 'UNKNOWN';
39
+ readonly cause?: unknown;
40
+ constructor(params: {
41
+ message: string;
42
+ provider: string;
43
+ reference: SecretReference;
44
+ code?: SecretProviderError['code'];
45
+ cause?: unknown;
46
+ });
47
+ }
48
+ export declare function parseSecretUri(reference: SecretReference): ParsedSecretUri;
49
+ export declare function normalizeSecretPayload(payload: SecretWritePayload): Uint8Array;
@@ -0,0 +1,74 @@
1
+ // @bun
2
+ // src/integrations/secrets/provider.ts
3
+ import { Buffer } from "buffer";
4
+
5
+ class SecretProviderError extends Error {
6
+ provider;
7
+ reference;
8
+ code;
9
+ cause;
10
+ constructor(params) {
11
+ super(params.message);
12
+ this.name = "SecretProviderError";
13
+ this.provider = params.provider;
14
+ this.reference = params.reference;
15
+ this.code = params.code ?? "UNKNOWN";
16
+ this.cause = params.cause;
17
+ }
18
+ }
19
+ function parseSecretUri(reference) {
20
+ if (!reference) {
21
+ throw new SecretProviderError({
22
+ message: "Secret reference cannot be empty",
23
+ provider: "unknown",
24
+ reference,
25
+ code: "INVALID"
26
+ });
27
+ }
28
+ const [scheme, rest] = reference.split("://");
29
+ if (!scheme || !rest) {
30
+ throw new SecretProviderError({
31
+ message: `Invalid secret reference: ${reference}`,
32
+ provider: "unknown",
33
+ reference,
34
+ code: "INVALID"
35
+ });
36
+ }
37
+ const queryIndex = rest.indexOf("?");
38
+ if (queryIndex === -1) {
39
+ return {
40
+ provider: scheme,
41
+ path: rest
42
+ };
43
+ }
44
+ const path = rest.slice(0, queryIndex);
45
+ const query = rest.slice(queryIndex + 1);
46
+ const extras = Object.fromEntries(query.split("&").filter(Boolean).map((pair) => {
47
+ const [keyRaw, valueRaw] = pair.split("=");
48
+ const key = keyRaw ?? "";
49
+ const value = valueRaw ?? "";
50
+ return [decodeURIComponent(key), decodeURIComponent(value)];
51
+ }));
52
+ return {
53
+ provider: scheme,
54
+ path,
55
+ extras
56
+ };
57
+ }
58
+ function normalizeSecretPayload(payload) {
59
+ if (payload.data instanceof Uint8Array) {
60
+ return payload.data;
61
+ }
62
+ if (payload.encoding === "base64") {
63
+ return Buffer.from(payload.data, "base64");
64
+ }
65
+ if (payload.encoding === "binary") {
66
+ return Buffer.from(payload.data, "binary");
67
+ }
68
+ return Buffer.from(payload.data, "utf-8");
69
+ }
70
+ export {
71
+ parseSecretUri,
72
+ normalizeSecretPayload,
73
+ SecretProviderError
74
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,35 @@
1
+ import type { SecretFetchOptions, SecretProvider, SecretReference, SecretRotationResult, SecretValue, SecretWritePayload } from './provider';
2
+ interface ScalewaySecretManagerProviderOptions {
3
+ /**
4
+ * Scaleway API token (SCW secret key). If omitted, uses env vars.
5
+ * Header: X-Auth-Token
6
+ */
7
+ token?: string;
8
+ /** Default region when not present in reference (e.g. fr-par). */
9
+ defaultRegion?: string;
10
+ /** Default project id used when creating secrets by name. */
11
+ defaultProjectId?: string;
12
+ /** Override API base url (defaults to https://api.scaleway.com). */
13
+ baseUrl?: string;
14
+ /** Inject fetch for tests. */
15
+ fetch?: typeof fetch;
16
+ }
17
+ export declare class ScalewaySecretManagerProvider implements SecretProvider {
18
+ readonly id = "scaleway-secret-manager";
19
+ private readonly token;
20
+ private readonly defaultRegion?;
21
+ private readonly defaultProjectId?;
22
+ private readonly baseUrl;
23
+ private readonly fetchFn;
24
+ constructor(options?: ScalewaySecretManagerProviderOptions);
25
+ canHandle(reference: SecretReference): boolean;
26
+ getSecret(reference: SecretReference, options?: SecretFetchOptions): Promise<SecretValue>;
27
+ setSecret(reference: SecretReference, payload: SecretWritePayload): Promise<SecretRotationResult>;
28
+ rotateSecret(reference: SecretReference, payload: SecretWritePayload): Promise<SecretRotationResult>;
29
+ deleteSecret(reference: SecretReference): Promise<void>;
30
+ private parseReference;
31
+ private createSecret;
32
+ private createSecretVersion;
33
+ private buildReference;
34
+ }
35
+ export {};