@character-foundry/character-foundry 0.4.3-dev.1766019473 → 0.4.3

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/dist/loader.d.cts CHANGED
@@ -1194,13 +1194,6 @@ export interface AuthoritativeMetadata {
1194
1194
  tokens: TokenCounts;
1195
1195
  /** Content hash computed server-side */
1196
1196
  contentHash: string;
1197
- /**
1198
- * Content hash v2 computed server-side.
1199
- *
1200
- * @remarks
1201
- * v1 is preserved for backwards compatibility. Prefer v2 for new storage/deduplication.
1202
- */
1203
- contentHashV2?: string;
1204
1197
  /** Whether the card has a lorebook */
1205
1198
  hasLorebook: boolean;
1206
1199
  /** Number of lorebook entries */
@@ -1300,13 +1293,6 @@ export declare function validateClientMetadata(clientMetadata: ClientMetadata, p
1300
1293
  * @returns SHA-256 hash of canonical content
1301
1294
  */
1302
1295
  export declare function computeContentHash(card: CCv3Data): Promise<string>;
1303
- /**
1304
- * Compute content hash v2 for a card (standalone utility)
1305
- *
1306
- * @param card - CCv3 card data
1307
- * @returns SHA-256 hash of canonical content v2
1308
- */
1309
- export declare function computeContentHashV2(card: CCv3Data): Promise<string>;
1310
1296
  /**
1311
1297
  * Options for synchronous metadata validation
1312
1298
  */
package/dist/loader.d.ts CHANGED
@@ -1194,13 +1194,6 @@ export interface AuthoritativeMetadata {
1194
1194
  tokens: TokenCounts;
1195
1195
  /** Content hash computed server-side */
1196
1196
  contentHash: string;
1197
- /**
1198
- * Content hash v2 computed server-side.
1199
- *
1200
- * @remarks
1201
- * v1 is preserved for backwards compatibility. Prefer v2 for new storage/deduplication.
1202
- */
1203
- contentHashV2?: string;
1204
1197
  /** Whether the card has a lorebook */
1205
1198
  hasLorebook: boolean;
1206
1199
  /** Number of lorebook entries */
@@ -1300,13 +1293,6 @@ export declare function validateClientMetadata(clientMetadata: ClientMetadata, p
1300
1293
  * @returns SHA-256 hash of canonical content
1301
1294
  */
1302
1295
  export declare function computeContentHash(card: CCv3Data): Promise<string>;
1303
- /**
1304
- * Compute content hash v2 for a card (standalone utility)
1305
- *
1306
- * @param card - CCv3 card data
1307
- * @returns SHA-256 hash of canonical content v2
1308
- */
1309
- export declare function computeContentHashV2(card: CCv3Data): Promise<string>;
1310
1296
  /**
1311
1297
  * Options for synchronous metadata validation
1312
1298
  */
package/dist/loader.js CHANGED
@@ -8697,7 +8697,7 @@ function defaultTokenCounter(_card) {
8697
8697
  total: 0
8698
8698
  };
8699
8699
  }
8700
- function getCanonicalContentV1(card) {
8700
+ function getCanonicalContent(card) {
8701
8701
  const normalized = {
8702
8702
  name: card.data.name,
8703
8703
  description: card.data.description || "",
@@ -8719,69 +8719,6 @@ function getCanonicalContentV1(card) {
8719
8719
  };
8720
8720
  return JSON.stringify(normalized, Object.keys(normalized).sort());
8721
8721
  }
8722
- function stableStringify(value) {
8723
- if (value === null) return "null";
8724
- switch (typeof value) {
8725
- case "string":
8726
- return JSON.stringify(value);
8727
- case "number":
8728
- return Number.isFinite(value) ? String(value) : "null";
8729
- case "boolean":
8730
- return value ? "true" : "false";
8731
- case "bigint":
8732
- return JSON.stringify(value.toString());
8733
- case "undefined":
8734
- case "function":
8735
- case "symbol":
8736
- return "null";
8737
- case "object": {
8738
- if (Array.isArray(value)) {
8739
- const parts2 = value.map((item) => {
8740
- if (item === void 0 || typeof item === "function" || typeof item === "symbol") {
8741
- return "null";
8742
- }
8743
- return stableStringify(item);
8744
- });
8745
- return `[${parts2.join(",")}]`;
8746
- }
8747
- const obj = value;
8748
- const keys = Object.keys(obj).sort();
8749
- const parts = [];
8750
- for (const key of keys) {
8751
- const v = obj[key];
8752
- if (v === void 0 || typeof v === "function" || typeof v === "symbol") {
8753
- continue;
8754
- }
8755
- parts.push(`${JSON.stringify(key)}:${stableStringify(v)}`);
8756
- }
8757
- return `{${parts.join(",")}}`;
8758
- }
8759
- default:
8760
- return "null";
8761
- }
8762
- }
8763
- function getCanonicalContentV2(card) {
8764
- const normalized = {
8765
- name: card.data.name,
8766
- description: card.data.description || "",
8767
- personality: card.data.personality || "",
8768
- scenario: card.data.scenario || "",
8769
- first_mes: card.data.first_mes || "",
8770
- mes_example: card.data.mes_example || "",
8771
- system_prompt: card.data.system_prompt || "",
8772
- post_history_instructions: card.data.post_history_instructions || "",
8773
- alternate_greetings: card.data.alternate_greetings || [],
8774
- character_book: card.data.character_book ? {
8775
- entries: (card.data.character_book.entries || []).map((e) => ({
8776
- keys: e.keys,
8777
- content: e.content,
8778
- enabled: e.enabled
8779
- }))
8780
- } : null,
8781
- creator_notes: card.data.creator_notes || ""
8782
- };
8783
- return stableStringify(normalized);
8784
- }
8785
8722
  function isWithinTolerance(clientValue, computedValue, tolerance) {
8786
8723
  if (clientValue === void 0) return false;
8787
8724
  if (computedValue === 0) return clientValue === 0;
@@ -8802,18 +8739,15 @@ async function validateClientMetadata(clientMetadata, parseResult, options = {})
8802
8739
  const warnings = [];
8803
8740
  const errors = [];
8804
8741
  const computedTokens = countTokens(card);
8805
- const canonicalContentV1 = getCanonicalContentV1(card);
8806
- const canonicalContentV2 = getCanonicalContentV2(card);
8807
- const computedHashV1 = await computeHash(canonicalContentV1);
8808
- const computedHashV2 = await computeHash(canonicalContentV2);
8742
+ const canonicalContent = getCanonicalContent(card);
8743
+ const computedHash = await computeHash(canonicalContent);
8809
8744
  const entries = card.data.character_book?.entries || [];
8810
8745
  const computedHasLorebook = entries.length > 0;
8811
8746
  const computedLorebookCount = entries.length;
8812
8747
  const authoritative = {
8813
8748
  name: card.data.name,
8814
8749
  tokens: computedTokens,
8815
- contentHash: computedHashV1,
8816
- contentHashV2: computedHashV2,
8750
+ contentHash: computedHash,
8817
8751
  hasLorebook: computedHasLorebook,
8818
8752
  lorebookEntriesCount: computedLorebookCount
8819
8753
  };
@@ -8825,27 +8759,21 @@ async function validateClientMetadata(clientMetadata, parseResult, options = {})
8825
8759
  withinTolerance: false
8826
8760
  });
8827
8761
  }
8828
- const matchesV1 = clientMetadata.contentHash === computedHashV1;
8829
- const matchesV2 = clientMetadata.contentHash === computedHashV2;
8830
- if (!matchesV1 && !matchesV2) {
8762
+ if (clientMetadata.contentHash !== computedHash) {
8831
8763
  const disc = {
8832
8764
  field: "contentHash",
8833
8765
  clientValue: clientMetadata.contentHash,
8834
- computedValue: computedHashV1,
8766
+ computedValue: computedHash,
8835
8767
  withinTolerance: false
8836
8768
  };
8837
8769
  discrepancies.push(disc);
8838
8770
  if (allowHashMismatch) {
8839
8771
  warnings.push(
8840
- `Content hash mismatch: client=${clientMetadata.contentHash.substring(0, 8)}..., server(v1)=${computedHashV1.substring(0, 8)}..., server(v2)=${computedHashV2.substring(0, 8)}...`
8772
+ `Content hash mismatch: client=${clientMetadata.contentHash.substring(0, 8)}..., server=${computedHash.substring(0, 8)}...`
8841
8773
  );
8842
8774
  } else {
8843
8775
  errors.push("Content hash mismatch - possible tampering or encoding difference");
8844
8776
  }
8845
- } else if (matchesV1 && !matchesV2) {
8846
- warnings.push(
8847
- "Client contentHash matches legacy v1 canonicalization. Prefer authoritative.contentHashV2 for new storage."
8848
- );
8849
8777
  }
8850
8778
  const tokenFields = [
8851
8779
  "description",
@@ -8926,11 +8854,7 @@ async function validateClientMetadata(clientMetadata, parseResult, options = {})
8926
8854
  };
8927
8855
  }
8928
8856
  async function computeContentHash(card) {
8929
- const content = getCanonicalContentV1(card);
8930
- return sha256Hash(content);
8931
- }
8932
- async function computeContentHashV2(card) {
8933
- const content = getCanonicalContentV2(card);
8857
+ const content = getCanonicalContent(card);
8934
8858
  return sha256Hash(content);
8935
8859
  }
8936
8860
  function validateClientMetadataSync(clientMetadata, parseResult, options) {
@@ -8946,18 +8870,15 @@ function validateClientMetadataSync(clientMetadata, parseResult, options) {
8946
8870
  const warnings = [];
8947
8871
  const errors = [];
8948
8872
  const computedTokens = countTokens(card);
8949
- const canonicalContentV1 = getCanonicalContentV1(card);
8950
- const canonicalContentV2 = getCanonicalContentV2(card);
8951
- const computedHashV1 = computeHash(canonicalContentV1);
8952
- const computedHashV2 = computeHash(canonicalContentV2);
8873
+ const canonicalContent = getCanonicalContent(card);
8874
+ const computedHash = computeHash(canonicalContent);
8953
8875
  const entries = card.data.character_book?.entries || [];
8954
8876
  const computedHasLorebook = entries.length > 0;
8955
8877
  const computedLorebookCount = entries.length;
8956
8878
  const authoritative = {
8957
8879
  name: card.data.name,
8958
8880
  tokens: computedTokens,
8959
- contentHash: computedHashV1,
8960
- contentHashV2: computedHashV2,
8881
+ contentHash: computedHash,
8961
8882
  hasLorebook: computedHasLorebook,
8962
8883
  lorebookEntriesCount: computedLorebookCount
8963
8884
  };
@@ -8969,13 +8890,11 @@ function validateClientMetadataSync(clientMetadata, parseResult, options) {
8969
8890
  withinTolerance: false
8970
8891
  });
8971
8892
  }
8972
- const matchesV1 = clientMetadata.contentHash === computedHashV1;
8973
- const matchesV2 = clientMetadata.contentHash === computedHashV2;
8974
- if (!matchesV1 && !matchesV2) {
8893
+ if (clientMetadata.contentHash !== computedHash) {
8975
8894
  discrepancies.push({
8976
8895
  field: "contentHash",
8977
8896
  clientValue: clientMetadata.contentHash,
8978
- computedValue: computedHashV1,
8897
+ computedValue: computedHash,
8979
8898
  withinTolerance: false
8980
8899
  });
8981
8900
  if (allowHashMismatch) {
@@ -8983,10 +8902,6 @@ function validateClientMetadataSync(clientMetadata, parseResult, options) {
8983
8902
  } else {
8984
8903
  errors.push("Content hash mismatch");
8985
8904
  }
8986
- } else if (matchesV1 && !matchesV2) {
8987
- warnings.push(
8988
- "Client contentHash matches legacy v1 canonicalization. Prefer authoritative.contentHashV2 for new storage."
8989
- );
8990
8905
  }
8991
8906
  const tokenFields = [
8992
8907
  "description",
@@ -9055,7 +8970,6 @@ function validateClientMetadataSync(clientMetadata, parseResult, options) {
9055
8970
  }
9056
8971
  export {
9057
8972
  computeContentHash,
9058
- computeContentHashV2,
9059
8973
  detectFormat,
9060
8974
  getContainerFormat,
9061
8975
  mightBeCard,