dotmem 0.1.1 → 0.1.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/global.cjs CHANGED
@@ -1657,7 +1657,10 @@ var init_discover = __esm({
1657
1657
  `);
1658
1658
  }
1659
1659
  }, "diagnostic");
1660
- DEFAULT_LIMITS = { current: 5, deep: 25 };
1660
+ DEFAULT_LIMITS = {
1661
+ current: 8,
1662
+ deep: 25
1663
+ };
1661
1664
  FIELD_ORDER = [
1662
1665
  "id",
1663
1666
  "knowledge",
@@ -2882,7 +2885,7 @@ var init_policy_store = __esm({
2882
2885
  });
2883
2886
 
2884
2887
  // core/knowledge/acquisition-limits.ts
2885
- var MEMORY_ACQUIRE_LIMITS, MEMORY_ACQUIRE_LIMITS_MCP, MEMORY_STORE_LIMITS, DOTMEM_ACQUIRE_ERROR_CODES, MemoryAcquireLimitError, MemoryAcquireConcurrencyError, encoder, serializedBytes, measureKnowledge, checkAcquireLimits;
2888
+ var MEMORY_ACQUIRE_LIMITS, MEMORY_ACQUIRE_LIMITS_MCP, MEMORY_STORE_LIMITS, DOTMEM_ACQUIRE_ERROR_CODES, MemoryAcquireLimitError, MemoryAcquireConcurrencyError, MemoryAcquireDuplicateClaimError, encoder, serializedBytes, measureKnowledge, checkAcquireLimits;
2886
2889
  var init_acquisition_limits = __esm({
2887
2890
  "core/knowledge/acquisition-limits.ts"() {
2888
2891
  MEMORY_ACQUIRE_LIMITS = Object.freeze({
@@ -2905,7 +2908,8 @@ var init_acquisition_limits = __esm({
2905
2908
  STORE_UNREADABLE: "DOTMEM_STORE_UNREADABLE",
2906
2909
  CONCURRENT_WRITE: "DOTMEM_CONCURRENT_WRITE",
2907
2910
  SESSION_ACQUIRE_LIMIT: "DOTMEM_SESSION_ACQUIRE_LIMIT",
2908
- POLICY_REFUSED: "DOTMEM_POLICY_REFUSED"
2911
+ POLICY_REFUSED: "DOTMEM_POLICY_REFUSED",
2912
+ DUPLICATE_CLAIM: "DOTMEM_DUPLICATE_CLAIM"
2909
2913
  });
2910
2914
  MemoryAcquireLimitError = class extends Error {
2911
2915
  static {
@@ -2929,6 +2933,17 @@ var init_acquisition_limits = __esm({
2929
2933
  this.name = "MemoryAcquireConcurrencyError";
2930
2934
  }
2931
2935
  };
2936
+ MemoryAcquireDuplicateClaimError = class extends Error {
2937
+ static {
2938
+ __name(this, "MemoryAcquireDuplicateClaimError");
2939
+ }
2940
+ code = DOTMEM_ACQUIRE_ERROR_CODES.DUPLICATE_CLAIM;
2941
+ retryable = false;
2942
+ constructor(message, options) {
2943
+ super(message, options);
2944
+ this.name = "MemoryAcquireDuplicateClaimError";
2945
+ }
2946
+ };
2932
2947
  encoder = new TextEncoder();
2933
2948
  serializedBytes = /* @__PURE__ */ __name((value) => {
2934
2949
  const json = JSON.stringify(value);
@@ -5409,6 +5424,267 @@ var init_user_identity = __esm({
5409
5424
  }
5410
5425
  });
5411
5426
 
5427
+ // core/knowledge/user-language.ts
5428
+ var user_language_exports = {};
5429
+ __export(user_language_exports, {
5430
+ DEFAULT_LANGUAGE: () => DEFAULT_LANGUAGE,
5431
+ DEFAULT_RESPONSE_LANGUAGE: () => DEFAULT_RESPONSE_LANGUAGE,
5432
+ DEFAULT_USER_LANGUAGE: () => DEFAULT_USER_LANGUAGE,
5433
+ LANGUAGE_DEFAULT: () => LANGUAGE_DEFAULT,
5434
+ LANGUAGE_PREFERENCE_FILE_NAME: () => LANGUAGE_PREFERENCE_FILE_NAME,
5435
+ PREFERENCES_FILE_NAME: () => PREFERENCES_FILE_NAME,
5436
+ USER_LANGUAGE_DEFAULT: () => USER_LANGUAGE_DEFAULT,
5437
+ USER_LANGUAGE_FILE_NAME: () => USER_LANGUAGE_FILE_NAME,
5438
+ USER_LANGUAGE_PREFERENCE_FILE_NAME: () => USER_LANGUAGE_PREFERENCE_FILE_NAME,
5439
+ USER_PREFERENCES_FILE_NAME: () => USER_PREFERENCES_FILE_NAME,
5440
+ getLanguagePreference: () => getLanguagePreference,
5441
+ getResponseLanguage: () => getResponseLanguage,
5442
+ getUserLanguage: () => getUserLanguage,
5443
+ getUserLanguagePreference: () => getUserLanguagePreference,
5444
+ isItalian: () => isItalian,
5445
+ language: () => language,
5446
+ languageTag: () => languageTag,
5447
+ loadLanguagePreference: () => loadLanguagePreference,
5448
+ loadUserLanguage: () => loadUserLanguage,
5449
+ loadUserLanguagePreference: () => loadUserLanguagePreference,
5450
+ preferredLanguage: () => preferredLanguage,
5451
+ readUserLanguage: () => readUserLanguage,
5452
+ resolveLanguage: () => resolveLanguage,
5453
+ resolveLanguagePath: () => resolveLanguagePath,
5454
+ resolveLanguagePreference: () => resolveLanguagePreference,
5455
+ resolveLanguagePreferencePath: () => resolveLanguagePreferencePath,
5456
+ resolveResponseLanguage: () => resolveResponseLanguage,
5457
+ resolveUserLanguage: () => resolveUserLanguage,
5458
+ resolveUserLanguagePath: () => resolveUserLanguagePath,
5459
+ resolveUserLanguagePreferencePath: () => resolveUserLanguagePreferencePath,
5460
+ responseLanguage: () => responseLanguage,
5461
+ saveLanguagePreference: () => saveLanguagePreference,
5462
+ saveUserLanguage: () => saveUserLanguage,
5463
+ setUserLanguage: () => setUserLanguage,
5464
+ userLanguage: () => userLanguage,
5465
+ writeUserLanguage: () => writeUserLanguage
5466
+ });
5467
+ function joinPath3(base, child) {
5468
+ const separator3 = process.platform === "win32" ? "\\" : "/";
5469
+ return `${base.replace(/[\\/]+/g, separator3)}${separator3}${child}`;
5470
+ }
5471
+ function resolveUserLanguagePath() {
5472
+ return joinPath3(resolveUserDotMemPath(), USER_LANGUAGE_FILE_NAME);
5473
+ }
5474
+ function resolveUserLanguagePreferencePath() {
5475
+ return resolveUserLanguagePath();
5476
+ }
5477
+ function resolveLanguagePath() {
5478
+ return resolveUserLanguagePath();
5479
+ }
5480
+ function resolveLanguagePreferencePath() {
5481
+ return resolveUserLanguagePath();
5482
+ }
5483
+ function readJsonFile(path) {
5484
+ const fs = getSyncFs();
5485
+ if (!fs) return null;
5486
+ let raw;
5487
+ try {
5488
+ raw = fs.readFileSync(path, "utf8");
5489
+ } catch {
5490
+ return null;
5491
+ }
5492
+ if (typeof raw !== "string") return null;
5493
+ if (raw.charCodeAt(0) === 65279) raw = raw.slice(1);
5494
+ try {
5495
+ return JSON.parse(raw);
5496
+ } catch {
5497
+ return null;
5498
+ }
5499
+ }
5500
+ function extractLanguage(value) {
5501
+ if (value === null || value === void 0) return null;
5502
+ if (typeof value === "string") {
5503
+ const trimmed = value.trim();
5504
+ return trimmed ? trimmed : null;
5505
+ }
5506
+ if (typeof value !== "object" || Array.isArray(value)) return null;
5507
+ for (const key of LANGUAGE_KEYS) {
5508
+ if (Object.prototype.hasOwnProperty.call(value, key)) {
5509
+ const candidate = extractLanguage(value[key]);
5510
+ if (candidate) return candidate;
5511
+ }
5512
+ }
5513
+ for (const containerKey of ["preferences", "user", "agent", "config", "settings", "storage"]) {
5514
+ if (Object.prototype.hasOwnProperty.call(value, containerKey)) {
5515
+ const candidate = extractLanguage(value[containerKey]);
5516
+ if (candidate) return candidate;
5517
+ }
5518
+ }
5519
+ return null;
5520
+ }
5521
+ function loadUserLanguage() {
5522
+ const fs = getSyncFs();
5523
+ const anchor = resolveUserDotMemPath();
5524
+ if (fs) {
5525
+ for (const name of LANGUAGE_FILE_NAMES) {
5526
+ const candidatePath = joinPath3(anchor, name);
5527
+ const parsed = readJsonFile(candidatePath);
5528
+ const language2 = extractLanguage(parsed);
5529
+ if (language2) return language2;
5530
+ }
5531
+ try {
5532
+ const govPath = joinPath3(joinPath3(anchor, "policy"), "identity-governance.json");
5533
+ const gov = readJsonFile(govPath);
5534
+ const language2 = extractLanguage(gov);
5535
+ if (language2) return language2;
5536
+ } catch {
5537
+ }
5538
+ try {
5539
+ const settingsPath = joinPath3(anchor, "dotmem.settings.json");
5540
+ const settings = readJsonFile(settingsPath);
5541
+ const language2 = extractLanguage(settings);
5542
+ if (language2) return language2;
5543
+ } catch {
5544
+ }
5545
+ }
5546
+ const env = globalThis?.process?.env;
5547
+ const envLang = env?.DOTMEM_LANGUAGE || env?.DOTMEM_RESPONSE_LANGUAGE || env?.DOTMEM_USER_LANGUAGE;
5548
+ if (typeof envLang === "string" && envLang.trim()) return envLang.trim();
5549
+ return DEFAULT_USER_LANGUAGE;
5550
+ }
5551
+ function readUserLanguage() {
5552
+ return loadUserLanguage();
5553
+ }
5554
+ function getUserLanguage() {
5555
+ return loadUserLanguage();
5556
+ }
5557
+ function resolveUserLanguage() {
5558
+ return loadUserLanguage();
5559
+ }
5560
+ function resolveLanguage() {
5561
+ return loadUserLanguage();
5562
+ }
5563
+ function loadLanguagePreference() {
5564
+ return loadUserLanguage();
5565
+ }
5566
+ function getLanguagePreference() {
5567
+ return loadUserLanguage();
5568
+ }
5569
+ function resolveLanguagePreference() {
5570
+ return loadUserLanguage();
5571
+ }
5572
+ function loadUserLanguagePreference() {
5573
+ return loadUserLanguage();
5574
+ }
5575
+ function getUserLanguagePreference() {
5576
+ return loadUserLanguage();
5577
+ }
5578
+ function resolveResponseLanguage() {
5579
+ return loadUserLanguage();
5580
+ }
5581
+ function getResponseLanguage() {
5582
+ return loadUserLanguage();
5583
+ }
5584
+ async function setUserLanguage(language2) {
5585
+ const fsMod = await import('fs/promises');
5586
+ const path = resolveUserLanguagePath();
5587
+ const dir = parentStoragePath(path);
5588
+ await fsMod.mkdir(dir, { recursive: true });
5589
+ const payload = { format: "dotmem.language", version: 1, language: String(language2).trim() };
5590
+ const temporary = `${path}.${process.pid}.${Date.now().toString(36)}.tmp`;
5591
+ await fsMod.writeFile(temporary, `${JSON.stringify(payload, null, 2)}
5592
+ `, "utf8");
5593
+ await fsMod.rename(temporary, path);
5594
+ return payload.language;
5595
+ }
5596
+ async function saveUserLanguage(language2) {
5597
+ return setUserLanguage(language2);
5598
+ }
5599
+ async function writeUserLanguage(language2) {
5600
+ return setUserLanguage(language2);
5601
+ }
5602
+ async function saveLanguagePreference(language2) {
5603
+ return setUserLanguage(language2);
5604
+ }
5605
+ function isItalian(language2) {
5606
+ const value = (language2 ?? loadUserLanguage()).toLowerCase();
5607
+ return value === "it" || value === "it-it" || value.startsWith("it-");
5608
+ }
5609
+ function languageTag() {
5610
+ return loadUserLanguage();
5611
+ }
5612
+ var USER_LANGUAGE_FILE_NAME, USER_LANGUAGE_PREFERENCE_FILE_NAME, LANGUAGE_PREFERENCE_FILE_NAME, USER_PREFERENCES_FILE_NAME, PREFERENCES_FILE_NAME, DEFAULT_USER_LANGUAGE, DEFAULT_LANGUAGE, USER_LANGUAGE_DEFAULT, LANGUAGE_DEFAULT, DEFAULT_RESPONSE_LANGUAGE, LANGUAGE_FILE_NAMES, LANGUAGE_KEYS, userLanguage, language, responseLanguage, preferredLanguage;
5613
+ var init_user_language = __esm({
5614
+ "core/knowledge/user-language.ts"() {
5615
+ init_user_paths();
5616
+ init_storage_paths();
5617
+ USER_LANGUAGE_FILE_NAME = "language.json";
5618
+ USER_LANGUAGE_PREFERENCE_FILE_NAME = "user-language.json";
5619
+ LANGUAGE_PREFERENCE_FILE_NAME = "language-preference.json";
5620
+ USER_PREFERENCES_FILE_NAME = "user-preferences.json";
5621
+ PREFERENCES_FILE_NAME = "preferences.json";
5622
+ DEFAULT_USER_LANGUAGE = "it-IT";
5623
+ DEFAULT_LANGUAGE = "it-IT";
5624
+ USER_LANGUAGE_DEFAULT = "it-IT";
5625
+ LANGUAGE_DEFAULT = "it-IT";
5626
+ DEFAULT_RESPONSE_LANGUAGE = "it-IT";
5627
+ LANGUAGE_FILE_NAMES = [
5628
+ USER_LANGUAGE_FILE_NAME,
5629
+ USER_LANGUAGE_PREFERENCE_FILE_NAME,
5630
+ LANGUAGE_PREFERENCE_FILE_NAME,
5631
+ USER_PREFERENCES_FILE_NAME,
5632
+ PREFERENCES_FILE_NAME,
5633
+ "config.json",
5634
+ "user-config.json",
5635
+ "agent-config.json",
5636
+ "dotmem.config.json"
5637
+ ];
5638
+ LANGUAGE_KEYS = [
5639
+ "language",
5640
+ "Language",
5641
+ "responseLanguage",
5642
+ "response_language",
5643
+ "preferredLanguage",
5644
+ "preferred_language",
5645
+ "userLanguage",
5646
+ "user_language",
5647
+ "defaultLanguage",
5648
+ "default_language",
5649
+ "locale",
5650
+ "lang",
5651
+ "uiLanguage",
5652
+ "ui_language",
5653
+ "conversationLanguage",
5654
+ "conversation_language"
5655
+ ];
5656
+ __name(joinPath3, "joinPath");
5657
+ __name(resolveUserLanguagePath, "resolveUserLanguagePath");
5658
+ __name(resolveUserLanguagePreferencePath, "resolveUserLanguagePreferencePath");
5659
+ __name(resolveLanguagePath, "resolveLanguagePath");
5660
+ __name(resolveLanguagePreferencePath, "resolveLanguagePreferencePath");
5661
+ __name(readJsonFile, "readJsonFile");
5662
+ __name(extractLanguage, "extractLanguage");
5663
+ __name(loadUserLanguage, "loadUserLanguage");
5664
+ __name(readUserLanguage, "readUserLanguage");
5665
+ __name(getUserLanguage, "getUserLanguage");
5666
+ __name(resolveUserLanguage, "resolveUserLanguage");
5667
+ __name(resolveLanguage, "resolveLanguage");
5668
+ __name(loadLanguagePreference, "loadLanguagePreference");
5669
+ __name(getLanguagePreference, "getLanguagePreference");
5670
+ __name(resolveLanguagePreference, "resolveLanguagePreference");
5671
+ __name(loadUserLanguagePreference, "loadUserLanguagePreference");
5672
+ __name(getUserLanguagePreference, "getUserLanguagePreference");
5673
+ __name(resolveResponseLanguage, "resolveResponseLanguage");
5674
+ __name(getResponseLanguage, "getResponseLanguage");
5675
+ __name(setUserLanguage, "setUserLanguage");
5676
+ __name(saveUserLanguage, "saveUserLanguage");
5677
+ __name(writeUserLanguage, "writeUserLanguage");
5678
+ __name(saveLanguagePreference, "saveLanguagePreference");
5679
+ __name(isItalian, "isItalian");
5680
+ __name(languageTag, "languageTag");
5681
+ userLanguage = loadUserLanguage();
5682
+ language = loadUserLanguage();
5683
+ responseLanguage = loadUserLanguage();
5684
+ preferredLanguage = loadUserLanguage();
5685
+ }
5686
+ });
5687
+
5412
5688
  // core/profile/ai.json
5413
5689
  var ai_default;
5414
5690
  var init_ai = __esm({
@@ -5817,6 +6093,45 @@ var init_project_identity = __esm({
5817
6093
  }
5818
6094
  });
5819
6095
 
6096
+ // core/knowledge/uuid.ts
6097
+ var generateUuidV7;
6098
+ var init_uuid = __esm({
6099
+ "core/knowledge/uuid.ts"() {
6100
+ generateUuidV7 = /* @__PURE__ */ __name(() => {
6101
+ const cryptoObj = globalThis.crypto;
6102
+ const ms = Date.now();
6103
+ const rand = new Uint8Array(10);
6104
+ if (cryptoObj && typeof cryptoObj.getRandomValues === "function") {
6105
+ cryptoObj.getRandomValues(rand);
6106
+ } else {
6107
+ for (let i2 = 0; i2 < rand.length; i2 += 1) {
6108
+ rand[i2] = Math.floor(Math.random() * 256);
6109
+ }
6110
+ }
6111
+ const bytes = new Uint8Array(16);
6112
+ bytes[0] = ms / 1099511627776 & 255;
6113
+ bytes[1] = ms / 4294967296 & 255;
6114
+ bytes[2] = ms / 16777216 & 255;
6115
+ bytes[3] = ms / 65536 & 255;
6116
+ bytes[4] = ms / 256 & 255;
6117
+ bytes[5] = ms & 255;
6118
+ const randA = (rand[0] << 8 | rand[1]) & 4095;
6119
+ bytes[6] = 112 | randA >> 8;
6120
+ bytes[7] = randA & 255;
6121
+ bytes[8] = 128 | rand[2] & 63;
6122
+ bytes[9] = rand[3];
6123
+ bytes[10] = rand[4];
6124
+ bytes[11] = rand[5];
6125
+ bytes[12] = rand[6];
6126
+ bytes[13] = rand[7];
6127
+ bytes[14] = rand[8];
6128
+ bytes[15] = rand[9];
6129
+ const hex = Array.from(bytes).map((byte) => byte.toString(16).padStart(2, "0")).join("");
6130
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
6131
+ }, "generateUuidV7");
6132
+ }
6133
+ });
6134
+
5820
6135
  // core/knowledge/staging.ts
5821
6136
  var DOTMEM_STAGE_FORMAT, DOTMEM_STAGE_VERSION, StageFileError, generateRequestId, nodeCwd, resolveStagingDirectory, stagePathFor, nodeFs6, normalizeClaimIds, revisionFromOptions, writeStageFile, readStageFile, validateStageFile, commitStageFile, cleanupStageFile;
5822
6137
  var init_staging = __esm({
@@ -5828,6 +6143,7 @@ var init_staging = __esm({
5828
6143
  init_store_queue();
5829
6144
  init_state();
5830
6145
  init_project_identity();
6146
+ init_uuid();
5831
6147
  init_project_anchor();
5832
6148
  DOTMEM_STAGE_FORMAT = "dotmem.stage";
5833
6149
  DOTMEM_STAGE_VERSION = 1;
@@ -5871,9 +6187,11 @@ var init_staging = __esm({
5871
6187
  return void 0;
5872
6188
  }, "revisionFromOptions");
5873
6189
  writeStageFile = /* @__PURE__ */ __name(async (claim, scope, sourceProject) => {
6190
+ const claimId = claim.id && claim.id.trim() ? claim.id.trim() : generateUuidV7();
5874
6191
  const sanitized = sanitizeKnowledge(claim.knowledge);
5875
6192
  const sanitizedClaim = {
5876
6193
  ...claim,
6194
+ id: claimId,
5877
6195
  knowledge: sanitized.knowledge
5878
6196
  };
5879
6197
  const requestId = generateRequestId();
@@ -5971,11 +6289,12 @@ var init_staging = __esm({
5971
6289
  ...validated.claim,
5972
6290
  knowledge: boundary.knowledge
5973
6291
  };
6292
+ const claimId = sanitizedClaim.id && sanitizedClaim.id.trim() ? sanitizedClaim.id.trim() : generateUuidV7();
5974
6293
  const kind = boundary.kind ?? "experience";
5975
6294
  const target = await resolveMemoryTarget(kind, scope, sourceProject);
5976
6295
  const revision = revisionFromOptions(sanitizedClaim);
5977
6296
  const claim = buildClaimRecord({
5978
- id: sanitizedClaim.id,
6297
+ id: claimId,
5979
6298
  knowledge: sanitizedClaim.knowledge,
5980
6299
  applicability: sanitizedClaim.applicability,
5981
6300
  evidence: sanitizedClaim.evidence,
@@ -5995,13 +6314,13 @@ var init_staging = __esm({
5995
6314
  });
5996
6315
  });
5997
6316
  const verification = await target.repository.load();
5998
- if (!verification.claims.some((c) => c.id === sanitizedClaim.id)) {
5999
- throw new Error(`Persistence verification failed: claim ${sanitizedClaim.id} was not persisted`);
6317
+ if (!verification.claims.some((c) => c.id === claimId)) {
6318
+ throw new Error(`Persistence verification failed: claim ${claimId} was not persisted`);
6000
6319
  }
6001
6320
  await cleanupStageFile(requestId);
6002
6321
  return {
6003
6322
  requestId,
6004
- claimId: sanitizedClaim.id,
6323
+ claimId,
6005
6324
  sourceId: target.sourceId,
6006
6325
  scope,
6007
6326
  kind
@@ -6022,12 +6341,12 @@ var init_staging = __esm({
6022
6341
  });
6023
6342
 
6024
6343
  // core/knowledge/loops.ts
6025
- function joinPath3(base, child) {
6344
+ function joinPath4(base, child) {
6026
6345
  const separator3 = process.platform === "win32" ? "\\" : "/";
6027
6346
  return `${base.replace(/[\\/]+/g, separator3)}${separator3}${child}`;
6028
6347
  }
6029
6348
  function resolveLoopsFilePath() {
6030
- return joinPath3(resolveUserDotMemPath(), LOOPS_FILE_NAME);
6349
+ return joinPath4(resolveUserDotMemPath(), LOOPS_FILE_NAME);
6031
6350
  }
6032
6351
  async function readFile(path) {
6033
6352
  try {
@@ -6159,7 +6478,7 @@ var init_loops = __esm({
6159
6478
  init_user_paths();
6160
6479
  LOOPS_FILE_NAME = "loops.json";
6161
6480
  LOOPS_FORMAT_VERSION = 1;
6162
- __name(joinPath3, "joinPath");
6481
+ __name(joinPath4, "joinPath");
6163
6482
  __name(resolveLoopsFilePath, "resolveLoopsFilePath");
6164
6483
  __name(readFile, "readFile");
6165
6484
  __name(writeFile, "writeFile");
@@ -6255,12 +6574,12 @@ var init_session = __esm({
6255
6574
  });
6256
6575
 
6257
6576
  // core/knowledge/exemplars.ts
6258
- function joinPath4(base, child) {
6577
+ function joinPath5(base, child) {
6259
6578
  const separator3 = process.platform === "win32" ? "\\" : "/";
6260
6579
  return `${base.replace(/[\\/]+/g, separator3)}${separator3}${child}`;
6261
6580
  }
6262
6581
  function resolveExemplarsPath() {
6263
- return joinPath4(resolveUserDotMemPath(), EXEMPLARS_FILE_NAME);
6582
+ return joinPath5(resolveUserDotMemPath(), EXEMPLARS_FILE_NAME);
6264
6583
  }
6265
6584
  async function readFile2(path) {
6266
6585
  try {
@@ -6397,7 +6716,7 @@ var init_exemplars = __esm({
6397
6716
  init_user_paths();
6398
6717
  EXEMPLARS_FILE_NAME = "exemplars.json";
6399
6718
  EXEMPLARS_FORMAT_VERSION = 1;
6400
- __name(joinPath4, "joinPath");
6719
+ __name(joinPath5, "joinPath");
6401
6720
  __name(resolveExemplarsPath, "resolveExemplarsPath");
6402
6721
  __name(readFile2, "readFile");
6403
6722
  __name(writeFile2, "writeFile");
@@ -6412,12 +6731,12 @@ var init_exemplars = __esm({
6412
6731
  });
6413
6732
 
6414
6733
  // core/knowledge/personality-anchor.ts
6415
- function joinPath5(base, child) {
6734
+ function joinPath6(base, child) {
6416
6735
  const separator3 = process.platform === "win32" ? "\\" : "/";
6417
6736
  return `${base.replace(/[\\/]+/g, separator3)}${separator3}${child}`;
6418
6737
  }
6419
6738
  function resolvePersonalityAnchorPath() {
6420
- return joinPath5(resolveUserDotMemPath(), PERSONALITY_ANCHOR_FILE_NAME);
6739
+ return joinPath6(resolveUserDotMemPath(), PERSONALITY_ANCHOR_FILE_NAME);
6421
6740
  }
6422
6741
  async function readFile3(path) {
6423
6742
  try {
@@ -6605,7 +6924,7 @@ var init_personality_anchor = __esm({
6605
6924
  init_user_paths();
6606
6925
  PERSONALITY_ANCHOR_FILE_NAME = "personality-anchor.json";
6607
6926
  PERSONALITY_ANCHOR_FORMAT_VERSION = 1;
6608
- __name(joinPath5, "joinPath");
6927
+ __name(joinPath6, "joinPath");
6609
6928
  __name(resolvePersonalityAnchorPath, "resolvePersonalityAnchorPath");
6610
6929
  __name(readFile3, "readFile");
6611
6930
  __name(writeFile3, "writeFile");
@@ -6648,6 +6967,7 @@ var init_knowledge = __esm({
6648
6967
  init_storage_location();
6649
6968
  init_storage_settings();
6650
6969
  init_user_identity();
6970
+ init_user_language();
6651
6971
  init_identity_resolution();
6652
6972
  init_identity_governance();
6653
6973
  init_effective_contract();
@@ -8390,6 +8710,8 @@ init_router();
8390
8710
  init_store_queue();
8391
8711
  init_staging();
8392
8712
  init_user_paths();
8713
+ init_uuid();
8714
+ init_acquisition_limits();
8393
8715
  init_storage_coordinator();
8394
8716
  init_mem_repository();
8395
8717
  function normalizeClaimIds3(value) {
@@ -8440,9 +8762,10 @@ async function findClaimAcrossAllSources(claimId, scope, sourceProject) {
8440
8762
  __name(findClaimAcrossAllSources, "findClaimAcrossAllSources");
8441
8763
  var acquire = {
8442
8764
  async acquire(opts) {
8765
+ const claimId = opts.id && opts.id.trim() ? opts.id.trim() : generateUuidV7();
8443
8766
  if (opts.scope === void 0 && opts.applicability?.scope !== void 0) {
8444
8767
  throw new Error(
8445
- `Claim ${opts.id} uses applicability.scope for routing. Use top-level scope instead.`
8768
+ `Claim ${claimId} uses applicability.scope for routing. Use top-level scope instead.`
8446
8769
  );
8447
8770
  }
8448
8771
  const scope = opts.scope ?? "project";
@@ -8453,19 +8776,18 @@ var acquire = {
8453
8776
  }
8454
8777
  const boundary = await crossAcquisitionBoundary(opts);
8455
8778
  if (boundary.sanitized && DEV) {
8456
- console.warn(`[dotmem] Sanitized secret values from claim ${opts.id}`);
8779
+ console.warn(`[dotmem] Sanitized secret values from claim ${claimId}`);
8457
8780
  }
8458
8781
  if (boundary.removedTierFields > 0 && DEV) {
8459
- console.warn(`[dotmem] Removed ${boundary.removedTierFields} non-authoritative tier field(s) from claim ${opts.id}`);
8782
+ console.warn(`[dotmem] Removed ${boundary.removedTierFields} non-authoritative tier field(s) from claim ${claimId}`);
8460
8783
  }
8461
8784
  const kind = boundary.kind;
8462
8785
  const target = await resolveMemoryTarget(kind, scope, sourceProject);
8463
- const existing = await findClaimAcrossAllSources(opts.id, scope, sourceProject);
8786
+ const existing = await findClaimAcrossAllSources(claimId, scope, sourceProject);
8464
8787
  if (existing) {
8465
8788
  const acquiredAt = existing.acquiredAt ? ` (acquired ${existing.acquiredAt})` : "";
8466
- throw new Error(
8467
- `Claim id ${opts.id} already exists in ${existing.sourceId}${acquiredAt}. Use a revision relationship (retracts/supersedes/refines) to revise it, or run 'npx dotmem doctor' to audit duplicates.`
8468
- );
8789
+ const detail = `Claim id ${claimId} already exists in ${existing.sourceId}${acquiredAt}. Use a revision relationship (retracts/supersedes/refines) to revise it, or run 'npx dotmem doctor' to audit duplicates.`;
8790
+ throw new MemoryAcquireDuplicateClaimError("A claim with this ID already exists.", { cause: new Error(detail) });
8469
8791
  }
8470
8792
  const revision = revisionFromAcquire2(opts);
8471
8793
  const repository = target.repository;
@@ -8475,7 +8797,7 @@ var acquire = {
8475
8797
  const next = updateKnowledge(state3, {
8476
8798
  basedOnVersion: state3.version,
8477
8799
  claims: [buildClaimRecord({
8478
- id: opts.id,
8800
+ id: claimId,
8479
8801
  knowledge: boundary.knowledge,
8480
8802
  applicability: opts.applicability,
8481
8803
  evidence: opts.evidence,
@@ -8492,10 +8814,11 @@ var acquire = {
8492
8814
  });
8493
8815
  });
8494
8816
  const verification = await target.repository.load();
8495
- if (!verification.claims.some((claim) => claim.id === opts.id)) {
8496
- throw new Error(`Acquisition verification failed: claim ${opts.id} was not persisted`);
8817
+ if (!verification.claims.some((claim) => claim.id === claimId)) {
8818
+ throw new Error(`Acquisition verification failed: claim ${claimId} was not persisted`);
8497
8819
  }
8498
- memorio.dispatch.set("dotmem:memory:acquired", { detail: { id: opts.id } });
8820
+ memorio.dispatch.set("dotmem:memory:acquired", { detail: { id: claimId } });
8821
+ return claimId;
8499
8822
  },
8500
8823
  async acquireStaged(opts) {
8501
8824
  const scope = opts.scope ?? "project";
@@ -8503,7 +8826,8 @@ var acquire = {
8503
8826
  const sourceProject = resolvedProjectId ? normalizeProjectId(resolvedProjectId) : void 0;
8504
8827
  const { requestId } = await writeStageFile(opts, scope, sourceProject);
8505
8828
  try {
8506
- await commitStageFile(requestId);
8829
+ const result = await commitStageFile(requestId);
8830
+ return result.claimId;
8507
8831
  } catch (error) {
8508
8832
  if (error instanceof StageFileError) {
8509
8833
  await cleanupStageFile(requestId);
@@ -9716,6 +10040,17 @@ var memory = {
9716
10040
  return profile.get(id);
9717
10041
  }
9718
10042
  },
10043
+ /** Persistent default response language (canonical user config). */
10044
+ language: {
10045
+ async get() {
10046
+ const m = await Promise.resolve().then(() => (init_user_language(), user_language_exports));
10047
+ return m.resolveUserLanguage();
10048
+ },
10049
+ async set(value) {
10050
+ const m = await Promise.resolve().then(() => (init_user_language(), user_language_exports));
10051
+ return m.setUserLanguage(value);
10052
+ }
10053
+ },
9719
10054
  /** Note surface: store and retrieve markdown files and text blocks. */
9720
10055
  note: {
9721
10056
  async add(opts) {