@lssm/lib.contracts 1.7.3 → 1.9.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.
- package/README.md +62 -325
- package/dist/app-config/contracts.d.ts +51 -49
- package/dist/app-config/contracts.d.ts.map +1 -1
- package/dist/app-config/contracts.js +1 -1
- package/dist/app-config/contracts.js.map +1 -1
- package/dist/app-config/events.d.ts +28 -26
- package/dist/app-config/events.d.ts.map +1 -1
- package/dist/app-config/events.js +1 -1
- package/dist/app-config/events.js.map +1 -1
- package/dist/app-config/lifecycle-contracts.d.ts +81 -79
- package/dist/app-config/lifecycle-contracts.d.ts.map +1 -1
- package/dist/app-config/lifecycle-contracts.js +1 -1
- package/dist/app-config/lifecycle-contracts.js.map +1 -1
- package/dist/app-config/runtime.d.ts.map +1 -1
- package/dist/app-config/runtime.js.map +1 -1
- package/dist/app-config/spec.d.ts +2 -2
- package/dist/app-config/spec.d.ts.map +1 -1
- package/dist/app-config/spec.js.map +1 -1
- package/dist/app-config/validation.d.ts.map +1 -1
- package/dist/app-config/validation.js.map +1 -1
- package/dist/capabilities/openbanking.d.ts.map +1 -1
- package/dist/capabilities/openbanking.js.map +1 -1
- package/dist/capabilities.d.ts +2 -1
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +1 -1
- package/dist/capabilities.js.map +1 -1
- package/dist/client/react/form-render.d.ts +1 -0
- package/dist/client/react/form-render.d.ts.map +1 -1
- package/dist/contracts-adapter-input.d.ts +1 -0
- package/dist/contracts-adapter-input.d.ts.map +1 -1
- package/dist/data-views/query-generator.d.ts +40 -0
- package/dist/data-views/query-generator.d.ts.map +1 -0
- package/dist/data-views/query-generator.js +2 -0
- package/dist/data-views/query-generator.js.map +1 -0
- package/dist/data-views/runtime.d.ts +27 -0
- package/dist/data-views/runtime.d.ts.map +1 -0
- package/dist/data-views/runtime.js +2 -0
- package/dist/data-views/runtime.js.map +1 -0
- package/dist/data-views.js.map +1 -1
- package/dist/events.d.ts +1 -0
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +1 -1
- package/dist/events.js.map +1 -1
- package/dist/experiments/evaluator.d.ts.map +1 -1
- package/dist/experiments/evaluator.js.map +1 -1
- package/dist/experiments/spec-resolver.d.ts +17 -0
- package/dist/experiments/spec-resolver.d.ts.map +1 -0
- package/dist/experiments/spec-resolver.js +0 -0
- package/dist/experiments/spec.js.map +1 -1
- package/dist/forms.d.ts +1 -0
- package/dist/forms.d.ts.map +1 -1
- package/dist/graphql-federation/dist/index.js +2 -0
- package/dist/graphql-federation/dist/index.js.map +1 -0
- package/dist/index.d.ts +4 -3
- package/dist/index.js +1 -1
- package/dist/install.d.ts +1 -0
- package/dist/install.d.ts.map +1 -1
- package/dist/integrations/connection.d.ts.map +1 -1
- package/dist/integrations/contracts.d.ts +103 -101
- package/dist/integrations/contracts.d.ts.map +1 -1
- package/dist/integrations/contracts.js +1 -1
- package/dist/integrations/contracts.js.map +1 -1
- package/dist/integrations/health.d.ts.map +1 -1
- package/dist/integrations/health.js.map +1 -1
- package/dist/integrations/openbanking/contracts/accounts.d.ts +67 -65
- package/dist/integrations/openbanking/contracts/accounts.d.ts.map +1 -1
- package/dist/integrations/openbanking/contracts/accounts.js +1 -1
- package/dist/integrations/openbanking/contracts/accounts.js.map +1 -1
- package/dist/integrations/openbanking/contracts/balances.d.ts +35 -33
- package/dist/integrations/openbanking/contracts/balances.d.ts.map +1 -1
- package/dist/integrations/openbanking/contracts/balances.js +1 -1
- package/dist/integrations/openbanking/contracts/balances.js.map +1 -1
- package/dist/integrations/openbanking/contracts/index.js.map +1 -1
- package/dist/integrations/openbanking/contracts/transactions.d.ts +49 -47
- package/dist/integrations/openbanking/contracts/transactions.d.ts.map +1 -1
- package/dist/integrations/openbanking/contracts/transactions.js +1 -1
- package/dist/integrations/openbanking/contracts/transactions.js.map +1 -1
- package/dist/integrations/openbanking/guards.js.map +1 -1
- package/dist/integrations/openbanking/models.d.ts +57 -54
- package/dist/integrations/openbanking/models.d.ts.map +1 -1
- package/dist/integrations/openbanking/models.js +1 -1
- package/dist/integrations/openbanking/models.js.map +1 -1
- package/dist/integrations/openbanking/telemetry.js.map +1 -1
- package/dist/integrations/providers/elevenlabs.d.ts.map +1 -1
- package/dist/integrations/providers/elevenlabs.js.map +1 -1
- package/dist/integrations/providers/gcs-storage.js.map +1 -1
- package/dist/integrations/providers/gmail.d.ts.map +1 -1
- package/dist/integrations/providers/gmail.js.map +1 -1
- package/dist/integrations/providers/google-calendar.js.map +1 -1
- package/dist/integrations/providers/impls/elevenlabs-voice.js.map +1 -1
- package/dist/integrations/providers/impls/gcs-storage.js.map +1 -1
- package/dist/integrations/providers/impls/gmail-inbound.js.map +1 -1
- package/dist/integrations/providers/impls/gmail-outbound.d.ts.map +1 -1
- package/dist/integrations/providers/impls/gmail-outbound.js.map +1 -1
- package/dist/integrations/providers/impls/google-calendar.d.ts.map +1 -1
- package/dist/integrations/providers/impls/google-calendar.js.map +1 -1
- package/dist/integrations/providers/impls/mistral-embedding.js.map +1 -1
- package/dist/integrations/providers/impls/mistral-llm.js.map +1 -1
- package/dist/integrations/providers/impls/postmark-email.js.map +1 -1
- package/dist/integrations/providers/impls/powens-client.d.ts.map +1 -1
- package/dist/integrations/providers/impls/powens-client.js.map +1 -1
- package/dist/integrations/providers/impls/powens-openbanking.d.ts.map +1 -1
- package/dist/integrations/providers/impls/powens-openbanking.js.map +1 -1
- package/dist/integrations/providers/impls/provider-factory.d.ts.map +1 -1
- package/dist/integrations/providers/impls/provider-factory.js.map +1 -1
- package/dist/integrations/providers/impls/qdrant-vector.d.ts.map +1 -1
- package/dist/integrations/providers/impls/qdrant-vector.js.map +1 -1
- package/dist/integrations/providers/impls/stripe-payments.d.ts.map +1 -1
- package/dist/integrations/providers/impls/stripe-payments.js.map +1 -1
- package/dist/integrations/providers/impls/twilio-sms.js.map +1 -1
- package/dist/integrations/providers/llm.d.ts.map +1 -1
- package/dist/integrations/providers/mistral.d.ts.map +1 -1
- package/dist/integrations/providers/mistral.js.map +1 -1
- package/dist/integrations/providers/payments.d.ts.map +1 -1
- package/dist/integrations/providers/postmark.d.ts.map +1 -1
- package/dist/integrations/providers/postmark.js.map +1 -1
- package/dist/integrations/providers/powens.js.map +1 -1
- package/dist/integrations/providers/qdrant.d.ts.map +1 -1
- package/dist/integrations/providers/qdrant.js.map +1 -1
- package/dist/integrations/providers/stripe.js.map +1 -1
- package/dist/integrations/providers/twilio-sms.js.map +1 -1
- package/dist/integrations/runtime.d.ts.map +1 -1
- package/dist/integrations/runtime.js.map +1 -1
- package/dist/integrations/secrets/env-secret-provider.js.map +1 -1
- package/dist/integrations/secrets/gcp-secret-manager.d.ts.map +1 -1
- package/dist/integrations/secrets/gcp-secret-manager.js.map +1 -1
- package/dist/integrations/secrets/manager.d.ts +2 -2
- package/dist/integrations/secrets/manager.d.ts.map +1 -1
- package/dist/integrations/secrets/manager.js.map +1 -1
- package/dist/integrations/secrets/provider.js.map +1 -1
- package/dist/integrations/spec.d.ts.map +1 -1
- package/dist/integrations/spec.js.map +1 -1
- package/dist/jobs/gcp-cloud-tasks.js.map +1 -1
- package/dist/jobs/gcp-pubsub.d.ts.map +1 -1
- package/dist/jobs/gcp-pubsub.js.map +1 -1
- package/dist/jobs/handlers/gmail-sync-handler.js.map +1 -1
- package/dist/jobs/handlers/storage-document-handler.js.map +1 -1
- package/dist/jobs/memory-queue.d.ts.map +1 -1
- package/dist/jobs/memory-queue.js.map +1 -1
- package/dist/jobs/queue.d.ts.map +1 -1
- package/dist/jsonschema.d.ts +1 -1
- package/dist/jsonschema.d.ts.map +1 -1
- package/dist/knowledge/contracts.d.ts +67 -65
- package/dist/knowledge/contracts.d.ts.map +1 -1
- package/dist/knowledge/contracts.js +1 -1
- package/dist/knowledge/contracts.js.map +1 -1
- package/dist/knowledge/ingestion/document-processor.js.map +1 -1
- package/dist/knowledge/ingestion/embedding-service.d.ts.map +1 -1
- package/dist/knowledge/ingestion/embedding-service.js.map +1 -1
- package/dist/knowledge/ingestion/gmail-adapter.d.ts.map +1 -1
- package/dist/knowledge/ingestion/gmail-adapter.js.map +1 -1
- package/dist/knowledge/ingestion/storage-adapter.js.map +1 -1
- package/dist/knowledge/ingestion/vector-indexer.js.map +1 -1
- package/dist/knowledge/query/service.d.ts +2 -2
- package/dist/knowledge/query/service.d.ts.map +1 -1
- package/dist/knowledge/query/service.js.map +1 -1
- package/dist/knowledge/runtime.d.ts.map +1 -1
- package/dist/knowledge/runtime.js.map +1 -1
- package/dist/knowledge/spaces/email-threads.js.map +1 -1
- package/dist/knowledge/spaces/financial-docs.js.map +1 -1
- package/dist/knowledge/spaces/financial-overview.js.map +1 -1
- package/dist/knowledge/spaces/product-canon.js.map +1 -1
- package/dist/knowledge/spaces/support-faq.js.map +1 -1
- package/dist/knowledge/spaces/uploaded-docs.js.map +1 -1
- package/dist/knowledge/spec.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js.map +1 -1
- package/dist/onboarding-base.d.ts +30 -28
- package/dist/onboarding-base.d.ts.map +1 -1
- package/dist/onboarding-base.js +1 -1
- package/dist/onboarding-base.js.map +1 -1
- package/dist/policy/engine.js.map +1 -1
- package/dist/policy/opa-adapter.d.ts.map +1 -1
- package/dist/policy/opa-adapter.js.map +1 -1
- package/dist/policy/spec.d.ts.map +1 -1
- package/dist/policy/spec.js.map +1 -1
- package/dist/presentations.d.ts +1 -0
- package/dist/presentations.d.ts.map +1 -1
- package/dist/presentations.v2.d.ts +1 -0
- package/dist/presentations.v2.d.ts.map +1 -1
- package/dist/regenerator/executor.d.ts.map +1 -1
- package/dist/regenerator/executor.js.map +1 -1
- package/dist/regenerator/service.d.ts.map +1 -1
- package/dist/regenerator/service.js.map +1 -1
- package/dist/regenerator/sinks.d.ts.map +1 -1
- package/dist/regenerator/sinks.js.map +1 -1
- package/dist/regenerator/types.d.ts.map +1 -1
- package/dist/regenerator/utils.js.map +1 -1
- package/dist/registry.d.ts +37 -9
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +1 -1
- package/dist/registry.js.map +1 -1
- package/dist/schema/dist/FieldType.js +2 -0
- package/dist/schema/dist/FieldType.js.map +1 -0
- package/dist/schema/dist/ScalarTypeEnum.js +2 -0
- package/dist/schema/dist/ScalarTypeEnum.js.map +1 -0
- package/dist/schema/{src → dist}/SchemaModel.js +1 -1
- package/dist/schema/dist/SchemaModel.js.map +1 -0
- package/dist/schema/dist/index.js +1 -0
- package/dist/server/graphql-pothos.d.ts +15 -2
- package/dist/server/graphql-pothos.d.ts.map +1 -1
- package/dist/server/graphql-pothos.js.map +1 -1
- package/dist/server/graphql-schema-export.js +1 -1
- package/dist/server/graphql-schema-export.js.map +1 -1
- package/dist/server/provider-mcp.d.ts +22 -4
- package/dist/server/provider-mcp.d.ts.map +1 -1
- package/dist/server/provider-mcp.js.map +1 -1
- package/dist/server/rest-next-app.d.ts +23 -3
- package/dist/server/rest-next-app.d.ts.map +1 -1
- package/dist/server/rest-next-app.js.map +1 -1
- package/dist/spec.d.ts +23 -0
- package/dist/spec.d.ts.map +1 -1
- package/dist/spec.js.map +1 -1
- package/dist/telemetry/anomaly.js.map +1 -1
- package/dist/telemetry/spec.d.ts.map +1 -1
- package/dist/telemetry/spec.js.map +1 -1
- package/dist/telemetry/tracker.d.ts.map +1 -1
- package/dist/telemetry/tracker.js.map +1 -1
- package/dist/tests/runner.js.map +1 -1
- package/dist/tests/spec.js.map +1 -1
- package/dist/themes.d.ts.map +1 -1
- package/dist/themes.js.map +1 -1
- package/dist/types/all.d.ts +2 -2
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/workflow/adapters/db-adapter.d.ts +30 -10
- package/dist/workflow/adapters/db-adapter.d.ts.map +1 -1
- package/dist/workflow/adapters/db-adapter.js +1 -1
- package/dist/workflow/adapters/db-adapter.js.map +1 -1
- package/dist/workflow/adapters/file-adapter.js.map +1 -1
- package/dist/workflow/adapters/index.d.ts +2 -2
- package/dist/workflow/adapters/index.js +1 -1
- package/dist/workflow/adapters/memory-store.d.ts.map +1 -1
- package/dist/workflow/adapters/memory-store.js.map +1 -1
- package/dist/workflow/expression.js.map +1 -1
- package/dist/workflow/index.d.ts +2 -2
- package/dist/workflow/index.js +1 -1
- package/dist/workflow/runner.d.ts +1 -0
- package/dist/workflow/runner.d.ts.map +1 -1
- package/dist/workflow/runner.js +1 -1
- package/dist/workflow/runner.js.map +1 -1
- package/dist/workflow/sla-monitor.d.ts +21 -0
- package/dist/workflow/sla-monitor.d.ts.map +1 -0
- package/dist/workflow/sla-monitor.js +2 -0
- package/dist/workflow/sla-monitor.js.map +1 -0
- package/dist/workflow/spec.d.ts.map +1 -1
- package/dist/workflow/spec.js.map +1 -1
- package/dist/workflow/state.d.ts +1 -0
- package/dist/workflow/state.d.ts.map +1 -1
- package/dist/workflow/validation.d.ts.map +1 -1
- package/dist/workflow/validation.js.map +1 -1
- package/package.json +181 -177
- package/dist/graphql-federation/src/index.js +0 -2
- package/dist/graphql-federation/src/index.js.map +0 -1
- package/dist/schema/src/FieldType.js +0 -2
- package/dist/schema/src/FieldType.js.map +0 -1
- package/dist/schema/src/ScalarTypeEnum.js +0 -2
- package/dist/schema/src/ScalarTypeEnum.js.map +0 -1
- package/dist/schema/src/SchemaModel.js.map +0 -1
- package/dist/schema/src/index.js +0 -1
- /package/dist/schema/{src → dist}/EnumType.js +0 -0
|
@@ -1,223 +1,226 @@
|
|
|
1
|
+
import * as _lssm_lib_schema427 from "@lssm/lib.schema";
|
|
2
|
+
import { SchemaModel } from "@lssm/lib.schema";
|
|
3
|
+
|
|
1
4
|
//#region src/integrations/openbanking/models.d.ts
|
|
2
5
|
declare const BankAccountRecord: SchemaModel<{
|
|
3
6
|
id: {
|
|
4
|
-
type:
|
|
7
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
5
8
|
isOptional: false;
|
|
6
9
|
};
|
|
7
10
|
tenantId: {
|
|
8
|
-
type:
|
|
11
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
9
12
|
isOptional: false;
|
|
10
13
|
};
|
|
11
14
|
userId: {
|
|
12
|
-
type:
|
|
15
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
13
16
|
isOptional: false;
|
|
14
17
|
};
|
|
15
18
|
connectionId: {
|
|
16
|
-
type:
|
|
19
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
17
20
|
isOptional: false;
|
|
18
21
|
};
|
|
19
22
|
externalId: {
|
|
20
|
-
type:
|
|
23
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
21
24
|
isOptional: false;
|
|
22
25
|
};
|
|
23
26
|
institutionId: {
|
|
24
|
-
type:
|
|
27
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
25
28
|
isOptional: false;
|
|
26
29
|
};
|
|
27
30
|
institutionName: {
|
|
28
|
-
type:
|
|
31
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
29
32
|
isOptional: false;
|
|
30
33
|
};
|
|
31
34
|
institutionLogoUrl: {
|
|
32
|
-
type:
|
|
35
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
33
36
|
isOptional: true;
|
|
34
37
|
};
|
|
35
38
|
iban: {
|
|
36
|
-
type:
|
|
39
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
37
40
|
isOptional: true;
|
|
38
41
|
};
|
|
39
42
|
bic: {
|
|
40
|
-
type:
|
|
43
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
41
44
|
isOptional: true;
|
|
42
45
|
};
|
|
43
46
|
accountType: {
|
|
44
|
-
type:
|
|
47
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
45
48
|
isOptional: false;
|
|
46
49
|
};
|
|
47
50
|
currency: {
|
|
48
|
-
type:
|
|
51
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
49
52
|
isOptional: false;
|
|
50
53
|
};
|
|
51
54
|
displayName: {
|
|
52
|
-
type:
|
|
55
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
53
56
|
isOptional: false;
|
|
54
57
|
};
|
|
55
58
|
accountNumberMasked: {
|
|
56
|
-
type:
|
|
59
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
57
60
|
isOptional: true;
|
|
58
61
|
};
|
|
59
62
|
productCode: {
|
|
60
|
-
type:
|
|
63
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
61
64
|
isOptional: true;
|
|
62
65
|
};
|
|
63
66
|
balance: {
|
|
64
|
-
type:
|
|
67
|
+
type: _lssm_lib_schema427.FieldType<number, number>;
|
|
65
68
|
isOptional: true;
|
|
66
69
|
};
|
|
67
70
|
availableBalance: {
|
|
68
|
-
type:
|
|
71
|
+
type: _lssm_lib_schema427.FieldType<number, number>;
|
|
69
72
|
isOptional: true;
|
|
70
73
|
};
|
|
71
74
|
lastSyncedAt: {
|
|
72
|
-
type:
|
|
75
|
+
type: _lssm_lib_schema427.FieldType<Date, string>;
|
|
73
76
|
isOptional: false;
|
|
74
77
|
};
|
|
75
78
|
createdAt: {
|
|
76
|
-
type:
|
|
79
|
+
type: _lssm_lib_schema427.FieldType<Date, string>;
|
|
77
80
|
isOptional: false;
|
|
78
81
|
};
|
|
79
82
|
updatedAt: {
|
|
80
|
-
type:
|
|
83
|
+
type: _lssm_lib_schema427.FieldType<Date, string>;
|
|
81
84
|
isOptional: false;
|
|
82
85
|
};
|
|
83
86
|
metadata: {
|
|
84
|
-
type:
|
|
87
|
+
type: _lssm_lib_schema427.FieldType<Record<string, unknown>, Record<string, unknown>>;
|
|
85
88
|
isOptional: true;
|
|
86
89
|
};
|
|
87
90
|
}>;
|
|
88
91
|
declare const BankTransactionRecord: SchemaModel<{
|
|
89
92
|
id: {
|
|
90
|
-
type:
|
|
93
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
91
94
|
isOptional: false;
|
|
92
95
|
};
|
|
93
96
|
accountId: {
|
|
94
|
-
type:
|
|
97
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
95
98
|
isOptional: false;
|
|
96
99
|
};
|
|
97
100
|
tenantId: {
|
|
98
|
-
type:
|
|
101
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
99
102
|
isOptional: false;
|
|
100
103
|
};
|
|
101
104
|
connectionId: {
|
|
102
|
-
type:
|
|
105
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
103
106
|
isOptional: false;
|
|
104
107
|
};
|
|
105
108
|
externalId: {
|
|
106
|
-
type:
|
|
109
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
107
110
|
isOptional: false;
|
|
108
111
|
};
|
|
109
112
|
amount: {
|
|
110
|
-
type:
|
|
113
|
+
type: _lssm_lib_schema427.FieldType<number, number>;
|
|
111
114
|
isOptional: false;
|
|
112
115
|
};
|
|
113
116
|
currency: {
|
|
114
|
-
type:
|
|
117
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
115
118
|
isOptional: false;
|
|
116
119
|
};
|
|
117
120
|
date: {
|
|
118
|
-
type:
|
|
121
|
+
type: _lssm_lib_schema427.FieldType<Date, string>;
|
|
119
122
|
isOptional: false;
|
|
120
123
|
};
|
|
121
124
|
bookingDate: {
|
|
122
|
-
type:
|
|
125
|
+
type: _lssm_lib_schema427.FieldType<Date, string>;
|
|
123
126
|
isOptional: true;
|
|
124
127
|
};
|
|
125
128
|
valueDate: {
|
|
126
|
-
type:
|
|
129
|
+
type: _lssm_lib_schema427.FieldType<Date, string>;
|
|
127
130
|
isOptional: true;
|
|
128
131
|
};
|
|
129
132
|
description: {
|
|
130
|
-
type:
|
|
133
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
131
134
|
isOptional: true;
|
|
132
135
|
};
|
|
133
136
|
counterpartyName: {
|
|
134
|
-
type:
|
|
137
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
135
138
|
isOptional: true;
|
|
136
139
|
};
|
|
137
140
|
counterpartyAccount: {
|
|
138
|
-
type:
|
|
141
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
139
142
|
isOptional: true;
|
|
140
143
|
};
|
|
141
144
|
merchantCategoryCode: {
|
|
142
|
-
type:
|
|
145
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
143
146
|
isOptional: true;
|
|
144
147
|
};
|
|
145
148
|
rawCategory: {
|
|
146
|
-
type:
|
|
149
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
147
150
|
isOptional: true;
|
|
148
151
|
};
|
|
149
152
|
standardizedCategory: {
|
|
150
|
-
type:
|
|
153
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
151
154
|
isOptional: true;
|
|
152
155
|
};
|
|
153
156
|
transactionType: {
|
|
154
|
-
type:
|
|
157
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
155
158
|
isOptional: false;
|
|
156
159
|
};
|
|
157
160
|
status: {
|
|
158
|
-
type:
|
|
161
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
159
162
|
isOptional: false;
|
|
160
163
|
};
|
|
161
164
|
runningBalance: {
|
|
162
|
-
type:
|
|
165
|
+
type: _lssm_lib_schema427.FieldType<number, number>;
|
|
163
166
|
isOptional: true;
|
|
164
167
|
};
|
|
165
168
|
metadata: {
|
|
166
|
-
type:
|
|
169
|
+
type: _lssm_lib_schema427.FieldType<Record<string, unknown>, Record<string, unknown>>;
|
|
167
170
|
isOptional: true;
|
|
168
171
|
};
|
|
169
172
|
createdAt: {
|
|
170
|
-
type:
|
|
173
|
+
type: _lssm_lib_schema427.FieldType<Date, string>;
|
|
171
174
|
isOptional: false;
|
|
172
175
|
};
|
|
173
176
|
updatedAt: {
|
|
174
|
-
type:
|
|
177
|
+
type: _lssm_lib_schema427.FieldType<Date, string>;
|
|
175
178
|
isOptional: false;
|
|
176
179
|
};
|
|
177
180
|
}>;
|
|
178
181
|
declare const AccountBalanceRecord: SchemaModel<{
|
|
179
182
|
id: {
|
|
180
|
-
type:
|
|
183
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
181
184
|
isOptional: false;
|
|
182
185
|
};
|
|
183
186
|
accountId: {
|
|
184
|
-
type:
|
|
187
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
185
188
|
isOptional: false;
|
|
186
189
|
};
|
|
187
190
|
tenantId: {
|
|
188
|
-
type:
|
|
191
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
189
192
|
isOptional: false;
|
|
190
193
|
};
|
|
191
194
|
connectionId: {
|
|
192
|
-
type:
|
|
195
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
193
196
|
isOptional: false;
|
|
194
197
|
};
|
|
195
198
|
balanceType: {
|
|
196
|
-
type:
|
|
199
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
197
200
|
isOptional: false;
|
|
198
201
|
};
|
|
199
202
|
currentBalance: {
|
|
200
|
-
type:
|
|
203
|
+
type: _lssm_lib_schema427.FieldType<number, number>;
|
|
201
204
|
isOptional: false;
|
|
202
205
|
};
|
|
203
206
|
availableBalance: {
|
|
204
|
-
type:
|
|
207
|
+
type: _lssm_lib_schema427.FieldType<number, number>;
|
|
205
208
|
isOptional: true;
|
|
206
209
|
};
|
|
207
210
|
currency: {
|
|
208
|
-
type:
|
|
211
|
+
type: _lssm_lib_schema427.FieldType<string, string>;
|
|
209
212
|
isOptional: false;
|
|
210
213
|
};
|
|
211
214
|
lastUpdatedAt: {
|
|
212
|
-
type:
|
|
215
|
+
type: _lssm_lib_schema427.FieldType<Date, string>;
|
|
213
216
|
isOptional: false;
|
|
214
217
|
};
|
|
215
218
|
createdAt: {
|
|
216
|
-
type:
|
|
219
|
+
type: _lssm_lib_schema427.FieldType<Date, string>;
|
|
217
220
|
isOptional: false;
|
|
218
221
|
};
|
|
219
222
|
metadata: {
|
|
220
|
-
type:
|
|
223
|
+
type: _lssm_lib_schema427.FieldType<Record<string, unknown>, Record<string, unknown>>;
|
|
221
224
|
isOptional: true;
|
|
222
225
|
};
|
|
223
226
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.d.ts","names":[],"sources":["../../../src/integrations/openbanking/models.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"models.d.ts","names":[],"sources":["../../../src/integrations/openbanking/models.ts"],"sourcesContent":[],"mappings":";;;;cAEa,mBAAiB;;UAoC5B,mBAAA,CAAA;IApCW,UAAA,EAAA,KAoCX;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;IApC4B,IAAA,+BAAA,CAAA,MAAA,EAAA,MAAA,CAAA;IAAA,UAAA,EAAA,IAAA;EAsCjB,CAAA;EA2CX,IAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA3CgC,IAAA,+BAAA,CAAA,MAAA,EAAA,MAAA,CAAA;IAAA,UAAA,EAAA,IAAA;EA6CrB,CAAA;EAuBX,gBAAA,EAAA;;;;;;;;;;;;;;;EAvB+B,CAAA;EAAA,QAAA,EAAA;;;;;cA7CpB,uBAAqB;;UA2ChC,mBAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAEW,sBAAoB;;UAuB/B,mBAAA,CAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{l as e}from"../../schema/dist/ScalarTypeEnum.js";import{t}from"../../schema/dist/SchemaModel.js";import"../../schema/dist/index.js";const n=new t({name:`BankAccountRecord`,description:`Canonical representation of a bank account synced from an open banking provider.`,fields:{id:{type:e.ID(),isOptional:!1},tenantId:{type:e.ID(),isOptional:!1},userId:{type:e.ID(),isOptional:!1},connectionId:{type:e.ID(),isOptional:!1},externalId:{type:e.NonEmptyString(),isOptional:!1},institutionId:{type:e.NonEmptyString(),isOptional:!1},institutionName:{type:e.NonEmptyString(),isOptional:!1},institutionLogoUrl:{type:e.URL(),isOptional:!0},iban:{type:e.String_unsecure(),isOptional:!0},bic:{type:e.String_unsecure(),isOptional:!0},accountType:{type:e.NonEmptyString(),isOptional:!1},currency:{type:e.Currency(),isOptional:!1},displayName:{type:e.NonEmptyString(),isOptional:!1},accountNumberMasked:{type:e.String_unsecure(),isOptional:!0},productCode:{type:e.String_unsecure(),isOptional:!0},balance:{type:e.Float_unsecure(),isOptional:!0},availableBalance:{type:e.Float_unsecure(),isOptional:!0},lastSyncedAt:{type:e.DateTime(),isOptional:!1},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1},metadata:{type:e.JSONObject(),isOptional:!0}}}),r=new t({name:`BankTransactionRecord`,description:`Canonical transaction entry mapped from Powens into the open banking ledger.`,fields:{id:{type:e.ID(),isOptional:!1},accountId:{type:e.ID(),isOptional:!1},tenantId:{type:e.ID(),isOptional:!1},connectionId:{type:e.ID(),isOptional:!1},externalId:{type:e.NonEmptyString(),isOptional:!1},amount:{type:e.Float_unsecure(),isOptional:!1},currency:{type:e.Currency(),isOptional:!1},date:{type:e.DateTime(),isOptional:!1},bookingDate:{type:e.DateTime(),isOptional:!0},valueDate:{type:e.DateTime(),isOptional:!0},description:{type:e.String_unsecure(),isOptional:!0},counterpartyName:{type:e.String_unsecure(),isOptional:!0},counterpartyAccount:{type:e.String_unsecure(),isOptional:!0},merchantCategoryCode:{type:e.String_unsecure(),isOptional:!0},rawCategory:{type:e.String_unsecure(),isOptional:!0},standardizedCategory:{type:e.String_unsecure(),isOptional:!0},transactionType:{type:e.NonEmptyString(),isOptional:!1},status:{type:e.NonEmptyString(),isOptional:!1},runningBalance:{type:e.Float_unsecure(),isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),i=new t({name:`AccountBalanceRecord`,description:`Canonical balance snapshot computed from Powens balance payloads.`,fields:{id:{type:e.ID(),isOptional:!1},accountId:{type:e.ID(),isOptional:!1},tenantId:{type:e.ID(),isOptional:!1},connectionId:{type:e.ID(),isOptional:!1},balanceType:{type:e.NonEmptyString(),isOptional:!1},currentBalance:{type:e.Float_unsecure(),isOptional:!1},availableBalance:{type:e.Float_unsecure(),isOptional:!0},currency:{type:e.Currency(),isOptional:!1},lastUpdatedAt:{type:e.DateTime(),isOptional:!1},createdAt:{type:e.DateTime(),isOptional:!1},metadata:{type:e.JSONObject(),isOptional:!0}}});export{i as AccountBalanceRecord,n as BankAccountRecord,r as BankTransactionRecord};
|
|
2
2
|
//# sourceMappingURL=models.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","names":[],"sources":["../../../src/integrations/openbanking/models.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"models.js","names":["SchemaModel","ScalarTypeEnum"],"sources":["../../../src/integrations/openbanking/models.ts"],"sourcesContent":["import { ScalarTypeEnum, SchemaModel } from '@lssm/lib.schema';\n\nexport const BankAccountRecord = new SchemaModel({\n name: 'BankAccountRecord',\n description:\n 'Canonical representation of a bank account synced from an open banking provider.',\n fields: {\n id: { type: ScalarTypeEnum.ID(), isOptional: false },\n tenantId: { type: ScalarTypeEnum.ID(), isOptional: false },\n userId: { type: ScalarTypeEnum.ID(), isOptional: false },\n connectionId: { type: ScalarTypeEnum.ID(), isOptional: false },\n externalId: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },\n institutionId: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },\n institutionName: {\n type: ScalarTypeEnum.NonEmptyString(),\n isOptional: false,\n },\n institutionLogoUrl: { type: ScalarTypeEnum.URL(), isOptional: true },\n iban: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n bic: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n accountType: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },\n currency: { type: ScalarTypeEnum.Currency(), isOptional: false },\n displayName: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },\n accountNumberMasked: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: true,\n },\n productCode: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n balance: { type: ScalarTypeEnum.Float_unsecure(), isOptional: true },\n availableBalance: {\n type: ScalarTypeEnum.Float_unsecure(),\n isOptional: true,\n },\n lastSyncedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n createdAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n updatedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n metadata: { type: ScalarTypeEnum.JSONObject(), isOptional: true },\n },\n});\n\nexport const BankTransactionRecord = new SchemaModel({\n name: 'BankTransactionRecord',\n description:\n 'Canonical transaction entry mapped from Powens into the open banking ledger.',\n fields: {\n id: { type: ScalarTypeEnum.ID(), isOptional: false },\n accountId: { type: ScalarTypeEnum.ID(), isOptional: false },\n tenantId: { type: ScalarTypeEnum.ID(), isOptional: false },\n connectionId: { type: ScalarTypeEnum.ID(), isOptional: false },\n externalId: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },\n amount: { type: ScalarTypeEnum.Float_unsecure(), isOptional: false },\n currency: { type: ScalarTypeEnum.Currency(), isOptional: false },\n date: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n bookingDate: { type: ScalarTypeEnum.DateTime(), isOptional: true },\n valueDate: { type: ScalarTypeEnum.DateTime(), isOptional: true },\n description: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n counterpartyName: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: true,\n },\n counterpartyAccount: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: true,\n },\n merchantCategoryCode: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: true,\n },\n rawCategory: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n standardizedCategory: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: true,\n },\n transactionType: {\n type: ScalarTypeEnum.NonEmptyString(),\n isOptional: false,\n },\n status: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },\n runningBalance: { type: ScalarTypeEnum.Float_unsecure(), isOptional: true },\n metadata: { type: ScalarTypeEnum.JSONObject(), isOptional: true },\n createdAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n updatedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\nexport const AccountBalanceRecord = new SchemaModel({\n name: 'AccountBalanceRecord',\n description:\n 'Canonical balance snapshot computed from Powens balance payloads.',\n fields: {\n id: { type: ScalarTypeEnum.ID(), isOptional: false },\n accountId: { type: ScalarTypeEnum.ID(), isOptional: false },\n tenantId: { type: ScalarTypeEnum.ID(), isOptional: false },\n connectionId: { type: ScalarTypeEnum.ID(), isOptional: false },\n balanceType: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },\n currentBalance: {\n type: ScalarTypeEnum.Float_unsecure(),\n isOptional: false,\n },\n availableBalance: {\n type: ScalarTypeEnum.Float_unsecure(),\n isOptional: true,\n },\n currency: { type: ScalarTypeEnum.Currency(), isOptional: false },\n lastUpdatedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n createdAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n metadata: { type: ScalarTypeEnum.JSONObject(), isOptional: true },\n },\n});\n"],"mappings":"2IAEA,MAAa,EAAoB,IAAIA,EAAY,CAC/C,KAAM,oBACN,YACE,mFACF,OAAQ,CACN,GAAI,CAAE,KAAMC,EAAe,IAAI,CAAE,WAAY,GAAO,CACpD,SAAU,CAAE,KAAMA,EAAe,IAAI,CAAE,WAAY,GAAO,CAC1D,OAAQ,CAAE,KAAMA,EAAe,IAAI,CAAE,WAAY,GAAO,CACxD,aAAc,CAAE,KAAMA,EAAe,IAAI,CAAE,WAAY,GAAO,CAC9D,WAAY,CAAE,KAAMA,EAAe,gBAAgB,CAAE,WAAY,GAAO,CACxE,cAAe,CAAE,KAAMA,EAAe,gBAAgB,CAAE,WAAY,GAAO,CAC3E,gBAAiB,CACf,KAAMA,EAAe,gBAAgB,CACrC,WAAY,GACb,CACD,mBAAoB,CAAE,KAAMA,EAAe,KAAK,CAAE,WAAY,GAAM,CACpE,KAAM,CAAE,KAAMA,EAAe,iBAAiB,CAAE,WAAY,GAAM,CAClE,IAAK,CAAE,KAAMA,EAAe,iBAAiB,CAAE,WAAY,GAAM,CACjE,YAAa,CAAE,KAAMA,EAAe,gBAAgB,CAAE,WAAY,GAAO,CACzE,SAAU,CAAE,KAAMA,EAAe,UAAU,CAAE,WAAY,GAAO,CAChE,YAAa,CAAE,KAAMA,EAAe,gBAAgB,CAAE,WAAY,GAAO,CACzE,oBAAqB,CACnB,KAAMA,EAAe,iBAAiB,CACtC,WAAY,GACb,CACD,YAAa,CAAE,KAAMA,EAAe,iBAAiB,CAAE,WAAY,GAAM,CACzE,QAAS,CAAE,KAAMA,EAAe,gBAAgB,CAAE,WAAY,GAAM,CACpE,iBAAkB,CAChB,KAAMA,EAAe,gBAAgB,CACrC,WAAY,GACb,CACD,aAAc,CAAE,KAAMA,EAAe,UAAU,CAAE,WAAY,GAAO,CACpE,UAAW,CAAE,KAAMA,EAAe,UAAU,CAAE,WAAY,GAAO,CACjE,UAAW,CAAE,KAAMA,EAAe,UAAU,CAAE,WAAY,GAAO,CACjE,SAAU,CAAE,KAAMA,EAAe,YAAY,CAAE,WAAY,GAAM,CAClE,CACF,CAAC,CAEW,EAAwB,IAAID,EAAY,CACnD,KAAM,wBACN,YACE,+EACF,OAAQ,CACN,GAAI,CAAE,KAAMC,EAAe,IAAI,CAAE,WAAY,GAAO,CACpD,UAAW,CAAE,KAAMA,EAAe,IAAI,CAAE,WAAY,GAAO,CAC3D,SAAU,CAAE,KAAMA,EAAe,IAAI,CAAE,WAAY,GAAO,CAC1D,aAAc,CAAE,KAAMA,EAAe,IAAI,CAAE,WAAY,GAAO,CAC9D,WAAY,CAAE,KAAMA,EAAe,gBAAgB,CAAE,WAAY,GAAO,CACxE,OAAQ,CAAE,KAAMA,EAAe,gBAAgB,CAAE,WAAY,GAAO,CACpE,SAAU,CAAE,KAAMA,EAAe,UAAU,CAAE,WAAY,GAAO,CAChE,KAAM,CAAE,KAAMA,EAAe,UAAU,CAAE,WAAY,GAAO,CAC5D,YAAa,CAAE,KAAMA,EAAe,UAAU,CAAE,WAAY,GAAM,CAClE,UAAW,CAAE,KAAMA,EAAe,UAAU,CAAE,WAAY,GAAM,CAChE,YAAa,CAAE,KAAMA,EAAe,iBAAiB,CAAE,WAAY,GAAM,CACzE,iBAAkB,CAChB,KAAMA,EAAe,iBAAiB,CACtC,WAAY,GACb,CACD,oBAAqB,CACnB,KAAMA,EAAe,iBAAiB,CACtC,WAAY,GACb,CACD,qBAAsB,CACpB,KAAMA,EAAe,iBAAiB,CACtC,WAAY,GACb,CACD,YAAa,CAAE,KAAMA,EAAe,iBAAiB,CAAE,WAAY,GAAM,CACzE,qBAAsB,CACpB,KAAMA,EAAe,iBAAiB,CACtC,WAAY,GACb,CACD,gBAAiB,CACf,KAAMA,EAAe,gBAAgB,CACrC,WAAY,GACb,CACD,OAAQ,CAAE,KAAMA,EAAe,gBAAgB,CAAE,WAAY,GAAO,CACpE,eAAgB,CAAE,KAAMA,EAAe,gBAAgB,CAAE,WAAY,GAAM,CAC3E,SAAU,CAAE,KAAMA,EAAe,YAAY,CAAE,WAAY,GAAM,CACjE,UAAW,CAAE,KAAMA,EAAe,UAAU,CAAE,WAAY,GAAO,CACjE,UAAW,CAAE,KAAMA,EAAe,UAAU,CAAE,WAAY,GAAO,CAClE,CACF,CAAC,CAEW,EAAuB,IAAID,EAAY,CAClD,KAAM,uBACN,YACE,oEACF,OAAQ,CACN,GAAI,CAAE,KAAMC,EAAe,IAAI,CAAE,WAAY,GAAO,CACpD,UAAW,CAAE,KAAMA,EAAe,IAAI,CAAE,WAAY,GAAO,CAC3D,SAAU,CAAE,KAAMA,EAAe,IAAI,CAAE,WAAY,GAAO,CAC1D,aAAc,CAAE,KAAMA,EAAe,IAAI,CAAE,WAAY,GAAO,CAC9D,YAAa,CAAE,KAAMA,EAAe,gBAAgB,CAAE,WAAY,GAAO,CACzE,eAAgB,CACd,KAAMA,EAAe,gBAAgB,CACrC,WAAY,GACb,CACD,iBAAkB,CAChB,KAAMA,EAAe,gBAAgB,CACrC,WAAY,GACb,CACD,SAAU,CAAE,KAAMA,EAAe,UAAU,CAAE,WAAY,GAAO,CAChE,cAAe,CAAE,KAAMA,EAAe,UAAU,CAAE,WAAY,GAAO,CACrE,UAAW,CAAE,KAAMA,EAAe,UAAU,CAAE,WAAY,GAAO,CACjE,SAAU,CAAE,KAAMA,EAAe,YAAY,CAAE,WAAY,GAAM,CAClE,CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","names":["redacted: Record<string, unknown>"],"sources":["../../../src/integrations/openbanking/telemetry.ts"],"sourcesContent":["export const OPENBANKING_PII_FIELDS = [\n 'iban',\n 'bic',\n 'accountNumberMasked',\n 'accountNumber',\n 'counterpartyName',\n 'counterpartyAccount',\n 'description',\n 'merchantName',\n 'merchantCategoryCode',\n 'reference',\n] as const;\n\nexport const OPENBANKING_TELEMETRY_EVENTS = {\n accountsSynced: 'openbanking.accounts.synced',\n accountsSyncFailed: 'openbanking.accounts.sync_failed',\n transactionsSynced: 'openbanking.transactions.synced',\n transactionsSyncFailed: 'openbanking.transactions.sync_failed',\n balancesRefreshed: 'openbanking.balances.refreshed',\n balancesRefreshFailed: 'openbanking.balances.refresh_failed',\n overviewGenerated: 'openbanking.overview.generated',\n} as const;\n\nexport type OpenBankingTelemetryEvent =\n (typeof OPENBANKING_TELEMETRY_EVENTS)[keyof typeof OPENBANKING_TELEMETRY_EVENTS];\n\nexport function redactOpenBankingTelemetryPayload<\n T extends Record<string, unknown
|
|
1
|
+
{"version":3,"file":"telemetry.js","names":["redacted: Record<string, unknown>"],"sources":["../../../src/integrations/openbanking/telemetry.ts"],"sourcesContent":["export const OPENBANKING_PII_FIELDS = [\n 'iban',\n 'bic',\n 'accountNumberMasked',\n 'accountNumber',\n 'counterpartyName',\n 'counterpartyAccount',\n 'description',\n 'merchantName',\n 'merchantCategoryCode',\n 'reference',\n] as const;\n\nexport const OPENBANKING_TELEMETRY_EVENTS = {\n accountsSynced: 'openbanking.accounts.synced',\n accountsSyncFailed: 'openbanking.accounts.sync_failed',\n transactionsSynced: 'openbanking.transactions.synced',\n transactionsSyncFailed: 'openbanking.transactions.sync_failed',\n balancesRefreshed: 'openbanking.balances.refreshed',\n balancesRefreshFailed: 'openbanking.balances.refresh_failed',\n overviewGenerated: 'openbanking.overview.generated',\n} as const;\n\nexport type OpenBankingTelemetryEvent =\n (typeof OPENBANKING_TELEMETRY_EVENTS)[keyof typeof OPENBANKING_TELEMETRY_EVENTS];\n\nexport function redactOpenBankingTelemetryPayload<\n T extends Record<string, unknown>,\n>(payload: T): T {\n const redacted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(payload)) {\n if (\n OPENBANKING_PII_FIELDS.includes(\n key as (typeof OPENBANKING_PII_FIELDS)[number]\n )\n ) {\n redacted[key] = maskValue(value);\n } else if (Array.isArray(value)) {\n redacted[key] = value.map((item) =>\n typeof item === 'object' && item !== null\n ? redactOpenBankingTelemetryPayload(item as Record<string, unknown>)\n : item\n );\n } else if (typeof value === 'object' && value !== null) {\n redacted[key] = redactOpenBankingTelemetryPayload(\n value as Record<string, unknown>\n );\n } else {\n redacted[key] = value;\n }\n }\n return redacted as T;\n}\n\nfunction maskValue(value: unknown): string {\n if (value == null) return '';\n const str = String(value);\n if (str.length <= 4) return '*'.repeat(str.length);\n return `${'*'.repeat(Math.max(str.length - 4, 0))}${str.slice(-4)}`;\n}\n"],"mappings":"AAAA,MAAa,EAAyB,CACpC,OACA,MACA,sBACA,gBACA,mBACA,sBACA,cACA,eACA,uBACA,YACD,CAEY,EAA+B,CAC1C,eAAgB,8BAChB,mBAAoB,mCACpB,mBAAoB,kCACpB,uBAAwB,uCACxB,kBAAmB,iCACnB,sBAAuB,sCACvB,kBAAmB,iCACpB,CAKD,SAAgB,EAEd,EAAe,CACf,IAAMA,EAAoC,EAAE,CAC5C,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,EAAQ,CAE9C,EAAuB,SACrB,EACD,CAED,EAAS,GAAO,EAAU,EAAM,CACvB,MAAM,QAAQ,EAAM,CAC7B,EAAS,GAAO,EAAM,IAAK,GACzB,OAAO,GAAS,UAAY,EACxB,EAAkC,EAAgC,CAClE,EACL,CACQ,OAAO,GAAU,UAAY,EACtC,EAAS,GAAO,EACd,EACD,CAED,EAAS,GAAO,EAGpB,OAAO,EAGT,SAAS,EAAU,EAAwB,CACzC,GAAI,GAAS,KAAM,MAAO,GAC1B,IAAM,EAAM,OAAO,EAAM,CAEzB,OADI,EAAI,QAAU,EAAU,IAAI,OAAO,EAAI,OAAO,CAC3C,GAAG,IAAI,OAAO,KAAK,IAAI,EAAI,OAAS,EAAG,EAAE,CAAC,GAAG,EAAI,MAAM,GAAG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"elevenlabs.d.ts","names":[],"sources":["../../../src/integrations/providers/elevenlabs.ts"],"sourcesContent":[],"mappings":";;;cAGa,2BAA2B;
|
|
1
|
+
{"version":3,"file":"elevenlabs.d.ts","names":[],"sources":["../../../src/integrations/providers/elevenlabs.ts"],"sourcesContent":[],"mappings":";;;cAGa,2BAA2B;iBAgExB,6BAAA,WACJ,0BACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"elevenlabs.js","names":["elevenLabsIntegrationSpec: IntegrationSpec"],"sources":["../../../src/integrations/providers/elevenlabs.ts"],"sourcesContent":["import { StabilityEnum } from '../../ownership';\nimport type { IntegrationSpec, IntegrationSpecRegistry } from '../spec';\n\nexport const elevenLabsIntegrationSpec: IntegrationSpec = {\n meta: {\n key: 'ai-voice.elevenlabs',\n version: 1,\n category: 'ai-voice',\n displayName: 'ElevenLabs Voice',\n title: 'ElevenLabs Text-to-Speech',\n description:\n 'ElevenLabs integration for neural voice synthesis and voice catalog access.',\n domain: 'ai',\n owners: ['platform.ai'],\n tags: ['voice', 'tts'],\n stability: StabilityEnum.Beta,\n },\n supportedModes: ['managed', 'byok'],\n capabilities: {\n provides: [{ key: 'ai.voice.synthesis', version: 1 }],\n },\n configSchema: {\n schema: {\n type: 'object',\n properties: {\n defaultVoiceId: {\n type: 'string',\n description
|
|
1
|
+
{"version":3,"file":"elevenlabs.js","names":["elevenLabsIntegrationSpec: IntegrationSpec"],"sources":["../../../src/integrations/providers/elevenlabs.ts"],"sourcesContent":["import { StabilityEnum } from '../../ownership';\nimport type { IntegrationSpec, IntegrationSpecRegistry } from '../spec';\n\nexport const elevenLabsIntegrationSpec: IntegrationSpec = {\n meta: {\n key: 'ai-voice.elevenlabs',\n version: 1,\n category: 'ai-voice',\n displayName: 'ElevenLabs Voice',\n title: 'ElevenLabs Text-to-Speech',\n description:\n 'ElevenLabs integration for neural voice synthesis and voice catalog access.',\n domain: 'ai',\n owners: ['platform.ai'],\n tags: ['voice', 'tts'],\n stability: StabilityEnum.Beta,\n },\n supportedModes: ['managed', 'byok'],\n capabilities: {\n provides: [{ key: 'ai.voice.synthesis', version: 1 }],\n },\n configSchema: {\n schema: {\n type: 'object',\n properties: {\n defaultVoiceId: {\n type: 'string',\n description:\n 'Optional default voice identifier for synthesis requests.',\n },\n },\n },\n example: {\n defaultVoiceId: 'pNInz6obpgDQGcFmaJgB',\n },\n },\n secretSchema: {\n schema: {\n type: 'object',\n required: ['apiKey'],\n properties: {\n apiKey: {\n type: 'string',\n description: 'ElevenLabs API key with text-to-speech permissions.',\n },\n },\n },\n example: {\n apiKey: 'eleven-***',\n },\n },\n healthCheck: {\n method: 'custom',\n timeoutMs: 4000,\n },\n docsUrl: 'https://elevenlabs.io/docs/api-reference/text-to-speech',\n constraints: {\n rateLimit: {\n rpm: 120,\n },\n },\n byokSetup: {\n setupInstructions:\n 'Create an ElevenLabs API key and ensure the desired voices are accessible to the key scope.',\n },\n};\n\nexport function registerElevenLabsIntegration(\n registry: IntegrationSpecRegistry\n): IntegrationSpecRegistry {\n return registry.register(elevenLabsIntegrationSpec);\n}\n"],"mappings":"mDAGA,MAAaA,EAA6C,CACxD,KAAM,CACJ,IAAK,sBACL,QAAS,EACT,SAAU,WACV,YAAa,mBACb,MAAO,4BACP,YACE,8EACF,OAAQ,KACR,OAAQ,CAAC,cAAc,CACvB,KAAM,CAAC,QAAS,MAAM,CACtB,UAAW,EAAc,KAC1B,CACD,eAAgB,CAAC,UAAW,OAAO,CACnC,aAAc,CACZ,SAAU,CAAC,CAAE,IAAK,qBAAsB,QAAS,EAAG,CAAC,CACtD,CACD,aAAc,CACZ,OAAQ,CACN,KAAM,SACN,WAAY,CACV,eAAgB,CACd,KAAM,SACN,YACE,4DACH,CACF,CACF,CACD,QAAS,CACP,eAAgB,uBACjB,CACF,CACD,aAAc,CACZ,OAAQ,CACN,KAAM,SACN,SAAU,CAAC,SAAS,CACpB,WAAY,CACV,OAAQ,CACN,KAAM,SACN,YAAa,sDACd,CACF,CACF,CACD,QAAS,CACP,OAAQ,aACT,CACF,CACD,YAAa,CACX,OAAQ,SACR,UAAW,IACZ,CACD,QAAS,0DACT,YAAa,CACX,UAAW,CACT,IAAK,IACN,CACF,CACD,UAAW,CACT,kBACE,8FACH,CACF,CAED,SAAgB,EACd,EACyB,CACzB,OAAO,EAAS,SAAS,EAA0B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gcs-storage.js","names":["gcsStorageIntegrationSpec: IntegrationSpec"],"sources":["../../../src/integrations/providers/gcs-storage.ts"],"sourcesContent":["import { StabilityEnum } from '../../ownership';\nimport type { IntegrationSpec, IntegrationSpecRegistry } from '../spec';\n\nexport const gcsStorageIntegrationSpec: IntegrationSpec = {\n meta: {\n key: 'storage.gcs',\n version: 1,\n category: 'storage',\n displayName: 'Google Cloud Storage',\n title: 'Google Cloud Storage Buckets',\n description:\n 'Google Cloud Storage integration for object storage and retrieval.',\n domain: 'infrastructure',\n owners: ['platform.infrastructure'],\n tags: ['storage', 'gcs', 'google-cloud'],\n stability: StabilityEnum.Beta,\n },\n supportedModes: ['managed', 'byok'],\n capabilities: {\n provides: [{ key: 'storage.objects', version: 1 }],\n },\n configSchema: {\n schema: {\n type: 'object',\n required: ['bucket'],\n properties: {\n bucket: {\n type: 'string',\n description: 'Primary bucket name used for storing objects.',\n },\n prefix: {\n type: 'string',\n description: 'Optional prefix applied to object keys.',\n },\n },\n },\n example: {\n bucket: 'pfo-tenant-assets',\n prefix: 'documents/',\n },\n },\n secretSchema: {\n schema: {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n description:\n 'Service account type field from Google credentials JSON (if provided).',\n },\n client_email: { type: 'string' },\n private_key: { type: 'string' },\n project_id: { type: 'string' },\n },\n },\n example: {\n type: 'service_account',\n client_email: 'svc-account@example.iam.gserviceaccount.com',\n private_key: '-----BEGIN PRIVATE KEY-----...',\n project_id: 'example-project',\n },\n },\n healthCheck: {\n method: 'ping',\n timeoutMs: 4000,\n },\n docsUrl: 'https://cloud.google.com/storage/docs/apis',\n constraints: {\n quotas: {\n storageGb: 5120,\n },\n },\n byokSetup: {\n setupInstructions:\n 'Create a Google Cloud service account with Storage Object Admin role and upload the JSON credentials to the secret store.',\n },\n};\n\nexport function registerGcsStorageIntegration(\n registry: IntegrationSpecRegistry\n): IntegrationSpecRegistry {\n return registry.register(gcsStorageIntegrationSpec);\n}\n
|
|
1
|
+
{"version":3,"file":"gcs-storage.js","names":["gcsStorageIntegrationSpec: IntegrationSpec"],"sources":["../../../src/integrations/providers/gcs-storage.ts"],"sourcesContent":["import { StabilityEnum } from '../../ownership';\nimport type { IntegrationSpec, IntegrationSpecRegistry } from '../spec';\n\nexport const gcsStorageIntegrationSpec: IntegrationSpec = {\n meta: {\n key: 'storage.gcs',\n version: 1,\n category: 'storage',\n displayName: 'Google Cloud Storage',\n title: 'Google Cloud Storage Buckets',\n description:\n 'Google Cloud Storage integration for object storage and retrieval.',\n domain: 'infrastructure',\n owners: ['platform.infrastructure'],\n tags: ['storage', 'gcs', 'google-cloud'],\n stability: StabilityEnum.Beta,\n },\n supportedModes: ['managed', 'byok'],\n capabilities: {\n provides: [{ key: 'storage.objects', version: 1 }],\n },\n configSchema: {\n schema: {\n type: 'object',\n required: ['bucket'],\n properties: {\n bucket: {\n type: 'string',\n description: 'Primary bucket name used for storing objects.',\n },\n prefix: {\n type: 'string',\n description: 'Optional prefix applied to object keys.',\n },\n },\n },\n example: {\n bucket: 'pfo-tenant-assets',\n prefix: 'documents/',\n },\n },\n secretSchema: {\n schema: {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n description:\n 'Service account type field from Google credentials JSON (if provided).',\n },\n client_email: { type: 'string' },\n private_key: { type: 'string' },\n project_id: { type: 'string' },\n },\n },\n example: {\n type: 'service_account',\n client_email: 'svc-account@example.iam.gserviceaccount.com',\n private_key: '-----BEGIN PRIVATE KEY-----...',\n project_id: 'example-project',\n },\n },\n healthCheck: {\n method: 'ping',\n timeoutMs: 4000,\n },\n docsUrl: 'https://cloud.google.com/storage/docs/apis',\n constraints: {\n quotas: {\n storageGb: 5120,\n },\n },\n byokSetup: {\n setupInstructions:\n 'Create a Google Cloud service account with Storage Object Admin role and upload the JSON credentials to the secret store.',\n },\n};\n\nexport function registerGcsStorageIntegration(\n registry: IntegrationSpecRegistry\n): IntegrationSpecRegistry {\n return registry.register(gcsStorageIntegrationSpec);\n}\n"],"mappings":"mDAGA,MAAaA,EAA6C,CACxD,KAAM,CACJ,IAAK,cACL,QAAS,EACT,SAAU,UACV,YAAa,uBACb,MAAO,+BACP,YACE,qEACF,OAAQ,iBACR,OAAQ,CAAC,0BAA0B,CACnC,KAAM,CAAC,UAAW,MAAO,eAAe,CACxC,UAAW,EAAc,KAC1B,CACD,eAAgB,CAAC,UAAW,OAAO,CACnC,aAAc,CACZ,SAAU,CAAC,CAAE,IAAK,kBAAmB,QAAS,EAAG,CAAC,CACnD,CACD,aAAc,CACZ,OAAQ,CACN,KAAM,SACN,SAAU,CAAC,SAAS,CACpB,WAAY,CACV,OAAQ,CACN,KAAM,SACN,YAAa,gDACd,CACD,OAAQ,CACN,KAAM,SACN,YAAa,0CACd,CACF,CACF,CACD,QAAS,CACP,OAAQ,oBACR,OAAQ,aACT,CACF,CACD,aAAc,CACZ,OAAQ,CACN,KAAM,SACN,WAAY,CACV,KAAM,CACJ,KAAM,SACN,YACE,yEACH,CACD,aAAc,CAAE,KAAM,SAAU,CAChC,YAAa,CAAE,KAAM,SAAU,CAC/B,WAAY,CAAE,KAAM,SAAU,CAC/B,CACF,CACD,QAAS,CACP,KAAM,kBACN,aAAc,8CACd,YAAa,iCACb,WAAY,kBACb,CACF,CACD,YAAa,CACX,OAAQ,OACR,UAAW,IACZ,CACD,QAAS,6CACT,YAAa,CACX,OAAQ,CACN,UAAW,KACZ,CACF,CACD,UAAW,CACT,kBACE,4HACH,CACF,CAED,SAAgB,EACd,EACyB,CACzB,OAAO,EAAS,SAAS,EAA0B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gmail.d.ts","names":[],"sources":["../../../src/integrations/providers/gmail.ts"],"sourcesContent":[],"mappings":";;;cAGa,sBAAsB;
|
|
1
|
+
{"version":3,"file":"gmail.d.ts","names":[],"sources":["../../../src/integrations/providers/gmail.ts"],"sourcesContent":[],"mappings":";;;cAGa,sBAAsB;iBAuFnB,wBAAA,WACJ,0BACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gmail.js","names":["gmailIntegrationSpec: IntegrationSpec"],"sources":["../../../src/integrations/providers/gmail.ts"],"sourcesContent":["import { StabilityEnum } from '../../ownership';\nimport type { IntegrationSpec, IntegrationSpecRegistry } from '../spec';\n\nexport const gmailIntegrationSpec: IntegrationSpec = {\n meta: {\n key: 'email.gmail',\n version: 1,\n category: 'email',\n displayName: 'Gmail API',\n title: 'Google Gmail API',\n description:\n 'Gmail integration supporting inbound thread ingestion and outbound transactional email.',\n domain: 'communications',\n owners: ['platform.messaging'],\n tags: ['email', 'gmail'],\n stability: StabilityEnum.Beta,\n },\n supportedModes: ['managed', 'byok'],\n capabilities: {\n provides: [\n { key: 'email.inbound', version: 1 },\n { key: 'email.outbound', version: 1 },\n ],\n },\n configSchema: {\n schema: {\n type: 'object',\n properties: {\n labelIds: {\n type: 'array',\n items: { type: 'string' },\n description: 'Optional list of label IDs to scope inbound sync.',\n },\n includeSpamTrash: {\n type: 'boolean',\n description: 'Whether to include spam or trash messages during sync.',\n },\n },\n },\n example: {\n labelIds: ['INBOX'],\n includeSpamTrash: false,\n },\n },\n secretSchema: {\n schema: {\n type: 'object',\n required: ['clientId', 'clientSecret', 'refreshToken'],\n properties: {\n clientId: {\n type: 'string',\n description: 'OAuth client ID for the Google Cloud project.',\n },\n clientSecret: {\n type: 'string',\n description: 'OAuth client secret for the Google Cloud project.',\n },\n refreshToken: {\n type: 'string',\n description: 'OAuth refresh token for delegated Gmail access.',\n },\n redirectUri: {\n type: 'string',\n description
|
|
1
|
+
{"version":3,"file":"gmail.js","names":["gmailIntegrationSpec: IntegrationSpec"],"sources":["../../../src/integrations/providers/gmail.ts"],"sourcesContent":["import { StabilityEnum } from '../../ownership';\nimport type { IntegrationSpec, IntegrationSpecRegistry } from '../spec';\n\nexport const gmailIntegrationSpec: IntegrationSpec = {\n meta: {\n key: 'email.gmail',\n version: 1,\n category: 'email',\n displayName: 'Gmail API',\n title: 'Google Gmail API',\n description:\n 'Gmail integration supporting inbound thread ingestion and outbound transactional email.',\n domain: 'communications',\n owners: ['platform.messaging'],\n tags: ['email', 'gmail'],\n stability: StabilityEnum.Beta,\n },\n supportedModes: ['managed', 'byok'],\n capabilities: {\n provides: [\n { key: 'email.inbound', version: 1 },\n { key: 'email.outbound', version: 1 },\n ],\n },\n configSchema: {\n schema: {\n type: 'object',\n properties: {\n labelIds: {\n type: 'array',\n items: { type: 'string' },\n description: 'Optional list of label IDs to scope inbound sync.',\n },\n includeSpamTrash: {\n type: 'boolean',\n description: 'Whether to include spam or trash messages during sync.',\n },\n },\n },\n example: {\n labelIds: ['INBOX'],\n includeSpamTrash: false,\n },\n },\n secretSchema: {\n schema: {\n type: 'object',\n required: ['clientId', 'clientSecret', 'refreshToken'],\n properties: {\n clientId: {\n type: 'string',\n description: 'OAuth client ID for the Google Cloud project.',\n },\n clientSecret: {\n type: 'string',\n description: 'OAuth client secret for the Google Cloud project.',\n },\n refreshToken: {\n type: 'string',\n description: 'OAuth refresh token for delegated Gmail access.',\n },\n redirectUri: {\n type: 'string',\n description:\n 'Optional redirect URI used when issuing the refresh token.',\n },\n },\n },\n example: {\n clientId: 'xxx.apps.googleusercontent.com',\n clientSecret: 'secret',\n refreshToken: 'refresh-token',\n },\n },\n healthCheck: {\n method: 'custom',\n timeoutMs: 4000,\n },\n docsUrl: 'https://developers.google.com/gmail/api',\n constraints: {\n rateLimit: {\n rpm: 600,\n },\n },\n byokSetup: {\n setupInstructions:\n 'Create an OAuth consent screen and credentials within Google Cloud Console, then authorize the Gmail scopes and store the resulting refresh token.',\n },\n};\n\nexport function registerGmailIntegration(\n registry: IntegrationSpecRegistry\n): IntegrationSpecRegistry {\n return registry.register(gmailIntegrationSpec);\n}\n"],"mappings":"mDAGA,MAAaA,EAAwC,CACnD,KAAM,CACJ,IAAK,cACL,QAAS,EACT,SAAU,QACV,YAAa,YACb,MAAO,mBACP,YACE,0FACF,OAAQ,iBACR,OAAQ,CAAC,qBAAqB,CAC9B,KAAM,CAAC,QAAS,QAAQ,CACxB,UAAW,EAAc,KAC1B,CACD,eAAgB,CAAC,UAAW,OAAO,CACnC,aAAc,CACZ,SAAU,CACR,CAAE,IAAK,gBAAiB,QAAS,EAAG,CACpC,CAAE,IAAK,iBAAkB,QAAS,EAAG,CACtC,CACF,CACD,aAAc,CACZ,OAAQ,CACN,KAAM,SACN,WAAY,CACV,SAAU,CACR,KAAM,QACN,MAAO,CAAE,KAAM,SAAU,CACzB,YAAa,oDACd,CACD,iBAAkB,CAChB,KAAM,UACN,YAAa,yDACd,CACF,CACF,CACD,QAAS,CACP,SAAU,CAAC,QAAQ,CACnB,iBAAkB,GACnB,CACF,CACD,aAAc,CACZ,OAAQ,CACN,KAAM,SACN,SAAU,CAAC,WAAY,eAAgB,eAAe,CACtD,WAAY,CACV,SAAU,CACR,KAAM,SACN,YAAa,gDACd,CACD,aAAc,CACZ,KAAM,SACN,YAAa,oDACd,CACD,aAAc,CACZ,KAAM,SACN,YAAa,kDACd,CACD,YAAa,CACX,KAAM,SACN,YACE,6DACH,CACF,CACF,CACD,QAAS,CACP,SAAU,iCACV,aAAc,SACd,aAAc,gBACf,CACF,CACD,YAAa,CACX,OAAQ,SACR,UAAW,IACZ,CACD,QAAS,0CACT,YAAa,CACX,UAAW,CACT,IAAK,IACN,CACF,CACD,UAAW,CACT,kBACE,qJACH,CACF,CAED,SAAgB,EACd,EACyB,CACzB,OAAO,EAAS,SAAS,EAAqB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-calendar.js","names":["googleCalendarIntegrationSpec: IntegrationSpec"],"sources":["../../../src/integrations/providers/google-calendar.ts"],"sourcesContent":["import { StabilityEnum } from '../../ownership';\nimport type { IntegrationSpec, IntegrationSpecRegistry } from '../spec';\n\nexport const googleCalendarIntegrationSpec: IntegrationSpec = {\n meta: {\n key: 'calendar.google',\n version: 1,\n category: 'calendar',\n displayName: 'Google Calendar',\n title: 'Google Calendar API',\n description:\n 'Google Calendar integration for event creation, updates, and scheduling automations.',\n domain: 'productivity',\n owners: ['platform.messaging'],\n tags: ['calendar', 'google'],\n stability: StabilityEnum.Beta,\n },\n supportedModes: ['managed', 'byok'],\n capabilities: {\n provides: [{ key: 'calendar.events', version: 1 }],\n },\n configSchema: {\n schema: {\n type: 'object',\n properties: {\n calendarId: {\n type: 'string',\n description: 'Default calendar identifier (defaults to primary).',\n },\n },\n },\n example: {\n calendarId: 'primary',\n },\n },\n secretSchema: {\n schema: {\n type: 'object',\n required: ['clientEmail', 'privateKey'],\n properties: {\n clientEmail: {\n type: 'string',\n description: 'Service account client email.',\n },\n privateKey: {\n type: 'string',\n description: 'Service account private key.',\n },\n projectId: {\n type: 'string',\n description: 'Google Cloud project ID.',\n },\n },\n },\n example: {\n clientEmail: 'svc-calendar@example.iam.gserviceaccount.com',\n privateKey: '-----BEGIN PRIVATE KEY-----...',\n projectId: 'calendar-project',\n },\n },\n healthCheck: {\n method: 'custom',\n timeoutMs: 4000,\n },\n docsUrl: 'https://developers.google.com/calendar/api',\n constraints: {},\n byokSetup: {\n setupInstructions:\n 'Create a Google service account with Calendar access and share the target calendars with the service account email.',\n },\n};\n\nexport function registerGoogleCalendarIntegration(\n registry: IntegrationSpecRegistry\n): IntegrationSpecRegistry {\n return registry.register(googleCalendarIntegrationSpec);\n}\n
|
|
1
|
+
{"version":3,"file":"google-calendar.js","names":["googleCalendarIntegrationSpec: IntegrationSpec"],"sources":["../../../src/integrations/providers/google-calendar.ts"],"sourcesContent":["import { StabilityEnum } from '../../ownership';\nimport type { IntegrationSpec, IntegrationSpecRegistry } from '../spec';\n\nexport const googleCalendarIntegrationSpec: IntegrationSpec = {\n meta: {\n key: 'calendar.google',\n version: 1,\n category: 'calendar',\n displayName: 'Google Calendar',\n title: 'Google Calendar API',\n description:\n 'Google Calendar integration for event creation, updates, and scheduling automations.',\n domain: 'productivity',\n owners: ['platform.messaging'],\n tags: ['calendar', 'google'],\n stability: StabilityEnum.Beta,\n },\n supportedModes: ['managed', 'byok'],\n capabilities: {\n provides: [{ key: 'calendar.events', version: 1 }],\n },\n configSchema: {\n schema: {\n type: 'object',\n properties: {\n calendarId: {\n type: 'string',\n description: 'Default calendar identifier (defaults to primary).',\n },\n },\n },\n example: {\n calendarId: 'primary',\n },\n },\n secretSchema: {\n schema: {\n type: 'object',\n required: ['clientEmail', 'privateKey'],\n properties: {\n clientEmail: {\n type: 'string',\n description: 'Service account client email.',\n },\n privateKey: {\n type: 'string',\n description: 'Service account private key.',\n },\n projectId: {\n type: 'string',\n description: 'Google Cloud project ID.',\n },\n },\n },\n example: {\n clientEmail: 'svc-calendar@example.iam.gserviceaccount.com',\n privateKey: '-----BEGIN PRIVATE KEY-----...',\n projectId: 'calendar-project',\n },\n },\n healthCheck: {\n method: 'custom',\n timeoutMs: 4000,\n },\n docsUrl: 'https://developers.google.com/calendar/api',\n constraints: {},\n byokSetup: {\n setupInstructions:\n 'Create a Google service account with Calendar access and share the target calendars with the service account email.',\n },\n};\n\nexport function registerGoogleCalendarIntegration(\n registry: IntegrationSpecRegistry\n): IntegrationSpecRegistry {\n return registry.register(googleCalendarIntegrationSpec);\n}\n"],"mappings":"mDAGA,MAAaA,EAAiD,CAC5D,KAAM,CACJ,IAAK,kBACL,QAAS,EACT,SAAU,WACV,YAAa,kBACb,MAAO,sBACP,YACE,uFACF,OAAQ,eACR,OAAQ,CAAC,qBAAqB,CAC9B,KAAM,CAAC,WAAY,SAAS,CAC5B,UAAW,EAAc,KAC1B,CACD,eAAgB,CAAC,UAAW,OAAO,CACnC,aAAc,CACZ,SAAU,CAAC,CAAE,IAAK,kBAAmB,QAAS,EAAG,CAAC,CACnD,CACD,aAAc,CACZ,OAAQ,CACN,KAAM,SACN,WAAY,CACV,WAAY,CACV,KAAM,SACN,YAAa,qDACd,CACF,CACF,CACD,QAAS,CACP,WAAY,UACb,CACF,CACD,aAAc,CACZ,OAAQ,CACN,KAAM,SACN,SAAU,CAAC,cAAe,aAAa,CACvC,WAAY,CACV,YAAa,CACX,KAAM,SACN,YAAa,gCACd,CACD,WAAY,CACV,KAAM,SACN,YAAa,+BACd,CACD,UAAW,CACT,KAAM,SACN,YAAa,2BACd,CACF,CACF,CACD,QAAS,CACP,YAAa,+CACb,WAAY,iCACZ,UAAW,mBACZ,CACF,CACD,YAAa,CACX,OAAQ,SACR,UAAW,IACZ,CACD,QAAS,6CACT,YAAa,EAAE,CACf,UAAW,CACT,kBACE,sHACH,CACF,CAED,SAAgB,EACd,EACyB,CACzB,OAAO,EAAS,SAAS,EAA8B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"elevenlabs-voice.js","names":["FORMAT_MAP: Record<\n NonNullable<VoiceSynthesisInput['format']>,\n ElevenLabs.TextToSpeechConvertRequestOutputFormat\n>","SAMPLE_RATE: Partial<\n Record<ElevenLabs.TextToSpeechConvertRequestOutputFormat, number>\n>","chunks: Uint8Array[]"],"sources":["../../../../src/integrations/providers/impls/elevenlabs-voice.ts"],"sourcesContent":["import { ElevenLabsClient } from '@elevenlabs/elevenlabs-js';\nimport type { ElevenLabs } from '@elevenlabs/elevenlabs-js';\n\nimport type {\n Voice,\n VoiceProvider,\n VoiceSynthesisInput,\n VoiceSynthesisResult,\n} from '../voice';\n\nexport interface ElevenLabsVoiceProviderOptions {\n apiKey: string;\n defaultVoiceId?: string;\n modelId?: string;\n client?: ElevenLabsClient;\n}\n\nconst FORMAT_MAP: Record<\n NonNullable<VoiceSynthesisInput['format']>,\n ElevenLabs.TextToSpeechConvertRequestOutputFormat\n> = {\n mp3: 'mp3_44100_128',\n wav: 'pcm_44100',\n ogg: 'mp3_44100_128',\n pcm: 'pcm_16000',\n};\n\nconst SAMPLE_RATE: Partial<\n Record<ElevenLabs.TextToSpeechConvertRequestOutputFormat, number>\n> = {\n mp3_22050_32: 22050,\n mp3_44100_32: 44100,\n mp3_44100_64: 44100,\n mp3_44100_96: 44100,\n mp3_44100_128: 44100,\n mp3_44100_192: 44100,\n pcm_16000: 16000,\n pcm_22050: 22050,\n pcm_24000: 24000,\n pcm_44100: 44100,\n ulaw_8000: 8000,\n};\n\nexport class ElevenLabsVoiceProvider implements VoiceProvider {\n private readonly client: ElevenLabsClient;\n private readonly defaultVoiceId?: string;\n private readonly modelId?: string;\n\n constructor(options: ElevenLabsVoiceProviderOptions) {\n this.client =\n options.client ??\n new ElevenLabsClient({\n apiKey: options.apiKey,\n });\n this.defaultVoiceId = options.defaultVoiceId;\n this.modelId = options.modelId;\n }\n\n async listVoices(): Promise<Voice[]> {\n const response = await this.client.voices.getAll();\n return (response.voices ?? []).map((voice) => ({\n id: voice.voiceId ?? '',\n name: voice.name ?? voice.voiceId ?? '',\n description: voice.description ?? undefined,\n language: voice.labels?.language ?? undefined,\n gender: normalizeGender(voice.labels?.gender),\n previewUrl: voice.previewUrl ?? undefined,\n metadata: {\n category: voice.category ?? '',\n ...voice.labels,\n },\n }));\n }\n\n async synthesize(input: VoiceSynthesisInput): Promise<VoiceSynthesisResult> {\n const voiceId = input.voiceId ?? this.defaultVoiceId;\n if (!voiceId) {\n throw new Error('Voice ID is required for ElevenLabs synthesis.');\n }\n\n const formatKey = input.format ?? 'mp3';\n const outputFormat = FORMAT_MAP[formatKey] ?? FORMAT_MAP.mp3;\n const sampleRate =\n input.sampleRateHz ??\n SAMPLE_RATE[outputFormat] ??\n SAMPLE_RATE.mp3_44100_128 ??\n 44100;\n\n const voiceSettings =\n input.stability != null ||\n input.similarityBoost != null ||\n input.style != null\n ? {\n ...(input.stability != null ? { stability: input.stability } : {}),\n ...(input.similarityBoost != null\n ? { similarityBoost: input.similarityBoost }\n : {}),\n ...(input.style != null ? { style: input.style } : {}),\n }\n : undefined;\n\n const stream = await this.client.textToSpeech.convert(voiceId, {\n text: input.text,\n modelId: this.modelId,\n outputFormat,\n voiceSettings,\n });\n\n const audio = await readWebStream(stream);\n\n return {\n audio,\n format: formatKey,\n sampleRateHz: sampleRate,\n durationSeconds: undefined,\n url: undefined,\n };\n }\n}\n\nfunction normalizeGender(\n value: string | undefined\n): 'male' | 'female' | 'neutral' | undefined {\n if (!value) return undefined;\n const normalized = value.toLowerCase();\n if (normalized === 'male'
|
|
1
|
+
{"version":3,"file":"elevenlabs-voice.js","names":["FORMAT_MAP: Record<\n NonNullable<VoiceSynthesisInput['format']>,\n ElevenLabs.TextToSpeechConvertRequestOutputFormat\n>","SAMPLE_RATE: Partial<\n Record<ElevenLabs.TextToSpeechConvertRequestOutputFormat, number>\n>","chunks: Uint8Array[]"],"sources":["../../../../src/integrations/providers/impls/elevenlabs-voice.ts"],"sourcesContent":["import { ElevenLabsClient } from '@elevenlabs/elevenlabs-js';\nimport type { ElevenLabs } from '@elevenlabs/elevenlabs-js';\n\nimport type {\n Voice,\n VoiceProvider,\n VoiceSynthesisInput,\n VoiceSynthesisResult,\n} from '../voice';\n\nexport interface ElevenLabsVoiceProviderOptions {\n apiKey: string;\n defaultVoiceId?: string;\n modelId?: string;\n client?: ElevenLabsClient;\n}\n\nconst FORMAT_MAP: Record<\n NonNullable<VoiceSynthesisInput['format']>,\n ElevenLabs.TextToSpeechConvertRequestOutputFormat\n> = {\n mp3: 'mp3_44100_128',\n wav: 'pcm_44100',\n ogg: 'mp3_44100_128',\n pcm: 'pcm_16000',\n};\n\nconst SAMPLE_RATE: Partial<\n Record<ElevenLabs.TextToSpeechConvertRequestOutputFormat, number>\n> = {\n mp3_22050_32: 22050,\n mp3_44100_32: 44100,\n mp3_44100_64: 44100,\n mp3_44100_96: 44100,\n mp3_44100_128: 44100,\n mp3_44100_192: 44100,\n pcm_16000: 16000,\n pcm_22050: 22050,\n pcm_24000: 24000,\n pcm_44100: 44100,\n ulaw_8000: 8000,\n};\n\nexport class ElevenLabsVoiceProvider implements VoiceProvider {\n private readonly client: ElevenLabsClient;\n private readonly defaultVoiceId?: string;\n private readonly modelId?: string;\n\n constructor(options: ElevenLabsVoiceProviderOptions) {\n this.client =\n options.client ??\n new ElevenLabsClient({\n apiKey: options.apiKey,\n });\n this.defaultVoiceId = options.defaultVoiceId;\n this.modelId = options.modelId;\n }\n\n async listVoices(): Promise<Voice[]> {\n const response = await this.client.voices.getAll();\n return (response.voices ?? []).map((voice) => ({\n id: voice.voiceId ?? '',\n name: voice.name ?? voice.voiceId ?? '',\n description: voice.description ?? undefined,\n language: voice.labels?.language ?? undefined,\n gender: normalizeGender(voice.labels?.gender),\n previewUrl: voice.previewUrl ?? undefined,\n metadata: {\n category: voice.category ?? '',\n ...voice.labels,\n },\n }));\n }\n\n async synthesize(input: VoiceSynthesisInput): Promise<VoiceSynthesisResult> {\n const voiceId = input.voiceId ?? this.defaultVoiceId;\n if (!voiceId) {\n throw new Error('Voice ID is required for ElevenLabs synthesis.');\n }\n\n const formatKey = input.format ?? 'mp3';\n const outputFormat = FORMAT_MAP[formatKey] ?? FORMAT_MAP.mp3;\n const sampleRate =\n input.sampleRateHz ??\n SAMPLE_RATE[outputFormat] ??\n SAMPLE_RATE.mp3_44100_128 ??\n 44100;\n\n const voiceSettings =\n input.stability != null ||\n input.similarityBoost != null ||\n input.style != null\n ? {\n ...(input.stability != null ? { stability: input.stability } : {}),\n ...(input.similarityBoost != null\n ? { similarityBoost: input.similarityBoost }\n : {}),\n ...(input.style != null ? { style: input.style } : {}),\n }\n : undefined;\n\n const stream = await this.client.textToSpeech.convert(voiceId, {\n text: input.text,\n modelId: this.modelId,\n outputFormat,\n voiceSettings,\n });\n\n const audio = await readWebStream(stream);\n\n return {\n audio,\n format: formatKey,\n sampleRateHz: sampleRate,\n durationSeconds: undefined,\n url: undefined,\n };\n }\n}\n\nfunction normalizeGender(\n value: string | undefined\n): 'male' | 'female' | 'neutral' | undefined {\n if (!value) return undefined;\n const normalized = value.toLowerCase();\n if (\n normalized === 'male' ||\n normalized === 'female' ||\n normalized === 'neutral'\n ) {\n return normalized;\n }\n return undefined;\n}\n\nasync function readWebStream(\n stream: ReadableStream<Uint8Array>\n): Promise<Uint8Array> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) {\n chunks.push(value);\n }\n }\n\n const length = chunks.reduce((total, chunk) => total + chunk.length, 0);\n const result = new Uint8Array(length);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n}\n"],"mappings":"6DAiBA,MAAMA,EAGF,CACF,IAAK,gBACL,IAAK,YACL,IAAK,gBACL,IAAK,YACN,CAEKC,EAEF,CACF,aAAc,MACd,aAAc,MACd,aAAc,MACd,aAAc,MACd,cAAe,MACf,cAAe,MACf,UAAW,KACX,UAAW,MACX,UAAW,KACX,UAAW,MACX,UAAW,IACZ,CAED,IAAa,EAAb,KAA8D,CAC5D,OACA,eACA,QAEA,YAAY,EAAyC,CACnD,KAAK,OACH,EAAQ,QACR,IAAI,EAAiB,CACnB,OAAQ,EAAQ,OACjB,CAAC,CACJ,KAAK,eAAiB,EAAQ,eAC9B,KAAK,QAAU,EAAQ,QAGzB,MAAM,YAA+B,CAEnC,QADiB,MAAM,KAAK,OAAO,OAAO,QAAQ,EACjC,QAAU,EAAE,EAAE,IAAK,IAAW,CAC7C,GAAI,EAAM,SAAW,GACrB,KAAM,EAAM,MAAQ,EAAM,SAAW,GACrC,YAAa,EAAM,aAAe,IAAA,GAClC,SAAU,EAAM,QAAQ,UAAY,IAAA,GACpC,OAAQ,EAAgB,EAAM,QAAQ,OAAO,CAC7C,WAAY,EAAM,YAAc,IAAA,GAChC,SAAU,CACR,SAAU,EAAM,UAAY,GAC5B,GAAG,EAAM,OACV,CACF,EAAE,CAGL,MAAM,WAAW,EAA2D,CAC1E,IAAM,EAAU,EAAM,SAAW,KAAK,eACtC,GAAI,CAAC,EACH,MAAU,MAAM,iDAAiD,CAGnE,IAAM,EAAY,EAAM,QAAU,MAC5B,EAAe,EAAW,IAAc,EAAW,IACnD,EACJ,EAAM,cACN,EAAY,IACZ,EAAY,eACZ,MAEI,EACJ,EAAM,WAAa,MACnB,EAAM,iBAAmB,MACzB,EAAM,OAAS,KACX,CACE,GAAI,EAAM,WAAa,KAAwC,EAAE,CAAnC,CAAE,UAAW,EAAM,UAAW,CAC5D,GAAI,EAAM,iBAAmB,KAEzB,EAAE,CADF,CAAE,gBAAiB,EAAM,gBAAiB,CAE9C,GAAI,EAAM,OAAS,KAAgC,EAAE,CAA3B,CAAE,MAAO,EAAM,MAAO,CACjD,CACD,IAAA,GAWN,MAAO,CACL,MAHY,MAAM,EAPL,MAAM,KAAK,OAAO,aAAa,QAAQ,EAAS,CAC7D,KAAM,EAAM,KACZ,QAAS,KAAK,QACd,eACA,gBACD,CAAC,CAEuC,CAIvC,OAAQ,EACR,aAAc,EACd,gBAAiB,IAAA,GACjB,IAAK,IAAA,GACN,GAIL,SAAS,EACP,EAC2C,CAC3C,GAAI,CAAC,EAAO,OACZ,IAAM,EAAa,EAAM,aAAa,CACtC,GACE,IAAe,QACf,IAAe,UACf,IAAe,UAEf,OAAO,EAKX,eAAe,EACb,EACqB,CACrB,IAAM,EAAS,EAAO,WAAW,CAC3BC,EAAuB,EAAE,CAE/B,OAAa,CACX,GAAM,CAAE,OAAM,SAAU,MAAM,EAAO,MAAM,CAC3C,GAAI,EAAM,MACN,GACF,EAAO,KAAK,EAAM,CAItB,IAAM,EAAS,EAAO,QAAQ,EAAO,IAAU,EAAQ,EAAM,OAAQ,EAAE,CACjE,EAAS,IAAI,WAAW,EAAO,CACjC,EAAS,EACb,IAAK,IAAM,KAAS,EAClB,EAAO,IAAI,EAAO,EAAO,CACzB,GAAU,EAAM,OAElB,OAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gcs-storage.js","names":[],"sources":["../../../../src/integrations/providers/impls/gcs-storage.ts"],"sourcesContent":["import { Storage, type StorageOptions } from '@google-cloud/storage';\n\nimport type {\n ObjectStorageProvider,\n PutObjectInput,\n GetObjectResult,\n StorageObjectMetadata,\n ListObjectsQuery,\n ListObjectsResult,\n SignedUrlOptions,\n DeleteObjectInput,\n} from '../storage';\n\nexport interface GoogleCloudStorageProviderOptions {\n bucket: string;\n storage?: Storage;\n clientOptions?: StorageOptions;\n}\n\nexport class GoogleCloudStorageProvider implements ObjectStorageProvider {\n private readonly storage: Storage;\n private readonly bucketName: string;\n\n constructor(options: GoogleCloudStorageProviderOptions) {\n this.storage =\n options.storage ?? new Storage(options.clientOptions ?? undefined);\n this.bucketName = options.bucket;\n }\n\n async putObject(input: PutObjectInput): Promise<StorageObjectMetadata> {\n const bucketName = input.bucket ?? this.bucketName;\n const bucket = this.storage.bucket(bucketName);\n const file = bucket.file(input.key);\n const buffer = toBuffer(input.data);\n await file.save(buffer, {\n resumable: false,\n contentType: input.contentType,\n metadata: input.metadata,\n });\n if (input.makePublic) {\n await file.makePublic();\n }\n const [metadata] = await file.getMetadata();\n return toMetadata(metadata);\n }\n\n async getObject(input: DeleteObjectInput): Promise<GetObjectResult | null> {\n const bucketName = input.bucket ?? this.bucketName;\n const bucket = this.storage.bucket(bucketName);\n const file = bucket.file(input.key);\n const [exists] = await file.exists();\n if (!exists) return null;\n const [contents] = await file.download();\n const [metadata] = await file.getMetadata();\n return {\n ...toMetadata(metadata),\n data: new Uint8Array(contents),\n };\n }\n\n async deleteObject(input: DeleteObjectInput): Promise<void> {\n const bucketName = input.bucket ?? this.bucketName;\n const bucket = this.storage.bucket(bucketName);\n const file = bucket.file(input.key);\n await file.delete({ ignoreNotFound: true });\n }\n\n async generateSignedUrl(options: SignedUrlOptions): Promise<{\n url: string;\n expiresAt: Date;\n }> {\n const bucketName = options.bucket ?? this.bucketName;\n const bucket = this.storage.bucket(bucketName);\n const file = bucket.file(options.key);\n const action = options.method === 'PUT' ? 'write' : 'read';\n const expires = Date.now() + options.expiresInSeconds * 1000;\n const [url] = await file.getSignedUrl({\n action,\n expires,\n contentType: options.contentType,\n });\n return { url, expiresAt: new Date(expires) };\n }\n\n async listObjects(query: ListObjectsQuery): Promise<ListObjectsResult> {\n const bucketName = query.bucket ?? this.bucketName;\n const bucket = this.storage.bucket(bucketName);\n const [files, nextQuery, response] = await bucket.getFiles({\n prefix: query.prefix,\n maxResults: query.maxResults,\n pageToken: query.pageToken,\n });\n const nextTokenFromQuery =\n typeof nextQuery === 'object'
|
|
1
|
+
{"version":3,"file":"gcs-storage.js","names":[],"sources":["../../../../src/integrations/providers/impls/gcs-storage.ts"],"sourcesContent":["import { Storage, type StorageOptions } from '@google-cloud/storage';\n\nimport type {\n ObjectStorageProvider,\n PutObjectInput,\n GetObjectResult,\n StorageObjectMetadata,\n ListObjectsQuery,\n ListObjectsResult,\n SignedUrlOptions,\n DeleteObjectInput,\n} from '../storage';\n\nexport interface GoogleCloudStorageProviderOptions {\n bucket: string;\n storage?: Storage;\n clientOptions?: StorageOptions;\n}\n\nexport class GoogleCloudStorageProvider implements ObjectStorageProvider {\n private readonly storage: Storage;\n private readonly bucketName: string;\n\n constructor(options: GoogleCloudStorageProviderOptions) {\n this.storage =\n options.storage ?? new Storage(options.clientOptions ?? undefined);\n this.bucketName = options.bucket;\n }\n\n async putObject(input: PutObjectInput): Promise<StorageObjectMetadata> {\n const bucketName = input.bucket ?? this.bucketName;\n const bucket = this.storage.bucket(bucketName);\n const file = bucket.file(input.key);\n const buffer = toBuffer(input.data);\n await file.save(buffer, {\n resumable: false,\n contentType: input.contentType,\n metadata: input.metadata,\n });\n if (input.makePublic) {\n await file.makePublic();\n }\n const [metadata] = await file.getMetadata();\n return toMetadata(metadata);\n }\n\n async getObject(input: DeleteObjectInput): Promise<GetObjectResult | null> {\n const bucketName = input.bucket ?? this.bucketName;\n const bucket = this.storage.bucket(bucketName);\n const file = bucket.file(input.key);\n const [exists] = await file.exists();\n if (!exists) return null;\n const [contents] = await file.download();\n const [metadata] = await file.getMetadata();\n return {\n ...toMetadata(metadata),\n data: new Uint8Array(contents),\n };\n }\n\n async deleteObject(input: DeleteObjectInput): Promise<void> {\n const bucketName = input.bucket ?? this.bucketName;\n const bucket = this.storage.bucket(bucketName);\n const file = bucket.file(input.key);\n await file.delete({ ignoreNotFound: true });\n }\n\n async generateSignedUrl(options: SignedUrlOptions): Promise<{\n url: string;\n expiresAt: Date;\n }> {\n const bucketName = options.bucket ?? this.bucketName;\n const bucket = this.storage.bucket(bucketName);\n const file = bucket.file(options.key);\n const action = options.method === 'PUT' ? 'write' : 'read';\n const expires = Date.now() + options.expiresInSeconds * 1000;\n const [url] = await file.getSignedUrl({\n action,\n expires,\n contentType: options.contentType,\n });\n return { url, expiresAt: new Date(expires) };\n }\n\n async listObjects(query: ListObjectsQuery): Promise<ListObjectsResult> {\n const bucketName = query.bucket ?? this.bucketName;\n const bucket = this.storage.bucket(bucketName);\n const [files, nextQuery, response] = await bucket.getFiles({\n prefix: query.prefix,\n maxResults: query.maxResults,\n pageToken: query.pageToken,\n });\n const nextTokenFromQuery =\n typeof nextQuery === 'object' &&\n nextQuery !== null &&\n 'pageToken' in nextQuery\n ? (nextQuery as { pageToken?: string }).pageToken\n : undefined;\n const nextTokenFromResponse =\n response && typeof response === 'object' && 'nextPageToken' in response\n ? (response as { nextPageToken?: string }).nextPageToken\n : undefined;\n return {\n objects: files.map((file) => toMetadata(file.metadata)),\n nextPageToken: nextTokenFromQuery ?? nextTokenFromResponse ?? undefined,\n };\n }\n}\n\nfunction toBuffer(data: Uint8Array | ArrayBuffer): Buffer {\n if (data instanceof Uint8Array) {\n return Buffer.from(data);\n }\n return Buffer.from(data);\n}\n\nfunction toMetadata(metadata: any): StorageObjectMetadata {\n return {\n bucket: metadata.bucket ?? '',\n key: metadata.name ?? '',\n sizeBytes: metadata.size ? Number(metadata.size) : undefined,\n contentType: metadata.contentType ?? undefined,\n etag: metadata.etag ?? undefined,\n checksum: metadata.md5Hash ?? undefined,\n lastModified: metadata.updated ? new Date(metadata.updated) : undefined,\n metadata: metadata.metadata,\n };\n}\n"],"mappings":"gDAmBA,IAAa,EAAb,KAAyE,CACvE,QACA,WAEA,YAAY,EAA4C,CACtD,KAAK,QACH,EAAQ,SAAW,IAAI,EAAQ,EAAQ,eAAiB,IAAA,GAAU,CACpE,KAAK,WAAa,EAAQ,OAG5B,MAAM,UAAU,EAAuD,CACrE,IAAM,EAAa,EAAM,QAAU,KAAK,WAElC,EADS,KAAK,QAAQ,OAAO,EAAW,CAC1B,KAAK,EAAM,IAAI,CAC7B,EAAS,EAAS,EAAM,KAAK,CACnC,MAAM,EAAK,KAAK,EAAQ,CACtB,UAAW,GACX,YAAa,EAAM,YACnB,SAAU,EAAM,SACjB,CAAC,CACE,EAAM,YACR,MAAM,EAAK,YAAY,CAEzB,GAAM,CAAC,GAAY,MAAM,EAAK,aAAa,CAC3C,OAAO,EAAW,EAAS,CAG7B,MAAM,UAAU,EAA2D,CACzE,IAAM,EAAa,EAAM,QAAU,KAAK,WAElC,EADS,KAAK,QAAQ,OAAO,EAAW,CAC1B,KAAK,EAAM,IAAI,CAC7B,CAAC,GAAU,MAAM,EAAK,QAAQ,CACpC,GAAI,CAAC,EAAQ,OAAO,KACpB,GAAM,CAAC,GAAY,MAAM,EAAK,UAAU,CAClC,CAAC,GAAY,MAAM,EAAK,aAAa,CAC3C,MAAO,CACL,GAAG,EAAW,EAAS,CACvB,KAAM,IAAI,WAAW,EAAS,CAC/B,CAGH,MAAM,aAAa,EAAyC,CAC1D,IAAM,EAAa,EAAM,QAAU,KAAK,WAGxC,MAFe,KAAK,QAAQ,OAAO,EAAW,CAC1B,KAAK,EAAM,IAAI,CACxB,OAAO,CAAE,eAAgB,GAAM,CAAC,CAG7C,MAAM,kBAAkB,EAGrB,CACD,IAAM,EAAa,EAAQ,QAAU,KAAK,WAEpC,EADS,KAAK,QAAQ,OAAO,EAAW,CAC1B,KAAK,EAAQ,IAAI,CAC/B,EAAS,EAAQ,SAAW,MAAQ,QAAU,OAC9C,EAAU,KAAK,KAAK,CAAG,EAAQ,iBAAmB,IAClD,CAAC,GAAO,MAAM,EAAK,aAAa,CACpC,SACA,UACA,YAAa,EAAQ,YACtB,CAAC,CACF,MAAO,CAAE,MAAK,UAAW,IAAI,KAAK,EAAQ,CAAE,CAG9C,MAAM,YAAY,EAAqD,CACrE,IAAM,EAAa,EAAM,QAAU,KAAK,WAElC,CAAC,EAAO,EAAW,GAAY,MADtB,KAAK,QAAQ,OAAO,EAAW,CACI,SAAS,CACzD,OAAQ,EAAM,OACd,WAAY,EAAM,WAClB,UAAW,EAAM,UAClB,CAAC,CACI,EACJ,OAAO,GAAc,UACrB,GACA,cAAe,EACV,EAAqC,UACtC,IAAA,GACA,EACJ,GAAY,OAAO,GAAa,UAAY,kBAAmB,EAC1D,EAAwC,cACzC,IAAA,GACN,MAAO,CACL,QAAS,EAAM,IAAK,GAAS,EAAW,EAAK,SAAS,CAAC,CACvD,cAAe,GAAsB,GAAyB,IAAA,GAC/D,GAIL,SAAS,EAAS,EAAwC,CAIxD,OAHI,aAAgB,WACX,OAAO,KAAK,EAAK,CAK5B,SAAS,EAAW,EAAsC,CACxD,MAAO,CACL,OAAQ,EAAS,QAAU,GAC3B,IAAK,EAAS,MAAQ,GACtB,UAAW,EAAS,KAAO,OAAO,EAAS,KAAK,CAAG,IAAA,GACnD,YAAa,EAAS,aAAe,IAAA,GACrC,KAAM,EAAS,MAAQ,IAAA,GACvB,SAAU,EAAS,SAAW,IAAA,GAC9B,aAAc,EAAS,QAAU,IAAI,KAAK,EAAS,QAAQ,CAAG,IAAA,GAC9D,SAAU,EAAS,SACpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gmail-inbound.js","names":["q: string[]","metadata: Record<string, string>","attachments: NonNullable<EmailMessage['attachments']>"],"sources":["../../../../src/integrations/providers/impls/gmail-inbound.ts"],"sourcesContent":["import { google, type gmail_v1 } from 'googleapis';\n\nimport type {\n EmailInboundProvider,\n EmailMessagesSinceQuery,\n EmailMessage,\n EmailThread,\n EmailThreadListQuery,\n} from '../email';\n\nexport interface GmailInboundProviderOptions {\n auth: gmail_v1.Options['auth'];\n userId?: string;\n gmail?: gmail_v1.Gmail;\n includeSpamTrash?: boolean;\n}\n\nexport class GmailInboundProvider implements EmailInboundProvider {\n private readonly gmail: gmail_v1.Gmail;\n private readonly userId: string;\n private readonly includeSpamTrash: boolean;\n private readonly auth: gmail_v1.Options['auth'];\n\n constructor(options: GmailInboundProviderOptions) {\n this.auth = options.auth;\n this.gmail =\n options.gmail ??\n google.gmail({\n version: 'v1',\n auth: options.auth,\n });\n this.userId = options.userId ?? 'me';\n this.includeSpamTrash = options.includeSpamTrash ?? false;\n }\n\n async listThreads(query?: EmailThreadListQuery): Promise<EmailThread[]> {\n const response = await this.gmail.users.threads.list({\n userId: this.userId,\n maxResults: query?.pageSize,\n pageToken: query?.pageToken,\n q: query?.query,\n labelIds: query?.label ? [query.label] : undefined,\n includeSpamTrash: this.includeSpamTrash,\n auth: this.auth,\n });\n\n const threads = await Promise.all(\n (response.data.threads ?? []).map(async (thread) => {\n if (!thread.id) return null;\n return this.getThread(thread.id);\n })\n );\n\n return threads.filter((thread): thread is EmailThread => thread !== null);\n }\n\n async getThread(threadId: string): Promise<EmailThread | null> {\n const response = await this.gmail.users.threads.get({\n id: threadId,\n userId: this.userId,\n format: 'full',\n auth: this.auth,\n });\n const thread = response.data;\n if (!thread) return null;\n\n const messages =\n thread.messages?.map((message) => this.transformMessage(message)) ?? [];\n\n const participants = dedupeAddresses(\n messages.flatMap((message) => [\n message.from,\n ...message.to,\n ...(message.cc ?? []),\n ])\n );\n\n const firstMessage = messages[0];\n const lastMessage = messages[messages.length - 1];\n const updatedAt =\n lastMessage?.receivedAt ??\n lastMessage?.sentAt ??\n firstMessage?.receivedAt ??\n firstMessage?.sentAt ??\n new Date();\n\n const labels = Array.from(\n new Set(\n messages\n .flatMap((message) => {\n const labelField = message.metadata?.labelIds;\n if (!labelField) return [];\n return labelField.split(',').map((label) => label.trim());\n })\n .filter((label): label is string => Boolean(label))\n )\n );\n\n return {\n id: thread.id ?? threadId,\n subject: messages[0]?.subject,\n snippet: thread.snippet ?? '',\n participants,\n messages,\n updatedAt,\n labels,\n metadata: thread.historyId ? { historyId: thread.historyId } : undefined,\n };\n }\n\n async listMessagesSince(query: EmailMessagesSinceQuery) {\n const after = query.since\n ? Math.floor(query.since.getTime() / 1000)\n : undefined;\n const q: string[] = [];\n if (after) {\n q.push(`after:${after}`);\n }\n const response = await this.gmail.users.messages.list({\n userId: this.userId,\n maxResults: query.pageSize,\n pageToken: query.pageToken,\n labelIds: query.label ? [query.label] : undefined,\n q: q.join(' '),\n includeSpamTrash: this.includeSpamTrash,\n auth: this.auth,\n });\n\n const messages = await Promise.all(\n (response.data.messages ?? []).map(async (item) => {\n if (!item.id) return null;\n const full = await this.gmail.users.messages.get({\n userId: this.userId,\n id: item.id,\n format: 'full',\n auth: this.auth,\n });\n if (!full.data) return null;\n return this.transformMessage(full.data);\n })\n );\n\n return {\n messages: messages.filter(\n (message): message is EmailMessage => message !== null\n ),\n nextPageToken: response.data.nextPageToken ?? undefined,\n };\n }\n\n private transformMessage(message: gmail_v1.Schema$Message): EmailMessage {\n const headers = message.payload?.headers ?? [];\n const subject = headerValue(headers, 'Subject') ?? '';\n const from =\n parseAddress(headerValue(headers, 'From')) ??\n inferFallbackAddress('from', message.id);\n const to = parseAddressList(headerValue(headers, 'To'));\n const cc = parseAddressList(headerValue(headers, 'Cc'));\n const bcc = parseAddressList(headerValue(headers, 'Bcc'));\n const replyTo = parseAddress(headerValue(headers, 'Reply-To'));\n\n const { text, html, attachments } = extractContent(message.payload);\n const timestamp = message.internalDate\n ? new Date(Number(message.internalDate))\n : new Date();\n\n const metadata: Record<string, string> = {\n ...(message.labelIds?.length\n ? { labelIds: message.labelIds.join(',') }\n : {}),\n ...(message.historyId ? { historyId: message.historyId } : {}),\n };\n\n return {\n id: message.id ?? '',\n threadId: message.threadId ?? '',\n subject,\n from,\n to,\n cc,\n bcc,\n replyTo: replyTo ?? undefined,\n sentAt: timestamp,\n receivedAt: timestamp,\n textBody: text ?? undefined,\n htmlBody: html ?? undefined,\n attachments,\n headers: Object.fromEntries(\n headers.map((header) => [header.name ?? '', header.value ?? ''])\n ),\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n };\n }\n}\n\nfunction headerValue(\n headers: gmail_v1.Schema$MessagePartHeader[],\n name: string\n): string | undefined {\n const header = headers.find(\n (candidate) => candidate.name?.toLowerCase() === name.toLowerCase()\n );\n const value = header?.value;\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction parseAddress(header?: string): { email: string; name?: string } | null {\n const addresses = parseAddressList(header);\n if (addresses.length === 0) {\n return null;\n }\n return addresses[0]!;\n}\n\nfunction inferFallbackAddress(\n field: string,\n messageId?: string | null\n): { email: string; name?: string } {\n const suffix = messageId\n ? messageId.replace(/[^\\w]/g, '').slice(-8) || 'unknown'\n : 'unknown';\n return {\n email: `${field}-${suffix}@mail.local`,\n };\n}\n\nfunction parseAddressList(header?: string): Array<{ email: string; name?: string }> {\n if (!header) return [];\n return header\n .split(',')\n .map((part) => part.trim())\n .filter(Boolean)\n .map((value) => {\n const match = value.match(/^(?:\"?([^\"]*)\"?\\s)?<?([^<>]+)>?$/);\n if (!match) {\n return { email: value };\n }\n const name = match[1]?.trim();\n const email = match[2]?.trim();\n if (!email) {\n return { email: value };\n }\n return name ? { email, name } : { email };\n });\n}\n\nfunction dedupeAddresses(\n addresses: (ReturnType<typeof parseAddress> | { email: string; name?: string })[]\n) {\n const map = new Map<string, { email: string; name?: string }>();\n for (const address of addresses) {\n if (!address) continue;\n map.set(address.email.toLowerCase(), address);\n }\n return Array.from(map.values());\n}\n\nfunction extractContent(payload?: gmail_v1.Schema$MessagePart): {\n text?: string;\n html?: string;\n attachments: EmailMessage['attachments'];\n} {\n if (!payload) {\n return { attachments: [] };\n }\n const attachments: NonNullable<EmailMessage['attachments']> = [];\n const visit = (part?: gmail_v1.Schema$MessagePart): {\n text?: string;\n html?: string;\n } => {\n if (!part) return {};\n if (part.filename && part.body?.attachmentId) {\n attachments.push({\n id: part.body.attachmentId,\n filename: part.filename,\n contentType: part.mimeType ?? 'application/octet-stream',\n sizeBytes: part.body.size ?? undefined,\n });\n }\n const mimeType = part.mimeType ?? '';\n const data = part.body?.data;\n if (mimeType === 'text/plain' && data) {\n return { text: decodeBase64Url(data) };\n }\n if (mimeType === 'text/html' && data) {\n return { html: decodeBase64Url(data) };\n }\n if (part.parts?.length) {\n return part.parts.reduce<{ text?: string; html?: string }>(\n (acc, nested) => {\n const value = visit(nested);\n return {\n text: value.text ?? acc.text,\n html: value.html ?? acc.html,\n };\n },\n {}\n );\n }\n return {};\n };\n\n const { text, html } = visit(payload);\n return { text, html, attachments };\n}\n\nfunction decodeBase64Url(data: string): string {\n const normalized = data.replace(/-/g, '+').replace(/_/g, '/');\n const padding = normalized.length % 4;\n const padded =\n padding === 0 ? normalized : normalized + '='.repeat(4 - padding);\n return Buffer.from(padded, 'base64').toString('utf-8');\n}\n\n\n"],"mappings":"oCAiBA,IAAa,EAAb,KAAkE,CAChE,MACA,OACA,iBACA,KAEA,YAAY,EAAsC,CAChD,KAAK,KAAO,EAAQ,KACpB,KAAK,MACH,EAAQ,OACR,EAAO,MAAM,CACX,QAAS,KACT,KAAM,EAAQ,KACf,CAAC,CACJ,KAAK,OAAS,EAAQ,QAAU,KAChC,KAAK,iBAAmB,EAAQ,kBAAoB,GAGtD,MAAM,YAAY,EAAsD,CACtE,IAAM,EAAW,MAAM,KAAK,MAAM,MAAM,QAAQ,KAAK,CACnD,OAAQ,KAAK,OACb,WAAY,GAAO,SACnB,UAAW,GAAO,UAClB,EAAG,GAAO,MACV,SAAU,GAAO,MAAQ,CAAC,EAAM,MAAM,CAAG,IAAA,GACzC,iBAAkB,KAAK,iBACvB,KAAM,KAAK,KACZ,CAAC,CASF,OAPgB,MAAM,QAAQ,KAC3B,EAAS,KAAK,SAAW,EAAE,EAAE,IAAI,KAAO,IAClC,EAAO,GACL,KAAK,UAAU,EAAO,GAAG,CADT,KAEvB,CACH,EAEc,OAAQ,GAAkC,IAAW,KAAK,CAG3E,MAAM,UAAU,EAA+C,CAO7D,IAAM,GANW,MAAM,KAAK,MAAM,MAAM,QAAQ,IAAI,CAClD,GAAI,EACJ,OAAQ,KAAK,OACb,OAAQ,OACR,KAAM,KAAK,KACZ,CAAC,EACsB,KACxB,GAAI,CAAC,EAAQ,OAAO,KAEpB,IAAM,EACJ,EAAO,UAAU,IAAK,GAAY,KAAK,iBAAiB,EAAQ,CAAC,EAAI,EAAE,CAEnE,EAAe,EACnB,EAAS,QAAS,GAAY,CAC5B,EAAQ,KACR,GAAG,EAAQ,GACX,GAAI,EAAQ,IAAM,EAAE,CACrB,CAAC,CACH,CAEK,EAAe,EAAS,GACxB,EAAc,EAAS,EAAS,OAAS,GACzC,EACJ,GAAa,YACb,GAAa,QACb,GAAc,YACd,GAAc,QACd,IAAI,KAEA,EAAS,MAAM,KACnB,IAAI,IACF,EACG,QAAS,GAAY,CACpB,IAAM,EAAa,EAAQ,UAAU,SAErC,OADK,EACE,EAAW,MAAM,IAAI,CAAC,IAAK,GAAU,EAAM,MAAM,CAAC,CADjC,EAAE,EAE1B,CACD,OAAQ,GAA2B,EAAQ,EAAO,CACtD,CACF,CAED,MAAO,CACL,GAAI,EAAO,IAAM,EACjB,QAAS,EAAS,IAAI,QACtB,QAAS,EAAO,SAAW,GAC3B,eACA,WACA,YACA,SACA,SAAU,EAAO,UAAY,CAAE,UAAW,EAAO,UAAW,CAAG,IAAA,GAChE,CAGH,MAAM,kBAAkB,EAAgC,CACtD,IAAM,EAAQ,EAAM,MAChB,KAAK,MAAM,EAAM,MAAM,SAAS,CAAG,IAAK,CACxC,IAAA,GACEA,EAAc,EAAE,CAClB,GACF,EAAE,KAAK,SAAS,IAAQ,CAE1B,IAAM,EAAW,MAAM,KAAK,MAAM,MAAM,SAAS,KAAK,CACpD,OAAQ,KAAK,OACb,WAAY,EAAM,SAClB,UAAW,EAAM,UACjB,SAAU,EAAM,MAAQ,CAAC,EAAM,MAAM,CAAG,IAAA,GACxC,EAAG,EAAE,KAAK,IAAI,CACd,iBAAkB,KAAK,iBACvB,KAAM,KAAK,KACZ,CAAC,CAgBF,MAAO,CACL,UAfe,MAAM,QAAQ,KAC5B,EAAS,KAAK,UAAY,EAAE,EAAE,IAAI,KAAO,IAAS,CACjD,GAAI,CAAC,EAAK,GAAI,OAAO,KACrB,IAAM,EAAO,MAAM,KAAK,MAAM,MAAM,SAAS,IAAI,CAC/C,OAAQ,KAAK,OACb,GAAI,EAAK,GACT,OAAQ,OACR,KAAM,KAAK,KACZ,CAAC,CAEF,OADK,EAAK,KACH,KAAK,iBAAiB,EAAK,KAAK,CADhB,MAEvB,CACH,EAGoB,OAChB,GAAqC,IAAY,KACnD,CACD,cAAe,EAAS,KAAK,eAAiB,IAAA,GAC/C,CAGH,iBAAyB,EAAgD,CACvE,IAAM,EAAU,EAAQ,SAAS,SAAW,EAAE,CACxC,EAAU,EAAY,EAAS,UAAU,EAAI,GAC7C,EACJ,EAAa,EAAY,EAAS,OAAO,CAAC,EAC1C,EAAqB,OAAQ,EAAQ,GAAG,CACpC,EAAK,EAAiB,EAAY,EAAS,KAAK,CAAC,CACjD,EAAK,EAAiB,EAAY,EAAS,KAAK,CAAC,CACjD,EAAM,EAAiB,EAAY,EAAS,MAAM,CAAC,CACnD,EAAU,EAAa,EAAY,EAAS,WAAW,CAAC,CAExD,CAAE,OAAM,OAAM,eAAgB,EAAe,EAAQ,QAAQ,CAC7D,EAAY,EAAQ,aACtB,IAAI,KAAK,OAAO,EAAQ,aAAa,CAAC,CACtC,IAAI,KAEFC,EAAmC,CACvC,GAAI,EAAQ,UAAU,OAClB,CAAE,SAAU,EAAQ,SAAS,KAAK,IAAI,CAAE,CACxC,EAAE,CACN,GAAI,EAAQ,UAAY,CAAE,UAAW,EAAQ,UAAW,CAAG,EAAE,CAC9D,CAED,MAAO,CACL,GAAI,EAAQ,IAAM,GAClB,SAAU,EAAQ,UAAY,GAC9B,UACA,OACA,KACA,KACA,MACA,QAAS,GAAW,IAAA,GACpB,OAAQ,EACR,WAAY,EACZ,SAAU,GAAQ,IAAA,GAClB,SAAU,GAAQ,IAAA,GAClB,cACA,QAAS,OAAO,YACd,EAAQ,IAAK,GAAW,CAAC,EAAO,MAAQ,GAAI,EAAO,OAAS,GAAG,CAAC,CACjE,CACD,SAAU,OAAO,KAAK,EAAS,CAAC,OAAS,EAAI,EAAW,IAAA,GACzD,GAIL,SAAS,EACP,EACA,EACoB,CAIpB,IAAM,EAHS,EAAQ,KACpB,GAAc,EAAU,MAAM,aAAa,GAAK,EAAK,aAAa,CACpE,EACqB,MACtB,OAAO,OAAO,GAAU,SAAW,EAAQ,IAAA,GAG7C,SAAS,EAAa,EAA0D,CAC9E,IAAM,EAAY,EAAiB,EAAO,CAI1C,OAHI,EAAU,SAAW,EAChB,KAEF,EAAU,GAGnB,SAAS,EACP,EACA,EACkC,CAIlC,MAAO,CACL,MAAO,GAAG,EAAM,GAJH,GACX,EAAU,QAAQ,SAAU,GAAG,CAAC,MAAM,GAAG,EACzC,UAEwB,aAC3B,CAGH,SAAS,EAAiB,EAA0D,CAElF,OADK,EACE,EACJ,MAAM,IAAI,CACV,IAAK,GAAS,EAAK,MAAM,CAAC,CAC1B,OAAO,QAAQ,CACf,IAAK,GAAU,CACd,IAAM,EAAQ,EAAM,MAAM,mCAAmC,CAC7D,GAAI,CAAC,EACH,MAAO,CAAE,MAAO,EAAO,CAEzB,IAAM,EAAO,EAAM,IAAI,MAAM,CACvB,EAAQ,EAAM,IAAI,MAAM,CAI9B,OAHK,EAGE,EAAO,CAAE,QAAO,OAAM,CAAG,CAAE,QAAO,CAFhC,CAAE,MAAO,EAAO,EAGzB,CAhBgB,EAAE,CAmBxB,SAAS,EACP,EACA,CACA,IAAM,EAAM,IAAI,IAChB,IAAK,IAAM,KAAW,EACf,GACL,EAAI,IAAI,EAAQ,MAAM,aAAa,CAAE,EAAQ,CAE/C,OAAO,MAAM,KAAK,EAAI,QAAQ,CAAC,CAGjC,SAAS,EAAe,EAItB,CACA,GAAI,CAAC,EACH,MAAO,CAAE,YAAa,EAAE,CAAE,CAE5B,IAAMC,EAAwD,EAAE,CAC1D,EAAS,GAGV,CACH,GAAI,CAAC,EAAM,MAAO,EAAE,CAChB,EAAK,UAAY,EAAK,MAAM,cAC9B,EAAY,KAAK,CACf,GAAI,EAAK,KAAK,aACd,SAAU,EAAK,SACf,YAAa,EAAK,UAAY,2BAC9B,UAAW,EAAK,KAAK,MAAQ,IAAA,GAC9B,CAAC,CAEJ,IAAM,EAAW,EAAK,UAAY,GAC5B,EAAO,EAAK,MAAM,KAmBxB,OAlBI,IAAa,cAAgB,EACxB,CAAE,KAAM,EAAgB,EAAK,CAAE,CAEpC,IAAa,aAAe,EACvB,CAAE,KAAM,EAAgB,EAAK,CAAE,CAEpC,EAAK,OAAO,OACP,EAAK,MAAM,QACf,EAAK,IAAW,CACf,IAAM,EAAQ,EAAM,EAAO,CAC3B,MAAO,CACL,KAAM,EAAM,MAAQ,EAAI,KACxB,KAAM,EAAM,MAAQ,EAAI,KACzB,EAEH,EAAE,CACH,CAEI,EAAE,EAGL,CAAE,OAAM,QAAS,EAAM,EAAQ,CACrC,MAAO,CAAE,OAAM,OAAM,cAAa,CAGpC,SAAS,EAAgB,EAAsB,CAC7C,IAAM,EAAa,EAAK,QAAQ,KAAM,IAAI,CAAC,QAAQ,KAAM,IAAI,CACvD,EAAU,EAAW,OAAS,EAC9B,EACJ,IAAY,EAAI,EAAa,EAAa,IAAI,OAAO,EAAI,EAAQ,CACnE,OAAO,OAAO,KAAK,EAAQ,SAAS,CAAC,SAAS,QAAQ"}
|
|
1
|
+
{"version":3,"file":"gmail-inbound.js","names":["q: string[]","metadata: Record<string, string>","attachments: NonNullable<EmailMessage['attachments']>"],"sources":["../../../../src/integrations/providers/impls/gmail-inbound.ts"],"sourcesContent":["import { google, type gmail_v1 } from 'googleapis';\n\nimport type {\n EmailInboundProvider,\n EmailMessagesSinceQuery,\n EmailMessage,\n EmailThread,\n EmailThreadListQuery,\n} from '../email';\n\nexport interface GmailInboundProviderOptions {\n auth: gmail_v1.Options['auth'];\n userId?: string;\n gmail?: gmail_v1.Gmail;\n includeSpamTrash?: boolean;\n}\n\nexport class GmailInboundProvider implements EmailInboundProvider {\n private readonly gmail: gmail_v1.Gmail;\n private readonly userId: string;\n private readonly includeSpamTrash: boolean;\n private readonly auth: gmail_v1.Options['auth'];\n\n constructor(options: GmailInboundProviderOptions) {\n this.auth = options.auth;\n this.gmail =\n options.gmail ??\n google.gmail({\n version: 'v1',\n auth: options.auth,\n });\n this.userId = options.userId ?? 'me';\n this.includeSpamTrash = options.includeSpamTrash ?? false;\n }\n\n async listThreads(query?: EmailThreadListQuery): Promise<EmailThread[]> {\n const response = await this.gmail.users.threads.list({\n userId: this.userId,\n maxResults: query?.pageSize,\n pageToken: query?.pageToken,\n q: query?.query,\n labelIds: query?.label ? [query.label] : undefined,\n includeSpamTrash: this.includeSpamTrash,\n auth: this.auth,\n });\n\n const threads = await Promise.all(\n (response.data.threads ?? []).map(async (thread) => {\n if (!thread.id) return null;\n return this.getThread(thread.id);\n })\n );\n\n return threads.filter((thread): thread is EmailThread => thread !== null);\n }\n\n async getThread(threadId: string): Promise<EmailThread | null> {\n const response = await this.gmail.users.threads.get({\n id: threadId,\n userId: this.userId,\n format: 'full',\n auth: this.auth,\n });\n const thread = response.data;\n if (!thread) return null;\n\n const messages =\n thread.messages?.map((message) => this.transformMessage(message)) ?? [];\n\n const participants = dedupeAddresses(\n messages.flatMap((message) => [\n message.from,\n ...message.to,\n ...(message.cc ?? []),\n ])\n );\n\n const firstMessage = messages[0];\n const lastMessage = messages[messages.length - 1];\n const updatedAt =\n lastMessage?.receivedAt ??\n lastMessage?.sentAt ??\n firstMessage?.receivedAt ??\n firstMessage?.sentAt ??\n new Date();\n\n const labels = Array.from(\n new Set(\n messages\n .flatMap((message) => {\n const labelField = message.metadata?.labelIds;\n if (!labelField) return [];\n return labelField.split(',').map((label) => label.trim());\n })\n .filter((label): label is string => Boolean(label))\n )\n );\n\n return {\n id: thread.id ?? threadId,\n subject: messages[0]?.subject,\n snippet: thread.snippet ?? '',\n participants,\n messages,\n updatedAt,\n labels,\n metadata: thread.historyId ? { historyId: thread.historyId } : undefined,\n };\n }\n\n async listMessagesSince(query: EmailMessagesSinceQuery) {\n const after = query.since\n ? Math.floor(query.since.getTime() / 1000)\n : undefined;\n const q: string[] = [];\n if (after) {\n q.push(`after:${after}`);\n }\n const response = await this.gmail.users.messages.list({\n userId: this.userId,\n maxResults: query.pageSize,\n pageToken: query.pageToken,\n labelIds: query.label ? [query.label] : undefined,\n q: q.join(' '),\n includeSpamTrash: this.includeSpamTrash,\n auth: this.auth,\n });\n\n const messages = await Promise.all(\n (response.data.messages ?? []).map(async (item) => {\n if (!item.id) return null;\n const full = await this.gmail.users.messages.get({\n userId: this.userId,\n id: item.id,\n format: 'full',\n auth: this.auth,\n });\n if (!full.data) return null;\n return this.transformMessage(full.data);\n })\n );\n\n return {\n messages: messages.filter(\n (message): message is EmailMessage => message !== null\n ),\n nextPageToken: response.data.nextPageToken ?? undefined,\n };\n }\n\n private transformMessage(message: gmail_v1.Schema$Message): EmailMessage {\n const headers = message.payload?.headers ?? [];\n const subject = headerValue(headers, 'Subject') ?? '';\n const from =\n parseAddress(headerValue(headers, 'From')) ??\n inferFallbackAddress('from', message.id);\n const to = parseAddressList(headerValue(headers, 'To'));\n const cc = parseAddressList(headerValue(headers, 'Cc'));\n const bcc = parseAddressList(headerValue(headers, 'Bcc'));\n const replyTo = parseAddress(headerValue(headers, 'Reply-To'));\n\n const { text, html, attachments } = extractContent(message.payload);\n const timestamp = message.internalDate\n ? new Date(Number(message.internalDate))\n : new Date();\n\n const metadata: Record<string, string> = {\n ...(message.labelIds?.length\n ? { labelIds: message.labelIds.join(',') }\n : {}),\n ...(message.historyId ? { historyId: message.historyId } : {}),\n };\n\n return {\n id: message.id ?? '',\n threadId: message.threadId ?? '',\n subject,\n from,\n to,\n cc,\n bcc,\n replyTo: replyTo ?? undefined,\n sentAt: timestamp,\n receivedAt: timestamp,\n textBody: text ?? undefined,\n htmlBody: html ?? undefined,\n attachments,\n headers: Object.fromEntries(\n headers.map((header) => [header.name ?? '', header.value ?? ''])\n ),\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n };\n }\n}\n\nfunction headerValue(\n headers: gmail_v1.Schema$MessagePartHeader[],\n name: string\n): string | undefined {\n const header = headers.find(\n (candidate) => candidate.name?.toLowerCase() === name.toLowerCase()\n );\n const value = header?.value;\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction parseAddress(\n header?: string\n): { email: string; name?: string } | null {\n const addresses = parseAddressList(header);\n if (addresses.length === 0) {\n return null;\n }\n return addresses[0]!;\n}\n\nfunction inferFallbackAddress(\n field: string,\n messageId?: string | null\n): { email: string; name?: string } {\n const suffix = messageId\n ? messageId.replace(/[^\\w]/g, '').slice(-8) || 'unknown'\n : 'unknown';\n return {\n email: `${field}-${suffix}@mail.local`,\n };\n}\n\nfunction parseAddressList(header?: string): { email: string; name?: string }[] {\n if (!header) return [];\n return header\n .split(',')\n .map((part) => part.trim())\n .filter(Boolean)\n .map((value) => {\n const match = value.match(/^(?:\"?([^\"]*)\"?\\s)?<?([^<>]+)>?$/);\n if (!match) {\n return { email: value };\n }\n const name = match[1]?.trim();\n const email = match[2]?.trim();\n if (!email) {\n return { email: value };\n }\n return name ? { email, name } : { email };\n });\n}\n\nfunction dedupeAddresses(\n addresses: (\n | ReturnType<typeof parseAddress>\n | { email: string; name?: string }\n )[]\n) {\n const map = new Map<string, { email: string; name?: string }>();\n for (const address of addresses) {\n if (!address) continue;\n map.set(address.email.toLowerCase(), address);\n }\n return Array.from(map.values());\n}\n\nfunction extractContent(payload?: gmail_v1.Schema$MessagePart): {\n text?: string;\n html?: string;\n attachments: EmailMessage['attachments'];\n} {\n if (!payload) {\n return { attachments: [] };\n }\n const attachments: NonNullable<EmailMessage['attachments']> = [];\n const visit = (\n part?: gmail_v1.Schema$MessagePart\n ): {\n text?: string;\n html?: string;\n } => {\n if (!part) return {};\n if (part.filename && part.body?.attachmentId) {\n attachments.push({\n id: part.body.attachmentId,\n filename: part.filename,\n contentType: part.mimeType ?? 'application/octet-stream',\n sizeBytes: part.body.size ?? undefined,\n });\n }\n const mimeType = part.mimeType ?? '';\n const data = part.body?.data;\n if (mimeType === 'text/plain' && data) {\n return { text: decodeBase64Url(data) };\n }\n if (mimeType === 'text/html' && data) {\n return { html: decodeBase64Url(data) };\n }\n if (part.parts?.length) {\n return part.parts.reduce<{ text?: string; html?: string }>(\n (acc, nested) => {\n const value = visit(nested);\n return {\n text: value.text ?? acc.text,\n html: value.html ?? acc.html,\n };\n },\n {}\n );\n }\n return {};\n };\n\n const { text, html } = visit(payload);\n return { text, html, attachments };\n}\n\nfunction decodeBase64Url(data: string): string {\n const normalized = data.replace(/-/g, '+').replace(/_/g, '/');\n const padding = normalized.length % 4;\n const padded =\n padding === 0 ? normalized : normalized + '='.repeat(4 - padding);\n return Buffer.from(padded, 'base64').toString('utf-8');\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gmail-outbound.d.ts","names":[],"sources":["../../../../src/integrations/providers/impls/gmail-outbound.ts"],"sourcesContent":[],"mappings":";;;;UASiB,4BAAA;QACT,QAAA,CAAS;EADA,MAAA,CAAA,EAAA,MAAA;EAMJ,KAAA,CAAA,EAHH,QAAA,CAAS,KAGN;;
|
|
1
|
+
{"version":3,"file":"gmail-outbound.d.ts","names":[],"sources":["../../../../src/integrations/providers/impls/gmail-outbound.ts"],"sourcesContent":[],"mappings":";;;;UASiB,4BAAA;QACT,QAAA,CAAS;EADA,MAAA,CAAA,EAAA,MAAA;EAMJ,KAAA,CAAA,EAHH,QAAA,CAAS,KAGN;;AAgBc,cAhBd,qBAAA,YAAiC,qBAgBnB,CAAA;EAA+B,iBAAA,KAAA;EAAR,iBAAA,MAAA;EAhBJ,iBAAA,IAAA;EAAqB,WAAA,CAAA,OAAA,EAK5C,4BAL4C;qBAgBxC,uBAAuB,QAAQ"}
|