@prmichaelsen/remember-mcp 2.5.2 → 2.6.1
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/CHANGELOG.md +95 -0
- package/agent/milestones/milestone-12-comment-system.md +239 -0
- package/agent/tasks/task-55-add-comment-fields-to-schema.md +171 -0
- package/agent/tasks/task-56-update-search-space-for-comments.md +192 -0
- package/agent/tasks/task-57-update-query-space-for-comments.md +167 -0
- package/agent/tasks/task-58-add-comment-unit-tests.md +255 -0
- package/agent/tasks/task-59-update-documentation-for-comments.md +324 -0
- package/agent/tasks/task-60-standardize-structured-logging.md +300 -0
- package/agent/tasks/task-70-draft.md +13 -0
- package/dist/server-factory.js +342 -141
- package/dist/server.js +385 -158
- package/dist/tools/query-space.d.ts +1 -0
- package/dist/tools/search-space.d.ts +1 -0
- package/package.json +1 -1
- package/src/config.ts +8 -1
- package/src/firestore/init.ts +21 -6
- package/src/services/confirmation-token.service.ts +42 -23
- package/src/tools/confirm.ts +46 -15
- package/src/tools/publish.ts +34 -9
- package/src/tools/query-space.ts +23 -6
- package/src/tools/search-space.ts +14 -1
- package/src/weaviate/client.ts +29 -7
- package/src/weaviate/schema.ts +34 -4
- package/src/weaviate/space-schema.ts +28 -3
package/dist/server.js
CHANGED
|
@@ -19,6 +19,10 @@ var __esm = (fn, res) => function __init() {
|
|
|
19
19
|
var __commonJS = (cb, mod) => function __require2() {
|
|
20
20
|
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
21
21
|
};
|
|
22
|
+
var __export = (target, all) => {
|
|
23
|
+
for (var name in all)
|
|
24
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
25
|
+
};
|
|
22
26
|
var __copyProps = (to, from, except, desc) => {
|
|
23
27
|
if (from && typeof from === "object" || typeof from === "function") {
|
|
24
28
|
for (let key of __getOwnPropNames(from))
|
|
@@ -394,54 +398,68 @@ var require_main = __commonJS({
|
|
|
394
398
|
}
|
|
395
399
|
});
|
|
396
400
|
|
|
397
|
-
// src/
|
|
398
|
-
var
|
|
399
|
-
|
|
400
|
-
|
|
401
|
+
// src/utils/logger.ts
|
|
402
|
+
var logger_exports = {};
|
|
403
|
+
__export(logger_exports, {
|
|
404
|
+
logger: () => logger
|
|
405
|
+
});
|
|
406
|
+
function shouldLog(level) {
|
|
407
|
+
return LOG_LEVELS[level] >= currentLevel;
|
|
408
|
+
}
|
|
409
|
+
var LOG_LEVELS, currentLevel, logger;
|
|
410
|
+
var init_logger = __esm({
|
|
411
|
+
"src/utils/logger.ts"() {
|
|
401
412
|
"use strict";
|
|
402
|
-
|
|
413
|
+
init_config();
|
|
414
|
+
LOG_LEVELS = {
|
|
415
|
+
debug: 0,
|
|
416
|
+
info: 1,
|
|
417
|
+
warn: 2,
|
|
418
|
+
error: 3
|
|
419
|
+
};
|
|
420
|
+
currentLevel = LOG_LEVELS[config.server.logLevel] ?? LOG_LEVELS.info;
|
|
421
|
+
logger = {
|
|
422
|
+
debug: (message, data) => {
|
|
423
|
+
if (shouldLog("debug")) {
|
|
424
|
+
if (data) {
|
|
425
|
+
console.debug(JSON.stringify({ level: "DEBUG", message, ...data }));
|
|
426
|
+
} else {
|
|
427
|
+
console.debug(`[DEBUG] ${message}`);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
},
|
|
431
|
+
info: (message, data) => {
|
|
432
|
+
if (shouldLog("info")) {
|
|
433
|
+
if (data) {
|
|
434
|
+
console.info(JSON.stringify({ level: "INFO", message, ...data }));
|
|
435
|
+
} else {
|
|
436
|
+
console.info(`[INFO] ${message}`);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
},
|
|
440
|
+
warn: (message, data) => {
|
|
441
|
+
if (shouldLog("warn")) {
|
|
442
|
+
if (data) {
|
|
443
|
+
console.warn(JSON.stringify({ level: "WARN", message, ...data }));
|
|
444
|
+
} else {
|
|
445
|
+
console.warn(`[WARN] ${message}`);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
},
|
|
449
|
+
error: (message, data) => {
|
|
450
|
+
if (shouldLog("error")) {
|
|
451
|
+
if (data) {
|
|
452
|
+
console.error(JSON.stringify({ level: "ERROR", message, ...data }));
|
|
453
|
+
} else {
|
|
454
|
+
console.error(`[ERROR] ${message}`);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
};
|
|
403
459
|
}
|
|
404
460
|
});
|
|
405
461
|
|
|
406
|
-
// src/server.ts
|
|
407
|
-
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
408
|
-
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
409
|
-
import {
|
|
410
|
-
CallToolRequestSchema,
|
|
411
|
-
ListToolsRequestSchema,
|
|
412
|
-
ErrorCode,
|
|
413
|
-
McpError
|
|
414
|
-
} from "@modelcontextprotocol/sdk/types.js";
|
|
415
|
-
|
|
416
462
|
// src/config.ts
|
|
417
|
-
var import_dotenv = __toESM(require_main(), 1);
|
|
418
|
-
import_dotenv.default.config();
|
|
419
|
-
var config = {
|
|
420
|
-
// Weaviate
|
|
421
|
-
weaviate: {
|
|
422
|
-
url: process.env.WEAVIATE_REST_URL || "http://localhost:8080",
|
|
423
|
-
apiKey: process.env.WEAVIATE_API_KEY || ""
|
|
424
|
-
},
|
|
425
|
-
// OpenAI (for embeddings)
|
|
426
|
-
openai: {
|
|
427
|
-
apiKey: process.env.OPENAI_EMBEDDINGS_API_KEY || process.env.OPENAI_APIKEY || ""
|
|
428
|
-
},
|
|
429
|
-
// Firebase (using firebase-admin-sdk-v8)
|
|
430
|
-
firebase: {
|
|
431
|
-
serviceAccount: process.env.FIREBASE_ADMIN_SERVICE_ACCOUNT_KEY || "",
|
|
432
|
-
projectId: process.env.FIREBASE_PROJECT_ID || ""
|
|
433
|
-
},
|
|
434
|
-
// Server
|
|
435
|
-
server: {
|
|
436
|
-
port: parseInt(process.env.PORT || "3000", 10),
|
|
437
|
-
nodeEnv: process.env.NODE_ENV || "development",
|
|
438
|
-
logLevel: process.env.LOG_LEVEL || "info"
|
|
439
|
-
},
|
|
440
|
-
// MCP
|
|
441
|
-
mcp: {
|
|
442
|
-
transport: process.env.MCP_TRANSPORT || "sse"
|
|
443
|
-
}
|
|
444
|
-
};
|
|
445
463
|
function validateConfig() {
|
|
446
464
|
const required = [
|
|
447
465
|
{ key: "WEAVIATE_REST_URL", value: config.weaviate.url },
|
|
@@ -455,10 +473,70 @@ function validateConfig() {
|
|
|
455
473
|
`Missing required environment variables: ${missing.map((m) => m.key).join(", ")}`
|
|
456
474
|
);
|
|
457
475
|
}
|
|
458
|
-
|
|
476
|
+
Promise.resolve().then(() => (init_logger(), logger_exports)).then(({ logger: logger2 }) => {
|
|
477
|
+
logger2.info("Configuration validated", {
|
|
478
|
+
module: "config"
|
|
479
|
+
});
|
|
480
|
+
});
|
|
459
481
|
}
|
|
482
|
+
var import_dotenv, config;
|
|
483
|
+
var init_config = __esm({
|
|
484
|
+
"src/config.ts"() {
|
|
485
|
+
"use strict";
|
|
486
|
+
import_dotenv = __toESM(require_main(), 1);
|
|
487
|
+
import_dotenv.default.config();
|
|
488
|
+
config = {
|
|
489
|
+
// Weaviate
|
|
490
|
+
weaviate: {
|
|
491
|
+
url: process.env.WEAVIATE_REST_URL || "http://localhost:8080",
|
|
492
|
+
apiKey: process.env.WEAVIATE_API_KEY || ""
|
|
493
|
+
},
|
|
494
|
+
// OpenAI (for embeddings)
|
|
495
|
+
openai: {
|
|
496
|
+
apiKey: process.env.OPENAI_EMBEDDINGS_API_KEY || process.env.OPENAI_APIKEY || ""
|
|
497
|
+
},
|
|
498
|
+
// Firebase (using firebase-admin-sdk-v8)
|
|
499
|
+
firebase: {
|
|
500
|
+
serviceAccount: process.env.FIREBASE_ADMIN_SERVICE_ACCOUNT_KEY || "",
|
|
501
|
+
projectId: process.env.FIREBASE_PROJECT_ID || ""
|
|
502
|
+
},
|
|
503
|
+
// Server
|
|
504
|
+
server: {
|
|
505
|
+
port: parseInt(process.env.PORT || "3000", 10),
|
|
506
|
+
nodeEnv: process.env.NODE_ENV || "development",
|
|
507
|
+
logLevel: process.env.LOG_LEVEL || "info"
|
|
508
|
+
},
|
|
509
|
+
// MCP
|
|
510
|
+
mcp: {
|
|
511
|
+
transport: process.env.MCP_TRANSPORT || "sse"
|
|
512
|
+
}
|
|
513
|
+
};
|
|
514
|
+
}
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
// src/types/space-memory.ts
|
|
518
|
+
var SUPPORTED_SPACES;
|
|
519
|
+
var init_space_memory = __esm({
|
|
520
|
+
"src/types/space-memory.ts"() {
|
|
521
|
+
"use strict";
|
|
522
|
+
SUPPORTED_SPACES = ["the_void"];
|
|
523
|
+
}
|
|
524
|
+
});
|
|
525
|
+
|
|
526
|
+
// src/server.ts
|
|
527
|
+
init_config();
|
|
528
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
529
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
530
|
+
import {
|
|
531
|
+
CallToolRequestSchema,
|
|
532
|
+
ListToolsRequestSchema,
|
|
533
|
+
ErrorCode,
|
|
534
|
+
McpError
|
|
535
|
+
} from "@modelcontextprotocol/sdk/types.js";
|
|
460
536
|
|
|
461
537
|
// src/weaviate/client.ts
|
|
538
|
+
init_config();
|
|
539
|
+
init_logger();
|
|
462
540
|
import weaviate from "weaviate-client";
|
|
463
541
|
var client = null;
|
|
464
542
|
async function initWeaviateClient() {
|
|
@@ -468,13 +546,19 @@ async function initWeaviateClient() {
|
|
|
468
546
|
const weaviateUrl = config.weaviate.url;
|
|
469
547
|
const isLocal = weaviateUrl.includes("localhost") || weaviateUrl.includes("127.0.0.1");
|
|
470
548
|
if (!isLocal) {
|
|
471
|
-
|
|
549
|
+
logger.info("Connecting to remote Weaviate", {
|
|
550
|
+
module: "weaviate-client",
|
|
551
|
+
url: weaviateUrl
|
|
552
|
+
});
|
|
472
553
|
client = await weaviate.connectToWeaviateCloud(weaviateUrl, {
|
|
473
554
|
authCredentials: config.weaviate.apiKey ? new weaviate.ApiKey(config.weaviate.apiKey) : void 0,
|
|
474
555
|
headers: config.openai.apiKey ? { "X-OpenAI-Api-Key": config.openai.apiKey } : void 0
|
|
475
556
|
});
|
|
476
557
|
} else {
|
|
477
|
-
|
|
558
|
+
logger.info("Connecting to local Weaviate", {
|
|
559
|
+
module: "weaviate-client",
|
|
560
|
+
url: weaviateUrl
|
|
561
|
+
});
|
|
478
562
|
const localConfig = {
|
|
479
563
|
host: weaviateUrl.replace(/^https?:\/\//, "").split(":")[0],
|
|
480
564
|
port: weaviateUrl.includes(":") ? parseInt(weaviateUrl.split(":").pop() || "8080") : 8080,
|
|
@@ -488,7 +572,10 @@ async function initWeaviateClient() {
|
|
|
488
572
|
}
|
|
489
573
|
client = await weaviate.connectToLocal(localConfig);
|
|
490
574
|
}
|
|
491
|
-
|
|
575
|
+
logger.info("Weaviate client initialized successfully", {
|
|
576
|
+
module: "weaviate-client",
|
|
577
|
+
isLocal
|
|
578
|
+
});
|
|
492
579
|
return client;
|
|
493
580
|
}
|
|
494
581
|
function getWeaviateClient() {
|
|
@@ -501,10 +588,16 @@ async function testWeaviateConnection() {
|
|
|
501
588
|
try {
|
|
502
589
|
const weaviateClient = getWeaviateClient();
|
|
503
590
|
const isReady = await weaviateClient.isReady();
|
|
504
|
-
|
|
591
|
+
logger.info("Weaviate connection test successful", {
|
|
592
|
+
module: "weaviate-client",
|
|
593
|
+
isReady
|
|
594
|
+
});
|
|
505
595
|
return isReady;
|
|
506
596
|
} catch (error) {
|
|
507
|
-
|
|
597
|
+
logger.error("Weaviate connection test failed", {
|
|
598
|
+
module: "weaviate-client",
|
|
599
|
+
error: error instanceof Error ? error.message : String(error)
|
|
600
|
+
});
|
|
508
601
|
return false;
|
|
509
602
|
}
|
|
510
603
|
}
|
|
@@ -520,6 +613,8 @@ function getMemoryCollectionName(userId) {
|
|
|
520
613
|
}
|
|
521
614
|
|
|
522
615
|
// src/firestore/init.ts
|
|
616
|
+
init_config();
|
|
617
|
+
init_logger();
|
|
523
618
|
import { initializeApp } from "@prmichaelsen/firebase-admin-sdk-v8";
|
|
524
619
|
import {
|
|
525
620
|
getDocument,
|
|
@@ -544,11 +639,20 @@ function initFirestore() {
|
|
|
544
639
|
projectId: config.firebase.projectId
|
|
545
640
|
});
|
|
546
641
|
initialized = true;
|
|
547
|
-
|
|
642
|
+
logger.info("Firestore initialized successfully", {
|
|
643
|
+
module: "firestore-init"
|
|
644
|
+
});
|
|
548
645
|
} catch (error) {
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
646
|
+
logger.error("Firestore initialization failed", {
|
|
647
|
+
module: "firestore-init",
|
|
648
|
+
error: error instanceof Error ? error.message : String(error)
|
|
649
|
+
});
|
|
650
|
+
logger.error("Make sure FIREBASE_ADMIN_SERVICE_ACCOUNT_KEY is valid JSON", {
|
|
651
|
+
module: "firestore-init"
|
|
652
|
+
});
|
|
653
|
+
logger.error("Check for proper escaping in .env file", {
|
|
654
|
+
module: "firestore-init"
|
|
655
|
+
});
|
|
552
656
|
throw error;
|
|
553
657
|
}
|
|
554
658
|
}
|
|
@@ -559,75 +663,40 @@ async function testFirestoreConnection() {
|
|
|
559
663
|
}
|
|
560
664
|
const { getDocument: getDocument3 } = await import("@prmichaelsen/firebase-admin-sdk-v8");
|
|
561
665
|
await getDocument3("_health_check", "test");
|
|
562
|
-
|
|
666
|
+
logger.info("Firestore connection test successful", {
|
|
667
|
+
module: "firestore-init"
|
|
668
|
+
});
|
|
563
669
|
return true;
|
|
564
670
|
} catch (error) {
|
|
565
|
-
|
|
671
|
+
logger.error("Firestore connection test failed", {
|
|
672
|
+
module: "firestore-init",
|
|
673
|
+
error: error instanceof Error ? error.message : String(error)
|
|
674
|
+
});
|
|
566
675
|
return false;
|
|
567
676
|
}
|
|
568
677
|
}
|
|
569
678
|
|
|
570
|
-
// src/
|
|
571
|
-
|
|
572
|
-
debug: 0,
|
|
573
|
-
info: 1,
|
|
574
|
-
warn: 2,
|
|
575
|
-
error: 3
|
|
576
|
-
};
|
|
577
|
-
var currentLevel = LOG_LEVELS[config.server.logLevel] ?? LOG_LEVELS.info;
|
|
578
|
-
function shouldLog(level) {
|
|
579
|
-
return LOG_LEVELS[level] >= currentLevel;
|
|
580
|
-
}
|
|
581
|
-
var logger = {
|
|
582
|
-
debug: (message, data) => {
|
|
583
|
-
if (shouldLog("debug")) {
|
|
584
|
-
if (data) {
|
|
585
|
-
console.debug(JSON.stringify({ level: "DEBUG", message, ...data }));
|
|
586
|
-
} else {
|
|
587
|
-
console.debug(`[DEBUG] ${message}`);
|
|
588
|
-
}
|
|
589
|
-
}
|
|
590
|
-
},
|
|
591
|
-
info: (message, data) => {
|
|
592
|
-
if (shouldLog("info")) {
|
|
593
|
-
if (data) {
|
|
594
|
-
console.info(JSON.stringify({ level: "INFO", message, ...data }));
|
|
595
|
-
} else {
|
|
596
|
-
console.info(`[INFO] ${message}`);
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
},
|
|
600
|
-
warn: (message, data) => {
|
|
601
|
-
if (shouldLog("warn")) {
|
|
602
|
-
if (data) {
|
|
603
|
-
console.warn(JSON.stringify({ level: "WARN", message, ...data }));
|
|
604
|
-
} else {
|
|
605
|
-
console.warn(`[WARN] ${message}`);
|
|
606
|
-
}
|
|
607
|
-
}
|
|
608
|
-
},
|
|
609
|
-
error: (message, data) => {
|
|
610
|
-
if (shouldLog("error")) {
|
|
611
|
-
if (data) {
|
|
612
|
-
console.error(JSON.stringify({ level: "ERROR", message, ...data }));
|
|
613
|
-
} else {
|
|
614
|
-
console.error(`[ERROR] ${message}`);
|
|
615
|
-
}
|
|
616
|
-
}
|
|
617
|
-
}
|
|
618
|
-
};
|
|
679
|
+
// src/server.ts
|
|
680
|
+
init_logger();
|
|
619
681
|
|
|
620
682
|
// src/weaviate/schema.ts
|
|
621
683
|
import weaviate2 from "weaviate-client";
|
|
684
|
+
init_logger();
|
|
622
685
|
async function createMemoryCollection(userId) {
|
|
623
686
|
const client2 = getWeaviateClient();
|
|
624
687
|
const collectionName = `Memory_${sanitizeUserId(userId)}`;
|
|
625
688
|
const exists = await client2.collections.exists(collectionName);
|
|
626
689
|
if (exists) {
|
|
627
|
-
|
|
690
|
+
logger.debug("Collection already exists", {
|
|
691
|
+
module: "weaviate-schema",
|
|
692
|
+
collectionName
|
|
693
|
+
});
|
|
628
694
|
return;
|
|
629
695
|
}
|
|
630
|
-
|
|
696
|
+
logger.info("Creating memory collection", {
|
|
697
|
+
module: "weaviate-schema",
|
|
698
|
+
collectionName
|
|
699
|
+
});
|
|
631
700
|
await client2.collections.create({
|
|
632
701
|
name: collectionName,
|
|
633
702
|
// Vectorizer configuration
|
|
@@ -824,10 +893,29 @@ async function createMemoryCollection(userId) {
|
|
|
824
893
|
name: "computed_weight",
|
|
825
894
|
dataType: "number",
|
|
826
895
|
description: "Calculated effective weight"
|
|
896
|
+
},
|
|
897
|
+
// Comment/threading fields (for threaded discussions in shared spaces)
|
|
898
|
+
{
|
|
899
|
+
name: "parent_id",
|
|
900
|
+
dataType: "text",
|
|
901
|
+
description: "ID of parent memory or comment (for threading)"
|
|
902
|
+
},
|
|
903
|
+
{
|
|
904
|
+
name: "thread_root_id",
|
|
905
|
+
dataType: "text",
|
|
906
|
+
description: "Root memory ID for fetching entire thread"
|
|
907
|
+
},
|
|
908
|
+
{
|
|
909
|
+
name: "moderation_flags",
|
|
910
|
+
dataType: "text[]",
|
|
911
|
+
description: 'Per-space moderation flags (format: "{space_id}:{flag_type}")'
|
|
827
912
|
}
|
|
828
913
|
]
|
|
829
914
|
});
|
|
830
|
-
|
|
915
|
+
logger.info("Memory collection created successfully", {
|
|
916
|
+
module: "weaviate-schema",
|
|
917
|
+
collectionName
|
|
918
|
+
});
|
|
831
919
|
}
|
|
832
920
|
async function ensureMemoryCollection(userId) {
|
|
833
921
|
const client2 = getWeaviateClient();
|
|
@@ -843,7 +931,11 @@ function getMemoryCollection(userId) {
|
|
|
843
931
|
return client2.collections.get(collectionName);
|
|
844
932
|
}
|
|
845
933
|
|
|
934
|
+
// src/tools/create-memory.ts
|
|
935
|
+
init_logger();
|
|
936
|
+
|
|
846
937
|
// src/utils/error-handler.ts
|
|
938
|
+
init_logger();
|
|
847
939
|
function formatDetailedError(error, context) {
|
|
848
940
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
849
941
|
const errorStack = error instanceof Error ? error.stack : void 0;
|
|
@@ -1395,6 +1487,9 @@ async function handleCreateMemory(args, userId, context) {
|
|
|
1395
1487
|
}
|
|
1396
1488
|
}
|
|
1397
1489
|
|
|
1490
|
+
// src/tools/search-memory.ts
|
|
1491
|
+
init_logger();
|
|
1492
|
+
|
|
1398
1493
|
// src/utils/weaviate-filters.ts
|
|
1399
1494
|
import { Filters } from "weaviate-client";
|
|
1400
1495
|
function buildCombinedSearchFilters(collection, filters) {
|
|
@@ -1662,6 +1757,7 @@ async function handleSearchMemory(args, userId) {
|
|
|
1662
1757
|
}
|
|
1663
1758
|
|
|
1664
1759
|
// src/tools/delete-memory.ts
|
|
1760
|
+
init_logger();
|
|
1665
1761
|
var deleteMemoryTool = {
|
|
1666
1762
|
name: "remember_delete_memory",
|
|
1667
1763
|
description: `Delete a memory from your collection.
|
|
@@ -1742,6 +1838,7 @@ async function handleDeleteMemory(args, userId) {
|
|
|
1742
1838
|
}
|
|
1743
1839
|
|
|
1744
1840
|
// src/tools/update-memory.ts
|
|
1841
|
+
init_logger();
|
|
1745
1842
|
var updateMemoryTool = {
|
|
1746
1843
|
name: "remember_update_memory",
|
|
1747
1844
|
description: `Update an existing memory with partial updates.
|
|
@@ -1927,6 +2024,7 @@ async function handleUpdateMemory(args, userId) {
|
|
|
1927
2024
|
}
|
|
1928
2025
|
|
|
1929
2026
|
// src/tools/find-similar.ts
|
|
2027
|
+
init_logger();
|
|
1930
2028
|
var findSimilarTool = {
|
|
1931
2029
|
name: "remember_find_similar",
|
|
1932
2030
|
description: `Find memories similar to a given memory or text using vector similarity.
|
|
@@ -2058,6 +2156,7 @@ async function handleFindSimilar(args, userId) {
|
|
|
2058
2156
|
}
|
|
2059
2157
|
|
|
2060
2158
|
// src/tools/query-memory.ts
|
|
2159
|
+
init_logger();
|
|
2061
2160
|
var queryMemoryTool = {
|
|
2062
2161
|
name: "remember_query_memory",
|
|
2063
2162
|
description: `Query memories using natural language for RAG (Retrieval-Augmented Generation).
|
|
@@ -2239,6 +2338,7 @@ ${content}${tags}`;
|
|
|
2239
2338
|
}
|
|
2240
2339
|
|
|
2241
2340
|
// src/tools/create-relationship.ts
|
|
2341
|
+
init_logger();
|
|
2242
2342
|
var createRelationshipTool = {
|
|
2243
2343
|
name: "remember_create_relationship",
|
|
2244
2344
|
description: `Create a relationship connecting 2 or more memories.
|
|
@@ -2445,6 +2545,7 @@ async function handleCreateRelationship(args, userId, context) {
|
|
|
2445
2545
|
}
|
|
2446
2546
|
|
|
2447
2547
|
// src/tools/update-relationship.ts
|
|
2548
|
+
init_logger();
|
|
2448
2549
|
var updateRelationshipTool = {
|
|
2449
2550
|
name: "remember_update_relationship",
|
|
2450
2551
|
description: `Update an existing relationship with partial updates.
|
|
@@ -2575,6 +2676,7 @@ async function handleUpdateRelationship(args, userId) {
|
|
|
2575
2676
|
|
|
2576
2677
|
// src/tools/search-relationship.ts
|
|
2577
2678
|
import { Filters as Filters2 } from "weaviate-client";
|
|
2679
|
+
init_logger();
|
|
2578
2680
|
var searchRelationshipTool = {
|
|
2579
2681
|
name: "remember_search_relationship",
|
|
2580
2682
|
description: `Search relationships by observation text or relationship type.
|
|
@@ -2728,6 +2830,7 @@ async function handleSearchRelationship(args, userId) {
|
|
|
2728
2830
|
}
|
|
2729
2831
|
|
|
2730
2832
|
// src/tools/delete-relationship.ts
|
|
2833
|
+
init_logger();
|
|
2731
2834
|
var deleteRelationshipTool = {
|
|
2732
2835
|
name: "remember_delete_relationship",
|
|
2733
2836
|
description: `Delete a relationship from your collection.
|
|
@@ -2855,6 +2958,9 @@ function getUserPreferencesPath(userId) {
|
|
|
2855
2958
|
return `${BASE}.users/${userId}/preferences`;
|
|
2856
2959
|
}
|
|
2857
2960
|
|
|
2961
|
+
// src/services/preferences-database.service.ts
|
|
2962
|
+
init_logger();
|
|
2963
|
+
|
|
2858
2964
|
// src/types/preferences.ts
|
|
2859
2965
|
var DEFAULT_PREFERENCES = {
|
|
2860
2966
|
templates: {
|
|
@@ -3119,6 +3225,7 @@ var PreferencesDatabaseService = class {
|
|
|
3119
3225
|
};
|
|
3120
3226
|
|
|
3121
3227
|
// src/tools/set-preference.ts
|
|
3228
|
+
init_logger();
|
|
3122
3229
|
var setPreferenceTool = {
|
|
3123
3230
|
name: "remember_set_preference",
|
|
3124
3231
|
description: `Update user preferences for system behavior through natural conversation.
|
|
@@ -3209,6 +3316,7 @@ async function handleSetPreference(args, userId) {
|
|
|
3209
3316
|
}
|
|
3210
3317
|
|
|
3211
3318
|
// src/tools/get-preferences.ts
|
|
3319
|
+
init_logger();
|
|
3212
3320
|
var getPreferencesTool = {
|
|
3213
3321
|
name: "remember_get_preferences",
|
|
3214
3322
|
description: `Get current user preferences.
|
|
@@ -3271,6 +3379,7 @@ async function handleGetPreferences(args, userId) {
|
|
|
3271
3379
|
|
|
3272
3380
|
// src/services/confirmation-token.service.ts
|
|
3273
3381
|
import { randomUUID } from "crypto";
|
|
3382
|
+
init_logger();
|
|
3274
3383
|
var ConfirmationTokenService = class {
|
|
3275
3384
|
EXPIRY_MINUTES = 5;
|
|
3276
3385
|
/**
|
|
@@ -3298,27 +3407,29 @@ var ConfirmationTokenService = class {
|
|
|
3298
3407
|
status: "pending"
|
|
3299
3408
|
};
|
|
3300
3409
|
const collectionPath = `users/${userId}/requests`;
|
|
3301
|
-
|
|
3410
|
+
logger.info("Creating confirmation request", {
|
|
3411
|
+
service: "ConfirmationTokenService",
|
|
3302
3412
|
userId,
|
|
3303
3413
|
action,
|
|
3304
3414
|
targetCollection,
|
|
3305
3415
|
collectionPath,
|
|
3306
|
-
|
|
3307
|
-
|
|
3308
|
-
|
|
3309
|
-
|
|
3310
|
-
|
|
3416
|
+
payloadKeys: Object.keys(payload)
|
|
3417
|
+
});
|
|
3418
|
+
logger.debug("Calling Firestore addDocument", {
|
|
3419
|
+
service: "ConfirmationTokenService",
|
|
3420
|
+
collectionPath
|
|
3311
3421
|
});
|
|
3312
|
-
console.log("[ConfirmationTokenService] Calling addDocument...");
|
|
3313
3422
|
const docRef = await addDocument(collectionPath, request);
|
|
3314
|
-
|
|
3423
|
+
logger.debug("Firestore addDocument returned", {
|
|
3424
|
+
service: "ConfirmationTokenService",
|
|
3315
3425
|
hasDocRef: !!docRef,
|
|
3316
3426
|
hasId: !!docRef?.id,
|
|
3317
3427
|
docRefId: docRef?.id
|
|
3318
3428
|
});
|
|
3319
3429
|
if (!docRef) {
|
|
3320
3430
|
const error = new Error("Firestore addDocument returned null/undefined");
|
|
3321
|
-
|
|
3431
|
+
logger.error("CRITICAL: addDocument returned null", {
|
|
3432
|
+
service: "ConfirmationTokenService",
|
|
3322
3433
|
userId,
|
|
3323
3434
|
collectionPath
|
|
3324
3435
|
});
|
|
@@ -3326,21 +3437,24 @@ var ConfirmationTokenService = class {
|
|
|
3326
3437
|
}
|
|
3327
3438
|
if (!docRef.id) {
|
|
3328
3439
|
const error = new Error("Firestore addDocument returned docRef without ID");
|
|
3329
|
-
|
|
3440
|
+
logger.error("CRITICAL: docRef has no ID", {
|
|
3441
|
+
service: "ConfirmationTokenService",
|
|
3330
3442
|
userId,
|
|
3331
3443
|
collectionPath,
|
|
3332
3444
|
docRef
|
|
3333
3445
|
});
|
|
3334
3446
|
throw error;
|
|
3335
3447
|
}
|
|
3336
|
-
|
|
3448
|
+
logger.info("Confirmation request created successfully", {
|
|
3449
|
+
service: "ConfirmationTokenService",
|
|
3337
3450
|
requestId: docRef.id,
|
|
3338
3451
|
token,
|
|
3339
3452
|
expiresAt: request.expires_at
|
|
3340
3453
|
});
|
|
3341
3454
|
return { requestId: docRef.id, token };
|
|
3342
3455
|
} catch (error) {
|
|
3343
|
-
|
|
3456
|
+
logger.error("Failed to create confirmation request", {
|
|
3457
|
+
service: "ConfirmationTokenService",
|
|
3344
3458
|
error: error instanceof Error ? error.message : String(error),
|
|
3345
3459
|
stack: error instanceof Error ? error.stack : void 0,
|
|
3346
3460
|
userId,
|
|
@@ -3359,7 +3473,8 @@ var ConfirmationTokenService = class {
|
|
|
3359
3473
|
*/
|
|
3360
3474
|
async validateToken(userId, token) {
|
|
3361
3475
|
const collectionPath = `users/${userId}/requests`;
|
|
3362
|
-
|
|
3476
|
+
logger.debug("Validating confirmation token", {
|
|
3477
|
+
service: "ConfirmationTokenService",
|
|
3363
3478
|
userId,
|
|
3364
3479
|
token,
|
|
3365
3480
|
collectionPath
|
|
@@ -3372,17 +3487,22 @@ var ConfirmationTokenService = class {
|
|
|
3372
3487
|
limit: 1
|
|
3373
3488
|
};
|
|
3374
3489
|
const results = await queryDocuments(collectionPath, queryOptions);
|
|
3375
|
-
|
|
3490
|
+
logger.debug("Token query results", {
|
|
3491
|
+
service: "ConfirmationTokenService",
|
|
3376
3492
|
resultsFound: results.length,
|
|
3377
3493
|
hasResults: results.length > 0
|
|
3378
3494
|
});
|
|
3379
3495
|
if (results.length === 0) {
|
|
3380
|
-
|
|
3496
|
+
logger.info("Token not found or not pending", {
|
|
3497
|
+
service: "ConfirmationTokenService",
|
|
3498
|
+
userId
|
|
3499
|
+
});
|
|
3381
3500
|
return null;
|
|
3382
3501
|
}
|
|
3383
3502
|
const doc = results[0];
|
|
3384
3503
|
const request = doc.data;
|
|
3385
|
-
|
|
3504
|
+
logger.info("Confirmation request found", {
|
|
3505
|
+
service: "ConfirmationTokenService",
|
|
3386
3506
|
requestId: doc.id,
|
|
3387
3507
|
action: request.action,
|
|
3388
3508
|
status: request.status,
|
|
@@ -3390,7 +3510,11 @@ var ConfirmationTokenService = class {
|
|
|
3390
3510
|
});
|
|
3391
3511
|
const expiresAt = new Date(request.expires_at);
|
|
3392
3512
|
if (expiresAt.getTime() < Date.now()) {
|
|
3393
|
-
|
|
3513
|
+
logger.info("Token expired", {
|
|
3514
|
+
service: "ConfirmationTokenService",
|
|
3515
|
+
requestId: doc.id,
|
|
3516
|
+
expiresAt: request.expires_at
|
|
3517
|
+
});
|
|
3394
3518
|
await this.updateStatus(userId, doc.id, "expired");
|
|
3395
3519
|
return null;
|
|
3396
3520
|
}
|
|
@@ -3476,7 +3600,10 @@ var ConfirmationTokenService = class {
|
|
|
3476
3600
|
* @returns Count of deleted requests
|
|
3477
3601
|
*/
|
|
3478
3602
|
async cleanupExpired() {
|
|
3479
|
-
|
|
3603
|
+
logger.warn("cleanupExpired not implemented - relying on Firestore TTL", {
|
|
3604
|
+
service: "ConfirmationTokenService",
|
|
3605
|
+
note: "Configure Firestore TTL policy on requests collection group"
|
|
3606
|
+
});
|
|
3480
3607
|
return 0;
|
|
3481
3608
|
}
|
|
3482
3609
|
};
|
|
@@ -3484,6 +3611,7 @@ var confirmationTokenService = new ConfirmationTokenService();
|
|
|
3484
3611
|
|
|
3485
3612
|
// src/weaviate/space-schema.ts
|
|
3486
3613
|
init_space_memory();
|
|
3614
|
+
init_logger();
|
|
3487
3615
|
import weaviate3 from "weaviate-client";
|
|
3488
3616
|
var PUBLIC_COLLECTION_NAME = "Memory_public";
|
|
3489
3617
|
function getSpaceCollectionName(spaceId) {
|
|
@@ -3494,7 +3622,11 @@ function isValidSpaceId(spaceId) {
|
|
|
3494
3622
|
}
|
|
3495
3623
|
async function createSpaceCollection(client2, spaceId) {
|
|
3496
3624
|
const collectionName = spaceId === "public" ? PUBLIC_COLLECTION_NAME : getSpaceCollectionName(spaceId);
|
|
3497
|
-
|
|
3625
|
+
logger.info("Creating space collection", {
|
|
3626
|
+
module: "weaviate-space-schema",
|
|
3627
|
+
collectionName,
|
|
3628
|
+
spaceId
|
|
3629
|
+
});
|
|
3498
3630
|
await client2.collections.create({
|
|
3499
3631
|
name: collectionName,
|
|
3500
3632
|
// Vectorizer configuration
|
|
@@ -3648,10 +3780,29 @@ async function createSpaceCollection(client2, spaceId) {
|
|
|
3648
3780
|
name: "version",
|
|
3649
3781
|
dataType: "number",
|
|
3650
3782
|
description: "Version number (increments on update)"
|
|
3783
|
+
},
|
|
3784
|
+
// Comment/threading fields (for threaded discussions in shared spaces)
|
|
3785
|
+
{
|
|
3786
|
+
name: "parent_id",
|
|
3787
|
+
dataType: "text",
|
|
3788
|
+
description: "ID of parent memory or comment (for threading)"
|
|
3789
|
+
},
|
|
3790
|
+
{
|
|
3791
|
+
name: "thread_root_id",
|
|
3792
|
+
dataType: "text",
|
|
3793
|
+
description: "Root memory ID for fetching entire thread"
|
|
3794
|
+
},
|
|
3795
|
+
{
|
|
3796
|
+
name: "moderation_flags",
|
|
3797
|
+
dataType: "text[]",
|
|
3798
|
+
description: 'Per-space moderation flags (format: "{space_id}:{flag_type}")'
|
|
3651
3799
|
}
|
|
3652
3800
|
]
|
|
3653
3801
|
});
|
|
3654
|
-
|
|
3802
|
+
logger.info("Space collection created successfully", {
|
|
3803
|
+
module: "weaviate-space-schema",
|
|
3804
|
+
collectionName
|
|
3805
|
+
});
|
|
3655
3806
|
}
|
|
3656
3807
|
async function ensurePublicCollection(client2) {
|
|
3657
3808
|
const collectionName = PUBLIC_COLLECTION_NAME;
|
|
@@ -3664,6 +3815,7 @@ async function ensurePublicCollection(client2) {
|
|
|
3664
3815
|
|
|
3665
3816
|
// src/tools/publish.ts
|
|
3666
3817
|
init_space_memory();
|
|
3818
|
+
init_logger();
|
|
3667
3819
|
var publishTool = {
|
|
3668
3820
|
name: "remember_publish",
|
|
3669
3821
|
description: 'Publish a memory to one or more shared spaces (like "The Void"). The memory will be COPIED (not moved) from your personal collection. Generates a confirmation token. Use remember_confirm to execute.',
|
|
@@ -3696,7 +3848,8 @@ var publishTool = {
|
|
|
3696
3848
|
};
|
|
3697
3849
|
async function handlePublish(args, userId) {
|
|
3698
3850
|
try {
|
|
3699
|
-
|
|
3851
|
+
logger.info("Starting publish request", {
|
|
3852
|
+
tool: "remember_publish",
|
|
3700
3853
|
userId,
|
|
3701
3854
|
memoryId: args.memory_id,
|
|
3702
3855
|
spaces: args.spaces,
|
|
@@ -3705,7 +3858,11 @@ async function handlePublish(args, userId) {
|
|
|
3705
3858
|
});
|
|
3706
3859
|
const invalidSpaces = args.spaces.filter((s) => !isValidSpaceId(s));
|
|
3707
3860
|
if (invalidSpaces.length > 0) {
|
|
3708
|
-
|
|
3861
|
+
logger.warn("Invalid space IDs provided", {
|
|
3862
|
+
tool: "remember_publish",
|
|
3863
|
+
invalidSpaces,
|
|
3864
|
+
providedSpaces: args.spaces
|
|
3865
|
+
});
|
|
3709
3866
|
return JSON.stringify(
|
|
3710
3867
|
{
|
|
3711
3868
|
success: false,
|
|
@@ -3722,7 +3879,10 @@ async function handlePublish(args, userId) {
|
|
|
3722
3879
|
);
|
|
3723
3880
|
}
|
|
3724
3881
|
if (args.spaces.length === 0) {
|
|
3725
|
-
|
|
3882
|
+
logger.warn("Empty spaces array provided", {
|
|
3883
|
+
tool: "remember_publish",
|
|
3884
|
+
userId
|
|
3885
|
+
});
|
|
3726
3886
|
return JSON.stringify(
|
|
3727
3887
|
{
|
|
3728
3888
|
success: false,
|
|
@@ -3735,15 +3895,24 @@ async function handlePublish(args, userId) {
|
|
|
3735
3895
|
}
|
|
3736
3896
|
const weaviateClient = getWeaviateClient();
|
|
3737
3897
|
const collectionName = getMemoryCollectionName(userId);
|
|
3738
|
-
|
|
3898
|
+
logger.debug("Fetching memory from collection", {
|
|
3899
|
+
tool: "remember_publish",
|
|
3900
|
+
collectionName,
|
|
3901
|
+
memoryId: args.memory_id
|
|
3902
|
+
});
|
|
3739
3903
|
const userCollection = weaviateClient.collections.get(collectionName);
|
|
3740
3904
|
const memory = await userCollection.query.fetchObjectById(args.memory_id);
|
|
3741
|
-
|
|
3905
|
+
logger.debug("Memory fetch result", {
|
|
3906
|
+
tool: "remember_publish",
|
|
3742
3907
|
found: !!memory,
|
|
3743
3908
|
memoryId: args.memory_id
|
|
3744
3909
|
});
|
|
3745
3910
|
if (!memory) {
|
|
3746
|
-
|
|
3911
|
+
logger.info("Memory not found", {
|
|
3912
|
+
tool: "remember_publish",
|
|
3913
|
+
memoryId: args.memory_id,
|
|
3914
|
+
collectionName
|
|
3915
|
+
});
|
|
3747
3916
|
return JSON.stringify(
|
|
3748
3917
|
{
|
|
3749
3918
|
success: false,
|
|
@@ -3794,7 +3963,12 @@ async function handlePublish(args, userId) {
|
|
|
3794
3963
|
spaces: args.spaces,
|
|
3795
3964
|
additional_tags: args.additional_tags || []
|
|
3796
3965
|
};
|
|
3797
|
-
|
|
3966
|
+
logger.info("Generating confirmation token", {
|
|
3967
|
+
tool: "remember_publish",
|
|
3968
|
+
userId,
|
|
3969
|
+
memoryId: args.memory_id,
|
|
3970
|
+
spaces: args.spaces
|
|
3971
|
+
});
|
|
3798
3972
|
const { requestId, token } = await confirmationTokenService.createRequest(
|
|
3799
3973
|
userId,
|
|
3800
3974
|
"publish_memory",
|
|
@@ -3802,10 +3976,12 @@ async function handlePublish(args, userId) {
|
|
|
3802
3976
|
void 0
|
|
3803
3977
|
// No single target_collection anymore
|
|
3804
3978
|
);
|
|
3805
|
-
|
|
3979
|
+
logger.info("Confirmation token generated", {
|
|
3980
|
+
tool: "remember_publish",
|
|
3806
3981
|
requestId,
|
|
3807
3982
|
token,
|
|
3808
|
-
action: "publish_memory"
|
|
3983
|
+
action: "publish_memory",
|
|
3984
|
+
spaces: args.spaces
|
|
3809
3985
|
});
|
|
3810
3986
|
return JSON.stringify(
|
|
3811
3987
|
{
|
|
@@ -3827,6 +4003,7 @@ async function handlePublish(args, userId) {
|
|
|
3827
4003
|
}
|
|
3828
4004
|
|
|
3829
4005
|
// src/tools/confirm.ts
|
|
4006
|
+
init_logger();
|
|
3830
4007
|
var confirmTool = {
|
|
3831
4008
|
name: "remember_confirm",
|
|
3832
4009
|
description: "Confirm and execute a pending action using the token. Works for any action that requires confirmation (publish, delete, etc.).",
|
|
@@ -3843,17 +4020,22 @@ var confirmTool = {
|
|
|
3843
4020
|
};
|
|
3844
4021
|
async function handleConfirm(args, userId) {
|
|
3845
4022
|
try {
|
|
3846
|
-
|
|
4023
|
+
logger.info("Starting confirmation", {
|
|
4024
|
+
tool: "remember_confirm",
|
|
3847
4025
|
userId,
|
|
3848
4026
|
token: args.token
|
|
3849
4027
|
});
|
|
3850
4028
|
const request = await confirmationTokenService.confirmRequest(userId, args.token);
|
|
3851
|
-
|
|
4029
|
+
logger.debug("Token validation result", {
|
|
4030
|
+
tool: "remember_confirm",
|
|
3852
4031
|
requestFound: !!request,
|
|
3853
4032
|
action: request?.action
|
|
3854
4033
|
});
|
|
3855
4034
|
if (!request) {
|
|
3856
|
-
|
|
4035
|
+
logger.info("Token invalid or expired", {
|
|
4036
|
+
tool: "remember_confirm",
|
|
4037
|
+
userId
|
|
4038
|
+
});
|
|
3857
4039
|
return JSON.stringify(
|
|
3858
4040
|
{
|
|
3859
4041
|
success: false,
|
|
@@ -3864,7 +4046,11 @@ async function handleConfirm(args, userId) {
|
|
|
3864
4046
|
2
|
|
3865
4047
|
);
|
|
3866
4048
|
}
|
|
3867
|
-
|
|
4049
|
+
logger.info("Executing confirmed action", {
|
|
4050
|
+
tool: "remember_confirm",
|
|
4051
|
+
action: request.action,
|
|
4052
|
+
userId
|
|
4053
|
+
});
|
|
3868
4054
|
if (request.action === "publish_memory") {
|
|
3869
4055
|
return await executePublishMemory(request, userId);
|
|
3870
4056
|
}
|
|
@@ -3880,7 +4066,8 @@ async function handleConfirm(args, userId) {
|
|
|
3880
4066
|
}
|
|
3881
4067
|
async function executePublishMemory(request, userId) {
|
|
3882
4068
|
try {
|
|
3883
|
-
|
|
4069
|
+
logger.info("Executing publish memory action", {
|
|
4070
|
+
function: "executePublishMemory",
|
|
3884
4071
|
userId,
|
|
3885
4072
|
memoryId: request.payload.memory_id,
|
|
3886
4073
|
spaces: request.payload.spaces,
|
|
@@ -3890,16 +4077,24 @@ async function executePublishMemory(request, userId) {
|
|
|
3890
4077
|
const userCollection = weaviateClient.collections.get(
|
|
3891
4078
|
getMemoryCollectionName(userId)
|
|
3892
4079
|
);
|
|
3893
|
-
|
|
4080
|
+
logger.debug("Fetching original memory", {
|
|
4081
|
+
function: "executePublishMemory",
|
|
4082
|
+
collectionName: getMemoryCollectionName(userId),
|
|
4083
|
+
memoryId: request.payload.memory_id
|
|
4084
|
+
});
|
|
3894
4085
|
const originalMemory = await userCollection.query.fetchObjectById(
|
|
3895
4086
|
request.payload.memory_id
|
|
3896
4087
|
);
|
|
3897
|
-
|
|
4088
|
+
logger.debug("Original memory fetch result", {
|
|
4089
|
+
function: "executePublishMemory",
|
|
3898
4090
|
found: !!originalMemory,
|
|
3899
4091
|
memoryId: request.payload.memory_id
|
|
3900
4092
|
});
|
|
3901
4093
|
if (!originalMemory) {
|
|
3902
|
-
|
|
4094
|
+
logger.info("Original memory not found", {
|
|
4095
|
+
function: "executePublishMemory",
|
|
4096
|
+
memoryId: request.payload.memory_id
|
|
4097
|
+
});
|
|
3903
4098
|
return JSON.stringify(
|
|
3904
4099
|
{
|
|
3905
4100
|
success: false,
|
|
@@ -3911,7 +4106,12 @@ async function executePublishMemory(request, userId) {
|
|
|
3911
4106
|
);
|
|
3912
4107
|
}
|
|
3913
4108
|
if (originalMemory.properties.user_id !== userId) {
|
|
3914
|
-
|
|
4109
|
+
logger.warn("Permission denied - wrong owner", {
|
|
4110
|
+
function: "executePublishMemory",
|
|
4111
|
+
memoryId: request.payload.memory_id,
|
|
4112
|
+
memoryOwner: originalMemory.properties.user_id,
|
|
4113
|
+
requestingUser: userId
|
|
4114
|
+
});
|
|
3915
4115
|
return JSON.stringify(
|
|
3916
4116
|
{
|
|
3917
4117
|
success: false,
|
|
@@ -3922,9 +4122,14 @@ async function executePublishMemory(request, userId) {
|
|
|
3922
4122
|
2
|
|
3923
4123
|
);
|
|
3924
4124
|
}
|
|
3925
|
-
|
|
4125
|
+
logger.debug("Ensuring public collection exists", {
|
|
4126
|
+
function: "executePublishMemory"
|
|
4127
|
+
});
|
|
3926
4128
|
const publicCollection = await ensurePublicCollection(weaviateClient);
|
|
3927
|
-
|
|
4129
|
+
logger.debug("Public collection ready", {
|
|
4130
|
+
function: "executePublishMemory",
|
|
4131
|
+
collectionName: "Memory_public"
|
|
4132
|
+
});
|
|
3928
4133
|
const originalTags = Array.isArray(originalMemory.properties.tags) ? originalMemory.properties.tags : [];
|
|
3929
4134
|
const additionalTags = Array.isArray(request.payload.additional_tags) ? request.payload.additional_tags : [];
|
|
3930
4135
|
const publishedMemory = {
|
|
@@ -3945,7 +4150,8 @@ async function executePublishMemory(request, userId) {
|
|
|
3945
4150
|
updated_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
3946
4151
|
version: 1
|
|
3947
4152
|
};
|
|
3948
|
-
|
|
4153
|
+
logger.info("Inserting memory into Memory_public", {
|
|
4154
|
+
function: "executePublishMemory",
|
|
3949
4155
|
spaces: request.payload.spaces,
|
|
3950
4156
|
spaceCount: request.payload.spaces?.length || 0,
|
|
3951
4157
|
memoryId: request.payload.memory_id,
|
|
@@ -3953,9 +4159,10 @@ async function executePublishMemory(request, userId) {
|
|
|
3953
4159
|
hasAuthorId: !!publishedMemory.author_id
|
|
3954
4160
|
});
|
|
3955
4161
|
const result = await publicCollection.data.insert(publishedMemory);
|
|
3956
|
-
|
|
3957
|
-
|
|
3958
|
-
spaceMemoryId: result
|
|
4162
|
+
logger.info("Memory published successfully", {
|
|
4163
|
+
function: "executePublishMemory",
|
|
4164
|
+
spaceMemoryId: result,
|
|
4165
|
+
spaces: request.payload.spaces
|
|
3959
4166
|
});
|
|
3960
4167
|
return JSON.stringify(
|
|
3961
4168
|
{
|
|
@@ -4027,7 +4234,7 @@ import { Filters as Filters3 } from "weaviate-client";
|
|
|
4027
4234
|
init_space_memory();
|
|
4028
4235
|
var searchSpaceTool = {
|
|
4029
4236
|
name: "remember_search_space",
|
|
4030
|
-
description: "Search one or more shared spaces to discover thoughts, ideas, and memories.
|
|
4237
|
+
description: "Search one or more shared spaces to discover thoughts, ideas, and memories. By default, excludes comments to keep discovery clean. Set include_comments: true to include threaded discussions. Can search multiple spaces in a single query.",
|
|
4031
4238
|
inputSchema: {
|
|
4032
4239
|
type: "object",
|
|
4033
4240
|
properties: {
|
|
@@ -4074,6 +4281,11 @@ var searchSpaceTool = {
|
|
|
4074
4281
|
type: "string",
|
|
4075
4282
|
description: "Filter memories created before this date (ISO 8601)"
|
|
4076
4283
|
},
|
|
4284
|
+
include_comments: {
|
|
4285
|
+
type: "boolean",
|
|
4286
|
+
description: "Include comments in search results (default: false)",
|
|
4287
|
+
default: false
|
|
4288
|
+
},
|
|
4077
4289
|
limit: {
|
|
4078
4290
|
type: "number",
|
|
4079
4291
|
default: 10,
|
|
@@ -4126,6 +4338,9 @@ async function handleSearchSpace(args, userId) {
|
|
|
4126
4338
|
if (args.content_type) {
|
|
4127
4339
|
filterList.push(publicCollection.filter.byProperty("type").equal(args.content_type));
|
|
4128
4340
|
}
|
|
4341
|
+
if (!args.include_comments && !args.content_type) {
|
|
4342
|
+
filterList.push(publicCollection.filter.byProperty("type").notEqual("comment"));
|
|
4343
|
+
}
|
|
4129
4344
|
if (args.tags && args.tags.length > 0) {
|
|
4130
4345
|
args.tags.forEach((tag) => {
|
|
4131
4346
|
filterList.push(publicCollection.filter.byProperty("tags").containsAny([tag]));
|
|
@@ -4178,7 +4393,7 @@ import { Filters as Filters4 } from "weaviate-client";
|
|
|
4178
4393
|
init_space_memory();
|
|
4179
4394
|
var querySpaceTool = {
|
|
4180
4395
|
name: "remember_query_space",
|
|
4181
|
-
description: "Ask natural language questions about memories in shared spaces.
|
|
4396
|
+
description: "Ask natural language questions about memories in shared spaces. By default, excludes comments to focus on original content. Set include_comments: true to include discussions in answers.",
|
|
4182
4397
|
inputSchema: {
|
|
4183
4398
|
type: "object",
|
|
4184
4399
|
properties: {
|
|
@@ -4186,11 +4401,15 @@ var querySpaceTool = {
|
|
|
4186
4401
|
type: "string",
|
|
4187
4402
|
description: "Natural language question"
|
|
4188
4403
|
},
|
|
4189
|
-
|
|
4190
|
-
type: "
|
|
4191
|
-
|
|
4192
|
-
|
|
4193
|
-
|
|
4404
|
+
spaces: {
|
|
4405
|
+
type: "array",
|
|
4406
|
+
items: {
|
|
4407
|
+
type: "string",
|
|
4408
|
+
enum: SUPPORTED_SPACES
|
|
4409
|
+
},
|
|
4410
|
+
description: 'Spaces to query (e.g., ["the_void", "dogs"])',
|
|
4411
|
+
minItems: 1,
|
|
4412
|
+
default: ["the_void"]
|
|
4194
4413
|
},
|
|
4195
4414
|
content_type: {
|
|
4196
4415
|
type: "string",
|
|
@@ -4215,6 +4434,11 @@ var querySpaceTool = {
|
|
|
4215
4434
|
type: "string",
|
|
4216
4435
|
description: "Filter memories created before this date (ISO 8601)"
|
|
4217
4436
|
},
|
|
4437
|
+
include_comments: {
|
|
4438
|
+
type: "boolean",
|
|
4439
|
+
description: "Include comments in query results (default: false)",
|
|
4440
|
+
default: false
|
|
4441
|
+
},
|
|
4218
4442
|
limit: {
|
|
4219
4443
|
type: "number",
|
|
4220
4444
|
default: 10,
|
|
@@ -4263,6 +4487,9 @@ async function handleQuerySpace(args, userId) {
|
|
|
4263
4487
|
if (args.content_type) {
|
|
4264
4488
|
filterList.push(publicCollection.filter.byProperty("type").equal(args.content_type));
|
|
4265
4489
|
}
|
|
4490
|
+
if (!args.include_comments && !args.content_type) {
|
|
4491
|
+
filterList.push(publicCollection.filter.byProperty("type").notEqual("comment"));
|
|
4492
|
+
}
|
|
4266
4493
|
if (args.tags && args.tags.length > 0) {
|
|
4267
4494
|
args.tags.forEach((tag) => {
|
|
4268
4495
|
filterList.push(publicCollection.filter.byProperty("tags").containsAny([tag]));
|