@hasna/mementos 0.14.65 → 0.14.68

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/dist/storage.d.ts CHANGED
@@ -153,15 +153,80 @@ export interface StorageEnvStatus {
153
153
  active_name: string;
154
154
  configured: boolean;
155
155
  }
156
+ export type StorageRuntimeKind = "local-sqlite" | "cloud-postgres";
157
+ export interface StorageRuntimeContract {
158
+ contract: "mementos-cloud-runtime-v1";
159
+ kind: StorageRuntimeKind;
160
+ fail_closed: boolean;
161
+ local: {
162
+ adapter: "sqlite";
163
+ primary_runtime: boolean;
164
+ data_dir: string;
165
+ config_path: string;
166
+ local_file_sync: {
167
+ supported: false;
168
+ reason: string;
169
+ };
170
+ };
171
+ remote: {
172
+ adapter: "postgres";
173
+ purpose: "primary-runtime";
174
+ requested: boolean;
175
+ configured: boolean;
176
+ source: "env" | "config-file" | "none";
177
+ env_name: string | null;
178
+ redacted_url: string | null;
179
+ rds_compatible: boolean;
180
+ fail_closed: boolean;
181
+ missing: string[];
182
+ };
183
+ object_storage: {
184
+ s3: {
185
+ supported: false;
186
+ mutation_allowed: false;
187
+ reason: string;
188
+ };
189
+ aws: {
190
+ mutation_allowed: false;
191
+ reason: string;
192
+ };
193
+ };
194
+ migrations: {
195
+ target: "postgres-rds-compatible";
196
+ command: "mementos storage migrate";
197
+ dry_run_command: "mementos storage migrate --dry-run";
198
+ configured: boolean;
199
+ mutates_remote_on_apply: true;
200
+ requires_approval_for_live_run: true;
201
+ };
202
+ }
203
+ export interface SafeStorageConfigSummary {
204
+ mode: StorageMode;
205
+ auto_sync_interval_minutes: number;
206
+ feedback_endpoint_configured: boolean;
207
+ sync: StorageConfig["sync"];
208
+ rds: {
209
+ host_configured: boolean;
210
+ port: number;
211
+ username_configured: boolean;
212
+ password_env: string;
213
+ password_configured: boolean;
214
+ ssl: boolean;
215
+ };
216
+ }
156
217
  export interface NativeStorageStatus {
157
218
  ok: boolean;
158
219
  service: "mementos";
159
220
  mode: StorageMode;
160
221
  local_default: boolean;
161
222
  remote_enabled: boolean;
223
+ runtime: StorageRuntimeContract;
162
224
  database: {
163
225
  configured: boolean;
164
226
  redacted_url: string | null;
227
+ source: "env" | "config-file" | "none";
228
+ env_name: string | null;
229
+ rds_compatible: boolean;
165
230
  };
166
231
  tables: readonly MementosStorageTable[];
167
232
  env: {
@@ -179,6 +244,14 @@ export declare function getStorageDatabaseUrl(): string | null;
179
244
  export declare function getStorageDatabaseEnvName(): string;
180
245
  export declare function getStorageConfig(): StorageConfig;
181
246
  export declare function getStorageMode(): StorageMode;
247
+ export declare function redactDatabaseUrl(value: string | null): string | null;
248
+ export interface PostgresConnectionStringValidation {
249
+ ok: boolean;
250
+ redacted_url: string | null;
251
+ issues: string[];
252
+ }
253
+ export declare function validatePostgresConnectionString(value: string | null): PostgresConnectionStringValidation;
254
+ export declare function getSafeStorageConfigSummary(config?: StorageConfig): SafeStorageConfigSummary;
182
255
  export declare function getStorageStatus(): NativeStorageStatus;
183
256
  export declare const getMementosStorageStatus: typeof getStorageStatus;
184
257
  export declare function saveStorageConfig(config: StorageConfig): void;
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
package/dist/storage.js CHANGED
@@ -131,7 +131,7 @@ function translateSql(sql) {
131
131
  const op = parsed < 0 ? "-" : "+";
132
132
  return `to_char((now() ${op} INTERVAL '${absolute} ${pluralUnit}') AT TIME ZONE 'UTC', ${ISO_FMT})`;
133
133
  });
134
- translated = translated.replace(/COALESCE\s*\(\s*accessed_at\s*,\s*created_at\s*\)/gi, `COALESCE(accessed_at, to_char(created_at AT TIME ZONE 'UTC', ${ISO_FMT}))`);
134
+ translated = translated.replace(/COALESCE\s*\(\s*accessed_at\s*,\s*(created_at|updated_at)\s*\)/gi, (_match, col) => `COALESCE(accessed_at, to_char(${col} AT TIME ZONE 'UTC', ${ISO_FMT}))`);
135
135
  translated = translated.replace(/lower\s*\(\s*hex\s*\(\s*randomblob\s*\(\s*\d+\s*\)\s*\)\s*\)/gi, "gen_random_uuid()::text");
136
136
  translated = translated.replace(/\bIFNULL\s*\(/gi, "COALESCE(");
137
137
  translated = translated.replace(/\bINSTR\s*\(/gi, "STRPOS(");
@@ -391,8 +391,67 @@ function getStorageConfig() {
391
391
  function getStorageMode() {
392
392
  return getStorageConfig().mode;
393
393
  }
394
+ function isSecretQueryParam(key) {
395
+ const normalized = key.trim().toLowerCase();
396
+ return SECRET_QUERY_PARAMS.has(normalized) || /(?:secret|token|password|passphrase|credential|api[_-]?key|apikey|private[_-]?key|auth|session)/i.test(normalized);
397
+ }
394
398
  function redactDatabaseUrl(value) {
395
- return value?.replace(/:[^:@/]+@/, ":***@") ?? null;
399
+ if (!value) {
400
+ return null;
401
+ }
402
+ try {
403
+ const url = new URL(value);
404
+ if (url.password) {
405
+ url.password = "***";
406
+ }
407
+ for (const key of Array.from(url.searchParams.keys())) {
408
+ if (isSecretQueryParam(key)) {
409
+ url.searchParams.set(key, "***");
410
+ }
411
+ }
412
+ return url.toString();
413
+ } catch {
414
+ return value.replace(/:[^:@/\s]+@/, ":***@").replace(/([?&\s][^=&\s]*(?:secret|token|password|passphrase|credential|api[_-]?key|apikey|private[_-]?key|auth|session)[^=&\s]*=)[^&\s]+/gi, "$1***");
415
+ }
416
+ }
417
+ function validatePostgresConnectionString(value) {
418
+ const redactedUrl = redactDatabaseUrl(value);
419
+ if (!value) {
420
+ return {
421
+ ok: false,
422
+ redacted_url: redactedUrl,
423
+ issues: ["Missing PostgreSQL/RDS connection string."]
424
+ };
425
+ }
426
+ let url;
427
+ try {
428
+ url = new URL(value);
429
+ } catch {
430
+ return {
431
+ ok: false,
432
+ redacted_url: redactedUrl,
433
+ issues: ["PostgreSQL/RDS connection string must be a valid postgres:// or postgresql:// URL."]
434
+ };
435
+ }
436
+ if (url.protocol !== "postgres:" && url.protocol !== "postgresql:") {
437
+ return {
438
+ ok: false,
439
+ redacted_url: redactedUrl,
440
+ issues: ["PostgreSQL/RDS connection string must use postgres:// or postgresql://."]
441
+ };
442
+ }
443
+ if (!url.hostname) {
444
+ return {
445
+ ok: false,
446
+ redacted_url: redactedUrl,
447
+ issues: ["PostgreSQL/RDS connection string must include a host."]
448
+ };
449
+ }
450
+ return {
451
+ ok: true,
452
+ redacted_url: redactedUrl,
453
+ issues: []
454
+ };
396
455
  }
397
456
  function storageEnvStatus(key) {
398
457
  const activeName = getStorageEnvName(key);
@@ -402,22 +461,139 @@ function storageEnvStatus(key) {
402
461
  configured: readEnv(activeName) !== null
403
462
  };
404
463
  }
464
+ function remoteDatabaseConfigStatus(config) {
465
+ const env = getStorageDatabaseEnv();
466
+ const envUrl = env ? readEnv(env.name) : null;
467
+ if (env && envUrl) {
468
+ const validation = validatePostgresConnectionString(envUrl);
469
+ return {
470
+ configured: validation.ok,
471
+ source: "env",
472
+ env_name: env.name,
473
+ redacted_url: validation.redacted_url,
474
+ missing: [],
475
+ issues: validation.issues,
476
+ rds_compatible: validation.ok
477
+ };
478
+ }
479
+ const missing = [];
480
+ if (!config.rds.host) {
481
+ missing.push("storage.rds.host");
482
+ }
483
+ if (!config.rds.username) {
484
+ missing.push("storage.rds.username");
485
+ }
486
+ if (!readEnv(config.rds.password_env)) {
487
+ missing.push(config.rds.password_env);
488
+ }
489
+ const configured = missing.length === 0;
490
+ const redactedUrl = configured ? `postgres://${config.rds.username}:***@${config.rds.host}:${config.rds.port}/mementos${config.rds.ssl ? "?sslmode=require" : ""}` : null;
491
+ const issues = missing.length === 0 ? [] : [`Missing ${missing.join(", ")}.`];
492
+ return {
493
+ configured,
494
+ source: config.rds.host || config.rds.username ? "config-file" : "none",
495
+ env_name: null,
496
+ redacted_url: redactedUrl,
497
+ missing,
498
+ issues,
499
+ rds_compatible: configured
500
+ };
501
+ }
502
+ function runtimeKindFor(mode) {
503
+ return mode === "cloud" ? "cloud-postgres" : "local-sqlite";
504
+ }
505
+ function getSafeStorageConfigSummary(config = getStorageConfig()) {
506
+ return {
507
+ mode: config.mode,
508
+ auto_sync_interval_minutes: config.auto_sync_interval_minutes,
509
+ feedback_endpoint_configured: config.feedback_endpoint.trim() !== "",
510
+ sync: { ...config.sync },
511
+ rds: {
512
+ host_configured: config.rds.host.trim() !== "",
513
+ port: config.rds.port,
514
+ username_configured: config.rds.username.trim() !== "",
515
+ password_env: config.rds.password_env,
516
+ password_configured: readEnv(config.rds.password_env) !== null,
517
+ ssl: config.rds.ssl
518
+ }
519
+ };
520
+ }
405
521
  function getStorageStatus() {
406
- const mode = getStorageConfig().mode;
407
- const databaseUrl = getStorageDatabaseUrl();
522
+ const config = getStorageConfig();
523
+ const mode = config.mode;
524
+ const remoteRequested = mode === "cloud";
525
+ const remote = remoteDatabaseConfigStatus(config);
408
526
  const issues = [];
409
- if (mode === "cloud" && !databaseUrl) {
410
- issues.push(`Missing ${MEMENTOS_STORAGE_ENV.databaseUrl}`);
411
- }
527
+ const warnings = [];
528
+ if (remoteRequested && !remote.configured) {
529
+ issues.push(`Cloud PostgreSQL/RDS storage is requested but not configured. ${remote.issues.join(" ")}`);
530
+ }
531
+ if (mode === "local" && remote.issues.length > 0 && remote.source !== "none") {
532
+ warnings.push(`Cloud PostgreSQL/RDS configuration is present but invalid; cloud runtime stays disabled until fixed. ${remote.issues.join(" ")}`);
533
+ }
534
+ if (mode === "local" && remote.configured) {
535
+ warnings.push("Cloud PostgreSQL/RDS configuration is present, but storage mode is local; cloud runtime stays disabled until mode is cloud.");
536
+ }
537
+ const failClosed = remoteRequested && !remote.configured;
538
+ const runtime = {
539
+ contract: "mementos-cloud-runtime-v1",
540
+ kind: runtimeKindFor(mode),
541
+ fail_closed: failClosed,
542
+ local: {
543
+ adapter: "sqlite",
544
+ primary_runtime: mode === "local",
545
+ data_dir: LOCAL_DATA_DIR,
546
+ config_path: STORAGE_CONFIG_PATH,
547
+ local_file_sync: {
548
+ supported: false,
549
+ reason: "Mementos stores local state in SQLite; it does not sync raw local data files."
550
+ }
551
+ },
552
+ remote: {
553
+ adapter: "postgres",
554
+ purpose: "primary-runtime",
555
+ requested: remoteRequested,
556
+ configured: remote.configured,
557
+ source: remote.source,
558
+ env_name: remote.env_name,
559
+ redacted_url: remote.redacted_url,
560
+ rds_compatible: remote.rds_compatible,
561
+ fail_closed: failClosed,
562
+ missing: remote.missing
563
+ },
564
+ object_storage: {
565
+ s3: {
566
+ supported: false,
567
+ mutation_allowed: false,
568
+ reason: "No S3 object-storage adapter is part of this runtime."
569
+ },
570
+ aws: {
571
+ mutation_allowed: false,
572
+ reason: "Diagnostics do not store sensitive values, change AWS resources, deploy, or mutate production data."
573
+ }
574
+ },
575
+ migrations: {
576
+ target: "postgres-rds-compatible",
577
+ command: "mementos storage migrate",
578
+ dry_run_command: "mementos storage migrate --dry-run",
579
+ configured: remote.configured,
580
+ mutates_remote_on_apply: true,
581
+ requires_approval_for_live_run: true
582
+ }
583
+ };
412
584
  return {
413
585
  ok: issues.length === 0,
414
586
  service: "mementos",
415
587
  mode,
416
588
  local_default: mode === "local",
417
- remote_enabled: mode === "cloud",
589
+ remote_enabled: remoteRequested,
590
+ runtime,
418
591
  database: {
419
- configured: Boolean(databaseUrl),
420
- redacted_url: redactDatabaseUrl(databaseUrl)
592
+ configured: remote.configured,
593
+ redacted_url: remote.redacted_url,
594
+ source: remote.source,
595
+ env_name: remote.env_name,
596
+ rds_compatible: remote.rds_compatible
421
597
  },
422
598
  tables: MEMENTOS_STORAGE_TABLES,
423
599
  env: {
@@ -425,7 +601,7 @@ function getStorageStatus() {
425
601
  mode: storageEnvStatus("mode")
426
602
  },
427
603
  issues,
428
- warnings: [],
604
+ warnings,
429
605
  no_network: true
430
606
  };
431
607
  }
@@ -443,12 +619,23 @@ function getStorageConnectionString(dbName = "mementos") {
443
619
  }
444
620
  const envConnectionString = getConfiguredConnectionString();
445
621
  if (envConnectionString) {
622
+ const validation = validatePostgresConnectionString(envConnectionString);
623
+ if (!validation.ok) {
624
+ throw new Error(`Remote storage database is not configured. ${validation.issues.join(" ")}`);
625
+ }
446
626
  return envConnectionString;
447
627
  }
448
628
  const config = getStorageConfig();
449
629
  const { host, port, username, password_env, ssl } = config.rds;
450
- if (!host || !username) {
451
- throw new Error("Remote storage database is not configured. Set HASNA_MEMENTOS_DATABASE_URL or configure ~/.hasna/mementos/storage/config.json.");
630
+ const missing = [];
631
+ if (!host) {
632
+ missing.push("storage.rds.host");
633
+ }
634
+ if (!username) {
635
+ missing.push("storage.rds.username");
636
+ }
637
+ if (missing.length > 0) {
638
+ throw new Error(`Remote storage database is not configured. Missing ${missing.join(", ")}. Set HASNA_MEMENTOS_DATABASE_URL or configure ~/.hasna/mementos/storage/config.json.`);
452
639
  }
453
640
  const password = process.env[password_env];
454
641
  if (!password) {
@@ -599,7 +786,7 @@ function resetAllSyncMeta(db) {
599
786
  ensureSyncMetaTable(db);
600
787
  db.run("DELETE FROM _sync_meta");
601
788
  }
602
- var _serverContext = false, PgSyncPool, MEMENTOS_STORAGE_TABLES, STORAGE_TABLES, MEMENTOS_STORAGE_ENV, MEMENTOS_STORAGE_FALLBACK_ENV, DEFAULT_STORAGE_CONFIG, STORAGE_CONFIG_DIR, STORAGE_CONFIG_PATH, DATABASE_ENV_NAMES, MODE_ENV_NAMES, warnedDeprecatedModes, getMementosStorageStatus, SYNC_EXCLUDED_TABLE_PATTERNS, SYNC_META_TABLE_SQL = `
789
+ var _serverContext = false, PgSyncPool, MEMENTOS_STORAGE_TABLES, STORAGE_TABLES, MEMENTOS_STORAGE_ENV, MEMENTOS_STORAGE_FALLBACK_ENV, LOCAL_DATA_DIR, DEFAULT_STORAGE_CONFIG, STORAGE_CONFIG_DIR, STORAGE_CONFIG_PATH, DATABASE_ENV_NAMES, MODE_ENV_NAMES, warnedDeprecatedModes, SECRET_QUERY_PARAMS, getMementosStorageStatus, SYNC_EXCLUDED_TABLE_PATTERNS, SYNC_META_TABLE_SQL = `
603
790
  CREATE TABLE IF NOT EXISTS _sync_meta (
604
791
  table_name TEXT PRIMARY KEY,
605
792
  last_synced_at TEXT,
@@ -700,6 +887,7 @@ var init_storage = __esm(() => {
700
887
  databaseUrl: "MEMENTOS_DATABASE_URL",
701
888
  mode: "MEMENTOS_STORAGE_MODE"
702
889
  };
890
+ LOCAL_DATA_DIR = join(homedir(), ".hasna", "mementos");
703
891
  DEFAULT_STORAGE_CONFIG = {
704
892
  rds: {
705
893
  host: "",
@@ -715,7 +903,7 @@ var init_storage = __esm(() => {
715
903
  schedule_minutes: 0
716
904
  }
717
905
  };
718
- STORAGE_CONFIG_DIR = join(homedir(), ".hasna", "mementos", "storage");
906
+ STORAGE_CONFIG_DIR = join(LOCAL_DATA_DIR, "storage");
719
907
  STORAGE_CONFIG_PATH = join(STORAGE_CONFIG_DIR, "config.json");
720
908
  DATABASE_ENV_NAMES = [
721
909
  { name: MEMENTOS_STORAGE_ENV.databaseUrl, deprecated: false },
@@ -726,6 +914,15 @@ var init_storage = __esm(() => {
726
914
  { name: MEMENTOS_STORAGE_FALLBACK_ENV.mode, deprecated: false }
727
915
  ];
728
916
  warnedDeprecatedModes = new Set;
917
+ SECRET_QUERY_PARAMS = new Set([
918
+ "password",
919
+ "pass",
920
+ "pwd",
921
+ "token",
922
+ "secret",
923
+ "api_key",
924
+ "apikey"
925
+ ]);
729
926
  getMementosStorageStatus = getStorageStatus;
730
927
  SYNC_EXCLUDED_TABLE_PATTERNS = [
731
928
  /^sqlite_/,
@@ -738,11 +935,13 @@ var init_storage = __esm(() => {
738
935
  init_storage();
739
936
 
740
937
  export {
938
+ validatePostgresConnectionString,
741
939
  translateSql,
742
940
  shouldUsePgSsl,
743
941
  saveStorageConfig,
744
942
  resetSyncMeta,
745
943
  resetAllSyncMeta,
944
+ redactDatabaseUrl,
746
945
  markServerContext,
747
946
  makePool,
748
947
  listSqliteTables,
@@ -759,6 +958,7 @@ export {
759
958
  getStorageDatabaseEnv,
760
959
  getStorageConnectionString,
761
960
  getStorageConfig,
961
+ getSafeStorageConfigSummary,
762
962
  getMementosStorageStatus,
763
963
  getConfigPath,
764
964
  getConfigDir,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/mementos",
3
- "version": "0.14.65",
3
+ "version": "0.14.68",
4
4
  "description": "Universal memory system for AI agents - CLI + MCP server + library API",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",