nexus-agents 2.29.0 → 2.29.2

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.
Files changed (112) hide show
  1. package/dist/adaptive-memory-5VP5WWTE.js +15 -0
  2. package/dist/chunk-5COIDGQJ.js +1585 -0
  3. package/dist/chunk-5COIDGQJ.js.map +1 -0
  4. package/dist/{chunk-HWDBNDUX.js → chunk-63AJLNKU.js} +2 -2
  5. package/dist/chunk-66NNHMVB.js +195 -0
  6. package/dist/chunk-66NNHMVB.js.map +1 -0
  7. package/dist/chunk-AP2FD37C.js +127 -0
  8. package/dist/chunk-AP2FD37C.js.map +1 -0
  9. package/dist/chunk-BC3M4VLP.js +359 -0
  10. package/dist/chunk-BC3M4VLP.js.map +1 -0
  11. package/dist/chunk-BQ4YXGGQ.js +127 -0
  12. package/dist/chunk-BQ4YXGGQ.js.map +1 -0
  13. package/dist/{chunk-ZBZJHXRT.js → chunk-CW2Z773T.js} +19 -347
  14. package/dist/chunk-CW2Z773T.js.map +1 -0
  15. package/dist/chunk-DDQGAVQA.js +944 -0
  16. package/dist/chunk-DDQGAVQA.js.map +1 -0
  17. package/dist/chunk-ED6VQWNG.js +63 -0
  18. package/dist/chunk-ED6VQWNG.js.map +1 -0
  19. package/dist/{chunk-7F6HYUIY.js → chunk-EPMBGZQX.js} +16 -97
  20. package/dist/chunk-EPMBGZQX.js.map +1 -0
  21. package/dist/chunk-GX436VRU.js +931 -0
  22. package/dist/chunk-GX436VRU.js.map +1 -0
  23. package/dist/{chunk-IMWYKX4H.js → chunk-HSOPD265.js} +444 -399
  24. package/dist/chunk-HSOPD265.js.map +1 -0
  25. package/dist/{chunk-S3BKWNST.js → chunk-J245RJGW.js} +680 -1436
  26. package/dist/chunk-J245RJGW.js.map +1 -0
  27. package/dist/{chunk-I6YDS23R.js → chunk-KQIDTE52.js} +2 -2
  28. package/dist/{chunk-POBO4G2P.js → chunk-LDIN2PLV.js} +250 -110
  29. package/dist/chunk-LDIN2PLV.js.map +1 -0
  30. package/dist/{chunk-KGDG6PWZ.js → chunk-LKDHAJJB.js} +2 -2
  31. package/dist/{chunk-T7PU3NPQ.js → chunk-NKGTEJYU.js} +7 -5
  32. package/dist/{chunk-T7PU3NPQ.js.map → chunk-NKGTEJYU.js.map} +1 -1
  33. package/dist/chunk-QGODFK36.js +122 -0
  34. package/dist/chunk-QGODFK36.js.map +1 -0
  35. package/dist/{chunk-DAMRMAM2.js → chunk-QSNAFOE6.js} +12369 -14499
  36. package/dist/chunk-QSNAFOE6.js.map +1 -0
  37. package/dist/chunk-TL2GJMJ5.js +700 -0
  38. package/dist/chunk-TL2GJMJ5.js.map +1 -0
  39. package/dist/{chunk-WSK4VSXP.js → chunk-V6MSPUQF.js} +2 -2
  40. package/dist/chunk-VZ2YOQWU.js +90 -0
  41. package/dist/chunk-VZ2YOQWU.js.map +1 -0
  42. package/dist/{chunk-5VZLXMO7.js → chunk-WSYJN7BI.js} +7 -6
  43. package/dist/chunk-WSYJN7BI.js.map +1 -0
  44. package/dist/chunk-Y477EGI4.js +356 -0
  45. package/dist/chunk-Y477EGI4.js.map +1 -0
  46. package/dist/{chunk-HH5LVGEE.js → chunk-Z4OZ25VS.js} +4 -4
  47. package/dist/cli-circuit-breaker-6EJO3PPU.js +13 -0
  48. package/dist/cli.js +123 -68
  49. package/dist/cli.js.map +1 -1
  50. package/dist/codebase-search-CZUA37RU.js +9 -0
  51. package/dist/{composite-router-YPRWVTRB.js → composite-router-JD7URTC2.js} +2 -2
  52. package/dist/{consensus-vote-DBE6RNZG.js → consensus-vote-COW34Q2Y.js} +7 -5
  53. package/dist/{dist-7PQR2BQB.js → dist-CV74KUT7.js} +1302 -805
  54. package/dist/dist-CV74KUT7.js.map +1 -0
  55. package/dist/{doctor-deep-AWE7SRU6.js → doctor-deep-4A4X5X6U.js} +3 -3
  56. package/dist/expert-bridge-J36C7VES.js +10 -0
  57. package/dist/{expert-config-FHNBQRX2.js → expert-config-MQ5OJE3U.js} +2 -2
  58. package/dist/{factory-O5C7ZBZO.js → factory-4Z4RSUYE.js} +5 -4
  59. package/dist/{factory-PCHGQ3ZG.js → factory-NHORX63J.js} +4 -3
  60. package/dist/index.d.ts +507 -42
  61. package/dist/index.js +331 -78
  62. package/dist/index.js.map +1 -1
  63. package/dist/issue-triage-TIG3RKXF.js +15 -0
  64. package/dist/{mcp-config-AUZQPUBY.js → mcp-config-ETY7GFGW.js} +3 -3
  65. package/dist/mobimem-5PAAMVFR.js +13 -0
  66. package/dist/mobimem-5PAAMVFR.js.map +1 -0
  67. package/dist/repo-analyze-HWMXSK5C.js +24 -0
  68. package/dist/repo-analyze-HWMXSK5C.js.map +1 -0
  69. package/dist/repo-security-plan-KQB3ZJTE.js +17 -0
  70. package/dist/repo-security-plan-KQB3ZJTE.js.map +1 -0
  71. package/dist/research-helpers-synthesize-ZMERZZ5B.js +10 -0
  72. package/dist/research-helpers-synthesize-ZMERZZ5B.js.map +1 -0
  73. package/dist/{routing-memory-QY3XMU2R.js → routing-memory-3ES3OHLM.js} +2 -2
  74. package/dist/routing-memory-3ES3OHLM.js.map +1 -0
  75. package/dist/{session-memory-3MBCE5KS.js → session-memory-E2OE2CYR.js} +3 -3
  76. package/dist/session-memory-E2OE2CYR.js.map +1 -0
  77. package/dist/{setup-command-IQ4MD3FT.js → setup-command-CMCQRBJF.js} +7 -6
  78. package/dist/setup-command-CMCQRBJF.js.map +1 -0
  79. package/dist/{setup-config-5YUPLDXF.js → setup-config-KITOPV7V.js} +3 -3
  80. package/dist/setup-config-KITOPV7V.js.map +1 -0
  81. package/dist/shared-memory-AEO2HJLC.js +8 -0
  82. package/dist/shared-memory-AEO2HJLC.js.map +1 -0
  83. package/dist/symbol-extractor-UEBANFSN.js +10 -0
  84. package/dist/symbol-extractor-UEBANFSN.js.map +1 -0
  85. package/dist/{weather-report-CC2C4KAX.js → weather-report-KUSVNXDZ.js} +2 -2
  86. package/dist/weather-report-KUSVNXDZ.js.map +1 -0
  87. package/package.json +14 -13
  88. package/dist/chunk-5VZLXMO7.js.map +0 -1
  89. package/dist/chunk-7F6HYUIY.js.map +0 -1
  90. package/dist/chunk-DAMRMAM2.js.map +0 -1
  91. package/dist/chunk-IMWYKX4H.js.map +0 -1
  92. package/dist/chunk-POBO4G2P.js.map +0 -1
  93. package/dist/chunk-S3BKWNST.js.map +0 -1
  94. package/dist/chunk-ZBZJHXRT.js.map +0 -1
  95. package/dist/dist-7PQR2BQB.js.map +0 -1
  96. /package/dist/{composite-router-YPRWVTRB.js.map → adaptive-memory-5VP5WWTE.js.map} +0 -0
  97. /package/dist/{chunk-HWDBNDUX.js.map → chunk-63AJLNKU.js.map} +0 -0
  98. /package/dist/{chunk-I6YDS23R.js.map → chunk-KQIDTE52.js.map} +0 -0
  99. /package/dist/{chunk-KGDG6PWZ.js.map → chunk-LKDHAJJB.js.map} +0 -0
  100. /package/dist/{chunk-WSK4VSXP.js.map → chunk-V6MSPUQF.js.map} +0 -0
  101. /package/dist/{chunk-HH5LVGEE.js.map → chunk-Z4OZ25VS.js.map} +0 -0
  102. /package/dist/{consensus-vote-DBE6RNZG.js.map → cli-circuit-breaker-6EJO3PPU.js.map} +0 -0
  103. /package/dist/{doctor-deep-AWE7SRU6.js.map → codebase-search-CZUA37RU.js.map} +0 -0
  104. /package/dist/{expert-config-FHNBQRX2.js.map → composite-router-JD7URTC2.js.map} +0 -0
  105. /package/dist/{factory-O5C7ZBZO.js.map → consensus-vote-COW34Q2Y.js.map} +0 -0
  106. /package/dist/{factory-PCHGQ3ZG.js.map → doctor-deep-4A4X5X6U.js.map} +0 -0
  107. /package/dist/{mcp-config-AUZQPUBY.js.map → expert-bridge-J36C7VES.js.map} +0 -0
  108. /package/dist/{routing-memory-QY3XMU2R.js.map → expert-config-MQ5OJE3U.js.map} +0 -0
  109. /package/dist/{session-memory-3MBCE5KS.js.map → factory-4Z4RSUYE.js.map} +0 -0
  110. /package/dist/{setup-command-IQ4MD3FT.js.map → factory-NHORX63J.js.map} +0 -0
  111. /package/dist/{setup-config-5YUPLDXF.js.map → issue-triage-TIG3RKXF.js.map} +0 -0
  112. /package/dist/{weather-report-CC2C4KAX.js.map → mcp-config-ETY7GFGW.js.map} +0 -0
@@ -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 as new (path: string) => ISQLiteDatabase)(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 as new (p: string) => ISQLiteDatabase)(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":";;;;;;;;;;;;;;;;AAQA,SAAS,SAAS;AAgBX,IAAM,mBAAmB;AAAA,EAC9B,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AACR;AAOO,IAAM,yBAAyB,EAAE,KAAK,CAAC,OAAO,UAAU,MAAM,CAAC;AAiB/D,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,YAAY;AAAA,EACZ,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AACtC,CAAC;AAqBM,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACrB,OAAO,EAAE,QAAQ;AAAA,EACjB,UAAU;AAAA,EACV,WAAW,EAAE,KAAK;AAAA,EAClB,YAAY,EAAE,KAAK;AACrB,CAAC;AAKM,IAAM,cAAN,cAA0B,WAAW;AAAA,EAC1C,YACE,SACA,SAGA;AACA,UAAM,SAAS,EAAE,MAAM,UAAU,gBAAgB,GAAG,QAAQ,CAAC;AAC7D,SAAK,OAAO;AAAA,EACd;AACF;AAyDO,IAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACxB,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7B,YAAY,EAAE,QAAQ,EAAE,SAAS;AACnC,CAAC;;;ACrJD,SAAS,KAAAA,UAAS;;;ACFlB,YAAY,QAAQ;AACpB,YAAY,UAAU;AAOf,IAAM,uBAAN,MAA2B;AAAA,EAChC,YACmB,aACAC,SACjB;AAFiB;AACA,kBAAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKH,YAAkB;AAChB,QAAI,CAAI,cAAW,KAAK,WAAW,GAAG;AACpC,MAAG,aAAU,KAAK,aAAa,EAAE,WAAW,KAAK,CAAC;AAClD,WAAK,OAAO,MAAM,8BAA8B,EAAE,MAAM,KAAK,YAAY,CAAC;AAAA,IAC5E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MACJ,KACA,OACA,UACA,WACe;AACf,UAAM,WAAW,KAAK,cAAc,GAAG;AACvC,UAAM,WAAgB,UAAK,KAAK,aAAa,QAAQ;AAErD,UAAM,UAAU,KAAK,OAAO,KAAK,OAAO,UAAU,SAAS;AAE3D,QAAI;AACF,YAAS,YAAS,UAAU,UAAU,SAAS,OAAO;AACtD,WAAK,OAAO,MAAM,uBAAuB,EAAE,KAAK,SAAS,CAAC;AAAA,IAC5D,SAAS,OAAO;AACd,WAAK,OAAO,KAAK,iCAAiC,EAAE,KAAK,UAAU,MAAM,CAAC;AAAA,IAE5E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,KAAmB;AACxB,UAAM,WAAW,KAAK,cAAc,GAAG;AACvC,UAAM,WAAgB,UAAK,KAAK,aAAa,QAAQ;AAErD,QAAI;AACF,UAAO,cAAW,QAAQ,GAAG;AAC3B,QAAG,cAAW,QAAQ;AACtB,aAAK,OAAO,MAAM,yBAAyB,EAAE,KAAK,SAAS,CAAC;AAAA,MAC9D;AAAA,IACF,SAAS,OAAO;AACd,WAAK,OAAO,KAAK,kCAAkC,EAAE,KAAK,UAAU,MAAM,CAAC;AAAA,IAC7E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,KAAqB;AAEzC,UAAM,UAAU,IACb,QAAQ,mBAAmB,GAAG,EAC9B,QAAQ,OAAO,GAAG,EAClB,UAAU,GAAG,GAAG;AAEnB,WAAO,GAAG,OAAO;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKQ,OAAO,KAAa,OAAgB,UAA0B,WAAyB;AAC7F,UAAM,QAAkB;AAAA,MACtB,aAAa,GAAG;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA,qBAAqB,SAAS,UAAU;AAAA,MACxC,kBAAkB,UAAU,YAAY,CAAC;AAAA,IAC3C;AAEA,QAAI,SAAS,SAAS,UAAa,SAAS,KAAK,SAAS,GAAG;AAC3D,YAAM,KAAK,eAAe,SAAS,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,IACtD;AAEA,QAAI,SAAS,QAAQ,QAAW;AAC9B,YAAM,YAAY,IAAI,KAAK,UAAU,QAAQ,IAAI,SAAS,GAAG;AAC7D,YAAM,KAAK,kBAAkB,UAAU,YAAY,CAAC,EAAE;AAAA,IACxD;AAEA,UAAM,KAAK,IAAI,YAAY,EAAE;AAG7B,QAAI,OAAO,UAAU,UAAU;AAC7B,YAAM,KAAK,KAAK;AAAA,IAClB,WAAW,UAAU,MAAM;AACzB,YAAM,KAAK,QAAQ;AAAA,IACrB,WAAW,OAAO,UAAU,UAAU;AACpC,YAAM,KAAK,WAAW,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG,KAAK;AAAA,IAC7D,OAAO;AAEL,YAAM,cACJ,OAAO,UAAU,YAAY,OAAO,UAAU,YAC1C,OAAO,KAAK,IACZ,KAAK,UAAU,KAAK;AAC1B,YAAM,KAAK,KAAK,WAAW,IAAI;AAAA,IACjC;AAEA,UAAM,KAAK,EAAE;AAEb,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AACF;;;AC5GA,SAAS,cAAc,KAAsB;AAC3C,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,SAAS,uBAAuB,KAA6B;AAC3D,QAAM,SAAS,cAAc,GAAG;AAChC,MAAI,WAAW,QAAQ,OAAO,WAAW,SAAU,QAAO;AAC1D,SAAO,EAAE,YAAY,SAAS;AAChC;AAMO,SAAS,WAAW,KAA6B;AACtD,SAAO;AAAA,IACL,KAAK,IAAI;AAAA,IACT,OAAO,cAAc,IAAI,KAAK;AAAA,IAC9B,UAAU,uBAAuB,IAAI,QAAQ;AAAA,IAC7C,WAAW,IAAI,KAAK,IAAI,UAAU;AAAA,IAClC,YAAY,IAAI,KAAK,IAAI,WAAW;AAAA,EACtC;AACF;AAMO,SAAS,iBAAiB,OAAuB;AACtD,SAAO,MACJ,QAAQ,kBAAkB,GAAG,EAC7B,QAAQ,aAAa,GAAG,EACxB,QAAQ,YAAY,GAAG,EACvB,QAAQ,aAAa,GAAG,EACxB,QAAQ,cAAc,GAAG,EACzB,QAAQ,QAAQ,GAAG,EACnB,KAAK;AACV;AAKO,SAAS,sBACd,MACA,UACA,YACAC,SACkD;AAClD,QAAM,MAAM,gBAAgB,EAAE,IAAI;AAClC,QAAM,UAAyB,CAAC;AAChC,QAAM,cAAwB,CAAC;AAE/B,aAAW,OAAO,MAAM;AACtB,QAAI,cAAc,IAAI,eAAe,QAAQ,IAAI,aAAa,KAAK;AACjE,kBAAY,KAAK,IAAI,GAAG;AACxB;AAAA,IACF;AACA,YAAQ,KAAK,WAAW,GAAG,CAAC;AAAA,EAC9B;AAEA,MAAI,YAAY,SAAS,GAAG;AAC1B,UAAM,aAAa,SAAS;AAAA,MAC1B,sCAAsC,YAAY,IAAI,MAAM,GAAG,EAAE,KAAK,GAAG,CAAC;AAAA,IAC5E;AACA,eAAW,IAAI,GAAG,WAAW;AAC7B,IAAAA,QAAO,MAAM,yBAAyB,EAAE,OAAO,YAAY,OAAO,CAAC;AAAA,EACrE;AAEA,SAAO,EAAE,SAAS,cAAc,YAAY,OAAO;AACrD;AA4DO,SAAS,cAAc,UAAwD;AACpF,MAAI;AACF,UAAM,OAAO,SAAS,QAA2B,wCAAwC;AACzF,UAAM,MAAM,KAAK,IAAI;AACrB,WAAO,GAAG,KAAK,SAAS,CAAC;AAAA,EAC3B,SAAS,OAAO;AACd,UAAM,aAAa,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAC3E,WAAO,IAAI,IAAI,YAAY,4BAA4B,EAAE,OAAO,WAAW,CAAC,CAAC;AAAA,EAC/E;AACF;AAKO,SAAS,iBACd,UACAC,SAC6B;AAC7B,MAAI;AACF,UAAM,OAAO,SAAS;AAAA,MACpB;AAAA,IACF;AACA,UAAM,SAAS,KAAK,IAAI,gBAAgB,EAAE,IAAI,CAAC;AAC/C,IAAAA,QAAO,KAAK,oBAAoB,EAAE,OAAO,OAAO,QAAQ,CAAC;AACzD,WAAO,GAAG,OAAO,OAAO;AAAA,EAC1B,SAAS,OAAO;AACd,UAAM,aAAa,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAC3E,WAAO,IAAI,IAAI,YAAY,6BAA6B,EAAE,OAAO,WAAW,CAAC,CAAC;AAAA,EAChF;AACF;AAKO,SAAS,gBACd,UACA,WACAA,SAC6B;AAC7B,MAAI;AACF,UAAM,OAAO,SAAS,QAAQ,2CAA2C;AACzE,UAAM,SAAS,KAAK,IAAI,UAAU,QAAQ,CAAC;AAC3C,IAAAA,QAAO,KAAK,uBAAuB;AAAA,MACjC,WAAW,UAAU,YAAY;AAAA,MACjC,OAAO,OAAO;AAAA,IAChB,CAAC;AACD,WAAO,GAAG,OAAO,OAAO;AAAA,EAC1B,SAAS,OAAO;AACd,UAAM,aAAa,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAC3E,WAAO;AAAA,MACL,IAAI,YAAY,4BAA4B;AAAA,QAC1C,OAAO;AAAA,QACP,SAAS,EAAE,WAAW,UAAU,YAAY,EAAE;AAAA,MAChD,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AFzJO,IAAM,sBAAN,MAAoD;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,KAA6B;AAAA,EAC7B,cAAc;AAAA,EACd;AAAA,EAER,YAAY,QAA4B;AACtC,UAAM,aAAa,yBAAyB,UAAU,MAAM;AAC5D,QAAI,CAAC,WAAW,SAAS;AACvB,YAAM,IAAI;AAAA,QACR,uCAAuC,eAAe,WAAW,KAAK,CAAC;AAAA,QACvE;AAAA,UACE,SAAS,EAAE,QAAQ,kBAAkB,WAAW,MAAM,OAAO;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAEA,SAAK,SAAS,OAAO;AACrB,SAAK,SAAS,OAAO,UAAU,aAAa,EAAE,WAAW,sBAAsB,CAAC;AAChF,SAAK,aAAa,OAAO,cAAc;AACvC,SAAK,WAAW,IAAI,qBAAqB,OAAO,aAAa,KAAK,MAAM;AAAA,EAC1E;AAAA,EAEA,uBAAuB,UAAiC;AACtD,SAAK,KAAK;AACV,SAAK,aAAa;AAClB,SAAK,SAAS,UAAU;AACxB,SAAK,cAAc;AACnB,SAAK,OAAO,KAAK,mCAAmC,EAAE,QAAQ,KAAK,OAAO,CAAC;AAAA,EAC7E;AAAA,EAEA,MAAM,aAAiD;AACrD,QAAI,KAAK,YAAa,QAAO,GAAG,MAAS;AACzC,SAAK,gBAAgB,KAAK,aAAa,EAAE,QAAQ,MAAM;AACrD,WAAK,cAAc;AAAA,IACrB,CAAC;AACD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,eAAmD;AAC/D,QAAI;AACF,YAAM,sBAAsB,MAAM,OAAO,gBAAgB,EAAE,MAAM,CAAC,UAAmB;AACnF,aAAK,OAAO,MAAM,gCAAgC,EAAE,OAAO,OAAO,KAAK,EAAE,CAAC;AAC1E,eAAO;AAAA,MACT,CAAC;AACD,UAAI,wBAAwB,MAAM;AAChC,eAAO;AAAA,UACL,IAAI,YAAY,qEAAqE;AAAA,YACnF,SAAS,EAAE,QAAQ,KAAK,OAAO;AAAA,UACjC,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,WAAW,oBAAoB;AACrC,WAAK,KAAK,IAAK,SAAmD,KAAK,MAAM;AAC7E,WAAK,aAAa;AAClB,WAAK,SAAS,UAAU;AACxB,WAAK,cAAc;AACnB,WAAK,OAAO,KAAK,mCAAmC,EAAE,QAAQ,KAAK,OAAO,CAAC;AAC3E,aAAO,GAAG,MAAS;AAAA,IACrB,SAAS,OAAO;AACd,YAAM,aAAa,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAC3E,WAAK,OAAO,MAAM,4CAA4C,UAAU;AACxE,aAAO;AAAA,QACL,IAAI,YAAY,uCAAuC;AAAA,UACrD,OAAO;AAAA,UACP,SAAS,EAAE,QAAQ,KAAK,OAAO;AAAA,QACjC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eAAqB;AAC3B,UAAM,WAAW,KAAK,YAAY;AAClC,aAAS,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,KAKb;AACD,aAAS,KAAK;AAAA;AAAA;AAAA;AAAA,KAIb;AACD,aAAS,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,KAKb;AACD,aAAS,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,KAKb;AACD,aAAS,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAOb;AACD,aAAS;AAAA,MACP;AAAA,IACF;AACA,aAAS,KAAK,4EAA4E;AAC1F,SAAK,OAAO,MAAM,yBAAyB;AAAA,EAC7C;AAAA,EAEQ,cAA+B;AACrC,QAAI,KAAK,OAAO,KAAM,OAAM,IAAI,YAAY,0BAA0B;AACtE,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,oBAA0B;AAChC,QAAI,CAAC,KAAK,eAAe,KAAK,OAAO,MAAM;AACzC,YAAM,IAAI,YAAY,+DAA+D;AAAA,IACvF;AAAA,EACF;AAAA,EAEA,MAAM,MACJ,KACA,OACA,UACoC;AACpC,QAAI;AACF,WAAK,kBAAkB;AACvB,YAAM,gBAAgBC,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG;AACrD,UAAI,CAAC,cAAc;AACjB,eAAO,IAAI,IAAI,YAAY,yCAAyC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAE3F,YAAM,qBAAqB,qBAAqB,UAAU,QAAQ;AAClE,UAAI,CAAC,mBAAmB;AACtB,eAAO;AAAA,UACL,IAAI,YAAY,oBAAoB;AAAA,YAClC,SAAS,EAAE,UAAU,QAAQ,mBAAmB,MAAM,OAAO;AAAA,UAC/D,CAAC;AAAA,QACH;AAEF,YAAM,MAAM,gBAAgB,EAAE,IAAI;AAClC,YAAM,YAAY,SAAS,QAAQ,SAAY,MAAM,SAAS,MAAM;AACpE,YAAM,WAAW,KAAK,YAAY;AAElC,YAAM,OAAO,SAAS;AAAA,QACpB;AAAA,MACF;AACA,WAAK,IAAI,KAAK,KAAK,UAAU,KAAK,GAAG,KAAK,UAAU,QAAQ,GAAG,KAAK,KAAK,SAAS;AAElF,WAAK,OAAO,MAAM,iBAAiB,EAAE,KAAK,YAAY,SAAS,WAAW,CAAC;AAC3E,UAAI,SAAS,eAAe,iBAAiB;AAC3C,cAAM,KAAK,SAAS,MAAM,KAAK,OAAO,UAAU,IAAI,KAAK,GAAG,CAAC;AAE/D,aAAO,GAAG,MAAS;AAAA,IACrB,SAAS,OAAO;AACd,YAAM,aAAa,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAC3E,WAAK,OAAO,MAAM,0BAA0B,YAAY,EAAE,IAAI,CAAC;AAC/D,aAAO;AAAA,QACL,IAAI,YAAY,0BAA0B,EAAE,OAAO,YAAY,SAAS,EAAE,IAAI,EAAE,CAAC;AAAA,MACnF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,SAAS,KAAoD;AAC3D,QAAI;AACF,WAAK,kBAAkB;AACvB,YAAM,WAAW,KAAK,YAAY;AAClC,YAAM,OAAO,SAAS;AAAA,QACpB;AAAA,MACF;AACA,YAAM,MAAM,KAAK,IAAI,GAAG;AAExB,UAAI,QAAQ,OAAW,QAAO,QAAQ,QAAQ,GAAG,IAAI,CAAC;AACtD,UAAI,KAAK,cAAc,IAAI,eAAe,QAAQ,IAAI,aAAa,gBAAgB,EAAE,IAAI,GAAG;AAC1F,iBAAS,QAAQ,oCAAoC,EAAE,IAAI,GAAG;AAC9D,aAAK,OAAO,MAAM,uBAAuB,EAAE,IAAI,CAAC;AAChD,eAAO,QAAQ,QAAQ,GAAG,IAAI,CAAC;AAAA,MACjC;AACA,eACG,QAAQ,mDAAmD,EAC3D,IAAI,gBAAgB,EAAE,IAAI,GAAG,GAAG;AACnC,aAAO,QAAQ,QAAQ,GAAG,KAAK,MAAM,IAAI,KAAK,CAAY,CAAC;AAAA,IAC7D,SAAS,OAAO;AACd,YAAM,aAAa,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAC3E,WAAK,OAAO,MAAM,6BAA6B,YAAY,EAAE,IAAI,CAAC;AAClE,aAAO,QAAQ;AAAA,QACb,IAAI,IAAI,YAAY,6BAA6B,EAAE,OAAO,YAAY,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAAA,MAC3F;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,OAAe,OAA4D;AAChF,QAAI;AACF,WAAK,kBAAkB;AACvB,UAAI,SAAS,KAAK,QAAQ;AACxB,eAAO,QAAQ;AAAA,UACb,IAAI,IAAI,YAAY,6CAA6C,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;AAAA,QAC1F;AAEF,YAAM,iBAAiB,iBAAiB,KAAK;AAC7C,UAAI,eAAe,WAAW,EAAG,QAAO,QAAQ,QAAQ,GAAG,CAAC,CAAC,CAAC;AAE9D,YAAM,WAAW,KAAK,YAAY;AAClC,YAAM,OAAO,SAAS,QAAmB;AAAA;AAAA;AAAA;AAAA,OAIxC;AACD,YAAM,OAAO,KAAK,IAAI,gBAAgB,KAAK;AAC3C,YAAM,EAAE,QAAQ,IAAI,sBAAsB,MAAM,UAAU,KAAK,YAAY,KAAK,MAAM;AACtF,aAAO,QAAQ,QAAQ,GAAG,OAAO,CAAC;AAAA,IACpC,SAAS,OAAO;AACd,YAAM,aAAa,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAC3E,WAAK,OAAO,MAAM,6BAA6B,YAAY,EAAE,MAAM,CAAC;AACpE,aAAO,QAAQ;AAAA,QACb;AAAA,UACE,IAAI,YAAY,6BAA6B;AAAA,YAC3C,OAAO;AAAA,YACP,SAAS,EAAE,OAAO,MAAM;AAAA,UAC1B,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAuD;AAC3D,SAAK,kBAAkB;AACvB,WAAO,QAAQ,QAAQ,gBAAgB,KAAK,YAAY,GAAG,WAAW,KAAK,MAAM,CAAC;AAAA,EACpF;AAAA,EAEA,YAAkD;AAChD,SAAK,kBAAkB;AACvB,WAAO,QAAQ,QAAQ,iBAAiB,KAAK,YAAY,GAAG,KAAK,MAAM,CAAC;AAAA,EAC1E;AAAA,EAEA,OAAO,KAAoD;AACzD,QAAI;AACF,WAAK,kBAAkB;AACvB,YAAM,SAAS,KAAK,YAAY,EAAE,QAAQ,oCAAoC,EAAE,IAAI,GAAG;AACvF,UAAI,OAAO,UAAU,GAAG;AACtB,aAAK,SAAS,OAAO,GAAG;AACxB,aAAK,OAAO,MAAM,kBAAkB,EAAE,IAAI,CAAC;AAC3C,eAAO,QAAQ,QAAQ,GAAG,IAAI,CAAC;AAAA,MACjC;AACA,aAAO,QAAQ,QAAQ,GAAG,KAAK,CAAC;AAAA,IAClC,SAAS,OAAO;AACd,YAAM,aAAa,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAC3E,WAAK,OAAO,MAAM,2BAA2B,YAAY,EAAE,IAAI,CAAC;AAChE,aAAO,QAAQ;AAAA,QACb,IAAI,IAAI,YAAY,2BAA2B,EAAE,OAAO,YAAY,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAAA,MACzF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,QAAQ,KAAkD;AAC/D,QAAI;AACF,WAAK,kBAAkB;AACvB,YAAM,WAAW,KAAK,YAAY;AAClC,YAAM,OAAO,SACV;AAAA,QACC;AAAA,MACF,EACC,IAAI,KAAK;AACZ,YAAM,EAAE,QAAQ,IAAI,sBAAsB,MAAM,UAAU,KAAK,YAAY,KAAK,MAAM;AACtF,aAAO,QAAQ,QAAQ,GAAG,OAAO,CAAC;AAAA,IACpC,SAAS,OAAO;AACd,YAAM,aAAa,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAC3E,WAAK,OAAO,MAAM,8BAA8B,UAAU;AAC1D,aAAO,QAAQ;AAAA,QACb,IAAI,IAAI,YAAY,8BAA8B,EAAE,OAAO,WAAW,CAAC,CAAC;AAAA,MAC1E;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAA8C;AAC5C,SAAK,kBAAkB;AACvB,WAAO,QAAQ,QAAQ,cAAc,KAAK,YAAY,CAAC,CAAC;AAAA,EAC1D;AAAA,EAEA,QAAc;AACZ,QAAI,KAAK,OAAO,MAAM;AACpB,WAAK,GAAG,MAAM;AACd,WAAK,KAAK;AACV,WAAK,cAAc;AACnB,WAAK,OAAO,KAAK,4BAA4B;AAAA,IAC/C;AAAA,EACF;AACF;;;AGpVA,SAAS,KAAAC,UAAS;AAsBlB,IAAM,2BAA2BA,GAAE,OAAO;AAAA,EACxC,SAASA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EAChC,YAAYA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EACnC,WAAWA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AACpC,CAAC;AAGM,IAAM,uBAAuB,yBAAyB;AAAA,EAC3D,CAAC,MAAM,KAAK,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,CAAG,IAAI;AAAA,EAChE,EAAE,SAAS,0BAA0B;AACvC;AAGO,IAAM,8BAA8B,yBAAyB,QAAQ;AAerE,IAAM,0BAA0BA,GAAE,OAAO;AAAA,EAC9C,KAAKA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EAC5B,QAAQA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EAC/B,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAC/B,CAAC;AAaM,IAAM,oBAAoBA,GAAE,OAAO;AAAA,EACxC,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,EAChC,UAAUA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AACnC,CAAC;AA6BM,IAAM,sBAAsBA,GAAE,OAAO;AAAA,EAC1C,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,YAAYA,GAAE,OAAO;AAAA,IACnB,SAASA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,IAChC,YAAYA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,IACnC,WAAWA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EACpC,CAAC;AACH,CAAC;AAiBM,IAAM,0BAA0BA,GAAE,OAAO;AAAA,EAC9C,OAAOA,GAAE,OAAO;AAAA,IACd,KAAKA,GAAE,OAAO;AAAA,IACd,OAAOA,GAAE,QAAQ;AAAA,IACjB,UAAUA,GAAE,OAAO;AAAA,MACjB,YAAYA,GAAE,KAAK,CAAC,OAAO,UAAU,MAAM,CAAC;AAAA,MAC5C,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MACnC,KAAKA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC3B,CAAC;AAAA,IACD,WAAWA,GAAE,KAAK;AAAA,IAClB,YAAYA,GAAE,KAAK;AAAA,EACrB,CAAC;AAAA,EACD,UAAU;AACZ,CAAC;AAyBM,IAAM,iCAAiCA,GAAE,OAAO;AAAA,EACrD,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC5C,UAAUA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACrC,SAAS,4BAA4B,SAAS;AAAA,EAC9C,kBAAkBA,GAAE,MAAMA,GAAE,KAAK,CAAC,OAAO,UAAU,MAAM,CAAC,CAAC,EAAE,SAAS;AAAA,EACtE,WAAWA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAC1C,CAAC;AA4DM,IAAM,sBAAsBA,GAAE,OAAO;AAAA,EAC1C,SAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,OAAO;AACT,CAAC;AAiBM,IAAM,6BAA6BA,GAAE,OAAO;AAAA,EACjD,QAAQA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACxB,aAAaA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7B,SAAS,oBAAoB,QAAQ,EAAE,SAAS;AAAA,EAChD,YAAYA,GAAE,QAAQ,EAAE,SAAS;AACnC,CAAC;AAOM,IAAM,0BAA0C;AAAA,EACrD,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AACb;AAGO,IAAM,6BAAgD;AAAA,EAC3D,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AACR;AAGO,IAAM,uBAAoC;AAAA,EAC/C,YAAY,KAAK,KAAK,KAAK;AAAA;AAAA,EAC3B,UAAU;AACZ;AAGO,IAAM,yBAAwC;AAAA,EACnD,SAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,OAAO;AACT;;;ACrQO,SAAS,sBAAsB,aAAuB,cAAgC;AAC3F,MAAI,YAAY,WAAW,EAAG,QAAO;AACrC,MAAI,aAAa,WAAW,EAAG,QAAO;AAEtC,QAAM,YAAY,IAAI,IAAI,YAAY;AACtC,MAAI,UAAU;AAEd,aAAW,SAAS,aAAa;AAC/B,QAAI,UAAU,IAAI,KAAK,EAAG;AAAA,EAC5B;AAEA,SAAO,UAAU,YAAY;AAC/B;AAYO,SAAS,yBAA4B,WAAmB,WAA2B;AACxF,MAAI,QAAQ;AACZ,aAAW,QAAQ,WAAW;AAC5B,QAAI,UAAU,IAAI,IAAI,EAAG;AAAA,EAC3B;AACA,SAAO;AACT;AAqBO,SAAS,2BAA8B,MAAc,MAAsB;AAChF,MAAI,KAAK,SAAS,KAAK,KAAK,SAAS,EAAG,QAAO;AAC/C,MAAI,KAAK,SAAS,KAAK,KAAK,SAAS,EAAG,QAAO;AAE/C,QAAM,eAAe,yBAAyB,MAAM,IAAI;AACxD,QAAM,QAAQ,KAAK,OAAO,KAAK,OAAO;AAEtC,SAAO,QAAQ,IAAI,eAAe,QAAQ;AAC5C;AASO,SAAS,+BAA+B,OAAe,OAAuB;AACnF,QAAM,SAAS,IAAI;AAAA,IACjB,MACG,YAAY,EACZ,MAAM,KAAK,EACX,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,EAC/B;AACA,QAAM,SAAS,IAAI;AAAA,IACjB,MACG,YAAY,EACZ,MAAM,KAAK,EACX,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,EAC/B;AAEA,SAAO,2BAA2B,QAAQ,MAAM;AAClD;;;AC/FA,IAAM,SAAS,aAAa,EAAE,WAAW,gBAAgB,CAAC;AAS1D,SAAS,cAAiB,MAAc,UAAa,SAAoB;AACvE,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO,KAAK,uCAAuC,EAAE,QAAQ,CAAC;AAC9D,WAAO;AAAA,EACT;AACF;AAWO,SAAS,iBAAiB,KAA6B;AAC5D,SAAO;AAAA,IACL,KAAK,IAAI;AAAA,IACT,OAAO,cAAuB,IAAI,OAAO,IAAI,OAAO,kBAAkB,IAAI,GAAG,GAAG;AAAA,IAChF,UAAU;AAAA,MACR,IAAI;AAAA,MACJ,EAAE,YAAY,iBAAiB,OAAO;AAAA,MACtC,qBAAqB,IAAI,GAAG;AAAA,IAC9B;AAAA,IACA,WAAW,IAAI,KAAK,IAAI,UAAU;AAAA,IAClC,YAAY,IAAI,KAAK,IAAI,WAAW;AAAA,EACtC;AACF;AAaO,SAAS,aAAa,IAAqB,KAAsB;AACtE,QAAM,OAAO,GAAG;AAAA,IACd;AAAA,EACF;AACA,QAAM,SAAS,KAAK,IAAI,GAAG;AAC3B,SAAO,WAAW,UAAa,OAAO,QAAQ;AAChD;AAaO,SAAS,eAAe,IAAqB,KAAsC;AACxF,QAAM,OAAO,GAAG,QAAmB,sCAAsC;AACzE,QAAM,MAAM,KAAK,IAAI,GAAG;AACxB,SAAO,QAAQ,SAAY,iBAAiB,GAAG,IAAI;AACrD;AASO,SAAS,aAAa,IAAqB,KAAoC;AACpF,QAAM,OAAO,GAAG,QAAmB,sCAAsC;AACzE,SAAO,KAAK,IAAI,GAAG;AACrB;AASO,SAAS,iBAAiB,IAAqB,OAA4B;AAChF,QAAM,OAAO,GAAG,QAAmB,0DAA0D;AAC7F,SAAO,KAAK,IAAI,KAAK;AACvB;;;AC9EO,SAAS,sBACd,YACA,KACA,YACA,UACQ;AACR,QAAM,YAAY,IAAI,QAAQ,IAAI,WAAW,QAAQ;AACrD,MAAI,aAAa,EAAG,QAAO;AAG3B,QAAM,SAAS,KAAK,MAAM;AAC1B,QAAM,eAAe,KAAK,IAAI,CAAC,SAAS,SAAS;AAEjD,SAAO,KAAK,IAAI,UAAU,YAAY;AACxC;AAYO,SAAS,yBAAyB,YAAoB,QAA+B;AAC1F,UAAQ,YAAY;AAAA,IAClB,KAAK,iBAAiB;AACpB,aAAO,OAAO,kBAAkB;AAAA,IAClC,KAAK,iBAAiB;AACpB,aAAO,OAAO,kBAAkB;AAAA,IAClC,KAAK,iBAAiB;AACpB,aAAO,OAAO,kBAAkB;AAAA,IAClC;AACE,aAAO,OAAO,kBAAkB;AAAA,EACpC;AACF;AAaO,SAAS,wBAAwB,OAA2B,OAAuB;AACxF,MAAI,UAAU,UAAa,MAAM,KAAK,MAAM,GAAI,QAAO;AAEvD,QAAM,cAAcC,UAAS,KAAK;AAClC,QAAM,cAAcA,UAAS,KAAK;AAElC,MAAI,YAAY,WAAW,KAAK,YAAY,WAAW,EAAG,QAAO;AAGjE,SAAO,sBAAsB,aAAa,WAAW;AACvD;AAMA,SAASA,UAAS,MAAwB;AACxC,SAAO,SAAe,MAAM,CAAC;AAC/B;AAoBO,SAAS,uBAAuB,OAAiD;AACtF,QAAM,EAAE,OAAO,OAAO,KAAK,QAAQ,gBAAgB,IAAI;AAGvD,QAAM,UAAU;AAAA,IACd,MAAM;AAAA,IACN;AAAA,IACA,OAAO,MAAM;AAAA,IACb,OAAO,MAAM;AAAA,EACf;AACA,QAAM,aAAa,yBAAyB,MAAM,SAAS,YAAY,MAAM;AAC7E,QAAM,YAAY,wBAAwB,OAAOC,gBAAe,MAAM,KAAK,CAAC;AAE5E,QAAM,aAAsC,EAAE,SAAS,YAAY,UAAU;AAG7E,QAAM,UAAU,eAAe,OAAO,SAAS,eAAe;AAC9D,QAAM,QACJ,UAAU,QAAQ,UAAU,aAAa,QAAQ,aAAa,YAAY,QAAQ;AAEpF,SAAO,EAAE,OAAO,WAAW;AAC7B;AAMA,SAASA,gBAAe,OAAwB;AAC9C,SAAO,eAAqB,KAAK;AACnC;AAKA,SAAS,eAAe,MAAsB,WAAqD;AACjG,MAAI,cAAc,OAAW,QAAO;AAEpC,QAAM,SAAS;AAAA,IACb,SAAS,UAAU,WAAW,KAAK;AAAA,IACnC,YAAY,UAAU,cAAc,KAAK;AAAA,IACzC,WAAW,UAAU,aAAa,KAAK;AAAA,EACzC;AAGA,QAAM,MAAM,OAAO,UAAU,OAAO,aAAa,OAAO;AACxD,MAAI,QAAQ,EAAG,QAAO;AACtB,MAAI,KAAK,IAAI,MAAM,CAAG,IAAI,MAAO;AAC/B,WAAO;AAAA,MACL,SAAS,OAAO,UAAU;AAAA,MAC1B,YAAY,OAAO,aAAa;AAAA,MAChC,WAAW,OAAO,YAAY;AAAA,IAChC;AAAA,EACF;AAEA,SAAO;AACT;AAkBO,SAAS,oBACd,SACA,QACqB;AACrB,SAAO,QAAQ,OAAO,CAAC,MAAM;AAE3B,QAAI,OAAO,aAAa,UAAa,EAAE,SAAS,QAAQ,OAAO,UAAU;AACvE,aAAO;AAAA,IACT;AAGA,QAAI,OAAO,qBAAqB,UAAa,OAAO,iBAAiB,SAAS,GAAG;AAC/E,UAAI,CAAC,OAAO,iBAAiB,SAAS,EAAE,MAAM,SAAS,UAAU,GAAG;AAClE,eAAO;AAAA,MACT;AAAA,IACF;AAGA,QAAI,OAAO,cAAc,UAAa,OAAO,UAAU,SAAS,GAAG;AACjE,YAAM,YAAY,EAAE,MAAM,SAAS,QAAQ,CAAC;AAC5C,YAAM,WAAW,OAAO,UAAU,KAAK,CAAC,MAAM,UAAU,SAAS,CAAC,CAAC;AACnE,UAAI,CAAC,SAAU,QAAO;AAAA,IACxB;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AASO,SAAS,YAAY,IAAqB,KAAsB;AACrE,QAAM,OAAO,GAAG,QAAQ,mDAAmD;AAC3E,QAAM,SAAS,KAAK,IAAI,gBAAgB,EAAE,IAAI,GAAG,GAAG;AACpD,SAAO,OAAO,UAAU;AAC1B;AASO,SAAS,oBACd,MACA,MACA,QACqB;AACrB,QAAM,MAAM,IAAI,KAAK,gBAAgB,EAAE,IAAI,CAAC;AAG5C,QAAM,SAA8B,KAAK,IAAI,CAAC,QAAQ;AACpD,UAAM,QAAQ,iBAAuB,GAAG;AACxC,UAAM,WAAW,uBAAuB;AAAA,MACtC;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,MAAM,UAAU,UAAa,EAAE,OAAO,KAAK,MAAM;AAAA,MACrD,GAAI,MAAM,YAAY,UAAa,EAAE,iBAAiB,KAAK,QAAQ;AAAA,IACrE,CAAC;AACD,WAAO,EAAE,OAAO,SAAS;AAAA,EAC3B,CAAC;AAGD,QAAM,eAA6B;AAAA,IACjC,GAAI,MAAM,aAAa,UAAa,EAAE,UAAU,KAAK,SAAS;AAAA,IAC9D,GAAI,MAAM,qBAAqB,UAAa,EAAE,kBAAkB,KAAK,iBAAiB;AAAA,IACtF,GAAI,MAAM,cAAc,UAAa,EAAE,WAAW,KAAK,UAAU;AAAA,EACnE;AACA,QAAM,WAAW,oBAAoB,QAAQ,YAAY;AAGzD,WAAS,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,QAAQ,EAAE,SAAS,KAAK;AAG3D,QAAM,QAAQ,MAAM,SAAS;AAC7B,SAAO,SAAS,MAAM,GAAG,KAAK;AAChC;AASO,SAAS,mBAAmB,SAAiD;AAClF,MAAI,YAAY,OAAW,QAAO;AAElC,SAAO;AAAA,IACL,SAAS,QAAQ,WAAW,uBAAuB;AAAA,IACnD,mBAAmB,QAAQ,qBAAqB,uBAAuB;AAAA,IACvE,OAAO,QAAQ,SAAS,uBAAuB;AAAA,EACjD;AACF;;;ACvPA,IAAMC,UAAS,aAAa,EAAE,WAAW,wBAAwB,CAAC;AAK3D,IAAM,wBAAN,MAAuD;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACT;AAAA,EACA,KAA6B;AAAA,EAC7B,cAAc;AAAA,EACd;AAAA,EAER,YAAY,QAA8B;AACxC,UAAM,aAAa,2BAA2B,UAAU,MAAM;AAC9D,QAAI,CAAC,WAAW,SAAS;AACvB,YAAM,MAAM,WAAW,MAAM,OAC1B,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAC9C,KAAK,IAAI;AACZ,YAAM,IAAI,YAAY,yCAAyC,GAAG,EAAE;AAAA,IACtE;AACA,SAAK,SAAS;AACd,SAAK,MAAMA;AACX,SAAK,gBAAgB,mBAAmB,OAAO,OAAO;AACtD,SAAK,OAAO,IAAI,oBAAoB,EAAE,QAAQ,OAAO,QAAQ,aAAa,OAAO,YAAY,CAAC;AAAA,EAChG;AAAA,EAEA,MAAM,aAAiD;AACrD,QAAI,KAAK,YAAa,QAAO,GAAG,MAAS;AACzC,SAAK,gBAAgB,KAAK,aAAa,EAAE,QAAQ,MAAM;AACrD,WAAK,cAAc;AAAA,IACrB,CAAC;AACD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,eAAmD;AAC/D,UAAM,WAAW,MAAM,KAAK,KAAK,WAAW;AAC5C,QAAI,CAAC,SAAS,GAAI,QAAO;AAEzB,QAAI;AACF,YAAM,MAAM,MAAM,OAAO,gBAAgB,EAAE,MAAM,CAAC,UAAmB;AACnE,aAAK,IAAI,MAAM,gCAAgC,EAAE,OAAO,OAAO,KAAK,EAAE,CAAC;AACvE,eAAO;AAAA,MACT,CAAC;AACD,UAAI,QAAQ;AACV,eAAO;AAAA,UACL,IAAI,YAAY,mEAAmE;AAAA,QACrF;AACF,YAAM,WAAW,IAAI;AACrB,WAAK,KAAK,IAAK,SAAgD,KAAK,OAAO,MAAM;AACjF,WAAK,cAAc;AACnB,WAAK,IAAI,KAAK,mCAAmC;AACjD,aAAO,GAAG,MAAS;AAAA,IACrB,SAAS,OAAO;AACd,YAAM,QAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AACtE,aAAO,IAAI,IAAI,YAAY,yCAAyC,EAAE,MAAM,CAAC,CAAC;AAAA,IAChF;AAAA,EACF;AAAA,EAEA,uBAAuB,UAAiC;AACtD,SAAK,KAAK,uBAAuB,QAAQ;AACzC,SAAK,KAAK;AACV,SAAK,cAAc;AACnB,SAAK,IAAI,KAAK,iDAAiD;AAAA,EACjE;AAAA,EAEQ,QAAyB;AAC/B,QAAI,KAAK,OAAO,KAAM,OAAM,IAAI,YAAY,0BAA0B;AACtE,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,aAAmB;AACzB,QAAI,CAAC,KAAK,YAAa,OAAM,IAAI,YAAY,uCAAuC;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAa,OAAgB,UAA8D;AAC/F,WAAO,KAAK,KAAK,MAAM,KAAK,OAAO,QAAQ;AAAA,EAC7C;AAAA,EAEA,SAAS,KAAoD;AAC3D,WAAO,KAAK,KAAK,SAAS,GAAG;AAAA,EAC/B;AAAA,EAEA,OAAO,OAAe,OAA4D;AAChF,WAAO,KAAK,KAAK,OAAO,OAAO,KAAK;AAAA,EACtC;AAAA,EAEA,MAAM,WAAuD;AAC3D,WAAO,KAAK,KAAK,MAAM,SAAS;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAMA,mBACE,MACmD;AACnD,QAAI;AACF,WAAK,WAAW;AAChB,YAAM,KAAK,KAAK,MAAM;AAGtB,YAAM,YAAY,MAAM,SAAS,OAAO;AACxC,YAAM,OAAO,iBAAiB,IAAI,QAAQ;AAG1C,YAAM,SAAS,oBAAoB,MAAM,MAAM,KAAK,aAAa;AAEjE,WAAK,IAAI,MAAM,yBAAyB,EAAE,OAAO,OAAO,QAAQ,OAAO,MAAM,MAAM,CAAC;AACpF,aAAO,QAAQ,QAAQ,GAAG,MAAM,CAAC;AAAA,IACnC,SAAS,OAAO;AACd,YAAM,QAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AACtE,aAAO,QAAQ,QAAQ,IAAI,IAAI,YAAY,kCAAkC,EAAE,MAAM,CAAC,CAAC,CAAC;AAAA,IAC1F;AAAA,EACF;AAAA,EAEA,iBAAiB,KAAa,OAA6D;AACzF,QAAI;AACF,WAAK,WAAW;AAChB,YAAM,KAAK,KAAK,MAAM;AAEtB,UAAI,CAAC,aAAa,IAAI,GAAG,GAAG;AAC1B,eAAO,QAAQ,QAAQ,IAAI,IAAI,YAAY,kBAAkB,GAAG,EAAE,CAAC,CAAC;AAAA,MACtE;AAEA,YAAM,MAAM,aAAa,IAAI,GAAG;AAChC,UAAI,QAAQ,QAAW;AACrB,eAAO,QAAQ,QAAQ,IAAI,IAAI,YAAY,kBAAkB,GAAG,EAAE,CAAC,CAAC;AAAA,MACtE;AAEA,YAAM,QAAQ,iBAAiB,GAAG;AAClC,YAAM,WAAW,uBAAuB;AAAA,QACtC;AAAA,QACA,KAAK,IAAI,KAAK,gBAAgB,EAAE,IAAI,CAAC;AAAA,QACrC,QAAQ,KAAK;AAAA,QACb,GAAI,UAAU,UAAa,EAAE,MAAM;AAAA,MACrC,CAAC;AAED,aAAO,QAAQ,QAAQ,GAAG,QAAQ,CAAC;AAAA,IACrC,SAAS,OAAO;AACd,YAAM,QAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AACtE,aAAO,QAAQ,QAAQ,IAAI,IAAI,YAAY,gCAAgC,EAAE,MAAM,CAAC,CAAC,CAAC;AAAA,IACxF;AAAA,EACF;AAAA,EAEA,MAAM,KAAiD;AACrD,QAAI;AACF,WAAK,WAAW;AAChB,YAAM,KAAK,KAAK,MAAM;AAEtB,UAAI,CAAC,aAAa,IAAI,GAAG,GAAG;AAC1B,eAAO,QAAQ,QAAQ,IAAI,IAAI,YAAY,kBAAkB,GAAG,EAAE,CAAC,CAAC;AAAA,MACtE;AAEA,YAAM,UAAU,YAAY,IAAI,GAAG;AACnC,UAAI,CAAC,SAAS;AACZ,eAAO,QAAQ,QAAQ,IAAI,IAAI,YAAY,oBAAoB,GAAG,EAAE,CAAC,CAAC;AAAA,MACxE;AAEA,WAAK,IAAI,MAAM,kBAAkB,EAAE,IAAI,CAAC;AACxC,aAAO,QAAQ,QAAQ,GAAG,MAAS,CAAC;AAAA,IACtC,SAAS,OAAO;AACd,YAAM,QAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AACtE,aAAO,QAAQ,QAAQ,IAAI,IAAI,YAAY,0BAA0B,EAAE,MAAM,CAAC,CAAC,CAAC;AAAA,IAClF;AAAA,EACF;AAAA,EAEA,mBAAkC;AAChC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,oBAAoB,QAAsC;AACxD,SAAK,gBAAgB,mBAAmB,EAAE,GAAG,KAAK,eAAe,GAAG,OAAO,CAAC;AAC5E,SAAK,IAAI,KAAK,0BAA0B,EAAE,QAAQ,KAAK,cAAc,CAAC;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAMA,QAAc;AACZ,SAAK,KAAK,MAAM;AAChB,QAAI,KAAK,OAAO,MAAM;AACpB,WAAK,GAAG,MAAM;AACd,WAAK,KAAK;AAAA,IACZ;AACA,SAAK,cAAc;AACnB,SAAK,IAAI,KAAK,8BAA8B;AAAA,EAC9C;AACF;AAGO,SAAS,qBAAqB,QAAqD;AACxF,SAAO,IAAI,sBAAsB,MAAM;AACzC;","names":["z","logger","logger","logger","z","z","tokenize","stringifyValue","logger"]}
@@ -0,0 +1,63 @@
1
+ // src/pipeline/shared-memory.ts
2
+ var SharedMemoryStore = class {
3
+ entries = [];
4
+ maxEntries;
5
+ constructor(maxEntries = 100) {
6
+ this.maxEntries = maxEntries;
7
+ }
8
+ /** Write a memory entry. */
9
+ write(sourceStage, tag, content) {
10
+ if (this.entries.length >= this.maxEntries) {
11
+ this.entries.shift();
12
+ }
13
+ this.entries.push({
14
+ sourceStage,
15
+ tag,
16
+ content,
17
+ timestamp: Date.now()
18
+ });
19
+ }
20
+ /** Read all entries, optionally filtered by tag. */
21
+ read(tag) {
22
+ if (tag === void 0) return [...this.entries];
23
+ return this.entries.filter((e) => e.tag === tag);
24
+ }
25
+ /** Read entries from a specific stage. */
26
+ readFromStage(sourceStage) {
27
+ return this.entries.filter((e) => e.sourceStage === sourceStage);
28
+ }
29
+ /** Get summary of all entries as context string for LLM consumption. */
30
+ summarize(maxLength = 2e3) {
31
+ if (this.entries.length === 0) return "";
32
+ const lines = this.entries.map(
33
+ (e) => `[${e.tag}] (from ${e.sourceStage}): ${formatContent(e.content)}`
34
+ );
35
+ const joined = lines.join("\n");
36
+ if (joined.length <= maxLength) return joined;
37
+ return `${joined.slice(0, maxLength - 3)}...`;
38
+ }
39
+ /** Get entry count. */
40
+ get size() {
41
+ return this.entries.length;
42
+ }
43
+ /** Clear all entries. */
44
+ clear() {
45
+ this.entries.length = 0;
46
+ }
47
+ };
48
+ function formatContent(content) {
49
+ if (typeof content === "string") return content.slice(0, 200);
50
+ if (typeof content === "object" && content !== null) {
51
+ try {
52
+ return JSON.stringify(content).slice(0, 200);
53
+ } catch {
54
+ return "[object]";
55
+ }
56
+ }
57
+ return String(content);
58
+ }
59
+
60
+ export {
61
+ SharedMemoryStore
62
+ };
63
+ //# sourceMappingURL=chunk-ED6VQWNG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/pipeline/shared-memory.ts"],"sourcesContent":["/**\n * Shared Memory — Cross-stage knowledge propagation (#1737, Phase 4)\n *\n * Early pipeline stages (planning, research) write structured discoveries\n * to a shared memory layer. Later stages read before acting.\n *\n * Scoped to a single pipeline run — not persisted cross-session.\n *\n * Pattern from: SWE-AF shared memory, AutoGen knowledge propagation.\n *\n * @module pipeline/shared-memory\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** A tagged memory entry written by a pipeline stage. */\nexport interface SharedMemoryEntry {\n /** Stage that wrote this entry. */\n readonly sourceStage: string;\n /** Category tag for filtering. */\n readonly tag: SharedMemoryTag;\n /** The content (structured or text). */\n readonly content: unknown;\n /** When this was written. */\n readonly timestamp: number;\n}\n\n/** Tags for categorizing shared memory entries. */\nexport type SharedMemoryTag =\n | 'convention'\n | 'discovery'\n | 'constraint'\n | 'decision'\n | 'risk'\n | 'dependency'\n | 'context';\n\n// ============================================================================\n// Shared Memory Store (per-pipeline-run)\n// ============================================================================\n\n/** In-memory store for cross-stage knowledge sharing. */\nexport class SharedMemoryStore {\n private readonly entries: SharedMemoryEntry[] = [];\n private readonly maxEntries: number;\n\n constructor(maxEntries = 100) {\n this.maxEntries = maxEntries;\n }\n\n /** Write a memory entry. */\n write(sourceStage: string, tag: SharedMemoryTag, content: unknown): void {\n if (this.entries.length >= this.maxEntries) {\n this.entries.shift(); // Evict oldest\n }\n this.entries.push({\n sourceStage,\n tag,\n content,\n timestamp: Date.now(),\n });\n }\n\n /** Read all entries, optionally filtered by tag. */\n read(tag?: SharedMemoryTag): readonly SharedMemoryEntry[] {\n if (tag === undefined) return [...this.entries];\n return this.entries.filter((e) => e.tag === tag);\n }\n\n /** Read entries from a specific stage. */\n readFromStage(sourceStage: string): readonly SharedMemoryEntry[] {\n return this.entries.filter((e) => e.sourceStage === sourceStage);\n }\n\n /** Get summary of all entries as context string for LLM consumption. */\n summarize(maxLength = 2000): string {\n if (this.entries.length === 0) return '';\n const lines = this.entries.map(\n (e) => `[${e.tag}] (from ${e.sourceStage}): ${formatContent(e.content)}`\n );\n const joined = lines.join('\\n');\n if (joined.length <= maxLength) return joined;\n return `${joined.slice(0, maxLength - 3)}...`;\n }\n\n /** Get entry count. */\n get size(): number {\n return this.entries.length;\n }\n\n /** Clear all entries. */\n clear(): void {\n this.entries.length = 0;\n }\n}\n\n/** Format content for summarization. */\nfunction formatContent(content: unknown): string {\n if (typeof content === 'string') return content.slice(0, 200);\n if (typeof content === 'object' && content !== null) {\n try {\n return JSON.stringify(content).slice(0, 200);\n } catch {\n return '[object]';\n }\n }\n return String(content);\n}\n"],"mappings":";AA4CO,IAAM,oBAAN,MAAwB;AAAA,EACZ,UAA+B,CAAC;AAAA,EAChC;AAAA,EAEjB,YAAY,aAAa,KAAK;AAC5B,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA,EAGA,MAAM,aAAqB,KAAsB,SAAwB;AACvE,QAAI,KAAK,QAAQ,UAAU,KAAK,YAAY;AAC1C,WAAK,QAAQ,MAAM;AAAA,IACrB;AACA,SAAK,QAAQ,KAAK;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,KAAK,KAAqD;AACxD,QAAI,QAAQ,OAAW,QAAO,CAAC,GAAG,KAAK,OAAO;AAC9C,WAAO,KAAK,QAAQ,OAAO,CAAC,MAAM,EAAE,QAAQ,GAAG;AAAA,EACjD;AAAA;AAAA,EAGA,cAAc,aAAmD;AAC/D,WAAO,KAAK,QAAQ,OAAO,CAAC,MAAM,EAAE,gBAAgB,WAAW;AAAA,EACjE;AAAA;AAAA,EAGA,UAAU,YAAY,KAAc;AAClC,QAAI,KAAK,QAAQ,WAAW,EAAG,QAAO;AACtC,UAAM,QAAQ,KAAK,QAAQ;AAAA,MACzB,CAAC,MAAM,IAAI,EAAE,GAAG,WAAW,EAAE,WAAW,MAAM,cAAc,EAAE,OAAO,CAAC;AAAA,IACxE;AACA,UAAM,SAAS,MAAM,KAAK,IAAI;AAC9B,QAAI,OAAO,UAAU,UAAW,QAAO;AACvC,WAAO,GAAG,OAAO,MAAM,GAAG,YAAY,CAAC,CAAC;AAAA,EAC1C;AAAA;AAAA,EAGA,IAAI,OAAe;AACjB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA;AAAA,EAGA,QAAc;AACZ,SAAK,QAAQ,SAAS;AAAA,EACxB;AACF;AAGA,SAAS,cAAc,SAA0B;AAC/C,MAAI,OAAO,YAAY,SAAU,QAAO,QAAQ,MAAM,GAAG,GAAG;AAC5D,MAAI,OAAO,YAAY,YAAY,YAAY,MAAM;AACnD,QAAI;AACF,aAAO,KAAK,UAAU,OAAO,EAAE,MAAM,GAAG,GAAG;AAAA,IAC7C,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,OAAO,OAAO;AACvB;","names":[]}
@@ -3,85 +3,7 @@ import {
3
3
  err,
4
4
  getErrorMessage,
5
5
  ok
6
- } from "./chunk-IMWYKX4H.js";
7
-
8
- // src/scm/token-resolver.ts
9
- import { execFile } from "child_process";
10
- import { promisify } from "util";
11
- var execFileAsync = promisify(execFile);
12
- var logger = createLogger({ component: "TokenResolver" });
13
- var ENV_VARS = {
14
- github: ["GITHUB_TOKEN", "GH_TOKEN"],
15
- gitlab: ["GITLAB_TOKEN", "GL_TOKEN"],
16
- gitea: ["GITEA_TOKEN"]
17
- };
18
- var CLI_AUTH_COMMANDS = {
19
- github: ["gh", "auth", "token"],
20
- gitlab: ["glab", "auth", "token"],
21
- gitea: []
22
- };
23
- var CLI_AUTH_TIMEOUT_MS = 5e3;
24
- function resolveFromEnv(platform, customEnvVar) {
25
- if (customEnvVar !== void 0) {
26
- const val = process.env[customEnvVar];
27
- if (val !== void 0 && val !== "") {
28
- return { value: val, strategy: "env", platform };
29
- }
30
- }
31
- for (const envVar of ENV_VARS[platform]) {
32
- const val = process.env[envVar];
33
- if (val !== void 0 && val !== "") {
34
- return { value: val, strategy: "env", platform };
35
- }
36
- }
37
- return void 0;
38
- }
39
- async function resolveFromCli(platform) {
40
- const cmd = CLI_AUTH_COMMANDS[platform];
41
- if (cmd.length === 0) return void 0;
42
- const [bin, ...args] = cmd;
43
- if (bin === void 0) return void 0;
44
- try {
45
- const { stdout } = await execFileAsync(bin, args, {
46
- timeout: CLI_AUTH_TIMEOUT_MS
47
- });
48
- const token = stdout.trim();
49
- if (token !== "") {
50
- return { value: token, strategy: "cli", platform };
51
- }
52
- } catch {
53
- logger.debug("CLI auth token resolution failed", { platform });
54
- }
55
- return void 0;
56
- }
57
- async function resolveToken(config) {
58
- const platform = config?.platform ?? "github";
59
- if (config?.token !== void 0 && config.token !== "") {
60
- return ok({ value: config.token, strategy: "config", platform });
61
- }
62
- const envToken = resolveFromEnv(platform, config?.envVar);
63
- if (envToken !== void 0) {
64
- logger.debug("Token resolved from environment", { platform, strategy: "env" });
65
- return ok(envToken);
66
- }
67
- const cliToken = await resolveFromCli(platform);
68
- if (cliToken !== void 0) {
69
- logger.debug("Token resolved from CLI auth", { platform, strategy: "cli" });
70
- return ok(cliToken);
71
- }
72
- const envVarList = ENV_VARS[platform].join(" or ");
73
- return err(
74
- new Error(
75
- `No ${platform} token found. Set ${envVarList} environment variable, or authenticate via CLI (${CLI_AUTH_COMMANDS[platform].join(" ")}).`
76
- )
77
- );
78
- }
79
- function hasToken(platform = "github") {
80
- return resolveFromEnv(platform) !== void 0;
81
- }
82
- function getTokenEnvVars(platform = "github") {
83
- return ENV_VARS[platform];
84
- }
6
+ } from "./chunk-HSOPD265.js";
85
7
 
86
8
  // src/scm/types.ts
87
9
  var ScmError = class extends Error {
@@ -95,16 +17,16 @@ var ScmError = class extends Error {
95
17
  };
96
18
 
97
19
  // src/scm/github-provider.ts
98
- import { execFile as execFile2 } from "child_process";
99
- import { promisify as promisify2 } from "util";
100
- var execFileAsync2 = promisify2(execFile2);
101
- var logger2 = createLogger({ component: "GitHubProvider" });
20
+ import { execFile } from "child_process";
21
+ import { promisify } from "util";
22
+ var execFileAsync = promisify(execFile);
23
+ var logger = createLogger({ component: "GitHubProvider" });
102
24
  var MAX_BUFFER = 10 * 1024 * 1024;
103
25
  var GH_TIMEOUT_MS = 3e4;
104
26
  async function execGh(args, repo) {
105
27
  const fullArgs = [...args, "--repo", repo];
106
28
  try {
107
- const { stdout } = await execFileAsync2("gh", fullArgs, {
29
+ const { stdout } = await execFileAsync("gh", fullArgs, {
108
30
  maxBuffer: MAX_BUFFER,
109
31
  timeout: GH_TIMEOUT_MS
110
32
  });
@@ -160,7 +82,7 @@ var GitHubProvider = class {
160
82
  async getIssue(number) {
161
83
  const fields = "number,title,body,labels,author,createdAt";
162
84
  const args = ["issue", "view", String(number), "--json", fields];
163
- logger2.debug("Getting issue", { repo: this.repo, number });
85
+ logger.debug("Getting issue", { repo: this.repo, number });
164
86
  const result = await execGh(args, this.repo);
165
87
  if (!result.ok) return result;
166
88
  try {
@@ -184,7 +106,7 @@ var GitHubProvider = class {
184
106
  args.push("--state", filters.state);
185
107
  }
186
108
  args.push("--limit", String(filters?.limit ?? 50));
187
- logger2.debug("Listing issues", { repo: this.repo, filters });
109
+ logger.debug("Listing issues", { repo: this.repo, filters });
188
110
  const result = await execGh(args, this.repo);
189
111
  if (!result.ok) return result;
190
112
  try {
@@ -201,7 +123,7 @@ var GitHubProvider = class {
201
123
  }
202
124
  async addLabels(issueNumber, labels) {
203
125
  const args = ["issue", "edit", String(issueNumber), "--add-label", labels.join(",")];
204
- logger2.debug("Adding labels", { repo: this.repo, issueNumber, labels });
126
+ logger.debug("Adding labels", { repo: this.repo, issueNumber, labels });
205
127
  const result = await execGh(args, this.repo);
206
128
  if (!result.ok) return result;
207
129
  return ok(void 0);
@@ -222,7 +144,7 @@ var GitHubProvider = class {
222
144
  "--json",
223
145
  fields
224
146
  ];
225
- logger2.info("Creating PR", { repo: this.repo, title: options.title });
147
+ logger.info("Creating PR", { repo: this.repo, title: options.title });
226
148
  const result = await execGh(args, this.repo);
227
149
  if (!result.ok) return result;
228
150
  try {
@@ -251,7 +173,7 @@ var GitHubProvider = class {
251
173
  if (options?.commitTitle !== void 0) args.push("--subject", options.commitTitle);
252
174
  if (options?.commitMessage !== void 0) args.push("--body", options.commitMessage);
253
175
  if (options?.deleteBranch === true) args.push("--delete-branch");
254
- logger2.info("Merging PR", { repo: this.repo, prNumber, method });
176
+ logger.info("Merging PR", { repo: this.repo, prNumber, method });
255
177
  const result = await execGh(args, this.repo);
256
178
  if (!result.ok) return result;
257
179
  return ok(void 0);
@@ -259,7 +181,7 @@ var GitHubProvider = class {
259
181
  async getPRStatus(prNumber) {
260
182
  const fields = "mergeable,statusCheckRollup,reviewDecision";
261
183
  const args = ["pr", "view", String(prNumber), "--json", fields];
262
- logger2.debug("Getting PR status", { repo: this.repo, prNumber });
184
+ logger.debug("Getting PR status", { repo: this.repo, prNumber });
263
185
  const result = await execGh(args, this.repo);
264
186
  if (!result.ok) return result;
265
187
  try {
@@ -276,7 +198,7 @@ var GitHubProvider = class {
276
198
  async createIssue(title, body, labels) {
277
199
  const args = ["issue", "create", "--title", title, "--body", body];
278
200
  if (labels !== void 0 && labels.length > 0) args.push("--label", labels.join(","));
279
- logger2.debug("Creating issue", { repo: this.repo, title });
201
+ logger.debug("Creating issue", { repo: this.repo, title });
280
202
  const result = await execGh(args, this.repo);
281
203
  if (!result.ok) return result;
282
204
  const url = result.value.trim();
@@ -293,14 +215,14 @@ var GitHubProvider = class {
293
215
  }
294
216
  async addComment(issueNumber, body) {
295
217
  const args = ["issue", "comment", String(issueNumber), "--body", body];
296
- logger2.debug("Adding comment", { repo: this.repo, issueNumber });
218
+ logger.debug("Adding comment", { repo: this.repo, issueNumber });
297
219
  const result = await execGh(args, this.repo);
298
220
  if (!result.ok) return result;
299
221
  return ok(void 0);
300
222
  }
301
223
  async listComments(issueNumber) {
302
224
  const args = ["issue", "view", String(issueNumber), "--json", "comments", "--jq", ".comments"];
303
- logger2.debug("Listing comments", { repo: this.repo, issueNumber });
225
+ logger.debug("Listing comments", { repo: this.repo, issueNumber });
304
226
  const result = await execGh(args, this.repo);
305
227
  if (!result.ok) return result;
306
228
  try {
@@ -318,10 +240,7 @@ var GitHubProvider = class {
318
240
  };
319
241
 
320
242
  export {
321
- resolveToken,
322
- hasToken,
323
- getTokenEnvVars,
324
243
  ScmError,
325
244
  GitHubProvider
326
245
  };
327
- //# sourceMappingURL=chunk-7F6HYUIY.js.map
246
+ //# sourceMappingURL=chunk-EPMBGZQX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/scm/types.ts","../src/scm/github-provider.ts"],"sourcesContent":["/**\n * nexus-agents/scm - SCM Provider Types\n *\n * Shared types for the centralized SCM (Source Control Management) module.\n * Supports GitHub (REST API + gh CLI) with extensibility for GitLab/Gitea.\n *\n * @module scm/types\n * (Source: Issue #1136 — Centralized SCM Provider Module)\n */\n\nimport type { Result } from '../core/index.js';\n\n// ============================================================================\n// Token Types\n// ============================================================================\n\n/** Supported SCM platforms. */\nexport type ScmPlatform = 'github' | 'gitlab' | 'gitea';\n\n/** Token resolution strategy. */\nexport type TokenStrategy = 'env' | 'cli' | 'config';\n\n/** Resolved SCM token with metadata. */\nexport interface ScmToken {\n /** The raw token value */\n readonly value: string;\n /** How the token was resolved */\n readonly strategy: TokenStrategy;\n /** SCM platform this token is for */\n readonly platform: ScmPlatform;\n}\n\n/** Token resolution configuration. */\nexport interface TokenResolverConfig {\n /** Explicit token (highest priority) */\n readonly token?: string;\n /** SCM platform to resolve for */\n readonly platform?: ScmPlatform;\n /** Custom env var name override */\n readonly envVar?: string;\n}\n\n// ============================================================================\n// SCM Entity Types\n// ============================================================================\n\n/** SCM issue representation. */\nexport interface ScmIssue {\n readonly number: number;\n readonly title: string;\n readonly body: string;\n readonly labels: readonly string[];\n readonly author: string;\n readonly createdAt: string;\n}\n\n/** SCM pull/merge request representation. */\nexport interface ScmPullRequest {\n readonly number: number;\n readonly title: string;\n readonly body: string;\n readonly author: string;\n readonly base: string;\n readonly head: string;\n readonly url: string;\n}\n\n/** SCM comment representation. */\nexport interface ScmComment {\n readonly id: number;\n readonly body: string;\n readonly author: string;\n readonly createdAt: string;\n}\n\n/** PR creation options. */\nexport interface CreatePROptions {\n readonly title: string;\n readonly body: string;\n readonly head: string;\n readonly base: string;\n}\n\n/** PR merge options. */\nexport interface MergePROptions {\n readonly method?: 'merge' | 'squash' | 'rebase';\n readonly commitTitle?: string;\n readonly commitMessage?: string;\n readonly deleteBranch?: boolean;\n}\n\n/** PR status for merge eligibility. */\nexport interface PRStatus {\n readonly mergeable: boolean;\n readonly checksStatus: 'pending' | 'success' | 'failure';\n readonly reviewStatus: 'approved' | 'pending' | 'changes_requested';\n}\n\n/** Issue filter options. */\nexport interface IssueFilters {\n readonly labels?: readonly string[];\n readonly state?: 'open' | 'closed' | 'all';\n readonly limit?: number;\n}\n\n// ============================================================================\n// SCM Error\n// ============================================================================\n\n/** Unified SCM error with platform-aware context. */\nexport class ScmError extends Error {\n constructor(\n message: string,\n readonly platform: ScmPlatform,\n readonly statusCode?: number,\n readonly context?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'ScmError';\n }\n}\n\n// ============================================================================\n// Extended Entity Types (Trait support)\n// ============================================================================\n\n/** File change in a pull request. */\nexport interface ScmFileChange {\n readonly filename: string;\n readonly status: 'added' | 'removed' | 'modified' | 'renamed' | 'copied';\n readonly additions: number;\n readonly deletions: number;\n readonly patch?: string;\n readonly previousFilename?: string;\n}\n\n/** Extended PR with file diffs and stats. Used by IScmReviewer. */\nexport interface ScmPullRequestDetail extends ScmPullRequest {\n readonly draft: boolean;\n readonly authorAssociation: string;\n readonly labels: readonly string[];\n readonly files: readonly ScmFileChange[];\n readonly additions: number;\n readonly deletions: number;\n readonly headSha: string;\n}\n\n/** Extended issue with association and state. Used by IScmReviewer. */\nexport interface ScmIssueDetail extends ScmIssue {\n readonly authorAssociation: string;\n readonly state: string;\n readonly url: string;\n}\n\n/** Extended comment with author association. */\nexport interface ScmCommentDetail extends ScmComment {\n readonly authorAssociation: string;\n}\n\n/** Review decision for a pull request. */\nexport type ScmReviewDecision = 'approve' | 'request_changes' | 'comment';\n\n/** User metadata for reputation assessment. */\nexport interface ScmUserMetadata {\n readonly login: string;\n readonly name: string | null;\n readonly company: string | null;\n readonly followers: number;\n readonly following: number;\n readonly publicRepos: number;\n readonly createdAt: string;\n}\n\n// ============================================================================\n// Provider Interface (Core)\n// ============================================================================\n\n/**\n * Core SCM provider interface.\n *\n * All methods return `Result<T, ScmError>` for consistent error handling\n * across GitHub REST API, gh CLI, and future GitLab/Gitea backends.\n */\nexport interface IScmProvider {\n /** Platform identifier. */\n readonly platform: ScmPlatform;\n\n /** Repository in owner/repo format. */\n readonly repo: string;\n\n // Issues\n getIssue(number: number): Promise<Result<ScmIssue, ScmError>>;\n listIssues(filters?: IssueFilters): Promise<Result<readonly ScmIssue[], ScmError>>;\n createIssue(\n title: string,\n body: string,\n labels?: readonly string[]\n ): Promise<Result<ScmIssue, ScmError>>;\n addLabels(issueNumber: number, labels: readonly string[]): Promise<Result<void, ScmError>>;\n\n // Pull Requests\n createPR(options: CreatePROptions): Promise<Result<ScmPullRequest, ScmError>>;\n mergePR(prNumber: number, options?: MergePROptions): Promise<Result<void, ScmError>>;\n getPRStatus(prNumber: number): Promise<Result<PRStatus, ScmError>>;\n\n // Comments\n addComment(issueNumber: number, body: string): Promise<Result<void, ScmError>>;\n listComments(issueNumber: number): Promise<Result<readonly ScmComment[], ScmError>>;\n}\n\n// ============================================================================\n// Trait Interfaces (ISP — Interface Segregation Principle)\n// ============================================================================\n\n/**\n * Review trait — PR review capabilities.\n *\n * Implemented by platforms supporting code review workflows.\n * Consumers declare this trait when they need PR file diffs or review posting.\n */\nexport interface IScmReviewer {\n /** Fetch PR with full file diffs and stats. */\n getPullRequestDetail(prNumber: number): Promise<Result<ScmPullRequestDetail, ScmError>>;\n\n /** Post a review on a pull request. */\n createReview(\n prNumber: number,\n body: string,\n decision: ScmReviewDecision\n ): Promise<Result<void, ScmError>>;\n\n /** Fetch issue with author association and state. */\n getIssueDetail(issueNumber: number): Promise<Result<ScmIssueDetail, ScmError>>;\n\n /** List comments with author associations. */\n listCommentDetails(issueNumber: number): Promise<Result<readonly ScmCommentDetail[], ScmError>>;\n}\n\n/**\n * User info trait — user metadata for reputation assessment.\n *\n * Implemented by platforms supporting user profile queries.\n * Consumers declare this trait when they need author reputation data.\n */\nexport interface IScmUserInfo {\n /** Fetch user metadata for reputation assessment. */\n fetchUserMetadata(username: string): Promise<Result<ScmUserMetadata, ScmError>>;\n}\n\n/**\n * Convenience type: provider with review capabilities.\n * Used by PR review workflows.\n */\nexport type ReviewCapableProvider = IScmProvider & IScmReviewer;\n\n/**\n * Convenience type: provider with all capabilities.\n * Used by full triage workflows that need review + user info.\n */\nexport type FullCapableProvider = IScmProvider & IScmReviewer & IScmUserInfo;\n","/**\n * nexus-agents/scm - GitHub Provider\n *\n * Unified GitHub provider using gh CLI. Implements IScmProvider with\n * Result-based error handling. Consolidates the two previous GitHub\n * clients (dogfooding/github-client.ts and workflows/self-development/github-client.ts).\n *\n * @module scm/github-provider\n * (Source: Issue #1136 — Centralized SCM Provider Module)\n */\n\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport type { Result } from '../core/index.js';\nimport { ok, err, createLogger, getErrorMessage } from '../core/index.js';\nimport type {\n IScmProvider,\n ScmIssue,\n ScmPullRequest,\n ScmComment,\n CreatePROptions,\n MergePROptions,\n PRStatus,\n IssueFilters,\n} from './types.js';\nimport { ScmError } from './types.js';\n\nconst execFileAsync = promisify(execFile);\nconst logger = createLogger({ component: 'GitHubProvider' });\n\n/** Max buffer for gh CLI output (10MB). */\nconst MAX_BUFFER = 10 * 1024 * 1024;\n\n/** gh CLI timeout in ms. */\nconst GH_TIMEOUT_MS = 30_000;\n\n// ============================================================================\n// gh CLI JSON types (internal)\n// ============================================================================\n\ninterface GhIssueJson {\n number: number;\n title: string;\n body: string | null;\n labels: Array<{ name: string }>;\n author: { login: string };\n createdAt: string;\n}\n\ninterface GhCommentJson {\n id: number;\n body: string;\n author: { login: string };\n createdAt: string;\n}\n\ninterface GhPrJson {\n number: number;\n title: string;\n body: string | null;\n url: string;\n author: { login: string };\n baseRefName: string;\n headRefName: string;\n}\n\ninterface GhPrStatusJson {\n mergeable: string;\n statusCheckRollup: Array<{ state: string }> | null;\n reviewDecision: string | null;\n}\n\n// ============================================================================\n// gh CLI executor\n// ============================================================================\n\nasync function execGh(args: readonly string[], repo: string): Promise<Result<string, ScmError>> {\n const fullArgs = [...args, '--repo', repo];\n\n try {\n const { stdout } = await execFileAsync('gh', fullArgs, {\n maxBuffer: MAX_BUFFER,\n timeout: GH_TIMEOUT_MS,\n });\n return ok(stdout.trim());\n } catch (error) {\n const execError = error as { message: string; stderr?: string };\n return err(\n new ScmError(`gh command failed: ${execError.message}`, 'github', undefined, {\n command: `gh ${fullArgs.join(' ')}`,\n stderr: execError.stderr,\n })\n );\n }\n}\n\n// ============================================================================\n// Mappers\n// ============================================================================\n\nfunction mapIssue(raw: GhIssueJson): ScmIssue {\n return {\n number: raw.number,\n title: raw.title,\n body: raw.body ?? '',\n labels: raw.labels.map((l) => l.name),\n author: raw.author.login,\n createdAt: raw.createdAt,\n };\n}\n\nfunction mapComment(raw: GhCommentJson): ScmComment {\n return {\n id: raw.id,\n body: raw.body,\n author: raw.author.login,\n createdAt: raw.createdAt,\n };\n}\n\nfunction mapPRStatus(raw: GhPrStatusJson): PRStatus {\n const mergeable = raw.mergeable === 'MERGEABLE';\n\n let checksStatus: 'pending' | 'success' | 'failure' = 'pending';\n if (raw.statusCheckRollup !== null && raw.statusCheckRollup.length > 0) {\n const hasFailure = raw.statusCheckRollup.some((c) => c.state === 'FAILURE');\n const allSuccess = raw.statusCheckRollup.every(\n (c) => c.state === 'SUCCESS' || c.state === 'NEUTRAL' || c.state === 'SKIPPED'\n );\n checksStatus = hasFailure ? 'failure' : allSuccess ? 'success' : 'pending';\n }\n\n let reviewStatus: 'approved' | 'pending' | 'changes_requested' = 'pending';\n if (raw.reviewDecision === 'APPROVED') reviewStatus = 'approved';\n else if (raw.reviewDecision === 'CHANGES_REQUESTED') reviewStatus = 'changes_requested';\n\n return { mergeable, checksStatus, reviewStatus };\n}\n\n// ============================================================================\n// Provider Implementation\n// ============================================================================\n\n/**\n * GitHub provider using the gh CLI.\n *\n * Requires: gh CLI installed and authenticated.\n */\nexport class GitHubProvider implements IScmProvider {\n readonly platform = 'github' as const;\n\n constructor(readonly repo: string) {}\n\n async getIssue(number: number): Promise<Result<ScmIssue, ScmError>> {\n const fields = 'number,title,body,labels,author,createdAt';\n const args = ['issue', 'view', String(number), '--json', fields];\n\n logger.debug('Getting issue', { repo: this.repo, number });\n const result = await execGh(args, this.repo);\n if (!result.ok) return result;\n\n try {\n return ok(mapIssue(JSON.parse(result.value) as GhIssueJson));\n } catch (error) {\n return err(\n new ScmError(\n `Failed to parse issue JSON: ${getErrorMessage(error)} — preview: ${result.value.slice(0, 120)}`,\n 'github'\n )\n );\n }\n }\n\n async listIssues(filters?: IssueFilters): Promise<Result<readonly ScmIssue[], ScmError>> {\n const fields = 'number,title,body,labels,author,createdAt';\n const args = ['issue', 'list', '--json', fields];\n\n if (filters?.labels !== undefined && filters.labels.length > 0) {\n args.push('--label', filters.labels.join(','));\n }\n if (filters?.state !== undefined) {\n args.push('--state', filters.state);\n }\n args.push('--limit', String(filters?.limit ?? 50));\n\n logger.debug('Listing issues', { repo: this.repo, filters });\n const result = await execGh(args, this.repo);\n if (!result.ok) return result;\n\n try {\n const issues = JSON.parse(result.value) as GhIssueJson[];\n return ok(issues.map(mapIssue));\n } catch (error) {\n return err(\n new ScmError(\n `Failed to parse issues JSON: ${getErrorMessage(error)} — preview: ${result.value.slice(0, 120)}`,\n 'github'\n )\n );\n }\n }\n\n async addLabels(issueNumber: number, labels: readonly string[]): Promise<Result<void, ScmError>> {\n const args = ['issue', 'edit', String(issueNumber), '--add-label', labels.join(',')];\n\n logger.debug('Adding labels', { repo: this.repo, issueNumber, labels });\n const result = await execGh(args, this.repo);\n if (!result.ok) return result;\n return ok(undefined);\n }\n\n async createPR(options: CreatePROptions): Promise<Result<ScmPullRequest, ScmError>> {\n const fields = 'number,title,body,url,author,baseRefName,headRefName';\n const args = [\n 'pr',\n 'create',\n '--title',\n options.title,\n '--body',\n options.body,\n '--head',\n options.head,\n '--base',\n options.base,\n '--json',\n fields,\n ];\n\n logger.info('Creating PR', { repo: this.repo, title: options.title });\n const result = await execGh(args, this.repo);\n if (!result.ok) return result;\n\n try {\n const raw = JSON.parse(result.value) as GhPrJson;\n return ok({\n number: raw.number,\n title: raw.title,\n body: raw.body ?? '',\n author: raw.author.login,\n base: raw.baseRefName,\n head: raw.headRefName,\n url: raw.url,\n });\n } catch (error) {\n return err(\n new ScmError(\n `Failed to parse PR JSON: ${getErrorMessage(error)} — preview: ${result.value.slice(0, 120)}`,\n 'github'\n )\n );\n }\n }\n\n async mergePR(prNumber: number, options?: MergePROptions): Promise<Result<void, ScmError>> {\n const method = options?.method ?? 'squash';\n const args = ['pr', 'merge', String(prNumber), `--${method}`];\n\n if (options?.commitTitle !== undefined) args.push('--subject', options.commitTitle);\n if (options?.commitMessage !== undefined) args.push('--body', options.commitMessage);\n if (options?.deleteBranch === true) args.push('--delete-branch');\n\n logger.info('Merging PR', { repo: this.repo, prNumber, method });\n const result = await execGh(args, this.repo);\n if (!result.ok) return result;\n return ok(undefined);\n }\n\n async getPRStatus(prNumber: number): Promise<Result<PRStatus, ScmError>> {\n const fields = 'mergeable,statusCheckRollup,reviewDecision';\n const args = ['pr', 'view', String(prNumber), '--json', fields];\n\n logger.debug('Getting PR status', { repo: this.repo, prNumber });\n const result = await execGh(args, this.repo);\n if (!result.ok) return result;\n\n try {\n return ok(mapPRStatus(JSON.parse(result.value) as GhPrStatusJson));\n } catch (error) {\n return err(\n new ScmError(\n `Failed to parse PR status JSON: ${getErrorMessage(error)} — preview: ${result.value.slice(0, 120)}`,\n 'github'\n )\n );\n }\n }\n\n async createIssue(\n title: string,\n body: string,\n labels?: readonly string[]\n ): Promise<Result<ScmIssue, ScmError>> {\n const args = ['issue', 'create', '--title', title, '--body', body];\n if (labels !== undefined && labels.length > 0) args.push('--label', labels.join(','));\n logger.debug('Creating issue', { repo: this.repo, title });\n const result = await execGh(args, this.repo);\n if (!result.ok) return result;\n const url = result.value.trim();\n const match = /\\/(\\d+)$/.exec(url);\n const number = match?.[1] !== undefined ? parseInt(match[1], 10) : 0;\n return ok({\n number,\n title,\n body,\n labels: labels !== undefined ? [...labels] : [],\n author: 'pipeline',\n createdAt: new Date().toISOString(),\n });\n }\n\n async addComment(issueNumber: number, body: string): Promise<Result<void, ScmError>> {\n const args = ['issue', 'comment', String(issueNumber), '--body', body];\n\n logger.debug('Adding comment', { repo: this.repo, issueNumber });\n const result = await execGh(args, this.repo);\n if (!result.ok) return result;\n return ok(undefined);\n }\n\n async listComments(issueNumber: number): Promise<Result<readonly ScmComment[], ScmError>> {\n const args = ['issue', 'view', String(issueNumber), '--json', 'comments', '--jq', '.comments'];\n\n logger.debug('Listing comments', { repo: this.repo, issueNumber });\n const result = await execGh(args, this.repo);\n if (!result.ok) return result;\n\n try {\n const comments = JSON.parse(result.value) as GhCommentJson[];\n return ok(comments.map(mapComment));\n } catch (error) {\n return err(\n new ScmError(\n `Failed to parse comments JSON: ${getErrorMessage(error)} — preview: ${result.value.slice(0, 120)}`,\n 'github'\n )\n );\n }\n }\n}\n"],"mappings":"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","names":[]}