nexus-agents 2.53.0 → 2.54.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/dist/{adaptive-memory-MJCMOTPV.js → adaptive-memory-SUNFPY2W.js} +3 -3
- package/dist/{chunk-FCNPYMZF.js → chunk-2SPRLBOS.js} +2 -2
- package/dist/{chunk-VEBS5EYK.js → chunk-3IDJSFWT.js} +2 -2
- package/dist/chunk-3IDJSFWT.js.map +1 -0
- package/dist/{chunk-AAOPPO76.js → chunk-4FVISCDB.js} +2 -2
- package/dist/{chunk-BWKIRUP7.js → chunk-CTQ4F636.js} +6 -6
- package/dist/{chunk-TI5SX3WI.js → chunk-EKYT4NMD.js} +2 -2
- package/dist/{chunk-JFAIDT6O.js → chunk-FWSTXEG2.js} +3 -3
- package/dist/{chunk-NQ3TB7HC.js → chunk-IOU7F5PH.js} +2 -2
- package/dist/{chunk-AC4HF455.js → chunk-JERFBN73.js} +2 -2
- package/dist/{chunk-35IK52NC.js → chunk-KRIFBGWZ.js} +3 -3
- package/dist/{chunk-XEGXCMFJ.js → chunk-LSHIG4SR.js} +18 -13
- package/dist/chunk-LSHIG4SR.js.map +1 -0
- package/dist/{chunk-ZLRFNBSV.js → chunk-NYNBDP7M.js} +2 -2
- package/dist/{chunk-3JS6HWD7.js → chunk-ODCEUZI7.js} +169 -64
- package/dist/chunk-ODCEUZI7.js.map +1 -0
- package/dist/{chunk-AY3ODG3N.js → chunk-PMKP3MCY.js} +4 -4
- package/dist/chunk-PMKP3MCY.js.map +1 -0
- package/dist/{chunk-VDP25LYJ.js → chunk-Q5TKQWOI.js} +2 -2
- package/dist/{chunk-PWXM3E2K.js → chunk-RSUCXOQM.js} +3 -3
- package/dist/{chunk-FF3KQEPK.js → chunk-TCQNNY4J.js} +4 -4
- package/dist/{chunk-XSW52RAB.js → chunk-UOUJZIKH.js} +21 -2
- package/dist/chunk-UOUJZIKH.js.map +1 -0
- package/dist/{chunk-MS2S2GPC.js → chunk-VKZKC4SM.js} +2 -2
- package/dist/{chunk-4JOCMGZ6.js → chunk-VLVHPC72.js} +6 -6
- package/dist/{chunk-H45G5663.js → chunk-W5AJRK4U.js} +2 -2
- package/dist/{cli-circuit-breaker-TC6ABKU6.js → cli-circuit-breaker-7MCMHSDY.js} +4 -4
- package/dist/cli.js +21 -21
- package/dist/cli.js.map +1 -1
- package/dist/{composite-router-WEKJCAZV.js → composite-router-LXFOSMSE.js} +2 -2
- package/dist/{consensus-vote-IAK5NOIH.js → consensus-vote-5GOWRJXL.js} +7 -7
- package/dist/{dist-CV74KUT7.js → dist-4LDAFGC5.js} +10277 -7089
- package/dist/dist-4LDAFGC5.js.map +1 -0
- package/dist/{doctor-deep-I3SNBZWH.js → doctor-deep-RKMOZSIS.js} +3 -3
- package/dist/{expert-bridge-YIUJ2XXG.js → expert-bridge-KHHE42JP.js} +3 -3
- package/dist/{factory-WLLQRHFZ.js → factory-JVN47MFN.js} +4 -4
- package/dist/{factory-TIZRZ57W.js → factory-KRNR7XHD.js} +5 -5
- package/dist/index.d.ts +1 -0
- package/dist/index.js +18 -18
- package/dist/index.js.map +1 -1
- package/dist/{issue-triage-LX4BWDEA.js → issue-triage-O3C7P66H.js} +4 -4
- package/dist/{mcp-config-KQHLEC7Q.js → mcp-config-QRERKGR4.js} +3 -3
- package/dist/{mobimem-Q5QQCP5R.js → mobimem-FAOAXV3B.js} +2 -2
- package/dist/{repo-security-plan-LCJF6USQ.js → repo-security-plan-AZ5HMGFC.js} +3 -3
- package/dist/research-helpers-synthesize-TFZIXBX3.js +10 -0
- package/dist/{routing-memory-VHU2RXXE.js → routing-memory-MXF45FXT.js} +2 -2
- package/dist/{session-memory-LZS2LBAJ.js → session-memory-HL5XDBIL.js} +3 -3
- package/dist/{setup-command-RX5HTPUZ.js → setup-command-T2EABH66.js} +7 -7
- package/dist/{setup-config-7PPFTY4I.js → setup-config-PWK6WHMG.js} +3 -3
- package/dist/{weather-report-OSLN7MJH.js → weather-report-XZ5CENHE.js} +2 -2
- package/package.json +4 -4
- package/dist/chunk-3JS6HWD7.js.map +0 -1
- package/dist/chunk-AY3ODG3N.js.map +0 -1
- package/dist/chunk-VEBS5EYK.js.map +0 -1
- package/dist/chunk-XEGXCMFJ.js.map +0 -1
- package/dist/chunk-XSW52RAB.js.map +0 -1
- package/dist/dist-CV74KUT7.js.map +0 -1
- package/dist/research-helpers-synthesize-PDE4RPB5.js +0 -10
- /package/dist/{adaptive-memory-MJCMOTPV.js.map → adaptive-memory-SUNFPY2W.js.map} +0 -0
- /package/dist/{chunk-FCNPYMZF.js.map → chunk-2SPRLBOS.js.map} +0 -0
- /package/dist/{chunk-AAOPPO76.js.map → chunk-4FVISCDB.js.map} +0 -0
- /package/dist/{chunk-BWKIRUP7.js.map → chunk-CTQ4F636.js.map} +0 -0
- /package/dist/{chunk-TI5SX3WI.js.map → chunk-EKYT4NMD.js.map} +0 -0
- /package/dist/{chunk-JFAIDT6O.js.map → chunk-FWSTXEG2.js.map} +0 -0
- /package/dist/{chunk-NQ3TB7HC.js.map → chunk-IOU7F5PH.js.map} +0 -0
- /package/dist/{chunk-AC4HF455.js.map → chunk-JERFBN73.js.map} +0 -0
- /package/dist/{chunk-35IK52NC.js.map → chunk-KRIFBGWZ.js.map} +0 -0
- /package/dist/{chunk-ZLRFNBSV.js.map → chunk-NYNBDP7M.js.map} +0 -0
- /package/dist/{chunk-VDP25LYJ.js.map → chunk-Q5TKQWOI.js.map} +0 -0
- /package/dist/{chunk-PWXM3E2K.js.map → chunk-RSUCXOQM.js.map} +0 -0
- /package/dist/{chunk-FF3KQEPK.js.map → chunk-TCQNNY4J.js.map} +0 -0
- /package/dist/{chunk-MS2S2GPC.js.map → chunk-VKZKC4SM.js.map} +0 -0
- /package/dist/{chunk-4JOCMGZ6.js.map → chunk-VLVHPC72.js.map} +0 -0
- /package/dist/{chunk-H45G5663.js.map → chunk-W5AJRK4U.js.map} +0 -0
- /package/dist/{cli-circuit-breaker-TC6ABKU6.js.map → cli-circuit-breaker-7MCMHSDY.js.map} +0 -0
- /package/dist/{composite-router-WEKJCAZV.js.map → composite-router-LXFOSMSE.js.map} +0 -0
- /package/dist/{consensus-vote-IAK5NOIH.js.map → consensus-vote-5GOWRJXL.js.map} +0 -0
- /package/dist/{doctor-deep-I3SNBZWH.js.map → doctor-deep-RKMOZSIS.js.map} +0 -0
- /package/dist/{expert-bridge-YIUJ2XXG.js.map → expert-bridge-KHHE42JP.js.map} +0 -0
- /package/dist/{factory-TIZRZ57W.js.map → factory-JVN47MFN.js.map} +0 -0
- /package/dist/{factory-WLLQRHFZ.js.map → factory-KRNR7XHD.js.map} +0 -0
- /package/dist/{issue-triage-LX4BWDEA.js.map → issue-triage-O3C7P66H.js.map} +0 -0
- /package/dist/{mcp-config-KQHLEC7Q.js.map → mcp-config-QRERKGR4.js.map} +0 -0
- /package/dist/{mobimem-Q5QQCP5R.js.map → mobimem-FAOAXV3B.js.map} +0 -0
- /package/dist/{repo-security-plan-LCJF6USQ.js.map → repo-security-plan-AZ5HMGFC.js.map} +0 -0
- /package/dist/{research-helpers-synthesize-PDE4RPB5.js.map → research-helpers-synthesize-TFZIXBX3.js.map} +0 -0
- /package/dist/{routing-memory-VHU2RXXE.js.map → routing-memory-MXF45FXT.js.map} +0 -0
- /package/dist/{session-memory-LZS2LBAJ.js.map → session-memory-HL5XDBIL.js.map} +0 -0
- /package/dist/{setup-command-RX5HTPUZ.js.map → setup-command-T2EABH66.js.map} +0 -0
- /package/dist/{setup-config-7PPFTY4I.js.map → setup-config-PWK6WHMG.js.map} +0 -0
- /package/dist/{weather-report-OSLN7MJH.js.map → weather-report-XZ5CENHE.js.map} +0 -0
|
@@ -2,9 +2,9 @@ import {
|
|
|
2
2
|
AdaptiveMemoryBackend,
|
|
3
3
|
DEFAULT_SCORING_CONFIG,
|
|
4
4
|
createAdaptiveMemory
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-3IDJSFWT.js";
|
|
6
6
|
import "./chunk-633WH2ML.js";
|
|
7
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-UOUJZIKH.js";
|
|
8
8
|
import "./chunk-CLYZ7FWP.js";
|
|
9
9
|
import "./chunk-UP2VWCW5.js";
|
|
10
10
|
export {
|
|
@@ -12,4 +12,4 @@ export {
|
|
|
12
12
|
DEFAULT_SCORING_CONFIG,
|
|
13
13
|
createAdaptiveMemory
|
|
14
14
|
};
|
|
15
|
-
//# sourceMappingURL=adaptive-memory-
|
|
15
|
+
//# sourceMappingURL=adaptive-memory-SUNFPY2W.js.map
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
createLogger,
|
|
3
3
|
err,
|
|
4
4
|
ok
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-UOUJZIKH.js";
|
|
6
6
|
|
|
7
7
|
// src/scm/token-resolver.ts
|
|
8
8
|
import { execFile } from "child_process";
|
|
@@ -87,4 +87,4 @@ export {
|
|
|
87
87
|
hasToken,
|
|
88
88
|
getTokenEnvVars
|
|
89
89
|
};
|
|
90
|
-
//# sourceMappingURL=chunk-
|
|
90
|
+
//# sourceMappingURL=chunk-2SPRLBOS.js.map
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
formatZodError,
|
|
12
12
|
getTimeProvider,
|
|
13
13
|
ok
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-UOUJZIKH.js";
|
|
15
15
|
|
|
16
16
|
// src/context/memory-backend-types.ts
|
|
17
17
|
import { z } from "zod";
|
|
@@ -941,4 +941,4 @@ export {
|
|
|
941
941
|
AdaptiveMemoryBackend,
|
|
942
942
|
createAdaptiveMemory
|
|
943
943
|
};
|
|
944
|
-
//# sourceMappingURL=chunk-
|
|
944
|
+
//# sourceMappingURL=chunk-3IDJSFWT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/context/memory-backend-types.ts","../src/context/memory-backend.ts","../src/context/memory-markdown.ts","../src/context/memory-operations.ts","../src/context/adaptive-memory-types.ts","../src/utils/similarity-utils.ts","../src/utils/memory-db-utils.ts","../src/context/adaptive-memory-helpers.ts","../src/context/adaptive-memory.ts"],"sourcesContent":["/**\n * nexus-agents/context - Hybrid Memory Backend Types\n *\n * Type definitions, interfaces, and schemas for the hybrid memory backend.\n *\n * @module context/memory-backend-types\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../core/result.js';\nimport { NexusError, ErrorCode } from '../core/errors.js';\nimport type { ILogger } from '../core/logger.js';\nimport type { ISQLiteDatabase, ISQLiteStatement } from '../core/types/index.js';\n\n// Re-export for backward compatibility\nexport type { ISQLiteDatabase, ISQLiteStatement };\n\n// ============================================================================\n// Types and Interfaces\n// ============================================================================\n\n/**\n * Importance levels for memory entries.\n */\nexport const MemoryImportance = {\n LOW: 'low',\n MEDIUM: 'medium',\n HIGH: 'high',\n} as const;\n\nexport type MemoryImportance = (typeof MemoryImportance)[keyof typeof MemoryImportance];\n\n/**\n * Zod schema for MemoryImportance validation.\n */\nexport const MemoryImportanceSchema = z.enum(['low', 'medium', 'high']);\n\n/**\n * Metadata associated with a memory entry.\n */\nexport interface MemoryMetadata {\n /** Importance level determining storage strategy */\n importance: MemoryImportance;\n /** Optional tags for categorization */\n tags?: string[];\n /** Time-to-live in milliseconds (optional) */\n ttl?: number;\n}\n\n/**\n * Zod schema for MemoryMetadata validation.\n */\nexport const MemoryMetadataSchema = z.object({\n importance: MemoryImportanceSchema,\n tags: z.array(z.string()).optional(),\n ttl: z.number().positive().optional(),\n});\n\n/**\n * A complete memory entry with all fields.\n */\nexport interface MemoryEntry {\n /** Unique key for the memory */\n key: string;\n /** The stored value (JSON-serializable) */\n value: unknown;\n /** Associated metadata */\n metadata: MemoryMetadata;\n /** When the entry was created */\n createdAt: Date;\n /** When the entry was last accessed */\n accessedAt: Date;\n}\n\n/**\n * Zod schema for MemoryEntry validation.\n */\nexport const MemoryEntrySchema = z.object({\n key: z.string().min(1),\n value: z.unknown(),\n metadata: MemoryMetadataSchema,\n createdAt: z.date(),\n accessedAt: z.date(),\n});\n\n/**\n * Error class for memory operations.\n */\nexport class MemoryError extends NexusError {\n constructor(\n message: string,\n options?: Partial<\n Omit<{ code: ErrorCode; cause?: Error; context?: Record<string, unknown> }, 'code'>\n >\n ) {\n super(message, { code: ErrorCode.INTERNAL_ERROR, ...options });\n this.name = 'MemoryError';\n }\n}\n\n/**\n * Interface for memory backend implementations.\n */\nexport interface IMemoryBackend {\n /**\n * Store a value with associated metadata.\n * @param key - Unique key for the memory\n * @param value - The value to store (must be JSON-serializable)\n * @param metadata - Associated metadata\n */\n store(key: string, value: unknown, metadata: MemoryMetadata): Promise<Result<void, MemoryError>>;\n\n /**\n * Retrieve a value by key.\n * @param key - The key to look up\n * @returns The value or null if not found\n */\n retrieve(key: string): Promise<Result<unknown, MemoryError>>;\n\n /**\n * Search memories using full-text search.\n * @param query - Search query string\n * @param limit - Maximum number of results\n */\n search(query: string, limit: number): Promise<Result<MemoryEntry[], MemoryError>>;\n\n /**\n * Remove memories older than the specified date.\n * @param olderThan - Cutoff date for pruning\n * @returns Number of entries pruned\n */\n prune(olderThan: Date): Promise<Result<number, MemoryError>>;\n}\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\n/**\n * Configuration for HybridMemoryBackend.\n */\nexport interface HybridMemoryConfig {\n /** Path to SQLite database file */\n dbPath: string;\n /** Directory for Markdown exports */\n markdownDir: string;\n /** Optional logger instance */\n logger?: ILogger;\n /** Whether to auto-expire TTL entries on access (default: true) */\n autoExpire?: boolean;\n}\n\n/**\n * Zod schema for HybridMemoryConfig validation.\n */\nexport const HybridMemoryConfigSchema = z.object({\n dbPath: z.string().min(1),\n markdownDir: z.string().min(1),\n autoExpire: z.boolean().optional(),\n});\n\n// ============================================================================\n// SQLite Types (for better-sqlite3)\n// ============================================================================\n\n/**\n * Row structure in the memories table.\n */\nexport interface MemoryRow {\n key: string;\n value: string;\n metadata: string;\n created_at: number;\n accessed_at: number;\n expires_at: number | null;\n}\n\n// ISQLiteDatabase and ISQLiteStatement imported from core/types/database-types.ts\n// and re-exported above for backward compatibility\n","/**\n * nexus-agents/context - Hybrid Memory Backend\n *\n * Implements hybrid memory storage using SQLite for fast retrieval\n * and full-text search, with Markdown export for human-readable\n * high-importance memories.\n *\n * @module context/memory-backend\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../core/result.js';\nimport { ok, err } from '../core/result.js';\nimport { getTimeProvider, formatZodError } from '../core/index.js';\nimport { ValidationError } from '../core/errors.js';\nimport type { ILogger } from '../core/logger.js';\nimport { createLogger } from '../core/logger.js';\nimport {\n type HybridMemoryConfig,\n type IMemoryBackend,\n type ISQLiteDatabase,\n type MemoryEntry,\n type MemoryMetadata,\n type MemoryRow,\n HybridMemoryConfigSchema,\n MemoryError,\n MemoryImportance,\n MemoryMetadataSchema,\n} from './memory-backend-types.js';\nimport { MemoryMarkdownHelper } from './memory-markdown.js';\nimport {\n sanitizeFtsQuery,\n cleanupExpiredEntries,\n countMemories,\n expireAllEntries,\n pruneOldEntries,\n} from './memory-operations.js';\n\n// Re-export types for convenience\nexport {\n type HybridMemoryConfig,\n type IMemoryBackend,\n type ISQLiteDatabase,\n type ISQLiteStatement,\n type MemoryEntry,\n type MemoryMetadata,\n type MemoryRow,\n HybridMemoryConfigSchema,\n MemoryEntrySchema,\n MemoryError,\n MemoryImportance,\n MemoryImportanceSchema,\n MemoryMetadataSchema,\n} from './memory-backend-types.js';\n\n/**\n * Hybrid memory backend using SQLite for storage and Markdown for export.\n */\nexport class HybridMemoryBackend implements IMemoryBackend {\n private readonly dbPath: string;\n private readonly logger: ILogger;\n private readonly autoExpire: boolean;\n private readonly markdown: MemoryMarkdownHelper;\n private db: ISQLiteDatabase | null = null;\n private initialized = false;\n private initPromise: Promise<Result<void, MemoryError>> | undefined;\n\n constructor(config: HybridMemoryConfig) {\n const validation = HybridMemoryConfigSchema.safeParse(config);\n if (!validation.success) {\n throw new ValidationError(\n `Invalid HybridMemoryBackend config: ${formatZodError(validation.error)}`,\n {\n context: { config, validationErrors: validation.error.issues },\n }\n );\n }\n\n this.dbPath = config.dbPath;\n this.logger = config.logger ?? createLogger({ component: 'HybridMemoryBackend' });\n this.autoExpire = config.autoExpire ?? true;\n this.markdown = new MemoryMarkdownHelper(config.markdownDir, this.logger);\n }\n\n initializeWithDatabase(database: ISQLiteDatabase): void {\n this.db = database;\n this.createTables();\n this.markdown.ensureDir();\n this.initialized = true;\n this.logger.info('HybridMemoryBackend initialized', { dbPath: this.dbPath });\n }\n\n async initialize(): Promise<Result<void, MemoryError>> {\n if (this.initialized) return ok(undefined);\n this.initPromise ??= this.doInitialize().finally(() => {\n this.initPromise = undefined;\n });\n return this.initPromise;\n }\n\n private async doInitialize(): Promise<Result<void, MemoryError>> {\n try {\n const betterSqlite3Module = await import('better-sqlite3').catch((cause: unknown) => {\n this.logger.debug('better-sqlite3 import failed', { error: String(cause) });\n return null;\n });\n if (betterSqlite3Module === null) {\n return err(\n new MemoryError('better-sqlite3 not installed. Install: npm install better-sqlite3', {\n context: { dbPath: this.dbPath },\n })\n );\n }\n\n const Database = betterSqlite3Module.default;\n this.db = new Database(this.dbPath);\n this.createTables();\n this.markdown.ensureDir();\n this.initialized = true;\n this.logger.info('HybridMemoryBackend initialized', { dbPath: this.dbPath });\n return ok(undefined);\n } catch (error) {\n const causeError = error instanceof Error ? error : new Error(String(error));\n this.logger.error('Failed to initialize HybridMemoryBackend', causeError);\n return err(\n new MemoryError('Failed to initialize memory backend', {\n cause: causeError,\n context: { dbPath: this.dbPath },\n })\n );\n }\n }\n\n private createTables(): void {\n const database = this.getDatabase();\n database.exec(`\n CREATE TABLE IF NOT EXISTS memories (\n key TEXT PRIMARY KEY, value TEXT NOT NULL, metadata TEXT NOT NULL,\n created_at INTEGER NOT NULL, accessed_at INTEGER NOT NULL, expires_at INTEGER\n )\n `);\n database.exec(`\n CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(\n key, value, tags, content='memories', content_rowid='rowid'\n )\n `);\n database.exec(`\n CREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON memories BEGIN\n INSERT INTO memories_fts(rowid, key, value, tags)\n SELECT rowid, NEW.key, NEW.value, json_extract(NEW.metadata, '$.tags') FROM memories WHERE key = NEW.key;\n END\n `);\n database.exec(`\n CREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON memories BEGIN\n INSERT INTO memories_fts(memories_fts, rowid, key, value, tags)\n VALUES('delete', OLD.rowid, OLD.key, OLD.value, json_extract(OLD.metadata, '$.tags'));\n END\n `);\n database.exec(`\n CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN\n INSERT INTO memories_fts(memories_fts, rowid, key, value, tags)\n VALUES('delete', OLD.rowid, OLD.key, OLD.value, json_extract(OLD.metadata, '$.tags'));\n INSERT INTO memories_fts(rowid, key, value, tags)\n SELECT rowid, NEW.key, NEW.value, json_extract(NEW.metadata, '$.tags') FROM memories WHERE key = NEW.key;\n END\n `);\n database.exec(\n `CREATE INDEX IF NOT EXISTS idx_memories_expires_at ON memories(expires_at) WHERE expires_at IS NOT NULL`\n );\n database.exec(`CREATE INDEX IF NOT EXISTS idx_memories_created_at ON memories(created_at)`);\n this.logger.debug('Database tables created');\n }\n\n private getDatabase(): ISQLiteDatabase {\n if (this.db === null) throw new MemoryError('Database not initialized');\n return this.db;\n }\n\n private ensureInitialized(): void {\n if (!this.initialized || this.db === null) {\n throw new MemoryError('HybridMemoryBackend not initialized. Call initialize() first.');\n }\n }\n\n async store(\n key: string,\n value: unknown,\n metadata: MemoryMetadata\n ): Promise<Result<void, MemoryError>> {\n try {\n this.ensureInitialized();\n const keyValidation = z.string().min(1).safeParse(key);\n if (!keyValidation.success)\n return err(new MemoryError('Invalid key: must be non-empty string', { context: { key } }));\n\n const metadataValidation = MemoryMetadataSchema.safeParse(metadata);\n if (!metadataValidation.success)\n return err(\n new MemoryError('Invalid metadata', {\n context: { metadata, errors: metadataValidation.error.issues },\n })\n );\n\n const now = getTimeProvider().now();\n const expiresAt = metadata.ttl !== undefined ? now + metadata.ttl : null;\n const database = this.getDatabase();\n\n const stmt = database.prepare<MemoryRow>(\n `INSERT OR REPLACE INTO memories (key, value, metadata, created_at, accessed_at, expires_at) VALUES (?, ?, ?, ?, ?, ?)`\n );\n stmt.run(key, JSON.stringify(value), JSON.stringify(metadata), now, now, expiresAt);\n\n this.logger.debug('Stored memory', { key, importance: metadata.importance });\n if (metadata.importance === MemoryImportance.HIGH)\n await this.markdown.write(key, value, metadata, new Date(now));\n\n return ok(undefined);\n } catch (error) {\n const causeError = error instanceof Error ? error : new Error(String(error));\n this.logger.error('Failed to store memory', causeError, { key });\n return err(\n new MemoryError('Failed to store memory', { cause: causeError, context: { key } })\n );\n }\n }\n\n retrieve(key: string): Promise<Result<unknown, MemoryError>> {\n try {\n this.ensureInitialized();\n const database = this.getDatabase();\n const stmt = database.prepare<MemoryRow>(\n `SELECT key, value, metadata, created_at, accessed_at, expires_at FROM memories WHERE key = ?`\n );\n const row = stmt.get(key);\n\n if (row === undefined) return Promise.resolve(ok(null));\n if (this.autoExpire && row.expires_at !== null && row.expires_at < getTimeProvider().now()) {\n database.prepare('DELETE FROM memories WHERE key = ?').run(key);\n this.logger.debug('Auto-expired memory', { key });\n return Promise.resolve(ok(null));\n }\n database\n .prepare('UPDATE memories SET accessed_at = ? WHERE key = ?')\n .run(getTimeProvider().now(), key);\n return Promise.resolve(ok(JSON.parse(row.value) as unknown));\n } catch (error) {\n const causeError = error instanceof Error ? error : new Error(String(error));\n this.logger.error('Failed to retrieve memory', causeError, { key });\n return Promise.resolve(\n err(new MemoryError('Failed to retrieve memory', { cause: causeError, context: { key } }))\n );\n }\n }\n\n search(query: string, limit: number): Promise<Result<MemoryEntry[], MemoryError>> {\n try {\n this.ensureInitialized();\n if (limit <= 0 || limit > 1000)\n return Promise.resolve(\n err(new MemoryError('Invalid limit: must be between 1 and 1000', { context: { limit } }))\n );\n\n const sanitizedQuery = sanitizeFtsQuery(query);\n if (sanitizedQuery.length === 0) return Promise.resolve(ok([]));\n\n const database = this.getDatabase();\n const stmt = database.prepare<MemoryRow>(`\n SELECT m.key, m.value, m.metadata, m.created_at, m.accessed_at, m.expires_at\n FROM memories m INNER JOIN memories_fts fts ON m.rowid = fts.rowid\n WHERE memories_fts MATCH ? ORDER BY rank LIMIT ?\n `);\n const rows = stmt.all(sanitizedQuery, limit);\n const { entries } = cleanupExpiredEntries(rows, database, this.autoExpire, this.logger);\n return Promise.resolve(ok(entries));\n } catch (error) {\n const causeError = error instanceof Error ? error : new Error(String(error));\n this.logger.error('Failed to search memories', causeError, { query });\n return Promise.resolve(\n err(\n new MemoryError('Failed to search memories', {\n cause: causeError,\n context: { query, limit },\n })\n )\n );\n }\n }\n\n prune(olderThan: Date): Promise<Result<number, MemoryError>> {\n this.ensureInitialized();\n return Promise.resolve(pruneOldEntries(this.getDatabase(), olderThan, this.logger));\n }\n\n expireAll(): Promise<Result<number, MemoryError>> {\n this.ensureInitialized();\n return Promise.resolve(expireAllEntries(this.getDatabase(), this.logger));\n }\n\n delete(key: string): Promise<Result<boolean, MemoryError>> {\n try {\n this.ensureInitialized();\n const result = this.getDatabase().prepare('DELETE FROM memories WHERE key = ?').run(key);\n if (result.changes > 0) {\n this.markdown.delete(key);\n this.logger.debug('Deleted memory', { key });\n return Promise.resolve(ok(true));\n }\n return Promise.resolve(ok(false));\n } catch (error) {\n const causeError = error instanceof Error ? error : new Error(String(error));\n this.logger.error('Failed to delete memory', causeError, { key });\n return Promise.resolve(\n err(new MemoryError('Failed to delete memory', { cause: causeError, context: { key } }))\n );\n }\n }\n\n getAll(limit = 100): Promise<Result<MemoryEntry[], MemoryError>> {\n try {\n this.ensureInitialized();\n const database = this.getDatabase();\n const rows = database\n .prepare<MemoryRow>(\n `SELECT key, value, metadata, created_at, accessed_at, expires_at FROM memories ORDER BY accessed_at DESC LIMIT ?`\n )\n .all(limit);\n const { entries } = cleanupExpiredEntries(rows, database, this.autoExpire, this.logger);\n return Promise.resolve(ok(entries));\n } catch (error) {\n const causeError = error instanceof Error ? error : new Error(String(error));\n this.logger.error('Failed to get all memories', causeError);\n return Promise.resolve(\n err(new MemoryError('Failed to get all memories', { cause: causeError }))\n );\n }\n }\n\n count(): Promise<Result<number, MemoryError>> {\n this.ensureInitialized();\n return Promise.resolve(countMemories(this.getDatabase()));\n }\n\n close(): void {\n if (this.db !== null) {\n this.db.close();\n this.db = null;\n this.initialized = false;\n this.logger.info('HybridMemoryBackend closed');\n }\n }\n}\n","/**\n * nexus-agents/context - Memory Markdown Helper\n *\n * Handles Markdown file export for high-importance memories.\n *\n * @module context/memory-markdown\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { ILogger } from '../core/logger.js';\nimport type { MemoryMetadata } from './memory-backend-types.js';\n\n/**\n * Helper class for Markdown memory file operations.\n */\nexport class MemoryMarkdownHelper {\n constructor(\n private readonly markdownDir: string,\n private readonly logger: ILogger\n ) {}\n\n /**\n * Ensure the Markdown export directory exists.\n */\n ensureDir(): void {\n if (!fs.existsSync(this.markdownDir)) {\n fs.mkdirSync(this.markdownDir, { recursive: true });\n this.logger.debug('Created Markdown directory', { path: this.markdownDir });\n }\n }\n\n /**\n * Write a memory entry to Markdown file.\n */\n async write(\n key: string,\n value: unknown,\n metadata: MemoryMetadata,\n createdAt: Date\n ): Promise<void> {\n const filename = this.keyToFilename(key);\n const filepath = path.join(this.markdownDir, filename);\n\n const content = this.format(key, value, metadata, createdAt);\n\n try {\n await fs.promises.writeFile(filepath, content, 'utf-8');\n this.logger.debug('Wrote Markdown file', { key, filepath });\n } catch (error) {\n this.logger.warn('Failed to write Markdown file', { key, filepath, error });\n // Don't throw - Markdown export is secondary to SQLite storage\n }\n }\n\n /**\n * Delete a Markdown file for a memory.\n */\n delete(key: string): void {\n const filename = this.keyToFilename(key);\n const filepath = path.join(this.markdownDir, filename);\n\n try {\n if (fs.existsSync(filepath)) {\n fs.unlinkSync(filepath);\n this.logger.debug('Deleted Markdown file', { key, filepath });\n }\n } catch (error) {\n this.logger.warn('Failed to delete Markdown file', { key, filepath, error });\n }\n }\n\n /**\n * Convert a memory key to a safe filename.\n */\n private keyToFilename(key: string): string {\n // Replace unsafe characters with underscores\n const safeKey = key\n .replace(/[^a-zA-Z0-9-_]/g, '_')\n .replace(/_+/g, '_')\n .substring(0, 200); // Limit filename length\n\n return `${safeKey}.md`;\n }\n\n /**\n * Format a memory entry as Markdown.\n */\n private format(key: string, value: unknown, metadata: MemoryMetadata, createdAt: Date): string {\n const lines: string[] = [\n `# Memory: ${key}`,\n '',\n '## Metadata',\n '',\n `- **Importance:** ${metadata.importance}`,\n `- **Created:** ${createdAt.toISOString()}`,\n ];\n\n if (metadata.tags !== undefined && metadata.tags.length > 0) {\n lines.push(`- **Tags:** ${metadata.tags.join(', ')}`);\n }\n\n if (metadata.ttl !== undefined) {\n const expiresAt = new Date(createdAt.getTime() + metadata.ttl);\n lines.push(`- **Expires:** ${expiresAt.toISOString()}`);\n }\n\n lines.push('', '## Value', '');\n\n // Format value based on type\n if (typeof value === 'string') {\n lines.push(value);\n } else if (value === null) {\n lines.push('`null`');\n } else if (typeof value === 'object') {\n lines.push('```json', JSON.stringify(value, null, 2), '```');\n } else {\n // For primitives (number, boolean, etc.), convert to string representation\n const stringValue =\n typeof value === 'number' || typeof value === 'boolean'\n ? String(value)\n : JSON.stringify(value);\n lines.push(`\\`${stringValue}\\``);\n }\n\n lines.push('');\n\n return lines.join('\\n');\n }\n}\n","/**\n * nexus-agents/context - Memory Operations\n *\n * Query and mutation operations for the hybrid memory backend.\n *\n * @module context/memory-operations\n */\n\nimport type { Result } from '../core/result.js';\nimport { ok, err } from '../core/result.js';\nimport { getTimeProvider } from '../core/index.js';\nimport type { ILogger } from '../core/logger.js';\nimport type {\n ISQLiteDatabase,\n MemoryEntry,\n MemoryMetadata,\n MemoryRow,\n} from './memory-backend-types.js';\nimport { MemoryError } from './memory-backend-types.js';\n\n/** Safely parse JSON from a DB column, returning null on corrupt data. */\nfunction safeParseJson(raw: string): unknown {\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n return null;\n }\n}\n\n/** Parse metadata JSON or return safe defaults for corrupt rows. */\nfunction parseMetadataOrDefault(raw: string): MemoryMetadata {\n const parsed = safeParseJson(raw);\n if (parsed !== null && typeof parsed === 'object') return parsed as MemoryMetadata;\n return { importance: 'medium' };\n}\n\n/**\n * Converts a database row to a MemoryEntry.\n * Gracefully handles corrupt JSON in DB rows (#1680 quality scan).\n */\nexport function rowToEntry(row: MemoryRow): MemoryEntry {\n return {\n key: row.key,\n value: safeParseJson(row.value),\n metadata: parseMetadataOrDefault(row.metadata),\n createdAt: new Date(row.created_at),\n accessedAt: new Date(row.accessed_at),\n };\n}\n\n/**\n * Sanitizes a query string for FTS5.\n * Removes special FTS5 operators to prevent injection.\n */\nexport function sanitizeFtsQuery(query: string): string {\n return query\n .replace(/[*:^\"(){}[\\]]/g, ' ')\n .replace(/\\bAND\\b/gi, ' ')\n .replace(/\\bOR\\b/gi, ' ')\n .replace(/\\bNOT\\b/gi, ' ')\n .replace(/\\bNEAR\\b/gi, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/**\n * Cleans up expired entries from the results.\n */\nexport function cleanupExpiredEntries(\n rows: MemoryRow[],\n database: ISQLiteDatabase,\n autoExpire: boolean,\n logger: ILogger\n): { entries: MemoryEntry[]; expiredCount: number } {\n const now = getTimeProvider().now();\n const entries: MemoryEntry[] = [];\n const expiredKeys: string[] = [];\n\n for (const row of rows) {\n if (autoExpire && row.expires_at !== null && row.expires_at < now) {\n expiredKeys.push(row.key);\n continue;\n }\n entries.push(rowToEntry(row));\n }\n\n if (expiredKeys.length > 0) {\n const deleteStmt = database.prepare(\n `DELETE FROM memories WHERE key IN (${expiredKeys.map(() => '?').join(',')})`\n );\n deleteStmt.run(...expiredKeys);\n logger.debug('Auto-expired memories', { count: expiredKeys.length });\n }\n\n return { entries, expiredCount: expiredKeys.length };\n}\n\n/**\n * Executes a search query against FTS5.\n */\nexport function executeSearch(\n database: ISQLiteDatabase,\n sanitizedQuery: string,\n limit: number,\n autoExpire: boolean,\n logger: ILogger\n): Result<MemoryEntry[], MemoryError> {\n try {\n const stmt = database.prepare<MemoryRow>(`\n SELECT m.key, m.value, m.metadata, m.created_at, m.accessed_at, m.expires_at\n FROM memories m\n INNER JOIN memories_fts fts ON m.rowid = fts.rowid\n WHERE memories_fts MATCH ?\n ORDER BY rank\n LIMIT ?\n `);\n\n const rows = stmt.all(sanitizedQuery, limit);\n const { entries } = cleanupExpiredEntries(rows, database, autoExpire, logger);\n\n return ok(entries);\n } catch (error) {\n const causeError = error instanceof Error ? error : new Error(String(error));\n return err(new MemoryError('Failed to execute search', { cause: causeError }));\n }\n}\n\n/**\n * Retrieves all memories with pagination.\n */\nexport function getAllMemories(\n database: ISQLiteDatabase,\n limit: number,\n autoExpire: boolean,\n logger: ILogger\n): Result<MemoryEntry[], MemoryError> {\n try {\n const stmt = database.prepare<MemoryRow>(`\n SELECT key, value, metadata, created_at, accessed_at, expires_at\n FROM memories ORDER BY accessed_at DESC LIMIT ?\n `);\n\n const rows = stmt.all(limit);\n const { entries } = cleanupExpiredEntries(rows, database, autoExpire, logger);\n\n return ok(entries);\n } catch (error) {\n const causeError = error instanceof Error ? error : new Error(String(error));\n return err(new MemoryError('Failed to get all memories', { cause: causeError }));\n }\n}\n\n/**\n * Counts total memories in the database.\n */\nexport function countMemories(database: ISQLiteDatabase): Result<number, MemoryError> {\n try {\n const stmt = database.prepare<{ count: number }>('SELECT COUNT(*) as count FROM memories');\n const row = stmt.get();\n return ok(row?.count ?? 0);\n } catch (error) {\n const causeError = error instanceof Error ? error : new Error(String(error));\n return err(new MemoryError('Failed to count memories', { cause: causeError }));\n }\n}\n\n/**\n * Expires all entries that have passed their TTL.\n */\nexport function expireAllEntries(\n database: ISQLiteDatabase,\n logger: ILogger\n): Result<number, MemoryError> {\n try {\n const stmt = database.prepare(\n 'DELETE FROM memories WHERE expires_at IS NOT NULL AND expires_at < ?'\n );\n const result = stmt.run(getTimeProvider().now());\n logger.info('Expired memories', { count: result.changes });\n return ok(result.changes);\n } catch (error) {\n const causeError = error instanceof Error ? error : new Error(String(error));\n return err(new MemoryError('Failed to expire memories', { cause: causeError }));\n }\n}\n\n/**\n * Prunes entries older than the specified date.\n */\nexport function pruneOldEntries(\n database: ISQLiteDatabase,\n olderThan: Date,\n logger: ILogger\n): Result<number, MemoryError> {\n try {\n const stmt = database.prepare('DELETE FROM memories WHERE created_at < ?');\n const result = stmt.run(olderThan.getTime());\n logger.info('Pruned old memories', {\n olderThan: olderThan.toISOString(),\n count: result.changes,\n });\n return ok(result.changes);\n } catch (error) {\n const causeError = error instanceof Error ? error : new Error(String(error));\n return err(\n new MemoryError('Failed to prune memories', {\n cause: causeError,\n context: { olderThan: olderThan.toISOString() },\n })\n );\n }\n}\n","/**\n * Adaptive Memory Types\n *\n * Type definitions for adaptive memory with priority-based retrieval\n * combining recency decay, importance weighting, and context relevance.\n *\n * @module context/adaptive-memory-types\n * (Source: Issue #143, arXiv:2310.08560)\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../core/result.js';\nimport type { MemoryEntry, MemoryError, IMemoryBackend } from './memory-backend-types.js';\n\n// ============================================================================\n// Scoring Configuration\n// ============================================================================\n\n/**\n * Weights for combining priority score components.\n * All weights should sum to 1.0 for normalized scoring.\n */\nexport interface ScoringWeights {\n /** Weight for recency score (0-1) */\n readonly recency: number;\n /** Weight for importance score (0-1) */\n readonly importance: number;\n /** Weight for relevance score (0-1) */\n readonly relevance: number;\n}\n\n/** Base Zod schema for ScoringWeights (without sum validation). */\nconst ScoringWeightsBaseSchema = z.object({\n recency: z.number().min(0).max(1),\n importance: z.number().min(0).max(1),\n relevance: z.number().min(0).max(1),\n});\n\n/** Zod schema for ScoringWeights validation (with sum check). */\nexport const ScoringWeightsSchema = ScoringWeightsBaseSchema.refine(\n (w) => Math.abs(w.recency + w.importance + w.relevance - 1.0) < 0.001,\n { message: 'Weights must sum to 1.0' }\n);\n\n/** Partial ScoringWeights schema for overrides. */\nexport const PartialScoringWeightsSchema = ScoringWeightsBaseSchema.partial();\n\n/**\n * Configuration for importance level weights.\n */\nexport interface ImportanceWeights {\n /** Score for LOW importance (0-1) */\n readonly low: number;\n /** Score for MEDIUM importance (0-1) */\n readonly medium: number;\n /** Score for HIGH importance (0-1) */\n readonly high: number;\n}\n\n/** Zod schema for ImportanceWeights validation. */\nexport const ImportanceWeightsSchema = z.object({\n low: z.number().min(0).max(1),\n medium: z.number().min(0).max(1),\n high: z.number().min(0).max(1),\n});\n\n/**\n * Configuration for recency decay.\n */\nexport interface DecayConfig {\n /** Half-life in milliseconds (time for score to decay by 50%) */\n readonly halfLifeMs: number;\n /** Minimum recency score (floor, prevents zero scores) */\n readonly minScore: number;\n}\n\n/** Zod schema for DecayConfig validation. */\nexport const DecayConfigSchema = z.object({\n halfLifeMs: z.number().positive(),\n minScore: z.number().min(0).max(1),\n});\n\n// ============================================================================\n// Priority Score\n// ============================================================================\n\n/**\n * Components of a priority score.\n */\nexport interface PriorityScoreComponents {\n /** Recency score (0-1) based on time since last access */\n readonly recency: number;\n /** Importance score (0-1) based on importance level */\n readonly importance: number;\n /** Relevance score (0-1) based on query similarity */\n readonly relevance: number;\n}\n\n/**\n * Complete priority score with components.\n */\nexport interface PriorityScore {\n /** Final combined score */\n readonly score: number;\n /** Individual score components */\n readonly components: PriorityScoreComponents;\n}\n\n/** Zod schema for PriorityScore validation. */\nexport const PriorityScoreSchema = z.object({\n score: z.number().min(0),\n components: z.object({\n recency: z.number().min(0).max(1),\n importance: z.number().min(0).max(1),\n relevance: z.number().min(0).max(1),\n }),\n});\n\n// ============================================================================\n// Scored Memory Entry\n// ============================================================================\n\n/**\n * A memory entry with its priority score.\n */\nexport interface ScoredMemoryEntry {\n /** The memory entry */\n readonly entry: MemoryEntry;\n /** The priority score */\n readonly priority: PriorityScore;\n}\n\n/** Zod schema for ScoredMemoryEntry validation. */\nexport const ScoredMemoryEntrySchema = z.object({\n entry: z.object({\n key: z.string(),\n value: z.unknown(),\n metadata: z.object({\n importance: z.enum(['low', 'medium', 'high']),\n tags: z.array(z.string()).optional(),\n ttl: z.number().optional(),\n }),\n createdAt: z.date(),\n accessedAt: z.date(),\n }),\n priority: PriorityScoreSchema,\n});\n\n// ============================================================================\n// Retrieval Options\n// ============================================================================\n\n/**\n * Options for priority-based retrieval.\n */\nexport interface PriorityRetrievalOptions {\n /** Query string for relevance scoring (optional) */\n readonly query?: string;\n /** Maximum number of results */\n readonly limit?: number;\n /** Minimum priority score threshold */\n readonly minScore?: number;\n /** Override scoring weights for this query */\n readonly weights?: Partial<ScoringWeights>;\n /** Filter by importance levels */\n readonly importanceFilter?: readonly ('low' | 'medium' | 'high')[];\n /** Filter by tags (entries must have at least one matching tag) */\n readonly tagFilter?: readonly string[];\n}\n\n/** Zod schema for PriorityRetrievalOptions validation. */\nexport const PriorityRetrievalOptionsSchema = z.object({\n query: z.string().optional(),\n limit: z.number().int().positive().optional(),\n minScore: z.number().min(0).optional(),\n weights: PartialScoringWeightsSchema.optional(),\n importanceFilter: z.array(z.enum(['low', 'medium', 'high'])).optional(),\n tagFilter: z.array(z.string()).optional(),\n});\n\n// ============================================================================\n// Adaptive Memory Interface\n// ============================================================================\n\n/**\n * Extended memory backend with adaptive priority-based retrieval.\n */\nexport interface IAdaptiveMemory extends IMemoryBackend {\n /**\n * Retrieve memories sorted by priority score.\n * @param opts - Retrieval options\n */\n retrieveByPriority(\n opts?: PriorityRetrievalOptions\n ): Promise<Result<ScoredMemoryEntry[], MemoryError>>;\n\n /**\n * Get the priority score for a specific memory entry.\n * @param key - Memory key\n * @param query - Optional query for relevance scoring\n */\n getPriorityScore(key: string, query?: string): Promise<Result<PriorityScore, MemoryError>>;\n\n /**\n * Boost the priority of a memory entry by updating its access time.\n * @param key - Memory key\n */\n touch(key: string): Promise<Result<void, MemoryError>>;\n\n /**\n * Get the current scoring configuration.\n */\n getScoringConfig(): ScoringConfig;\n\n /**\n * Update the scoring configuration.\n * @param config - Partial configuration to update\n */\n updateScoringConfig(config: Partial<ScoringConfig>): void;\n}\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\n/**\n * Complete scoring configuration.\n */\nexport interface ScoringConfig {\n /** Weights for combining score components */\n readonly weights: ScoringWeights;\n /** Importance level score mappings */\n readonly importanceWeights: ImportanceWeights;\n /** Recency decay configuration */\n readonly decay: DecayConfig;\n}\n\n/** Zod schema for ScoringConfig validation. */\nexport const ScoringConfigSchema = z.object({\n weights: ScoringWeightsSchema,\n importanceWeights: ImportanceWeightsSchema,\n decay: DecayConfigSchema,\n});\n\n/**\n * Configuration for AdaptiveMemoryBackend.\n */\nexport interface AdaptiveMemoryConfig {\n /** Path to SQLite database file */\n readonly dbPath: string;\n /** Directory for Markdown exports */\n readonly markdownDir: string;\n /** Scoring configuration (optional, uses defaults if not provided) */\n readonly scoring?: Partial<ScoringConfig>;\n /** Whether to auto-expire TTL entries (default: true) */\n readonly autoExpire?: boolean;\n}\n\n/** Zod schema for AdaptiveMemoryConfig validation. */\nexport const AdaptiveMemoryConfigSchema = z.object({\n dbPath: z.string().min(1),\n markdownDir: z.string().min(1),\n scoring: ScoringConfigSchema.partial().optional(),\n autoExpire: z.boolean().optional(),\n});\n\n// ============================================================================\n// Default Configuration\n// ============================================================================\n\n/** Default scoring weights (balanced). */\nexport const DEFAULT_SCORING_WEIGHTS: ScoringWeights = {\n recency: 0.4,\n importance: 0.3,\n relevance: 0.3,\n};\n\n/** Default importance weights. */\nexport const DEFAULT_IMPORTANCE_WEIGHTS: ImportanceWeights = {\n low: 0.25,\n medium: 0.5,\n high: 1.0,\n};\n\n/** Default decay configuration (24-hour half-life). */\nexport const DEFAULT_DECAY_CONFIG: DecayConfig = {\n halfLifeMs: 24 * 60 * 60 * 1000, // 24 hours\n minScore: 0.1,\n};\n\n/** Default scoring configuration. */\nexport const DEFAULT_SCORING_CONFIG: ScoringConfig = {\n weights: DEFAULT_SCORING_WEIGHTS,\n importanceWeights: DEFAULT_IMPORTANCE_WEIGHTS,\n decay: DEFAULT_DECAY_CONFIG,\n};\n","/**\n * nexus-agents/utils - Similarity Utilities\n *\n * Shared utility functions for text similarity calculations.\n * Consolidates duplicate similarity code from multiple modules per ADR-0013.\n *\n * Used by:\n * - context/adaptive-memory-helpers.ts (relevance scoring)\n * - agents/orchestration/policy-feature-extraction.ts (stuck detection)\n *\n * @module utils/similarity-utils\n * @see docs/adr/0013-memory-helpers-consolidation.md\n */\n\n// ============================================================================\n// Token-Based Similarity\n// ============================================================================\n\n/**\n * Calculate token overlap score (query coverage).\n *\n * Measures what fraction of query tokens appear in the target.\n * Score = |query ∩ target| / |query|\n *\n * @param queryTokens - Tokens to find matches for\n * @param targetTokens - Tokens to search in\n * @returns Score between 0 (no overlap) and 1 (full coverage)\n *\n * @example\n * ```ts\n * calculateTokenOverlap(['foo', 'bar'], ['bar', 'baz'])\n * // Returns 0.5 (1 match / 2 query tokens)\n * ```\n */\nexport function calculateTokenOverlap(queryTokens: string[], targetTokens: string[]): number {\n if (queryTokens.length === 0) return 0;\n if (targetTokens.length === 0) return 0;\n\n const targetSet = new Set(targetTokens);\n let matches = 0;\n\n for (const token of queryTokens) {\n if (targetSet.has(token)) matches++;\n }\n\n return matches / queryTokens.length;\n}\n\n/**\n * Calculate set overlap count.\n *\n * Returns the number of elements that appear in both sets.\n * |A ∩ B|\n *\n * @param sourceSet - First set\n * @param targetSet - Second set\n * @returns Number of overlapping elements\n */\nexport function calculateSetOverlapCount<T>(sourceSet: Set<T>, targetSet: Set<T>): number {\n let count = 0;\n for (const item of sourceSet) {\n if (targetSet.has(item)) count++;\n }\n return count;\n}\n\n// ============================================================================\n// Jaccard Similarity\n// ============================================================================\n\n/**\n * Calculate Jaccard similarity between two sets.\n *\n * Jaccard = |A ∩ B| / |A ∪ B|\n *\n * @param set1 - First set\n * @param set2 - Second set\n * @returns Score between 0 (no overlap) and 1 (identical sets)\n *\n * @example\n * ```ts\n * calculateJaccardSimilarity(new Set(['a', 'b']), new Set(['b', 'c']))\n * // Returns 0.333 (1 intersection / 3 union)\n * ```\n */\nexport function calculateJaccardSimilarity<T>(set1: Set<T>, set2: Set<T>): number {\n if (set1.size === 0 && set2.size === 0) return 1;\n if (set1.size === 0 || set2.size === 0) return 0;\n\n const intersection = calculateSetOverlapCount(set1, set2);\n const union = set1.size + set2.size - intersection;\n\n return union > 0 ? intersection / union : 0;\n}\n\n/**\n * Calculate Jaccard similarity between two strings using word tokenization.\n *\n * @param text1 - First text\n * @param text2 - Second text\n * @returns Score between 0 (no overlap) and 1 (identical word sets)\n */\nexport function calculateTextJaccardSimilarity(text1: string, text2: string): number {\n const words1 = new Set(\n text1\n .toLowerCase()\n .split(/\\s+/)\n .filter((w) => w.length > 0)\n );\n const words2 = new Set(\n text2\n .toLowerCase()\n .split(/\\s+/)\n .filter((w) => w.length > 0)\n );\n\n return calculateJaccardSimilarity(words1, words2);\n}\n\n// ============================================================================\n// Similarity Comparison Helpers\n// ============================================================================\n\n/**\n * Check if two texts are highly similar (above threshold).\n *\n * Useful for stuck/loop detection in orchestration.\n *\n * @param text1 - First text\n * @param text2 - Second text\n * @param threshold - Similarity threshold (default: 0.8)\n * @returns True if Jaccard similarity >= threshold\n */\nexport function areTextsSimilar(text1: string, text2: string, threshold = 0.8): boolean {\n return calculateTextJaccardSimilarity(text1, text2) >= threshold;\n}\n\n/**\n * Find the maximum pairwise similarity among a list of texts.\n *\n * @param texts - List of texts to compare\n * @returns Maximum similarity score between any two adjacent texts\n */\nexport function calculateMaxPairwiseSimilarity(texts: string[]): number {\n if (texts.length < 2) return 0;\n\n let maxSimilarity = 0;\n\n for (let i = 1; i < texts.length; i++) {\n const prev = texts[i - 1];\n const curr = texts[i];\n if (prev !== undefined && curr !== undefined) {\n const similarity = calculateTextJaccardSimilarity(prev, curr);\n if (similarity > maxSimilarity) {\n maxSimilarity = similarity;\n }\n }\n }\n\n return maxSimilarity;\n}\n","/**\n * nexus-agents/utils - Memory Database Utilities\n *\n * Shared utility functions for memory database operations.\n * Consolidates duplicate code from multiple memory systems per ADR-0013.\n *\n * Used by:\n * - context/adaptive-memory-helpers.ts\n * - context/graph-memory-helpers.ts\n *\n * @module utils/memory-db-utils\n * @see docs/adr/0013-memory-helpers-consolidation.md\n */\n\nimport {\n type MemoryEntry,\n type MemoryRow,\n type ISQLiteDatabase,\n MemoryImportance,\n} from '../context/memory-backend-types.js';\nimport { createLogger } from '../core/index.js';\n\nconst logger = createLogger({ component: 'MemoryDbUtils' });\n\n// ============================================================================\n// Row Conversion\n// ============================================================================\n\n/**\n * Safely parse JSON, returning fallback on corrupt data instead of throwing.\n */\nfunction safeJsonParse<T>(json: string, fallback: T, context: string): T {\n try {\n return JSON.parse(json) as T;\n } catch {\n logger.warn('Corrupt JSON in memory database row', { context });\n return fallback;\n }\n}\n\n/**\n * Convert a database MemoryRow to a MemoryEntry.\n *\n * Parses JSON fields (value, metadata) and converts timestamps to Date objects.\n * Handles corrupt JSON gracefully by returning safe defaults.\n *\n * @param row - Database row from memories table\n * @returns Parsed MemoryEntry object\n */\nexport function memoryRowToEntry(row: MemoryRow): MemoryEntry {\n return {\n key: row.key,\n value: safeJsonParse<unknown>(row.value, row.value, `value for key=\"${row.key}\"`),\n metadata: safeJsonParse<MemoryEntry['metadata']>(\n row.metadata,\n { importance: MemoryImportance.MEDIUM },\n `metadata for key=\"${row.key}\"`\n ),\n createdAt: new Date(row.created_at),\n accessedAt: new Date(row.accessed_at),\n };\n}\n\n// ============================================================================\n// Existence Check\n// ============================================================================\n\n/**\n * Check if a memory key exists in the database.\n *\n * @param db - SQLite database instance\n * @param key - Memory key to check\n * @returns true if key exists, false otherwise\n */\nexport function memoryExists(db: ISQLiteDatabase, key: string): boolean {\n const stmt = db.prepare<{ count: number }>(\n 'SELECT COUNT(*) as count FROM memories WHERE key = ?'\n );\n const result = stmt.get(key);\n return result !== undefined && result.count > 0;\n}\n\n// ============================================================================\n// Memory Retrieval\n// ============================================================================\n\n/**\n * Get a memory entry by key.\n *\n * @param db - SQLite database instance\n * @param key - Memory key to retrieve\n * @returns MemoryEntry if found, undefined otherwise\n */\nexport function getMemoryEntry(db: ISQLiteDatabase, key: string): MemoryEntry | undefined {\n const stmt = db.prepare<MemoryRow>('SELECT * FROM memories WHERE key = ?');\n const row = stmt.get(key);\n return row !== undefined ? memoryRowToEntry(row) : undefined;\n}\n\n/**\n * Get a single memory row by key.\n *\n * @param db - SQLite database instance\n * @param key - Memory key to retrieve\n * @returns MemoryRow if found, undefined otherwise\n */\nexport function getMemoryRow(db: ISQLiteDatabase, key: string): MemoryRow | undefined {\n const stmt = db.prepare<MemoryRow>('SELECT * FROM memories WHERE key = ?');\n return stmt.get(key);\n}\n\n/**\n * Get all memory rows from the database with limit.\n *\n * @param db - SQLite database instance\n * @param limit - Maximum number of rows to return\n * @returns Array of MemoryRow objects\n */\nexport function getAllMemoryRows(db: ISQLiteDatabase, limit: number): MemoryRow[] {\n const stmt = db.prepare<MemoryRow>('SELECT * FROM memories ORDER BY accessed_at DESC LIMIT ?');\n return stmt.all(limit);\n}\n","/**\n * Adaptive Memory Helpers\n *\n * Helper functions for adaptive memory scoring including recency decay,\n * importance weighting, and relevance calculation.\n *\n * @module context/adaptive-memory-helpers\n * (Source: Issue #143, arXiv:2310.08560)\n */\n\nimport { getTimeProvider } from '../core/index.js';\nimport type { MemoryEntry, MemoryRow, ISQLiteDatabase } from './memory-backend-types.js';\nimport { MemoryImportance } from './memory-backend-types.js';\nimport type {\n ScoringConfig,\n PriorityScore,\n PriorityScoreComponents,\n ScoredMemoryEntry,\n PriorityRetrievalOptions,\n ScoringWeights,\n} from './adaptive-memory-types.js';\nimport { DEFAULT_SCORING_CONFIG } from './adaptive-memory-types.js';\n// Shared utilities per ADR-0013\nimport {\n tokenize as sharedTokenize,\n stringifyValue as sharedStringifyValue,\n} from '../utils/text-utils.js';\nimport { calculateTokenOverlap } from '../utils/similarity-utils.js';\nimport { memoryRowToEntry as sharedMemoryRowToEntry } from '../utils/memory-db-utils.js';\n\n// ============================================================================\n// Recency Scoring\n// ============================================================================\n\n/**\n * Calculate recency score using exponential decay.\n * Score = max(minScore, e^(-λt)) where λ = ln(2) / halfLife\n *\n * @param accessedAt - Last access time\n * @param now - Current time\n * @param halfLifeMs - Half-life in milliseconds\n * @param minScore - Minimum score floor\n */\nexport function calculateRecencyScore(\n accessedAt: Date,\n now: Date,\n halfLifeMs: number,\n minScore: number\n): number {\n const elapsedMs = now.getTime() - accessedAt.getTime();\n if (elapsedMs <= 0) return 1.0;\n\n // λ = ln(2) / halfLife\n const lambda = Math.LN2 / halfLifeMs;\n const decayedScore = Math.exp(-lambda * elapsedMs);\n\n return Math.max(minScore, decayedScore);\n}\n\n// ============================================================================\n// Importance Scoring\n// ============================================================================\n\n/**\n * Calculate importance score based on importance level.\n *\n * @param importance - Memory importance level\n * @param config - Scoring configuration\n */\nexport function calculateImportanceScore(importance: string, config: ScoringConfig): number {\n switch (importance) {\n case MemoryImportance.HIGH:\n return config.importanceWeights.high;\n case MemoryImportance.MEDIUM:\n return config.importanceWeights.medium;\n case MemoryImportance.LOW:\n return config.importanceWeights.low;\n default:\n return config.importanceWeights.medium;\n }\n}\n\n// ============================================================================\n// Relevance Scoring\n// ============================================================================\n\n/**\n * Calculate relevance score between query and memory value.\n * Uses token overlap scoring via shared similarity-utils (ADR-0013).\n *\n * @param query - Search query\n * @param value - Memory value (stringified)\n */\nexport function calculateRelevanceScore(query: string | undefined, value: string): number {\n if (query === undefined || query.trim() === '') return 1.0;\n\n const queryTokens = tokenize(query);\n const valueTokens = tokenize(value);\n\n if (queryTokens.length === 0 || valueTokens.length === 0) return 0.5;\n\n // Use shared utility for overlap calculation (ADR-0013)\n return calculateTokenOverlap(queryTokens, valueTokens);\n}\n\n/**\n * Tokenize a string into lowercase words.\n * Uses shared utility from utils/text-utils.ts per ADR-0013.\n */\nfunction tokenize(text: string): string[] {\n return sharedTokenize(text, 1); // Use minLength=1 to match original filter(t.length > 0)\n}\n\n// ============================================================================\n// Combined Priority Scoring\n// ============================================================================\n\n/**\n * Configuration for priority calculation.\n */\nexport interface PriorityCalculationConfig {\n readonly entry: MemoryEntry;\n readonly query?: string;\n readonly now: Date;\n readonly config: ScoringConfig;\n readonly weightOverrides?: Partial<ScoringWeights>;\n}\n\n/**\n * Calculate combined priority score for a memory entry.\n */\nexport function calculatePriorityScore(input: PriorityCalculationConfig): PriorityScore {\n const { entry, query, now, config, weightOverrides } = input;\n\n // Calculate individual components\n const recency = calculateRecencyScore(\n entry.accessedAt,\n now,\n config.decay.halfLifeMs,\n config.decay.minScore\n );\n const importance = calculateImportanceScore(entry.metadata.importance, config);\n const relevance = calculateRelevanceScore(query, stringifyValue(entry.value));\n\n const components: PriorityScoreComponents = { recency, importance, relevance };\n\n // Apply weights\n const weights = resolveWeights(config.weights, weightOverrides);\n const score =\n recency * weights.recency + importance * weights.importance + relevance * weights.relevance;\n\n return { score, components };\n}\n\n/**\n * Stringify a value for relevance scoring.\n * Uses shared utility from utils/text-utils.ts per ADR-0013.\n */\nfunction stringifyValue(value: unknown): string {\n return sharedStringifyValue(value);\n}\n\n/**\n * Resolve weights with optional overrides.\n */\nfunction resolveWeights(base: ScoringWeights, overrides?: Partial<ScoringWeights>): ScoringWeights {\n if (overrides === undefined) return base;\n\n const merged = {\n recency: overrides.recency ?? base.recency,\n importance: overrides.importance ?? base.importance,\n relevance: overrides.relevance ?? base.relevance,\n };\n\n // Normalize if overrides don't sum to 1\n const sum = merged.recency + merged.importance + merged.relevance;\n if (sum === 0) return base;\n if (Math.abs(sum - 1.0) > 0.001) {\n return {\n recency: merged.recency / sum,\n importance: merged.importance / sum,\n relevance: merged.relevance / sum,\n };\n }\n\n return merged;\n}\n\n// ============================================================================\n// Filtering\n// ============================================================================\n\n/**\n * Configuration for filtering scored entries.\n */\nexport interface FilterConfig {\n readonly minScore?: number;\n readonly importanceFilter?: readonly string[];\n readonly tagFilter?: readonly string[];\n}\n\n/**\n * Filter scored entries based on options.\n */\nexport function filterScoredEntries(\n entries: ScoredMemoryEntry[],\n config: FilterConfig\n): ScoredMemoryEntry[] {\n return entries.filter((e) => {\n // Score threshold\n if (config.minScore !== undefined && e.priority.score < config.minScore) {\n return false;\n }\n\n // Importance filter\n if (config.importanceFilter !== undefined && config.importanceFilter.length > 0) {\n if (!config.importanceFilter.includes(e.entry.metadata.importance)) {\n return false;\n }\n }\n\n // Tag filter (at least one matching tag)\n if (config.tagFilter !== undefined && config.tagFilter.length > 0) {\n const entryTags = e.entry.metadata.tags ?? [];\n const hasMatch = config.tagFilter.some((t) => entryTags.includes(t));\n if (!hasMatch) return false;\n }\n\n return true;\n });\n}\n\n// ============================================================================\n// Database Queries\n// ============================================================================\n\n/**\n * Update the accessed_at timestamp for a memory.\n */\nexport function touchMemory(db: ISQLiteDatabase, key: string): boolean {\n const stmt = db.prepare('UPDATE memories SET accessed_at = ? WHERE key = ?');\n const result = stmt.run(getTimeProvider().now(), key);\n return result.changes > 0;\n}\n\n// ============================================================================\n// Scoring Pipeline\n// ============================================================================\n\n/**\n * Score all entries and return sorted by priority.\n */\nexport function scoreAndSortEntries(\n rows: MemoryRow[],\n opts: PriorityRetrievalOptions | undefined,\n config: ScoringConfig\n): ScoredMemoryEntry[] {\n const now = new Date(getTimeProvider().now());\n\n // Convert and score\n const scored: ScoredMemoryEntry[] = rows.map((row) => {\n const entry = sharedMemoryRowToEntry(row);\n const priority = calculatePriorityScore({\n entry,\n now,\n config,\n ...(opts?.query !== undefined && { query: opts.query }),\n ...(opts?.weights !== undefined && { weightOverrides: opts.weights }),\n });\n return { entry, priority };\n });\n\n // Filter - build config with only defined properties\n const filterConfig: FilterConfig = {\n ...(opts?.minScore !== undefined && { minScore: opts.minScore }),\n ...(opts?.importanceFilter !== undefined && { importanceFilter: opts.importanceFilter }),\n ...(opts?.tagFilter !== undefined && { tagFilter: opts.tagFilter }),\n };\n const filtered = filterScoredEntries(scored, filterConfig);\n\n // Sort by score descending\n filtered.sort((a, b) => b.priority.score - a.priority.score);\n\n // Apply limit\n const limit = opts?.limit ?? 100;\n return filtered.slice(0, limit);\n}\n\n// ============================================================================\n// Configuration Merging\n// ============================================================================\n\n/**\n * Merge partial scoring config with defaults.\n */\nexport function mergeScoringConfig(partial?: Partial<ScoringConfig>): ScoringConfig {\n if (partial === undefined) return DEFAULT_SCORING_CONFIG;\n\n return {\n weights: partial.weights ?? DEFAULT_SCORING_CONFIG.weights,\n importanceWeights: partial.importanceWeights ?? DEFAULT_SCORING_CONFIG.importanceWeights,\n decay: partial.decay ?? DEFAULT_SCORING_CONFIG.decay,\n };\n}\n","/**\n * Adaptive Memory Backend\n *\n * Implements adaptive memory with priority-based retrieval combining\n * recency decay, importance weighting, and context relevance.\n *\n * @module context/adaptive-memory\n * (Source: Issue #143, arXiv:2310.08560)\n */\n\nimport type { Result } from '../core/result.js';\nimport { ok, err } from '../core/result.js';\nimport { getTimeProvider } from '../core/index.js';\nimport type { ILogger } from '../core/logger.js';\nimport { createLogger } from '../core/logger.js';\nimport type { MemoryEntry, MemoryMetadata, ISQLiteDatabase } from './memory-backend-types.js';\nimport { MemoryError } from './memory-backend-types.js';\nimport { HybridMemoryBackend } from './memory-backend.js';\nimport type {\n IAdaptiveMemory,\n AdaptiveMemoryConfig,\n ScoringConfig,\n PriorityScore,\n ScoredMemoryEntry,\n PriorityRetrievalOptions,\n} from './adaptive-memory-types.js';\nimport { AdaptiveMemoryConfigSchema } from './adaptive-memory-types.js';\nimport {\n mergeScoringConfig,\n scoreAndSortEntries,\n touchMemory,\n calculatePriorityScore,\n} from './adaptive-memory-helpers.js';\n// Shared utilities per ADR-0013\nimport {\n getAllMemoryRows,\n getMemoryRow,\n memoryExists,\n memoryRowToEntry,\n} from '../utils/memory-db-utils.js';\n\n// Re-export types\nexport type {\n IAdaptiveMemory,\n AdaptiveMemoryConfig,\n ScoringConfig,\n PriorityScore,\n ScoredMemoryEntry,\n PriorityRetrievalOptions,\n ScoringWeights,\n ImportanceWeights,\n DecayConfig,\n PriorityScoreComponents,\n} from './adaptive-memory-types.js';\nexport { DEFAULT_SCORING_CONFIG } from './adaptive-memory-types.js';\n\nconst logger = createLogger({ component: 'AdaptiveMemoryBackend' });\n\n/**\n * Adaptive memory backend with priority-based retrieval.\n */\nexport class AdaptiveMemoryBackend implements IAdaptiveMemory {\n private readonly config: AdaptiveMemoryConfig;\n private readonly log: ILogger;\n private readonly base: HybridMemoryBackend;\n private scoringConfig: ScoringConfig;\n private db: ISQLiteDatabase | null = null;\n private initialized = false;\n private initPromise: Promise<Result<void, MemoryError>> | undefined;\n\n constructor(config: AdaptiveMemoryConfig) {\n const validation = AdaptiveMemoryConfigSchema.safeParse(config);\n if (!validation.success) {\n const msg = validation.error.issues\n .map((i) => `${i.path.join('.')}: ${i.message}`)\n .join('; ');\n throw new MemoryError(`Invalid AdaptiveMemoryBackend config: ${msg}`);\n }\n this.config = config;\n this.log = logger;\n this.scoringConfig = mergeScoringConfig(config.scoring);\n this.base = new HybridMemoryBackend({ dbPath: config.dbPath, markdownDir: config.markdownDir });\n }\n\n async initialize(): Promise<Result<void, MemoryError>> {\n if (this.initialized) return ok(undefined);\n this.initPromise ??= this.doInitialize().finally(() => {\n this.initPromise = undefined;\n });\n return this.initPromise;\n }\n\n private async doInitialize(): Promise<Result<void, MemoryError>> {\n const baseInit = await this.base.initialize();\n if (!baseInit.ok) return baseInit;\n\n try {\n const mod = await import('better-sqlite3').catch((cause: unknown) => {\n this.log.debug('better-sqlite3 import failed', { error: String(cause) });\n return null;\n });\n if (mod === null)\n return err(\n new MemoryError('better-sqlite3 not installed. Install: npm install better-sqlite3')\n );\n const Database = mod.default;\n this.db = new Database(this.config.dbPath);\n this.initialized = true;\n this.log.info('AdaptiveMemoryBackend initialized');\n return ok(undefined);\n } catch (error) {\n const cause = error instanceof Error ? error : new Error(String(error));\n return err(new MemoryError('Failed to initialize adaptive backend', { cause }));\n }\n }\n\n initializeWithDatabase(database: ISQLiteDatabase): void {\n this.base.initializeWithDatabase(database);\n this.db = database;\n this.initialized = true;\n this.log.info('AdaptiveMemoryBackend initialized with database');\n }\n\n private getDb(): ISQLiteDatabase {\n if (this.db === null) throw new MemoryError('Database not initialized');\n return this.db;\n }\n\n private ensureInit(): void {\n if (!this.initialized) throw new MemoryError('AdaptiveMemoryBackend not initialized');\n }\n\n // =========================================================================\n // IMemoryBackend Methods (delegated to base)\n // =========================================================================\n\n store(key: string, value: unknown, metadata: MemoryMetadata): Promise<Result<void, MemoryError>> {\n return this.base.store(key, value, metadata);\n }\n\n retrieve(key: string): Promise<Result<unknown, MemoryError>> {\n return this.base.retrieve(key);\n }\n\n search(query: string, limit: number): Promise<Result<MemoryEntry[], MemoryError>> {\n return this.base.search(query, limit);\n }\n\n prune(olderThan: Date): Promise<Result<number, MemoryError>> {\n return this.base.prune(olderThan);\n }\n\n // =========================================================================\n // IAdaptiveMemory Methods\n // =========================================================================\n\n retrieveByPriority(\n opts?: PriorityRetrievalOptions\n ): Promise<Result<ScoredMemoryEntry[], MemoryError>> {\n try {\n this.ensureInit();\n const db = this.getDb();\n\n // Get all rows (with a reasonable limit for initial fetch)\n const maxFetch = (opts?.limit ?? 100) * 2;\n const rows = getAllMemoryRows(db, maxFetch);\n\n // Score, filter, and sort\n const scored = scoreAndSortEntries(rows, opts, this.scoringConfig);\n\n this.log.debug('Retrieved by priority', { count: scored.length, query: opts?.query });\n return Promise.resolve(ok(scored));\n } catch (error) {\n const cause = error instanceof Error ? error : new Error(String(error));\n return Promise.resolve(err(new MemoryError('Failed to retrieve by priority', { cause })));\n }\n }\n\n getPriorityScore(key: string, query?: string): Promise<Result<PriorityScore, MemoryError>> {\n try {\n this.ensureInit();\n const db = this.getDb();\n\n if (!memoryExists(db, key)) {\n return Promise.resolve(err(new MemoryError(`Key not found: ${key}`)));\n }\n\n const row = getMemoryRow(db, key);\n if (row === undefined) {\n return Promise.resolve(err(new MemoryError(`Key not found: ${key}`)));\n }\n\n const entry = memoryRowToEntry(row);\n const priority = calculatePriorityScore({\n entry,\n now: new Date(getTimeProvider().now()),\n config: this.scoringConfig,\n ...(query !== undefined && { query }),\n });\n\n return Promise.resolve(ok(priority));\n } catch (error) {\n const cause = error instanceof Error ? error : new Error(String(error));\n return Promise.resolve(err(new MemoryError('Failed to get priority score', { cause })));\n }\n }\n\n touch(key: string): Promise<Result<void, MemoryError>> {\n try {\n this.ensureInit();\n const db = this.getDb();\n\n if (!memoryExists(db, key)) {\n return Promise.resolve(err(new MemoryError(`Key not found: ${key}`)));\n }\n\n const updated = touchMemory(db, key);\n if (!updated) {\n return Promise.resolve(err(new MemoryError(`Failed to touch: ${key}`)));\n }\n\n this.log.debug('Touched memory', { key });\n return Promise.resolve(ok(undefined));\n } catch (error) {\n const cause = error instanceof Error ? error : new Error(String(error));\n return Promise.resolve(err(new MemoryError('Failed to touch memory', { cause })));\n }\n }\n\n getScoringConfig(): ScoringConfig {\n return this.scoringConfig;\n }\n\n updateScoringConfig(config: Partial<ScoringConfig>): void {\n this.scoringConfig = mergeScoringConfig({ ...this.scoringConfig, ...config });\n this.log.info('Updated scoring config', { config: this.scoringConfig });\n }\n\n // =========================================================================\n // Lifecycle\n // =========================================================================\n\n close(): void {\n this.base.close();\n if (this.db !== null) {\n this.db.close();\n this.db = null;\n }\n this.initialized = false;\n this.log.info('AdaptiveMemoryBackend closed');\n }\n}\n\n/** Create an AdaptiveMemoryBackend instance. */\nexport function createAdaptiveMemory(config: AdaptiveMemoryConfig): AdaptiveMemoryBackend {\n return new AdaptiveMemoryBackend(config);\n}\n"],"mappings":"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","names":["z","logger","logger","logger","z","z","tokenize","stringifyValue","logger"]}
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
TASK_CATEGORIES,
|
|
3
3
|
getAdaptiveBonus,
|
|
4
4
|
getOutcomeStore
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-UOUJZIKH.js";
|
|
6
6
|
|
|
7
7
|
// src/cli/doctor-deep.ts
|
|
8
8
|
var CLI_NAMES = ["claude", "gemini", "codex", "opencode"];
|
|
@@ -106,4 +106,4 @@ export {
|
|
|
106
106
|
runDeepDiagnostics,
|
|
107
107
|
formatDeepDiagnostics
|
|
108
108
|
};
|
|
109
|
-
//# sourceMappingURL=chunk-
|
|
109
|
+
//# sourceMappingURL=chunk-4FVISCDB.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-633WH2ML.js";
|
|
4
4
|
import {
|
|
5
5
|
createAllAdapters
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-RSUCXOQM.js";
|
|
7
7
|
import {
|
|
8
8
|
DEFAULT_CAPABILITIES,
|
|
9
9
|
DEFAULT_MODEL_CAPABILITIES,
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
ok,
|
|
16
16
|
symbols,
|
|
17
17
|
writeLine
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-UOUJZIKH.js";
|
|
19
19
|
import {
|
|
20
20
|
LEARNING_DIR,
|
|
21
21
|
OUTCOMES_FILE,
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
} from "./chunk-CLYZ7FWP.js";
|
|
25
25
|
|
|
26
26
|
// src/version.ts
|
|
27
|
-
var VERSION = true ? "2.
|
|
27
|
+
var VERSION = true ? "2.54.1" : "dev";
|
|
28
28
|
|
|
29
29
|
// src/cli/setup-data-dir.ts
|
|
30
30
|
import { mkdirSync, existsSync as existsSync2 } from "fs";
|
|
@@ -758,7 +758,7 @@ async function runDoctorFix(result) {
|
|
|
758
758
|
writeLine2("\u2500".repeat(40));
|
|
759
759
|
let fixCount = 0;
|
|
760
760
|
if (!result.dataDirectory.rootExists || result.dataDirectory.subdirectories.some((d) => !d.exists || !d.writable)) {
|
|
761
|
-
const { runSetup } = await import("./setup-command-
|
|
761
|
+
const { runSetup } = await import("./setup-command-T2EABH66.js");
|
|
762
762
|
const setupResult = runSetup({
|
|
763
763
|
skipMcp: true,
|
|
764
764
|
skipRules: true,
|
|
@@ -772,7 +772,7 @@ async function runDoctorFix(result) {
|
|
|
772
772
|
}
|
|
773
773
|
}
|
|
774
774
|
if (!result.configFile.found) {
|
|
775
|
-
const { runConfigInitSync } = await import("./setup-config-
|
|
775
|
+
const { runConfigInitSync } = await import("./setup-config-PWK6WHMG.js");
|
|
776
776
|
const configResult = runConfigInitSync(process.cwd(), false, false);
|
|
777
777
|
if (configResult.success && configResult.created) {
|
|
778
778
|
writeLine2(`\u2713 Generated config: ${configResult.path}`);
|
|
@@ -836,4 +836,4 @@ export {
|
|
|
836
836
|
startStdioServer,
|
|
837
837
|
closeServer
|
|
838
838
|
};
|
|
839
|
-
//# sourceMappingURL=chunk-
|
|
839
|
+
//# sourceMappingURL=chunk-CTQ4F636.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getErrorMessage
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-UOUJZIKH.js";
|
|
4
4
|
|
|
5
5
|
// src/cli/setup-config.ts
|
|
6
6
|
import { existsSync, writeFileSync } from "fs";
|
|
@@ -59,4 +59,4 @@ function runConfigInitSync(projectRoot, force, dryRun) {
|
|
|
59
59
|
export {
|
|
60
60
|
runConfigInitSync
|
|
61
61
|
};
|
|
62
|
-
//# sourceMappingURL=chunk-
|
|
62
|
+
//# sourceMappingURL=chunk-EKYT4NMD.js.map
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
GitHubProvider,
|
|
3
3
|
ScmError
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-IOU7F5PH.js";
|
|
5
5
|
import {
|
|
6
6
|
CACHE_TIMEOUTS,
|
|
7
7
|
createLogger,
|
|
8
8
|
err,
|
|
9
9
|
getTimeProvider,
|
|
10
10
|
ok
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-UOUJZIKH.js";
|
|
12
12
|
|
|
13
13
|
// src/security/trust-types.ts
|
|
14
14
|
import { z } from "zod";
|
|
@@ -1582,4 +1582,4 @@ export {
|
|
|
1582
1582
|
IssueTriage,
|
|
1583
1583
|
createIssueTriage
|
|
1584
1584
|
};
|
|
1585
|
-
//# sourceMappingURL=chunk-
|
|
1585
|
+
//# sourceMappingURL=chunk-FWSTXEG2.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
err,
|
|
4
4
|
getErrorMessage,
|
|
5
5
|
ok
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-UOUJZIKH.js";
|
|
7
7
|
|
|
8
8
|
// src/scm/types.ts
|
|
9
9
|
var ScmError = class extends Error {
|
|
@@ -243,4 +243,4 @@ export {
|
|
|
243
243
|
ScmError,
|
|
244
244
|
GitHubProvider
|
|
245
245
|
};
|
|
246
|
-
//# sourceMappingURL=chunk-
|
|
246
|
+
//# sourceMappingURL=chunk-IOU7F5PH.js.map
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
ParseError,
|
|
3
3
|
SecurityError,
|
|
4
4
|
getErrorMessage
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-UOUJZIKH.js";
|
|
6
6
|
|
|
7
7
|
// src/cli/research-helpers-io.ts
|
|
8
8
|
import * as fs from "fs/promises";
|
|
@@ -928,4 +928,4 @@ export {
|
|
|
928
928
|
normalizeTopicToCanonical,
|
|
929
929
|
synthesizeResearch
|
|
930
930
|
};
|
|
931
|
-
//# sourceMappingURL=chunk-
|
|
931
|
+
//# sourceMappingURL=chunk-JERFBN73.js.map
|
|
@@ -2,13 +2,13 @@ import {
|
|
|
2
2
|
CircuitBreakerRegistry,
|
|
3
3
|
CircuitError,
|
|
4
4
|
mapCliErrorToCategory
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-W5AJRK4U.js";
|
|
6
6
|
import {
|
|
7
7
|
createLogger,
|
|
8
8
|
err,
|
|
9
9
|
getTimeProvider,
|
|
10
10
|
ok
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-UOUJZIKH.js";
|
|
12
12
|
|
|
13
13
|
// src/cli-adapters/fallback-chains.ts
|
|
14
14
|
import { z } from "zod";
|
|
@@ -192,4 +192,4 @@ export {
|
|
|
192
192
|
CliCircuitBreakerIntegration,
|
|
193
193
|
createCliCircuitBreakerIntegration
|
|
194
194
|
};
|
|
195
|
-
//# sourceMappingURL=chunk-
|
|
195
|
+
//# sourceMappingURL=chunk-KRIFBGWZ.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
SessionMemory
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-NYNBDP7M.js";
|
|
4
4
|
import {
|
|
5
5
|
AdaptiveMemoryBackend,
|
|
6
6
|
HybridMemoryBackend,
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
getMemoryEntry,
|
|
10
10
|
memoryExists,
|
|
11
11
|
memoryRowToEntry
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-3IDJSFWT.js";
|
|
13
13
|
import {
|
|
14
14
|
stringifyValue,
|
|
15
15
|
tokenizeFiltered
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
getAvailableClis,
|
|
22
22
|
isCliAvailable,
|
|
23
23
|
withTimeout
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-RSUCXOQM.js";
|
|
25
25
|
import {
|
|
26
26
|
AgentError,
|
|
27
27
|
CACHE_TIMEOUTS,
|
|
@@ -55,6 +55,7 @@ import {
|
|
|
55
55
|
formatZodError,
|
|
56
56
|
getCliModelName,
|
|
57
57
|
getErrorMessage,
|
|
58
|
+
getMcpSafeDeadlineMs,
|
|
58
59
|
getOutcomeStore,
|
|
59
60
|
getRandomProvider,
|
|
60
61
|
getTimeProvider,
|
|
@@ -66,7 +67,7 @@ import {
|
|
|
66
67
|
resolveVoteTimeout,
|
|
67
68
|
toRateLimitError,
|
|
68
69
|
validateTimeout
|
|
69
|
-
} from "./chunk-
|
|
70
|
+
} from "./chunk-UOUJZIKH.js";
|
|
70
71
|
import {
|
|
71
72
|
OUTCOMES_FILE,
|
|
72
73
|
ensureLearningDir
|
|
@@ -2921,10 +2922,7 @@ var SdkAdapter = class extends BaseAdapter {
|
|
|
2921
2922
|
}
|
|
2922
2923
|
case "google": {
|
|
2923
2924
|
const mod = await import("@ai-sdk/google");
|
|
2924
|
-
const factory = extractProviderFactory(
|
|
2925
|
-
mod,
|
|
2926
|
-
"createGoogleGenerativeAI"
|
|
2927
|
-
);
|
|
2925
|
+
const factory = extractProviderFactory(mod, "createGoogleGenerativeAI");
|
|
2928
2926
|
const provider = factory({ apiKey });
|
|
2929
2927
|
return { model: provider(this.modelId) };
|
|
2930
2928
|
}
|
|
@@ -3658,7 +3656,7 @@ var ResilientAdapter = class {
|
|
|
3658
3656
|
const rlError = toRateLimitError(result.error, adapter.providerId);
|
|
3659
3657
|
recordRateLimitEvent({
|
|
3660
3658
|
provider: adapter.providerId,
|
|
3661
|
-
timestamp:
|
|
3659
|
+
timestamp: getTimeProvider().now(),
|
|
3662
3660
|
retryAfterMs: rlError.retryAfterMs
|
|
3663
3661
|
});
|
|
3664
3662
|
this.logger.warn("Rate limit detected", {
|
|
@@ -3821,7 +3819,7 @@ var ResilientAdapter = class {
|
|
|
3821
3819
|
try {
|
|
3822
3820
|
const eventBus = getGlobalEventBus();
|
|
3823
3821
|
eventBus.emit({
|
|
3824
|
-
eventId: `failover-${
|
|
3822
|
+
eventId: `failover-${getTimeProvider().now().toString(36)}-${getRandomProvider().random().toString(36).slice(2, 8)}`,
|
|
3825
3823
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
3826
3824
|
topic: "adapter.failover",
|
|
3827
3825
|
payload: info
|
|
@@ -4584,12 +4582,19 @@ async function resolveDiverseAdapters(roles, logger11, fallbackAdapter) {
|
|
|
4584
4582
|
}
|
|
4585
4583
|
async function launchStaggeredVotes(input) {
|
|
4586
4584
|
const { roles, proposal, roleAdapters, fallbackAdapter, logger: logger11, voteOptions, interDelay } = input;
|
|
4587
|
-
const
|
|
4585
|
+
const computedDeadlineMs = computeOverallConsensusDeadlineMs(
|
|
4588
4586
|
voteOptions.timeoutMs,
|
|
4589
4587
|
voteOptions.maxRetries,
|
|
4590
4588
|
roles.length,
|
|
4591
4589
|
interDelay
|
|
4592
4590
|
);
|
|
4591
|
+
const overallDeadlineMs = getMcpSafeDeadlineMs(computedDeadlineMs, "consensus_vote");
|
|
4592
|
+
if (overallDeadlineMs < computedDeadlineMs) {
|
|
4593
|
+
logger11.debug("Consensus deadline clamped to MCP wrapper timeout", {
|
|
4594
|
+
computedDeadlineMs,
|
|
4595
|
+
overallDeadlineMs
|
|
4596
|
+
});
|
|
4597
|
+
}
|
|
4593
4598
|
return launchVotesWithOverallDeadline({
|
|
4594
4599
|
roles,
|
|
4595
4600
|
proposal,
|
|
@@ -12558,7 +12563,7 @@ async function processVotesWithCascade(votes, opts) {
|
|
|
12558
12563
|
var CONTRARIAN_ESCALATION_THRESHOLD = 0.8;
|
|
12559
12564
|
async function runContrarianCheck(proposal, log) {
|
|
12560
12565
|
try {
|
|
12561
|
-
const { executeExpert } = await import("./expert-bridge-
|
|
12566
|
+
const { executeExpert } = await import("./expert-bridge-KHHE42JP.js");
|
|
12562
12567
|
const prompt = [
|
|
12563
12568
|
"You are a contrarian analyst. Your job is to find reasons this proposal should be REJECTED.",
|
|
12564
12569
|
"Look for: YAGNI (not needed), MISALIGNED (wrong tech/architecture), SECURITY_RISK, SCOPE_CREEP.",
|
|
@@ -12931,4 +12936,4 @@ export {
|
|
|
12931
12936
|
CONSENSUS_VOTE_OUTPUT_SCHEMA,
|
|
12932
12937
|
registerConsensusVoteTool
|
|
12933
12938
|
};
|
|
12934
|
-
//# sourceMappingURL=chunk-
|
|
12939
|
+
//# sourceMappingURL=chunk-LSHIG4SR.js.map
|