@openhi/constructs 0.0.160 → 0.0.161

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 (121) hide show
  1. package/lib/{chunk-HQ67J7BP.mjs → chunk-5S6VFBLT.mjs} +12 -70
  2. package/lib/chunk-5S6VFBLT.mjs.map +1 -0
  3. package/lib/{chunk-MVQWAIMC.mjs → chunk-6BB4CRSS.mjs} +3 -312
  4. package/lib/chunk-6BB4CRSS.mjs.map +1 -0
  5. package/lib/{chunk-WPCBVDFZ.mjs → chunk-76UM2LQ5.mjs} +2 -2
  6. package/lib/{chunk-QFHYTCVY.mjs → chunk-7TRO2STL.mjs} +7 -7
  7. package/lib/chunk-BUAYVN3C.mjs +87 -0
  8. package/lib/chunk-BUAYVN3C.mjs.map +1 -0
  9. package/lib/{chunk-23PUSHBV.mjs → chunk-D2Y6DDOC.mjs} +2 -2
  10. package/lib/chunk-DWSWCUZR.mjs +123 -0
  11. package/lib/chunk-DWSWCUZR.mjs.map +1 -0
  12. package/lib/{chunk-VZCPGQXA.mjs → chunk-EUIP2U5F.mjs} +69 -1
  13. package/lib/{chunk-VZCPGQXA.mjs.map → chunk-EUIP2U5F.mjs.map} +1 -1
  14. package/lib/chunk-GJTPXJKD.mjs +46 -0
  15. package/lib/chunk-GJTPXJKD.mjs.map +1 -0
  16. package/lib/chunk-I6LUPJUY.mjs +61 -0
  17. package/lib/chunk-I6LUPJUY.mjs.map +1 -0
  18. package/lib/{chunk-KR2Y2CVQ.mjs → chunk-KA3OMP3X.mjs} +2 -2
  19. package/lib/{chunk-ZM4GDHHC.mjs → chunk-KMEWULMX.mjs} +51 -3
  20. package/lib/chunk-KMEWULMX.mjs.map +1 -0
  21. package/lib/chunk-LKKLO66E.mjs +25 -0
  22. package/lib/chunk-LKKLO66E.mjs.map +1 -0
  23. package/lib/{chunk-CFJDATDK.mjs → chunk-MLFMW5IF.mjs} +43 -9
  24. package/lib/chunk-MLFMW5IF.mjs.map +1 -0
  25. package/lib/chunk-O5VQWB6U.mjs +315 -0
  26. package/lib/chunk-O5VQWB6U.mjs.map +1 -0
  27. package/lib/{chunk-7BQHLC7U.mjs → chunk-P3CTZWC2.mjs} +8 -40
  28. package/lib/chunk-P3CTZWC2.mjs.map +1 -0
  29. package/lib/{chunk-EFB5OFM7.mjs → chunk-P3NFCKTZ.mjs} +6 -4
  30. package/lib/{chunk-EFB5OFM7.mjs.map → chunk-P3NFCKTZ.mjs.map} +1 -1
  31. package/lib/{chunk-M7Y3BOQW.mjs → chunk-Q3MKITPY.mjs} +5 -5
  32. package/lib/chunk-Q64MOYJ7.mjs +218 -0
  33. package/lib/chunk-Q64MOYJ7.mjs.map +1 -0
  34. package/lib/chunk-RQKJNMX5.mjs +89 -0
  35. package/lib/chunk-RQKJNMX5.mjs.map +1 -0
  36. package/lib/{chunk-ZWSGM6PZ.mjs → chunk-SD7J3N3C.mjs} +2 -2
  37. package/lib/{chunk-7RZHFI77.mjs → chunk-VESULYQQ.mjs} +2 -2
  38. package/lib/{chunk-AOSEKL7U.mjs → chunk-WOTU36P3.mjs} +6 -103
  39. package/lib/chunk-WOTU36P3.mjs.map +1 -0
  40. package/lib/{chunk-X5E4YJGZ.mjs → chunk-YPTJJ35S.mjs} +2 -2
  41. package/lib/counter-apply-operation-DZM3MIDm.d.mts +63 -0
  42. package/lib/counter-apply-operation-DZM3MIDm.d.ts +63 -0
  43. package/lib/counter-maintenance.handler.d.mts +38 -0
  44. package/lib/counter-maintenance.handler.d.ts +38 -0
  45. package/lib/counter-maintenance.handler.js +2885 -0
  46. package/lib/counter-maintenance.handler.js.map +1 -0
  47. package/lib/counter-maintenance.handler.mjs +180 -0
  48. package/lib/counter-maintenance.handler.mjs.map +1 -0
  49. package/lib/counter-reconciliation.handler.d.mts +116 -0
  50. package/lib/counter-reconciliation.handler.d.ts +116 -0
  51. package/lib/counter-reconciliation.handler.js +3324 -0
  52. package/lib/counter-reconciliation.handler.js.map +1 -0
  53. package/lib/counter-reconciliation.handler.mjs +295 -0
  54. package/lib/counter-reconciliation.handler.mjs.map +1 -0
  55. package/lib/data-store-postgres-replication.handler.js +50 -2
  56. package/lib/data-store-postgres-replication.handler.js.map +1 -1
  57. package/lib/data-store-postgres-replication.handler.mjs +2 -2
  58. package/lib/delete-chunk.handler.js +118 -2
  59. package/lib/delete-chunk.handler.js.map +1 -1
  60. package/lib/delete-chunk.handler.mjs +3 -3
  61. package/lib/finalize.handler.js +50 -2
  62. package/lib/finalize.handler.js.map +1 -1
  63. package/lib/finalize.handler.mjs +4 -4
  64. package/lib/firehose-archive-transform.handler.js +50 -2
  65. package/lib/firehose-archive-transform.handler.js.map +1 -1
  66. package/lib/firehose-archive-transform.handler.mjs +2 -2
  67. package/lib/index.d.mts +140 -2
  68. package/lib/index.d.ts +143 -5
  69. package/lib/index.js +493 -196
  70. package/lib/index.js.map +1 -1
  71. package/lib/index.mjs +360 -193
  72. package/lib/index.mjs.map +1 -1
  73. package/lib/list-chunks.handler.js +118 -2
  74. package/lib/list-chunks.handler.js.map +1 -1
  75. package/lib/list-chunks.handler.mjs +3 -3
  76. package/lib/platform-deploy-bridge.handler.js +50 -2
  77. package/lib/platform-deploy-bridge.handler.js.map +1 -1
  78. package/lib/platform-deploy-bridge.handler.mjs +1 -1
  79. package/lib/pre-token-generation.handler.js +68 -0
  80. package/lib/pre-token-generation.handler.js.map +1 -1
  81. package/lib/pre-token-generation.handler.mjs +9 -5
  82. package/lib/pre-token-generation.handler.mjs.map +1 -1
  83. package/lib/provision-default-workspace.handler.js +883 -0
  84. package/lib/provision-default-workspace.handler.js.map +1 -1
  85. package/lib/provision-default-workspace.handler.mjs +10 -5
  86. package/lib/provision-default-workspace.handler.mjs.map +1 -1
  87. package/lib/rename-finalize.handler.js +50 -2
  88. package/lib/rename-finalize.handler.js.map +1 -1
  89. package/lib/rename-finalize.handler.mjs +2 -2
  90. package/lib/rename-list-targets.handler.js +118 -2
  91. package/lib/rename-list-targets.handler.js.map +1 -1
  92. package/lib/rename-list-targets.handler.mjs +11 -9
  93. package/lib/rename-list-targets.handler.mjs.map +1 -1
  94. package/lib/rename-rewrite-chunk.handler.js +68 -0
  95. package/lib/rename-rewrite-chunk.handler.js.map +1 -1
  96. package/lib/rename-rewrite-chunk.handler.mjs +2 -2
  97. package/lib/rest-api-lambda.handler.js +1454 -251
  98. package/lib/rest-api-lambda.handler.js.map +1 -1
  99. package/lib/rest-api-lambda.handler.mjs +415 -291
  100. package/lib/rest-api-lambda.handler.mjs.map +1 -1
  101. package/lib/seed-demo-data.handler.js +205 -8
  102. package/lib/seed-demo-data.handler.js.map +1 -1
  103. package/lib/seed-demo-data.handler.mjs +10 -7
  104. package/lib/seed-system-data.handler.js +118 -2
  105. package/lib/seed-system-data.handler.js.map +1 -1
  106. package/lib/seed-system-data.handler.mjs +5 -5
  107. package/package.json +1 -1
  108. package/lib/chunk-7BQHLC7U.mjs.map +0 -1
  109. package/lib/chunk-AOSEKL7U.mjs.map +0 -1
  110. package/lib/chunk-CFJDATDK.mjs.map +0 -1
  111. package/lib/chunk-HQ67J7BP.mjs.map +0 -1
  112. package/lib/chunk-MVQWAIMC.mjs.map +0 -1
  113. package/lib/chunk-ZM4GDHHC.mjs.map +0 -1
  114. /package/lib/{chunk-WPCBVDFZ.mjs.map → chunk-76UM2LQ5.mjs.map} +0 -0
  115. /package/lib/{chunk-QFHYTCVY.mjs.map → chunk-7TRO2STL.mjs.map} +0 -0
  116. /package/lib/{chunk-23PUSHBV.mjs.map → chunk-D2Y6DDOC.mjs.map} +0 -0
  117. /package/lib/{chunk-KR2Y2CVQ.mjs.map → chunk-KA3OMP3X.mjs.map} +0 -0
  118. /package/lib/{chunk-M7Y3BOQW.mjs.map → chunk-Q3MKITPY.mjs.map} +0 -0
  119. /package/lib/{chunk-ZWSGM6PZ.mjs.map → chunk-SD7J3N3C.mjs.map} +0 -0
  120. /package/lib/{chunk-7RZHFI77.mjs.map → chunk-VESULYQQ.mjs.map} +0 -0
  121. /package/lib/{chunk-X5E4YJGZ.mjs.map → chunk-YPTJJ35S.mjs.map} +0 -0
package/lib/index.mjs CHANGED
@@ -1,3 +1,11 @@
1
+ import {
2
+ RENAME_CASCADE_CONSUMER_NAME,
3
+ RENAME_CASCADE_DEFAULT_CONCURRENCY,
4
+ RENAME_CASCADE_FAILED_THRESHOLD,
5
+ RENAME_CASCADE_OPS_EVENT_BUS_ENV_VAR,
6
+ RENAME_CASCADE_SLOW_THRESHOLD_SECONDS,
7
+ import_workflows as import_workflows5
8
+ } from "./chunk-D2Y6DDOC.mjs";
1
9
  import {
2
10
  DATA_STORE_CHANGE_DETAIL_MAX_UTF8_BYTES,
3
11
  DATA_STORE_CHANGE_DETAIL_TYPE,
@@ -7,8 +15,8 @@ import {
7
15
  SEED_SYSTEM_DATA_ACTOR_SYSTEM,
8
16
  SEED_SYSTEM_DATA_CONSUMER_NAME,
9
17
  SEED_SYSTEM_DATA_CONTROL_BUS_ENV_VAR,
10
- import_workflows as import_workflows2
11
- } from "./chunk-WPCBVDFZ.mjs";
18
+ import_workflows as import_workflows3
19
+ } from "./chunk-76UM2LQ5.mjs";
12
20
  import {
13
21
  BLOCK_OCCURRENCES_PER_TEMPLATE,
14
22
  BLOCK_OCCURRENCE_WEEKS_FUTURE,
@@ -124,7 +132,7 @@ import {
124
132
  findOnSiteDemoHomeHealthPatientProvider,
125
133
  findOnSiteDemoHomeHealthPatientVisitCadenceDays,
126
134
  homeHealthEligibleDoctors,
127
- import_workflows,
135
+ import_workflows as import_workflows2,
128
136
  onSiteDemoBilledEncounterIds,
129
137
  onSiteDemoClaimIds,
130
138
  onSiteDemoDmeSupplierIds,
@@ -146,23 +154,20 @@ import {
146
154
  practitionerCredentialingForDoctor,
147
155
  practitionerCredentialingForState,
148
156
  woundConditionIdForPatient
149
- } from "./chunk-QFHYTCVY.mjs";
157
+ } from "./chunk-7TRO2STL.mjs";
158
+ import {
159
+ COUNTER_MAINTENANCE_CONSUMER_NAME,
160
+ COUNTER_MAINTENANCE_DETAIL_TYPES,
161
+ import_workflows
162
+ } from "./chunk-LKKLO66E.mjs";
150
163
  import {
151
164
  OWNING_DELETE_CASCADE_CONSUMER_NAME,
152
165
  OWNING_DELETE_CASCADE_DEFAULT_CONCURRENCY,
153
166
  OWNING_DELETE_CASCADE_STUCK_THRESHOLD_MINUTES,
154
167
  OWNING_DELETE_OPS_EVENT_BUS_ENV_VAR,
155
- import_workflows as import_workflows3
156
- } from "./chunk-7RZHFI77.mjs";
157
- import {
158
- RENAME_CASCADE_CONSUMER_NAME,
159
- RENAME_CASCADE_DEFAULT_CONCURRENCY,
160
- RENAME_CASCADE_FAILED_THRESHOLD,
161
- RENAME_CASCADE_OPS_EVENT_BUS_ENV_VAR,
162
- RENAME_CASCADE_SLOW_THRESHOLD_SECONDS,
163
168
  import_workflows as import_workflows4
164
- } from "./chunk-23PUSHBV.mjs";
165
- import "./chunk-EFB5OFM7.mjs";
169
+ } from "./chunk-VESULYQQ.mjs";
170
+ import "./chunk-P3NFCKTZ.mjs";
166
171
  import {
167
172
  PROVISION_DEFAULT_WORKSPACE_DETAIL_TYPE,
168
173
  USER_ONBOARDING_EVENT_SOURCE,
@@ -177,18 +182,21 @@ import {
177
182
  OPENHI_TAG_KEY_PREFIX_ENV_VAR,
178
183
  PLATFORM_DEPLOY_BRIDGE_ACTOR_SYSTEM
179
184
  } from "./chunk-SVXLZCF7.mjs";
180
- import {
181
- require_lib
182
- } from "./chunk-ZM4GDHHC.mjs";
183
185
  import {
184
186
  PLATFORM_SCOPE_TENANT_ID
185
- } from "./chunk-CFJDATDK.mjs";
186
- import "./chunk-HQ67J7BP.mjs";
187
+ } from "./chunk-MLFMW5IF.mjs";
188
+ import "./chunk-BUAYVN3C.mjs";
189
+ import "./chunk-5S6VFBLT.mjs";
190
+ import "./chunk-I6LUPJUY.mjs";
187
191
  import "./chunk-QJDHVMKT.mjs";
188
- import "./chunk-MVQWAIMC.mjs";
192
+ import "./chunk-6BB4CRSS.mjs";
193
+ import "./chunk-O5VQWB6U.mjs";
189
194
  import "./chunk-FYHBHHWK.mjs";
190
- import "./chunk-VZCPGQXA.mjs";
195
+ import "./chunk-EUIP2U5F.mjs";
191
196
  import "./chunk-TRY7JGWO.mjs";
197
+ import {
198
+ require_lib
199
+ } from "./chunk-KMEWULMX.mjs";
192
200
  import {
193
201
  __commonJS,
194
202
  __toESM
@@ -1174,7 +1182,7 @@ var DynamoDbDataStore = class extends Table {
1174
1182
  };
1175
1183
 
1176
1184
  // src/components/dynamodb/workflow-dedup-table.ts
1177
- var import_workflows5 = __toESM(require_lib());
1185
+ var import_workflows6 = __toESM(require_lib());
1178
1186
  import { Annotations } from "aws-cdk-lib";
1179
1187
  import { AttributeType as AttributeType2, BillingMode as BillingMode2, Table as Table2 } from "aws-cdk-lib/aws-dynamodb";
1180
1188
  import { Effect, PolicyStatement } from "aws-cdk-lib/aws-iam";
@@ -1250,7 +1258,7 @@ var _WorkflowDedupTable = class _WorkflowDedupTable extends Construct5 {
1250
1258
  _WorkflowDedupTable.assertConsumerNameStatic(consumerName);
1251
1259
  const tableName = _WorkflowDedupTable.tableNameFromLookup(scope);
1252
1260
  const tableArn = _WorkflowDedupTable.tableArnFromLookup(scope);
1253
- fn.addEnvironment(import_workflows5.WORKFLOW_DEDUP_TABLE_NAME_ENV_VAR, tableName);
1261
+ fn.addEnvironment(import_workflows6.WORKFLOW_DEDUP_TABLE_NAME_ENV_VAR, tableName);
1254
1262
  if (options.defaultTtlSeconds !== void 0) {
1255
1263
  fn.addEnvironment(
1256
1264
  "OPENHI_WORKFLOW_DEDUP_DEFAULT_TTL_SECONDS",
@@ -1286,9 +1294,9 @@ var _WorkflowDedupTable = class _WorkflowDedupTable extends Construct5 {
1286
1294
  "consumerName must be non-empty."
1287
1295
  );
1288
1296
  }
1289
- if (consumerName.length > import_workflows5.WORKFLOW_DEDUP_MAX_CONSUMER_NAME_LENGTH) {
1297
+ if (consumerName.length > import_workflows6.WORKFLOW_DEDUP_MAX_CONSUMER_NAME_LENGTH) {
1290
1298
  throw new WorkflowDedupConsumerNameInvalidError(
1291
- `consumerName must be at most ${import_workflows5.WORKFLOW_DEDUP_MAX_CONSUMER_NAME_LENGTH} chars; got ${consumerName.length}.`
1299
+ `consumerName must be at most ${import_workflows6.WORKFLOW_DEDUP_MAX_CONSUMER_NAME_LENGTH} chars; got ${consumerName.length}.`
1292
1300
  );
1293
1301
  }
1294
1302
  if (/\s/.test(consumerName)) {
@@ -1311,7 +1319,7 @@ var _WorkflowDedupTable = class _WorkflowDedupTable extends Construct5 {
1311
1319
  );
1312
1320
  }
1313
1321
  this.registeredConsumers.add(consumerName);
1314
- fn.addEnvironment(import_workflows5.WORKFLOW_DEDUP_TABLE_NAME_ENV_VAR, this.table.tableName);
1322
+ fn.addEnvironment(import_workflows6.WORKFLOW_DEDUP_TABLE_NAME_ENV_VAR, this.table.tableName);
1315
1323
  if (options.defaultTtlSeconds !== void 0) {
1316
1324
  fn.addEnvironment(
1317
1325
  "OPENHI_WORKFLOW_DEDUP_DEFAULT_TTL_SECONDS",
@@ -2393,17 +2401,16 @@ var _OpenHiGlobalService = class _OpenHiGlobalService extends OpenHiService {
2393
2401
  _OpenHiGlobalService.SERVICE_TYPE = "global";
2394
2402
  var OpenHiGlobalService = _OpenHiGlobalService;
2395
2403
 
2396
- // src/workflows/control-plane/seed-demo-data/seed-demo-data-lambda.ts
2404
+ // src/workflows/control-plane/counter-maintenance/counter-maintenance-lambda.ts
2397
2405
  import fs8 from "fs";
2398
2406
  import path8 from "path";
2399
- import { Duration as Duration7, Stack as Stack5 } from "aws-cdk-lib";
2407
+ import { Duration as Duration7 } from "aws-cdk-lib";
2400
2408
  import { Rule as Rule2 } from "aws-cdk-lib/aws-events";
2401
2409
  import { LambdaFunction as LambdaFunction2 } from "aws-cdk-lib/aws-events-targets";
2402
- import { Effect as Effect3, PolicyStatement as PolicyStatement3 } from "aws-cdk-lib/aws-iam";
2403
2410
  import { Runtime as Runtime8 } from "aws-cdk-lib/aws-lambda";
2404
2411
  import { NodejsFunction as NodejsFunction8 } from "aws-cdk-lib/aws-lambda-nodejs";
2405
2412
  import { Construct as Construct13 } from "constructs";
2406
- var HANDLER_NAME7 = "seed-demo-data.handler.js";
2413
+ var HANDLER_NAME7 = "counter-maintenance.handler.js";
2407
2414
  function resolveHandlerEntry7(dirname) {
2408
2415
  const sameDir = path8.join(dirname, HANDLER_NAME7);
2409
2416
  if (fs8.existsSync(sameDir)) {
@@ -2411,14 +2418,123 @@ function resolveHandlerEntry7(dirname) {
2411
2418
  }
2412
2419
  return path8.join(dirname, "..", "..", "..", "..", "lib", HANDLER_NAME7);
2413
2420
  }
2414
- var SeedDemoDataLambda = class extends Construct13 {
2421
+ var CounterMaintenanceLambda = class extends Construct13 {
2415
2422
  constructor(scope, props) {
2416
- super(scope, "seed-demo-data-lambda");
2423
+ super(scope, "counter-maintenance-lambda");
2417
2424
  this.lambda = new NodejsFunction8(this, "handler", {
2418
2425
  entry: resolveHandlerEntry7(__dirname),
2419
2426
  runtime: Runtime8.NODEJS_LATEST,
2427
+ memorySize: 256,
2428
+ timeout: Duration7.minutes(1),
2429
+ environment: {
2430
+ DYNAMO_TABLE_NAME: props.dataStoreTable.tableName
2431
+ }
2432
+ });
2433
+ props.dataStoreTable.grant(this.lambda, "dynamodb:UpdateItem");
2434
+ this.rule = new Rule2(this, "rule", {
2435
+ eventBus: props.controlEventBus,
2436
+ eventPattern: {
2437
+ source: [import_workflows.ControlPlaneMembershipCreatedV1.source],
2438
+ detailType: [...COUNTER_MAINTENANCE_DETAIL_TYPES]
2439
+ },
2440
+ targets: [
2441
+ new LambdaFunction2(this.lambda, {
2442
+ retryAttempts: 2,
2443
+ maxEventAge: Duration7.hours(2)
2444
+ })
2445
+ ]
2446
+ });
2447
+ }
2448
+ };
2449
+
2450
+ // src/workflows/control-plane/counter-maintenance/counter-maintenance-workflow.ts
2451
+ import { Construct as Construct14 } from "constructs";
2452
+ var CounterMaintenanceWorkflow = class extends Construct14 {
2453
+ constructor(scope, props) {
2454
+ super(scope, "counter-maintenance-workflow");
2455
+ this.counterMaintenance = new CounterMaintenanceLambda(this, {
2456
+ controlEventBus: props.controlEventBus,
2457
+ dataStoreTable: props.dataStoreTable
2458
+ });
2459
+ WorkflowDedupTable.grantConsumerFromLookup(
2460
+ this,
2461
+ this.counterMaintenance.lambda,
2462
+ COUNTER_MAINTENANCE_CONSUMER_NAME
2463
+ );
2464
+ }
2465
+ };
2466
+
2467
+ // src/workflows/control-plane/counter-reconciliation/counter-reconciliation-lambda.ts
2468
+ import fs9 from "fs";
2469
+ import path9 from "path";
2470
+ import { Duration as Duration8 } from "aws-cdk-lib";
2471
+ import { Runtime as Runtime9 } from "aws-cdk-lib/aws-lambda";
2472
+ import { NodejsFunction as NodejsFunction9 } from "aws-cdk-lib/aws-lambda-nodejs";
2473
+ import { Construct as Construct15 } from "constructs";
2474
+ var HANDLER_NAME8 = "counter-reconciliation.handler.js";
2475
+ function resolveHandlerEntry8(dirname) {
2476
+ const sameDir = path9.join(dirname, HANDLER_NAME8);
2477
+ if (fs9.existsSync(sameDir)) {
2478
+ return sameDir;
2479
+ }
2480
+ return path9.join(dirname, "..", "..", "..", "..", "lib", HANDLER_NAME8);
2481
+ }
2482
+ var CounterReconciliationLambda = class extends Construct15 {
2483
+ constructor(scope, props) {
2484
+ super(scope, "counter-reconciliation-lambda");
2485
+ this.lambda = new NodejsFunction9(this, "handler", {
2486
+ entry: resolveHandlerEntry8(__dirname),
2487
+ runtime: Runtime9.NODEJS_LATEST,
2420
2488
  memorySize: 512,
2421
- timeout: Duration7.minutes(2),
2489
+ // A full-table sweep over every Tenant / Workspace / User is
2490
+ // heavier than the single-event counter-maintenance consumer, so
2491
+ // the on-demand job gets a longer ceiling.
2492
+ timeout: Duration8.minutes(15),
2493
+ environment: {
2494
+ DYNAMO_TABLE_NAME: props.dataStoreTable.tableName
2495
+ }
2496
+ });
2497
+ props.dataStoreTable.grantReadWriteData(this.lambda);
2498
+ }
2499
+ };
2500
+
2501
+ // src/workflows/control-plane/counter-reconciliation/counter-reconciliation-workflow.ts
2502
+ import { Construct as Construct16 } from "constructs";
2503
+ var CounterReconciliationWorkflow = class extends Construct16 {
2504
+ constructor(scope, props) {
2505
+ super(scope, "counter-reconciliation-workflow");
2506
+ this.counterReconciliation = new CounterReconciliationLambda(this, {
2507
+ dataStoreTable: props.dataStoreTable
2508
+ });
2509
+ }
2510
+ };
2511
+
2512
+ // src/workflows/control-plane/seed-demo-data/seed-demo-data-lambda.ts
2513
+ import fs10 from "fs";
2514
+ import path10 from "path";
2515
+ import { Duration as Duration9, Stack as Stack5 } from "aws-cdk-lib";
2516
+ import { Rule as Rule3 } from "aws-cdk-lib/aws-events";
2517
+ import { LambdaFunction as LambdaFunction3 } from "aws-cdk-lib/aws-events-targets";
2518
+ import { Effect as Effect3, PolicyStatement as PolicyStatement3 } from "aws-cdk-lib/aws-iam";
2519
+ import { Runtime as Runtime10 } from "aws-cdk-lib/aws-lambda";
2520
+ import { NodejsFunction as NodejsFunction10 } from "aws-cdk-lib/aws-lambda-nodejs";
2521
+ import { Construct as Construct17 } from "constructs";
2522
+ var HANDLER_NAME9 = "seed-demo-data.handler.js";
2523
+ function resolveHandlerEntry9(dirname) {
2524
+ const sameDir = path10.join(dirname, HANDLER_NAME9);
2525
+ if (fs10.existsSync(sameDir)) {
2526
+ return sameDir;
2527
+ }
2528
+ return path10.join(dirname, "..", "..", "..", "..", "lib", HANDLER_NAME9);
2529
+ }
2530
+ var SeedDemoDataLambda = class extends Construct17 {
2531
+ constructor(scope, props) {
2532
+ super(scope, "seed-demo-data-lambda");
2533
+ this.lambda = new NodejsFunction10(this, "handler", {
2534
+ entry: resolveHandlerEntry9(__dirname),
2535
+ runtime: Runtime10.NODEJS_LATEST,
2536
+ memorySize: 512,
2537
+ timeout: Duration9.minutes(2),
2422
2538
  environment: {
2423
2539
  DYNAMO_TABLE_NAME: props.dataStoreTable.tableName,
2424
2540
  [SEED_DEMO_DATA_USER_POOL_ID_ENV_VAR]: props.userPool.userPoolId
@@ -2481,16 +2597,16 @@ var SeedDemoDataLambda = class extends Construct13 {
2481
2597
  ]
2482
2598
  })
2483
2599
  );
2484
- this.rule = new Rule2(this, "rule", {
2600
+ this.rule = new Rule3(this, "rule", {
2485
2601
  eventBus: props.controlEventBus,
2486
2602
  eventPattern: {
2487
- source: [import_workflows.PlatformSystemDataSeededV1.source],
2488
- detailType: [import_workflows.PlatformSystemDataSeededV1.detailType]
2603
+ source: [import_workflows2.PlatformSystemDataSeededV1.source],
2604
+ detailType: [import_workflows2.PlatformSystemDataSeededV1.detailType]
2489
2605
  },
2490
2606
  targets: [
2491
- new LambdaFunction2(this.lambda, {
2607
+ new LambdaFunction3(this.lambda, {
2492
2608
  retryAttempts: 2,
2493
- maxEventAge: Duration7.hours(2)
2609
+ maxEventAge: Duration9.hours(2)
2494
2610
  })
2495
2611
  ]
2496
2612
  });
@@ -2498,8 +2614,8 @@ var SeedDemoDataLambda = class extends Construct13 {
2498
2614
  };
2499
2615
 
2500
2616
  // src/workflows/control-plane/seed-demo-data/seed-demo-data-workflow.ts
2501
- import { Construct as Construct14 } from "constructs";
2502
- var SeedDemoDataWorkflow = class extends Construct14 {
2617
+ import { Construct as Construct18 } from "constructs";
2618
+ var SeedDemoDataWorkflow = class extends Construct18 {
2503
2619
  constructor(scope, props) {
2504
2620
  super(scope, "seed-demo-data-workflow");
2505
2621
  this.seedDemoData = new SeedDemoDataLambda(this, {
@@ -2516,32 +2632,32 @@ var SeedDemoDataWorkflow = class extends Construct14 {
2516
2632
  };
2517
2633
 
2518
2634
  // src/workflows/control-plane/seed-system-data/seed-system-data-lambda.ts
2519
- import fs9 from "fs";
2520
- import path9 from "path";
2635
+ import fs11 from "fs";
2636
+ import path11 from "path";
2521
2637
  import { PLATFORM_ROLE_IDS } from "@openhi/types";
2522
- import { Duration as Duration8, Stack as Stack6 } from "aws-cdk-lib";
2523
- import { Rule as Rule3 } from "aws-cdk-lib/aws-events";
2524
- import { LambdaFunction as LambdaFunction3 } from "aws-cdk-lib/aws-events-targets";
2638
+ import { Duration as Duration10, Stack as Stack6 } from "aws-cdk-lib";
2639
+ import { Rule as Rule4 } from "aws-cdk-lib/aws-events";
2640
+ import { LambdaFunction as LambdaFunction4 } from "aws-cdk-lib/aws-events-targets";
2525
2641
  import { Effect as Effect4, PolicyStatement as PolicyStatement4 } from "aws-cdk-lib/aws-iam";
2526
- import { Runtime as Runtime9 } from "aws-cdk-lib/aws-lambda";
2527
- import { NodejsFunction as NodejsFunction9 } from "aws-cdk-lib/aws-lambda-nodejs";
2528
- import { Construct as Construct15 } from "constructs";
2529
- var HANDLER_NAME8 = "seed-system-data.handler.js";
2530
- function resolveHandlerEntry8(dirname) {
2531
- const sameDir = path9.join(dirname, HANDLER_NAME8);
2532
- if (fs9.existsSync(sameDir)) {
2642
+ import { Runtime as Runtime11 } from "aws-cdk-lib/aws-lambda";
2643
+ import { NodejsFunction as NodejsFunction11 } from "aws-cdk-lib/aws-lambda-nodejs";
2644
+ import { Construct as Construct19 } from "constructs";
2645
+ var HANDLER_NAME10 = "seed-system-data.handler.js";
2646
+ function resolveHandlerEntry10(dirname) {
2647
+ const sameDir = path11.join(dirname, HANDLER_NAME10);
2648
+ if (fs11.existsSync(sameDir)) {
2533
2649
  return sameDir;
2534
2650
  }
2535
- return path9.join(dirname, "..", "..", "..", "..", "lib", HANDLER_NAME8);
2651
+ return path11.join(dirname, "..", "..", "..", "..", "lib", HANDLER_NAME10);
2536
2652
  }
2537
- var SeedSystemDataLambda = class extends Construct15 {
2653
+ var SeedSystemDataLambda = class extends Construct19 {
2538
2654
  constructor(scope, props) {
2539
2655
  super(scope, "seed-system-data-lambda");
2540
- this.lambda = new NodejsFunction9(this, "handler", {
2541
- entry: resolveHandlerEntry8(__dirname),
2542
- runtime: Runtime9.NODEJS_LATEST,
2656
+ this.lambda = new NodejsFunction11(this, "handler", {
2657
+ entry: resolveHandlerEntry10(__dirname),
2658
+ runtime: Runtime11.NODEJS_LATEST,
2543
2659
  memorySize: 512,
2544
- timeout: Duration8.minutes(1),
2660
+ timeout: Duration10.minutes(1),
2545
2661
  environment: {
2546
2662
  DYNAMO_TABLE_NAME: props.dataStoreTable.tableName,
2547
2663
  [SEED_SYSTEM_DATA_CONTROL_BUS_ENV_VAR]: props.controlEventBus.eventBusName
@@ -2564,11 +2680,11 @@ var SeedSystemDataLambda = class extends Construct15 {
2564
2680
  );
2565
2681
  props.controlEventBus.grantPutEventsTo(this.lambda);
2566
2682
  const hostStackName = Stack6.of(this).stackName;
2567
- this.rule = new Rule3(this, "rule", {
2683
+ this.rule = new Rule4(this, "rule", {
2568
2684
  eventBus: props.controlEventBus,
2569
2685
  eventPattern: {
2570
- source: [import_workflows2.PlatformDeploymentCompletedV1.source],
2571
- detailType: [import_workflows2.PlatformDeploymentCompletedV1.detailType],
2686
+ source: [import_workflows3.PlatformDeploymentCompletedV1.source],
2687
+ detailType: [import_workflows3.PlatformDeploymentCompletedV1.detailType],
2572
2688
  detail: {
2573
2689
  payload: {
2574
2690
  stackName: [hostStackName]
@@ -2576,9 +2692,9 @@ var SeedSystemDataLambda = class extends Construct15 {
2576
2692
  }
2577
2693
  },
2578
2694
  targets: [
2579
- new LambdaFunction3(this.lambda, {
2695
+ new LambdaFunction4(this.lambda, {
2580
2696
  retryAttempts: 2,
2581
- maxEventAge: Duration8.hours(2)
2697
+ maxEventAge: Duration10.hours(2)
2582
2698
  })
2583
2699
  ]
2584
2700
  });
@@ -2586,8 +2702,8 @@ var SeedSystemDataLambda = class extends Construct15 {
2586
2702
  };
2587
2703
 
2588
2704
  // src/workflows/control-plane/seed-system-data/seed-system-data-workflow.ts
2589
- import { Construct as Construct16 } from "constructs";
2590
- var SeedSystemDataWorkflow = class extends Construct16 {
2705
+ import { Construct as Construct20 } from "constructs";
2706
+ var SeedSystemDataWorkflow = class extends Construct20 {
2591
2707
  constructor(scope, props) {
2592
2708
  super(scope, "seed-system-data-workflow");
2593
2709
  this.seedSystemData = new SeedSystemDataLambda(this, {
@@ -2654,6 +2770,8 @@ var _OpenHiDataService = class _OpenHiDataService extends OpenHiService {
2654
2770
  );
2655
2771
  this.seedSystemDataWorkflow = this.createSeedSystemDataWorkflow();
2656
2772
  this.seedDemoDataWorkflow = this.createSeedDemoDataWorkflow();
2773
+ this.counterMaintenanceWorkflow = this.createCounterMaintenanceWorkflow();
2774
+ this.counterReconciliationWorkflow = this.createCounterReconciliationWorkflow();
2657
2775
  }
2658
2776
  /**
2659
2777
  * Returns the data store table by name. Use from other stacks (e.g. REST API Lambda) to obtain an ITable reference.
@@ -2700,6 +2818,28 @@ var _OpenHiDataService = class _OpenHiDataService extends OpenHiService {
2700
2818
  userPool: OpenHiAuthService.userPoolFromConstruct(this)
2701
2819
  });
2702
2820
  }
2821
+ /**
2822
+ * Creates the ADR-028 counter-maintenance workflow. Override to
2823
+ * customize. Mounted on every stage — the denormalized counters back
2824
+ * the admin console list columns in prod and non-prod alike.
2825
+ */
2826
+ createCounterMaintenanceWorkflow() {
2827
+ return new CounterMaintenanceWorkflow(this, {
2828
+ controlEventBus: this.controlEventBus(),
2829
+ dataStoreTable: this.dataStore
2830
+ });
2831
+ }
2832
+ /**
2833
+ * Creates the ADR-028 counter-reconciliation job (#1319). Override to
2834
+ * customize. Mounted on every stage — the recompute-and-repair backstop
2835
+ * is the correctness authority for the denormalized counters in prod
2836
+ * and non-prod alike. On-demand only (no EventBridge trigger).
2837
+ */
2838
+ createCounterReconciliationWorkflow() {
2839
+ return new CounterReconciliationWorkflow(this, {
2840
+ dataStoreTable: this.dataStore
2841
+ });
2842
+ }
2703
2843
  /**
2704
2844
  * Creates the single-table DynamoDB data store.
2705
2845
  * Override to customize.
@@ -2732,6 +2872,7 @@ import {
2732
2872
  } from "aws-cdk-lib/aws-apigatewayv2";
2733
2873
  import { HttpUserPoolAuthorizer } from "aws-cdk-lib/aws-apigatewayv2-authorizers";
2734
2874
  import { HttpLambdaIntegration } from "aws-cdk-lib/aws-apigatewayv2-integrations";
2875
+ import { EventBus as EventBus5 } from "aws-cdk-lib/aws-events";
2735
2876
  import { Effect as Effect5, PolicyStatement as PolicyStatement5 } from "aws-cdk-lib/aws-iam";
2736
2877
  import {
2737
2878
  ARecord as ARecord3,
@@ -2739,56 +2880,56 @@ import {
2739
2880
  RecordTarget as RecordTarget3
2740
2881
  } from "aws-cdk-lib/aws-route53";
2741
2882
  import { ApiGatewayv2DomainProperties } from "aws-cdk-lib/aws-route53-targets";
2742
- import { Duration as Duration9 } from "aws-cdk-lib/core";
2743
- import { Construct as Construct19 } from "constructs";
2883
+ import { Duration as Duration11 } from "aws-cdk-lib/core";
2884
+ import { Construct as Construct23 } from "constructs";
2744
2885
 
2745
2886
  // src/data/lambda/cors-options-lambda.ts
2746
- import fs10 from "fs";
2747
- import path10 from "path";
2748
- import { Runtime as Runtime10 } from "aws-cdk-lib/aws-lambda";
2749
- import { NodejsFunction as NodejsFunction10 } from "aws-cdk-lib/aws-lambda-nodejs";
2750
- import { Construct as Construct17 } from "constructs";
2751
- var HANDLER_NAME9 = "cors-options-lambda.handler.js";
2752
- function resolveHandlerEntry9(dirname) {
2753
- const sameDir = path10.join(dirname, HANDLER_NAME9);
2754
- if (fs10.existsSync(sameDir)) {
2887
+ import fs12 from "fs";
2888
+ import path12 from "path";
2889
+ import { Runtime as Runtime12 } from "aws-cdk-lib/aws-lambda";
2890
+ import { NodejsFunction as NodejsFunction12 } from "aws-cdk-lib/aws-lambda-nodejs";
2891
+ import { Construct as Construct21 } from "constructs";
2892
+ var HANDLER_NAME11 = "cors-options-lambda.handler.js";
2893
+ function resolveHandlerEntry11(dirname) {
2894
+ const sameDir = path12.join(dirname, HANDLER_NAME11);
2895
+ if (fs12.existsSync(sameDir)) {
2755
2896
  return sameDir;
2756
2897
  }
2757
- const fromLib = path10.join(dirname, "..", "..", "..", "lib", HANDLER_NAME9);
2898
+ const fromLib = path12.join(dirname, "..", "..", "..", "lib", HANDLER_NAME11);
2758
2899
  return fromLib;
2759
2900
  }
2760
- var CorsOptionsLambda = class extends Construct17 {
2901
+ var CorsOptionsLambda = class extends Construct21 {
2761
2902
  constructor(scope, id = "cors-options-lambda") {
2762
2903
  super(scope, id);
2763
- this.lambda = new NodejsFunction10(this, "handler", {
2764
- entry: resolveHandlerEntry9(__dirname),
2765
- runtime: Runtime10.NODEJS_LATEST,
2904
+ this.lambda = new NodejsFunction12(this, "handler", {
2905
+ entry: resolveHandlerEntry11(__dirname),
2906
+ runtime: Runtime12.NODEJS_LATEST,
2766
2907
  memorySize: 128
2767
2908
  });
2768
2909
  }
2769
2910
  };
2770
2911
 
2771
2912
  // src/data/lambda/rest-api-lambda.ts
2772
- import fs11 from "fs";
2773
- import path11 from "path";
2774
- import { Runtime as Runtime11 } from "aws-cdk-lib/aws-lambda";
2775
- import { NodejsFunction as NodejsFunction11 } from "aws-cdk-lib/aws-lambda-nodejs";
2776
- import { Construct as Construct18 } from "constructs";
2777
- var HANDLER_NAME10 = "rest-api-lambda.handler.js";
2778
- function resolveHandlerEntry10(dirname) {
2779
- const sameDir = path11.join(dirname, HANDLER_NAME10);
2780
- if (fs11.existsSync(sameDir)) {
2913
+ import fs13 from "fs";
2914
+ import path13 from "path";
2915
+ import { Runtime as Runtime13 } from "aws-cdk-lib/aws-lambda";
2916
+ import { NodejsFunction as NodejsFunction13 } from "aws-cdk-lib/aws-lambda-nodejs";
2917
+ import { Construct as Construct22 } from "constructs";
2918
+ var HANDLER_NAME12 = "rest-api-lambda.handler.js";
2919
+ function resolveHandlerEntry12(dirname) {
2920
+ const sameDir = path13.join(dirname, HANDLER_NAME12);
2921
+ if (fs13.existsSync(sameDir)) {
2781
2922
  return sameDir;
2782
2923
  }
2783
- const fromLib = path11.join(dirname, "..", "..", "..", "lib", HANDLER_NAME10);
2924
+ const fromLib = path13.join(dirname, "..", "..", "..", "lib", HANDLER_NAME12);
2784
2925
  return fromLib;
2785
2926
  }
2786
- var RestApiLambda = class extends Construct18 {
2927
+ var RestApiLambda = class extends Construct22 {
2787
2928
  constructor(scope, props) {
2788
2929
  super(scope, "rest-api-lambda");
2789
- this.lambda = new NodejsFunction11(this, "handler", {
2790
- entry: resolveHandlerEntry10(__dirname),
2791
- runtime: Runtime11.NODEJS_LATEST,
2930
+ this.lambda = new NodejsFunction13(this, "handler", {
2931
+ entry: resolveHandlerEntry12(__dirname),
2932
+ runtime: Runtime13.NODEJS_LATEST,
2792
2933
  memorySize: 1024,
2793
2934
  environment: {
2794
2935
  DYNAMO_TABLE_NAME: props.dynamoTableName,
@@ -2798,6 +2939,7 @@ var RestApiLambda = class extends Construct18 {
2798
2939
  OPENHI_PG_SECRET_ARN: props.postgresSecretArn,
2799
2940
  OPENHI_PG_DATABASE: props.postgresDatabase,
2800
2941
  OPENHI_PG_SCHEMA: props.postgresSchema,
2942
+ CONTROL_EVENT_BUS_NAME: props.controlEventBusName,
2801
2943
  ...props.extraEnvironment
2802
2944
  },
2803
2945
  bundling: {
@@ -2981,6 +3123,7 @@ var _OpenHiRestApiService = class _OpenHiRestApiService extends OpenHiService {
2981
3123
  const postgresDatabase = DataStorePostgresReplica.databaseNameFromConstruct(this);
2982
3124
  const postgresSchema = getPostgresReplicaSchemaName(this.branchHash);
2983
3125
  const extraEnvironment = this.resolveRuntimeConfigEnvVars();
3126
+ const controlEventBusName = ControlEventBus.getEventBusName(this);
2984
3127
  const { lambda } = new RestApiLambda(this, {
2985
3128
  dynamoTableName: dataStoreTable.tableName,
2986
3129
  branchTagValue: this.branchName,
@@ -2989,8 +3132,14 @@ var _OpenHiRestApiService = class _OpenHiRestApiService extends OpenHiService {
2989
3132
  postgresSecretArn,
2990
3133
  postgresDatabase,
2991
3134
  postgresSchema,
3135
+ controlEventBusName,
2992
3136
  extraEnvironment
2993
3137
  });
3138
+ EventBus5.fromEventBusName(
3139
+ this,
3140
+ "control-event-bus-ref",
3141
+ controlEventBusName
3142
+ ).grantPutEventsTo(lambda);
2994
3143
  lambda.addToRolePolicy(
2995
3144
  new PolicyStatement5({
2996
3145
  effect: Effect5.ALLOW,
@@ -3188,7 +3337,7 @@ var _OpenHiRestApiService = class _OpenHiRestApiService extends OpenHiService {
3188
3337
  ],
3189
3338
  allowHeaders: cors?.allowHeaders ?? ["Content-Type", "Authorization"],
3190
3339
  allowCredentials: cors?.allowCredentials ?? true,
3191
- maxAge: cors?.maxAge ?? Duration9.days(1),
3340
+ maxAge: cors?.maxAge ?? Duration11.days(1),
3192
3341
  ...cors?.exposeHeaders !== void 0 && {
3193
3342
  exposeHeaders: cors.exposeHeaders
3194
3343
  }
@@ -3206,7 +3355,7 @@ var _OpenHiRestApiService = class _OpenHiRestApiService extends OpenHiService {
3206
3355
  * client-side from `window.location.origin`.
3207
3356
  */
3208
3357
  resolveRuntimeConfigEnvVars() {
3209
- const cognitoScope = new Construct19(this, "runtime-config");
3358
+ const cognitoScope = new Construct23(this, "runtime-config");
3210
3359
  const userPool = OpenHiAuthService.userPoolFromConstruct(cognitoScope);
3211
3360
  const userPoolClient = OpenHiAuthService.userPoolClientFromConstruct(cognitoScope);
3212
3361
  const cognitoDomainUrl = OpenHiAuthService.userPoolDomainBaseUrlFromConstruct(cognitoScope);
@@ -3542,29 +3691,29 @@ _OpenHiWebsiteService.ADMIN_CONSOLE_ENDPOINT_OUTPUT_NAME = "AdminConsoleEndpoint
3542
3691
  var OpenHiWebsiteService = _OpenHiWebsiteService;
3543
3692
 
3544
3693
  // src/workflows/control-plane/user-onboarding/provision-default-workspace-lambda.ts
3545
- import fs12 from "fs";
3546
- import path12 from "path";
3547
- import { Duration as Duration10 } from "aws-cdk-lib";
3548
- import { Rule as Rule4 } from "aws-cdk-lib/aws-events";
3549
- import { LambdaFunction as LambdaFunction4 } from "aws-cdk-lib/aws-events-targets";
3694
+ import fs14 from "fs";
3695
+ import path14 from "path";
3696
+ import { Duration as Duration12 } from "aws-cdk-lib";
3697
+ import { Rule as Rule5 } from "aws-cdk-lib/aws-events";
3698
+ import { LambdaFunction as LambdaFunction5 } from "aws-cdk-lib/aws-events-targets";
3550
3699
  import { Effect as Effect6, PolicyStatement as PolicyStatement6 } from "aws-cdk-lib/aws-iam";
3551
- import { Runtime as Runtime12 } from "aws-cdk-lib/aws-lambda";
3552
- import { NodejsFunction as NodejsFunction12 } from "aws-cdk-lib/aws-lambda-nodejs";
3553
- import { Construct as Construct20 } from "constructs";
3554
- var HANDLER_NAME11 = "provision-default-workspace.handler.js";
3555
- function resolveHandlerEntry11(dirname) {
3556
- const sameDir = path12.join(dirname, HANDLER_NAME11);
3557
- if (fs12.existsSync(sameDir)) {
3700
+ import { Runtime as Runtime14 } from "aws-cdk-lib/aws-lambda";
3701
+ import { NodejsFunction as NodejsFunction14 } from "aws-cdk-lib/aws-lambda-nodejs";
3702
+ import { Construct as Construct24 } from "constructs";
3703
+ var HANDLER_NAME13 = "provision-default-workspace.handler.js";
3704
+ function resolveHandlerEntry13(dirname) {
3705
+ const sameDir = path14.join(dirname, HANDLER_NAME13);
3706
+ if (fs14.existsSync(sameDir)) {
3558
3707
  return sameDir;
3559
3708
  }
3560
- return path12.join(dirname, "..", "..", "..", "..", "lib", HANDLER_NAME11);
3709
+ return path14.join(dirname, "..", "..", "..", "..", "lib", HANDLER_NAME13);
3561
3710
  }
3562
- var ProvisionDefaultWorkspaceLambda = class extends Construct20 {
3711
+ var ProvisionDefaultWorkspaceLambda = class extends Construct24 {
3563
3712
  constructor(scope, props) {
3564
3713
  super(scope, "provision-default-workspace-lambda");
3565
- this.lambda = new NodejsFunction12(this, "handler", {
3566
- entry: resolveHandlerEntry11(__dirname),
3567
- runtime: Runtime12.NODEJS_LATEST,
3714
+ this.lambda = new NodejsFunction14(this, "handler", {
3715
+ entry: resolveHandlerEntry13(__dirname),
3716
+ runtime: Runtime14.NODEJS_LATEST,
3568
3717
  memorySize: 1024,
3569
3718
  environment: {
3570
3719
  DYNAMO_TABLE_NAME: props.dataStoreTable.tableName
@@ -3582,16 +3731,16 @@ var ProvisionDefaultWorkspaceLambda = class extends Construct20 {
3582
3731
  resources: [`${props.dataStoreTable.tableArn}/index/*`]
3583
3732
  })
3584
3733
  );
3585
- this.rule = new Rule4(this, "rule", {
3734
+ this.rule = new Rule5(this, "rule", {
3586
3735
  eventBus: props.controlEventBus,
3587
3736
  eventPattern: {
3588
3737
  source: [USER_ONBOARDING_EVENT_SOURCE],
3589
3738
  detailType: [PROVISION_DEFAULT_WORKSPACE_DETAIL_TYPE]
3590
3739
  },
3591
3740
  targets: [
3592
- new LambdaFunction4(this.lambda, {
3741
+ new LambdaFunction5(this.lambda, {
3593
3742
  retryAttempts: 2,
3594
- maxEventAge: Duration10.hours(2)
3743
+ maxEventAge: Duration12.hours(2)
3595
3744
  })
3596
3745
  ]
3597
3746
  });
@@ -3599,8 +3748,8 @@ var ProvisionDefaultWorkspaceLambda = class extends Construct20 {
3599
3748
  };
3600
3749
 
3601
3750
  // src/workflows/control-plane/user-onboarding/user-onboarding-workflow.ts
3602
- import { Construct as Construct21 } from "constructs";
3603
- var UserOnboardingWorkflow = class extends Construct21 {
3751
+ import { Construct as Construct25 } from "constructs";
3752
+ var UserOnboardingWorkflow = class extends Construct25 {
3604
3753
  constructor(scope, props) {
3605
3754
  super(scope, "user-onboarding-workflow");
3606
3755
  this.provisionDefaultWorkspace = new ProvisionDefaultWorkspaceLambda(this, {
@@ -4024,47 +4173,47 @@ _OpenHiGraphqlService.SERVICE_TYPE = "graphql-api";
4024
4173
  var OpenHiGraphqlService = _OpenHiGraphqlService;
4025
4174
 
4026
4175
  // src/workflows/control-plane/owning-delete-cascade/owning-delete-cascade-lambdas.ts
4027
- import fs13 from "fs";
4028
- import path13 from "path";
4029
- import { Duration as Duration11 } from "aws-cdk-lib";
4176
+ import fs15 from "fs";
4177
+ import path15 from "path";
4178
+ import { Duration as Duration13 } from "aws-cdk-lib";
4030
4179
  import { Effect as Effect8, PolicyStatement as PolicyStatement8 } from "aws-cdk-lib/aws-iam";
4031
- import { Runtime as Runtime13 } from "aws-cdk-lib/aws-lambda";
4032
- import { NodejsFunction as NodejsFunction13 } from "aws-cdk-lib/aws-lambda-nodejs";
4033
- import { Construct as Construct22 } from "constructs";
4034
- function resolveHandlerEntry12(dirname, handlerName) {
4035
- const sameDir = path13.join(dirname, handlerName);
4036
- if (fs13.existsSync(sameDir)) {
4180
+ import { Runtime as Runtime15 } from "aws-cdk-lib/aws-lambda";
4181
+ import { NodejsFunction as NodejsFunction15 } from "aws-cdk-lib/aws-lambda-nodejs";
4182
+ import { Construct as Construct26 } from "constructs";
4183
+ function resolveHandlerEntry14(dirname, handlerName) {
4184
+ const sameDir = path15.join(dirname, handlerName);
4185
+ if (fs15.existsSync(sameDir)) {
4037
4186
  return { entry: sameDir, handler: "handler" };
4038
4187
  }
4039
- const libDir = path13.join(dirname, "..", "..", "..", "..", "lib", handlerName);
4188
+ const libDir = path15.join(dirname, "..", "..", "..", "..", "lib", handlerName);
4040
4189
  return { entry: libDir, handler: "handler" };
4041
4190
  }
4042
- var OwningDeleteCascadeLambdas = class extends Construct22 {
4191
+ var OwningDeleteCascadeLambdas = class extends Construct26 {
4043
4192
  constructor(scope, props) {
4044
4193
  super(scope, "owning-delete-cascade-lambdas");
4045
- const listResolved = resolveHandlerEntry12(
4194
+ const listResolved = resolveHandlerEntry14(
4046
4195
  __dirname,
4047
4196
  "list-chunks.handler.js"
4048
4197
  );
4049
- this.listChunks = new NodejsFunction13(this, "list-chunks-handler", {
4198
+ this.listChunks = new NodejsFunction15(this, "list-chunks-handler", {
4050
4199
  entry: listResolved.entry,
4051
- runtime: Runtime13.NODEJS_LATEST,
4200
+ runtime: Runtime15.NODEJS_LATEST,
4052
4201
  memorySize: 512,
4053
- timeout: Duration11.minutes(1),
4202
+ timeout: Duration13.minutes(1),
4054
4203
  environment: {
4055
4204
  DYNAMO_TABLE_NAME: props.dataStoreTable.tableName
4056
4205
  }
4057
4206
  });
4058
4207
  props.dataStoreTable.grant(this.listChunks, "dynamodb:Query");
4059
- const deleteResolved = resolveHandlerEntry12(
4208
+ const deleteResolved = resolveHandlerEntry14(
4060
4209
  __dirname,
4061
4210
  "delete-chunk.handler.js"
4062
4211
  );
4063
- this.deleteChunk = new NodejsFunction13(this, "delete-chunk-handler", {
4212
+ this.deleteChunk = new NodejsFunction15(this, "delete-chunk-handler", {
4064
4213
  entry: deleteResolved.entry,
4065
- runtime: Runtime13.NODEJS_LATEST,
4214
+ runtime: Runtime15.NODEJS_LATEST,
4066
4215
  memorySize: 512,
4067
- timeout: Duration11.minutes(1),
4216
+ timeout: Duration13.minutes(1),
4068
4217
  environment: {
4069
4218
  DYNAMO_TABLE_NAME: props.dataStoreTable.tableName
4070
4219
  }
@@ -4075,15 +4224,15 @@ var OwningDeleteCascadeLambdas = class extends Construct22 {
4075
4224
  "dynamodb:UpdateItem",
4076
4225
  "dynamodb:PutItem"
4077
4226
  );
4078
- const finalizeResolved = resolveHandlerEntry12(
4227
+ const finalizeResolved = resolveHandlerEntry14(
4079
4228
  __dirname,
4080
4229
  "finalize.handler.js"
4081
4230
  );
4082
- this.finalize = new NodejsFunction13(this, "finalize-handler", {
4231
+ this.finalize = new NodejsFunction15(this, "finalize-handler", {
4083
4232
  entry: finalizeResolved.entry,
4084
- runtime: Runtime13.NODEJS_LATEST,
4233
+ runtime: Runtime15.NODEJS_LATEST,
4085
4234
  memorySize: 512,
4086
- timeout: Duration11.minutes(1),
4235
+ timeout: Duration13.minutes(1),
4087
4236
  environment: {
4088
4237
  DYNAMO_TABLE_NAME: props.dataStoreTable.tableName,
4089
4238
  [OWNING_DELETE_OPS_EVENT_BUS_ENV_VAR]: props.opsEventBus.eventBusName
@@ -4101,8 +4250,8 @@ var OwningDeleteCascadeLambdas = class extends Construct22 {
4101
4250
  };
4102
4251
 
4103
4252
  // src/workflows/control-plane/owning-delete-cascade/owning-delete-cascade-workflow.ts
4104
- import { Duration as Duration12 } from "aws-cdk-lib";
4105
- import { Rule as Rule5 } from "aws-cdk-lib/aws-events";
4253
+ import { Duration as Duration14 } from "aws-cdk-lib";
4254
+ import { Rule as Rule6 } from "aws-cdk-lib/aws-events";
4106
4255
  import { SfnStateMachine } from "aws-cdk-lib/aws-events-targets";
4107
4256
  import {
4108
4257
  Choice,
@@ -4117,8 +4266,8 @@ import {
4117
4266
  WaitTime
4118
4267
  } from "aws-cdk-lib/aws-stepfunctions";
4119
4268
  import { LambdaInvoke } from "aws-cdk-lib/aws-stepfunctions-tasks";
4120
- import { Construct as Construct23 } from "constructs";
4121
- var OwningDeleteCascadeWorkflow = class extends Construct23 {
4269
+ import { Construct as Construct27 } from "constructs";
4270
+ var OwningDeleteCascadeWorkflow = class extends Construct27 {
4122
4271
  constructor(scope, props) {
4123
4272
  super(scope, "owning-delete-cascade-workflow");
4124
4273
  this.lambdas = new OwningDeleteCascadeLambdas(this, {
@@ -4227,7 +4376,7 @@ var OwningDeleteCascadeWorkflow = class extends Construct23 {
4227
4376
  }
4228
4377
  });
4229
4378
  const interPageWait = new Wait(this, "inter-page-wait", {
4230
- time: WaitTime.duration(Duration12.seconds(0))
4379
+ time: WaitTime.duration(Duration14.seconds(0))
4231
4380
  });
4232
4381
  const isExhausted = new Choice(this, "is-exhausted");
4233
4382
  const finalize = new LambdaInvoke(this, "finalize", {
@@ -4258,18 +4407,18 @@ var OwningDeleteCascadeWorkflow = class extends Construct23 {
4258
4407
  // Long timeout because real-world cascades can run minutes when
4259
4408
  // a workspace has thousands of members. The stuck-cascade alarm
4260
4409
  // fires at 15 minutes; the state machine itself does not abort.
4261
- timeout: Duration12.hours(2)
4410
+ timeout: Duration14.hours(2)
4262
4411
  });
4263
- this.rule = new Rule5(this, "rule", {
4412
+ this.rule = new Rule6(this, "rule", {
4264
4413
  eventBus: props.dataEventBus,
4265
4414
  eventPattern: {
4266
- source: [import_workflows3.OPENHI_DATA_SOURCE],
4267
- detailType: [import_workflows3.ControlPlaneOwningDeleteV1.detailType]
4415
+ source: [import_workflows4.OPENHI_DATA_SOURCE],
4416
+ detailType: [import_workflows4.ControlPlaneOwningDeleteV1.detailType]
4268
4417
  },
4269
4418
  targets: [
4270
4419
  new SfnStateMachine(this.stateMachine, {
4271
4420
  retryAttempts: 2,
4272
- maxEventAge: Duration12.hours(2)
4421
+ maxEventAge: Duration14.hours(2)
4273
4422
  })
4274
4423
  ]
4275
4424
  });
@@ -4277,47 +4426,47 @@ var OwningDeleteCascadeWorkflow = class extends Construct23 {
4277
4426
  };
4278
4427
 
4279
4428
  // src/workflows/control-plane/rename-cascade/rename-cascade-lambdas.ts
4280
- import fs14 from "fs";
4281
- import path14 from "path";
4282
- import { Duration as Duration13 } from "aws-cdk-lib";
4429
+ import fs16 from "fs";
4430
+ import path16 from "path";
4431
+ import { Duration as Duration15 } from "aws-cdk-lib";
4283
4432
  import { Effect as Effect9, PolicyStatement as PolicyStatement9 } from "aws-cdk-lib/aws-iam";
4284
- import { Runtime as Runtime14 } from "aws-cdk-lib/aws-lambda";
4285
- import { NodejsFunction as NodejsFunction14 } from "aws-cdk-lib/aws-lambda-nodejs";
4286
- import { Construct as Construct24 } from "constructs";
4287
- function resolveHandlerEntry13(dirname, handlerName) {
4288
- const sameDir = path14.join(dirname, handlerName);
4289
- if (fs14.existsSync(sameDir)) {
4433
+ import { Runtime as Runtime16 } from "aws-cdk-lib/aws-lambda";
4434
+ import { NodejsFunction as NodejsFunction16 } from "aws-cdk-lib/aws-lambda-nodejs";
4435
+ import { Construct as Construct28 } from "constructs";
4436
+ function resolveHandlerEntry15(dirname, handlerName) {
4437
+ const sameDir = path16.join(dirname, handlerName);
4438
+ if (fs16.existsSync(sameDir)) {
4290
4439
  return { entry: sameDir, handler: "handler" };
4291
4440
  }
4292
- const libDir = path14.join(dirname, "..", "..", "..", "..", "lib", handlerName);
4441
+ const libDir = path16.join(dirname, "..", "..", "..", "..", "lib", handlerName);
4293
4442
  return { entry: libDir, handler: "handler" };
4294
4443
  }
4295
- var RenameCascadeLambdas = class extends Construct24 {
4444
+ var RenameCascadeLambdas = class extends Construct28 {
4296
4445
  constructor(scope, props) {
4297
4446
  super(scope, "rename-cascade-lambdas");
4298
- const listResolved = resolveHandlerEntry13(
4447
+ const listResolved = resolveHandlerEntry15(
4299
4448
  __dirname,
4300
4449
  "rename-list-targets.handler.js"
4301
4450
  );
4302
- this.listTargets = new NodejsFunction14(this, "list-targets-handler", {
4451
+ this.listTargets = new NodejsFunction16(this, "list-targets-handler", {
4303
4452
  entry: listResolved.entry,
4304
- runtime: Runtime14.NODEJS_LATEST,
4453
+ runtime: Runtime16.NODEJS_LATEST,
4305
4454
  memorySize: 512,
4306
- timeout: Duration13.minutes(1),
4455
+ timeout: Duration15.minutes(1),
4307
4456
  environment: {
4308
4457
  DYNAMO_TABLE_NAME: props.dataStoreTable.tableName
4309
4458
  }
4310
4459
  });
4311
4460
  props.dataStoreTable.grant(this.listTargets, "dynamodb:Query");
4312
- const rewriteResolved = resolveHandlerEntry13(
4461
+ const rewriteResolved = resolveHandlerEntry15(
4313
4462
  __dirname,
4314
4463
  "rename-rewrite-chunk.handler.js"
4315
4464
  );
4316
- this.rewriteChunk = new NodejsFunction14(this, "rewrite-chunk-handler", {
4465
+ this.rewriteChunk = new NodejsFunction16(this, "rewrite-chunk-handler", {
4317
4466
  entry: rewriteResolved.entry,
4318
- runtime: Runtime14.NODEJS_LATEST,
4467
+ runtime: Runtime16.NODEJS_LATEST,
4319
4468
  memorySize: 512,
4320
- timeout: Duration13.minutes(1),
4469
+ timeout: Duration15.minutes(1),
4321
4470
  environment: {
4322
4471
  DYNAMO_TABLE_NAME: props.dataStoreTable.tableName
4323
4472
  }
@@ -4328,15 +4477,15 @@ var RenameCascadeLambdas = class extends Construct24 {
4328
4477
  "dynamodb:PutItem",
4329
4478
  "dynamodb:UpdateItem"
4330
4479
  );
4331
- const finalizeResolved = resolveHandlerEntry13(
4480
+ const finalizeResolved = resolveHandlerEntry15(
4332
4481
  __dirname,
4333
4482
  "rename-finalize.handler.js"
4334
4483
  );
4335
- this.finalize = new NodejsFunction14(this, "finalize-handler", {
4484
+ this.finalize = new NodejsFunction16(this, "finalize-handler", {
4336
4485
  entry: finalizeResolved.entry,
4337
- runtime: Runtime14.NODEJS_LATEST,
4486
+ runtime: Runtime16.NODEJS_LATEST,
4338
4487
  memorySize: 512,
4339
- timeout: Duration13.minutes(1),
4488
+ timeout: Duration15.minutes(1),
4340
4489
  environment: {
4341
4490
  [RENAME_CASCADE_OPS_EVENT_BUS_ENV_VAR]: props.opsEventBus.eventBusName
4342
4491
  }
@@ -4352,8 +4501,8 @@ var RenameCascadeLambdas = class extends Construct24 {
4352
4501
  };
4353
4502
 
4354
4503
  // src/workflows/control-plane/rename-cascade/rename-cascade-workflow.ts
4355
- import { Duration as Duration14 } from "aws-cdk-lib";
4356
- import { Rule as Rule6 } from "aws-cdk-lib/aws-events";
4504
+ import { Duration as Duration16 } from "aws-cdk-lib";
4505
+ import { Rule as Rule7 } from "aws-cdk-lib/aws-events";
4357
4506
  import { SfnStateMachine as SfnStateMachine2 } from "aws-cdk-lib/aws-events-targets";
4358
4507
  import {
4359
4508
  Choice as Choice2,
@@ -4366,8 +4515,8 @@ import {
4366
4515
  TaskInput as TaskInput2
4367
4516
  } from "aws-cdk-lib/aws-stepfunctions";
4368
4517
  import { LambdaInvoke as LambdaInvoke2 } from "aws-cdk-lib/aws-stepfunctions-tasks";
4369
- import { Construct as Construct25 } from "constructs";
4370
- var RenameCascadeWorkflow = class extends Construct25 {
4518
+ import { Construct as Construct29 } from "constructs";
4519
+ var RenameCascadeWorkflow = class extends Construct29 {
4371
4520
  constructor(scope, props) {
4372
4521
  super(scope, "rename-cascade-workflow");
4373
4522
  this.lambdas = new RenameCascadeLambdas(this, {
@@ -4511,32 +4660,38 @@ var RenameCascadeWorkflow = class extends Construct25 {
4511
4660
  // Long timeout — large renames may rewrite thousands of rows;
4512
4661
  // the `CascadeSlow` alarm fires at 300s p99 but the state
4513
4662
  // machine itself does not abort.
4514
- timeout: Duration14.hours(2)
4663
+ timeout: Duration16.hours(2)
4515
4664
  });
4516
- this.rule = new Rule6(this, "rule", {
4665
+ this.rule = new Rule7(this, "rule", {
4517
4666
  eventBus: props.dataEventBus,
4518
4667
  eventPattern: {
4519
- source: [import_workflows4.OPENHI_DATA_SOURCE],
4520
- detailType: [import_workflows4.ControlPlaneRenameV1.detailType]
4668
+ source: [import_workflows5.OPENHI_DATA_SOURCE],
4669
+ detailType: [import_workflows5.ControlPlaneRenameV1.detailType]
4521
4670
  },
4522
4671
  targets: [
4523
4672
  new SfnStateMachine2(this.stateMachine, {
4524
4673
  retryAttempts: 2,
4525
- maxEventAge: Duration14.hours(2)
4674
+ maxEventAge: Duration16.hours(2)
4526
4675
  })
4527
4676
  ]
4528
4677
  });
4529
4678
  }
4530
4679
  };
4531
- var export_ControlPlaneOwningDeleteCompleteV1 = import_workflows3.ControlPlaneOwningDeleteCompleteV1;
4532
- var export_ControlPlaneOwningDeleteFailedV1 = import_workflows3.ControlPlaneOwningDeleteFailedV1;
4533
- var export_ControlPlaneOwningDeleteV1 = import_workflows3.ControlPlaneOwningDeleteV1;
4534
- var export_ControlPlaneRenameCompleteV1 = import_workflows4.ControlPlaneRenameCompleteV1;
4535
- var export_ControlPlaneRenameFailedV1 = import_workflows4.ControlPlaneRenameFailedV1;
4536
- var export_ControlPlaneRenameV1 = import_workflows4.ControlPlaneRenameV1;
4537
- var export_OWNING_ENTITY_TYPE = import_workflows3.OWNING_ENTITY_TYPE;
4538
- var export_PlatformDeploymentCompletedV1 = import_workflows2.PlatformDeploymentCompletedV1;
4539
- var export_RENAMABLE_ENTITY_TYPE = import_workflows4.RENAMABLE_ENTITY_TYPE;
4680
+ var export_ControlPlaneMembershipCreatedV1 = import_workflows.ControlPlaneMembershipCreatedV1;
4681
+ var export_ControlPlaneMembershipDeletedV1 = import_workflows.ControlPlaneMembershipDeletedV1;
4682
+ var export_ControlPlaneOwningDeleteCompleteV1 = import_workflows4.ControlPlaneOwningDeleteCompleteV1;
4683
+ var export_ControlPlaneOwningDeleteFailedV1 = import_workflows4.ControlPlaneOwningDeleteFailedV1;
4684
+ var export_ControlPlaneOwningDeleteV1 = import_workflows4.ControlPlaneOwningDeleteV1;
4685
+ var export_ControlPlaneRenameCompleteV1 = import_workflows5.ControlPlaneRenameCompleteV1;
4686
+ var export_ControlPlaneRenameFailedV1 = import_workflows5.ControlPlaneRenameFailedV1;
4687
+ var export_ControlPlaneRenameV1 = import_workflows5.ControlPlaneRenameV1;
4688
+ var export_ControlPlaneRoleAssignmentCreatedV1 = import_workflows.ControlPlaneRoleAssignmentCreatedV1;
4689
+ var export_ControlPlaneRoleAssignmentDeletedV1 = import_workflows.ControlPlaneRoleAssignmentDeletedV1;
4690
+ var export_ControlPlaneWorkspaceCreatedV1 = import_workflows.ControlPlaneWorkspaceCreatedV1;
4691
+ var export_ControlPlaneWorkspaceDeletedV1 = import_workflows.ControlPlaneWorkspaceDeletedV1;
4692
+ var export_OWNING_ENTITY_TYPE = import_workflows4.OWNING_ENTITY_TYPE;
4693
+ var export_PlatformDeploymentCompletedV1 = import_workflows3.PlatformDeploymentCompletedV1;
4694
+ var export_RENAMABLE_ENTITY_TYPE = import_workflows5.RENAMABLE_ENTITY_TYPE;
4540
4695
  export {
4541
4696
  ADMIN_DOMAIN_PREFIX,
4542
4697
  BLOCK_OCCURRENCES_PER_TEMPLATE,
@@ -4551,6 +4706,8 @@ export {
4551
4706
  CLOUDFORMATION_STACK_STATUS_CHANGE_DETAIL_TYPE,
4552
4707
  CONDITION_CLINICAL_STATUS_SYSTEM,
4553
4708
  CONTROL_EVENT_BUS_NAME_ENV_VAR,
4709
+ COUNTER_MAINTENANCE_CONSUMER_NAME,
4710
+ COUNTER_MAINTENANCE_DETAIL_TYPES,
4554
4711
  COVERAGE_PAYOR_TYPE_SYSTEM,
4555
4712
  COVERAGE_QMB_STATUS_EXTENSION_URL,
4556
4713
  COVERAGE_VERIFICATION_DATE_EXTENSION_URL,
@@ -4562,12 +4719,22 @@ export {
4562
4719
  CognitoUserPoolDomain,
4563
4720
  CognitoUserPoolKmsKey,
4564
4721
  ControlEventBus,
4722
+ export_ControlPlaneMembershipCreatedV1 as ControlPlaneMembershipCreatedV1,
4723
+ export_ControlPlaneMembershipDeletedV1 as ControlPlaneMembershipDeletedV1,
4565
4724
  export_ControlPlaneOwningDeleteCompleteV1 as ControlPlaneOwningDeleteCompleteV1,
4566
4725
  export_ControlPlaneOwningDeleteFailedV1 as ControlPlaneOwningDeleteFailedV1,
4567
4726
  export_ControlPlaneOwningDeleteV1 as ControlPlaneOwningDeleteV1,
4568
4727
  export_ControlPlaneRenameCompleteV1 as ControlPlaneRenameCompleteV1,
4569
4728
  export_ControlPlaneRenameFailedV1 as ControlPlaneRenameFailedV1,
4570
4729
  export_ControlPlaneRenameV1 as ControlPlaneRenameV1,
4730
+ export_ControlPlaneRoleAssignmentCreatedV1 as ControlPlaneRoleAssignmentCreatedV1,
4731
+ export_ControlPlaneRoleAssignmentDeletedV1 as ControlPlaneRoleAssignmentDeletedV1,
4732
+ export_ControlPlaneWorkspaceCreatedV1 as ControlPlaneWorkspaceCreatedV1,
4733
+ export_ControlPlaneWorkspaceDeletedV1 as ControlPlaneWorkspaceDeletedV1,
4734
+ CounterMaintenanceLambda,
4735
+ CounterMaintenanceWorkflow,
4736
+ CounterReconciliationLambda,
4737
+ CounterReconciliationWorkflow,
4571
4738
  DATA_STORE_CHANGE_DETAIL_MAX_UTF8_BYTES,
4572
4739
  DATA_STORE_CHANGE_DETAIL_TYPE,
4573
4740
  DEFAULT_PREVIEW_EXPIRATION_DAYS,