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.cjs
CHANGED
|
@@ -1657,7 +1657,10 @@ var init_discover = __esm({
|
|
|
1657
1657
|
`);
|
|
1658
1658
|
}
|
|
1659
1659
|
}, "diagnostic");
|
|
1660
|
-
DEFAULT_LIMITS = {
|
|
1660
|
+
DEFAULT_LIMITS = {
|
|
1661
|
+
current: 8,
|
|
1662
|
+
deep: 25
|
|
1663
|
+
};
|
|
1661
1664
|
FIELD_ORDER = [
|
|
1662
1665
|
"id",
|
|
1663
1666
|
"knowledge",
|
|
@@ -5421,6 +5424,267 @@ var init_user_identity = __esm({
|
|
|
5421
5424
|
}
|
|
5422
5425
|
});
|
|
5423
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
|
+
|
|
5424
5688
|
// core/profile/ai.json
|
|
5425
5689
|
var ai_default;
|
|
5426
5690
|
var init_ai = __esm({
|
|
@@ -6077,12 +6341,12 @@ var init_staging = __esm({
|
|
|
6077
6341
|
});
|
|
6078
6342
|
|
|
6079
6343
|
// core/knowledge/loops.ts
|
|
6080
|
-
function
|
|
6344
|
+
function joinPath4(base, child) {
|
|
6081
6345
|
const separator3 = process.platform === "win32" ? "\\" : "/";
|
|
6082
6346
|
return `${base.replace(/[\\/]+/g, separator3)}${separator3}${child}`;
|
|
6083
6347
|
}
|
|
6084
6348
|
function resolveLoopsFilePath() {
|
|
6085
|
-
return
|
|
6349
|
+
return joinPath4(resolveUserDotMemPath(), LOOPS_FILE_NAME);
|
|
6086
6350
|
}
|
|
6087
6351
|
async function readFile(path) {
|
|
6088
6352
|
try {
|
|
@@ -6214,7 +6478,7 @@ var init_loops = __esm({
|
|
|
6214
6478
|
init_user_paths();
|
|
6215
6479
|
LOOPS_FILE_NAME = "loops.json";
|
|
6216
6480
|
LOOPS_FORMAT_VERSION = 1;
|
|
6217
|
-
__name(
|
|
6481
|
+
__name(joinPath4, "joinPath");
|
|
6218
6482
|
__name(resolveLoopsFilePath, "resolveLoopsFilePath");
|
|
6219
6483
|
__name(readFile, "readFile");
|
|
6220
6484
|
__name(writeFile, "writeFile");
|
|
@@ -6310,12 +6574,12 @@ var init_session = __esm({
|
|
|
6310
6574
|
});
|
|
6311
6575
|
|
|
6312
6576
|
// core/knowledge/exemplars.ts
|
|
6313
|
-
function
|
|
6577
|
+
function joinPath5(base, child) {
|
|
6314
6578
|
const separator3 = process.platform === "win32" ? "\\" : "/";
|
|
6315
6579
|
return `${base.replace(/[\\/]+/g, separator3)}${separator3}${child}`;
|
|
6316
6580
|
}
|
|
6317
6581
|
function resolveExemplarsPath() {
|
|
6318
|
-
return
|
|
6582
|
+
return joinPath5(resolveUserDotMemPath(), EXEMPLARS_FILE_NAME);
|
|
6319
6583
|
}
|
|
6320
6584
|
async function readFile2(path) {
|
|
6321
6585
|
try {
|
|
@@ -6452,7 +6716,7 @@ var init_exemplars = __esm({
|
|
|
6452
6716
|
init_user_paths();
|
|
6453
6717
|
EXEMPLARS_FILE_NAME = "exemplars.json";
|
|
6454
6718
|
EXEMPLARS_FORMAT_VERSION = 1;
|
|
6455
|
-
__name(
|
|
6719
|
+
__name(joinPath5, "joinPath");
|
|
6456
6720
|
__name(resolveExemplarsPath, "resolveExemplarsPath");
|
|
6457
6721
|
__name(readFile2, "readFile");
|
|
6458
6722
|
__name(writeFile2, "writeFile");
|
|
@@ -6467,12 +6731,12 @@ var init_exemplars = __esm({
|
|
|
6467
6731
|
});
|
|
6468
6732
|
|
|
6469
6733
|
// core/knowledge/personality-anchor.ts
|
|
6470
|
-
function
|
|
6734
|
+
function joinPath6(base, child) {
|
|
6471
6735
|
const separator3 = process.platform === "win32" ? "\\" : "/";
|
|
6472
6736
|
return `${base.replace(/[\\/]+/g, separator3)}${separator3}${child}`;
|
|
6473
6737
|
}
|
|
6474
6738
|
function resolvePersonalityAnchorPath() {
|
|
6475
|
-
return
|
|
6739
|
+
return joinPath6(resolveUserDotMemPath(), PERSONALITY_ANCHOR_FILE_NAME);
|
|
6476
6740
|
}
|
|
6477
6741
|
async function readFile3(path) {
|
|
6478
6742
|
try {
|
|
@@ -6660,7 +6924,7 @@ var init_personality_anchor = __esm({
|
|
|
6660
6924
|
init_user_paths();
|
|
6661
6925
|
PERSONALITY_ANCHOR_FILE_NAME = "personality-anchor.json";
|
|
6662
6926
|
PERSONALITY_ANCHOR_FORMAT_VERSION = 1;
|
|
6663
|
-
__name(
|
|
6927
|
+
__name(joinPath6, "joinPath");
|
|
6664
6928
|
__name(resolvePersonalityAnchorPath, "resolvePersonalityAnchorPath");
|
|
6665
6929
|
__name(readFile3, "readFile");
|
|
6666
6930
|
__name(writeFile3, "writeFile");
|
|
@@ -6703,6 +6967,7 @@ var init_knowledge = __esm({
|
|
|
6703
6967
|
init_storage_location();
|
|
6704
6968
|
init_storage_settings();
|
|
6705
6969
|
init_user_identity();
|
|
6970
|
+
init_user_language();
|
|
6706
6971
|
init_identity_resolution();
|
|
6707
6972
|
init_identity_governance();
|
|
6708
6973
|
init_effective_contract();
|
|
@@ -9775,6 +10040,17 @@ var memory = {
|
|
|
9775
10040
|
return profile.get(id);
|
|
9776
10041
|
}
|
|
9777
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
|
+
},
|
|
9778
10054
|
/** Note surface: store and retrieve markdown files and text blocks. */
|
|
9779
10055
|
note: {
|
|
9780
10056
|
async add(opts) {
|