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.js CHANGED
@@ -1653,7 +1653,10 @@ var init_discover = __esm({
1653
1653
  `);
1654
1654
  }
1655
1655
  }, "diagnostic");
1656
- DEFAULT_LIMITS = { current: 5, deep: 25 };
1656
+ DEFAULT_LIMITS = {
1657
+ current: 8,
1658
+ deep: 25
1659
+ };
1657
1660
  FIELD_ORDER = [
1658
1661
  "id",
1659
1662
  "knowledge",
@@ -2878,7 +2881,7 @@ var init_policy_store = __esm({
2878
2881
  });
2879
2882
 
2880
2883
  // core/knowledge/acquisition-limits.ts
2881
- var MEMORY_ACQUIRE_LIMITS, MEMORY_ACQUIRE_LIMITS_MCP, MEMORY_STORE_LIMITS, DOTMEM_ACQUIRE_ERROR_CODES, MemoryAcquireLimitError, MemoryAcquireConcurrencyError, encoder, serializedBytes, measureKnowledge, checkAcquireLimits;
2884
+ var MEMORY_ACQUIRE_LIMITS, MEMORY_ACQUIRE_LIMITS_MCP, MEMORY_STORE_LIMITS, DOTMEM_ACQUIRE_ERROR_CODES, MemoryAcquireLimitError, MemoryAcquireConcurrencyError, MemoryAcquireDuplicateClaimError, encoder, serializedBytes, measureKnowledge, checkAcquireLimits;
2882
2885
  var init_acquisition_limits = __esm({
2883
2886
  "core/knowledge/acquisition-limits.ts"() {
2884
2887
  MEMORY_ACQUIRE_LIMITS = Object.freeze({
@@ -2901,7 +2904,8 @@ var init_acquisition_limits = __esm({
2901
2904
  STORE_UNREADABLE: "DOTMEM_STORE_UNREADABLE",
2902
2905
  CONCURRENT_WRITE: "DOTMEM_CONCURRENT_WRITE",
2903
2906
  SESSION_ACQUIRE_LIMIT: "DOTMEM_SESSION_ACQUIRE_LIMIT",
2904
- POLICY_REFUSED: "DOTMEM_POLICY_REFUSED"
2907
+ POLICY_REFUSED: "DOTMEM_POLICY_REFUSED",
2908
+ DUPLICATE_CLAIM: "DOTMEM_DUPLICATE_CLAIM"
2905
2909
  });
2906
2910
  MemoryAcquireLimitError = class extends Error {
2907
2911
  static {
@@ -2925,6 +2929,17 @@ var init_acquisition_limits = __esm({
2925
2929
  this.name = "MemoryAcquireConcurrencyError";
2926
2930
  }
2927
2931
  };
2932
+ MemoryAcquireDuplicateClaimError = class extends Error {
2933
+ static {
2934
+ __name(this, "MemoryAcquireDuplicateClaimError");
2935
+ }
2936
+ code = DOTMEM_ACQUIRE_ERROR_CODES.DUPLICATE_CLAIM;
2937
+ retryable = false;
2938
+ constructor(message, options) {
2939
+ super(message, options);
2940
+ this.name = "MemoryAcquireDuplicateClaimError";
2941
+ }
2942
+ };
2928
2943
  encoder = new TextEncoder();
2929
2944
  serializedBytes = /* @__PURE__ */ __name((value) => {
2930
2945
  const json = JSON.stringify(value);
@@ -5405,6 +5420,267 @@ var init_user_identity = __esm({
5405
5420
  }
5406
5421
  });
5407
5422
 
5423
+ // core/knowledge/user-language.ts
5424
+ var user_language_exports = {};
5425
+ __export(user_language_exports, {
5426
+ DEFAULT_LANGUAGE: () => DEFAULT_LANGUAGE,
5427
+ DEFAULT_RESPONSE_LANGUAGE: () => DEFAULT_RESPONSE_LANGUAGE,
5428
+ DEFAULT_USER_LANGUAGE: () => DEFAULT_USER_LANGUAGE,
5429
+ LANGUAGE_DEFAULT: () => LANGUAGE_DEFAULT,
5430
+ LANGUAGE_PREFERENCE_FILE_NAME: () => LANGUAGE_PREFERENCE_FILE_NAME,
5431
+ PREFERENCES_FILE_NAME: () => PREFERENCES_FILE_NAME,
5432
+ USER_LANGUAGE_DEFAULT: () => USER_LANGUAGE_DEFAULT,
5433
+ USER_LANGUAGE_FILE_NAME: () => USER_LANGUAGE_FILE_NAME,
5434
+ USER_LANGUAGE_PREFERENCE_FILE_NAME: () => USER_LANGUAGE_PREFERENCE_FILE_NAME,
5435
+ USER_PREFERENCES_FILE_NAME: () => USER_PREFERENCES_FILE_NAME,
5436
+ getLanguagePreference: () => getLanguagePreference,
5437
+ getResponseLanguage: () => getResponseLanguage,
5438
+ getUserLanguage: () => getUserLanguage,
5439
+ getUserLanguagePreference: () => getUserLanguagePreference,
5440
+ isItalian: () => isItalian,
5441
+ language: () => language,
5442
+ languageTag: () => languageTag,
5443
+ loadLanguagePreference: () => loadLanguagePreference,
5444
+ loadUserLanguage: () => loadUserLanguage,
5445
+ loadUserLanguagePreference: () => loadUserLanguagePreference,
5446
+ preferredLanguage: () => preferredLanguage,
5447
+ readUserLanguage: () => readUserLanguage,
5448
+ resolveLanguage: () => resolveLanguage,
5449
+ resolveLanguagePath: () => resolveLanguagePath,
5450
+ resolveLanguagePreference: () => resolveLanguagePreference,
5451
+ resolveLanguagePreferencePath: () => resolveLanguagePreferencePath,
5452
+ resolveResponseLanguage: () => resolveResponseLanguage,
5453
+ resolveUserLanguage: () => resolveUserLanguage,
5454
+ resolveUserLanguagePath: () => resolveUserLanguagePath,
5455
+ resolveUserLanguagePreferencePath: () => resolveUserLanguagePreferencePath,
5456
+ responseLanguage: () => responseLanguage,
5457
+ saveLanguagePreference: () => saveLanguagePreference,
5458
+ saveUserLanguage: () => saveUserLanguage,
5459
+ setUserLanguage: () => setUserLanguage,
5460
+ userLanguage: () => userLanguage,
5461
+ writeUserLanguage: () => writeUserLanguage
5462
+ });
5463
+ function joinPath3(base, child) {
5464
+ const separator3 = process.platform === "win32" ? "\\" : "/";
5465
+ return `${base.replace(/[\\/]+/g, separator3)}${separator3}${child}`;
5466
+ }
5467
+ function resolveUserLanguagePath() {
5468
+ return joinPath3(resolveUserDotMemPath(), USER_LANGUAGE_FILE_NAME);
5469
+ }
5470
+ function resolveUserLanguagePreferencePath() {
5471
+ return resolveUserLanguagePath();
5472
+ }
5473
+ function resolveLanguagePath() {
5474
+ return resolveUserLanguagePath();
5475
+ }
5476
+ function resolveLanguagePreferencePath() {
5477
+ return resolveUserLanguagePath();
5478
+ }
5479
+ function readJsonFile(path) {
5480
+ const fs = getSyncFs();
5481
+ if (!fs) return null;
5482
+ let raw;
5483
+ try {
5484
+ raw = fs.readFileSync(path, "utf8");
5485
+ } catch {
5486
+ return null;
5487
+ }
5488
+ if (typeof raw !== "string") return null;
5489
+ if (raw.charCodeAt(0) === 65279) raw = raw.slice(1);
5490
+ try {
5491
+ return JSON.parse(raw);
5492
+ } catch {
5493
+ return null;
5494
+ }
5495
+ }
5496
+ function extractLanguage(value) {
5497
+ if (value === null || value === void 0) return null;
5498
+ if (typeof value === "string") {
5499
+ const trimmed = value.trim();
5500
+ return trimmed ? trimmed : null;
5501
+ }
5502
+ if (typeof value !== "object" || Array.isArray(value)) return null;
5503
+ for (const key of LANGUAGE_KEYS) {
5504
+ if (Object.prototype.hasOwnProperty.call(value, key)) {
5505
+ const candidate = extractLanguage(value[key]);
5506
+ if (candidate) return candidate;
5507
+ }
5508
+ }
5509
+ for (const containerKey of ["preferences", "user", "agent", "config", "settings", "storage"]) {
5510
+ if (Object.prototype.hasOwnProperty.call(value, containerKey)) {
5511
+ const candidate = extractLanguage(value[containerKey]);
5512
+ if (candidate) return candidate;
5513
+ }
5514
+ }
5515
+ return null;
5516
+ }
5517
+ function loadUserLanguage() {
5518
+ const fs = getSyncFs();
5519
+ const anchor = resolveUserDotMemPath();
5520
+ if (fs) {
5521
+ for (const name of LANGUAGE_FILE_NAMES) {
5522
+ const candidatePath = joinPath3(anchor, name);
5523
+ const parsed = readJsonFile(candidatePath);
5524
+ const language2 = extractLanguage(parsed);
5525
+ if (language2) return language2;
5526
+ }
5527
+ try {
5528
+ const govPath = joinPath3(joinPath3(anchor, "policy"), "identity-governance.json");
5529
+ const gov = readJsonFile(govPath);
5530
+ const language2 = extractLanguage(gov);
5531
+ if (language2) return language2;
5532
+ } catch {
5533
+ }
5534
+ try {
5535
+ const settingsPath = joinPath3(anchor, "dotmem.settings.json");
5536
+ const settings = readJsonFile(settingsPath);
5537
+ const language2 = extractLanguage(settings);
5538
+ if (language2) return language2;
5539
+ } catch {
5540
+ }
5541
+ }
5542
+ const env = globalThis?.process?.env;
5543
+ const envLang = env?.DOTMEM_LANGUAGE || env?.DOTMEM_RESPONSE_LANGUAGE || env?.DOTMEM_USER_LANGUAGE;
5544
+ if (typeof envLang === "string" && envLang.trim()) return envLang.trim();
5545
+ return DEFAULT_USER_LANGUAGE;
5546
+ }
5547
+ function readUserLanguage() {
5548
+ return loadUserLanguage();
5549
+ }
5550
+ function getUserLanguage() {
5551
+ return loadUserLanguage();
5552
+ }
5553
+ function resolveUserLanguage() {
5554
+ return loadUserLanguage();
5555
+ }
5556
+ function resolveLanguage() {
5557
+ return loadUserLanguage();
5558
+ }
5559
+ function loadLanguagePreference() {
5560
+ return loadUserLanguage();
5561
+ }
5562
+ function getLanguagePreference() {
5563
+ return loadUserLanguage();
5564
+ }
5565
+ function resolveLanguagePreference() {
5566
+ return loadUserLanguage();
5567
+ }
5568
+ function loadUserLanguagePreference() {
5569
+ return loadUserLanguage();
5570
+ }
5571
+ function getUserLanguagePreference() {
5572
+ return loadUserLanguage();
5573
+ }
5574
+ function resolveResponseLanguage() {
5575
+ return loadUserLanguage();
5576
+ }
5577
+ function getResponseLanguage() {
5578
+ return loadUserLanguage();
5579
+ }
5580
+ async function setUserLanguage(language2) {
5581
+ const fsMod = await import('fs/promises');
5582
+ const path = resolveUserLanguagePath();
5583
+ const dir = parentStoragePath(path);
5584
+ await fsMod.mkdir(dir, { recursive: true });
5585
+ const payload = { format: "dotmem.language", version: 1, language: String(language2).trim() };
5586
+ const temporary = `${path}.${process.pid}.${Date.now().toString(36)}.tmp`;
5587
+ await fsMod.writeFile(temporary, `${JSON.stringify(payload, null, 2)}
5588
+ `, "utf8");
5589
+ await fsMod.rename(temporary, path);
5590
+ return payload.language;
5591
+ }
5592
+ async function saveUserLanguage(language2) {
5593
+ return setUserLanguage(language2);
5594
+ }
5595
+ async function writeUserLanguage(language2) {
5596
+ return setUserLanguage(language2);
5597
+ }
5598
+ async function saveLanguagePreference(language2) {
5599
+ return setUserLanguage(language2);
5600
+ }
5601
+ function isItalian(language2) {
5602
+ const value = (language2 ?? loadUserLanguage()).toLowerCase();
5603
+ return value === "it" || value === "it-it" || value.startsWith("it-");
5604
+ }
5605
+ function languageTag() {
5606
+ return loadUserLanguage();
5607
+ }
5608
+ 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;
5609
+ var init_user_language = __esm({
5610
+ "core/knowledge/user-language.ts"() {
5611
+ init_user_paths();
5612
+ init_storage_paths();
5613
+ USER_LANGUAGE_FILE_NAME = "language.json";
5614
+ USER_LANGUAGE_PREFERENCE_FILE_NAME = "user-language.json";
5615
+ LANGUAGE_PREFERENCE_FILE_NAME = "language-preference.json";
5616
+ USER_PREFERENCES_FILE_NAME = "user-preferences.json";
5617
+ PREFERENCES_FILE_NAME = "preferences.json";
5618
+ DEFAULT_USER_LANGUAGE = "it-IT";
5619
+ DEFAULT_LANGUAGE = "it-IT";
5620
+ USER_LANGUAGE_DEFAULT = "it-IT";
5621
+ LANGUAGE_DEFAULT = "it-IT";
5622
+ DEFAULT_RESPONSE_LANGUAGE = "it-IT";
5623
+ LANGUAGE_FILE_NAMES = [
5624
+ USER_LANGUAGE_FILE_NAME,
5625
+ USER_LANGUAGE_PREFERENCE_FILE_NAME,
5626
+ LANGUAGE_PREFERENCE_FILE_NAME,
5627
+ USER_PREFERENCES_FILE_NAME,
5628
+ PREFERENCES_FILE_NAME,
5629
+ "config.json",
5630
+ "user-config.json",
5631
+ "agent-config.json",
5632
+ "dotmem.config.json"
5633
+ ];
5634
+ LANGUAGE_KEYS = [
5635
+ "language",
5636
+ "Language",
5637
+ "responseLanguage",
5638
+ "response_language",
5639
+ "preferredLanguage",
5640
+ "preferred_language",
5641
+ "userLanguage",
5642
+ "user_language",
5643
+ "defaultLanguage",
5644
+ "default_language",
5645
+ "locale",
5646
+ "lang",
5647
+ "uiLanguage",
5648
+ "ui_language",
5649
+ "conversationLanguage",
5650
+ "conversation_language"
5651
+ ];
5652
+ __name(joinPath3, "joinPath");
5653
+ __name(resolveUserLanguagePath, "resolveUserLanguagePath");
5654
+ __name(resolveUserLanguagePreferencePath, "resolveUserLanguagePreferencePath");
5655
+ __name(resolveLanguagePath, "resolveLanguagePath");
5656
+ __name(resolveLanguagePreferencePath, "resolveLanguagePreferencePath");
5657
+ __name(readJsonFile, "readJsonFile");
5658
+ __name(extractLanguage, "extractLanguage");
5659
+ __name(loadUserLanguage, "loadUserLanguage");
5660
+ __name(readUserLanguage, "readUserLanguage");
5661
+ __name(getUserLanguage, "getUserLanguage");
5662
+ __name(resolveUserLanguage, "resolveUserLanguage");
5663
+ __name(resolveLanguage, "resolveLanguage");
5664
+ __name(loadLanguagePreference, "loadLanguagePreference");
5665
+ __name(getLanguagePreference, "getLanguagePreference");
5666
+ __name(resolveLanguagePreference, "resolveLanguagePreference");
5667
+ __name(loadUserLanguagePreference, "loadUserLanguagePreference");
5668
+ __name(getUserLanguagePreference, "getUserLanguagePreference");
5669
+ __name(resolveResponseLanguage, "resolveResponseLanguage");
5670
+ __name(getResponseLanguage, "getResponseLanguage");
5671
+ __name(setUserLanguage, "setUserLanguage");
5672
+ __name(saveUserLanguage, "saveUserLanguage");
5673
+ __name(writeUserLanguage, "writeUserLanguage");
5674
+ __name(saveLanguagePreference, "saveLanguagePreference");
5675
+ __name(isItalian, "isItalian");
5676
+ __name(languageTag, "languageTag");
5677
+ userLanguage = loadUserLanguage();
5678
+ language = loadUserLanguage();
5679
+ responseLanguage = loadUserLanguage();
5680
+ preferredLanguage = loadUserLanguage();
5681
+ }
5682
+ });
5683
+
5408
5684
  // core/profile/ai.json
5409
5685
  var ai_default;
5410
5686
  var init_ai = __esm({
@@ -5813,6 +6089,45 @@ var init_project_identity = __esm({
5813
6089
  }
5814
6090
  });
5815
6091
 
6092
+ // core/knowledge/uuid.ts
6093
+ var generateUuidV7;
6094
+ var init_uuid = __esm({
6095
+ "core/knowledge/uuid.ts"() {
6096
+ generateUuidV7 = /* @__PURE__ */ __name(() => {
6097
+ const cryptoObj = globalThis.crypto;
6098
+ const ms = Date.now();
6099
+ const rand = new Uint8Array(10);
6100
+ if (cryptoObj && typeof cryptoObj.getRandomValues === "function") {
6101
+ cryptoObj.getRandomValues(rand);
6102
+ } else {
6103
+ for (let i2 = 0; i2 < rand.length; i2 += 1) {
6104
+ rand[i2] = Math.floor(Math.random() * 256);
6105
+ }
6106
+ }
6107
+ const bytes = new Uint8Array(16);
6108
+ bytes[0] = ms / 1099511627776 & 255;
6109
+ bytes[1] = ms / 4294967296 & 255;
6110
+ bytes[2] = ms / 16777216 & 255;
6111
+ bytes[3] = ms / 65536 & 255;
6112
+ bytes[4] = ms / 256 & 255;
6113
+ bytes[5] = ms & 255;
6114
+ const randA = (rand[0] << 8 | rand[1]) & 4095;
6115
+ bytes[6] = 112 | randA >> 8;
6116
+ bytes[7] = randA & 255;
6117
+ bytes[8] = 128 | rand[2] & 63;
6118
+ bytes[9] = rand[3];
6119
+ bytes[10] = rand[4];
6120
+ bytes[11] = rand[5];
6121
+ bytes[12] = rand[6];
6122
+ bytes[13] = rand[7];
6123
+ bytes[14] = rand[8];
6124
+ bytes[15] = rand[9];
6125
+ const hex = Array.from(bytes).map((byte) => byte.toString(16).padStart(2, "0")).join("");
6126
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
6127
+ }, "generateUuidV7");
6128
+ }
6129
+ });
6130
+
5816
6131
  // core/knowledge/staging.ts
5817
6132
  var DOTMEM_STAGE_FORMAT, DOTMEM_STAGE_VERSION, StageFileError, generateRequestId, nodeCwd, resolveStagingDirectory, stagePathFor, nodeFs6, normalizeClaimIds, revisionFromOptions, writeStageFile, readStageFile, validateStageFile, commitStageFile, cleanupStageFile;
5818
6133
  var init_staging = __esm({
@@ -5824,6 +6139,7 @@ var init_staging = __esm({
5824
6139
  init_store_queue();
5825
6140
  init_state();
5826
6141
  init_project_identity();
6142
+ init_uuid();
5827
6143
  init_project_anchor();
5828
6144
  DOTMEM_STAGE_FORMAT = "dotmem.stage";
5829
6145
  DOTMEM_STAGE_VERSION = 1;
@@ -5867,9 +6183,11 @@ var init_staging = __esm({
5867
6183
  return void 0;
5868
6184
  }, "revisionFromOptions");
5869
6185
  writeStageFile = /* @__PURE__ */ __name(async (claim, scope, sourceProject) => {
6186
+ const claimId = claim.id && claim.id.trim() ? claim.id.trim() : generateUuidV7();
5870
6187
  const sanitized = sanitizeKnowledge(claim.knowledge);
5871
6188
  const sanitizedClaim = {
5872
6189
  ...claim,
6190
+ id: claimId,
5873
6191
  knowledge: sanitized.knowledge
5874
6192
  };
5875
6193
  const requestId = generateRequestId();
@@ -5967,11 +6285,12 @@ var init_staging = __esm({
5967
6285
  ...validated.claim,
5968
6286
  knowledge: boundary.knowledge
5969
6287
  };
6288
+ const claimId = sanitizedClaim.id && sanitizedClaim.id.trim() ? sanitizedClaim.id.trim() : generateUuidV7();
5970
6289
  const kind = boundary.kind ?? "experience";
5971
6290
  const target = await resolveMemoryTarget(kind, scope, sourceProject);
5972
6291
  const revision = revisionFromOptions(sanitizedClaim);
5973
6292
  const claim = buildClaimRecord({
5974
- id: sanitizedClaim.id,
6293
+ id: claimId,
5975
6294
  knowledge: sanitizedClaim.knowledge,
5976
6295
  applicability: sanitizedClaim.applicability,
5977
6296
  evidence: sanitizedClaim.evidence,
@@ -5991,13 +6310,13 @@ var init_staging = __esm({
5991
6310
  });
5992
6311
  });
5993
6312
  const verification = await target.repository.load();
5994
- if (!verification.claims.some((c) => c.id === sanitizedClaim.id)) {
5995
- throw new Error(`Persistence verification failed: claim ${sanitizedClaim.id} was not persisted`);
6313
+ if (!verification.claims.some((c) => c.id === claimId)) {
6314
+ throw new Error(`Persistence verification failed: claim ${claimId} was not persisted`);
5996
6315
  }
5997
6316
  await cleanupStageFile(requestId);
5998
6317
  return {
5999
6318
  requestId,
6000
- claimId: sanitizedClaim.id,
6319
+ claimId,
6001
6320
  sourceId: target.sourceId,
6002
6321
  scope,
6003
6322
  kind
@@ -6018,12 +6337,12 @@ var init_staging = __esm({
6018
6337
  });
6019
6338
 
6020
6339
  // core/knowledge/loops.ts
6021
- function joinPath3(base, child) {
6340
+ function joinPath4(base, child) {
6022
6341
  const separator3 = process.platform === "win32" ? "\\" : "/";
6023
6342
  return `${base.replace(/[\\/]+/g, separator3)}${separator3}${child}`;
6024
6343
  }
6025
6344
  function resolveLoopsFilePath() {
6026
- return joinPath3(resolveUserDotMemPath(), LOOPS_FILE_NAME);
6345
+ return joinPath4(resolveUserDotMemPath(), LOOPS_FILE_NAME);
6027
6346
  }
6028
6347
  async function readFile(path) {
6029
6348
  try {
@@ -6155,7 +6474,7 @@ var init_loops = __esm({
6155
6474
  init_user_paths();
6156
6475
  LOOPS_FILE_NAME = "loops.json";
6157
6476
  LOOPS_FORMAT_VERSION = 1;
6158
- __name(joinPath3, "joinPath");
6477
+ __name(joinPath4, "joinPath");
6159
6478
  __name(resolveLoopsFilePath, "resolveLoopsFilePath");
6160
6479
  __name(readFile, "readFile");
6161
6480
  __name(writeFile, "writeFile");
@@ -6251,12 +6570,12 @@ var init_session = __esm({
6251
6570
  });
6252
6571
 
6253
6572
  // core/knowledge/exemplars.ts
6254
- function joinPath4(base, child) {
6573
+ function joinPath5(base, child) {
6255
6574
  const separator3 = process.platform === "win32" ? "\\" : "/";
6256
6575
  return `${base.replace(/[\\/]+/g, separator3)}${separator3}${child}`;
6257
6576
  }
6258
6577
  function resolveExemplarsPath() {
6259
- return joinPath4(resolveUserDotMemPath(), EXEMPLARS_FILE_NAME);
6578
+ return joinPath5(resolveUserDotMemPath(), EXEMPLARS_FILE_NAME);
6260
6579
  }
6261
6580
  async function readFile2(path) {
6262
6581
  try {
@@ -6393,7 +6712,7 @@ var init_exemplars = __esm({
6393
6712
  init_user_paths();
6394
6713
  EXEMPLARS_FILE_NAME = "exemplars.json";
6395
6714
  EXEMPLARS_FORMAT_VERSION = 1;
6396
- __name(joinPath4, "joinPath");
6715
+ __name(joinPath5, "joinPath");
6397
6716
  __name(resolveExemplarsPath, "resolveExemplarsPath");
6398
6717
  __name(readFile2, "readFile");
6399
6718
  __name(writeFile2, "writeFile");
@@ -6408,12 +6727,12 @@ var init_exemplars = __esm({
6408
6727
  });
6409
6728
 
6410
6729
  // core/knowledge/personality-anchor.ts
6411
- function joinPath5(base, child) {
6730
+ function joinPath6(base, child) {
6412
6731
  const separator3 = process.platform === "win32" ? "\\" : "/";
6413
6732
  return `${base.replace(/[\\/]+/g, separator3)}${separator3}${child}`;
6414
6733
  }
6415
6734
  function resolvePersonalityAnchorPath() {
6416
- return joinPath5(resolveUserDotMemPath(), PERSONALITY_ANCHOR_FILE_NAME);
6735
+ return joinPath6(resolveUserDotMemPath(), PERSONALITY_ANCHOR_FILE_NAME);
6417
6736
  }
6418
6737
  async function readFile3(path) {
6419
6738
  try {
@@ -6601,7 +6920,7 @@ var init_personality_anchor = __esm({
6601
6920
  init_user_paths();
6602
6921
  PERSONALITY_ANCHOR_FILE_NAME = "personality-anchor.json";
6603
6922
  PERSONALITY_ANCHOR_FORMAT_VERSION = 1;
6604
- __name(joinPath5, "joinPath");
6923
+ __name(joinPath6, "joinPath");
6605
6924
  __name(resolvePersonalityAnchorPath, "resolvePersonalityAnchorPath");
6606
6925
  __name(readFile3, "readFile");
6607
6926
  __name(writeFile3, "writeFile");
@@ -6644,6 +6963,7 @@ var init_knowledge = __esm({
6644
6963
  init_storage_location();
6645
6964
  init_storage_settings();
6646
6965
  init_user_identity();
6966
+ init_user_language();
6647
6967
  init_identity_resolution();
6648
6968
  init_identity_governance();
6649
6969
  init_effective_contract();
@@ -8386,6 +8706,8 @@ init_router();
8386
8706
  init_store_queue();
8387
8707
  init_staging();
8388
8708
  init_user_paths();
8709
+ init_uuid();
8710
+ init_acquisition_limits();
8389
8711
  init_storage_coordinator();
8390
8712
  init_mem_repository();
8391
8713
  function normalizeClaimIds3(value) {
@@ -8436,9 +8758,10 @@ async function findClaimAcrossAllSources(claimId, scope, sourceProject) {
8436
8758
  __name(findClaimAcrossAllSources, "findClaimAcrossAllSources");
8437
8759
  var acquire = {
8438
8760
  async acquire(opts) {
8761
+ const claimId = opts.id && opts.id.trim() ? opts.id.trim() : generateUuidV7();
8439
8762
  if (opts.scope === void 0 && opts.applicability?.scope !== void 0) {
8440
8763
  throw new Error(
8441
- `Claim ${opts.id} uses applicability.scope for routing. Use top-level scope instead.`
8764
+ `Claim ${claimId} uses applicability.scope for routing. Use top-level scope instead.`
8442
8765
  );
8443
8766
  }
8444
8767
  const scope = opts.scope ?? "project";
@@ -8449,19 +8772,18 @@ var acquire = {
8449
8772
  }
8450
8773
  const boundary = await crossAcquisitionBoundary(opts);
8451
8774
  if (boundary.sanitized && DEV) {
8452
- console.warn(`[dotmem] Sanitized secret values from claim ${opts.id}`);
8775
+ console.warn(`[dotmem] Sanitized secret values from claim ${claimId}`);
8453
8776
  }
8454
8777
  if (boundary.removedTierFields > 0 && DEV) {
8455
- console.warn(`[dotmem] Removed ${boundary.removedTierFields} non-authoritative tier field(s) from claim ${opts.id}`);
8778
+ console.warn(`[dotmem] Removed ${boundary.removedTierFields} non-authoritative tier field(s) from claim ${claimId}`);
8456
8779
  }
8457
8780
  const kind = boundary.kind;
8458
8781
  const target = await resolveMemoryTarget(kind, scope, sourceProject);
8459
- const existing = await findClaimAcrossAllSources(opts.id, scope, sourceProject);
8782
+ const existing = await findClaimAcrossAllSources(claimId, scope, sourceProject);
8460
8783
  if (existing) {
8461
8784
  const acquiredAt = existing.acquiredAt ? ` (acquired ${existing.acquiredAt})` : "";
8462
- throw new Error(
8463
- `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.`
8464
- );
8785
+ 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.`;
8786
+ throw new MemoryAcquireDuplicateClaimError("A claim with this ID already exists.", { cause: new Error(detail) });
8465
8787
  }
8466
8788
  const revision = revisionFromAcquire2(opts);
8467
8789
  const repository = target.repository;
@@ -8471,7 +8793,7 @@ var acquire = {
8471
8793
  const next = updateKnowledge(state3, {
8472
8794
  basedOnVersion: state3.version,
8473
8795
  claims: [buildClaimRecord({
8474
- id: opts.id,
8796
+ id: claimId,
8475
8797
  knowledge: boundary.knowledge,
8476
8798
  applicability: opts.applicability,
8477
8799
  evidence: opts.evidence,
@@ -8488,10 +8810,11 @@ var acquire = {
8488
8810
  });
8489
8811
  });
8490
8812
  const verification = await target.repository.load();
8491
- if (!verification.claims.some((claim) => claim.id === opts.id)) {
8492
- throw new Error(`Acquisition verification failed: claim ${opts.id} was not persisted`);
8813
+ if (!verification.claims.some((claim) => claim.id === claimId)) {
8814
+ throw new Error(`Acquisition verification failed: claim ${claimId} was not persisted`);
8493
8815
  }
8494
- dispatch.set("dotmem:memory:acquired", { detail: { id: opts.id } });
8816
+ dispatch.set("dotmem:memory:acquired", { detail: { id: claimId } });
8817
+ return claimId;
8495
8818
  },
8496
8819
  async acquireStaged(opts) {
8497
8820
  const scope = opts.scope ?? "project";
@@ -8499,7 +8822,8 @@ var acquire = {
8499
8822
  const sourceProject = resolvedProjectId ? normalizeProjectId(resolvedProjectId) : void 0;
8500
8823
  const { requestId } = await writeStageFile(opts, scope, sourceProject);
8501
8824
  try {
8502
- await commitStageFile(requestId);
8825
+ const result = await commitStageFile(requestId);
8826
+ return result.claimId;
8503
8827
  } catch (error) {
8504
8828
  if (error instanceof StageFileError) {
8505
8829
  await cleanupStageFile(requestId);
@@ -9712,6 +10036,17 @@ var memory = {
9712
10036
  return profile.get(id);
9713
10037
  }
9714
10038
  },
10039
+ /** Persistent default response language (canonical user config). */
10040
+ language: {
10041
+ async get() {
10042
+ const m = await Promise.resolve().then(() => (init_user_language(), user_language_exports));
10043
+ return m.resolveUserLanguage();
10044
+ },
10045
+ async set(value) {
10046
+ const m = await Promise.resolve().then(() => (init_user_language(), user_language_exports));
10047
+ return m.setUserLanguage(value);
10048
+ }
10049
+ },
9715
10050
  /** Note surface: store and retrieve markdown files and text blocks. */
9716
10051
  note: {
9717
10052
  async add(opts) {