@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
@@ -139,7 +139,7 @@ var require_control_plane = __commonJS({
139
139
  "../workflows/lib/detail-types/control-plane.js"(exports2) {
140
140
  "use strict";
141
141
  Object.defineProperty(exports2, "__esModule", { value: true });
142
- exports2.ControlPlaneRenameFailedV1 = exports2.ControlPlaneRenameCompleteV1 = exports2.ControlPlaneRenameV1 = exports2.RENAMABLE_ENTITY_TYPE = exports2.ControlPlaneOwningDeleteFailedV1 = exports2.ControlPlaneOwningDeleteCompleteV1 = exports2.ControlPlaneOwningDeleteV1 = exports2.OWNING_ENTITY_TYPE = void 0;
142
+ exports2.ControlPlaneWorkspaceDeletedV1 = exports2.ControlPlaneWorkspaceCreatedV1 = exports2.ControlPlaneRoleAssignmentDeletedV1 = exports2.ControlPlaneRoleAssignmentCreatedV1 = exports2.ControlPlaneMembershipDeletedV1 = exports2.ControlPlaneMembershipCreatedV1 = exports2.ControlPlaneRenameFailedV1 = exports2.ControlPlaneRenameCompleteV1 = exports2.ControlPlaneRenameV1 = exports2.RENAMABLE_ENTITY_TYPE = exports2.ControlPlaneOwningDeleteFailedV1 = exports2.ControlPlaneOwningDeleteCompleteV1 = exports2.ControlPlaneOwningDeleteV1 = exports2.OWNING_ENTITY_TYPE = void 0;
143
143
  var sources_1 = require_sources();
144
144
  var registry_1 = require_registry();
145
145
  exports2.OWNING_ENTITY_TYPE = {
@@ -181,6 +181,36 @@ var require_control_plane = __commonJS({
181
181
  source: sources_1.OPENHI_OPS_SOURCE,
182
182
  dedupRequired: true
183
183
  });
184
+ exports2.ControlPlaneMembershipCreatedV1 = (0, registry_1.defineDetailType)({
185
+ detailType: "control-plane.membership-created.v1",
186
+ source: sources_1.OPENHI_CONTROL_SOURCE,
187
+ dedupRequired: true
188
+ });
189
+ exports2.ControlPlaneMembershipDeletedV1 = (0, registry_1.defineDetailType)({
190
+ detailType: "control-plane.membership-deleted.v1",
191
+ source: sources_1.OPENHI_CONTROL_SOURCE,
192
+ dedupRequired: true
193
+ });
194
+ exports2.ControlPlaneRoleAssignmentCreatedV1 = (0, registry_1.defineDetailType)({
195
+ detailType: "control-plane.role-assignment-created.v1",
196
+ source: sources_1.OPENHI_CONTROL_SOURCE,
197
+ dedupRequired: true
198
+ });
199
+ exports2.ControlPlaneRoleAssignmentDeletedV1 = (0, registry_1.defineDetailType)({
200
+ detailType: "control-plane.role-assignment-deleted.v1",
201
+ source: sources_1.OPENHI_CONTROL_SOURCE,
202
+ dedupRequired: true
203
+ });
204
+ exports2.ControlPlaneWorkspaceCreatedV1 = (0, registry_1.defineDetailType)({
205
+ detailType: "control-plane.workspace-created.v1",
206
+ source: sources_1.OPENHI_CONTROL_SOURCE,
207
+ dedupRequired: true
208
+ });
209
+ exports2.ControlPlaneWorkspaceDeletedV1 = (0, registry_1.defineDetailType)({
210
+ detailType: "control-plane.workspace-deleted.v1",
211
+ source: sources_1.OPENHI_CONTROL_SOURCE,
212
+ dedupRequired: true
213
+ });
184
214
  }
185
215
  });
186
216
 
@@ -239,17 +269,17 @@ var require_publisher = __commonJS({
239
269
  Object.defineProperty(exports2, "__esModule", { value: true });
240
270
  exports2.WorkflowPublishError = void 0;
241
271
  exports2.workflowsClient = workflowsClient;
242
- exports2.publishWorkflowEvent = publishWorkflowEvent;
272
+ exports2.publishWorkflowEvent = publishWorkflowEvent2;
243
273
  var node_crypto_1 = require("crypto");
244
274
  var client_eventbridge_1 = require("@aws-sdk/client-eventbridge");
245
275
  var envelope_version_1 = require_envelope_version();
246
276
  var sources_1 = require_sources();
247
277
  function workflowsClient(bridge, options = {}) {
248
278
  return {
249
- publish: (entry, payload, ctx) => publishWorkflowEvent(bridge, entry, payload, ctx, options)
279
+ publish: (entry, payload, ctx) => publishWorkflowEvent2(bridge, entry, payload, ctx, options)
250
280
  };
251
281
  }
252
- async function publishWorkflowEvent(bridge, entry, payload, ctx, options = {}) {
282
+ async function publishWorkflowEvent2(bridge, entry, payload, ctx, options = {}) {
253
283
  const eventIdGenerator = options.eventIdGenerator ?? (() => (0, node_crypto_1.randomUUID)());
254
284
  const correlationIdGenerator = options.correlationIdGenerator ?? (() => (0, node_crypto_1.randomUUID)());
255
285
  const now = options.now ?? (() => /* @__PURE__ */ new Date());
@@ -578,7 +608,7 @@ var require_lib = __commonJS({
578
608
  "../workflows/lib/index.js"(exports2) {
579
609
  "use strict";
580
610
  Object.defineProperty(exports2, "__esModule", { value: true });
581
- exports2.workflowDedupClient = exports2.recordIfAbsent = exports2.markFailed = exports2.encodeSortKey = exports2.WorkflowDedupTableNameMissingError = exports2.WorkflowDedupInvalidInputError = exports2.WORKFLOW_DEDUP_TABLE_NAME_ENV_VAR = exports2.WORKFLOW_DEDUP_MAX_CONSUMER_NAME_LENGTH = exports2.WORKFLOW_DEDUP_DEFAULT_TTL_SECONDS = exports2.parseWorkflowEvent = exports2.UnsupportedEnvelopeVersionError = exports2.InvalidWorkflowEventError = exports2.workflowsClient = exports2.publishWorkflowEvent = exports2.WorkflowPublishError = exports2.isWellFormedDetailType = exports2.defineDetailType = exports2.RENAMABLE_ENTITY_TYPE = exports2.PlatformSystemDataSeededV1 = exports2.PlatformDeploymentCompletedV1 = exports2.OWNING_ENTITY_TYPE = exports2.InvalidDetailTypeRegistrationError = exports2.ControlPlaneRenameV1 = exports2.ControlPlaneRenameFailedV1 = exports2.ControlPlaneRenameCompleteV1 = exports2.ControlPlaneOwningDeleteV1 = exports2.ControlPlaneOwningDeleteFailedV1 = exports2.ControlPlaneOwningDeleteCompleteV1 = exports2.OPENHI_OPS_SOURCE = exports2.OPENHI_DATA_SOURCE = exports2.OPENHI_CONTROL_SOURCE = exports2.DEFAULT_BUS_NAME_BY_SOURCE = exports2.workflowUserActorFromClaims = exports2.isWorkflowUserActor = exports2.isWorkflowSystemActor = exports2.MissingActorContextError = exports2.isSupportedEnvelopeVersion = exports2.ENVELOPE_VERSION = void 0;
611
+ exports2.workflowDedupClient = exports2.recordIfAbsent = exports2.markFailed = exports2.encodeSortKey = exports2.WorkflowDedupTableNameMissingError = exports2.WorkflowDedupInvalidInputError = exports2.WORKFLOW_DEDUP_TABLE_NAME_ENV_VAR = exports2.WORKFLOW_DEDUP_MAX_CONSUMER_NAME_LENGTH = exports2.WORKFLOW_DEDUP_DEFAULT_TTL_SECONDS = exports2.parseWorkflowEvent = exports2.UnsupportedEnvelopeVersionError = exports2.InvalidWorkflowEventError = exports2.workflowsClient = exports2.publishWorkflowEvent = exports2.WorkflowPublishError = exports2.isWellFormedDetailType = exports2.defineDetailType = exports2.RENAMABLE_ENTITY_TYPE = exports2.PlatformSystemDataSeededV1 = exports2.PlatformDeploymentCompletedV1 = exports2.OWNING_ENTITY_TYPE = exports2.InvalidDetailTypeRegistrationError = exports2.ControlPlaneWorkspaceDeletedV1 = exports2.ControlPlaneWorkspaceCreatedV1 = exports2.ControlPlaneRoleAssignmentDeletedV1 = exports2.ControlPlaneRoleAssignmentCreatedV1 = exports2.ControlPlaneRenameV1 = exports2.ControlPlaneRenameFailedV1 = exports2.ControlPlaneRenameCompleteV1 = exports2.ControlPlaneOwningDeleteV1 = exports2.ControlPlaneOwningDeleteFailedV1 = exports2.ControlPlaneOwningDeleteCompleteV1 = exports2.ControlPlaneMembershipDeletedV1 = exports2.ControlPlaneMembershipCreatedV1 = exports2.OPENHI_OPS_SOURCE = exports2.OPENHI_DATA_SOURCE = exports2.OPENHI_CONTROL_SOURCE = exports2.DEFAULT_BUS_NAME_BY_SOURCE = exports2.workflowUserActorFromClaims = exports2.isWorkflowUserActor = exports2.isWorkflowSystemActor = exports2.MissingActorContextError = exports2.isSupportedEnvelopeVersion = exports2.ENVELOPE_VERSION = void 0;
582
612
  var envelope_version_1 = require_envelope_version();
583
613
  Object.defineProperty(exports2, "ENVELOPE_VERSION", { enumerable: true, get: function() {
584
614
  return envelope_version_1.ENVELOPE_VERSION;
@@ -613,6 +643,12 @@ var require_lib = __commonJS({
613
643
  return sources_1.OPENHI_OPS_SOURCE;
614
644
  } });
615
645
  var detail_types_1 = require_detail_types();
646
+ Object.defineProperty(exports2, "ControlPlaneMembershipCreatedV1", { enumerable: true, get: function() {
647
+ return detail_types_1.ControlPlaneMembershipCreatedV1;
648
+ } });
649
+ Object.defineProperty(exports2, "ControlPlaneMembershipDeletedV1", { enumerable: true, get: function() {
650
+ return detail_types_1.ControlPlaneMembershipDeletedV1;
651
+ } });
616
652
  Object.defineProperty(exports2, "ControlPlaneOwningDeleteCompleteV1", { enumerable: true, get: function() {
617
653
  return detail_types_1.ControlPlaneOwningDeleteCompleteV1;
618
654
  } });
@@ -631,6 +667,18 @@ var require_lib = __commonJS({
631
667
  Object.defineProperty(exports2, "ControlPlaneRenameV1", { enumerable: true, get: function() {
632
668
  return detail_types_1.ControlPlaneRenameV1;
633
669
  } });
670
+ Object.defineProperty(exports2, "ControlPlaneRoleAssignmentCreatedV1", { enumerable: true, get: function() {
671
+ return detail_types_1.ControlPlaneRoleAssignmentCreatedV1;
672
+ } });
673
+ Object.defineProperty(exports2, "ControlPlaneRoleAssignmentDeletedV1", { enumerable: true, get: function() {
674
+ return detail_types_1.ControlPlaneRoleAssignmentDeletedV1;
675
+ } });
676
+ Object.defineProperty(exports2, "ControlPlaneWorkspaceCreatedV1", { enumerable: true, get: function() {
677
+ return detail_types_1.ControlPlaneWorkspaceCreatedV1;
678
+ } });
679
+ Object.defineProperty(exports2, "ControlPlaneWorkspaceDeletedV1", { enumerable: true, get: function() {
680
+ return detail_types_1.ControlPlaneWorkspaceDeletedV1;
681
+ } });
634
682
  Object.defineProperty(exports2, "InvalidDetailTypeRegistrationError", { enumerable: true, get: function() {
635
683
  return detail_types_1.InvalidDetailTypeRegistrationError;
636
684
  } });
@@ -721,7 +769,7 @@ var import_client_cognito_identity_provider = require("@aws-sdk/client-cognito-i
721
769
  var import_client_dynamodb2 = require("@aws-sdk/client-dynamodb");
722
770
  var import_client_ssm = require("@aws-sdk/client-ssm");
723
771
  var import_types12 = require("@openhi/types");
724
- var import_workflows2 = __toESM(require_lib());
772
+ var import_workflows3 = __toESM(require_lib());
725
773
 
726
774
  // src/workflows/control-plane/seed-demo-data/events.ts
727
775
  var import_types = require("@openhi/types");
@@ -5897,6 +5945,24 @@ var TenantEntity = new import_electrodb11.Entity({
5897
5945
  type: "string",
5898
5946
  required: true
5899
5947
  },
5948
+ /**
5949
+ * ADR-028 denormalized counter — number of tenant-scoped Memberships
5950
+ * (users) in this tenant. Maintained by the counter-maintenance
5951
+ * consumer via atomic ADD; absent/0 until first event or reconciliation.
5952
+ */
5953
+ usersInTenant: {
5954
+ type: "number",
5955
+ required: false
5956
+ },
5957
+ /**
5958
+ * ADR-028 denormalized counter — number of Workspaces in this tenant.
5959
+ * Maintained by the counter-maintenance consumer via atomic ADD;
5960
+ * absent/0 until first event or reconciliation.
5961
+ */
5962
+ workspacesInTenant: {
5963
+ type: "number",
5964
+ required: false
5965
+ },
5900
5966
  gsi1Shard: gsi1ShardAttribute,
5901
5967
  /** Derived GSI1 sort key — name-based when extractable; else `<lastUpdated>#<id>`. */
5902
5968
  gsi1sk: gsi1skAttribute,
@@ -6001,6 +6067,26 @@ var UserEntity = new import_electrodb12.Entity({
6001
6067
  type: "string",
6002
6068
  required: true
6003
6069
  },
6070
+ /**
6071
+ * ADR-028 denormalized counter — number of tenant-scoped Memberships
6072
+ * (tenants) this user belongs to. Maintained by the
6073
+ * counter-maintenance consumer via atomic ADD; absent/0 until first
6074
+ * event or reconciliation.
6075
+ */
6076
+ tenantsForUser: {
6077
+ type: "number",
6078
+ required: false
6079
+ },
6080
+ /**
6081
+ * ADR-028 denormalized counter — number of workspace-scoped
6082
+ * Memberships (workspaces) this user belongs to. Maintained by the
6083
+ * counter-maintenance consumer via atomic ADD; absent/0 until first
6084
+ * event or reconciliation.
6085
+ */
6086
+ workspacesForUser: {
6087
+ type: "number",
6088
+ required: false
6089
+ },
6004
6090
  gsi1Shard: gsi1ShardAttribute,
6005
6091
  /** Derived GSI1 sort key — name-based when extractable; else `<lastUpdated>#<id>`. */
6006
6092
  gsi1sk: gsi1skAttribute,
@@ -6145,6 +6231,36 @@ var WorkspaceEntity = new import_electrodb13.Entity({
6145
6231
  type: "string",
6146
6232
  required: true
6147
6233
  },
6234
+ /**
6235
+ * ADR-028 denormalized counter — number of workspace-scoped
6236
+ * Memberships (users) in this workspace. Maintained by the
6237
+ * counter-maintenance consumer via atomic ADD; absent/0 until first
6238
+ * event or reconciliation.
6239
+ */
6240
+ usersInWorkspace: {
6241
+ type: "number",
6242
+ required: false
6243
+ },
6244
+ /**
6245
+ * ADR-028 denormalized counter — number of workspace-scoped
6246
+ * RoleAssignments classified as admin-tier in this workspace.
6247
+ * Maintained by the counter-maintenance consumer via atomic ADD;
6248
+ * absent/0 until first event or reconciliation.
6249
+ */
6250
+ adminUsersInWorkspace: {
6251
+ type: "number",
6252
+ required: false
6253
+ },
6254
+ /**
6255
+ * ADR-028 denormalized counter — number of workspace-scoped
6256
+ * RoleAssignments classified as non-admin in this workspace.
6257
+ * Maintained by the counter-maintenance consumer via atomic ADD;
6258
+ * absent/0 until first event or reconciliation.
6259
+ */
6260
+ normalUsersInWorkspace: {
6261
+ type: "number",
6262
+ required: false
6263
+ },
6148
6264
  gsi1Shard: gsi1ShardAttribute,
6149
6265
  /** Derived GSI1 sort key — name-based when extractable; else `<lastUpdated>#<id>`. */
6150
6266
  gsi1sk: gsi1skAttribute,
@@ -6372,6 +6488,63 @@ function buildMembershipWorkspaceProjectionItem(input) {
6372
6488
  };
6373
6489
  }
6374
6490
 
6491
+ // src/data/operations/control/control-event-publisher.ts
6492
+ var import_client_eventbridge = require("@aws-sdk/client-eventbridge");
6493
+ var import_workflows2 = __toESM(require_lib());
6494
+ var CONTROL_EVENT_BUS_NAME_ENV_VAR = "CONTROL_EVENT_BUS_NAME";
6495
+ var cachedClient;
6496
+ function getClient() {
6497
+ if (!cachedClient) {
6498
+ cachedClient = new import_client_eventbridge.EventBridgeClient({
6499
+ region: process.env.AWS_REGION ?? "us-east-1"
6500
+ });
6501
+ }
6502
+ return cachedClient;
6503
+ }
6504
+ function actorFromContext(context) {
6505
+ return {
6506
+ ohi_tid: context.tenantId,
6507
+ ohi_wid: context.workspaceId,
6508
+ ohi_uid: context.actorId,
6509
+ ohi_uname: context.actorName
6510
+ };
6511
+ }
6512
+ async function publishControlEvent(entry, payload, context) {
6513
+ const busName = process.env[CONTROL_EVENT_BUS_NAME_ENV_VAR];
6514
+ if (!busName) {
6515
+ return;
6516
+ }
6517
+ try {
6518
+ await (0, import_workflows2.publishWorkflowEvent)(
6519
+ getClient(),
6520
+ entry,
6521
+ payload,
6522
+ { actor: actorFromContext(context) },
6523
+ { busNameByPlane: { [import_workflows2.OPENHI_CONTROL_SOURCE]: busName } }
6524
+ );
6525
+ } catch (err) {
6526
+ console.error(`control-event publish failed for ${entry.detailType}:`, err);
6527
+ }
6528
+ }
6529
+ async function publishMembershipCreated(context, detail) {
6530
+ await publishControlEvent(import_workflows2.ControlPlaneMembershipCreatedV1, detail, context);
6531
+ }
6532
+ async function publishRoleAssignmentCreated(context, detail) {
6533
+ await publishControlEvent(
6534
+ import_workflows2.ControlPlaneRoleAssignmentCreatedV1,
6535
+ detail,
6536
+ context
6537
+ );
6538
+ }
6539
+ async function publishWorkspaceCreated(context, detail) {
6540
+ await publishControlEvent(import_workflows2.ControlPlaneWorkspaceCreatedV1, detail, context);
6541
+ }
6542
+ function extractRoleLevel(resource) {
6543
+ const code = resource?.code;
6544
+ const first = code?.coding?.[0]?.code;
6545
+ return typeof first === "string" && first.length > 0 ? first : void 0;
6546
+ }
6547
+
6375
6548
  // src/data/operations/control/denormalized-display-names.ts
6376
6549
  function extractDenormalizedReferenceDisplay(resource, fieldName) {
6377
6550
  const field = resource[fieldName];
@@ -6605,6 +6778,14 @@ async function createMembershipOperation(params) {
6605
6778
  });
6606
6779
  }
6607
6780
  await executeMultiWrite({ service, triples });
6781
+ await publishMembershipCreated(context, {
6782
+ membershipId: id,
6783
+ tenantId: context.tenantId,
6784
+ ...userIdFromResource !== void 0 && { userId: userIdFromResource },
6785
+ ...workspaceIdFromResource !== void 0 && {
6786
+ workspaceId: workspaceIdFromResource
6787
+ }
6788
+ });
6608
6789
  return {
6609
6790
  id,
6610
6791
  resource,
@@ -6846,6 +7027,18 @@ async function createRoleAssignmentOperation(params) {
6846
7027
  });
6847
7028
  }
6848
7029
  await executeMultiWrite({ service, triples });
7030
+ await publishRoleAssignmentCreated(context, {
7031
+ roleAssignmentId: id,
7032
+ tenantId: context.tenantId,
7033
+ ...userIdFromResource !== void 0 && { userId: userIdFromResource },
7034
+ ...workspaceIdFromResource !== void 0 && {
7035
+ workspaceId: workspaceIdFromResource
7036
+ },
7037
+ ...roleIdFromResource !== void 0 && { roleId: roleIdFromResource },
7038
+ ...extractRoleLevel(resourceRecord) !== void 0 && {
7039
+ roleLevel: extractRoleLevel(resourceRecord)
7040
+ }
7041
+ });
6849
7042
  return {
6850
7043
  id,
6851
7044
  resource,
@@ -8057,6 +8250,10 @@ async function createWorkspaceOperation(params) {
8057
8250
  workspaceName,
8058
8251
  tableName
8059
8252
  });
8253
+ await publishWorkspaceCreated(context, {
8254
+ workspaceId: id,
8255
+ tenantId
8256
+ });
8060
8257
  return { id, resource, meta: { lastUpdated, versionId: vid } };
8061
8258
  }
8062
8259
 
@@ -8996,7 +9193,7 @@ var seedDemoGraph = async (params) => {
8996
9193
  }
8997
9194
  };
8998
9195
  var runSeedDemoData = async (event, deps, devUsers) => {
8999
- const parsed = (0, import_workflows2.parseWorkflowEvent)(event, import_workflows.PlatformSystemDataSeededV1);
9196
+ const parsed = (0, import_workflows3.parseWorkflowEvent)(event, import_workflows.PlatformSystemDataSeededV1);
9000
9197
  const recordResult = await deps.dedupClient.recordIfAbsent({
9001
9198
  consumerName: SEED_DEMO_DATA_CONSUMER_NAME,
9002
9199
  eventId: parsed.dedupKey.eventId,
@@ -9167,7 +9364,7 @@ var productionDependencies = () => {
9167
9364
  const dynamodb = new import_client_dynamodb2.DynamoDBClient({});
9168
9365
  const cognito = productionCognitoProvisioner();
9169
9366
  return {
9170
- dedupClient: (0, import_workflows2.workflowDedupClient)(dynamodb),
9367
+ dedupClient: (0, import_workflows3.workflowDedupClient)(dynamodb),
9171
9368
  verifyRoles: verifySystemRolesExist,
9172
9369
  seedDemoGraph,
9173
9370
  cognito