@anuma/sdk 6.14.1 → 6.14.2

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.
@@ -15438,7 +15438,7 @@ async function ingestPublishedPhotoMemoriesOp(ctx, rows) {
15438
15438
  ({ row, content }) => ctx.vaultMemoryCollection.prepareCreate((record) => {
15439
15439
  record._raw.id = row.memoryId;
15440
15440
  record._setRaw("content", content);
15441
- record._setRaw("scope", "private");
15441
+ record._setRaw("scope", "shared");
15442
15442
  record._setRaw("folder_id", null);
15443
15443
  record._setRaw("user_id", ctx.userId ?? null);
15444
15444
  record._setRaw("is_deleted", false);
@@ -6335,15 +6335,26 @@ declare function extractAndRetain(messages: AutoExtractMessage[], retainCtx: Ret
6335
6335
  }>;
6336
6336
 
6337
6337
  /**
6338
- * People Nearby cross-user visibility. ORTHOGONAL to `scope` (model access):
6339
- * - `private`: local-only (default; null column grandfathered as private)
6340
- * - `public`: embedding + plaintext may be published (compatibility matching,
6341
- * profile display, discovery answers, digital-twin prompts)
6338
+ * LEGACY. This column no longer decides anything.
6339
+ *
6340
+ * `scope === 'shared'` is now the single publication axis: it means the memory
6341
+ * is on the People Nearby profile, its text goes to the nearby server, and it
6342
+ * may inform what strangers see. `scope: 'private'` means it is not. There is
6343
+ * no second control, and scope no longer gates model access either — every
6344
+ * model tier reads every memory. Do NOT reason about publication from this
6345
+ * type; read `scope`.
6346
+ *
6347
+ * The column survives in the schema and is still stamped on writes so that
6348
+ * stored rows stay readable by builds that predate the change. Nothing on a
6349
+ * current build reads it to make a decision.
6350
+ *
6351
+ * Values, kept for tolerance of already-stored data:
6352
+ * - `private`: local-only (a null column reads as private)
6353
+ * - `public`: the row was published
6342
6354
  *
6343
6355
  * TWO TIERS ONLY (decided 2026-07-27). An earlier design had a middle
6344
6356
  * `matchable` tier that published a memory's embedding while keeping its text
6345
- * on-device; it was dropped, so a memory either never leaves the device or is
6346
- * published with its content. Any unrecognised stored value — including a
6357
+ * on-device; it was dropped. Any unrecognised stored value — including a
6347
6358
  * `matchable` row written by a pre-release build — reads as `private`, which is
6348
6359
  * the fail-safe direction: it un-publishes rather than exposes.
6349
6360
  */
@@ -6997,12 +7008,16 @@ declare function updateVaultMemoryEmbeddingOp(ctx: VaultMemoryOperationsContext,
6997
7008
  * candidate to be reconciled against the vault — it is an already-decided
6998
7009
  * fact the server has published.
6999
7010
  *
7000
- * The rows are written `visibility: "public"` because they genuinely ARE
7001
- * published — the reconciler reads local visibility as the user's intent, and
7002
- * anything else would make it immediately revoke a memory the user never turned
7003
- * off. They carry `source: SOURCE_PHOTO`, which is what exempts them from
7004
- * decay's auto-archive; see the note there for why archiving one would silently
7005
- * unpublish it.
7011
+ * The rows are written `scope: "shared"` because they genuinely ARE published.
7012
+ * `scope === 'shared'` is the publication axis — the single one. The reconciler
7013
+ * reads local scope as the user's intent, and it builds its `local` set from a
7014
+ * vault read narrowed to `{scopes: ['shared']}`. A row stamped anything else
7015
+ * never enters that read, so it is never adopted into the publish ledger, and
7016
+ * `toRevoke` is computed only over ids the ledger holds. The user's off-toggle
7017
+ * would then do nothing server-side while nearby kept serving the memory. The
7018
+ * `visibility` column is legacy: nothing reads it any more. They carry
7019
+ * `source: SOURCE_PHOTO`, which is what exempts them from decay's auto-archive;
7020
+ * see the note there for why archiving one would silently unpublish it.
7006
7021
  *
7007
7022
  * No embedding is computed here. `searchTool`'s un-embedded lane embeds any row
7008
7023
  * lacking a vector at search time, uses it in that same search and persists it
@@ -7050,6 +7065,29 @@ interface PhotoIngestResult {
7050
7065
  * class of bug as publishing a version the user has since changed. Re-ingesting
7051
7066
  * changed text is a follow-up that needs a merge decision, not a clobber.
7052
7067
  *
7068
+ * That skip is also why this op does NOT repair a row an older build stamped
7069
+ * `scope: "private"`. Such a row is present, so ingest leaves it alone, and it
7070
+ * stays outside the published-set read. The user's switch cannot revoke it.
7071
+ * Repair belongs in a one-time pass at upgrade. Do not add it here, for two
7072
+ * reasons:
7073
+ *
7074
+ * - **The two states are indistinguishable from this op.** After this build a
7075
+ * `photo:` row with `scope: "private"` is also exactly what the user's own
7076
+ * off-toggle produces. The toggle calls `updateVaultMemoryOp`, which writes
7077
+ * `scope` and never touches `visibility`, so the mis-stamped row and the
7078
+ * turned-off row carry identical columns. No test here can tell them apart.
7079
+ *
7080
+ * - **A re-stamp here would revert the off-toggle.** The pass runs ingest
7081
+ * BEFORE it reads the vault, so a row re-stamped `shared` re-enters the
7082
+ * desired set on that same pass and never reaches `toRevoke`. The switch
7083
+ * would spring back to "on" and nearby would keep serving the memory. That
7084
+ * is worse than the bug it repairs.
7085
+ *
7086
+ * A one-time pass does not have the ambiguity. Before this build the switch
7087
+ * already read "off" for these rows, because it reads `scope`, so no user can
7088
+ * have turned one off. Every `private` photo row at that instant came from the
7089
+ * old stamp.
7090
+ *
7053
7091
  * Non-`photo:` ids are ignored: everything else in the published set is a
7054
7092
  * client-published memory that by definition already lives in this vault (or in
7055
7093
  * another device's, which is not ours to recreate).
@@ -6335,15 +6335,26 @@ declare function extractAndRetain(messages: AutoExtractMessage[], retainCtx: Ret
6335
6335
  }>;
6336
6336
 
6337
6337
  /**
6338
- * People Nearby cross-user visibility. ORTHOGONAL to `scope` (model access):
6339
- * - `private`: local-only (default; null column grandfathered as private)
6340
- * - `public`: embedding + plaintext may be published (compatibility matching,
6341
- * profile display, discovery answers, digital-twin prompts)
6338
+ * LEGACY. This column no longer decides anything.
6339
+ *
6340
+ * `scope === 'shared'` is now the single publication axis: it means the memory
6341
+ * is on the People Nearby profile, its text goes to the nearby server, and it
6342
+ * may inform what strangers see. `scope: 'private'` means it is not. There is
6343
+ * no second control, and scope no longer gates model access either — every
6344
+ * model tier reads every memory. Do NOT reason about publication from this
6345
+ * type; read `scope`.
6346
+ *
6347
+ * The column survives in the schema and is still stamped on writes so that
6348
+ * stored rows stay readable by builds that predate the change. Nothing on a
6349
+ * current build reads it to make a decision.
6350
+ *
6351
+ * Values, kept for tolerance of already-stored data:
6352
+ * - `private`: local-only (a null column reads as private)
6353
+ * - `public`: the row was published
6342
6354
  *
6343
6355
  * TWO TIERS ONLY (decided 2026-07-27). An earlier design had a middle
6344
6356
  * `matchable` tier that published a memory's embedding while keeping its text
6345
- * on-device; it was dropped, so a memory either never leaves the device or is
6346
- * published with its content. Any unrecognised stored value — including a
6357
+ * on-device; it was dropped. Any unrecognised stored value — including a
6347
6358
  * `matchable` row written by a pre-release build — reads as `private`, which is
6348
6359
  * the fail-safe direction: it un-publishes rather than exposes.
6349
6360
  */
@@ -6997,12 +7008,16 @@ declare function updateVaultMemoryEmbeddingOp(ctx: VaultMemoryOperationsContext,
6997
7008
  * candidate to be reconciled against the vault — it is an already-decided
6998
7009
  * fact the server has published.
6999
7010
  *
7000
- * The rows are written `visibility: "public"` because they genuinely ARE
7001
- * published — the reconciler reads local visibility as the user's intent, and
7002
- * anything else would make it immediately revoke a memory the user never turned
7003
- * off. They carry `source: SOURCE_PHOTO`, which is what exempts them from
7004
- * decay's auto-archive; see the note there for why archiving one would silently
7005
- * unpublish it.
7011
+ * The rows are written `scope: "shared"` because they genuinely ARE published.
7012
+ * `scope === 'shared'` is the publication axis — the single one. The reconciler
7013
+ * reads local scope as the user's intent, and it builds its `local` set from a
7014
+ * vault read narrowed to `{scopes: ['shared']}`. A row stamped anything else
7015
+ * never enters that read, so it is never adopted into the publish ledger, and
7016
+ * `toRevoke` is computed only over ids the ledger holds. The user's off-toggle
7017
+ * would then do nothing server-side while nearby kept serving the memory. The
7018
+ * `visibility` column is legacy: nothing reads it any more. They carry
7019
+ * `source: SOURCE_PHOTO`, which is what exempts them from decay's auto-archive;
7020
+ * see the note there for why archiving one would silently unpublish it.
7006
7021
  *
7007
7022
  * No embedding is computed here. `searchTool`'s un-embedded lane embeds any row
7008
7023
  * lacking a vector at search time, uses it in that same search and persists it
@@ -7050,6 +7065,29 @@ interface PhotoIngestResult {
7050
7065
  * class of bug as publishing a version the user has since changed. Re-ingesting
7051
7066
  * changed text is a follow-up that needs a merge decision, not a clobber.
7052
7067
  *
7068
+ * That skip is also why this op does NOT repair a row an older build stamped
7069
+ * `scope: "private"`. Such a row is present, so ingest leaves it alone, and it
7070
+ * stays outside the published-set read. The user's switch cannot revoke it.
7071
+ * Repair belongs in a one-time pass at upgrade. Do not add it here, for two
7072
+ * reasons:
7073
+ *
7074
+ * - **The two states are indistinguishable from this op.** After this build a
7075
+ * `photo:` row with `scope: "private"` is also exactly what the user's own
7076
+ * off-toggle produces. The toggle calls `updateVaultMemoryOp`, which writes
7077
+ * `scope` and never touches `visibility`, so the mis-stamped row and the
7078
+ * turned-off row carry identical columns. No test here can tell them apart.
7079
+ *
7080
+ * - **A re-stamp here would revert the off-toggle.** The pass runs ingest
7081
+ * BEFORE it reads the vault, so a row re-stamped `shared` re-enters the
7082
+ * desired set on that same pass and never reaches `toRevoke`. The switch
7083
+ * would spring back to "on" and nearby would keep serving the memory. That
7084
+ * is worse than the bug it repairs.
7085
+ *
7086
+ * A one-time pass does not have the ambiguity. Before this build the switch
7087
+ * already read "off" for these rows, because it reads `scope`, so no user can
7088
+ * have turned one off. Every `private` photo row at that instant came from the
7089
+ * old stamp.
7090
+ *
7053
7091
  * Non-`photo:` ids are ignored: everything else in the published set is a
7054
7092
  * client-published memory that by definition already lives in this vault (or in
7055
7093
  * another device's, which is not ours to recreate).
@@ -5819,7 +5819,7 @@ async function ingestPublishedPhotoMemoriesOp(ctx, rows) {
5819
5819
  ({ row, content }) => ctx.vaultMemoryCollection.prepareCreate((record) => {
5820
5820
  record._raw.id = row.memoryId;
5821
5821
  record._setRaw("content", content);
5822
- record._setRaw("scope", "private");
5822
+ record._setRaw("scope", "shared");
5823
5823
  record._setRaw("folder_id", null);
5824
5824
  record._setRaw("user_id", ctx.userId ?? null);
5825
5825
  record._setRaw("is_deleted", false);
@@ -17076,7 +17076,7 @@ async function ingestPublishedPhotoMemoriesOp(ctx, rows) {
17076
17076
  ({ row, content }) => ctx.vaultMemoryCollection.prepareCreate((record) => {
17077
17077
  record._raw.id = row.memoryId;
17078
17078
  record._setRaw("content", content);
17079
- record._setRaw("scope", "private");
17079
+ record._setRaw("scope", "shared");
17080
17080
  record._setRaw("folder_id", null);
17081
17081
  record._setRaw("user_id", ctx.userId ?? null);
17082
17082
  record._setRaw("is_deleted", false);
@@ -7604,15 +7604,26 @@ declare function extractAndRetain(messages: AutoExtractMessage[], retainCtx: Ret
7604
7604
  }>;
7605
7605
 
7606
7606
  /**
7607
- * People Nearby cross-user visibility. ORTHOGONAL to `scope` (model access):
7608
- * - `private`: local-only (default; null column grandfathered as private)
7609
- * - `public`: embedding + plaintext may be published (compatibility matching,
7610
- * profile display, discovery answers, digital-twin prompts)
7607
+ * LEGACY. This column no longer decides anything.
7608
+ *
7609
+ * `scope === 'shared'` is now the single publication axis: it means the memory
7610
+ * is on the People Nearby profile, its text goes to the nearby server, and it
7611
+ * may inform what strangers see. `scope: 'private'` means it is not. There is
7612
+ * no second control, and scope no longer gates model access either — every
7613
+ * model tier reads every memory. Do NOT reason about publication from this
7614
+ * type; read `scope`.
7615
+ *
7616
+ * The column survives in the schema and is still stamped on writes so that
7617
+ * stored rows stay readable by builds that predate the change. Nothing on a
7618
+ * current build reads it to make a decision.
7619
+ *
7620
+ * Values, kept for tolerance of already-stored data:
7621
+ * - `private`: local-only (a null column reads as private)
7622
+ * - `public`: the row was published
7611
7623
  *
7612
7624
  * TWO TIERS ONLY (decided 2026-07-27). An earlier design had a middle
7613
7625
  * `matchable` tier that published a memory's embedding while keeping its text
7614
- * on-device; it was dropped, so a memory either never leaves the device or is
7615
- * published with its content. Any unrecognised stored value — including a
7626
+ * on-device; it was dropped. Any unrecognised stored value — including a
7616
7627
  * `matchable` row written by a pre-release build — reads as `private`, which is
7617
7628
  * the fail-safe direction: it un-publishes rather than exposes.
7618
7629
  */
@@ -8352,12 +8363,16 @@ declare function updateVaultMemoryEmbeddingOp(ctx: VaultMemoryOperationsContext,
8352
8363
  * candidate to be reconciled against the vault — it is an already-decided
8353
8364
  * fact the server has published.
8354
8365
  *
8355
- * The rows are written `visibility: "public"` because they genuinely ARE
8356
- * published — the reconciler reads local visibility as the user's intent, and
8357
- * anything else would make it immediately revoke a memory the user never turned
8358
- * off. They carry `source: SOURCE_PHOTO`, which is what exempts them from
8359
- * decay's auto-archive; see the note there for why archiving one would silently
8360
- * unpublish it.
8366
+ * The rows are written `scope: "shared"` because they genuinely ARE published.
8367
+ * `scope === 'shared'` is the publication axis — the single one. The reconciler
8368
+ * reads local scope as the user's intent, and it builds its `local` set from a
8369
+ * vault read narrowed to `{scopes: ['shared']}`. A row stamped anything else
8370
+ * never enters that read, so it is never adopted into the publish ledger, and
8371
+ * `toRevoke` is computed only over ids the ledger holds. The user's off-toggle
8372
+ * would then do nothing server-side while nearby kept serving the memory. The
8373
+ * `visibility` column is legacy: nothing reads it any more. They carry
8374
+ * `source: SOURCE_PHOTO`, which is what exempts them from decay's auto-archive;
8375
+ * see the note there for why archiving one would silently unpublish it.
8361
8376
  *
8362
8377
  * No embedding is computed here. `searchTool`'s un-embedded lane embeds any row
8363
8378
  * lacking a vector at search time, uses it in that same search and persists it
@@ -8405,6 +8420,29 @@ interface PhotoIngestResult {
8405
8420
  * class of bug as publishing a version the user has since changed. Re-ingesting
8406
8421
  * changed text is a follow-up that needs a merge decision, not a clobber.
8407
8422
  *
8423
+ * That skip is also why this op does NOT repair a row an older build stamped
8424
+ * `scope: "private"`. Such a row is present, so ingest leaves it alone, and it
8425
+ * stays outside the published-set read. The user's switch cannot revoke it.
8426
+ * Repair belongs in a one-time pass at upgrade. Do not add it here, for two
8427
+ * reasons:
8428
+ *
8429
+ * - **The two states are indistinguishable from this op.** After this build a
8430
+ * `photo:` row with `scope: "private"` is also exactly what the user's own
8431
+ * off-toggle produces. The toggle calls `updateVaultMemoryOp`, which writes
8432
+ * `scope` and never touches `visibility`, so the mis-stamped row and the
8433
+ * turned-off row carry identical columns. No test here can tell them apart.
8434
+ *
8435
+ * - **A re-stamp here would revert the off-toggle.** The pass runs ingest
8436
+ * BEFORE it reads the vault, so a row re-stamped `shared` re-enters the
8437
+ * desired set on that same pass and never reaches `toRevoke`. The switch
8438
+ * would spring back to "on" and nearby would keep serving the memory. That
8439
+ * is worse than the bug it repairs.
8440
+ *
8441
+ * A one-time pass does not have the ambiguity. Before this build the switch
8442
+ * already read "off" for these rows, because it reads `scope`, so no user can
8443
+ * have turned one off. Every `private` photo row at that instant came from the
8444
+ * old stamp.
8445
+ *
8408
8446
  * Non-`photo:` ids are ignored: everything else in the published set is a
8409
8447
  * client-published memory that by definition already lives in this vault (or in
8410
8448
  * another device's, which is not ours to recreate).
@@ -7604,15 +7604,26 @@ declare function extractAndRetain(messages: AutoExtractMessage[], retainCtx: Ret
7604
7604
  }>;
7605
7605
 
7606
7606
  /**
7607
- * People Nearby cross-user visibility. ORTHOGONAL to `scope` (model access):
7608
- * - `private`: local-only (default; null column grandfathered as private)
7609
- * - `public`: embedding + plaintext may be published (compatibility matching,
7610
- * profile display, discovery answers, digital-twin prompts)
7607
+ * LEGACY. This column no longer decides anything.
7608
+ *
7609
+ * `scope === 'shared'` is now the single publication axis: it means the memory
7610
+ * is on the People Nearby profile, its text goes to the nearby server, and it
7611
+ * may inform what strangers see. `scope: 'private'` means it is not. There is
7612
+ * no second control, and scope no longer gates model access either — every
7613
+ * model tier reads every memory. Do NOT reason about publication from this
7614
+ * type; read `scope`.
7615
+ *
7616
+ * The column survives in the schema and is still stamped on writes so that
7617
+ * stored rows stay readable by builds that predate the change. Nothing on a
7618
+ * current build reads it to make a decision.
7619
+ *
7620
+ * Values, kept for tolerance of already-stored data:
7621
+ * - `private`: local-only (a null column reads as private)
7622
+ * - `public`: the row was published
7611
7623
  *
7612
7624
  * TWO TIERS ONLY (decided 2026-07-27). An earlier design had a middle
7613
7625
  * `matchable` tier that published a memory's embedding while keeping its text
7614
- * on-device; it was dropped, so a memory either never leaves the device or is
7615
- * published with its content. Any unrecognised stored value — including a
7626
+ * on-device; it was dropped. Any unrecognised stored value — including a
7616
7627
  * `matchable` row written by a pre-release build — reads as `private`, which is
7617
7628
  * the fail-safe direction: it un-publishes rather than exposes.
7618
7629
  */
@@ -8352,12 +8363,16 @@ declare function updateVaultMemoryEmbeddingOp(ctx: VaultMemoryOperationsContext,
8352
8363
  * candidate to be reconciled against the vault — it is an already-decided
8353
8364
  * fact the server has published.
8354
8365
  *
8355
- * The rows are written `visibility: "public"` because they genuinely ARE
8356
- * published — the reconciler reads local visibility as the user's intent, and
8357
- * anything else would make it immediately revoke a memory the user never turned
8358
- * off. They carry `source: SOURCE_PHOTO`, which is what exempts them from
8359
- * decay's auto-archive; see the note there for why archiving one would silently
8360
- * unpublish it.
8366
+ * The rows are written `scope: "shared"` because they genuinely ARE published.
8367
+ * `scope === 'shared'` is the publication axis — the single one. The reconciler
8368
+ * reads local scope as the user's intent, and it builds its `local` set from a
8369
+ * vault read narrowed to `{scopes: ['shared']}`. A row stamped anything else
8370
+ * never enters that read, so it is never adopted into the publish ledger, and
8371
+ * `toRevoke` is computed only over ids the ledger holds. The user's off-toggle
8372
+ * would then do nothing server-side while nearby kept serving the memory. The
8373
+ * `visibility` column is legacy: nothing reads it any more. They carry
8374
+ * `source: SOURCE_PHOTO`, which is what exempts them from decay's auto-archive;
8375
+ * see the note there for why archiving one would silently unpublish it.
8361
8376
  *
8362
8377
  * No embedding is computed here. `searchTool`'s un-embedded lane embeds any row
8363
8378
  * lacking a vector at search time, uses it in that same search and persists it
@@ -8405,6 +8420,29 @@ interface PhotoIngestResult {
8405
8420
  * class of bug as publishing a version the user has since changed. Re-ingesting
8406
8421
  * changed text is a follow-up that needs a merge decision, not a clobber.
8407
8422
  *
8423
+ * That skip is also why this op does NOT repair a row an older build stamped
8424
+ * `scope: "private"`. Such a row is present, so ingest leaves it alone, and it
8425
+ * stays outside the published-set read. The user's switch cannot revoke it.
8426
+ * Repair belongs in a one-time pass at upgrade. Do not add it here, for two
8427
+ * reasons:
8428
+ *
8429
+ * - **The two states are indistinguishable from this op.** After this build a
8430
+ * `photo:` row with `scope: "private"` is also exactly what the user's own
8431
+ * off-toggle produces. The toggle calls `updateVaultMemoryOp`, which writes
8432
+ * `scope` and never touches `visibility`, so the mis-stamped row and the
8433
+ * turned-off row carry identical columns. No test here can tell them apart.
8434
+ *
8435
+ * - **A re-stamp here would revert the off-toggle.** The pass runs ingest
8436
+ * BEFORE it reads the vault, so a row re-stamped `shared` re-enters the
8437
+ * desired set on that same pass and never reaches `toRevoke`. The switch
8438
+ * would spring back to "on" and nearby would keep serving the memory. That
8439
+ * is worse than the bug it repairs.
8440
+ *
8441
+ * A one-time pass does not have the ambiguity. Before this build the switch
8442
+ * already read "off" for these rows, because it reads `scope`, so no user can
8443
+ * have turned one off. Every `private` photo row at that instant came from the
8444
+ * old stamp.
8445
+ *
8408
8446
  * Non-`photo:` ids are ignored: everything else in the published set is a
8409
8447
  * client-published memory that by definition already lives in this vault (or in
8410
8448
  * another device's, which is not ours to recreate).
@@ -6976,7 +6976,7 @@ async function ingestPublishedPhotoMemoriesOp(ctx, rows) {
6976
6976
  ({ row, content }) => ctx.vaultMemoryCollection.prepareCreate((record) => {
6977
6977
  record._raw.id = row.memoryId;
6978
6978
  record._setRaw("content", content);
6979
- record._setRaw("scope", "private");
6979
+ record._setRaw("scope", "shared");
6980
6980
  record._setRaw("folder_id", null);
6981
6981
  record._setRaw("user_id", ctx.userId ?? null);
6982
6982
  record._setRaw("is_deleted", false);
@@ -27426,7 +27426,7 @@ async function ingestPublishedPhotoMemoriesOp(ctx, rows) {
27426
27426
  ({ row, content }) => ctx.vaultMemoryCollection.prepareCreate((record) => {
27427
27427
  record._raw.id = row.memoryId;
27428
27428
  record._setRaw("content", content);
27429
- record._setRaw("scope", "private");
27429
+ record._setRaw("scope", "shared");
27430
27430
  record._setRaw("folder_id", null);
27431
27431
  record._setRaw("user_id", ctx.userId ?? null);
27432
27432
  record._setRaw("is_deleted", false);
@@ -6253,15 +6253,26 @@ declare function extractAndRetain(messages: AutoExtractMessage[], retainCtx: Ret
6253
6253
  }>;
6254
6254
 
6255
6255
  /**
6256
- * People Nearby cross-user visibility. ORTHOGONAL to `scope` (model access):
6257
- * - `private`: local-only (default; null column grandfathered as private)
6258
- * - `public`: embedding + plaintext may be published (compatibility matching,
6259
- * profile display, discovery answers, digital-twin prompts)
6256
+ * LEGACY. This column no longer decides anything.
6257
+ *
6258
+ * `scope === 'shared'` is now the single publication axis: it means the memory
6259
+ * is on the People Nearby profile, its text goes to the nearby server, and it
6260
+ * may inform what strangers see. `scope: 'private'` means it is not. There is
6261
+ * no second control, and scope no longer gates model access either — every
6262
+ * model tier reads every memory. Do NOT reason about publication from this
6263
+ * type; read `scope`.
6264
+ *
6265
+ * The column survives in the schema and is still stamped on writes so that
6266
+ * stored rows stay readable by builds that predate the change. Nothing on a
6267
+ * current build reads it to make a decision.
6268
+ *
6269
+ * Values, kept for tolerance of already-stored data:
6270
+ * - `private`: local-only (a null column reads as private)
6271
+ * - `public`: the row was published
6260
6272
  *
6261
6273
  * TWO TIERS ONLY (decided 2026-07-27). An earlier design had a middle
6262
6274
  * `matchable` tier that published a memory's embedding while keeping its text
6263
- * on-device; it was dropped, so a memory either never leaves the device or is
6264
- * published with its content. Any unrecognised stored value — including a
6275
+ * on-device; it was dropped. Any unrecognised stored value — including a
6265
6276
  * `matchable` row written by a pre-release build — reads as `private`, which is
6266
6277
  * the fail-safe direction: it un-publishes rather than exposes.
6267
6278
  */
@@ -6853,12 +6864,16 @@ declare function updateVaultMemoryEmbeddingOp(ctx: VaultMemoryOperationsContext,
6853
6864
  * candidate to be reconciled against the vault — it is an already-decided
6854
6865
  * fact the server has published.
6855
6866
  *
6856
- * The rows are written `visibility: "public"` because they genuinely ARE
6857
- * published — the reconciler reads local visibility as the user's intent, and
6858
- * anything else would make it immediately revoke a memory the user never turned
6859
- * off. They carry `source: SOURCE_PHOTO`, which is what exempts them from
6860
- * decay's auto-archive; see the note there for why archiving one would silently
6861
- * unpublish it.
6867
+ * The rows are written `scope: "shared"` because they genuinely ARE published.
6868
+ * `scope === 'shared'` is the publication axis — the single one. The reconciler
6869
+ * reads local scope as the user's intent, and it builds its `local` set from a
6870
+ * vault read narrowed to `{scopes: ['shared']}`. A row stamped anything else
6871
+ * never enters that read, so it is never adopted into the publish ledger, and
6872
+ * `toRevoke` is computed only over ids the ledger holds. The user's off-toggle
6873
+ * would then do nothing server-side while nearby kept serving the memory. The
6874
+ * `visibility` column is legacy: nothing reads it any more. They carry
6875
+ * `source: SOURCE_PHOTO`, which is what exempts them from decay's auto-archive;
6876
+ * see the note there for why archiving one would silently unpublish it.
6862
6877
  *
6863
6878
  * No embedding is computed here. `searchTool`'s un-embedded lane embeds any row
6864
6879
  * lacking a vector at search time, uses it in that same search and persists it
@@ -6906,6 +6921,29 @@ interface PhotoIngestResult {
6906
6921
  * class of bug as publishing a version the user has since changed. Re-ingesting
6907
6922
  * changed text is a follow-up that needs a merge decision, not a clobber.
6908
6923
  *
6924
+ * That skip is also why this op does NOT repair a row an older build stamped
6925
+ * `scope: "private"`. Such a row is present, so ingest leaves it alone, and it
6926
+ * stays outside the published-set read. The user's switch cannot revoke it.
6927
+ * Repair belongs in a one-time pass at upgrade. Do not add it here, for two
6928
+ * reasons:
6929
+ *
6930
+ * - **The two states are indistinguishable from this op.** After this build a
6931
+ * `photo:` row with `scope: "private"` is also exactly what the user's own
6932
+ * off-toggle produces. The toggle calls `updateVaultMemoryOp`, which writes
6933
+ * `scope` and never touches `visibility`, so the mis-stamped row and the
6934
+ * turned-off row carry identical columns. No test here can tell them apart.
6935
+ *
6936
+ * - **A re-stamp here would revert the off-toggle.** The pass runs ingest
6937
+ * BEFORE it reads the vault, so a row re-stamped `shared` re-enters the
6938
+ * desired set on that same pass and never reaches `toRevoke`. The switch
6939
+ * would spring back to "on" and nearby would keep serving the memory. That
6940
+ * is worse than the bug it repairs.
6941
+ *
6942
+ * A one-time pass does not have the ambiguity. Before this build the switch
6943
+ * already read "off" for these rows, because it reads `scope`, so no user can
6944
+ * have turned one off. Every `private` photo row at that instant came from the
6945
+ * old stamp.
6946
+ *
6909
6947
  * Non-`photo:` ids are ignored: everything else in the published set is a
6910
6948
  * client-published memory that by definition already lives in this vault (or in
6911
6949
  * another device's, which is not ours to recreate).
@@ -6253,15 +6253,26 @@ declare function extractAndRetain(messages: AutoExtractMessage[], retainCtx: Ret
6253
6253
  }>;
6254
6254
 
6255
6255
  /**
6256
- * People Nearby cross-user visibility. ORTHOGONAL to `scope` (model access):
6257
- * - `private`: local-only (default; null column grandfathered as private)
6258
- * - `public`: embedding + plaintext may be published (compatibility matching,
6259
- * profile display, discovery answers, digital-twin prompts)
6256
+ * LEGACY. This column no longer decides anything.
6257
+ *
6258
+ * `scope === 'shared'` is now the single publication axis: it means the memory
6259
+ * is on the People Nearby profile, its text goes to the nearby server, and it
6260
+ * may inform what strangers see. `scope: 'private'` means it is not. There is
6261
+ * no second control, and scope no longer gates model access either — every
6262
+ * model tier reads every memory. Do NOT reason about publication from this
6263
+ * type; read `scope`.
6264
+ *
6265
+ * The column survives in the schema and is still stamped on writes so that
6266
+ * stored rows stay readable by builds that predate the change. Nothing on a
6267
+ * current build reads it to make a decision.
6268
+ *
6269
+ * Values, kept for tolerance of already-stored data:
6270
+ * - `private`: local-only (a null column reads as private)
6271
+ * - `public`: the row was published
6260
6272
  *
6261
6273
  * TWO TIERS ONLY (decided 2026-07-27). An earlier design had a middle
6262
6274
  * `matchable` tier that published a memory's embedding while keeping its text
6263
- * on-device; it was dropped, so a memory either never leaves the device or is
6264
- * published with its content. Any unrecognised stored value — including a
6275
+ * on-device; it was dropped. Any unrecognised stored value — including a
6265
6276
  * `matchable` row written by a pre-release build — reads as `private`, which is
6266
6277
  * the fail-safe direction: it un-publishes rather than exposes.
6267
6278
  */
@@ -6853,12 +6864,16 @@ declare function updateVaultMemoryEmbeddingOp(ctx: VaultMemoryOperationsContext,
6853
6864
  * candidate to be reconciled against the vault — it is an already-decided
6854
6865
  * fact the server has published.
6855
6866
  *
6856
- * The rows are written `visibility: "public"` because they genuinely ARE
6857
- * published — the reconciler reads local visibility as the user's intent, and
6858
- * anything else would make it immediately revoke a memory the user never turned
6859
- * off. They carry `source: SOURCE_PHOTO`, which is what exempts them from
6860
- * decay's auto-archive; see the note there for why archiving one would silently
6861
- * unpublish it.
6867
+ * The rows are written `scope: "shared"` because they genuinely ARE published.
6868
+ * `scope === 'shared'` is the publication axis — the single one. The reconciler
6869
+ * reads local scope as the user's intent, and it builds its `local` set from a
6870
+ * vault read narrowed to `{scopes: ['shared']}`. A row stamped anything else
6871
+ * never enters that read, so it is never adopted into the publish ledger, and
6872
+ * `toRevoke` is computed only over ids the ledger holds. The user's off-toggle
6873
+ * would then do nothing server-side while nearby kept serving the memory. The
6874
+ * `visibility` column is legacy: nothing reads it any more. They carry
6875
+ * `source: SOURCE_PHOTO`, which is what exempts them from decay's auto-archive;
6876
+ * see the note there for why archiving one would silently unpublish it.
6862
6877
  *
6863
6878
  * No embedding is computed here. `searchTool`'s un-embedded lane embeds any row
6864
6879
  * lacking a vector at search time, uses it in that same search and persists it
@@ -6906,6 +6921,29 @@ interface PhotoIngestResult {
6906
6921
  * class of bug as publishing a version the user has since changed. Re-ingesting
6907
6922
  * changed text is a follow-up that needs a merge decision, not a clobber.
6908
6923
  *
6924
+ * That skip is also why this op does NOT repair a row an older build stamped
6925
+ * `scope: "private"`. Such a row is present, so ingest leaves it alone, and it
6926
+ * stays outside the published-set read. The user's switch cannot revoke it.
6927
+ * Repair belongs in a one-time pass at upgrade. Do not add it here, for two
6928
+ * reasons:
6929
+ *
6930
+ * - **The two states are indistinguishable from this op.** After this build a
6931
+ * `photo:` row with `scope: "private"` is also exactly what the user's own
6932
+ * off-toggle produces. The toggle calls `updateVaultMemoryOp`, which writes
6933
+ * `scope` and never touches `visibility`, so the mis-stamped row and the
6934
+ * turned-off row carry identical columns. No test here can tell them apart.
6935
+ *
6936
+ * - **A re-stamp here would revert the off-toggle.** The pass runs ingest
6937
+ * BEFORE it reads the vault, so a row re-stamped `shared` re-enters the
6938
+ * desired set on that same pass and never reaches `toRevoke`. The switch
6939
+ * would spring back to "on" and nearby would keep serving the memory. That
6940
+ * is worse than the bug it repairs.
6941
+ *
6942
+ * A one-time pass does not have the ambiguity. Before this build the switch
6943
+ * already read "off" for these rows, because it reads `scope`, so no user can
6944
+ * have turned one off. Every `private` photo row at that instant came from the
6945
+ * old stamp.
6946
+ *
6909
6947
  * Non-`photo:` ids are ignored: everything else in the published set is a
6910
6948
  * client-published memory that by definition already lives in this vault (or in
6911
6949
  * another device's, which is not ours to recreate).
@@ -3736,7 +3736,7 @@ async function ingestPublishedPhotoMemoriesOp(ctx, rows) {
3736
3736
  ({ row, content }) => ctx.vaultMemoryCollection.prepareCreate((record) => {
3737
3737
  record._raw.id = row.memoryId;
3738
3738
  record._setRaw("content", content);
3739
- record._setRaw("scope", "private");
3739
+ record._setRaw("scope", "shared");
3740
3740
  record._setRaw("folder_id", null);
3741
3741
  record._setRaw("user_id", ctx.userId ?? null);
3742
3742
  record._setRaw("is_deleted", false);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anuma/sdk",
3
- "version": "6.14.1",
3
+ "version": "6.14.2",
4
4
  "description": "",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.mjs",