@tearleads/client-sdk 0.1.114 → 0.1.116

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 (80) hide show
  1. package/client/containerContents/documentDiscovery.js +5 -3
  2. package/client/containerContents/documentDiscovery.js.map +1 -1
  3. package/data/persistence/container-contents/containerRecoveryPersistence.js +152 -38
  4. package/data/persistence/container-contents/containerRecoveryPersistence.js.map +1 -1
  5. package/data/persistence/container-contents/documentContainerProjectionPersistence.js +47 -18
  6. package/data/persistence/container-contents/documentContainerProjectionPersistence.js.map +1 -1
  7. package/data/persistence/container-contents/documentPlacement.js +24 -5
  8. package/data/persistence/container-contents/documentPlacement.js.map +1 -1
  9. package/data/persistence/documents/containerDocumentTombstoneHoldsPersistence.js +1 -1
  10. package/data/persistence/documents/containerDocumentTombstoneHoldsPersistence.js.map +1 -1
  11. package/data/persistence/documents/documentDiscoveryEvidencePersistence.js +43 -35
  12. package/data/persistence/documents/documentDiscoveryEvidencePersistence.js.map +1 -1
  13. package/data/persistence/documents/documentsPersistence.js +4 -58
  14. package/data/persistence/documents/documentsPersistence.js.map +1 -1
  15. package/data/persistence/documents/internal/containerDocumentTombstoneHolds.js +15 -11
  16. package/data/persistence/documents/internal/containerDocumentTombstoneHolds.js.map +1 -1
  17. package/data/persistence/documents/internal/containerDocumentTombstones.js +87 -35
  18. package/data/persistence/documents/internal/containerDocumentTombstones.js.map +1 -1
  19. package/data/persistence/documents/internal/discoveredDocumentPlacement.js +5 -2
  20. package/data/persistence/documents/internal/discoveredDocumentPlacement.js.map +1 -1
  21. package/data/persistence/documents/internal/discoveredDocumentUpsert.js +174 -0
  22. package/data/persistence/documents/internal/discoveredDocumentUpsert.js.map +1 -0
  23. package/data/persistence/documents/internal/documentRows.js +96 -1
  24. package/data/persistence/documents/internal/documentRows.js.map +1 -1
  25. package/data/persistence/documents/internal/rowQueryPersistence.js +38 -20
  26. package/data/persistence/documents/internal/rowQueryPersistence.js.map +1 -1
  27. package/data/persistence/documents/records/documentRecordPersistence.d.ts +5 -0
  28. package/data/persistence/documents/records/documentRecordPersistence.js +41 -6
  29. package/data/persistence/documents/records/documentRecordPersistence.js.map +1 -1
  30. package/data/persistence/documents/records/index.d.ts +1 -1
  31. package/data/persistence/documents/records/index.js +1 -1
  32. package/data/persistence/documents/records/index.js.map +1 -1
  33. package/data/persistence/keyingCheckpoints/documentPurgeCheckpointPersistence.d.ts +2 -0
  34. package/data/persistence/keyingCheckpoints/documentPurgeCheckpointPersistence.js +17 -1
  35. package/data/persistence/keyingCheckpoints/documentPurgeCheckpointPersistence.js.map +1 -1
  36. package/internal/api-client/ApiClient.d.ts +118 -0
  37. package/internal/api-client/ApiClient.js +4 -0
  38. package/internal/api-client/ApiClient.js.map +1 -1
  39. package/internal/api-client/index.d.ts +1 -1
  40. package/internal/api-client/index.js.map +1 -1
  41. package/internal/api-client/principalPolicyPages.d.ts +15 -1
  42. package/internal/api-client/principalPolicyPages.js +48 -2
  43. package/internal/api-client/principalPolicyPages.js.map +1 -1
  44. package/internal/api-client/principalPolicyRequests.d.ts +118 -1
  45. package/internal/api-client/principalPolicyRequests.js +4 -1
  46. package/internal/api-client/principalPolicyRequests.js.map +1 -1
  47. package/internal/validators/operation/principalPolicyPageQuery.d.ts +9 -0
  48. package/internal/validators/operation/principalPolicyPageQuery.js +10 -0
  49. package/internal/validators/operation/principalPolicyPageQuery.js.map +1 -1
  50. package/internal/validators/operation/principals.d.ts +37 -4
  51. package/internal/validators/operation/principals.js +5 -3
  52. package/internal/validators/operation/principals.js.map +1 -1
  53. package/internal/validators/response/index.d.ts +1 -1
  54. package/internal/validators/response/index.js +1 -1
  55. package/internal/validators/response/index.js.map +1 -1
  56. package/internal/validators/response/principalPolicyPage.d.ts +497 -1
  57. package/internal/validators/response/principalPolicyPage.js +18 -0
  58. package/internal/validators/response/principalPolicyPage.js.map +1 -1
  59. package/package.json +1 -1
  60. package/workflows/container-contents/documentLinks/index.d.ts +4 -0
  61. package/workflows/container-contents/documentLinks/index.js +10 -3
  62. package/workflows/container-contents/documentLinks/index.js.map +1 -1
  63. package/workflows/container-contents/remoteHydration/remoteContainers/remoteContainerPageHydration.js +7 -2
  64. package/workflows/container-contents/remoteHydration/remoteContainers/remoteContainerPageHydration.js.map +1 -1
  65. package/workflows/container-contents/remoteReset/containerRemoteReset.js +12 -7
  66. package/workflows/container-contents/remoteReset/containerRemoteReset.js.map +1 -1
  67. package/workflows/container-contents/tombstones/documentTombstoneEvidence.js +6 -5
  68. package/workflows/container-contents/tombstones/documentTombstoneEvidence.js.map +1 -1
  69. package/workflows/documents/remoteReset/documentRemoteReset.js +31 -18
  70. package/workflows/documents/remoteReset/documentRemoteReset.js.map +1 -1
  71. package/workflows/principals/principalPolicyHistoryReader.d.ts +6 -1
  72. package/workflows/principals/principalPolicyHistoryReader.js +4 -1
  73. package/workflows/principals/principalPolicyHistoryReader.js.map +1 -1
  74. package/workflows/principals/recoveryOperation/principalRecoveryDirectory.js +108 -59
  75. package/workflows/principals/recoveryOperation/principalRecoveryDirectory.js.map +1 -1
  76. package/workflows/principals/runtimePolicyRecovery.js +26 -14
  77. package/workflows/principals/runtimePolicyRecovery.js.map +1 -1
  78. package/workflows/principals/runtimePolicyWarmer.d.ts +26 -0
  79. package/workflows/principals/runtimePolicyWarmer.js +8 -5
  80. package/workflows/principals/runtimePolicyWarmer.js.map +1 -1
@@ -1,6 +1,7 @@
1
1
  import { KeyingVerificationError } from "../../../internal/crypto/index.js";
2
- import { eq } from "drizzle-orm";
2
+ import { eq, inArray } from "drizzle-orm";
3
3
  import { documentPurgeCheckpoints, keyingCheckpointTables, } from "../../sqlite/schema/index.js";
4
+ import { sqliteRowsPerStatement } from "../../sqlite/sqliteBindBudget.js";
4
5
  import { getClientSQLitePersistenceRuntime } from "../../sqlite/sqlitePersistenceRuntime.js";
5
6
  import { ensureSqlTables } from "../../sqlite/sqlSchema.js";
6
7
  export async function loadDocumentPurgeCheckpoint(execSql, documentId) {
@@ -26,6 +27,21 @@ export async function hasDocumentPurgeCheckpointInTransaction(tx, documentId) {
26
27
  .limit(1);
27
28
  return row !== undefined;
28
29
  }
30
+ /** The document ids among `documentIds` that carry a purge checkpoint. */
31
+ export async function listPurgedDocumentIdsInTransaction(tx, documentIds) {
32
+ const purged = new Set();
33
+ const unique = Array.from(new Set(documentIds));
34
+ const chunkSize = sqliteRowsPerStatement(1);
35
+ for (let offset = 0; offset < unique.length; offset += chunkSize) {
36
+ const rows = await tx
37
+ .select({ documentId: documentPurgeCheckpoints.documentId })
38
+ .from(documentPurgeCheckpoints)
39
+ .where(inArray(documentPurgeCheckpoints.documentId, unique.slice(offset, offset + chunkSize)));
40
+ for (const row of rows)
41
+ purged.add(row.documentId);
42
+ }
43
+ return purged;
44
+ }
29
45
  export async function storeDocumentPurgeCheckpointInTransaction(tx, checkpoint, updatedAt) {
30
46
  const [stored] = await tx
31
47
  .select({
@@ -1 +1 @@
1
- {"version":3,"file":"documentPurgeCheckpointPersistence.js","sourceRoot":"","sources":["documentPurgeCheckpointPersistence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EACL,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,iCAAiC,EAAE,MAAM,uCAAuC,CAAC;AAC1F,OAAO,EAAgB,eAAe,EAAE,MAAM,wBAAwB,CAAC;AASvE,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,OAAgB,EAChB,UAAkB;IAElB,MAAM,eAAe,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;IACvD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,iCAAiC,CAAC,OAAO,CAAC;SAC3D,EAAE,CAAC,MAAM,CAAC;QACT,UAAU,EAAE,wBAAwB,CAAC,UAAU;QAC/C,oBAAoB,EAAE,wBAAwB,CAAC,oBAAoB;QACnE,cAAc,EAAE,wBAAwB,CAAC,cAAc;QACvD,cAAc,EAAE,wBAAwB,CAAC,cAAc;KACxD,CAAC;SACD,IAAI,CAAC,wBAAwB,CAAC;SAC9B,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;SAC1D,KAAK,CAAC,CAAC,CAAC,CAAC;IACZ,OAAO,GAAG,IAAI,IAAI,CAAC;AACrB,CAAC;AAED,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,uCAAuC,CAC3D,EAAgC,EAChC,UAAkB;IAElB,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE;SACnB,MAAM,CAAC,EAAE,UAAU,EAAE,wBAAwB,CAAC,UAAU,EAAE,CAAC;SAC3D,IAAI,CAAC,wBAAwB,CAAC;SAC9B,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;SAC1D,KAAK,CAAC,CAAC,CAAC,CAAC;IACZ,OAAO,GAAG,KAAK,SAAS,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yCAAyC,CAC7D,EAAgC,EAChC,UAAmC,EACnC,SAAiB;IAEjB,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE;SACtB,MAAM,CAAC;QACN,oBAAoB,EAAE,wBAAwB,CAAC,oBAAoB;QACnE,cAAc,EAAE,wBAAwB,CAAC,cAAc;QACvD,cAAc,EAAE,wBAAwB,CAAC,cAAc;KACxD,CAAC;SACD,IAAI,CAAC,wBAAwB,CAAC;SAC9B,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAAC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;SACrE,KAAK,CAAC,CAAC,CAAC,CAAC;IACZ,IAAI,MAAM,EAAE,CAAC;QACX,IACE,MAAM,CAAC,oBAAoB,KAAK,UAAU,CAAC,oBAAoB;YAC/D,MAAM,CAAC,cAAc,KAAK,UAAU,CAAC,cAAc;YACnD,MAAM,CAAC,cAAc,KAAK,UAAU,CAAC,cAAc,EACnD,CAAC;YACD,MAAM,IAAI,uBAAuB,CAC/B,cAAc,EACd,sEAAsE,CACvE,CAAC;QACJ,CAAC;QACD,OAAO;IACT,CAAC;IACD,MAAM,EAAE;SACL,MAAM,CAAC,wBAAwB,CAAC;SAChC,MAAM,CAAC,EAAE,GAAG,UAAU,EAAE,SAAS,EAAE,CAAC;SACpC,GAAG,EAAE,CAAC;AACX,CAAC","sourcesContent":["import { KeyingVerificationError } from \"@tearleads/crypto\";\nimport { eq } from \"drizzle-orm\";\nimport {\n documentPurgeCheckpoints,\n keyingCheckpointTables,\n} from \"../../sqlite/schema\";\nimport type { ClientSQLiteTransactionScope } from \"../../sqlite/sqlitePersistenceRuntime\";\nimport { getClientSQLitePersistenceRuntime } from \"../../sqlite/sqlitePersistenceRuntime\";\nimport { type ExecSql, ensureSqlTables } from \"../../sqlite/sqlSchema\";\n\nexport interface DocumentPurgeCheckpoint {\n readonly documentId: string;\n readonly documentManifestHash: string;\n readonly organizationId: string;\n readonly purgeEventHash: string;\n}\n\nexport async function loadDocumentPurgeCheckpoint(\n execSql: ExecSql,\n documentId: string,\n): Promise<DocumentPurgeCheckpoint | null> {\n await ensureSqlTables(execSql, keyingCheckpointTables);\n const [row] = await getClientSQLitePersistenceRuntime(execSql)\n .db.select({\n documentId: documentPurgeCheckpoints.documentId,\n documentManifestHash: documentPurgeCheckpoints.documentManifestHash,\n organizationId: documentPurgeCheckpoints.organizationId,\n purgeEventHash: documentPurgeCheckpoints.purgeEventHash,\n })\n .from(documentPurgeCheckpoints)\n .where(eq(documentPurgeCheckpoints.documentId, documentId))\n .limit(1);\n return row ?? null;\n}\n\n/** Whether the document was permanently purged, read in the caller's transaction. */\nexport async function hasDocumentPurgeCheckpointInTransaction(\n tx: ClientSQLiteTransactionScope,\n documentId: string,\n): Promise<boolean> {\n const [row] = await tx\n .select({ documentId: documentPurgeCheckpoints.documentId })\n .from(documentPurgeCheckpoints)\n .where(eq(documentPurgeCheckpoints.documentId, documentId))\n .limit(1);\n return row !== undefined;\n}\n\nexport async function storeDocumentPurgeCheckpointInTransaction(\n tx: ClientSQLiteTransactionScope,\n checkpoint: DocumentPurgeCheckpoint,\n updatedAt: string,\n): Promise<void> {\n const [stored] = await tx\n .select({\n documentManifestHash: documentPurgeCheckpoints.documentManifestHash,\n organizationId: documentPurgeCheckpoints.organizationId,\n purgeEventHash: documentPurgeCheckpoints.purgeEventHash,\n })\n .from(documentPurgeCheckpoints)\n .where(eq(documentPurgeCheckpoints.documentId, checkpoint.documentId))\n .limit(1);\n if (stored) {\n if (\n stored.documentManifestHash !== checkpoint.documentManifestHash ||\n stored.organizationId !== checkpoint.organizationId ||\n stored.purgeEventHash !== checkpoint.purgeEventHash\n ) {\n throw new KeyingVerificationError(\n \"equivocation\",\n \"Document purge checkpoint conflicts with the verified terminal event\",\n );\n }\n return;\n }\n await tx\n .insert(documentPurgeCheckpoints)\n .values({ ...checkpoint, updatedAt })\n .run();\n}\n"]}
1
+ {"version":3,"file":"documentPurgeCheckpointPersistence.js","sourceRoot":"","sources":["documentPurgeCheckpointPersistence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACL,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,OAAO,EAAE,iCAAiC,EAAE,MAAM,uCAAuC,CAAC;AAC1F,OAAO,EAAgB,eAAe,EAAE,MAAM,wBAAwB,CAAC;AASvE,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,OAAgB,EAChB,UAAkB;IAElB,MAAM,eAAe,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;IACvD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,iCAAiC,CAAC,OAAO,CAAC;SAC3D,EAAE,CAAC,MAAM,CAAC;QACT,UAAU,EAAE,wBAAwB,CAAC,UAAU;QAC/C,oBAAoB,EAAE,wBAAwB,CAAC,oBAAoB;QACnE,cAAc,EAAE,wBAAwB,CAAC,cAAc;QACvD,cAAc,EAAE,wBAAwB,CAAC,cAAc;KACxD,CAAC;SACD,IAAI,CAAC,wBAAwB,CAAC;SAC9B,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;SAC1D,KAAK,CAAC,CAAC,CAAC,CAAC;IACZ,OAAO,GAAG,IAAI,IAAI,CAAC;AACrB,CAAC;AAED,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,uCAAuC,CAC3D,EAAgC,EAChC,UAAkB;IAElB,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE;SACnB,MAAM,CAAC,EAAE,UAAU,EAAE,wBAAwB,CAAC,UAAU,EAAE,CAAC;SAC3D,IAAI,CAAC,wBAAwB,CAAC;SAC9B,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;SAC1D,KAAK,CAAC,CAAC,CAAC,CAAC;IACZ,OAAO,GAAG,KAAK,SAAS,CAAC;AAC3B,CAAC;AAED,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACtD,EAAgC,EAChC,WAAkC;IAElC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAC5C,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,SAAS,EAAE,CAAC;QACjE,MAAM,IAAI,GAAG,MAAM,EAAE;aAClB,MAAM,CAAC,EAAE,UAAU,EAAE,wBAAwB,CAAC,UAAU,EAAE,CAAC;aAC3D,IAAI,CAAC,wBAAwB,CAAC;aAC9B,KAAK,CACJ,OAAO,CACL,wBAAwB,CAAC,UAAU,EACnC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CACzC,CACF,CAAC;QACJ,KAAK,MAAM,GAAG,IAAI,IAAI;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yCAAyC,CAC7D,EAAgC,EAChC,UAAmC,EACnC,SAAiB;IAEjB,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE;SACtB,MAAM,CAAC;QACN,oBAAoB,EAAE,wBAAwB,CAAC,oBAAoB;QACnE,cAAc,EAAE,wBAAwB,CAAC,cAAc;QACvD,cAAc,EAAE,wBAAwB,CAAC,cAAc;KACxD,CAAC;SACD,IAAI,CAAC,wBAAwB,CAAC;SAC9B,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAAC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;SACrE,KAAK,CAAC,CAAC,CAAC,CAAC;IACZ,IAAI,MAAM,EAAE,CAAC;QACX,IACE,MAAM,CAAC,oBAAoB,KAAK,UAAU,CAAC,oBAAoB;YAC/D,MAAM,CAAC,cAAc,KAAK,UAAU,CAAC,cAAc;YACnD,MAAM,CAAC,cAAc,KAAK,UAAU,CAAC,cAAc,EACnD,CAAC;YACD,MAAM,IAAI,uBAAuB,CAC/B,cAAc,EACd,sEAAsE,CACvE,CAAC;QACJ,CAAC;QACD,OAAO;IACT,CAAC;IACD,MAAM,EAAE;SACL,MAAM,CAAC,wBAAwB,CAAC;SAChC,MAAM,CAAC,EAAE,GAAG,UAAU,EAAE,SAAS,EAAE,CAAC;SACpC,GAAG,EAAE,CAAC;AACX,CAAC","sourcesContent":["import { KeyingVerificationError } from \"@tearleads/crypto\";\nimport { eq, inArray } from \"drizzle-orm\";\nimport {\n documentPurgeCheckpoints,\n keyingCheckpointTables,\n} from \"../../sqlite/schema\";\nimport { sqliteRowsPerStatement } from \"../../sqlite/sqliteBindBudget\";\nimport type { ClientSQLiteTransactionScope } from \"../../sqlite/sqlitePersistenceRuntime\";\nimport { getClientSQLitePersistenceRuntime } from \"../../sqlite/sqlitePersistenceRuntime\";\nimport { type ExecSql, ensureSqlTables } from \"../../sqlite/sqlSchema\";\n\nexport interface DocumentPurgeCheckpoint {\n readonly documentId: string;\n readonly documentManifestHash: string;\n readonly organizationId: string;\n readonly purgeEventHash: string;\n}\n\nexport async function loadDocumentPurgeCheckpoint(\n execSql: ExecSql,\n documentId: string,\n): Promise<DocumentPurgeCheckpoint | null> {\n await ensureSqlTables(execSql, keyingCheckpointTables);\n const [row] = await getClientSQLitePersistenceRuntime(execSql)\n .db.select({\n documentId: documentPurgeCheckpoints.documentId,\n documentManifestHash: documentPurgeCheckpoints.documentManifestHash,\n organizationId: documentPurgeCheckpoints.organizationId,\n purgeEventHash: documentPurgeCheckpoints.purgeEventHash,\n })\n .from(documentPurgeCheckpoints)\n .where(eq(documentPurgeCheckpoints.documentId, documentId))\n .limit(1);\n return row ?? null;\n}\n\n/** Whether the document was permanently purged, read in the caller's transaction. */\nexport async function hasDocumentPurgeCheckpointInTransaction(\n tx: ClientSQLiteTransactionScope,\n documentId: string,\n): Promise<boolean> {\n const [row] = await tx\n .select({ documentId: documentPurgeCheckpoints.documentId })\n .from(documentPurgeCheckpoints)\n .where(eq(documentPurgeCheckpoints.documentId, documentId))\n .limit(1);\n return row !== undefined;\n}\n\n/** The document ids among `documentIds` that carry a purge checkpoint. */\nexport async function listPurgedDocumentIdsInTransaction(\n tx: ClientSQLiteTransactionScope,\n documentIds: ReadonlyArray<string>,\n): Promise<Set<string>> {\n const purged = new Set<string>();\n const unique = Array.from(new Set(documentIds));\n const chunkSize = sqliteRowsPerStatement(1);\n for (let offset = 0; offset < unique.length; offset += chunkSize) {\n const rows = await tx\n .select({ documentId: documentPurgeCheckpoints.documentId })\n .from(documentPurgeCheckpoints)\n .where(\n inArray(\n documentPurgeCheckpoints.documentId,\n unique.slice(offset, offset + chunkSize),\n ),\n );\n for (const row of rows) purged.add(row.documentId);\n }\n return purged;\n}\n\nexport async function storeDocumentPurgeCheckpointInTransaction(\n tx: ClientSQLiteTransactionScope,\n checkpoint: DocumentPurgeCheckpoint,\n updatedAt: string,\n): Promise<void> {\n const [stored] = await tx\n .select({\n documentManifestHash: documentPurgeCheckpoints.documentManifestHash,\n organizationId: documentPurgeCheckpoints.organizationId,\n purgeEventHash: documentPurgeCheckpoints.purgeEventHash,\n })\n .from(documentPurgeCheckpoints)\n .where(eq(documentPurgeCheckpoints.documentId, checkpoint.documentId))\n .limit(1);\n if (stored) {\n if (\n stored.documentManifestHash !== checkpoint.documentManifestHash ||\n stored.organizationId !== checkpoint.organizationId ||\n stored.purgeEventHash !== checkpoint.purgeEventHash\n ) {\n throw new KeyingVerificationError(\n \"equivocation\",\n \"Document purge checkpoint conflicts with the verified terminal event\",\n );\n }\n return;\n }\n await tx\n .insert(documentPurgeCheckpoints)\n .values({ ...checkpoint, updatedAt })\n .run();\n}\n"]}
@@ -1134,6 +1134,124 @@ export declare class ApiClient {
1134
1134
  version: number;
1135
1135
  };
1136
1136
  }>, void, any>;
1137
+ /** Unpinned discovery; `ifHead` asks for a bare head when it is still live. */
1138
+ getPrincipalPolicyDiscovery(...args: Parameters<PrincipalPolicyRequests["discover"]>): Promise<RequestResult<{
1139
+ previousStates: {
1140
+ grants: {
1141
+ accessLevel: "admin" | "read" | "write";
1142
+ containerId: string;
1143
+ }[];
1144
+ projection: {
1145
+ role: "member" | "admin";
1146
+ userId: string;
1147
+ }[];
1148
+ state: {
1149
+ createdAt: string;
1150
+ encapsulationPublicKey: string;
1151
+ externalAuthority: {
1152
+ keyEpoch: number;
1153
+ keyFingerprint: string;
1154
+ principalId: string;
1155
+ principalType: "group";
1156
+ stateHash: string;
1157
+ version: number;
1158
+ } | null;
1159
+ grantCount: number;
1160
+ grantRoot: string;
1161
+ keyEpoch: number;
1162
+ keyFingerprint: string;
1163
+ memberCount: number;
1164
+ memberEnvelopesRoot: string;
1165
+ membershipMode: "projection";
1166
+ membershipRoot: string;
1167
+ payloadCiphertextHash: string;
1168
+ prevStateHash: string | null;
1169
+ principalId: string;
1170
+ principalType: "group" | "organization";
1171
+ projectionRoot: string;
1172
+ signature: string;
1173
+ signedAt: string;
1174
+ signerUserId: string;
1175
+ signerUserKeyFingerprint: string;
1176
+ stateHash: string;
1177
+ version: number;
1178
+ };
1179
+ }[];
1180
+ historyPage: {
1181
+ afterVersion: number;
1182
+ nextAfterVersion: number | null;
1183
+ };
1184
+ currentGrants: {
1185
+ accessLevel: "admin" | "read" | "write";
1186
+ containerId: string;
1187
+ }[];
1188
+ currentMemberEnvelopes: {
1189
+ envelopes: {
1190
+ kemCipherText: string;
1191
+ memberKeyFingerprint: string;
1192
+ userId: string;
1193
+ wrappedKey: string;
1194
+ }[];
1195
+ epoch: number;
1196
+ principalId: string;
1197
+ principalType: "group" | "organization";
1198
+ stateHash: string;
1199
+ };
1200
+ currentPayload: {
1201
+ cipherSuite: "aes-256-gcm";
1202
+ ciphertext: string;
1203
+ ciphertextHash: string;
1204
+ createdAt: string;
1205
+ principalId: string;
1206
+ principalType: "group" | "organization";
1207
+ stateHash: string;
1208
+ };
1209
+ currentProjection: {
1210
+ role: "member" | "admin";
1211
+ userId: string;
1212
+ }[];
1213
+ currentState: {
1214
+ createdAt: string;
1215
+ encapsulationPublicKey: string;
1216
+ externalAuthority: {
1217
+ keyEpoch: number;
1218
+ keyFingerprint: string;
1219
+ principalId: string;
1220
+ principalType: "group";
1221
+ stateHash: string;
1222
+ version: number;
1223
+ } | null;
1224
+ grantCount: number;
1225
+ grantRoot: string;
1226
+ keyEpoch: number;
1227
+ keyFingerprint: string;
1228
+ memberCount: number;
1229
+ memberEnvelopesRoot: string;
1230
+ membershipMode: "projection";
1231
+ membershipRoot: string;
1232
+ payloadCiphertextHash: string;
1233
+ prevStateHash: string | null;
1234
+ principalId: string;
1235
+ principalType: "group" | "organization";
1236
+ projectionRoot: string;
1237
+ signature: string;
1238
+ signedAt: string;
1239
+ signerUserId: string;
1240
+ signerUserKeyFingerprint: string;
1241
+ stateHash: string;
1242
+ version: number;
1243
+ };
1244
+ } | {
1245
+ unchanged: true;
1246
+ head: {
1247
+ keyEpoch: number;
1248
+ keyFingerprint: string;
1249
+ principalId: string;
1250
+ principalType: "group" | "organization";
1251
+ stateHash: string;
1252
+ version: number;
1253
+ };
1254
+ }>>;
1137
1255
  getProjectionPolicyHistoryPages(...args: Parameters<PrincipalPolicyRequests["publicPages"]>): AsyncGenerator<RequestResult<{
1138
1256
  currentGrants: {
1139
1257
  accessLevel: "admin" | "read" | "write";
@@ -271,6 +271,10 @@ export class ApiClient {
271
271
  getPrincipalPolicyPages(principalType, principalId, options = {}) {
272
272
  return this.principalPolicyRequests.pages(principalType, principalId, options);
273
273
  }
274
+ /** Unpinned discovery; `ifHead` asks for a bare head when it is still live. */
275
+ getPrincipalPolicyDiscovery(...args) {
276
+ return this.principalPolicyRequests.discover(...args);
277
+ }
274
278
  getProjectionPolicyHistoryPages(...args) {
275
279
  return this.principalPolicyRequests.publicPages(...args);
276
280
  }