@tearleads/client-sdk 0.1.15 → 0.1.16

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 (166) hide show
  1. package/client/Tearleads.d.ts +2 -0
  2. package/client/Tearleads.js +1 -0
  3. package/client/Tearleads.js.map +1 -1
  4. package/client/index.d.ts +1 -1
  5. package/client/index.js.map +1 -1
  6. package/client/organizations/index.d.ts +4 -42
  7. package/client/organizations/index.js +13 -0
  8. package/client/organizations/index.js.map +1 -1
  9. package/client/organizations/organizationGroupNameHydration.js +8 -1
  10. package/client/organizations/organizationGroupNameHydration.js.map +1 -1
  11. package/client/organizations/organizationsTypes.d.ts +47 -0
  12. package/client/organizations/organizationsTypes.js +2 -0
  13. package/client/organizations/organizationsTypes.js.map +1 -0
  14. package/client/organizations/principalMutationRecovery.d.ts +16 -0
  15. package/client/organizations/principalMutationRecovery.js +23 -0
  16. package/client/organizations/principalMutationRecovery.js.map +1 -0
  17. package/client/organizations/principalMutationScope.js +7 -2
  18. package/client/organizations/principalMutationScope.js.map +1 -1
  19. package/client/principalMutationApi.d.ts +24 -0
  20. package/client/principalMutationApi.js +108 -0
  21. package/client/principalMutationApi.js.map +1 -0
  22. package/client/principalMutationDeadline.js +23 -0
  23. package/client/principalMutationDeadline.js.map +1 -0
  24. package/client/workflowRuntime.d.ts +3 -1
  25. package/client/workflowRuntime.js +44 -5
  26. package/client/workflowRuntime.js.map +1 -1
  27. package/data/persistence/principalCurrentAcknowledgementPersistence.d.ts +27 -0
  28. package/data/persistence/principalCurrentAcknowledgementPersistence.js +109 -0
  29. package/data/persistence/principalCurrentAcknowledgementPersistence.js.map +1 -0
  30. package/data/persistence/principalGrantRetirementPersistence.d.ts +3 -3
  31. package/data/persistence/principalGrantRetirementPersistence.js +4 -1
  32. package/data/persistence/principalGrantRetirementPersistence.js.map +1 -1
  33. package/data/persistence/principalKeyEnvelopeCandidates.js +12 -1
  34. package/data/persistence/principalKeyEnvelopeCandidates.js.map +1 -1
  35. package/data/persistence/principalMutationJournalPersistence.d.ts +19 -0
  36. package/data/persistence/principalMutationJournalPersistence.js +53 -0
  37. package/data/persistence/principalMutationJournalPersistence.js.map +1 -0
  38. package/data/persistence/verifiedPrincipalPolicyBundle.js +7 -51
  39. package/data/persistence/verifiedPrincipalPolicyBundle.js.map +1 -1
  40. package/data/persistence/verifiedPrincipalPolicyCurrent.js +56 -0
  41. package/data/persistence/verifiedPrincipalPolicyCurrent.js.map +1 -0
  42. package/data/principals/principalMutationJournal.d.ts +26 -0
  43. package/data/principals/principalMutationJournal.js +90 -0
  44. package/data/principals/principalMutationJournal.js.map +1 -0
  45. package/data/principals/principalMutationJournalRecord.d.ts +8 -0
  46. package/data/principals/principalMutationJournalRecord.js +25 -0
  47. package/data/principals/principalMutationJournalRecord.js.map +1 -0
  48. package/data/sqlite/principalHistoryStageSchema.js +3 -0
  49. package/data/sqlite/principalHistoryStageSchema.js.map +1 -1
  50. package/data/sqlite/principalMutationJournalSchema.d.ts +85 -0
  51. package/data/sqlite/principalMutationJournalSchema.js +13 -0
  52. package/data/sqlite/principalMutationJournalSchema.js.map +1 -0
  53. package/data/sqlite/schema.d.ts +83 -0
  54. package/data/sqlite/schema.js +3 -0
  55. package/data/sqlite/schema.js.map +1 -1
  56. package/index.d.ts +3 -3
  57. package/index.js +1 -1
  58. package/index.js.map +1 -1
  59. package/internal/crypto/index.d.ts +1 -1
  60. package/internal/crypto/index.js +1 -1
  61. package/internal/crypto/index.js.map +1 -1
  62. package/internal/crypto/keying/index.d.ts +2 -0
  63. package/internal/crypto/keying/index.js +2 -0
  64. package/internal/crypto/keying/index.js.map +1 -1
  65. package/internal/crypto/keying/principalPolicyCurrent.d.ts +1 -1
  66. package/internal/crypto/keying/principalPolicyCurrent.js +3 -3
  67. package/internal/crypto/keying/principalPolicyCurrent.js.map +1 -1
  68. package/internal/crypto/keying/principalPolicyCurrentEvidence.js +16 -0
  69. package/internal/crypto/keying/principalPolicyCurrentEvidence.js.map +1 -0
  70. package/internal/crypto/keying/principalPolicyCurrentMutation.d.ts +10 -0
  71. package/internal/crypto/keying/principalPolicyCurrentMutation.js +51 -0
  72. package/internal/crypto/keying/principalPolicyCurrentMutation.js.map +1 -0
  73. package/internal/crypto/keying/principalPolicyCurrentSuccessor.d.ts +10 -0
  74. package/internal/crypto/keying/principalPolicyCurrentSuccessor.js +60 -0
  75. package/internal/crypto/keying/principalPolicyCurrentSuccessor.js.map +1 -0
  76. package/internal/crypto/keying/principalPolicyHistory.js +4 -1
  77. package/internal/crypto/keying/principalPolicyHistory.js.map +1 -1
  78. package/internal/crypto/keying/principalPolicyHistoryReferences.js +1 -1
  79. package/internal/crypto/keying/principalPolicyHistoryReferences.js.map +1 -1
  80. package/internal/crypto/keying/principalPolicyHistoryTypes.d.ts +5 -2
  81. package/internal/crypto/keying/principalPolicyHistoryTypes.js +6 -3
  82. package/internal/crypto/keying/principalPolicyHistoryTypes.js.map +1 -1
  83. package/package.json +1 -1
  84. package/workflows/containers/child/share.js +4 -0
  85. package/workflows/containers/child/share.js.map +1 -1
  86. package/workflows/containers/child/sharePrincipalPolicy.d.ts +1 -0
  87. package/workflows/containers/child/sharePrincipalPolicy.js.map +1 -1
  88. package/workflows/organizations/acknowledgedDirectoryBindings.js +18 -0
  89. package/workflows/organizations/acknowledgedDirectoryBindings.js.map +1 -0
  90. package/workflows/organizations/currentGroupMetadataAuthority.js +32 -0
  91. package/workflows/organizations/currentGroupMetadataAuthority.js.map +1 -0
  92. package/workflows/organizations/currentOrganizationAuthority.js +88 -0
  93. package/workflows/organizations/currentOrganizationAuthority.js.map +1 -0
  94. package/workflows/organizations/currentOrganizationGroupNames.js +68 -0
  95. package/workflows/organizations/currentOrganizationGroupNames.js.map +1 -0
  96. package/workflows/organizations/currentPolicyMutationAcknowledgement.js +65 -0
  97. package/workflows/organizations/currentPolicyMutationAcknowledgement.js.map +1 -0
  98. package/workflows/organizations/deleteOrganizationGroup.js +1 -0
  99. package/workflows/organizations/deleteOrganizationGroup.js.map +1 -1
  100. package/workflows/organizations/groupCreation.js +1 -0
  101. package/workflows/organizations/groupCreation.js.map +1 -1
  102. package/workflows/organizations/groupMetadataAccess.d.ts +2 -2
  103. package/workflows/organizations/groupMetadataAccess.js +1 -1
  104. package/workflows/organizations/groupMetadataAccess.js.map +1 -1
  105. package/workflows/organizations/groupMetadataBinding.js.map +1 -1
  106. package/workflows/organizations/groupMetadataContainerAuthority.js +2 -47
  107. package/workflows/organizations/groupMetadataContainerAuthority.js.map +1 -1
  108. package/workflows/organizations/groupMetadataRootBinding.js +51 -0
  109. package/workflows/organizations/groupMetadataRootBinding.js.map +1 -0
  110. package/workflows/organizations/groupMetadataRuntime.js +20 -9
  111. package/workflows/organizations/groupMetadataRuntime.js.map +1 -1
  112. package/workflows/organizations/groupMutationAuthorization.js.map +1 -1
  113. package/workflows/organizations/groupPolicyMutationAcknowledgement.js +9 -75
  114. package/workflows/organizations/groupPolicyMutationAcknowledgement.js.map +1 -1
  115. package/workflows/organizations/groupPolicyMutationContext.d.ts +5 -13
  116. package/workflows/organizations/groupPolicyMutationContext.js +1 -0
  117. package/workflows/organizations/groupPolicyMutationContext.js.map +1 -1
  118. package/workflows/organizations/groupPolicyMutationEvidence.d.ts +26 -0
  119. package/workflows/organizations/groupPolicyMutationEvidence.js +64 -0
  120. package/workflows/organizations/groupPolicyMutationEvidence.js.map +1 -0
  121. package/workflows/organizations/groupPolicyMutationHead.js.map +1 -1
  122. package/workflows/organizations/groupPolicyRequests.js +69 -63
  123. package/workflows/organizations/groupPolicyRequests.js.map +1 -1
  124. package/workflows/organizations/index.d.ts +6 -0
  125. package/workflows/organizations/index.js +5 -0
  126. package/workflows/organizations/index.js.map +1 -1
  127. package/workflows/organizations/organizationGroupNames.js +7 -0
  128. package/workflows/organizations/organizationGroupNames.js.map +1 -1
  129. package/workflows/organizations/principalCurrentPublicationSeal.js +51 -0
  130. package/workflows/organizations/principalCurrentPublicationSeal.js.map +1 -0
  131. package/workflows/organizations/principalMutationJournalLane.js +26 -0
  132. package/workflows/organizations/principalMutationJournalLane.js.map +1 -0
  133. package/workflows/organizations/principalMutationJournalManagement.d.ts +26 -0
  134. package/workflows/organizations/principalMutationJournalManagement.js +104 -0
  135. package/workflows/organizations/principalMutationJournalManagement.js.map +1 -0
  136. package/workflows/organizations/principalMutationJournalSession.d.ts +26 -0
  137. package/workflows/organizations/principalMutationJournalSession.js +85 -0
  138. package/workflows/organizations/principalMutationJournalSession.js.map +1 -0
  139. package/workflows/organizations/principalMutationReceipt.js +21 -0
  140. package/workflows/organizations/principalMutationReceipt.js.map +1 -0
  141. package/workflows/organizations/principalPolicyReceiptArtifacts.js +74 -0
  142. package/workflows/organizations/principalPolicyReceiptArtifacts.js.map +1 -0
  143. package/workflows/organizations/principalPolicyRequest.d.ts +5 -4
  144. package/workflows/organizations/principalPolicyRequest.js.map +1 -1
  145. package/workflows/organizations/retainAcknowledgedPrincipalCurrents.d.ts +21 -0
  146. package/workflows/organizations/retainAcknowledgedPrincipalCurrents.js +155 -0
  147. package/workflows/organizations/retainAcknowledgedPrincipalCurrents.js.map +1 -0
  148. package/workflows/principals/principalCurrentRecoveryBatch.js +14 -0
  149. package/workflows/principals/principalCurrentRecoveryBatch.js.map +1 -0
  150. package/workflows/principals/principalRecoveryDirectory.d.ts +1 -1
  151. package/workflows/principals/principalRecoveryDirectory.js +29 -4
  152. package/workflows/principals/principalRecoveryDirectory.js.map +1 -1
  153. package/workflows/principals/principalRecoveryDiscoveryPage.js +36 -0
  154. package/workflows/principals/principalRecoveryDiscoveryPage.js.map +1 -0
  155. package/workflows/principals/principalRecoveryLocalPreference.js +28 -0
  156. package/workflows/principals/principalRecoveryLocalPreference.js.map +1 -0
  157. package/workflows/principals/principalRecoveryMemo.d.ts +16 -0
  158. package/workflows/principals/principalRecoveryMemo.js +88 -16
  159. package/workflows/principals/principalRecoveryMemo.js.map +1 -1
  160. package/workflows/principals/recoverCurrentOrganizationPolicy.js +33 -0
  161. package/workflows/principals/recoverCurrentOrganizationPolicy.js.map +1 -0
  162. package/workflows/principals/recoverScopedPrincipalPolicyHistory.d.ts +2 -1
  163. package/workflows/principals/recoverScopedPrincipalPolicyHistory.js +13 -15
  164. package/workflows/principals/recoverScopedPrincipalPolicyHistory.js.map +1 -1
  165. package/workflows/principals/runtimePolicyRecovery.js +14 -8
  166. package/workflows/principals/runtimePolicyRecovery.js.map +1 -1
@@ -3,12 +3,16 @@ import { ProjectionDependencyUnavailableError } from "../../data/keyingProjectio
3
3
  import { runWithSecurityIncidentReporting } from "../../data/keyingProjectionVerification/error.js";
4
4
  import { assertProjectionVerificationCurrent, } from "../../data/keyingProjectionVerification/types.js";
5
5
  import { readPrincipalHistoryProtection } from "../../data/principals/principalHistoryRuntime.js";
6
+ import { createPrincipalCurrentRecoveryBatch } from "./principalCurrentRecoveryBatch.js";
6
7
  import { PrincipalHistoryRecoveryRaceError, PrincipalPolicyHistoryReadError, } from "./principalHistoryRecoveryTypes.js";
7
- import { recoverWithPrincipalOutageFallback } from "./principalRecoveryOutage.js";
8
+ import { recoverWithPrincipalLocalPreference } from "./principalRecoveryLocalPreference.js";
8
9
  import { queuePrincipalRecovery } from "./principalRecoveryQueue.js";
9
- import { createScopedPrincipalPolicyHistoryBatch, recoverScopedPrincipalPolicyHistory, } from "./recoverScopedPrincipalPolicyHistory.js";
10
- /** Keep the private recovery key inside its runtime lease throughout verification. */
10
+ /** Keep the private recovery key inside its runtime lease while resolving cited evidence. */
11
11
  export function createRuntimePrincipalPolicyResolver(runtime) {
12
+ return createRuntimePrincipalPolicyCurrentResolver(runtime);
13
+ }
14
+ /** Keep current artifacts with their verified evidence and private runtime lifetime. */
15
+ export function createRuntimePrincipalPolicyCurrentResolver(runtime) {
12
16
  const lease = readPrincipalHistoryProtection(runtime);
13
17
  const readPages = runtime.apiClient.getPrincipalPolicyPages?.bind(runtime.apiClient);
14
18
  if (!lease || !readPages)
@@ -16,16 +20,16 @@ export function createRuntimePrincipalPolicyResolver(runtime) {
16
20
  const batches = new WeakMap();
17
21
  const recoverFor = (batch) => {
18
22
  if (!batch)
19
- return recoverScopedPrincipalPolicyHistory;
23
+ return createPrincipalCurrentRecoveryBatch();
20
24
  let recover = batches.get(batch);
21
25
  if (!recover) {
22
- recover = createScopedPrincipalPolicyHistoryBatch();
26
+ recover = createPrincipalCurrentRecoveryBatch();
23
27
  batches.set(batch, recover);
24
28
  }
25
29
  return recover;
26
30
  };
27
31
  return (input) => queuePrincipalRecovery(runtime.infra.execSql, input.organizationId, () => runWithSecurityIncidentReporting(runtime.util.reportSecurityIncident, {
28
- objectId: input.reference.principalId,
32
+ objectId: input.reference?.principalId ?? input.organizationId,
29
33
  objectKind: "principal",
30
34
  operation: "principal.policy.recover",
31
35
  organizationId: input.organizationId,
@@ -40,12 +44,14 @@ export function createRuntimePrincipalPolicyResolver(runtime) {
40
44
  offline,
41
45
  organizationId: input.organizationId,
42
46
  protection,
43
- reference: input.reference,
44
47
  resolveTrustedUserIdentity: runtime.resolveTrustedUserIdentity,
45
48
  stillCurrent,
46
49
  };
47
- const result = await recoverWithPrincipalOutageFallback(recoverFor(input.recoveryBatch), options);
50
+ const result = input.reference
51
+ ? await recoverWithPrincipalLocalPreference(recoverFor(input.recoveryBatch).recover, { ...options, reference: input.reference }, input.preferLocalCurrent === true)
52
+ : await recoverFor(input.recoveryBatch).discover(options);
48
53
  return {
54
+ current: result.current,
49
55
  organizationId: input.organizationId,
50
56
  policy: result.policy,
51
57
  dependencies: result.dependencies,
@@ -1 +1 @@
1
- {"version":3,"file":"runtimePolicyRecovery.js","sourceRoot":"","sources":["runtimePolicyRecovery.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ApiClient } from \"@tearleads/api-client\";\nimport { KeyingVerificationError } from \"@tearleads/crypto\";\nimport { ProjectionDependencyUnavailableError } from \"../../data/keyingProjectionVerification/dependencyUnavailable\";\nimport { runWithSecurityIncidentReporting } from \"../../data/keyingProjectionVerification/error\";\nimport {\n assertProjectionVerificationCurrent,\n type ReferencedPrincipalPolicyWarmer,\n} from \"../../data/keyingProjectionVerification/types\";\nimport type { PrincipalHistoryProtectionLease } from \"../../data/principals/principalHistoryProtection\";\nimport { readPrincipalHistoryProtection } from \"../../data/principals/principalHistoryRuntime\";\nimport type { SecurityIncidentReporter } from \"../../data/securityIncidents\";\nimport type { ExecSql } from \"../../data/sqlite/sqlSchema\";\nimport type { TrustedUserIdentityResolver } from \"../../data/trustedUserIdentity\";\nimport {\n PrincipalHistoryRecoveryRaceError,\n PrincipalPolicyHistoryReadError,\n} from \"./principalHistoryRecoveryTypes\";\nimport { recoverWithPrincipalOutageFallback } from \"./principalRecoveryOutage\";\nimport { queuePrincipalRecovery } from \"./principalRecoveryQueue\";\nimport {\n createScopedPrincipalPolicyHistoryBatch,\n recoverScopedPrincipalPolicyHistory,\n} from \"./recoverScopedPrincipalPolicyHistory\";\n\nexport interface PrincipalPolicyRecoveryRuntime {\n readonly apiClient: Partial<\n Pick<\n ApiClient,\n \"getPrincipalPolicyPages\" | \"getProjectionPolicyHistoryPages\"\n >\n >;\n readonly infra: { readonly execSql: ExecSql };\n readonly state?: { readonly online: boolean } | undefined;\n readonly util: { readonly reportSecurityIncident: SecurityIncidentReporter };\n readonly resolveTrustedUserIdentity: TrustedUserIdentityResolver;\n readonly withPrincipalHistoryProtection?:\n | PrincipalHistoryProtectionLease\n | undefined;\n}\n\n/** Keep the private recovery key inside its runtime lease throughout verification. */\nexport function createRuntimePrincipalPolicyResolver(\n runtime: PrincipalPolicyRecoveryRuntime,\n): ReferencedPrincipalPolicyWarmer[\"resolveReference\"] {\n const lease = readPrincipalHistoryProtection(runtime);\n const readPages = runtime.apiClient.getPrincipalPolicyPages?.bind(\n runtime.apiClient,\n );\n if (!lease || !readPages) return undefined;\n const batches = new WeakMap<\n object,\n typeof recoverScopedPrincipalPolicyHistory\n >();\n const recoverFor = (batch: object | undefined) => {\n if (!batch) return recoverScopedPrincipalPolicyHistory;\n let recover = batches.get(batch);\n if (!recover) {\n recover = createScopedPrincipalPolicyHistoryBatch();\n batches.set(batch, recover);\n }\n return recover;\n };\n return (input) =>\n queuePrincipalRecovery(runtime.infra.execSql, input.organizationId, () =>\n runWithSecurityIncidentReporting(\n runtime.util.reportSecurityIncident,\n {\n objectId: input.reference.principalId,\n objectKind: \"principal\",\n operation: \"principal.policy.recover\",\n organizationId: input.organizationId,\n },\n () =>\n lease(async ({ protection, stillCurrent: leaseCurrent }) => {\n const stillCurrent = () =>\n leaseCurrent() && input.stillCurrent?.() !== false;\n assertProjectionVerificationCurrent(stillCurrent);\n const offline = runtime.state?.online === false;\n try {\n const options = {\n apiClient: { getPrincipalPolicyPages: readPages },\n execSql: runtime.infra.execSql,\n offline,\n organizationId: input.organizationId,\n protection,\n reference: input.reference,\n resolveTrustedUserIdentity: runtime.resolveTrustedUserIdentity,\n stillCurrent,\n };\n const result = await recoverWithPrincipalOutageFallback(\n recoverFor(input.recoveryBatch),\n options,\n );\n return {\n organizationId: input.organizationId,\n policy: result.policy,\n dependencies: result.dependencies,\n stillCurrent,\n };\n } catch (error) {\n assertProjectionVerificationCurrent(stillCurrent);\n if (\n error instanceof PrincipalPolicyHistoryReadError ||\n error instanceof PrincipalHistoryRecoveryRaceError ||\n (error instanceof KeyingVerificationError &&\n error.code === \"missing_dependency\")\n )\n throw new ProjectionDependencyUnavailableError(error.message);\n throw error;\n }\n }),\n ),\n );\n}\n"]}
1
+ {"version":3,"file":"runtimePolicyRecovery.js","sourceRoot":"","sources":["runtimePolicyRecovery.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ApiClient,\n PrincipalPolicyPageCurrent,\n} from \"@tearleads/api-client\";\nimport { KeyingVerificationError } from \"@tearleads/crypto\";\nimport { ProjectionDependencyUnavailableError } from \"../../data/keyingProjectionVerification/dependencyUnavailable\";\nimport { runWithSecurityIncidentReporting } from \"../../data/keyingProjectionVerification/error\";\nimport {\n assertProjectionVerificationCurrent,\n type PrincipalPolicyResolveRequest,\n type ReferencedPrincipalPolicyWarmer,\n type ResolvedPrincipalPolicyEvidence,\n} from \"../../data/keyingProjectionVerification/types\";\nimport type { PrincipalHistoryProtectionLease } from \"../../data/principals/principalHistoryProtection\";\nimport { readPrincipalHistoryProtection } from \"../../data/principals/principalHistoryRuntime\";\nimport type { SecurityIncidentReporter } from \"../../data/securityIncidents\";\nimport type { ExecSql } from \"../../data/sqlite/sqlSchema\";\nimport type { TrustedUserIdentityResolver } from \"../../data/trustedUserIdentity\";\nimport { createPrincipalCurrentRecoveryBatch } from \"./principalCurrentRecoveryBatch\";\nimport {\n PrincipalHistoryRecoveryRaceError,\n PrincipalPolicyHistoryReadError,\n} from \"./principalHistoryRecoveryTypes\";\nimport { recoverWithPrincipalLocalPreference } from \"./principalRecoveryLocalPreference\";\nimport { queuePrincipalRecovery } from \"./principalRecoveryQueue\";\n\nexport interface PrincipalPolicyRecoveryRuntime {\n readonly apiClient: Partial<\n Pick<\n ApiClient,\n \"getPrincipalPolicyPages\" | \"getProjectionPolicyHistoryPages\"\n >\n >;\n readonly infra: { readonly execSql: ExecSql };\n readonly state?: { readonly online: boolean } | undefined;\n readonly util: { readonly reportSecurityIncident: SecurityIncidentReporter };\n readonly resolveTrustedUserIdentity: TrustedUserIdentityResolver;\n readonly withPrincipalHistoryProtection?:\n | PrincipalHistoryProtectionLease\n | undefined;\n}\n\n/** Keep the private recovery key inside its runtime lease while resolving cited evidence. */\nexport function createRuntimePrincipalPolicyResolver(\n runtime: PrincipalPolicyRecoveryRuntime,\n): ReferencedPrincipalPolicyWarmer[\"resolveReference\"] {\n return createRuntimePrincipalPolicyCurrentResolver(runtime);\n}\n\nexport interface ResolvedPrincipalPolicyCurrent\n extends ResolvedPrincipalPolicyEvidence {\n readonly current: PrincipalPolicyPageCurrent;\n}\n\ninterface PrincipalPolicyCurrentRequest\n extends Omit<PrincipalPolicyResolveRequest, \"reference\"> {\n readonly reference?: PrincipalPolicyResolveRequest[\"reference\"] | undefined;\n /** A read-model caller has selected this exact signed head; not a freshness read. */\n readonly preferLocalCurrent?: boolean | undefined;\n}\n\n/** Keep current artifacts with their verified evidence and private runtime lifetime. */\nexport function createRuntimePrincipalPolicyCurrentResolver(\n runtime: PrincipalPolicyRecoveryRuntime,\n):\n | ((\n input: PrincipalPolicyCurrentRequest,\n ) => Promise<ResolvedPrincipalPolicyCurrent>)\n | undefined {\n const lease = readPrincipalHistoryProtection(runtime);\n const readPages = runtime.apiClient.getPrincipalPolicyPages?.bind(\n runtime.apiClient,\n );\n if (!lease || !readPages) return undefined;\n const batches = new WeakMap<\n object,\n ReturnType<typeof createPrincipalCurrentRecoveryBatch>\n >();\n const recoverFor = (batch: object | undefined) => {\n if (!batch) return createPrincipalCurrentRecoveryBatch();\n let recover = batches.get(batch);\n if (!recover) {\n recover = createPrincipalCurrentRecoveryBatch();\n batches.set(batch, recover);\n }\n return recover;\n };\n return (input) =>\n queuePrincipalRecovery(runtime.infra.execSql, input.organizationId, () =>\n runWithSecurityIncidentReporting(\n runtime.util.reportSecurityIncident,\n {\n objectId: input.reference?.principalId ?? input.organizationId,\n objectKind: \"principal\",\n operation: \"principal.policy.recover\",\n organizationId: input.organizationId,\n },\n () =>\n lease(async ({ protection, stillCurrent: leaseCurrent }) => {\n const stillCurrent = () =>\n leaseCurrent() && input.stillCurrent?.() !== false;\n assertProjectionVerificationCurrent(stillCurrent);\n const offline = runtime.state?.online === false;\n try {\n const options = {\n apiClient: { getPrincipalPolicyPages: readPages },\n execSql: runtime.infra.execSql,\n offline,\n organizationId: input.organizationId,\n protection,\n resolveTrustedUserIdentity: runtime.resolveTrustedUserIdentity,\n stillCurrent,\n };\n const result = input.reference\n ? await recoverWithPrincipalLocalPreference(\n recoverFor(input.recoveryBatch).recover,\n { ...options, reference: input.reference },\n input.preferLocalCurrent === true,\n )\n : await recoverFor(input.recoveryBatch).discover(options);\n return {\n current: result.current,\n organizationId: input.organizationId,\n policy: result.policy,\n dependencies: result.dependencies,\n stillCurrent,\n };\n } catch (error) {\n assertProjectionVerificationCurrent(stillCurrent);\n if (\n error instanceof PrincipalPolicyHistoryReadError ||\n error instanceof PrincipalHistoryRecoveryRaceError ||\n (error instanceof KeyingVerificationError &&\n error.code === \"missing_dependency\")\n )\n throw new ProjectionDependencyUnavailableError(error.message);\n throw error;\n }\n }),\n ),\n );\n}\n"]}