dotmem 0.1.2 → 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/README.md +5 -5
- package/cli.cjs +1334 -41
- package/cli.js +1334 -41
- package/global.cjs +286 -10
- package/global.js +286 -10
- package/index.cjs +296 -20
- package/index.js +296 -20
- package/mcp.cjs +300 -19
- package/mcp.js +300 -19
- package/package.json +1 -1
package/global.js
CHANGED
|
@@ -1653,7 +1653,10 @@ var init_discover = __esm({
|
|
|
1653
1653
|
`);
|
|
1654
1654
|
}
|
|
1655
1655
|
}, "diagnostic");
|
|
1656
|
-
DEFAULT_LIMITS = {
|
|
1656
|
+
DEFAULT_LIMITS = {
|
|
1657
|
+
current: 8,
|
|
1658
|
+
deep: 25
|
|
1659
|
+
};
|
|
1657
1660
|
FIELD_ORDER = [
|
|
1658
1661
|
"id",
|
|
1659
1662
|
"knowledge",
|
|
@@ -5417,6 +5420,267 @@ var init_user_identity = __esm({
|
|
|
5417
5420
|
}
|
|
5418
5421
|
});
|
|
5419
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
|
+
|
|
5420
5684
|
// core/profile/ai.json
|
|
5421
5685
|
var ai_default;
|
|
5422
5686
|
var init_ai = __esm({
|
|
@@ -6073,12 +6337,12 @@ var init_staging = __esm({
|
|
|
6073
6337
|
});
|
|
6074
6338
|
|
|
6075
6339
|
// core/knowledge/loops.ts
|
|
6076
|
-
function
|
|
6340
|
+
function joinPath4(base, child) {
|
|
6077
6341
|
const separator3 = process.platform === "win32" ? "\\" : "/";
|
|
6078
6342
|
return `${base.replace(/[\\/]+/g, separator3)}${separator3}${child}`;
|
|
6079
6343
|
}
|
|
6080
6344
|
function resolveLoopsFilePath() {
|
|
6081
|
-
return
|
|
6345
|
+
return joinPath4(resolveUserDotMemPath(), LOOPS_FILE_NAME);
|
|
6082
6346
|
}
|
|
6083
6347
|
async function readFile(path) {
|
|
6084
6348
|
try {
|
|
@@ -6210,7 +6474,7 @@ var init_loops = __esm({
|
|
|
6210
6474
|
init_user_paths();
|
|
6211
6475
|
LOOPS_FILE_NAME = "loops.json";
|
|
6212
6476
|
LOOPS_FORMAT_VERSION = 1;
|
|
6213
|
-
__name(
|
|
6477
|
+
__name(joinPath4, "joinPath");
|
|
6214
6478
|
__name(resolveLoopsFilePath, "resolveLoopsFilePath");
|
|
6215
6479
|
__name(readFile, "readFile");
|
|
6216
6480
|
__name(writeFile, "writeFile");
|
|
@@ -6306,12 +6570,12 @@ var init_session = __esm({
|
|
|
6306
6570
|
});
|
|
6307
6571
|
|
|
6308
6572
|
// core/knowledge/exemplars.ts
|
|
6309
|
-
function
|
|
6573
|
+
function joinPath5(base, child) {
|
|
6310
6574
|
const separator3 = process.platform === "win32" ? "\\" : "/";
|
|
6311
6575
|
return `${base.replace(/[\\/]+/g, separator3)}${separator3}${child}`;
|
|
6312
6576
|
}
|
|
6313
6577
|
function resolveExemplarsPath() {
|
|
6314
|
-
return
|
|
6578
|
+
return joinPath5(resolveUserDotMemPath(), EXEMPLARS_FILE_NAME);
|
|
6315
6579
|
}
|
|
6316
6580
|
async function readFile2(path) {
|
|
6317
6581
|
try {
|
|
@@ -6448,7 +6712,7 @@ var init_exemplars = __esm({
|
|
|
6448
6712
|
init_user_paths();
|
|
6449
6713
|
EXEMPLARS_FILE_NAME = "exemplars.json";
|
|
6450
6714
|
EXEMPLARS_FORMAT_VERSION = 1;
|
|
6451
|
-
__name(
|
|
6715
|
+
__name(joinPath5, "joinPath");
|
|
6452
6716
|
__name(resolveExemplarsPath, "resolveExemplarsPath");
|
|
6453
6717
|
__name(readFile2, "readFile");
|
|
6454
6718
|
__name(writeFile2, "writeFile");
|
|
@@ -6463,12 +6727,12 @@ var init_exemplars = __esm({
|
|
|
6463
6727
|
});
|
|
6464
6728
|
|
|
6465
6729
|
// core/knowledge/personality-anchor.ts
|
|
6466
|
-
function
|
|
6730
|
+
function joinPath6(base, child) {
|
|
6467
6731
|
const separator3 = process.platform === "win32" ? "\\" : "/";
|
|
6468
6732
|
return `${base.replace(/[\\/]+/g, separator3)}${separator3}${child}`;
|
|
6469
6733
|
}
|
|
6470
6734
|
function resolvePersonalityAnchorPath() {
|
|
6471
|
-
return
|
|
6735
|
+
return joinPath6(resolveUserDotMemPath(), PERSONALITY_ANCHOR_FILE_NAME);
|
|
6472
6736
|
}
|
|
6473
6737
|
async function readFile3(path) {
|
|
6474
6738
|
try {
|
|
@@ -6656,7 +6920,7 @@ var init_personality_anchor = __esm({
|
|
|
6656
6920
|
init_user_paths();
|
|
6657
6921
|
PERSONALITY_ANCHOR_FILE_NAME = "personality-anchor.json";
|
|
6658
6922
|
PERSONALITY_ANCHOR_FORMAT_VERSION = 1;
|
|
6659
|
-
__name(
|
|
6923
|
+
__name(joinPath6, "joinPath");
|
|
6660
6924
|
__name(resolvePersonalityAnchorPath, "resolvePersonalityAnchorPath");
|
|
6661
6925
|
__name(readFile3, "readFile");
|
|
6662
6926
|
__name(writeFile3, "writeFile");
|
|
@@ -6699,6 +6963,7 @@ var init_knowledge = __esm({
|
|
|
6699
6963
|
init_storage_location();
|
|
6700
6964
|
init_storage_settings();
|
|
6701
6965
|
init_user_identity();
|
|
6966
|
+
init_user_language();
|
|
6702
6967
|
init_identity_resolution();
|
|
6703
6968
|
init_identity_governance();
|
|
6704
6969
|
init_effective_contract();
|
|
@@ -9771,6 +10036,17 @@ var memory = {
|
|
|
9771
10036
|
return profile.get(id);
|
|
9772
10037
|
}
|
|
9773
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
|
+
},
|
|
9774
10050
|
/** Note surface: store and retrieve markdown files and text blocks. */
|
|
9775
10051
|
note: {
|
|
9776
10052
|
async add(opts) {
|