@keyneom/sync-kit 0.1.0 → 0.1.1

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.
package/README.md CHANGED
@@ -9,7 +9,9 @@ lifecycle policy.
9
9
 
10
10
  ## Status
11
11
 
12
- Version `0.1.0` is implemented and configured as a public MIT-licensed package.
12
+ Version `0.1.0` was published to npm on 2026-06-30. Current source version
13
+ `0.1.1` removes application-specific runtime presets and keeps compatibility
14
+ profiles consumer-owned.
13
15
 
14
16
  The tests in this repository cover frozen compatibility vectors, mocked
15
17
  browser providers, package orchestration, and installation/imports from the
@@ -33,8 +35,9 @@ The package has no runtime dependencies and is ESM-only.
33
35
 
34
36
  ```ts
35
37
  import {
36
- easyBcV1Profile,
37
- familyChoresV1Profile,
38
+ createV1EnvelopeCrypto,
39
+ createWebCryptoBackend,
40
+ defineV1CompatibilityProfile,
38
41
  } from "@keyneom/sync-kit/crypto";
39
42
  import { createSnapshotSync } from "@keyneom/sync-kit/snapshot";
40
43
  import { createWebPasskeyProvider } from "@keyneom/sync-kit/keys/web-passkey";
@@ -45,6 +48,38 @@ import {
45
48
  } from "@keyneom/sync-kit/stores/google-drive";
46
49
  ```
47
50
 
51
+ Applications define their own profile:
52
+
53
+ ```ts
54
+ const profile = defineV1CompatibilityProfile({
55
+ appId: "my-notes",
56
+ filename: "my-notes-sync-v1.json",
57
+ aad: "my-notes-sync-envelope-v1",
58
+ hkdfInfo: "my-notes-content-key-v1",
59
+ compression: "gzip-if-smaller",
60
+ passkey: {
61
+ rpName: "My Notes",
62
+ userName: "encrypted-sync",
63
+ userDisplayName: "My Notes encrypted sync",
64
+ algorithm: -7,
65
+ residentKey: "required",
66
+ userVerification: "required",
67
+ timeoutMs: 60_000,
68
+ },
69
+ });
70
+
71
+ const envelopeCrypto = createV1EnvelopeCrypto(
72
+ profile,
73
+ appCodec,
74
+ createWebCryptoBackend(),
75
+ );
76
+ ```
77
+
78
+ The package does not export profiles for EasyBC, Family Chores, or any other
79
+ consumer. Profile values are application configuration. Application data
80
+ models, parsing, migration, merge, and fingerprints remain in `appCodec`, so a
81
+ model change does not require a `sync-kit` release.
82
+
48
83
  Available exports:
49
84
 
50
85
  - `/core` — provider contracts and standardized errors
@@ -116,8 +151,8 @@ See [native consumer guidance](docs/native-consumers.md) and the exact
116
151
 
117
152
  ## Compatibility and isolation
118
153
 
119
- The explicit profiles preserve both applications' v1 filenames, AAD, HKDF
120
- labels, compression behavior, and passkey names. V1 readers remain separate
154
+ Each application owns the profile that preserves its filename, AAD, HKDF
155
+ label, compression behavior, and passkey names. V1 readers remain separate
121
156
  because their cryptographic contexts are intentionally incompatible.
122
157
 
123
158
  The Drive snapshot wrapper rejects the wrong `appId` before making a request.
@@ -24,50 +24,10 @@ export type V1CompatibilityProfile = {
24
24
  tagBits: 128;
25
25
  passkey: PasskeyProfile;
26
26
  };
27
- export declare const easyBcV1Profile: {
28
- readonly appId: "easy-bc";
29
- readonly filename: "easybc-sync-v1.json";
30
- readonly aad: "easy-bc-sync-envelope-v1";
31
- readonly hkdfInfo: "easy-bc-cloud-content-key-v1";
32
- readonly algorithm: "AES-256-GCM+HKDF-SHA-256";
33
- readonly readVersions: readonly [1];
34
- readonly writeVersion: 1;
35
- readonly compression: "gzip-if-smaller";
36
- readonly nonceBytes: 12;
37
- readonly kdfSaltBytes: 32;
38
- readonly prfInputBytes: 32;
39
- readonly tagBits: 128;
40
- readonly passkey: {
41
- readonly rpName: "EasyBC";
42
- readonly userName: "encrypted-sync";
43
- readonly userDisplayName: "EasyBC encrypted sync";
44
- readonly algorithm: -7;
45
- readonly residentKey: "required";
46
- readonly userVerification: "required";
47
- readonly timeoutMs: 60000;
48
- };
49
- };
50
- export declare const familyChoresV1Profile: {
51
- readonly appId: "family-chores";
52
- readonly filename: "family-chores-sync-v1.json";
53
- readonly aad: "family-chores-sync-envelope-v1";
54
- readonly hkdfInfo: "family-chores-cloud-content-key-v1";
55
- readonly algorithm: "AES-256-GCM+HKDF-SHA-256";
56
- readonly readVersions: readonly [1];
57
- readonly writeVersion: 1;
58
- readonly compression: "none";
59
- readonly nonceBytes: 12;
60
- readonly kdfSaltBytes: 32;
61
- readonly prfInputBytes: 32;
62
- readonly tagBits: 128;
63
- readonly passkey: {
64
- readonly rpName: "Family Chores";
65
- readonly userName: "encrypted-sync";
66
- readonly userDisplayName: "Family Chores encrypted sync";
67
- readonly algorithm: -7;
68
- readonly residentKey: "required";
69
- readonly userVerification: "required";
70
- readonly timeoutMs: 60000;
71
- };
72
- };
27
+ export type V1CompatibilityProfileInput = Pick<V1CompatibilityProfile, "appId" | "filename" | "aad" | "hkdfInfo" | "compression" | "passkey">;
28
+ /**
29
+ * Creates a consumer-owned v1 profile while fixing protocol-level constants.
30
+ * Application profiles are configuration, not package presets.
31
+ */
32
+ export declare function defineV1CompatibilityProfile(input: V1CompatibilityProfileInput): Readonly<V1CompatibilityProfile>;
73
33
  //# sourceMappingURL=profiles.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/crypto/profiles.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,EAAG,0BAAmC,CAAC;AAEhE,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,iBAAiB,CAAC;AAEvD,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,CAAC,CAAC,CAAC;IACd,WAAW,EAAE,UAAU,CAAC;IACxB,gBAAgB,EAAE,UAAU,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,YAAY,CAAC;IAC/B,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3B,YAAY,EAAE,CAAC,CAAC;IAChB,WAAW,EAAE,aAAa,CAAC;IAC3B,UAAU,EAAE,EAAE,CAAC;IACf,YAAY,EAAE,EAAE,CAAC;IACjB,aAAa,EAAE,EAAE,CAAC;IAClB,OAAO,EAAE,GAAG,CAAC;IACb,OAAO,EAAE,cAAc,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;CAsBe,CAAC;AAE5C,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;CAsBS,CAAC"}
1
+ {"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/crypto/profiles.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,EAAG,0BAAmC,CAAC;AAEhE,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,iBAAiB,CAAC;AAEvD,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,CAAC,CAAC,CAAC;IACd,WAAW,EAAE,UAAU,CAAC;IACxB,gBAAgB,EAAE,UAAU,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,YAAY,CAAC;IAC/B,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3B,YAAY,EAAE,CAAC,CAAC;IAChB,WAAW,EAAE,aAAa,CAAC;IAC3B,UAAU,EAAE,EAAE,CAAC;IACf,YAAY,EAAE,EAAE,CAAC;IACjB,aAAa,EAAE,EAAE,CAAC;IAClB,OAAO,EAAE,GAAG,CAAC;IACb,OAAO,EAAE,cAAc,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAC5C,sBAAsB,EACtB,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,UAAU,GAAG,aAAa,GAAG,SAAS,CACtE,CAAC;AAEF;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,2BAA2B,GACjC,QAAQ,CAAC,sBAAsB,CAAC,CA6BlC"}
@@ -1,48 +1,35 @@
1
1
  export const V1_ALGORITHM = "AES-256-GCM+HKDF-SHA-256";
2
- export const easyBcV1Profile = {
3
- appId: "easy-bc",
4
- filename: "easybc-sync-v1.json",
5
- aad: "easy-bc-sync-envelope-v1",
6
- hkdfInfo: "easy-bc-cloud-content-key-v1",
7
- algorithm: V1_ALGORITHM,
8
- readVersions: [1],
9
- writeVersion: 1,
10
- compression: "gzip-if-smaller",
11
- nonceBytes: 12,
12
- kdfSaltBytes: 32,
13
- prfInputBytes: 32,
14
- tagBits: 128,
15
- passkey: {
16
- rpName: "EasyBC",
17
- userName: "encrypted-sync",
18
- userDisplayName: "EasyBC encrypted sync",
19
- algorithm: -7,
20
- residentKey: "required",
21
- userVerification: "required",
22
- timeoutMs: 60_000,
23
- },
24
- };
25
- export const familyChoresV1Profile = {
26
- appId: "family-chores",
27
- filename: "family-chores-sync-v1.json",
28
- aad: "family-chores-sync-envelope-v1",
29
- hkdfInfo: "family-chores-cloud-content-key-v1",
30
- algorithm: V1_ALGORITHM,
31
- readVersions: [1],
32
- writeVersion: 1,
33
- compression: "none",
34
- nonceBytes: 12,
35
- kdfSaltBytes: 32,
36
- prfInputBytes: 32,
37
- tagBits: 128,
38
- passkey: {
39
- rpName: "Family Chores",
40
- userName: "encrypted-sync",
41
- userDisplayName: "Family Chores encrypted sync",
42
- algorithm: -7,
43
- residentKey: "required",
44
- userVerification: "required",
45
- timeoutMs: 60_000,
46
- },
47
- };
2
+ /**
3
+ * Creates a consumer-owned v1 profile while fixing protocol-level constants.
4
+ * Application profiles are configuration, not package presets.
5
+ */
6
+ export function defineV1CompatibilityProfile(input) {
7
+ for (const [name, value] of Object.entries({
8
+ appId: input.appId,
9
+ filename: input.filename,
10
+ aad: input.aad,
11
+ hkdfInfo: input.hkdfInfo,
12
+ rpName: input.passkey.rpName,
13
+ userName: input.passkey.userName,
14
+ userDisplayName: input.passkey.userDisplayName,
15
+ })) {
16
+ if (!value.trim())
17
+ throw new TypeError(`${name} must not be empty.`);
18
+ }
19
+ if (!Number.isFinite(input.passkey.timeoutMs) ||
20
+ input.passkey.timeoutMs <= 0) {
21
+ throw new TypeError("passkey.timeoutMs must be positive.");
22
+ }
23
+ return Object.freeze({
24
+ ...input,
25
+ passkey: Object.freeze({ ...input.passkey }),
26
+ algorithm: V1_ALGORITHM,
27
+ readVersions: [1],
28
+ writeVersion: 1,
29
+ nonceBytes: 12,
30
+ kdfSaltBytes: 32,
31
+ prfInputBytes: 32,
32
+ tagBits: 128,
33
+ });
34
+ }
48
35
  //# sourceMappingURL=profiles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/crypto/profiles.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,0BAAmC,CAAC;AA8BhE,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,KAAK,EAAE,SAAS;IAChB,QAAQ,EAAE,qBAAqB;IAC/B,GAAG,EAAE,0BAA0B;IAC/B,QAAQ,EAAE,8BAA8B;IACxC,SAAS,EAAE,YAAY;IACvB,YAAY,EAAE,CAAC,CAAC,CAAC;IACjB,YAAY,EAAE,CAAC;IACf,WAAW,EAAE,iBAAiB;IAC9B,UAAU,EAAE,EAAE;IACd,YAAY,EAAE,EAAE;IAChB,aAAa,EAAE,EAAE;IACjB,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE;QACP,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,gBAAgB;QAC1B,eAAe,EAAE,uBAAuB;QACxC,SAAS,EAAE,CAAC,CAAC;QACb,WAAW,EAAE,UAAU;QACvB,gBAAgB,EAAE,UAAU;QAC5B,SAAS,EAAE,MAAM;KAClB;CACwC,CAAC;AAE5C,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,KAAK,EAAE,eAAe;IACtB,QAAQ,EAAE,4BAA4B;IACtC,GAAG,EAAE,gCAAgC;IACrC,QAAQ,EAAE,oCAAoC;IAC9C,SAAS,EAAE,YAAY;IACvB,YAAY,EAAE,CAAC,CAAC,CAAC;IACjB,YAAY,EAAE,CAAC;IACf,WAAW,EAAE,MAAM;IACnB,UAAU,EAAE,EAAE;IACd,YAAY,EAAE,EAAE;IAChB,aAAa,EAAE,EAAE;IACjB,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE;QACP,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,gBAAgB;QAC1B,eAAe,EAAE,8BAA8B;QAC/C,SAAS,EAAE,CAAC,CAAC;QACb,WAAW,EAAE,UAAU;QACvB,gBAAgB,EAAE,UAAU;QAC5B,SAAS,EAAE,MAAM;KAClB;CACwC,CAAC"}
1
+ {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/crypto/profiles.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,0BAAmC,CAAC;AAmChE;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAC1C,KAAkC;IAElC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC;QACzC,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM;QAC5B,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ;QAChC,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC,eAAe;KAC/C,CAAC,EAAE,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YAAE,MAAM,IAAI,SAAS,CAAC,GAAG,IAAI,qBAAqB,CAAC,CAAC;IACvE,CAAC;IACD,IACE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;QACzC,KAAK,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,EAC5B,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,qCAAqC,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,KAAK;QACR,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAC5C,SAAS,EAAE,YAAY;QACvB,YAAY,EAAE,CAAC,CAAC,CAAU;QAC1B,YAAY,EAAE,CAAC;QACf,UAAU,EAAE,EAAE;QACd,YAAY,EAAE,EAAE;QAChB,aAAa,EAAE,EAAE;QACjB,OAAO,EAAE,GAAG;KACb,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keyneom/sync-kit",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "private": false,
5
5
  "description": "Provider-neutral encrypted application-data synchronization with opt-in browser adapters.",
6
6
  "type": "module",
@@ -8,7 +8,6 @@
8
8
  "sideEffects": false,
9
9
  "files": [
10
10
  "dist",
11
- "fixtures",
12
11
  "README.md",
13
12
  "LICENSE"
14
13
  ],
@@ -44,8 +43,7 @@
44
43
  "./stores/google-drive": {
45
44
  "types": "./dist/stores/google-drive/index.d.ts",
46
45
  "import": "./dist/stores/google-drive/index.js"
47
- },
48
- "./fixtures/*": "./fixtures/*"
46
+ }
49
47
  },
50
48
  "scripts": {
51
49
  "build": "tsc -p tsconfig.build.json",
@@ -1,41 +0,0 @@
1
- {
2
- "provenance": "Shared by live EasyBC web crypto.test.ts and Android SyncCryptoTest.decryptsSharedGzipCryptoVector",
3
- "secret": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8",
4
- "payload": {
5
- "schemaVersion": 1,
6
- "exportedAt": "2026-06-22T12:00:00Z",
7
- "planner": {
8
- "value": {
9
- "ageYears": 38
10
- },
11
- "updatedAt": "2026-06-22T12:00:00Z"
12
- },
13
- "periodRecords": [],
14
- "deletedPeriodStarts": {},
15
- "calendarDayLogs": {
16
- "2026-06-22": {
17
- "notes": "cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector ",
18
- "updatedAt": "2026-06-22T12:00:00Z"
19
- }
20
- },
21
- "voluntaryAbstinenceDates": {},
22
- "voluntaryAbstinenceUpdatedAt": {},
23
- "deletedVoluntaryAbstinenceDates": {},
24
- "ecJournal": {
25
- "value": false,
26
- "updatedAt": "2026-06-22T12:00:00Z"
27
- }
28
- },
29
- "envelope": {
30
- "schemaVersion": 1,
31
- "algorithm": "AES-256-GCM+HKDF-SHA-256",
32
- "compression": "gzip",
33
- "credentialId": "credential",
34
- "rpId": "keyneom.github.io",
35
- "prfInput": "AA",
36
- "kdfSalt": "ICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8",
37
- "nonce": "QEFCQ0RFRkdISUpL",
38
- "ciphertext": "LMBOEaK5ATYQxI26eKGwIdJ_ELsBJ8rf76MIXyxVsT3kN1K3qY42h07AZHOYkztpJYdhERCZmbG2j_Pd1zhqKRMIMdrj_-pBd6DljWZU0uD7d5rHWCbyAqudt_psdPSHm47MuQauJTsCjVmEkPNKCZZNOZkYnceNyC9MZQM_tY15jJLsHEdOnQS43zyNhv180UmM9POJcsaWBAG6yIfDRDpd2b1IpPuxmIAV3GLMYLiNHbJ4yDUX6PRYFhzI-Hh18rggXBENhWfq9kZ3hBpPKGkms-j4MHFIGhg_o3GY_rZTHCzq3phTdD3Mo4iSWf7D6FXezQP6H_jwyhDE0ydJyTjNfIPPyCESZtc",
39
- "updatedAt": "2026-06-22T12:00:00Z"
40
- }
41
- }
@@ -1,35 +0,0 @@
1
- {
2
- "provenance": "EasyBC Android SyncCryptoTest.decryptsWebCryptoVector and live web crypto.ts",
3
- "secret": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8",
4
- "payload": {
5
- "schemaVersion": 1,
6
- "exportedAt": "2026-06-21T12:00:00Z",
7
- "planner": {
8
- "value": {
9
- "ageYears": 37
10
- },
11
- "updatedAt": "2026-06-21T12:00:00Z"
12
- },
13
- "periodRecords": [],
14
- "deletedPeriodStarts": {},
15
- "calendarDayLogs": {},
16
- "voluntaryAbstinenceDates": {},
17
- "voluntaryAbstinenceUpdatedAt": {},
18
- "deletedVoluntaryAbstinenceDates": {},
19
- "ecJournal": {
20
- "value": false,
21
- "updatedAt": "1970-01-01T00:00:00.000Z"
22
- }
23
- },
24
- "envelope": {
25
- "schemaVersion": 1,
26
- "algorithm": "AES-256-GCM+HKDF-SHA-256",
27
- "credentialId": "credential",
28
- "rpId": "keyneom.github.io",
29
- "prfInput": "AA",
30
- "kdfSalt": "ICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8",
31
- "nonce": "QEFCQ0RFRkdISUpL",
32
- "ciphertext": "SGk1csrcbFdGshJaXqUdM-SLg9O0ZjtkHuUREJkV5R89VrpDkTmr12IlZ5W6d4Qk4pQ0kVT9XO7F_r4OHtoWNGbjzrdv49y2LhT-uDLjzNu38r-xVoQXGU3HTJdvr6VFk18TbaKAN08gD3wluMP9JH_IKwpGHeAgZyoajp3agwg4bGV-VSw9URAFlHrXtgJKymwNPz_4E4UHbmjcnCK94JngZgqYXnhBueTwX4fTayIrzqXl_JEcGDm6aEcae_FoqhZ1dVUVx5KynVj_JRgPMKOtviGe-LLk7aXbCoRLxSjZDU4nlPQOV2dFkbrwpV6afwsu1IQWwZ-xvnDovfN8eHzVuvdb7JgSIShs62Yy5N-wgCm-BUWxHp5oq0LUFkGB2njyTQjkmSYBiM4eVOYvhBTIRNQZqFMXSEI32-NyCEaLvv63y43OkQ9-kpWKZ7-yDpM-Mcs5ckNk3IKTHTGhl_0DMpZxA5QONtGvDCW4SHr8dKEQ6aDQ",
33
- "updatedAt": "2026-06-21T12:00:00Z"
34
- }
35
- }
@@ -1,42 +0,0 @@
1
- {
2
- "wrongSecret": "4OHi4-Tl5ufo6err7O3u7_Dx8vP09fb3-Pn6-_z9_v8",
3
- "tamperedEnvelope": {
4
- "schemaVersion": 1,
5
- "algorithm": "AES-256-GCM+HKDF-SHA-256",
6
- "credentialId": "credential",
7
- "rpId": "keyneom.github.io",
8
- "prfInput": "AA",
9
- "kdfSalt": "ICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8",
10
- "nonce": "QEFCQ0RFRkdISUpL",
11
- "ciphertext": "AGk1csrcbFdGshJaXqUdM-SLg9O0ZjtkHuUREJkV5R89VrpDkTmr12IlZ5W6d4Qk4pQ0kVT9XO7F_r4OHtoWNGbjzrdv49y2LhT-uDLjzNu38r-xVoQXGU3HTJdvr6VFk18TbaKAN08gD3wluMP9JH_IKwpGHeAgZyoajp3agwg4bGV-VSw9URAFlHrXtgJKymwNPz_4E4UHbmjcnCK94JngZgqYXnhBueTwX4fTayIrzqXl_JEcGDm6aEcae_FoqhZ1dVUVx5KynVj_JRgPMKOtviGe-LLk7aXbCoRLxSjZDU4nlPQOV2dFkbrwpV6afwsu1IQWwZ-xvnDovfN8eHzVuvdb7JgSIShs62Yy5N-wgCm-BUWxHp5oq0LUFkGB2njyTQjkmSYBiM4eVOYvhBTIRNQZqFMXSEI32-NyCEaLvv63y43OkQ9-kpWKZ7-yDpM-Mcs5ckNk3IKTHTGhl_0DMpZxA5QONtGvDCW4SHr8dKEQ6aDQ",
12
- "updatedAt": "2026-06-21T12:00:00Z"
13
- },
14
- "wrongContextEnvelope": {
15
- "schemaVersion": 1,
16
- "algorithm": "AES-256-GCM+HKDF-SHA-256",
17
- "credentialId": "fixture-credential",
18
- "rpId": "keyneom.github.io",
19
- "prfInput": "YGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8",
20
- "kdfSalt": "ICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8",
21
- "nonce": "QEFCQ0RFRkdISUpL",
22
- "ciphertext": "BQrSErMr1-99BpL6zSlFWuWBX2E95QI0FzCgOPe1hVzCEAX6AC94BwSXtF8WaFzt-p-NXyqtMCAtSejFY3VpS76Tk5QkOYaWb30zKkIydzJaxPyxsgsRyTVyc02BlSiV4qLxKy8PevEJ9_ZhrZEup93xuZ29GTgwaNPFilZYTBkGrkwxoQKKJ-Dus3QjRPqbD93o_yyi1sU6Gg3TmnoxX5wO9mQyXiPi856uGnCETa-9SHq3HPP4ZiNXoTzC8nUYPRxDtFfT7xd15T1QsK2ej3sdQz9djURZB9t8hX0Yc0TqbRjuqZZvvhGsodPI8vOw8b-UqSJJ3ZyXzV7yWjCVJ4TjpXAshfhDDbsK2ajZqoKEDEe_c9EH2ZsJwoQaOLmRlB-7v4vbhHrFb_soFf31ANGwXK8stBLyPbjYNducqss0L4F5JDAU_j8FcGMhKX9kFy0n7odbalAZtzN41WVm21LRh1ZBvkak9ycDZNHMHueyccjDcwxl_y0vgjfLD_bQycBLFM_GAy3aVM-H2I0JOJPePdxjqAwOpOSP6VjKZzR--4Glnm1nRj64DO09PFQQttMt8yGK5WsSqNHAP0ViAqW_2QgVH_ClFKfFfwGqb6DMfn1QgQ50m0Xf9ICxKhzFiAvaax82mDoUQju21ZnNQ1hKxvy8NUccCJ-hiT0Vl9RZMO5mXMbagtFMzb8nYYJpJ56M0e0SkHOk8XKYnOgDIUOFybfQLAIG1xYA7GjgxIG0CTUau-1PRCuH5SHntDn7dID2EPllxW3wyQRZpMWw98DodPYfXGo4n2gonLqn2VIF-h9cXGCMkjnnZOFTTFzt1i5zmSyF1prXBFHOQRGTfRZsZd5Iox5tsieiFvEzm5C5bU67G2Gn-wBjSJVmASMlSVxY622eHwkT9HlMnNyZq2fCAcrC-DwQjDx_wGdi_qxRirNIUM5qvoD655R66r7jFbhn6y9LrPrTgrwR1i2c51s5JdtC_JwhFA3nCz816sfK7oGpLq5BLmeVvrPWhiyjDFGByY79_uT63hOekL59uDl7Me_-xauWwbLv",
23
- "updatedAt": "2026-06-21T00:00:00.000Z"
24
- },
25
- "malformedEnvelope": {
26
- "schemaVersion": 1,
27
- "algorithm": "AES-256-GCM+HKDF-SHA-256",
28
- "credentialId": "fixture-credential"
29
- },
30
- "decompressionErrorEnvelope": {
31
- "schemaVersion": 1,
32
- "algorithm": "AES-256-GCM+HKDF-SHA-256",
33
- "compression": "gzip",
34
- "credentialId": "fixture-credential",
35
- "rpId": "keyneom.github.io",
36
- "prfInput": "YGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8",
37
- "kdfSalt": "ICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8",
38
- "nonce": "QEFCQ0RFRkdISUpL",
39
- "ciphertext": "Uj4yecfXdV9zthRMU-oDfb_TwYW0Zj8rGPkVAPgItAVxC_5RxjT8myZndrL_N9t1v4DvXIgzQ1qpRWd5TXfpZKc",
40
- "updatedAt": "2026-06-29T00:00:00.000Z"
41
- }
42
- }
@@ -1,73 +0,0 @@
1
- {
2
- "provenance": "Generated from the uncommitted live Family Chores sync implementation",
3
- "secret": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8",
4
- "payload": {
5
- "schemaVersion": 1,
6
- "exportedAt": "2026-06-21T00:00:00.000Z",
7
- "state": {
8
- "children": [],
9
- "tasks": [],
10
- "taskInstances": [],
11
- "completedTasks": {},
12
- "timers": {},
13
- "timedCompletions": [],
14
- "actionLog": [],
15
- "parentSettings": {
16
- "approvals": {
17
- "task": false,
18
- "reward": false
19
- },
20
- "timedAutoApproveDefault": false,
21
- "pins": [],
22
- "childDisplayOrder": [],
23
- "onboardingCompleted": false,
24
- "voiceAnnouncements": false
25
- }
26
- },
27
- "metadata": {
28
- "schemaVersion": 1,
29
- "collections": {
30
- "children": {
31
- "updatedAt": {},
32
- "deletedAt": {}
33
- },
34
- "tasks": {
35
- "updatedAt": {},
36
- "deletedAt": {}
37
- },
38
- "taskInstances": {
39
- "updatedAt": {},
40
- "deletedAt": {}
41
- },
42
- "completedTasks": {
43
- "updatedAt": {},
44
- "deletedAt": {}
45
- },
46
- "timers": {
47
- "updatedAt": {},
48
- "deletedAt": {}
49
- },
50
- "timedCompletions": {
51
- "updatedAt": {},
52
- "deletedAt": {}
53
- },
54
- "actionLog": {
55
- "updatedAt": {},
56
- "deletedAt": {}
57
- }
58
- },
59
- "parentSettingsUpdatedAt": "1970-01-01T00:00:00.000Z"
60
- }
61
- },
62
- "envelope": {
63
- "schemaVersion": 1,
64
- "algorithm": "AES-256-GCM+HKDF-SHA-256",
65
- "credentialId": "fixture-credential",
66
- "rpId": "keyneom.github.io",
67
- "prfInput": "YGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8",
68
- "kdfSalt": "ICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8",
69
- "nonce": "QEFCQ0RFRkdISUpL",
70
- "ciphertext": "BQrSErMr1-99BpL6zSlFWuWBX2E95QI0FzCgOPe1hVzCEAX6AC94BwSXtF8WaFzt-p-NXyqtMCAtSejFY3VpS76Tk5QkOYaWb30zKkIydzJaxPyxsgsRyTVyc02BlSiV4qLxKy8PevEJ9_ZhrZEup93xuZ29GTgwaNPFilZYTBkGrkwxoQKKJ-Dus3QjRPqbD93o_yyi1sU6Gg3TmnoxX5wO9mQyXiPi856uGnCETa-9SHq3HPP4ZiNXoTzC8nUYPRxDtFfT7xd15T1QsK2ej3sdQz9djURZB9t8hX0Yc0TqbRjuqZZvvhGsodPI8vOw8b-UqSJJ3ZyXzV7yWjCVJ4TjpXAshfhDDbsK2ajZqoKEDEe_c9EH2ZsJwoQaOLmRlB-7v4vbhHrFb_soFf31ANGwXK8stBLyPbjYNducqss0L4F5JDAU_j8FcGMhKX9kFy0n7odbalAZtzN41WVm21LRh1ZBvkak9ycDZNHMHueyccjDcwxl_y0vgjfLD_bQycBLFM_GAy3aVM-H2I0JOJPePdxjqAwOpOSP6VjKZzR--4Glnm1nRj64DO09PFQQttMt8yGK5WsSqNHAP0ViAqW_2QgVH_ClFKfFfwGqb6DMfn1QgQ50m0Xf9ICxKhzFiAvaax82mDoUQju21ZnNQ1hKxvy8NUccCJ-hiT0Vl9RZMO5mXMbagtFMzb8nYYJpJ56M0e0SkHOk8XKYnOgDIUOFybfQLAIG1xYA7GjgxIG0CTUau-1PRCuH5SHntDn7dID2EPllxW3wyQRZpMWw98DodPYfXGo4n2gonLqn2VIF-h9cXGCMkjnnZOFTTFzt1i5zmSyF1prXBFHOQRGTfRZsZd5Iox5tsieiFvEzm5C5bU67G2Gn-wBjSJVmASMlSVxY622eHwkT9HlMnNyZq2fCAcrC-DwQjDx_wGdi_qxRirNIUM5qvoD655R66r7jFbhn6y9LrPrTgrwR1i2c51s5JdtC_JwhFA3nCz816sfK7oGpLq5BLmeVvrPWhiyjDFGByY79_uT63hOekL59uDl7Me_-xauWwbLv",
71
- "updatedAt": "2026-06-21T00:00:00.000Z"
72
- }
73
- }
@@ -1,51 +0,0 @@
1
- {
2
- "generatedAt": "2026-06-29",
3
- "profiles": [
4
- {
5
- "appId": "easy-bc",
6
- "filename": "easybc-sync-v1.json",
7
- "aad": "easy-bc-sync-envelope-v1",
8
- "hkdfInfo": "easy-bc-cloud-content-key-v1",
9
- "compression": "gzip-if-smaller",
10
- "algorithm": "AES-256-GCM+HKDF-SHA-256",
11
- "schemaVersion": 1,
12
- "nonceBytes": 12,
13
- "kdfSaltBytes": 32,
14
- "prfInputBytes": 32,
15
- "tagBits": 128,
16
- "passkey": {
17
- "rpId": "keyneom.github.io",
18
- "rpName": "EasyBC",
19
- "userName": "encrypted-sync",
20
- "userDisplayName": "EasyBC encrypted sync",
21
- "algorithm": -7,
22
- "residentKey": "required",
23
- "userVerification": "required",
24
- "timeoutMs": 60000
25
- }
26
- },
27
- {
28
- "appId": "family-chores",
29
- "filename": "family-chores-sync-v1.json",
30
- "aad": "family-chores-sync-envelope-v1",
31
- "hkdfInfo": "family-chores-cloud-content-key-v1",
32
- "compression": "none",
33
- "algorithm": "AES-256-GCM+HKDF-SHA-256",
34
- "schemaVersion": 1,
35
- "nonceBytes": 12,
36
- "kdfSaltBytes": 32,
37
- "prfInputBytes": 32,
38
- "tagBits": 128,
39
- "passkey": {
40
- "rpId": "keyneom.github.io",
41
- "rpName": "Family Chores",
42
- "userName": "encrypted-sync",
43
- "userDisplayName": "Family Chores encrypted sync",
44
- "algorithm": -7,
45
- "residentKey": "required",
46
- "userVerification": "required",
47
- "timeoutMs": 60000
48
- }
49
- }
50
- ]
51
- }