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/index.js CHANGED
@@ -1662,7 +1662,10 @@ var init_discover = __esm({
1662
1662
  `);
1663
1663
  }
1664
1664
  }, "diagnostic");
1665
- DEFAULT_LIMITS = { current: 5, deep: 25 };
1665
+ DEFAULT_LIMITS = {
1666
+ current: 8,
1667
+ deep: 25
1668
+ };
1666
1669
  FIELD_ORDER = [
1667
1670
  "id",
1668
1671
  "knowledge",
@@ -2887,7 +2890,7 @@ var init_policy_store = __esm({
2887
2890
  });
2888
2891
 
2889
2892
  // core/knowledge/acquisition-limits.ts
2890
- var MEMORY_ACQUIRE_LIMITS, MEMORY_ACQUIRE_LIMITS_MCP, MEMORY_STORE_LIMITS, DOTMEM_ACQUIRE_ERROR_CODES, MemoryAcquireLimitError, MemoryAcquireConcurrencyError, encoder, serializedBytes, measureKnowledge, checkAcquireLimits;
2893
+ var MEMORY_ACQUIRE_LIMITS, MEMORY_ACQUIRE_LIMITS_MCP, MEMORY_STORE_LIMITS, DOTMEM_ACQUIRE_ERROR_CODES, MemoryAcquireLimitError, MemoryAcquireConcurrencyError, MemoryAcquireDuplicateClaimError, encoder, serializedBytes, measureKnowledge, checkAcquireLimits;
2891
2894
  var init_acquisition_limits = __esm({
2892
2895
  "core/knowledge/acquisition-limits.ts"() {
2893
2896
  MEMORY_ACQUIRE_LIMITS = Object.freeze({
@@ -2910,7 +2913,8 @@ var init_acquisition_limits = __esm({
2910
2913
  STORE_UNREADABLE: "DOTMEM_STORE_UNREADABLE",
2911
2914
  CONCURRENT_WRITE: "DOTMEM_CONCURRENT_WRITE",
2912
2915
  SESSION_ACQUIRE_LIMIT: "DOTMEM_SESSION_ACQUIRE_LIMIT",
2913
- POLICY_REFUSED: "DOTMEM_POLICY_REFUSED"
2916
+ POLICY_REFUSED: "DOTMEM_POLICY_REFUSED",
2917
+ DUPLICATE_CLAIM: "DOTMEM_DUPLICATE_CLAIM"
2914
2918
  });
2915
2919
  MemoryAcquireLimitError = class extends Error {
2916
2920
  static {
@@ -2934,6 +2938,17 @@ var init_acquisition_limits = __esm({
2934
2938
  this.name = "MemoryAcquireConcurrencyError";
2935
2939
  }
2936
2940
  };
2941
+ MemoryAcquireDuplicateClaimError = class extends Error {
2942
+ static {
2943
+ __name(this, "MemoryAcquireDuplicateClaimError");
2944
+ }
2945
+ code = DOTMEM_ACQUIRE_ERROR_CODES.DUPLICATE_CLAIM;
2946
+ retryable = false;
2947
+ constructor(message, options) {
2948
+ super(message, options);
2949
+ this.name = "MemoryAcquireDuplicateClaimError";
2950
+ }
2951
+ };
2937
2952
  encoder = new TextEncoder();
2938
2953
  serializedBytes = /* @__PURE__ */ __name((value) => {
2939
2954
  const json = JSON.stringify(value);
@@ -5614,6 +5629,267 @@ var init_user_identity = __esm({
5614
5629
  }
5615
5630
  });
5616
5631
 
5632
+ // core/knowledge/user-language.ts
5633
+ var user_language_exports = {};
5634
+ __export(user_language_exports, {
5635
+ DEFAULT_LANGUAGE: () => DEFAULT_LANGUAGE,
5636
+ DEFAULT_RESPONSE_LANGUAGE: () => DEFAULT_RESPONSE_LANGUAGE,
5637
+ DEFAULT_USER_LANGUAGE: () => DEFAULT_USER_LANGUAGE,
5638
+ LANGUAGE_DEFAULT: () => LANGUAGE_DEFAULT,
5639
+ LANGUAGE_PREFERENCE_FILE_NAME: () => LANGUAGE_PREFERENCE_FILE_NAME,
5640
+ PREFERENCES_FILE_NAME: () => PREFERENCES_FILE_NAME,
5641
+ USER_LANGUAGE_DEFAULT: () => USER_LANGUAGE_DEFAULT,
5642
+ USER_LANGUAGE_FILE_NAME: () => USER_LANGUAGE_FILE_NAME,
5643
+ USER_LANGUAGE_PREFERENCE_FILE_NAME: () => USER_LANGUAGE_PREFERENCE_FILE_NAME,
5644
+ USER_PREFERENCES_FILE_NAME: () => USER_PREFERENCES_FILE_NAME,
5645
+ getLanguagePreference: () => getLanguagePreference,
5646
+ getResponseLanguage: () => getResponseLanguage,
5647
+ getUserLanguage: () => getUserLanguage,
5648
+ getUserLanguagePreference: () => getUserLanguagePreference,
5649
+ isItalian: () => isItalian,
5650
+ language: () => language,
5651
+ languageTag: () => languageTag,
5652
+ loadLanguagePreference: () => loadLanguagePreference,
5653
+ loadUserLanguage: () => loadUserLanguage,
5654
+ loadUserLanguagePreference: () => loadUserLanguagePreference,
5655
+ preferredLanguage: () => preferredLanguage,
5656
+ readUserLanguage: () => readUserLanguage,
5657
+ resolveLanguage: () => resolveLanguage,
5658
+ resolveLanguagePath: () => resolveLanguagePath,
5659
+ resolveLanguagePreference: () => resolveLanguagePreference,
5660
+ resolveLanguagePreferencePath: () => resolveLanguagePreferencePath,
5661
+ resolveResponseLanguage: () => resolveResponseLanguage,
5662
+ resolveUserLanguage: () => resolveUserLanguage,
5663
+ resolveUserLanguagePath: () => resolveUserLanguagePath,
5664
+ resolveUserLanguagePreferencePath: () => resolveUserLanguagePreferencePath,
5665
+ responseLanguage: () => responseLanguage,
5666
+ saveLanguagePreference: () => saveLanguagePreference,
5667
+ saveUserLanguage: () => saveUserLanguage,
5668
+ setUserLanguage: () => setUserLanguage,
5669
+ userLanguage: () => userLanguage,
5670
+ writeUserLanguage: () => writeUserLanguage
5671
+ });
5672
+ function joinPath3(base, child) {
5673
+ const separator3 = process.platform === "win32" ? "\\" : "/";
5674
+ return `${base.replace(/[\\/]+/g, separator3)}${separator3}${child}`;
5675
+ }
5676
+ function resolveUserLanguagePath() {
5677
+ return joinPath3(resolveUserDotMemPath(), USER_LANGUAGE_FILE_NAME);
5678
+ }
5679
+ function resolveUserLanguagePreferencePath() {
5680
+ return resolveUserLanguagePath();
5681
+ }
5682
+ function resolveLanguagePath() {
5683
+ return resolveUserLanguagePath();
5684
+ }
5685
+ function resolveLanguagePreferencePath() {
5686
+ return resolveUserLanguagePath();
5687
+ }
5688
+ function readJsonFile(path) {
5689
+ const fs = getSyncFs();
5690
+ if (!fs) return null;
5691
+ let raw;
5692
+ try {
5693
+ raw = fs.readFileSync(path, "utf8");
5694
+ } catch {
5695
+ return null;
5696
+ }
5697
+ if (typeof raw !== "string") return null;
5698
+ if (raw.charCodeAt(0) === 65279) raw = raw.slice(1);
5699
+ try {
5700
+ return JSON.parse(raw);
5701
+ } catch {
5702
+ return null;
5703
+ }
5704
+ }
5705
+ function extractLanguage(value) {
5706
+ if (value === null || value === void 0) return null;
5707
+ if (typeof value === "string") {
5708
+ const trimmed = value.trim();
5709
+ return trimmed ? trimmed : null;
5710
+ }
5711
+ if (typeof value !== "object" || Array.isArray(value)) return null;
5712
+ for (const key of LANGUAGE_KEYS) {
5713
+ if (Object.prototype.hasOwnProperty.call(value, key)) {
5714
+ const candidate = extractLanguage(value[key]);
5715
+ if (candidate) return candidate;
5716
+ }
5717
+ }
5718
+ for (const containerKey of ["preferences", "user", "agent", "config", "settings", "storage"]) {
5719
+ if (Object.prototype.hasOwnProperty.call(value, containerKey)) {
5720
+ const candidate = extractLanguage(value[containerKey]);
5721
+ if (candidate) return candidate;
5722
+ }
5723
+ }
5724
+ return null;
5725
+ }
5726
+ function loadUserLanguage() {
5727
+ const fs = getSyncFs();
5728
+ const anchor = resolveUserDotMemPath();
5729
+ if (fs) {
5730
+ for (const name of LANGUAGE_FILE_NAMES) {
5731
+ const candidatePath = joinPath3(anchor, name);
5732
+ const parsed = readJsonFile(candidatePath);
5733
+ const language2 = extractLanguage(parsed);
5734
+ if (language2) return language2;
5735
+ }
5736
+ try {
5737
+ const govPath = joinPath3(joinPath3(anchor, "policy"), "identity-governance.json");
5738
+ const gov = readJsonFile(govPath);
5739
+ const language2 = extractLanguage(gov);
5740
+ if (language2) return language2;
5741
+ } catch {
5742
+ }
5743
+ try {
5744
+ const settingsPath = joinPath3(anchor, "dotmem.settings.json");
5745
+ const settings = readJsonFile(settingsPath);
5746
+ const language2 = extractLanguage(settings);
5747
+ if (language2) return language2;
5748
+ } catch {
5749
+ }
5750
+ }
5751
+ const env = globalThis?.process?.env;
5752
+ const envLang = env?.DOTMEM_LANGUAGE || env?.DOTMEM_RESPONSE_LANGUAGE || env?.DOTMEM_USER_LANGUAGE;
5753
+ if (typeof envLang === "string" && envLang.trim()) return envLang.trim();
5754
+ return DEFAULT_USER_LANGUAGE;
5755
+ }
5756
+ function readUserLanguage() {
5757
+ return loadUserLanguage();
5758
+ }
5759
+ function getUserLanguage() {
5760
+ return loadUserLanguage();
5761
+ }
5762
+ function resolveUserLanguage() {
5763
+ return loadUserLanguage();
5764
+ }
5765
+ function resolveLanguage() {
5766
+ return loadUserLanguage();
5767
+ }
5768
+ function loadLanguagePreference() {
5769
+ return loadUserLanguage();
5770
+ }
5771
+ function getLanguagePreference() {
5772
+ return loadUserLanguage();
5773
+ }
5774
+ function resolveLanguagePreference() {
5775
+ return loadUserLanguage();
5776
+ }
5777
+ function loadUserLanguagePreference() {
5778
+ return loadUserLanguage();
5779
+ }
5780
+ function getUserLanguagePreference() {
5781
+ return loadUserLanguage();
5782
+ }
5783
+ function resolveResponseLanguage() {
5784
+ return loadUserLanguage();
5785
+ }
5786
+ function getResponseLanguage() {
5787
+ return loadUserLanguage();
5788
+ }
5789
+ async function setUserLanguage(language2) {
5790
+ const fsMod = await import('fs/promises');
5791
+ const path = resolveUserLanguagePath();
5792
+ const dir = parentStoragePath(path);
5793
+ await fsMod.mkdir(dir, { recursive: true });
5794
+ const payload = { format: "dotmem.language", version: 1, language: String(language2).trim() };
5795
+ const temporary = `${path}.${process.pid}.${Date.now().toString(36)}.tmp`;
5796
+ await fsMod.writeFile(temporary, `${JSON.stringify(payload, null, 2)}
5797
+ `, "utf8");
5798
+ await fsMod.rename(temporary, path);
5799
+ return payload.language;
5800
+ }
5801
+ async function saveUserLanguage(language2) {
5802
+ return setUserLanguage(language2);
5803
+ }
5804
+ async function writeUserLanguage(language2) {
5805
+ return setUserLanguage(language2);
5806
+ }
5807
+ async function saveLanguagePreference(language2) {
5808
+ return setUserLanguage(language2);
5809
+ }
5810
+ function isItalian(language2) {
5811
+ const value = (language2 ?? loadUserLanguage()).toLowerCase();
5812
+ return value === "it" || value === "it-it" || value.startsWith("it-");
5813
+ }
5814
+ function languageTag() {
5815
+ return loadUserLanguage();
5816
+ }
5817
+ 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;
5818
+ var init_user_language = __esm({
5819
+ "core/knowledge/user-language.ts"() {
5820
+ init_user_paths();
5821
+ init_storage_paths();
5822
+ USER_LANGUAGE_FILE_NAME = "language.json";
5823
+ USER_LANGUAGE_PREFERENCE_FILE_NAME = "user-language.json";
5824
+ LANGUAGE_PREFERENCE_FILE_NAME = "language-preference.json";
5825
+ USER_PREFERENCES_FILE_NAME = "user-preferences.json";
5826
+ PREFERENCES_FILE_NAME = "preferences.json";
5827
+ DEFAULT_USER_LANGUAGE = "it-IT";
5828
+ DEFAULT_LANGUAGE = "it-IT";
5829
+ USER_LANGUAGE_DEFAULT = "it-IT";
5830
+ LANGUAGE_DEFAULT = "it-IT";
5831
+ DEFAULT_RESPONSE_LANGUAGE = "it-IT";
5832
+ LANGUAGE_FILE_NAMES = [
5833
+ USER_LANGUAGE_FILE_NAME,
5834
+ USER_LANGUAGE_PREFERENCE_FILE_NAME,
5835
+ LANGUAGE_PREFERENCE_FILE_NAME,
5836
+ USER_PREFERENCES_FILE_NAME,
5837
+ PREFERENCES_FILE_NAME,
5838
+ "config.json",
5839
+ "user-config.json",
5840
+ "agent-config.json",
5841
+ "dotmem.config.json"
5842
+ ];
5843
+ LANGUAGE_KEYS = [
5844
+ "language",
5845
+ "Language",
5846
+ "responseLanguage",
5847
+ "response_language",
5848
+ "preferredLanguage",
5849
+ "preferred_language",
5850
+ "userLanguage",
5851
+ "user_language",
5852
+ "defaultLanguage",
5853
+ "default_language",
5854
+ "locale",
5855
+ "lang",
5856
+ "uiLanguage",
5857
+ "ui_language",
5858
+ "conversationLanguage",
5859
+ "conversation_language"
5860
+ ];
5861
+ __name(joinPath3, "joinPath");
5862
+ __name(resolveUserLanguagePath, "resolveUserLanguagePath");
5863
+ __name(resolveUserLanguagePreferencePath, "resolveUserLanguagePreferencePath");
5864
+ __name(resolveLanguagePath, "resolveLanguagePath");
5865
+ __name(resolveLanguagePreferencePath, "resolveLanguagePreferencePath");
5866
+ __name(readJsonFile, "readJsonFile");
5867
+ __name(extractLanguage, "extractLanguage");
5868
+ __name(loadUserLanguage, "loadUserLanguage");
5869
+ __name(readUserLanguage, "readUserLanguage");
5870
+ __name(getUserLanguage, "getUserLanguage");
5871
+ __name(resolveUserLanguage, "resolveUserLanguage");
5872
+ __name(resolveLanguage, "resolveLanguage");
5873
+ __name(loadLanguagePreference, "loadLanguagePreference");
5874
+ __name(getLanguagePreference, "getLanguagePreference");
5875
+ __name(resolveLanguagePreference, "resolveLanguagePreference");
5876
+ __name(loadUserLanguagePreference, "loadUserLanguagePreference");
5877
+ __name(getUserLanguagePreference, "getUserLanguagePreference");
5878
+ __name(resolveResponseLanguage, "resolveResponseLanguage");
5879
+ __name(getResponseLanguage, "getResponseLanguage");
5880
+ __name(setUserLanguage, "setUserLanguage");
5881
+ __name(saveUserLanguage, "saveUserLanguage");
5882
+ __name(writeUserLanguage, "writeUserLanguage");
5883
+ __name(saveLanguagePreference, "saveLanguagePreference");
5884
+ __name(isItalian, "isItalian");
5885
+ __name(languageTag, "languageTag");
5886
+ userLanguage = loadUserLanguage();
5887
+ language = loadUserLanguage();
5888
+ responseLanguage = loadUserLanguage();
5889
+ preferredLanguage = loadUserLanguage();
5890
+ }
5891
+ });
5892
+
5617
5893
  // core/profile/ai.json
5618
5894
  var ai_default;
5619
5895
  var init_ai = __esm({
@@ -6022,6 +6298,45 @@ var init_project_identity = __esm({
6022
6298
  }
6023
6299
  });
6024
6300
 
6301
+ // core/knowledge/uuid.ts
6302
+ var generateUuidV7;
6303
+ var init_uuid = __esm({
6304
+ "core/knowledge/uuid.ts"() {
6305
+ generateUuidV7 = /* @__PURE__ */ __name(() => {
6306
+ const cryptoObj = globalThis.crypto;
6307
+ const ms = Date.now();
6308
+ const rand = new Uint8Array(10);
6309
+ if (cryptoObj && typeof cryptoObj.getRandomValues === "function") {
6310
+ cryptoObj.getRandomValues(rand);
6311
+ } else {
6312
+ for (let i2 = 0; i2 < rand.length; i2 += 1) {
6313
+ rand[i2] = Math.floor(Math.random() * 256);
6314
+ }
6315
+ }
6316
+ const bytes = new Uint8Array(16);
6317
+ bytes[0] = ms / 1099511627776 & 255;
6318
+ bytes[1] = ms / 4294967296 & 255;
6319
+ bytes[2] = ms / 16777216 & 255;
6320
+ bytes[3] = ms / 65536 & 255;
6321
+ bytes[4] = ms / 256 & 255;
6322
+ bytes[5] = ms & 255;
6323
+ const randA = (rand[0] << 8 | rand[1]) & 4095;
6324
+ bytes[6] = 112 | randA >> 8;
6325
+ bytes[7] = randA & 255;
6326
+ bytes[8] = 128 | rand[2] & 63;
6327
+ bytes[9] = rand[3];
6328
+ bytes[10] = rand[4];
6329
+ bytes[11] = rand[5];
6330
+ bytes[12] = rand[6];
6331
+ bytes[13] = rand[7];
6332
+ bytes[14] = rand[8];
6333
+ bytes[15] = rand[9];
6334
+ const hex = Array.from(bytes).map((byte) => byte.toString(16).padStart(2, "0")).join("");
6335
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
6336
+ }, "generateUuidV7");
6337
+ }
6338
+ });
6339
+
6025
6340
  // core/knowledge/staging.ts
6026
6341
  var DOTMEM_STAGE_FORMAT, DOTMEM_STAGE_VERSION, StageFileError, generateRequestId, nodeCwd, resolveStagingDirectory, stagePathFor, nodeFs6, normalizeClaimIds, revisionFromOptions, writeStageFile, readStageFile, validateStageFile, commitStageFile, cleanupStageFile;
6027
6342
  var init_staging = __esm({
@@ -6033,6 +6348,7 @@ var init_staging = __esm({
6033
6348
  init_store_queue();
6034
6349
  init_state();
6035
6350
  init_project_identity();
6351
+ init_uuid();
6036
6352
  init_project_anchor();
6037
6353
  DOTMEM_STAGE_FORMAT = "dotmem.stage";
6038
6354
  DOTMEM_STAGE_VERSION = 1;
@@ -6076,9 +6392,11 @@ var init_staging = __esm({
6076
6392
  return void 0;
6077
6393
  }, "revisionFromOptions");
6078
6394
  writeStageFile = /* @__PURE__ */ __name(async (claim, scope, sourceProject) => {
6395
+ const claimId = claim.id && claim.id.trim() ? claim.id.trim() : generateUuidV7();
6079
6396
  const sanitized = sanitizeKnowledge(claim.knowledge);
6080
6397
  const sanitizedClaim = {
6081
6398
  ...claim,
6399
+ id: claimId,
6082
6400
  knowledge: sanitized.knowledge
6083
6401
  };
6084
6402
  const requestId = generateRequestId();
@@ -6176,11 +6494,12 @@ var init_staging = __esm({
6176
6494
  ...validated.claim,
6177
6495
  knowledge: boundary.knowledge
6178
6496
  };
6497
+ const claimId = sanitizedClaim.id && sanitizedClaim.id.trim() ? sanitizedClaim.id.trim() : generateUuidV7();
6179
6498
  const kind = boundary.kind ?? "experience";
6180
6499
  const target = await resolveMemoryTarget(kind, scope, sourceProject);
6181
6500
  const revision = revisionFromOptions(sanitizedClaim);
6182
6501
  const claim = buildClaimRecord({
6183
- id: sanitizedClaim.id,
6502
+ id: claimId,
6184
6503
  knowledge: sanitizedClaim.knowledge,
6185
6504
  applicability: sanitizedClaim.applicability,
6186
6505
  evidence: sanitizedClaim.evidence,
@@ -6200,13 +6519,13 @@ var init_staging = __esm({
6200
6519
  });
6201
6520
  });
6202
6521
  const verification = await target.repository.load();
6203
- if (!verification.claims.some((c) => c.id === sanitizedClaim.id)) {
6204
- throw new Error(`Persistence verification failed: claim ${sanitizedClaim.id} was not persisted`);
6522
+ if (!verification.claims.some((c) => c.id === claimId)) {
6523
+ throw new Error(`Persistence verification failed: claim ${claimId} was not persisted`);
6205
6524
  }
6206
6525
  await cleanupStageFile(requestId);
6207
6526
  return {
6208
6527
  requestId,
6209
- claimId: sanitizedClaim.id,
6528
+ claimId,
6210
6529
  sourceId: target.sourceId,
6211
6530
  scope,
6212
6531
  kind
@@ -6227,12 +6546,12 @@ var init_staging = __esm({
6227
6546
  });
6228
6547
 
6229
6548
  // core/knowledge/loops.ts
6230
- function joinPath3(base, child) {
6549
+ function joinPath4(base, child) {
6231
6550
  const separator3 = process.platform === "win32" ? "\\" : "/";
6232
6551
  return `${base.replace(/[\\/]+/g, separator3)}${separator3}${child}`;
6233
6552
  }
6234
6553
  function resolveLoopsFilePath() {
6235
- return joinPath3(resolveUserDotMemPath(), LOOPS_FILE_NAME);
6554
+ return joinPath4(resolveUserDotMemPath(), LOOPS_FILE_NAME);
6236
6555
  }
6237
6556
  async function readFile(path) {
6238
6557
  try {
@@ -6364,7 +6683,7 @@ var init_loops = __esm({
6364
6683
  init_user_paths();
6365
6684
  LOOPS_FILE_NAME = "loops.json";
6366
6685
  LOOPS_FORMAT_VERSION = 1;
6367
- __name(joinPath3, "joinPath");
6686
+ __name(joinPath4, "joinPath");
6368
6687
  __name(resolveLoopsFilePath, "resolveLoopsFilePath");
6369
6688
  __name(readFile, "readFile");
6370
6689
  __name(writeFile, "writeFile");
@@ -6453,12 +6772,12 @@ var init_violations = __esm({
6453
6772
  });
6454
6773
 
6455
6774
  // core/knowledge/session.ts
6456
- function joinPath4(base, child) {
6775
+ function joinPath5(base, child) {
6457
6776
  const separator3 = process.platform === "win32" ? "\\" : "/";
6458
6777
  return `${base.replace(/[\\/]+/g, separator3)}${separator3}${child}`;
6459
6778
  }
6460
6779
  function resolveSessionFilePath() {
6461
- return joinPath4(resolveUserDotMemPath(), SESSION_FILE_NAME);
6780
+ return joinPath5(resolveUserDotMemPath(), SESSION_FILE_NAME);
6462
6781
  }
6463
6782
  async function readFile2(path) {
6464
6783
  try {
@@ -6491,7 +6810,7 @@ var init_session = __esm({
6491
6810
  "core/knowledge/session.ts"() {
6492
6811
  init_user_paths();
6493
6812
  SESSION_FILE_NAME = "session.json";
6494
- __name(joinPath4, "joinPath");
6813
+ __name(joinPath5, "joinPath");
6495
6814
  __name(resolveSessionFilePath, "resolveSessionFilePath");
6496
6815
  __name(readFile2, "readFile");
6497
6816
  DEFAULT_SESSION = {
@@ -6506,12 +6825,12 @@ var init_session = __esm({
6506
6825
  });
6507
6826
 
6508
6827
  // core/knowledge/exemplars.ts
6509
- function joinPath5(base, child) {
6828
+ function joinPath6(base, child) {
6510
6829
  const separator3 = process.platform === "win32" ? "\\" : "/";
6511
6830
  return `${base.replace(/[\\/]+/g, separator3)}${separator3}${child}`;
6512
6831
  }
6513
6832
  function resolveExemplarsPath() {
6514
- return joinPath5(resolveUserDotMemPath(), EXEMPLARS_FILE_NAME);
6833
+ return joinPath6(resolveUserDotMemPath(), EXEMPLARS_FILE_NAME);
6515
6834
  }
6516
6835
  async function readFile3(path) {
6517
6836
  try {
@@ -6648,7 +6967,7 @@ var init_exemplars = __esm({
6648
6967
  init_user_paths();
6649
6968
  EXEMPLARS_FILE_NAME = "exemplars.json";
6650
6969
  EXEMPLARS_FORMAT_VERSION = 1;
6651
- __name(joinPath5, "joinPath");
6970
+ __name(joinPath6, "joinPath");
6652
6971
  __name(resolveExemplarsPath, "resolveExemplarsPath");
6653
6972
  __name(readFile3, "readFile");
6654
6973
  __name(writeFile2, "writeFile");
@@ -6663,12 +6982,12 @@ var init_exemplars = __esm({
6663
6982
  });
6664
6983
 
6665
6984
  // core/knowledge/personality-anchor.ts
6666
- function joinPath6(base, child) {
6985
+ function joinPath7(base, child) {
6667
6986
  const separator3 = process.platform === "win32" ? "\\" : "/";
6668
6987
  return `${base.replace(/[\\/]+/g, separator3)}${separator3}${child}`;
6669
6988
  }
6670
6989
  function resolvePersonalityAnchorPath() {
6671
- return joinPath6(resolveUserDotMemPath(), PERSONALITY_ANCHOR_FILE_NAME);
6990
+ return joinPath7(resolveUserDotMemPath(), PERSONALITY_ANCHOR_FILE_NAME);
6672
6991
  }
6673
6992
  async function readFile4(path) {
6674
6993
  try {
@@ -6856,7 +7175,7 @@ var init_personality_anchor = __esm({
6856
7175
  init_user_paths();
6857
7176
  PERSONALITY_ANCHOR_FILE_NAME = "personality-anchor.json";
6858
7177
  PERSONALITY_ANCHOR_FORMAT_VERSION = 1;
6859
- __name(joinPath6, "joinPath");
7178
+ __name(joinPath7, "joinPath");
6860
7179
  __name(resolvePersonalityAnchorPath, "resolvePersonalityAnchorPath");
6861
7180
  __name(readFile4, "readFile");
6862
7181
  __name(writeFile3, "writeFile");
@@ -6899,6 +7218,7 @@ var init_knowledge = __esm({
6899
7218
  init_storage_location();
6900
7219
  init_storage_settings();
6901
7220
  init_user_identity();
7221
+ init_user_language();
6902
7222
  init_identity_resolution();
6903
7223
  init_identity_governance();
6904
7224
  init_effective_contract();
@@ -8711,6 +9031,8 @@ init_router();
8711
9031
  init_store_queue();
8712
9032
  init_staging();
8713
9033
  init_user_paths();
9034
+ init_uuid();
9035
+ init_acquisition_limits();
8714
9036
  init_storage_coordinator();
8715
9037
  init_mem_repository();
8716
9038
  function normalizeClaimIds3(value) {
@@ -8761,9 +9083,10 @@ async function findClaimAcrossAllSources(claimId, scope, sourceProject) {
8761
9083
  __name(findClaimAcrossAllSources, "findClaimAcrossAllSources");
8762
9084
  var acquire = {
8763
9085
  async acquire(opts) {
9086
+ const claimId = opts.id && opts.id.trim() ? opts.id.trim() : generateUuidV7();
8764
9087
  if (opts.scope === void 0 && opts.applicability?.scope !== void 0) {
8765
9088
  throw new Error(
8766
- `Claim ${opts.id} uses applicability.scope for routing. Use top-level scope instead.`
9089
+ `Claim ${claimId} uses applicability.scope for routing. Use top-level scope instead.`
8767
9090
  );
8768
9091
  }
8769
9092
  const scope = opts.scope ?? "project";
@@ -8774,19 +9097,18 @@ var acquire = {
8774
9097
  }
8775
9098
  const boundary = await crossAcquisitionBoundary(opts);
8776
9099
  if (boundary.sanitized && DEV) {
8777
- console.warn(`[dotmem] Sanitized secret values from claim ${opts.id}`);
9100
+ console.warn(`[dotmem] Sanitized secret values from claim ${claimId}`);
8778
9101
  }
8779
9102
  if (boundary.removedTierFields > 0 && DEV) {
8780
- console.warn(`[dotmem] Removed ${boundary.removedTierFields} non-authoritative tier field(s) from claim ${opts.id}`);
9103
+ console.warn(`[dotmem] Removed ${boundary.removedTierFields} non-authoritative tier field(s) from claim ${claimId}`);
8781
9104
  }
8782
9105
  const kind = boundary.kind;
8783
9106
  const target = await resolveMemoryTarget(kind, scope, sourceProject);
8784
- const existing = await findClaimAcrossAllSources(opts.id, scope, sourceProject);
9107
+ const existing = await findClaimAcrossAllSources(claimId, scope, sourceProject);
8785
9108
  if (existing) {
8786
9109
  const acquiredAt = existing.acquiredAt ? ` (acquired ${existing.acquiredAt})` : "";
8787
- throw new Error(
8788
- `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.`
8789
- );
9110
+ 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.`;
9111
+ throw new MemoryAcquireDuplicateClaimError("A claim with this ID already exists.", { cause: new Error(detail) });
8790
9112
  }
8791
9113
  const revision = revisionFromAcquire2(opts);
8792
9114
  const repository = target.repository;
@@ -8796,7 +9118,7 @@ var acquire = {
8796
9118
  const next = updateKnowledge(state3, {
8797
9119
  basedOnVersion: state3.version,
8798
9120
  claims: [buildClaimRecord({
8799
- id: opts.id,
9121
+ id: claimId,
8800
9122
  knowledge: boundary.knowledge,
8801
9123
  applicability: opts.applicability,
8802
9124
  evidence: opts.evidence,
@@ -8813,10 +9135,11 @@ var acquire = {
8813
9135
  });
8814
9136
  });
8815
9137
  const verification = await target.repository.load();
8816
- if (!verification.claims.some((claim) => claim.id === opts.id)) {
8817
- throw new Error(`Acquisition verification failed: claim ${opts.id} was not persisted`);
9138
+ if (!verification.claims.some((claim) => claim.id === claimId)) {
9139
+ throw new Error(`Acquisition verification failed: claim ${claimId} was not persisted`);
8818
9140
  }
8819
- dispatch.set("dotmem:memory:acquired", { detail: { id: opts.id } });
9141
+ dispatch.set("dotmem:memory:acquired", { detail: { id: claimId } });
9142
+ return claimId;
8820
9143
  },
8821
9144
  async acquireStaged(opts) {
8822
9145
  const scope = opts.scope ?? "project";
@@ -8824,7 +9147,8 @@ var acquire = {
8824
9147
  const sourceProject = resolvedProjectId ? normalizeProjectId(resolvedProjectId) : void 0;
8825
9148
  const { requestId } = await writeStageFile(opts, scope, sourceProject);
8826
9149
  try {
8827
- await commitStageFile(requestId);
9150
+ const result = await commitStageFile(requestId);
9151
+ return result.claimId;
8828
9152
  } catch (error) {
8829
9153
  if (error instanceof StageFileError) {
8830
9154
  await cleanupStageFile(requestId);
@@ -10037,6 +10361,17 @@ var memory = {
10037
10361
  return profile.get(id);
10038
10362
  }
10039
10363
  },
10364
+ /** Persistent default response language (canonical user config). */
10365
+ language: {
10366
+ async get() {
10367
+ const m = await Promise.resolve().then(() => (init_user_language(), user_language_exports));
10368
+ return m.resolveUserLanguage();
10369
+ },
10370
+ async set(value) {
10371
+ const m = await Promise.resolve().then(() => (init_user_language(), user_language_exports));
10372
+ return m.setUserLanguage(value);
10373
+ }
10374
+ },
10040
10375
  /** Note surface: store and retrieve markdown files and text blocks. */
10041
10376
  note: {
10042
10377
  async add(opts) {
@@ -12636,12 +12971,12 @@ var GovernancePolicyError = class extends Error {
12636
12971
  };
12637
12972
  var requiredText3 = /* @__PURE__ */ __name((v) => typeof v === "string" && v.trim().length > 0, "requiredText");
12638
12973
  var nowIso2 = /* @__PURE__ */ __name(() => (/* @__PURE__ */ new Date()).toISOString(), "nowIso");
12639
- var joinPath7 = /* @__PURE__ */ __name((base, child) => {
12974
+ var joinPath8 = /* @__PURE__ */ __name((base, child) => {
12640
12975
  const sep = process.platform === "win32" ? "\\" : "/";
12641
12976
  return `${base.replace(/[\\/]+/g, sep)}${sep}${child}`;
12642
12977
  }, "joinPath");
12643
- var resolveGovernanceDir = /* @__PURE__ */ __name((directory) => directory ?? joinPath7(resolveUserDotMemPath(), "policy"), "resolveGovernanceDir");
12644
- var resolveGovernanceFilePath = /* @__PURE__ */ __name((directory) => joinPath7(resolveGovernanceDir(directory), GOVERNANCE_FILE_NAME), "resolveGovernanceFilePath");
12978
+ var resolveGovernanceDir = /* @__PURE__ */ __name((directory) => directory ?? joinPath8(resolveUserDotMemPath(), "policy"), "resolveGovernanceDir");
12979
+ var resolveGovernanceFilePath = /* @__PURE__ */ __name((directory) => joinPath8(resolveGovernanceDir(directory), GOVERNANCE_FILE_NAME), "resolveGovernanceFilePath");
12645
12980
  var ROLE_CAPABILITIES = {
12646
12981
  "human-owner": /* @__PURE__ */ new Set(["policy.propose", "policy.review", "policy.approve", "policy.reject", "policy.activate", "policy.suspend", "policy.retire", "role.bind", "governance.read", "governance.audit.read", "agent.execute", "guardrail.stop.activate", "guardrail.stop.release"]),
12647
12982
  "human-approver": /* @__PURE__ */ new Set(["policy.review", "policy.approve", "policy.reject", "governance.read", "governance.audit.read", "guardrail.stop.activate", "guardrail.stop.release"]),
@@ -13369,12 +13704,12 @@ var GuardrailError = class extends Error {
13369
13704
  };
13370
13705
  var requiredText4 = /* @__PURE__ */ __name((v) => typeof v === "string" && v.trim().length > 0, "requiredText");
13371
13706
  var nowIso3 = /* @__PURE__ */ __name(() => (/* @__PURE__ */ new Date()).toISOString(), "nowIso");
13372
- var joinPath8 = /* @__PURE__ */ __name((base, child) => {
13707
+ var joinPath9 = /* @__PURE__ */ __name((base, child) => {
13373
13708
  const sep = process.platform === "win32" ? "\\" : "/";
13374
13709
  return `${base.replace(/[\\/]+/g, sep)}${sep}${child}`;
13375
13710
  }, "joinPath");
13376
- var resolveGuardrailDir = /* @__PURE__ */ __name((directory) => directory ?? joinPath8(resolveUserDotMemPath(), "policy"), "resolveGuardrailDir");
13377
- var resolveStopFilePath = /* @__PURE__ */ __name((directory) => joinPath8(resolveGuardrailDir(directory), STOP_FILE_NAME), "resolveStopFilePath");
13711
+ var resolveGuardrailDir = /* @__PURE__ */ __name((directory) => directory ?? joinPath9(resolveUserDotMemPath(), "policy"), "resolveGuardrailDir");
13712
+ var resolveStopFilePath = /* @__PURE__ */ __name((directory) => joinPath9(resolveGuardrailDir(directory), STOP_FILE_NAME), "resolveStopFilePath");
13378
13713
  var ACTIONS_REQUIRING_TRUSTED_IDENTITY = /* @__PURE__ */ new Set([
13379
13714
  "agent.execute",
13380
13715
  "guardrail.stop.activate",
@@ -13841,7 +14176,7 @@ var EPITEMIC_STATUSES2 = [
13841
14176
 
13842
14177
  // app.json
13843
14178
  var app_default = {
13844
- version: "0.1.1"};
14179
+ version: "0.1.3"};
13845
14180
 
13846
14181
  // index.ts
13847
14182
  var dotmem = {