@lssm/lib.metering 0.0.0-canary-20251206160926

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +184 -0
  2. package/dist/aggregation/index.d.ts +155 -0
  3. package/dist/aggregation/index.js +1 -0
  4. package/dist/contracts/dist/capabilities/openbanking.js +1 -0
  5. package/dist/contracts/dist/client/index.js +1 -0
  6. package/dist/contracts/dist/client/react/feature-render.js +1 -0
  7. package/dist/contracts/dist/client/react/form-render.js +1 -0
  8. package/dist/contracts/dist/client/react/index.js +1 -0
  9. package/dist/contracts/dist/events.js +1 -0
  10. package/dist/contracts/dist/experiments/evaluator.js +1 -0
  11. package/dist/contracts/dist/graphql-federation/dist/index.js +1 -0
  12. package/dist/contracts/dist/index.js +1 -0
  13. package/dist/contracts/dist/install.js +1 -0
  14. package/dist/contracts/dist/integrations/contracts.js +1 -0
  15. package/dist/contracts/dist/integrations/index.js +1 -0
  16. package/dist/contracts/dist/integrations/openbanking/contracts/accounts.js +1 -0
  17. package/dist/contracts/dist/integrations/openbanking/contracts/balances.js +1 -0
  18. package/dist/contracts/dist/integrations/openbanking/contracts/index.js +1 -0
  19. package/dist/contracts/dist/integrations/openbanking/contracts/transactions.js +1 -0
  20. package/dist/contracts/dist/integrations/openbanking/models.js +1 -0
  21. package/dist/contracts/dist/integrations/openbanking/telemetry.js +1 -0
  22. package/dist/contracts/dist/integrations/providers/elevenlabs.js +1 -0
  23. package/dist/contracts/dist/integrations/providers/gcs-storage.js +1 -0
  24. package/dist/contracts/dist/integrations/providers/gmail.js +1 -0
  25. package/dist/contracts/dist/integrations/providers/google-calendar.js +1 -0
  26. package/dist/contracts/dist/integrations/providers/impls/elevenlabs-voice.js +1 -0
  27. package/dist/contracts/dist/integrations/providers/impls/gcs-storage.js +1 -0
  28. package/dist/contracts/dist/integrations/providers/impls/gmail-inbound.js +1 -0
  29. package/dist/contracts/dist/integrations/providers/impls/gmail-outbound.js +1 -0
  30. package/dist/contracts/dist/integrations/providers/impls/google-calendar.js +1 -0
  31. package/dist/contracts/dist/integrations/providers/impls/index.js +1 -0
  32. package/dist/contracts/dist/integrations/providers/impls/mistral-embedding.js +1 -0
  33. package/dist/contracts/dist/integrations/providers/impls/mistral-llm.js +1 -0
  34. package/dist/contracts/dist/integrations/providers/impls/postmark-email.js +1 -0
  35. package/dist/contracts/dist/integrations/providers/impls/powens-client.js +1 -0
  36. package/dist/contracts/dist/integrations/providers/impls/powens-openbanking.js +1 -0
  37. package/dist/contracts/dist/integrations/providers/impls/provider-factory.js +1 -0
  38. package/dist/contracts/dist/integrations/providers/impls/qdrant-vector.js +1 -0
  39. package/dist/contracts/dist/integrations/providers/impls/stripe-payments.js +1 -0
  40. package/dist/contracts/dist/integrations/providers/impls/twilio-sms.js +1 -0
  41. package/dist/contracts/dist/integrations/providers/index.js +1 -0
  42. package/dist/contracts/dist/integrations/providers/mistral.js +1 -0
  43. package/dist/contracts/dist/integrations/providers/postmark.js +1 -0
  44. package/dist/contracts/dist/integrations/providers/powens.js +1 -0
  45. package/dist/contracts/dist/integrations/providers/qdrant.js +1 -0
  46. package/dist/contracts/dist/integrations/providers/stripe.js +1 -0
  47. package/dist/contracts/dist/integrations/providers/twilio-sms.js +1 -0
  48. package/dist/contracts/dist/integrations/runtime.js +1 -0
  49. package/dist/contracts/dist/integrations/secrets/env-secret-provider.js +1 -0
  50. package/dist/contracts/dist/integrations/secrets/gcp-secret-manager.js +1 -0
  51. package/dist/contracts/dist/integrations/secrets/index.js +1 -0
  52. package/dist/contracts/dist/integrations/secrets/manager.js +1 -0
  53. package/dist/contracts/dist/integrations/secrets/provider.js +1 -0
  54. package/dist/contracts/dist/jsonschema.js +1 -0
  55. package/dist/contracts/dist/knowledge/contracts.js +1 -0
  56. package/dist/contracts/dist/knowledge/index.js +1 -0
  57. package/dist/contracts/dist/knowledge/spaces/email-threads.js +1 -0
  58. package/dist/contracts/dist/knowledge/spaces/financial-docs.js +1 -0
  59. package/dist/contracts/dist/knowledge/spaces/financial-overview.js +1 -0
  60. package/dist/contracts/dist/knowledge/spaces/index.js +1 -0
  61. package/dist/contracts/dist/knowledge/spaces/product-canon.js +1 -0
  62. package/dist/contracts/dist/knowledge/spaces/support-faq.js +1 -0
  63. package/dist/contracts/dist/knowledge/spaces/uploaded-docs.js +1 -0
  64. package/dist/contracts/dist/onboarding-base.js +1 -0
  65. package/dist/contracts/dist/ownership.js +1 -0
  66. package/dist/contracts/dist/presentations.js +1 -0
  67. package/dist/contracts/dist/presentations.v2.js +1 -0
  68. package/dist/contracts/dist/prompt.js +1 -0
  69. package/dist/contracts/dist/promptRegistry.js +1 -0
  70. package/dist/contracts/dist/regenerator/index.js +1 -0
  71. package/dist/contracts/dist/regenerator/service.js +1 -0
  72. package/dist/contracts/dist/registry.js +1 -0
  73. package/dist/contracts/dist/resources.js +1 -0
  74. package/dist/contracts/dist/schema/dist/EnumType.js +1 -0
  75. package/dist/contracts/dist/schema/dist/FieldType.js +1 -0
  76. package/dist/contracts/dist/schema/dist/ScalarTypeEnum.js +1 -0
  77. package/dist/contracts/dist/schema/dist/SchemaModel.js +1 -0
  78. package/dist/contracts/dist/schema/dist/entity/defineEntity.js +1 -0
  79. package/dist/contracts/dist/schema/dist/entity/index.js +1 -0
  80. package/dist/contracts/dist/schema/dist/entity/types.js +1 -0
  81. package/dist/contracts/dist/schema/dist/index.js +1 -0
  82. package/dist/contracts/dist/server/graphql-pothos.js +1 -0
  83. package/dist/contracts/dist/server/graphql-schema-export.js +1 -0
  84. package/dist/contracts/dist/server/index.js +1 -0
  85. package/dist/contracts/dist/server/provider-mcp.js +1 -0
  86. package/dist/contracts/dist/server/rest-elysia.js +1 -0
  87. package/dist/contracts/dist/server/rest-express.js +1 -0
  88. package/dist/contracts/dist/server/rest-generic.js +1 -0
  89. package/dist/contracts/dist/server/rest-next-app.js +1 -0
  90. package/dist/contracts/dist/server/rest-next-pages.js +1 -0
  91. package/dist/contracts/dist/spec.js +1 -0
  92. package/dist/contracts/dist/telemetry/index.js +1 -0
  93. package/dist/contracts/dist/telemetry/tracker.js +1 -0
  94. package/dist/contracts/dist/tests/index.js +1 -0
  95. package/dist/contracts/dist/tests/runner.js +1 -0
  96. package/dist/contracts/dist/workflow/index.js +1 -0
  97. package/dist/contracts/dist/workflow/runner.js +1 -0
  98. package/dist/contracts/index.d.ts +1138 -0
  99. package/dist/contracts/index.js +1 -0
  100. package/dist/entities/index.d.ts +230 -0
  101. package/dist/entities/index.js +1 -0
  102. package/dist/events.d.ts +539 -0
  103. package/dist/events.js +1 -0
  104. package/dist/index.d.ts +5 -0
  105. package/dist/index.js +1 -0
  106. package/dist/schema/dist/EnumType.js +1 -0
  107. package/dist/schema/dist/FieldType.js +1 -0
  108. package/dist/schema/dist/ScalarTypeEnum.js +1 -0
  109. package/dist/schema/dist/SchemaModel.js +1 -0
  110. package/dist/schema/dist/entity/defineEntity.js +1 -0
  111. package/dist/schema/dist/entity/index.js +1 -0
  112. package/dist/schema/dist/entity/types.js +1 -0
  113. package/dist/schema/dist/index.js +1 -0
  114. package/package.json +45 -0
package/README.md ADDED
@@ -0,0 +1,184 @@
1
+ # @lssm/lib.metering
2
+
3
+ Usage metering and billing core module for ContractSpec applications.
4
+
5
+ ## Overview
6
+
7
+ This module provides a reusable metering system that can be used to track usage-based metrics across all ContractSpec applications. It supports:
8
+
9
+ - **Metric Definitions**: Define what metrics to track
10
+ - **Usage Recording**: Record usage events
11
+ - **Aggregation**: Roll up usage into summaries
12
+ - **Thresholds & Alerts**: Monitor usage against limits
13
+ - **Billing Integration**: Connect usage to billing/plans
14
+
15
+ ## Entities
16
+
17
+ ### MetricDefinition
18
+
19
+ Defines a trackable metric.
20
+
21
+ | Field | Type | Description |
22
+ |-------|------|-------------|
23
+ | id | string | Unique identifier |
24
+ | key | string | Metric key (e.g., `api_calls`, `storage_gb`) |
25
+ | name | string | Human-readable name |
26
+ | description | string | Metric description |
27
+ | unit | string | Unit of measurement |
28
+ | aggregationType | enum | How to aggregate (count, sum, avg, max, min) |
29
+ | resetPeriod | enum | When to reset (never, hourly, daily, monthly) |
30
+ | orgId | string | Organization scope (null = global) |
31
+
32
+ ### UsageRecord
33
+
34
+ Individual usage event.
35
+
36
+ | Field | Type | Description |
37
+ |-------|------|-------------|
38
+ | id | string | Unique identifier |
39
+ | metricKey | string | Metric being recorded |
40
+ | subjectType | string | Subject type (org, user, project) |
41
+ | subjectId | string | Subject identifier |
42
+ | quantity | decimal | Usage quantity |
43
+ | timestamp | datetime | When usage occurred |
44
+ | metadata | json | Additional context |
45
+
46
+ ### UsageSummary
47
+
48
+ Pre-aggregated usage summary.
49
+
50
+ | Field | Type | Description |
51
+ |-------|------|-------------|
52
+ | id | string | Unique identifier |
53
+ | metricKey | string | Metric key |
54
+ | subjectType | string | Subject type |
55
+ | subjectId | string | Subject identifier |
56
+ | periodType | enum | Period type (hourly, daily, monthly) |
57
+ | periodStart | datetime | Period start time |
58
+ | periodEnd | datetime | Period end time |
59
+ | totalQuantity | decimal | Aggregated quantity |
60
+ | recordCount | int | Number of records aggregated |
61
+
62
+ ### UsageThreshold
63
+
64
+ Threshold configuration for alerts.
65
+
66
+ | Field | Type | Description |
67
+ |-------|------|-------------|
68
+ | id | string | Unique identifier |
69
+ | metricKey | string | Metric to monitor |
70
+ | subjectType | string | Subject type |
71
+ | subjectId | string | Subject identifier |
72
+ | threshold | decimal | Threshold value |
73
+ | action | enum | Action when exceeded (alert, block, none) |
74
+ | notifyEmails | json | Email addresses to notify |
75
+
76
+ ## Contracts
77
+
78
+ ### Commands
79
+
80
+ - `metric.define` - Define a new metric
81
+ - `metric.update` - Update metric definition
82
+ - `metric.delete` - Delete a metric
83
+ - `usage.record` - Record a usage event
84
+ - `usage.recordBatch` - Record multiple usage events
85
+ - `threshold.create` - Create a usage threshold
86
+ - `threshold.update` - Update a threshold
87
+ - `threshold.delete` - Delete a threshold
88
+
89
+ ### Queries
90
+
91
+ - `metric.get` - Get metric definition
92
+ - `metric.list` - List all metrics
93
+ - `usage.get` - Get usage for a subject
94
+ - `usage.getSummary` - Get aggregated usage summary
95
+ - `usage.export` - Export usage data
96
+ - `threshold.list` - List thresholds
97
+
98
+ ## Events
99
+
100
+ - `metric.defined` - Metric was defined
101
+ - `usage.recorded` - Usage was recorded
102
+ - `usage.aggregated` - Usage was aggregated into summary
103
+ - `threshold.exceeded` - Usage exceeded a threshold
104
+ - `threshold.approaching` - Usage approaching threshold (80%)
105
+
106
+ ## Usage
107
+
108
+ ```typescript
109
+ import {
110
+ MetricDefinitionEntity,
111
+ RecordUsageContract,
112
+ UsageAggregator
113
+ } from '@lssm/lib.metering';
114
+
115
+ // Define a metric
116
+ await meteringService.defineMetric({
117
+ key: 'api_calls',
118
+ name: 'API Calls',
119
+ unit: 'calls',
120
+ aggregationType: 'COUNT',
121
+ resetPeriod: 'MONTHLY',
122
+ });
123
+
124
+ // Record usage
125
+ await meteringService.recordUsage({
126
+ metricKey: 'api_calls',
127
+ subjectType: 'org',
128
+ subjectId: 'org-123',
129
+ quantity: 1,
130
+ });
131
+
132
+ // Get usage summary
133
+ const summary = await meteringService.getUsageSummary({
134
+ metricKey: 'api_calls',
135
+ subjectType: 'org',
136
+ subjectId: 'org-123',
137
+ periodType: 'MONTHLY',
138
+ periodStart: new Date('2024-01-01'),
139
+ });
140
+ ```
141
+
142
+ ## Aggregation
143
+
144
+ The module includes an aggregation engine that periodically rolls up usage records:
145
+
146
+ ```typescript
147
+ import { UsageAggregator } from '@lssm/lib.metering/aggregation';
148
+
149
+ const aggregator = new UsageAggregator({
150
+ storage: usageStorage,
151
+ });
152
+
153
+ // Run hourly aggregation
154
+ await aggregator.aggregate({
155
+ periodType: 'HOURLY',
156
+ periodStart: new Date(),
157
+ });
158
+ ```
159
+
160
+ ## Integration
161
+
162
+ This module integrates with:
163
+
164
+ - `@lssm/lib.jobs` - Scheduled aggregation jobs
165
+ - `@lssm/modules.notifications` - Threshold alerts
166
+ - `@lssm/lib.identity-rbac` - Subject resolution
167
+
168
+ ## Schema Contribution
169
+
170
+ ```typescript
171
+ import { meteringSchemaContribution } from '@lssm/lib.metering';
172
+
173
+ export const schemaComposition = {
174
+ modules: [
175
+ meteringSchemaContribution,
176
+ // ... other modules
177
+ ],
178
+ };
179
+ ```
180
+
181
+
182
+
183
+
184
+
@@ -0,0 +1,155 @@
1
+ //#region src/aggregation/index.d.ts
2
+ /**
3
+ * Usage aggregation engine.
4
+ *
5
+ * Provides periodic aggregation of usage records into summaries
6
+ * for efficient billing and reporting queries.
7
+ */
8
+ type PeriodType = 'HOURLY' | 'DAILY' | 'WEEKLY' | 'MONTHLY' | 'YEARLY';
9
+ type AggregationType = 'COUNT' | 'SUM' | 'AVG' | 'MAX' | 'MIN' | 'LAST';
10
+ interface UsageRecord {
11
+ id: string;
12
+ metricKey: string;
13
+ subjectType: string;
14
+ subjectId: string;
15
+ quantity: number;
16
+ timestamp: Date;
17
+ }
18
+ interface UsageSummary {
19
+ id: string;
20
+ metricKey: string;
21
+ subjectType: string;
22
+ subjectId: string;
23
+ periodType: PeriodType;
24
+ periodStart: Date;
25
+ periodEnd: Date;
26
+ totalQuantity: number;
27
+ recordCount: number;
28
+ minQuantity?: number;
29
+ maxQuantity?: number;
30
+ avgQuantity?: number;
31
+ }
32
+ interface MetricDefinition {
33
+ key: string;
34
+ aggregationType: AggregationType;
35
+ }
36
+ interface UsageStorage {
37
+ /**
38
+ * Get unaggregated records for a period.
39
+ */
40
+ getUnaggregatedRecords(options: {
41
+ metricKey?: string;
42
+ periodStart: Date;
43
+ periodEnd: Date;
44
+ limit?: number;
45
+ }): Promise<UsageRecord[]>;
46
+ /**
47
+ * Mark records as aggregated.
48
+ */
49
+ markRecordsAggregated(recordIds: string[], aggregatedAt: Date): Promise<void>;
50
+ /**
51
+ * Get or create a summary record.
52
+ */
53
+ upsertSummary(summary: Omit<UsageSummary, 'id'>): Promise<UsageSummary>;
54
+ /**
55
+ * Get metric definition.
56
+ */
57
+ getMetric(key: string): Promise<MetricDefinition | null>;
58
+ /**
59
+ * List all active metrics.
60
+ */
61
+ listMetrics(): Promise<MetricDefinition[]>;
62
+ }
63
+ interface AggregationOptions {
64
+ /** Storage implementation */
65
+ storage: UsageStorage;
66
+ /** Batch size for processing records */
67
+ batchSize?: number;
68
+ }
69
+ interface AggregateParams {
70
+ /** Period type to aggregate */
71
+ periodType: PeriodType;
72
+ /** Period start time */
73
+ periodStart: Date;
74
+ /** Period end time (optional, defaults to period boundary) */
75
+ periodEnd?: Date;
76
+ /** Specific metric to aggregate (optional, aggregates all if not specified) */
77
+ metricKey?: string;
78
+ }
79
+ interface AggregationResult {
80
+ periodType: PeriodType;
81
+ periodStart: Date;
82
+ periodEnd: Date;
83
+ recordsProcessed: number;
84
+ summariesCreated: number;
85
+ summariesUpdated: number;
86
+ errors: AggregationError[];
87
+ }
88
+ interface AggregationError {
89
+ metricKey: string;
90
+ subjectType: string;
91
+ subjectId: string;
92
+ error: string;
93
+ }
94
+ /**
95
+ * Get the start of a period for a given date.
96
+ */
97
+ declare function getPeriodStart(date: Date, periodType: PeriodType): Date;
98
+ /**
99
+ * Get the end of a period for a given date.
100
+ */
101
+ declare function getPeriodEnd(date: Date, periodType: PeriodType): Date;
102
+ /**
103
+ * Format a period key for grouping.
104
+ */
105
+ declare function formatPeriodKey(date: Date, periodType: PeriodType): string;
106
+ /**
107
+ * Usage aggregator.
108
+ *
109
+ * Aggregates usage records into summaries based on period type.
110
+ */
111
+ declare class UsageAggregator {
112
+ private storage;
113
+ private batchSize;
114
+ constructor(options: AggregationOptions);
115
+ /**
116
+ * Aggregate usage records for a period.
117
+ */
118
+ aggregate(params: AggregateParams): Promise<AggregationResult>;
119
+ /**
120
+ * Group records by metric, subject, and period.
121
+ */
122
+ private groupRecords;
123
+ /**
124
+ * Aggregate a group of records into a summary.
125
+ */
126
+ private aggregateGroup;
127
+ /**
128
+ * Calculate aggregation values.
129
+ */
130
+ private calculateAggregation;
131
+ }
132
+ /**
133
+ * In-memory usage storage for testing.
134
+ */
135
+ declare class InMemoryUsageStorage implements UsageStorage {
136
+ private records;
137
+ private summaries;
138
+ private metrics;
139
+ addRecord(record: UsageRecord): void;
140
+ addMetric(metric: MetricDefinition): void;
141
+ getUnaggregatedRecords(options: {
142
+ metricKey?: string;
143
+ periodStart: Date;
144
+ periodEnd: Date;
145
+ limit?: number;
146
+ }): Promise<UsageRecord[]>;
147
+ markRecordsAggregated(recordIds: string[]): Promise<void>;
148
+ upsertSummary(summary: Omit<UsageSummary, 'id'>): Promise<UsageSummary>;
149
+ getMetric(key: string): Promise<MetricDefinition | null>;
150
+ listMetrics(): Promise<MetricDefinition[]>;
151
+ getSummaries(): UsageSummary[];
152
+ clear(): void;
153
+ }
154
+ //#endregion
155
+ export { AggregateParams, AggregationError, AggregationOptions, AggregationResult, AggregationType, InMemoryUsageStorage, MetricDefinition, PeriodType, UsageAggregator, UsageRecord, UsageStorage, UsageSummary, formatPeriodKey, getPeriodEnd, getPeriodStart };
@@ -0,0 +1 @@
1
+ function e(e,t){let n=new Date(e);switch(t){case`HOURLY`:return n.setMinutes(0,0,0),n;case`DAILY`:return n.setHours(0,0,0,0),n;case`WEEKLY`:n.setHours(0,0,0,0);let e=n.getDay();return n.setDate(n.getDate()-e),n;case`MONTHLY`:return n.setHours(0,0,0,0),n.setDate(1),n;case`YEARLY`:return n.setHours(0,0,0,0),n.setMonth(0,1),n}}function t(t,n){let r=e(t,n);switch(n){case`HOURLY`:return new Date(r.getTime()+3600*1e3);case`DAILY`:return new Date(r.getTime()+1440*60*1e3);case`WEEKLY`:return new Date(r.getTime()+10080*60*1e3);case`MONTHLY`:{let e=new Date(r);return e.setMonth(e.getMonth()+1),e}case`YEARLY`:{let e=new Date(r);return e.setFullYear(e.getFullYear()+1),e}}}function n(t,n){let i=e(t,n),a=i.getFullYear(),o=String(i.getMonth()+1).padStart(2,`0`),s=String(i.getDate()).padStart(2,`0`),c=String(i.getHours()).padStart(2,`0`);switch(n){case`HOURLY`:return`${a}-${o}-${s}T${c}`;case`DAILY`:return`${a}-${o}-${s}`;case`WEEKLY`:return`${a}-W${r(i)}`;case`MONTHLY`:return`${a}-${o}`;case`YEARLY`:return`${a}`}}function r(e){let t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())),n=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-n);let r=new Date(Date.UTC(t.getUTCFullYear(),0,1)),i=Math.ceil(((t.getTime()-r.getTime())/864e5+1)/7);return String(i).padStart(2,`0`)}var i=class{storage;batchSize;constructor(e){this.storage=e.storage,this.batchSize=e.batchSize||1e3}async aggregate(e){let{periodType:n,periodStart:r,metricKey:i}=e,a=e.periodEnd||t(r,n),o={periodType:n,periodStart:r,periodEnd:a,recordsProcessed:0,summariesCreated:0,summariesUpdated:0,errors:[]},s=await this.storage.getUnaggregatedRecords({metricKey:i,periodStart:r,periodEnd:a,limit:this.batchSize});if(s.length===0)return o;let c=this.groupRecords(s,n);for(let[e,t]of c.entries())try{await this.aggregateGroup(e,t,n,o)}catch(t){let[n,r,i]=e.split(`::`);o.errors.push({metricKey:n,subjectType:r,subjectId:i,error:t instanceof Error?t.message:String(t)})}let l=s.map(e=>e.id);return await this.storage.markRecordsAggregated(l,new Date),o.recordsProcessed=s.length,o}groupRecords(e,t){let r=new Map;for(let i of e){let e=n(i.timestamp,t),a=`${i.metricKey}::${i.subjectType}::${i.subjectId}::${e}`,o=r.get(a)||[];o.push(i),r.set(a,o)}return r}async aggregateGroup(n,r,i,a){let[o,s,c]=n.split(`::`);if(!o||!s||!c||r.length===0)return;let l=r[0],u=e(l.timestamp,i),d=t(l.timestamp,i),f=(await this.storage.getMetric(o))?.aggregationType||`SUM`,p=r.map(e=>e.quantity),m=this.calculateAggregation(p,f);await this.storage.upsertSummary({metricKey:o,subjectType:s,subjectId:c,periodType:i,periodStart:u,periodEnd:d,totalQuantity:m.total,recordCount:r.length,minQuantity:m.min,maxQuantity:m.max,avgQuantity:m.avg}),a.summariesCreated++}calculateAggregation(e,t){if(e.length===0)return{total:0,min:0,max:0,avg:0};let n=Math.min(...e),r=Math.max(...e),i=e.reduce((e,t)=>e+t,0),a=i/e.length,o=e.length,s;switch(t){case`COUNT`:s=o;break;case`SUM`:s=i;break;case`AVG`:s=a;break;case`MAX`:s=r;break;case`MIN`:s=n;break;case`LAST`:s=e[e.length-1]??0;break;default:s=i}return{total:s,min:n,max:r,avg:a}}},a=class{records=[];summaries=new Map;metrics=new Map;addRecord(e){this.records.push(e)}addMetric(e){this.metrics.set(e.key,e)}async getUnaggregatedRecords(e){let t=this.records.filter(t=>{let n=t.timestamp>=e.periodStart&&t.timestamp<e.periodEnd,r=!e.metricKey||t.metricKey===e.metricKey;return n&&r});return e.limit&&(t=t.slice(0,e.limit)),t}async markRecordsAggregated(e){this.records=this.records.filter(t=>!e.includes(t.id))}async upsertSummary(e){let t=`${e.metricKey}::${e.subjectType}::${e.subjectId}::${e.periodType}::${e.periodStart.toISOString()}`,n=this.summaries.get(t);if(n)return n.totalQuantity+=e.totalQuantity,n.recordCount+=e.recordCount,e.minQuantity!==void 0&&(n.minQuantity=Math.min(n.minQuantity??1/0,e.minQuantity)),e.maxQuantity!==void 0&&(n.maxQuantity=Math.max(n.maxQuantity??-1/0,e.maxQuantity)),n;let r={id:`summary-${Date.now()}-${Math.random().toString(36).slice(2)}`,...e};return this.summaries.set(t,r),r}async getMetric(e){return this.metrics.get(e)||null}async listMetrics(){return Array.from(this.metrics.values())}getSummaries(){return Array.from(this.summaries.values())}clear(){this.records=[],this.summaries.clear(),this.metrics.clear()}};export{a as InMemoryUsageStorage,i as UsageAggregator,n as formatPeriodKey,t as getPeriodEnd,e as getPeriodStart};
@@ -0,0 +1 @@
1
+ import{e}from"../ownership.js";const t=[`platform.finance`],n=[`open-banking`,`finance`];[...t],[...n],e.Experimental,[...t],[...n],e.Experimental,[...t],[...n],e.Experimental;
@@ -0,0 +1 @@
1
+ "use client";import"./react/feature-render.js";import"./react/form-render.js";import"./react/index.js";
@@ -0,0 +1 @@
1
+ import"../../presentations.v2.js";import"react";
@@ -0,0 +1 @@
1
+ import"react";import"react-hook-form";import"@hookform/resolvers/zod";import"react/jsx-runtime";
@@ -0,0 +1 @@
1
+ "use client";import"./feature-render.js";import"./form-render.js";
@@ -0,0 +1 @@
1
+ import"./schema/dist/index.js";function e(e){return e}export{e};
@@ -0,0 +1 @@
1
+ import"node:crypto";
@@ -0,0 +1 @@
1
+ import"@pothos/plugin-federation";import"@apollo/subgraph";
@@ -0,0 +1 @@
1
+ import"./schema/dist/SchemaModel.js";import"./schema/dist/index.js";import{e}from"./events.js";import"./presentations.v2.js";import"./client/react/feature-render.js";import"./client/react/form-render.js";import"./client/index.js";import"./jsonschema.js";import"./server/graphql-pothos.js";import"./server/graphql-schema-export.js";import"./presentations.js";import"./server/provider-mcp.js";import"./server/rest-generic.js";import"./server/rest-elysia.js";import"./server/rest-express.js";import"./server/rest-next-app.js";import"./server/rest-next-pages.js";import"./server/index.js";import{n as t,t as n}from"./spec.js";import"./registry.js";import"./install.js";import"./prompt.js";import"./promptRegistry.js";import"./resources.js";import{e as r,r as i,t as a}from"./ownership.js";import{d as o,l as s,m as c,o as l,p as u,s as d}from"./onboarding-base.js";import"./capabilities/openbanking.js";import"./telemetry/tracker.js";import"./telemetry/index.js";import"./tests/runner.js";import"./tests/index.js";import"./experiments/evaluator.js";import"./integrations/providers/stripe.js";import"./integrations/providers/postmark.js";import"./integrations/providers/qdrant.js";import"./integrations/providers/mistral.js";import"./integrations/providers/elevenlabs.js";import"./integrations/providers/gmail.js";import"./integrations/providers/google-calendar.js";import"./integrations/providers/twilio-sms.js";import"./integrations/providers/gcs-storage.js";import"./integrations/providers/powens.js";import"./integrations/providers/impls/mistral-llm.js";import"./integrations/providers/impls/mistral-embedding.js";import"./integrations/providers/impls/qdrant-vector.js";import"./integrations/providers/impls/gmail-inbound.js";import"./integrations/providers/impls/gmail-outbound.js";import"./integrations/providers/impls/google-calendar.js";import"./integrations/providers/impls/elevenlabs-voice.js";import"./integrations/providers/impls/gcs-storage.js";import"./integrations/providers/impls/stripe-payments.js";import"./integrations/providers/impls/postmark-email.js";import"./integrations/providers/impls/twilio-sms.js";import"./integrations/providers/impls/powens-client.js";import"./integrations/providers/impls/powens-openbanking.js";import"./integrations/providers/impls/provider-factory.js";import"./integrations/secrets/provider.js";import"./integrations/secrets/gcp-secret-manager.js";import"./integrations/secrets/env-secret-provider.js";import"./integrations/secrets/manager.js";import"./integrations/runtime.js";import{i as f,n as p,r as m}from"./integrations/openbanking/models.js";import{t as h}from"./integrations/openbanking/telemetry.js";import{d as g,f as _,p as v}from"./integrations/openbanking/contracts/accounts.js";import{d as y,u as b}from"./integrations/openbanking/contracts/transactions.js";import{d as x,u as S}from"./integrations/openbanking/contracts/balances.js";import"./integrations/openbanking/contracts/index.js";import"./integrations/index.js";import"./knowledge/spaces/product-canon.js";import"./knowledge/spaces/support-faq.js";import"./knowledge/spaces/email-threads.js";import"./knowledge/spaces/uploaded-docs.js";import"./knowledge/spaces/financial-docs.js";import"./knowledge/spaces/financial-overview.js";import"./knowledge/index.js";import{_ as C,g as w,h as T,m as E,p as D}from"./integrations/contracts.js";import{_ as O,g as k,h as A,m as j,v as M}from"./knowledge/contracts.js";import"./regenerator/service.js";import"./regenerator/index.js";import"./workflow/runner.js";import"./workflow/index.js";
@@ -0,0 +1 @@
1
+ import"./registry.js";import{z as e}from"zod";
@@ -0,0 +1 @@
1
+ import{t as e}from"../schema/dist/SchemaModel.js";import{l as t}from"../schema/dist/ScalarTypeEnum.js";import"../schema/dist/index.js";import{n,t as r}from"../spec.js";const i=new e({name:`IntegrationConnectionRecord`,fields:{id:{type:t.ID(),isOptional:!1},tenantId:{type:t.ID(),isOptional:!1},integrationKey:{type:t.NonEmptyString(),isOptional:!1},integrationVersion:{type:t.Int_unsecure(),isOptional:!1},label:{type:t.String_unsecure(),isOptional:!1},ownershipMode:{type:t.String_unsecure(),isOptional:!1},externalAccountId:{type:t.String_unsecure(),isOptional:!0},secretProvider:{type:t.String_unsecure(),isOptional:!1},secretRef:{type:t.String_unsecure(),isOptional:!1},status:{type:t.String_unsecure(),isOptional:!1},environment:{type:t.String_unsecure(),isOptional:!0},healthStatus:{type:t.String_unsecure(),isOptional:!0},healthCheckedAt:{type:t.DateTime(),isOptional:!0},healthLatencyMs:{type:t.Float_unsecure(),isOptional:!0},healthErrorCode:{type:t.String_unsecure(),isOptional:!0},healthErrorMessage:{type:t.String_unsecure(),isOptional:!0},usageRequestCount:{type:t.Int_unsecure(),isOptional:!0},usageSuccessCount:{type:t.Int_unsecure(),isOptional:!0},usageErrorCount:{type:t.Int_unsecure(),isOptional:!0},usageLastUsedAt:{type:t.DateTime(),isOptional:!0},usageLastErrorAt:{type:t.DateTime(),isOptional:!0},usageLastErrorCode:{type:t.String_unsecure(),isOptional:!0},createdAt:{type:t.DateTime(),isOptional:!0},updatedAt:{type:t.DateTime(),isOptional:!0}}}),a=new e({name:`CreateIntegrationConnectionInput`,fields:{tenantId:{type:t.ID(),isOptional:!1},integrationKey:{type:t.NonEmptyString(),isOptional:!1},integrationVersion:{type:t.Int_unsecure(),isOptional:!1},label:{type:t.String_unsecure(),isOptional:!1},ownershipMode:{type:t.String_unsecure(),isOptional:!1},externalAccountId:{type:t.String_unsecure(),isOptional:!0},secretProvider:{type:t.String_unsecure(),isOptional:!1},secretRef:{type:t.String_unsecure(),isOptional:!1},environment:{type:t.String_unsecure(),isOptional:!0},config:{type:t.JSONObject(),isOptional:!1}}}),o=new e({name:`UpdateIntegrationConnectionInput`,fields:{connectionId:{type:t.ID(),isOptional:!1},label:{type:t.String_unsecure(),isOptional:!0},status:{type:t.String_unsecure(),isOptional:!0},ownershipMode:{type:t.String_unsecure(),isOptional:!0},externalAccountId:{type:t.String_unsecure(),isOptional:!0},secretProvider:{type:t.String_unsecure(),isOptional:!0},secretRef:{type:t.String_unsecure(),isOptional:!0},config:{type:t.JSONObject(),isOptional:!0}}}),s=new e({name:`DeleteIntegrationConnectionInput`,fields:{connectionId:{type:t.ID(),isOptional:!1}}}),c=new e({name:`ListIntegrationConnectionsInput`,fields:{tenantId:{type:t.ID(),isOptional:!1},category:{type:t.String_unsecure(),isOptional:!0},status:{type:t.String_unsecure(),isOptional:!0}}}),l=new e({name:`ListIntegrationConnectionsOutput`,fields:{connections:{type:i,isOptional:!1,isArray:!0}}}),u=new e({name:`TestIntegrationConnectionInput`,fields:{connectionId:{type:t.ID(),isOptional:!1}}}),d=new e({name:`TestIntegrationConnectionOutput`,fields:{success:{type:t.Boolean(),isOptional:!1},status:{type:t.String_unsecure(),isOptional:!0},latencyMs:{type:t.Float_unsecure(),isOptional:!0},error:{type:t.String_unsecure(),isOptional:!0},errorCode:{type:t.String_unsecure(),isOptional:!0}}}),f=new e({name:`DeleteIntegrationConnectionOutput`,fields:{success:{type:t.Boolean(),isOptional:!1}}}),p=r({meta:{name:`integrations.connection.create`,version:1,description:`Create a new integration connection for a tenant.`,goal:`Provision a tenant-scoped connection to an external provider.`,context:`Used by Ops or the App Studio to configure external integrations such as Stripe or Qdrant.`,owners:[`platform.integrations`],tags:[`integration`,`connections`],stability:`experimental`},io:{input:a,output:i},policy:{auth:`admin`,policies:[{name:`platform.integration.manage`,version:1}]}}),m=r({meta:{name:`integrations.connection.update`,version:1,description:`Update metadata or credentials for an integration connection.`,goal:`Allow secure rotation of credentials and metadata adjustments.`,context:`Supports rotating API keys, toggling status, or updating labels for tenant integrations.`,owners:[`platform.integrations`],tags:[`integration`,`connections`],stability:`experimental`},io:{input:o,output:i},policy:{auth:`admin`,policies:[{name:`platform.integration.manage`,version:1}]}}),h=r({meta:{name:`integrations.connection.delete`,version:1,description:`Delete an integration connection for a tenant.`,goal:`Safely remove credentials and disable connector usage.`,context:`Ensures connections are de-provisioned when no longer needed or breached.`,owners:[`platform.integrations`],tags:[`integration`,`connections`],stability:`experimental`},io:{input:s,output:f},policy:{auth:`admin`,policies:[{name:`platform.integration.manage`,version:1}]}}),g=n({meta:{name:`integrations.connection.list`,version:1,description:`List integration connections for a tenant.`,goal:`Provide visibility into configured integrations and their status.`,context:`Used by the App Studio and Ops flows to show bindings and health.`,owners:[`platform.integrations`],tags:[`integration`,`connections`],stability:`experimental`},io:{input:c,output:l},policy:{auth:`admin`,policies:[{name:`platform.integration.read`,version:1}]}}),_=r({meta:{name:`integrations.connection.test`,version:1,description:`Run a health check against a configured integration connection.`,goal:`Validate credentials and connectivity for external providers.`,context:`Triggered manually or by background monitors to confirm provider availability.`,owners:[`platform.integrations`],tags:[`integration`,`connections`],stability:`experimental`},io:{input:u,output:d},policy:{auth:`admin`,policies:[{name:`platform.integration.manage`,version:1}]}});export{_,g,h,m,p};
@@ -0,0 +1 @@
1
+ import"./providers/stripe.js";import"./providers/postmark.js";import"./providers/qdrant.js";import"./providers/mistral.js";import"./providers/elevenlabs.js";import"./providers/gmail.js";import"./providers/google-calendar.js";import"./providers/twilio-sms.js";import"./providers/gcs-storage.js";import"./providers/powens.js";import"./providers/impls/mistral-llm.js";import"./providers/impls/mistral-embedding.js";import"./providers/impls/qdrant-vector.js";import"./providers/impls/gmail-inbound.js";import"./providers/impls/gmail-outbound.js";import"./providers/impls/google-calendar.js";import"./providers/impls/elevenlabs-voice.js";import"./providers/impls/gcs-storage.js";import"./providers/impls/stripe-payments.js";import"./providers/impls/postmark-email.js";import"./providers/impls/twilio-sms.js";import"./providers/impls/powens-client.js";import"./providers/impls/powens-openbanking.js";import"./providers/impls/provider-factory.js";import"./secrets/provider.js";import"./secrets/gcp-secret-manager.js";import"./secrets/env-secret-provider.js";import"./secrets/manager.js";import"./runtime.js";import{i as e,n as t,r as n}from"./openbanking/models.js";import{t as r}from"./openbanking/telemetry.js";import{d as i,f as a,p as o}from"./openbanking/contracts/accounts.js";import{d as s,u as c}from"./openbanking/contracts/transactions.js";import{d as l,u}from"./openbanking/contracts/balances.js";import"./openbanking/contracts/index.js";import"./providers/index.js";import"./secrets/index.js";
@@ -0,0 +1 @@
1
+ import{t as e}from"../../../schema/dist/SchemaModel.js";import{l as t}from"../../../schema/dist/ScalarTypeEnum.js";import"../../../schema/dist/index.js";import{n,t as r}from"../../../spec.js";import{n as i}from"../models.js";import{t as a}from"../telemetry.js";const o=new e({name:`OpenBankingListAccountsInput`,description:`Parameters for listing bank accounts through the open banking provider.`,fields:{tenantId:{type:t.ID(),isOptional:!1},userId:{type:t.ID(),isOptional:!1},connectionId:{type:t.ID(),isOptional:!0},includeBalances:{type:t.Boolean(),isOptional:!0},institutionId:{type:t.String_unsecure(),isOptional:!0},cursor:{type:t.String_unsecure(),isOptional:!0},pageSize:{type:t.Int_unsecure(),isOptional:!0}}}),s=new e({name:`OpenBankingListAccountsOutput`,description:`Paginated list of bank accounts available to the tenant and user.`,fields:{accounts:{type:i,isOptional:!1,isArray:!0},nextCursor:{type:t.String_unsecure(),isOptional:!0},hasMore:{type:t.Boolean(),isOptional:!0}}}),c=new e({name:`OpenBankingGetAccountInput`,description:`Parameters for retrieving a specific bank account.`,fields:{tenantId:{type:t.ID(),isOptional:!1},accountId:{type:t.ID(),isOptional:!1},includeBalances:{type:t.Boolean(),isOptional:!0},includeLatestTransactions:{type:t.Boolean(),isOptional:!0}}}),l=new e({name:`OpenBankingSyncAccountsInput`,description:`Command payload to trigger an account synchronisation against the open banking provider.`,fields:{tenantId:{type:t.ID(),isOptional:!1},userId:{type:t.ID(),isOptional:!0},connectionId:{type:t.ID(),isOptional:!1},accountIds:{type:t.ID(),isArray:!0,isOptional:!0},forceFullRefresh:{type:t.Boolean(),isOptional:!0},triggerWorkflows:{type:t.Boolean(),isOptional:!0}}}),u=new e({name:`OpenBankingSyncAccountsOutput`,description:`Result of a bank account synchronisation run.`,fields:{synced:{type:t.Int_unsecure(),isOptional:!1},failed:{type:t.Int_unsecure(),isOptional:!1},errors:{type:t.String_unsecure(),isArray:!0,isOptional:!0},nextSyncSuggestedAt:{type:t.DateTime(),isOptional:!0}}}),d=n({meta:{name:`openbanking.accounts.list`,version:1,description:`List bank accounts available to a tenant/user via Powens Open Banking.`,goal:`Provide downstream workflows with the set of accounts accessible via the configured open banking connection.`,context:`Used by Pocket Family Office dashboards and sync workflows to enumerate bank accounts prior to syncing balances or transactions.`,owners:[`platform.finance`],tags:[`open-banking`,`powens`,`accounts`],stability:`experimental`},io:{input:o,output:s},policy:{auth:`user`}}),f=n({meta:{name:`openbanking.accounts.get`,version:1,description:`Retrieve the canonical bank account record for the given account identifier.`,goal:`Allow user-facing experiences and automations to display up-to-date account metadata.`,context:`Invoked by UI surfaces and workflow automation steps that require detailed metadata for a specific bank account.`,owners:[`platform.finance`],tags:[`open-banking`,`powens`,`accounts`],stability:`experimental`},io:{input:c,output:i},policy:{auth:`user`}}),p=r({meta:{name:`openbanking.accounts.sync`,version:1,description:`Initiate a synchronisation run to refresh bank account metadata from Powens.`,goal:`Keep canonical bank account records aligned with the external open banking provider.`,context:`Triggered by scheduled workflows or manual operator actions to reconcile account metadata prior to transaction/balance syncs.`,owners:[`platform.finance`],tags:[`open-banking`,`powens`,`accounts`],stability:`experimental`},io:{input:l,output:u},policy:{auth:`admin`},telemetry:{success:{event:{name:a.accountsSynced},properties:({input:e,output:t})=>{let n=e,r=t;return{tenantId:n?.tenantId,connectionId:n?.connectionId,synced:r?.synced,failed:r?.failed}}},failure:{event:{name:a.accountsSyncFailed},properties:({input:e,error:t})=>{let n=e;return{tenantId:n?.tenantId,connectionId:n?.connectionId,error:t instanceof Error?t.message:String(t??`unknown`)}}}}});export{d,f,p};
@@ -0,0 +1 @@
1
+ import{t as e}from"../../../schema/dist/SchemaModel.js";import{l as t}from"../../../schema/dist/ScalarTypeEnum.js";import"../../../schema/dist/index.js";import{n,t as r}from"../../../spec.js";import{i}from"../models.js";import{t as a}from"../telemetry.js";const o=new e({name:`OpenBankingGetBalancesInput`,description:`Parameters for retrieving bank account balances from the canonical ledger.`,fields:{tenantId:{type:t.ID(),isOptional:!1},accountId:{type:t.ID(),isOptional:!1},balanceTypes:{type:t.String_unsecure(),isArray:!0,isOptional:!0}}}),s=new e({name:`OpenBankingGetBalancesOutput`,description:`Canonical balances for a bank account.`,fields:{balances:{type:i,isOptional:!1,isArray:!0},asOf:{type:t.DateTime(),isOptional:!0}}}),c=new e({name:`OpenBankingRefreshBalancesInput`,description:`Command payload to refresh balances for a bank account via the open banking provider.`,fields:{tenantId:{type:t.ID(),isOptional:!1},accountId:{type:t.ID(),isOptional:!1},connectionId:{type:t.ID(),isOptional:!0},balanceTypes:{type:t.String_unsecure(),isArray:!0,isOptional:!0},forceRefresh:{type:t.Boolean(),isOptional:!0}}}),l=new e({name:`OpenBankingRefreshBalancesOutput`,description:`Result of a balance refresh against the open banking provider.`,fields:{balances:{type:i,isOptional:!1,isArray:!0},refreshedAt:{type:t.DateTime(),isOptional:!1},errors:{type:t.String_unsecure(),isArray:!0,isOptional:!0}}}),u=n({meta:{name:`openbanking.balances.get`,version:1,description:`Retrieve the latest cached balances for a bank account.`,goal:`Expose current and available balances required by dashboards and analytics.`,context:`Used by Pocket Family Office UI surfaces and automation steps that require balance totals prior to generating summaries.`,owners:[`platform.finance`],tags:[`open-banking`,`powens`,`balances`],stability:`experimental`},io:{input:o,output:s},policy:{auth:`user`}}),d=r({meta:{name:`openbanking.balances.refresh`,version:1,description:`Refresh balances for a bank account via the configured open banking provider.`,goal:`Ensure canonical balance records reflect the latest values from Powens.`,context:`Triggered by scheduled workflows before generating summaries or forecasting cashflow.`,owners:[`platform.finance`],tags:[`open-banking`,`powens`,`balances`],stability:`experimental`},io:{input:c,output:l},policy:{auth:`admin`},telemetry:{success:{event:{name:a.balancesRefreshed},properties:({input:e,output:t})=>{let n=e,r=t;return{tenantId:n?.tenantId,accountId:n?.accountId,refreshedAt:r?.refreshedAt,balanceCount:Array.isArray(r?.balances)?r?.balances.length:void 0}}},failure:{event:{name:a.balancesRefreshFailed},properties:({input:e,error:t})=>{let n=e;return{tenantId:n?.tenantId,accountId:n?.accountId,error:t instanceof Error?t.message:String(t??`unknown`)}}}}});export{d,u};
@@ -0,0 +1 @@
1
+ import{d as e,f as t,p as n}from"./accounts.js";import{d as r,u as i}from"./transactions.js";import{d as a,u as o}from"./balances.js";
@@ -0,0 +1 @@
1
+ import{t as e}from"../../../schema/dist/SchemaModel.js";import{l as t}from"../../../schema/dist/ScalarTypeEnum.js";import"../../../schema/dist/index.js";import{n,t as r}from"../../../spec.js";import{r as i}from"../models.js";import{t as a}from"../telemetry.js";const o=new e({name:`OpenBankingListTransactionsInput`,description:`Parameters for listing bank transactions from the canonical ledger.`,fields:{tenantId:{type:t.ID(),isOptional:!1},accountId:{type:t.ID(),isOptional:!1},from:{type:t.DateTime(),isOptional:!0},to:{type:t.DateTime(),isOptional:!0},cursor:{type:t.String_unsecure(),isOptional:!0},pageSize:{type:t.Int_unsecure(),isOptional:!0},direction:{type:t.String_unsecure(),isOptional:!0},minimumAmount:{type:t.Float_unsecure(),isOptional:!0},maximumAmount:{type:t.Float_unsecure(),isOptional:!0},category:{type:t.String_unsecure(),isOptional:!0}}}),s=new e({name:`OpenBankingListTransactionsOutput`,description:`Paginated list of transactions for a bank account.`,fields:{transactions:{type:i,isOptional:!1,isArray:!0},nextCursor:{type:t.String_unsecure(),isOptional:!0},hasMore:{type:t.Boolean(),isOptional:!0}}}),c=new e({name:`OpenBankingSyncTransactionsInput`,description:`Command payload to synchronise transactions from the open banking provider into the canonical ledger.`,fields:{tenantId:{type:t.ID(),isOptional:!1},accountId:{type:t.ID(),isOptional:!1},from:{type:t.DateTime(),isOptional:!0},to:{type:t.DateTime(),isOptional:!0},connectionId:{type:t.ID(),isOptional:!0},includePending:{type:t.Boolean(),isOptional:!0},backfillDays:{type:t.Int_unsecure(),isOptional:!0}}}),l=new e({name:`OpenBankingSyncTransactionsOutput`,description:`Result of a transaction synchronisation run.`,fields:{synced:{type:t.Int_unsecure(),isOptional:!1},failed:{type:t.Int_unsecure(),isOptional:!1},earliestSyncedAt:{type:t.DateTime(),isOptional:!0},latestSyncedAt:{type:t.DateTime(),isOptional:!0},nextSinceToken:{type:t.String_unsecure(),isOptional:!0},errors:{type:t.String_unsecure(),isArray:!0,isOptional:!0}}}),u=n({meta:{name:`openbanking.transactions.list`,version:1,description:`List bank transactions that have been normalised into the canonical ledger.`,goal:`Allow downstream analytics and UI surfaces to page through canonical bank transactions.`,context:`Used by Pocket Family Office dashboards, reconciliation workflows, and analytics data views.`,owners:[`platform.finance`],tags:[`open-banking`,`powens`,`transactions`],stability:`experimental`},io:{input:o,output:s},policy:{auth:`user`}}),d=r({meta:{name:`openbanking.transactions.sync`,version:1,description:`Synchronise transactions for a bank account by calling the configured open banking provider.`,goal:`Ensure the canonical transaction ledger stays aligned with the external provider.`,context:`Triggered by scheduled workflows or on-demand actions when activity is expected on an account.`,owners:[`platform.finance`],tags:[`open-banking`,`powens`,`transactions`],stability:`experimental`},io:{input:c,output:l},policy:{auth:`admin`},telemetry:{success:{event:{name:a.transactionsSynced},properties:({input:e,output:t})=>{let n=e,r=t;return{tenantId:n?.tenantId,accountId:n?.accountId,synced:r?.synced,failed:r?.failed,earliestSyncedAt:r?.earliestSyncedAt,latestSyncedAt:r?.latestSyncedAt}}},failure:{event:{name:a.transactionsSyncFailed},properties:({input:e,error:t})=>{let n=e;return{tenantId:n?.tenantId,accountId:n?.accountId,error:t instanceof Error?t.message:String(t??`unknown`)}}}}});export{d,u};
@@ -0,0 +1 @@
1
+ import{t as e}from"../../schema/dist/SchemaModel.js";import{l as t}from"../../schema/dist/ScalarTypeEnum.js";import"../../schema/dist/index.js";const n=new e({name:`BankAccountRecord`,description:`Canonical representation of a bank account synced from an open banking provider.`,fields:{id:{type:t.ID(),isOptional:!1},tenantId:{type:t.ID(),isOptional:!1},userId:{type:t.ID(),isOptional:!1},connectionId:{type:t.ID(),isOptional:!1},externalId:{type:t.NonEmptyString(),isOptional:!1},institutionId:{type:t.NonEmptyString(),isOptional:!1},institutionName:{type:t.NonEmptyString(),isOptional:!1},institutionLogoUrl:{type:t.URL(),isOptional:!0},iban:{type:t.String_unsecure(),isOptional:!0},bic:{type:t.String_unsecure(),isOptional:!0},accountType:{type:t.NonEmptyString(),isOptional:!1},currency:{type:t.Currency(),isOptional:!1},displayName:{type:t.NonEmptyString(),isOptional:!1},accountNumberMasked:{type:t.String_unsecure(),isOptional:!0},productCode:{type:t.String_unsecure(),isOptional:!0},balance:{type:t.Float_unsecure(),isOptional:!0},availableBalance:{type:t.Float_unsecure(),isOptional:!0},lastSyncedAt:{type:t.DateTime(),isOptional:!1},createdAt:{type:t.DateTime(),isOptional:!1},updatedAt:{type:t.DateTime(),isOptional:!1},metadata:{type:t.JSONObject(),isOptional:!0}}}),r=new e({name:`BankTransactionRecord`,description:`Canonical transaction entry mapped from Powens into the open banking ledger.`,fields:{id:{type:t.ID(),isOptional:!1},accountId:{type:t.ID(),isOptional:!1},tenantId:{type:t.ID(),isOptional:!1},connectionId:{type:t.ID(),isOptional:!1},externalId:{type:t.NonEmptyString(),isOptional:!1},amount:{type:t.Float_unsecure(),isOptional:!1},currency:{type:t.Currency(),isOptional:!1},date:{type:t.DateTime(),isOptional:!1},bookingDate:{type:t.DateTime(),isOptional:!0},valueDate:{type:t.DateTime(),isOptional:!0},description:{type:t.String_unsecure(),isOptional:!0},counterpartyName:{type:t.String_unsecure(),isOptional:!0},counterpartyAccount:{type:t.String_unsecure(),isOptional:!0},merchantCategoryCode:{type:t.String_unsecure(),isOptional:!0},rawCategory:{type:t.String_unsecure(),isOptional:!0},standardizedCategory:{type:t.String_unsecure(),isOptional:!0},transactionType:{type:t.NonEmptyString(),isOptional:!1},status:{type:t.NonEmptyString(),isOptional:!1},runningBalance:{type:t.Float_unsecure(),isOptional:!0},metadata:{type:t.JSONObject(),isOptional:!0},createdAt:{type:t.DateTime(),isOptional:!1},updatedAt:{type:t.DateTime(),isOptional:!1}}}),i=new e({name:`AccountBalanceRecord`,description:`Canonical balance snapshot computed from Powens balance payloads.`,fields:{id:{type:t.ID(),isOptional:!1},accountId:{type:t.ID(),isOptional:!1},tenantId:{type:t.ID(),isOptional:!1},connectionId:{type:t.ID(),isOptional:!1},balanceType:{type:t.NonEmptyString(),isOptional:!1},currentBalance:{type:t.Float_unsecure(),isOptional:!1},availableBalance:{type:t.Float_unsecure(),isOptional:!0},currency:{type:t.Currency(),isOptional:!1},lastUpdatedAt:{type:t.DateTime(),isOptional:!1},createdAt:{type:t.DateTime(),isOptional:!1},metadata:{type:t.JSONObject(),isOptional:!0}}});export{i,n,r};
@@ -0,0 +1 @@
1
+ const e={accountsSynced:`openbanking.accounts.synced`,accountsSyncFailed:`openbanking.accounts.sync_failed`,transactionsSynced:`openbanking.transactions.synced`,transactionsSyncFailed:`openbanking.transactions.sync_failed`,balancesRefreshed:`openbanking.balances.refreshed`,balancesRefreshFailed:`openbanking.balances.refresh_failed`,overviewGenerated:`openbanking.overview.generated`};export{e as t};
@@ -0,0 +1 @@
1
+ import{e}from"../../ownership.js";e.Beta;
@@ -0,0 +1 @@
1
+ import{e}from"../../ownership.js";e.Beta;
@@ -0,0 +1 @@
1
+ import{e}from"../../ownership.js";e.Beta;
@@ -0,0 +1 @@
1
+ import{e}from"../../ownership.js";e.Beta;
@@ -0,0 +1 @@
1
+ import"@elevenlabs/elevenlabs-js";
@@ -0,0 +1 @@
1
+ import"@google-cloud/storage";
@@ -0,0 +1 @@
1
+ import"./mistral-llm.js";import"./mistral-embedding.js";import"./qdrant-vector.js";import"./gmail-inbound.js";import"./gmail-outbound.js";import"./google-calendar.js";import"./elevenlabs-voice.js";import"./gcs-storage.js";import"./stripe-payments.js";import"./postmark-email.js";import"./twilio-sms.js";import"./powens-client.js";import"./powens-openbanking.js";import"./provider-factory.js";
@@ -0,0 +1 @@
1
+ import"@mistralai/mistralai";
@@ -0,0 +1 @@
1
+ import"@mistralai/mistralai";
@@ -0,0 +1 @@
1
+ import"./powens-client.js";
@@ -0,0 +1 @@
1
+ import"./mistral-llm.js";import"./mistral-embedding.js";import"./qdrant-vector.js";import"./elevenlabs-voice.js";import"./gcs-storage.js";import"./stripe-payments.js";import"./postmark-email.js";import"./twilio-sms.js";import"./powens-openbanking.js";import"node:buffer";
@@ -0,0 +1 @@
1
+ import"@qdrant/js-client-rest";
@@ -0,0 +1 @@
1
+ import"./stripe.js";import"./postmark.js";import"./qdrant.js";import"./mistral.js";import"./elevenlabs.js";import"./gmail.js";import"./google-calendar.js";import"./twilio-sms.js";import"./gcs-storage.js";import"./powens.js";import"./impls/mistral-llm.js";import"./impls/mistral-embedding.js";import"./impls/qdrant-vector.js";import"./impls/gmail-inbound.js";import"./impls/gmail-outbound.js";import"./impls/google-calendar.js";import"./impls/elevenlabs-voice.js";import"./impls/gcs-storage.js";import"./impls/stripe-payments.js";import"./impls/postmark-email.js";import"./impls/twilio-sms.js";import"./impls/powens-client.js";import"./impls/powens-openbanking.js";import"./impls/provider-factory.js";import"./impls/index.js";
@@ -0,0 +1 @@
1
+ import{e}from"../../ownership.js";e.Experimental;
@@ -0,0 +1 @@
1
+ import{e}from"../../ownership.js";e.Stable;
@@ -0,0 +1 @@
1
+ import{e}from"../../ownership.js";e.Experimental;
@@ -0,0 +1 @@
1
+ import{e}from"../../ownership.js";e.Experimental;
@@ -0,0 +1 @@
1
+ import{e}from"../../ownership.js";e.Stable;
@@ -0,0 +1 @@
1
+ import{e}from"../../ownership.js";e.Stable;
@@ -0,0 +1 @@
1
+ import"node:perf_hooks";
@@ -0,0 +1 @@
1
+ import"./provider.js";
@@ -0,0 +1 @@
1
+ import"./provider.js";import"@google-cloud/secret-manager";
@@ -0,0 +1 @@
1
+ import"./provider.js";import"./gcp-secret-manager.js";import"./env-secret-provider.js";import"./manager.js";
@@ -0,0 +1 @@
1
+ import"./provider.js";
@@ -0,0 +1 @@
1
+ import"node:buffer";
@@ -0,0 +1 @@
1
+ import"zod";
@@ -0,0 +1 @@
1
+ import{t as e}from"../schema/dist/SchemaModel.js";import{l as t}from"../schema/dist/ScalarTypeEnum.js";import"../schema/dist/index.js";import{n,t as r}from"../spec.js";const i=new e({name:`KnowledgeSyncSchedule`,fields:{enabled:{type:t.Boolean(),isOptional:!1},cron:{type:t.String_unsecure(),isOptional:!0},intervalMs:{type:t.Int_unsecure(),isOptional:!0}}}),a=new e({name:`KnowledgeSourceRecord`,fields:{id:{type:t.ID(),isOptional:!1},tenantId:{type:t.ID(),isOptional:!1},spaceKey:{type:t.NonEmptyString(),isOptional:!1},spaceVersion:{type:t.Int_unsecure(),isOptional:!1},label:{type:t.String_unsecure(),isOptional:!1},sourceType:{type:t.String_unsecure(),isOptional:!1},syncSchedule:{type:i,isOptional:!0},lastSyncStatus:{type:t.String_unsecure(),isOptional:!0},lastSyncAt:{type:t.DateTime(),isOptional:!0},itemsProcessed:{type:t.Int_unsecure(),isOptional:!0},createdAt:{type:t.DateTime(),isOptional:!0},updatedAt:{type:t.DateTime(),isOptional:!0}}}),o=new e({name:`CreateKnowledgeSourceInput`,fields:{tenantId:{type:t.ID(),isOptional:!1},spaceKey:{type:t.NonEmptyString(),isOptional:!1},spaceVersion:{type:t.Int_unsecure(),isOptional:!1},label:{type:t.String_unsecure(),isOptional:!1},sourceType:{type:t.NonEmptyString(),isOptional:!1},config:{type:t.JSONObject(),isOptional:!1},syncSchedule:{type:i,isOptional:!0}}}),s=new e({name:`UpdateKnowledgeSourceInput`,fields:{sourceId:{type:t.ID(),isOptional:!1},label:{type:t.String_unsecure(),isOptional:!0},config:{type:t.JSONObject(),isOptional:!0},syncSchedule:{type:i,isOptional:!0}}}),c=new e({name:`DeleteKnowledgeSourceInput`,fields:{sourceId:{type:t.ID(),isOptional:!1}}}),l=new e({name:`DeleteKnowledgeSourceOutput`,fields:{success:{type:t.Boolean(),isOptional:!1}}}),u=new e({name:`ListKnowledgeSourcesInput`,fields:{tenantId:{type:t.ID(),isOptional:!1},spaceKey:{type:t.NonEmptyString(),isOptional:!0}}}),d=new e({name:`ListKnowledgeSourcesOutput`,fields:{sources:{type:a,isOptional:!1,isArray:!0}}}),f=new e({name:`TriggerKnowledgeSyncInput`,fields:{sourceId:{type:t.ID(),isOptional:!1}}}),p=new e({name:`TriggerKnowledgeSyncOutput`,fields:{success:{type:t.Boolean(),isOptional:!1},itemsProcessed:{type:t.Int_unsecure(),isOptional:!0},error:{type:t.String_unsecure(),isOptional:!0}}}),m=r({meta:{name:`knowledge.source.create`,version:1,description:`Create a knowledge source binding for a tenant.`,goal:`Onboard a new knowledge ingestion source such as Notion or uploads.`,context:`Used by Ops and App Studio to configure knowledge ingestion per tenant and space.`,owners:[`platform.knowledge`],tags:[`knowledge`,`sources`],stability:`experimental`},io:{input:o,output:a},policy:{auth:`admin`,policies:[{name:`platform.knowledge.manage`,version:1}]}}),h=r({meta:{name:`knowledge.source.update`,version:1,description:`Update metadata or configuration for a knowledge source.`,goal:`Allow rotation of credentials, sync schedules, and labels.`,context:`Supports editing how a tenant ingests knowledge (e.g., toggling sync cadence).`,owners:[`platform.knowledge`],tags:[`knowledge`,`sources`],stability:`experimental`},io:{input:s,output:a},policy:{auth:`admin`,policies:[{name:`platform.knowledge.manage`,version:1}]}}),g=r({meta:{name:`knowledge.source.delete`,version:1,description:`Delete a knowledge source binding for a tenant.`,goal:`Remove obsolete or compromised knowledge ingestion paths.`,context:`Ensures ephemeral or external sources can be removed cleanly without leaving residual bindings.`,owners:[`platform.knowledge`],tags:[`knowledge`,`sources`],stability:`experimental`},io:{input:c,output:l},policy:{auth:`admin`,policies:[{name:`platform.knowledge.manage`,version:1}]}}),_=n({meta:{name:`knowledge.source.list`,version:1,description:`List knowledge sources configured for a tenant.`,goal:`Provide visibility into knowledge ingest configuration and schedules.`,context:`Used by App Studio and Ops flows to surface knowledge sources and their health.`,owners:[`platform.knowledge`],tags:[`knowledge`,`sources`],stability:`experimental`},io:{input:u,output:d},policy:{auth:`admin`,policies:[{name:`platform.knowledge.read`,version:1}]}}),v=r({meta:{name:`knowledge.source.triggerSync`,version:1,description:`Trigger an immediate sync for a knowledge source.`,goal:`Support manual or automated sync retries for knowledge ingestion.`,context:`Invoked by Ops tooling or monitors when knowledge content must be refreshed or reprocessed.`,owners:[`platform.knowledge`],tags:[`knowledge`,`sources`],stability:`experimental`},io:{input:f,output:p},policy:{auth:`admin`,policies:[{name:`platform.knowledge.manage`,version:1}]}});export{_,g,h,m,v};
@@ -0,0 +1 @@
1
+ import"./spaces/product-canon.js";import"./spaces/support-faq.js";import"./spaces/email-threads.js";import"./spaces/uploaded-docs.js";import"./spaces/financial-docs.js";import"./spaces/financial-overview.js";import"./spaces/index.js";
@@ -0,0 +1 @@
1
+ import{e}from"../../ownership.js";e.Beta;
@@ -0,0 +1 @@
1
+ import{e}from"../../ownership.js";e.Beta;
@@ -0,0 +1 @@
1
+ import{e}from"../../ownership.js";e.Experimental;
@@ -0,0 +1 @@
1
+ import"./product-canon.js";import"./support-faq.js";import"./email-threads.js";import"./uploaded-docs.js";import"./financial-docs.js";import"./financial-overview.js";
@@ -0,0 +1 @@
1
+ import{e}from"../../ownership.js";e.Stable;
@@ -0,0 +1 @@
1
+ import{e}from"../../ownership.js";e.Beta;
@@ -0,0 +1 @@
1
+ import{e}from"../../ownership.js";e.Beta;