@gitgov/core 2.2.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -5
- package/dist/src/{agent_runner-Cs5HXt4h.d.ts → agent_runner-D7JahEKk.d.ts} +7 -1198
- package/dist/src/fs.d.ts +28 -7
- package/dist/src/fs.js +57 -14
- package/dist/src/fs.js.map +1 -1
- package/dist/src/github.d.ts +2 -1
- package/dist/src/{index-D1RVufxB.d.ts → index-Bhc341pf.d.ts} +2 -65
- package/dist/src/index.d.ts +49 -58
- package/dist/src/index.js +5051 -5059
- package/dist/src/index.js.map +1 -1
- package/dist/src/memory.d.ts +20 -4
- package/dist/src/memory.js +22 -1
- package/dist/src/memory.js.map +1 -1
- package/dist/src/{memory_file_lister-CfHtByeZ.d.ts → memory_file_lister-C978PA8g.d.ts} +1 -1
- package/dist/src/prisma.d.ts +71 -0
- package/dist/src/prisma.js +67 -0
- package/dist/src/prisma.js.map +1 -0
- package/dist/src/record_projection.types-B8AM7u8U.d.ts +1207 -0
- package/dist/src/record_store-BXKWqon5.d.ts +64 -0
- package/package.json +5 -1
package/dist/src/memory.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { R as RecordStore
|
|
2
|
-
|
|
1
|
+
import { R as RecordStore } from './record_store-BXKWqon5.js';
|
|
2
|
+
import { C as ConfigStore, G as GitGovConfig, I as IGitModule, e as CommitInfo, E as ExecOptions, b as ExecResult, c as ChangedFile, d as GetCommitHistoryOptions, f as CommitAuthor } from './index-Bhc341pf.js';
|
|
3
|
+
export { M as MemoryFileListerOptions } from './index-Bhc341pf.js';
|
|
3
4
|
import { S as SessionStore, G as GitGovSession } from './key_provider-CRpHFGjN.js';
|
|
4
|
-
export { E as EnvKeyProvider, a as EnvKeyProviderOptions, c as MemoryFileLister, M as MockKeyProvider, b as MockKeyProviderOptions } from './memory_file_lister-
|
|
5
|
+
export { E as EnvKeyProvider, a as EnvKeyProviderOptions, c as MemoryFileLister, M as MockKeyProvider, b as MockKeyProviderOptions } from './memory_file_lister-C978PA8g.js';
|
|
6
|
+
import { a as IRecordProjection, b as IndexData, P as ProjectionContext } from './record_projection.types-B8AM7u8U.js';
|
|
5
7
|
|
|
6
8
|
/**
|
|
7
9
|
* Options for MemoryRecordStore
|
|
@@ -265,4 +267,18 @@ declare class MemoryGitModule implements IGitModule {
|
|
|
265
267
|
rebase(_targetBranch: string): Promise<void>;
|
|
266
268
|
}
|
|
267
269
|
|
|
268
|
-
|
|
270
|
+
/**
|
|
271
|
+
* MemoryRecordProjection - In-memory IRecordProjection for testing.
|
|
272
|
+
*
|
|
273
|
+
* Stores IndexData in a Map keyed by context.repoIdentifier.
|
|
274
|
+
* Used exclusively in tests to avoid filesystem I/O.
|
|
275
|
+
*/
|
|
276
|
+
declare class MemoryRecordProjection implements IRecordProjection {
|
|
277
|
+
private storage;
|
|
278
|
+
persist(data: IndexData, context: ProjectionContext): Promise<void>;
|
|
279
|
+
read(context: ProjectionContext): Promise<IndexData | null>;
|
|
280
|
+
exists(context: ProjectionContext): Promise<boolean>;
|
|
281
|
+
clear(context: ProjectionContext): Promise<void>;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
export { MemoryConfigStore, MemoryGitModule, MemoryRecordProjection, MemoryRecordStore, MemorySessionStore };
|
package/dist/src/memory.js
CHANGED
|
@@ -793,6 +793,27 @@ var MemoryGitModule = class {
|
|
|
793
793
|
}
|
|
794
794
|
};
|
|
795
795
|
|
|
796
|
-
|
|
796
|
+
// src/record_projection/memory/memory_record_projection.ts
|
|
797
|
+
var MemoryRecordProjection = class {
|
|
798
|
+
storage = /* @__PURE__ */ new Map();
|
|
799
|
+
async persist(data, context) {
|
|
800
|
+
const key = context.repoIdentifier ?? "__default__";
|
|
801
|
+
this.storage.set(key, data);
|
|
802
|
+
}
|
|
803
|
+
async read(context) {
|
|
804
|
+
const key = context.repoIdentifier ?? "__default__";
|
|
805
|
+
return this.storage.get(key) ?? null;
|
|
806
|
+
}
|
|
807
|
+
async exists(context) {
|
|
808
|
+
const key = context.repoIdentifier ?? "__default__";
|
|
809
|
+
return this.storage.has(key);
|
|
810
|
+
}
|
|
811
|
+
async clear(context) {
|
|
812
|
+
const key = context.repoIdentifier ?? "__default__";
|
|
813
|
+
this.storage.delete(key);
|
|
814
|
+
}
|
|
815
|
+
};
|
|
816
|
+
|
|
817
|
+
export { EnvKeyProvider, MemoryConfigStore, MemoryFileLister, MemoryGitModule, MemoryRecordProjection, MemoryRecordStore, MemorySessionStore, MockKeyProvider };
|
|
797
818
|
//# sourceMappingURL=memory.js.map
|
|
798
819
|
//# sourceMappingURL=memory.js.map
|
package/dist/src/memory.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/record_store/memory/memory_record_store.ts","../../src/config_store/memory/memory_config_store.ts","../../src/session_store/memory/memory_session_store.ts","../../src/key_provider/key_provider.ts","../../src/key_provider/memory/env_key_provider.ts","../../src/key_provider/memory/mock_key_provider.ts","../../src/file_lister/file_lister.errors.ts","../../src/file_lister/memory/memory_file_lister.ts","../../src/git/errors.ts","../../src/git/memory/memory_git_module.ts"],"names":[],"mappings":"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","file":"memory.js","sourcesContent":["import type { RecordStore } from '../record_store';\n\n/**\n * Options for MemoryRecordStore\n */\nexport interface MemoryRecordStoreOptions<T> {\n /** Initial data */\n initial?: Map<string, T>;\n\n /** Clone data on get/put (default: true) */\n deepClone?: boolean;\n}\n\n/**\n * MemoryRecordStore<T> - In-memory implementation of RecordStore<T>\n *\n * Designed for unit tests and scenarios without persistence.\n * By default, clones values on get/put to prevent accidental mutations.\n *\n * @example\n * // Test setup\n * const store = new MemoryRecordStore<TaskRecord>();\n * await store.put('test-task-1', mockTask);\n *\n * // Assertions\n * expect(await store.exists('test-task-1')).toBe(true);\n * expect(store.size()).toBe(1);\n *\n * // Cleanup\n * store.clear();\n */\nexport class MemoryRecordStore<T> implements RecordStore<T> {\n private readonly data: Map<string, T>;\n private readonly deepClone: boolean;\n\n constructor(options: MemoryRecordStoreOptions<T> = {}) {\n this.data = options.initial ?? new Map();\n this.deepClone = options.deepClone ?? true;\n }\n\n private clone(value: T): T {\n if (!this.deepClone) return value;\n return JSON.parse(JSON.stringify(value));\n }\n\n async get(id: string): Promise<T | null> {\n const value = this.data.get(id);\n return value !== undefined ? this.clone(value) : null;\n }\n\n async put(id: string, value: T): Promise<void> {\n this.data.set(id, this.clone(value));\n }\n\n async putMany(entries: Array<{ id: string; value: T }>): Promise<void> {\n for (const { id, value } of entries) {\n await this.put(id, value);\n }\n }\n\n async delete(id: string): Promise<void> {\n this.data.delete(id);\n }\n\n async list(): Promise<string[]> {\n return Array.from(this.data.keys());\n }\n\n async exists(id: string): Promise<boolean> {\n return this.data.has(id);\n }\n\n // ─────────────────────────────────────────────────────────\n // Test Helpers (not part of RecordStore<T>, only for tests)\n // ─────────────────────────────────────────────────────────\n\n /** Clears all records from the store */\n clear(): void {\n this.data.clear();\n }\n\n /** Returns the number of records */\n size(): number {\n return this.data.size;\n }\n\n /** Returns a copy of the internal Map (for assertions) */\n getAll(): Map<string, T> {\n return new Map(this.data);\n }\n}\n","/**\n * MemoryConfigStore - In-memory implementation of ConfigStore\n *\n * Useful for testing and serverless environments where filesystem\n * access is not available or not desired.\n *\n * NOTE: Session state is handled by MemorySessionStore, not this class.\n */\n\nimport type { ConfigStore } from '../config_store';\nimport type { GitGovConfig } from '../../config_manager';\n\n/**\n * In-memory ConfigStore implementation for tests.\n *\n * Stores configuration in memory without filesystem I/O.\n * Provides methods to pre-populate data for testing scenarios.\n *\n * @example\n * ```typescript\n * const configStore = new MemoryConfigStore();\n * const sessionStore = new MemorySessionStore();\n *\n * // Pre-populate for testing\n * configStore.setConfig({\n * protocolVersion: '1.0',\n * projectId: 'test-project',\n * projectName: 'Test Project',\n * rootCycle: '1234567890-cycle-test'\n * });\n *\n * // Use in ConfigManager\n * const manager = new ConfigManager(configStore, sessionStore);\n * const config = await manager.loadConfig();\n * ```\n */\nexport class MemoryConfigStore implements ConfigStore {\n private config: GitGovConfig | null = null;\n\n /**\n * Load configuration from memory\n *\n * [EARS-A1] Returns null if no config set\n * [EARS-A2] Returns config set via setConfig\n * [EARS-A3] Returns config saved via saveConfig\n *\n * @returns GitGovConfig or null if not set\n */\n async loadConfig(): Promise<GitGovConfig | null> {\n return this.config;\n }\n\n /**\n * Save configuration to memory\n *\n * [EARS-A4] Persists config in memory, accessible via getConfig()\n */\n async saveConfig(config: GitGovConfig): Promise<void> {\n this.config = config;\n }\n\n // ==================== Test Helper Methods ====================\n\n /**\n * Set configuration directly (for test setup)\n *\n * [EARS-B1] Sets config synchronously, available via getConfig()\n * [EARS-B2] Accepts null to clear config\n */\n setConfig(config: GitGovConfig | null): void {\n this.config = config;\n }\n\n /**\n * Get current configuration (for test assertions)\n */\n getConfig(): GitGovConfig | null {\n return this.config;\n }\n\n /**\n * Clear all stored data (for test cleanup)\n *\n * [EARS-B3] Resets store to initial state (config = null)\n */\n clear(): void {\n this.config = null;\n }\n}\n","/**\n * MemorySessionStore - In-memory implementation of SessionStore\n *\n * Useful for testing and serverless environments where filesystem\n * access is not available or not desired.\n */\n\nimport type { SessionStore } from '../session_store';\nimport type { GitGovSession } from '../../session_manager';\n\n/**\n * In-memory SessionStore implementation for tests.\n *\n * Stores session state in memory without filesystem I/O.\n * Provides methods to pre-populate data for testing scenarios.\n *\n * @example\n * ```typescript\n * const store = new MemorySessionStore();\n *\n * // Pre-populate for testing\n * store.setSession({\n * lastSession: { actorId: 'human:test', timestamp: '2024-01-01T00:00:00Z' },\n * actorState: {}\n * });\n *\n * // Use in ConfigManager\n * const manager = new ConfigManager(configStore, store);\n * const session = await manager.loadSession();\n * ```\n */\nexport class MemorySessionStore implements SessionStore {\n private session: GitGovSession | null = null;\n private keyFiles: string[] = [];\n\n /**\n * Load session from memory\n * @returns GitGovSession or null if not set\n */\n async loadSession(): Promise<GitGovSession | null> {\n return this.session;\n }\n\n /**\n * Save session to memory\n */\n async saveSession(session: GitGovSession): Promise<void> {\n this.session = session;\n }\n\n /**\n * Detect actor from simulated .key files\n *\n * In MemorySessionStore, .key files are simulated via setKeyFiles().\n *\n * @returns Actor ID or null if no key files configured\n */\n async detectActorFromKeyFiles(): Promise<string | null> {\n const firstKeyFile = this.keyFiles[0];\n if (!firstKeyFile) {\n return null;\n }\n // Extract actor ID from filename (remove .key extension)\n return firstKeyFile.replace('.key', '');\n }\n\n // ==================== Test Helper Methods ====================\n\n /**\n * Set session directly (for test setup)\n */\n setSession(session: GitGovSession | null): void {\n this.session = session;\n }\n\n /**\n * Get current session (for test assertions)\n */\n getSession(): GitGovSession | null {\n return this.session;\n }\n\n /**\n * Set simulated .key files (for EARS-B9 testing)\n * @param keyFiles - Array of key filenames (e.g., [\"human:camilo.key\"])\n */\n setKeyFiles(keyFiles: string[]): void {\n this.keyFiles = keyFiles;\n }\n\n /**\n * Clear all stored data (for test cleanup)\n */\n clear(): void {\n this.session = null;\n this.keyFiles = [];\n }\n}\n","/**\n * KeyProvider Interface\n *\n * Abstracts private key storage for Actor signing operations.\n * Enables different backends: filesystem (development), environment variables (serverless),\n * or cloud KMS (enterprise).\n *\n * @module key_provider\n */\n\n/**\n * Error codes for KeyProvider operations.\n */\nexport type KeyProviderErrorCode =\n | 'KEY_NOT_FOUND'\n | 'KEY_READ_ERROR'\n | 'KEY_WRITE_ERROR'\n | 'KEY_DELETE_ERROR'\n | 'INVALID_KEY_FORMAT'\n | 'INVALID_ACTOR_ID';\n\n/**\n * Error thrown when key operations fail.\n */\nexport class KeyProviderError extends Error {\n constructor(\n message: string,\n public readonly code: KeyProviderErrorCode,\n public readonly actorId?: string\n ) {\n super(message);\n this.name = 'KeyProviderError';\n }\n}\n\n/**\n * Interface for managing private key storage.\n * Implementations handle the actual persistence mechanism.\n *\n * @example\n * ```typescript\n * // Filesystem backend (development)\n * const provider = new FsKeyProvider({ actorsDir: '.gitgov/actors' });\n *\n * // Environment backend (serverless)\n * const provider = new EnvKeyProvider({ prefix: 'GITGOV_KEY_' });\n *\n * // Usage\n * const privateKey = await provider.getPrivateKey('actor:human:alice');\n * if (privateKey) {\n * const signature = signPayload(payload, privateKey, actorId, role);\n * }\n * ```\n */\nexport interface KeyProvider {\n /**\n * Retrieves the private key for an actor.\n * @param actorId - The actor's ID (e.g., 'actor:human:alice')\n * @returns The base64-encoded private key, or null if not found\n */\n getPrivateKey(actorId: string): Promise<string | null>;\n\n /**\n * Stores a private key for an actor.\n * @param actorId - The actor's ID\n * @param privateKey - The base64-encoded private key\n * @throws KeyProviderError if write fails\n */\n setPrivateKey(actorId: string, privateKey: string): Promise<void>;\n\n /**\n * Checks if a private key exists for an actor.\n * @param actorId - The actor's ID\n * @returns true if key exists, false otherwise\n */\n hasPrivateKey(actorId: string): Promise<boolean>;\n\n /**\n * Deletes the private key for an actor.\n * @param actorId - The actor's ID\n * @returns true if key was deleted, false if it didn't exist\n */\n deletePrivateKey(actorId: string): Promise<boolean>;\n}\n","/**\n * EnvKeyProvider - Environment variable-based KeyProvider implementation\n *\n * Reads private keys from environment variables.\n * Used in serverless environments (Atlassian Forge, AWS Lambda, etc.) and CI/CD.\n *\n * @module key_provider/memory/env_key_provider\n */\n\nimport type { KeyProvider } from '../key_provider';\nimport { KeyProviderError } from '../key_provider';\n\n/**\n * Options for EnvKeyProvider.\n */\nexport interface EnvKeyProviderOptions {\n /** Prefix for environment variable names (default: 'GITGOV_KEY_') */\n prefix?: string;\n /** Environment object to read from (default: process.env) */\n env?: Record<string, string | undefined>;\n /** Allow writes to custom env object (default: false for process.env, true otherwise) */\n allowWrites?: boolean;\n}\n\n/**\n * Environment variable-based KeyProvider implementation.\n * Keys are read from environment variables with a configurable prefix.\n *\n * Variable naming: {prefix}{SANITIZED_ACTOR_ID}\n * Example: GITGOV_KEY_ACTOR_HUMAN_ALICE for actorId \"actor:human:alice\"\n *\n * @example\n * ```typescript\n * // Read from process.env (default, read-only)\n * const provider = new EnvKeyProvider({ prefix: 'GITGOV_KEY_' });\n *\n * // Read from custom env object (writable)\n * const customEnv = { GITGOV_KEY_ACTOR_BOT: 'base64key...' };\n * const provider = new EnvKeyProvider({ env: customEnv, allowWrites: true });\n * ```\n */\nexport class EnvKeyProvider implements KeyProvider {\n private readonly prefix: string;\n private readonly env: Record<string, string | undefined>;\n private readonly allowWrites: boolean;\n\n constructor(options: EnvKeyProviderOptions = {}) {\n this.prefix = options.prefix ?? 'GITGOV_KEY_';\n // [EARS-EKP12] Default to process.env, always allows reads\n this.env = options.env ?? process.env;\n // Default: allow writes only if using custom env object\n this.allowWrites = options.allowWrites ?? (options.env !== undefined);\n }\n\n /**\n * [EARS-KP01] Retrieves the private key from environment variable.\n * [EARS-EKP01] Reads from {prefix}{SANITIZED_ACTOR_ID}.\n * [EARS-EKP07] Returns null for empty or whitespace-only value.\n * [EARS-EKP08] Trims whitespace from value.\n */\n async getPrivateKey(actorId: string): Promise<string | null> {\n const varName = this.getEnvVarName(actorId);\n const value = this.env[varName];\n\n if (!value || value.trim() === '') {\n return null;\n }\n\n return value.trim();\n }\n\n /**\n * [EARS-KP03] Stores a private key in the environment object.\n * [EARS-EKP02] Sets env var in custom env object.\n * [EARS-EKP03] Throws KEY_WRITE_ERROR when writing to process.env.\n */\n async setPrivateKey(actorId: string, privateKey: string): Promise<void> {\n if (!this.allowWrites) {\n throw new KeyProviderError(\n 'Cannot write to environment variables in read-only mode. ' +\n 'Use a custom env object with allowWrites: true for writable storage.',\n 'KEY_WRITE_ERROR',\n actorId\n );\n }\n\n const varName = this.getEnvVarName(actorId);\n this.env[varName] = privateKey;\n }\n\n /**\n * Checks if a private key exists in environment variables.\n */\n async hasPrivateKey(actorId: string): Promise<boolean> {\n const varName = this.getEnvVarName(actorId);\n const value = this.env[varName];\n return value !== undefined && value.trim() !== '';\n }\n\n /**\n * [EARS-KP04] Deletes the private key from environment object.\n * [EARS-EKP10] Throws KEY_DELETE_ERROR in read-only mode.\n */\n async deletePrivateKey(actorId: string): Promise<boolean> {\n if (!this.allowWrites) {\n throw new KeyProviderError(\n 'Cannot delete environment variables in read-only mode.',\n 'KEY_DELETE_ERROR',\n actorId\n );\n }\n\n const varName = this.getEnvVarName(actorId);\n const existed = this.env[varName] !== undefined;\n delete this.env[varName];\n return existed;\n }\n\n /**\n * [EARS-EKP04] Builds environment variable name from actorId.\n * [EARS-EKP05] Converts to UPPERCASE.\n * [EARS-EKP06] Collapses multiple underscores.\n * [EARS-EKP11] Throws INVALID_ACTOR_ID if empty after sanitization.\n */\n private getEnvVarName(actorId: string): string {\n // Sanitize: replace non-alphanumeric with underscores, uppercase\n const sanitized = actorId\n .toUpperCase()\n .replace(/[^A-Z0-9]/g, '_')\n .replace(/_+/g, '_') // Collapse multiple underscores\n .replace(/^_|_$/g, ''); // Trim leading/trailing underscores\n\n // [EARS-EKP11] Throw if empty after sanitization\n if (!sanitized) {\n throw new KeyProviderError(\n 'Invalid actorId: empty after sanitization',\n 'INVALID_ACTOR_ID',\n actorId\n );\n }\n\n return `${this.prefix}${sanitized}`;\n }\n}\n","/**\n * MockKeyProvider - In-memory KeyProvider for testing\n *\n * Stores keys in a Map for unit testing without I/O.\n *\n * @module key_provider/memory/mock_key_provider\n */\n\nimport type { KeyProvider } from '../key_provider';\n\n/**\n * Options for MockKeyProvider.\n */\nexport interface MockKeyProviderOptions {\n /** Initial keys to populate (actorId -> privateKey) */\n keys?: Map<string, string> | Record<string, string>;\n}\n\n/**\n * In-memory KeyProvider for testing.\n * All operations use an internal Map, no I/O required.\n *\n * @example\n * ```typescript\n * // Empty provider\n * const provider = new MockKeyProvider();\n *\n * // Pre-populated provider\n * const provider = new MockKeyProvider({\n * keys: { 'actor:human:alice': 'base64key...' }\n * });\n *\n * // Use in tests\n * await provider.setPrivateKey('actor:bot:test', 'testkey');\n * const key = await provider.getPrivateKey('actor:bot:test');\n * ```\n */\nexport class MockKeyProvider implements KeyProvider {\n private readonly keys: Map<string, string>;\n\n constructor(options: MockKeyProviderOptions = {}) {\n if (options.keys instanceof Map) {\n this.keys = new Map(options.keys);\n } else if (options.keys) {\n this.keys = new Map(Object.entries(options.keys));\n } else {\n this.keys = new Map();\n }\n }\n\n /**\n * [EARS-KP01] Retrieves the private key for an actor.\n */\n async getPrivateKey(actorId: string): Promise<string | null> {\n return this.keys.get(actorId) ?? null;\n }\n\n /**\n * [EARS-KP03] Stores a private key for an actor.\n * [EARS-MKP03] Overwrites existing key if present.\n */\n async setPrivateKey(actorId: string, privateKey: string): Promise<void> {\n this.keys.set(actorId, privateKey);\n }\n\n /**\n * [EARS-MKP07] Checks if a private key exists for an actor.\n */\n async hasPrivateKey(actorId: string): Promise<boolean> {\n return this.keys.has(actorId);\n }\n\n /**\n * [EARS-KP04] Deletes the private key for an actor.\n */\n async deletePrivateKey(actorId: string): Promise<boolean> {\n return this.keys.delete(actorId);\n }\n\n /**\n * [EARS-MKP04] Returns the number of stored keys (useful for testing).\n */\n size(): number {\n return this.keys.size;\n }\n\n /**\n * [EARS-MKP05] Clears all stored keys (useful for test cleanup).\n */\n clear(): void {\n this.keys.clear();\n }\n\n /**\n * [EARS-MKP06] Returns all stored actor IDs (useful for testing).\n */\n listActorIds(): string[] {\n return Array.from(this.keys.keys());\n }\n}\n","/**\n * Error codes for FileLister operations.\n */\nexport type FileListerErrorCode =\n | 'FILE_NOT_FOUND'\n | 'READ_ERROR'\n | 'PERMISSION_DENIED'\n | 'INVALID_PATH'\n | 'NETWORK_ERROR';\n\n/**\n * Error thrown when file operations fail.\n */\nexport class FileListerError extends Error {\n constructor(\n message: string,\n public readonly code: FileListerErrorCode,\n public readonly filePath?: string\n ) {\n super(message);\n this.name = 'FileListerError';\n }\n}\n","/**\n * MemoryFileLister - In-memory FileLister for testing\n *\n * Simulates filesystem operations using a Map.\n * Used for unit testing without actual I/O.\n *\n * @module file_lister/memory/memory_file_lister\n */\n\nimport picomatch from 'picomatch';\nimport type { FileLister, FileListOptions, FileStats, MemoryFileListerOptions } from '../file_lister';\nimport { FileListerError } from '../file_lister';\n\n/**\n * Matches file paths against multiple glob patterns using picomatch.\n */\nfunction matchPatterns(patterns: string[], filePaths: string[]): string[] {\n const isMatch = picomatch(patterns);\n return filePaths.filter(filePath => isMatch(filePath));\n}\n\n/**\n * Filters out files matching ignore patterns.\n */\nfunction filterIgnored(filePaths: string[], ignorePatterns: string[]): string[] {\n if (!ignorePatterns.length) return filePaths;\n const isIgnored = picomatch(ignorePatterns);\n return filePaths.filter(filePath => !isIgnored(filePath));\n}\n\n/**\n * In-memory FileLister for testing.\n * Simulates filesystem operations using a Map.\n *\n * @example\n * ```typescript\n * const lister = new MemoryFileLister({\n * files: new Map([\n * ['src/index.ts', 'export const x = 1;'],\n * ['README.md', '# Project'],\n * ])\n * });\n *\n * // Or with object syntax\n * const lister = new MemoryFileLister({\n * files: { 'src/index.ts': 'code...', 'README.md': '# Project' }\n * });\n *\n * const files = await lister.list(['**\\/*.ts']);\n * ```\n */\nexport class MemoryFileLister implements FileLister {\n private readonly files: Map<string, string>;\n private readonly stats: Map<string, FileStats>;\n\n /**\n * [EARS-MFL01] Constructs MemoryFileLister with provided files.\n */\n constructor(options: MemoryFileListerOptions = {}) {\n // [EARS-MFL01] Accept both Map and Record<string, string>\n if (options.files instanceof Map) {\n this.files = new Map(options.files);\n } else if (options.files) {\n this.files = new Map(Object.entries(options.files));\n } else {\n this.files = new Map();\n }\n this.stats = options.stats ?? new Map();\n }\n\n /**\n * [EARS-FL01] Lists files matching glob patterns.\n * [EARS-MFL02] Filters files using glob patterns.\n */\n async list(patterns: string[], options?: FileListOptions): Promise<string[]> {\n const allPaths = Array.from(this.files.keys());\n\n // [EARS-MFL02] Match patterns\n let matched = matchPatterns(patterns, allPaths);\n\n // Filter ignored patterns\n if (options?.ignore?.length) {\n matched = filterIgnored(matched, options.ignore);\n }\n\n return matched.sort();\n }\n\n /**\n * [EARS-FL02] Checks if a file exists.\n */\n async exists(filePath: string): Promise<boolean> {\n return this.files.has(filePath);\n }\n\n /**\n * [EARS-FL03] Reads file content as string.\n */\n async read(filePath: string): Promise<string> {\n const content = this.files.get(filePath);\n if (content === undefined) {\n throw new FileListerError(\n `File not found: ${filePath}`,\n 'FILE_NOT_FOUND',\n filePath\n );\n }\n return content;\n }\n\n /**\n * [EARS-FL04] Gets file statistics.\n * [EARS-MFL03] Generates stats from content if not explicitly provided.\n */\n async stat(filePath: string): Promise<FileStats> {\n if (!this.files.has(filePath)) {\n throw new FileListerError(\n `File not found: ${filePath}`,\n 'FILE_NOT_FOUND',\n filePath\n );\n }\n\n // Return explicit stats if provided\n const explicitStats = this.stats.get(filePath);\n if (explicitStats) {\n return explicitStats;\n }\n\n // [EARS-MFL03] Generate stats from content\n const content = this.files.get(filePath)!;\n return {\n size: content.length,\n mtime: Date.now(),\n isFile: true,\n };\n }\n\n // ============================================\n // Testing utilities\n // ============================================\n\n /**\n * [EARS-MFL04] Adds a file to the mock filesystem.\n */\n addFile(filePath: string, content: string): void {\n this.files.set(filePath, content);\n }\n\n /**\n * Removes a file from the mock filesystem.\n */\n removeFile(filePath: string): boolean {\n this.stats.delete(filePath);\n return this.files.delete(filePath);\n }\n\n /**\n * Returns the number of files.\n */\n size(): number {\n return this.files.size;\n }\n\n /**\n * Clears all files.\n */\n clear(): void {\n this.files.clear();\n this.stats.clear();\n }\n\n /**\n * Returns all file paths.\n */\n listPaths(): string[] {\n return Array.from(this.files.keys());\n }\n}\n","/**\n * Custom Error Classes for GitModule\n * \n * These errors provide typed exceptions for better error handling\n * and diagnostics in the Git module operations.\n */\n\n/**\n * Base error class for all Git-related errors\n */\nexport class GitError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'GitError';\n Object.setPrototypeOf(this, GitError.prototype);\n }\n}\n\n/**\n * Error thrown when a Git command fails\n */\nexport class GitCommandError extends GitError {\n public readonly stderr: string;\n public readonly stdout?: string | undefined;\n public readonly command?: string | undefined;\n\n constructor(message: string, stderr: string = '', command?: string | undefined, stdout?: string) {\n super(message);\n this.name = 'GitCommandError';\n this.stderr = stderr;\n this.stdout = stdout;\n this.command = command;\n Object.setPrototypeOf(this, GitCommandError.prototype);\n }\n}\n\n/**\n * Error thrown when a branch does not exist\n */\nexport class BranchNotFoundError extends GitError {\n public readonly branchName: string;\n\n constructor(branchName: string) {\n super(`Branch not found: ${branchName}`);\n this.name = 'BranchNotFoundError';\n this.branchName = branchName;\n Object.setPrototypeOf(this, BranchNotFoundError.prototype);\n }\n}\n\n/**\n * Error thrown when a file does not exist in a commit\n */\nexport class FileNotFoundError extends GitError {\n public readonly filePath: string;\n public readonly commitHash: string;\n\n constructor(filePath: string, commitHash: string) {\n super(`File not found: ${filePath} in commit ${commitHash}`);\n this.name = 'FileNotFoundError';\n this.filePath = filePath;\n this.commitHash = commitHash;\n Object.setPrototypeOf(this, FileNotFoundError.prototype);\n }\n}\n\n/**\n * Error thrown when a merge conflict occurs\n */\nexport class MergeConflictError extends GitError {\n public readonly conflictedFiles: string[];\n\n constructor(conflictedFiles: string[]) {\n super(`Merge conflict detected in ${conflictedFiles.length} file(s)`);\n this.name = 'MergeConflictError';\n this.conflictedFiles = conflictedFiles;\n Object.setPrototypeOf(this, MergeConflictError.prototype);\n }\n}\n\n/**\n * Error thrown when a rebase conflict occurs\n */\nexport class RebaseConflictError extends GitError {\n public readonly conflictedFiles: string[];\n\n constructor(conflictedFiles: string[]) {\n super(`Rebase conflict detected in ${conflictedFiles.length} file(s)`);\n this.name = 'RebaseConflictError';\n this.conflictedFiles = conflictedFiles;\n Object.setPrototypeOf(this, RebaseConflictError.prototype);\n }\n}\n\n/**\n * Error thrown when trying to continue/abort a rebase that is not in progress\n */\nexport class RebaseNotInProgressError extends GitError {\n constructor() {\n super('No rebase in progress');\n this.name = 'RebaseNotInProgressError';\n Object.setPrototypeOf(this, RebaseNotInProgressError.prototype);\n }\n}\n\n/**\n * Error thrown when trying to create a branch that already exists\n */\nexport class BranchAlreadyExistsError extends GitError {\n public readonly branchName: string;\n\n constructor(branchName: string) {\n super(`Branch already exists: ${branchName}`);\n this.name = 'BranchAlreadyExistsError';\n this.branchName = branchName;\n Object.setPrototypeOf(this, BranchAlreadyExistsError.prototype);\n }\n}\n\n","/**\n * MemoryGitModule - In-memory Git implementation for tests\n *\n * This module provides a mock implementation of IGitModule for unit testing.\n * All state is kept in memory with no filesystem operations.\n *\n * Test Helpers:\n * - setBranch(name): Set current branch\n * - setCommits(commits[]): Set commit history\n * - setFiles(files): Set file contents\n * - clear(): Reset all state\n *\n * @module git/memory\n */\n\nimport type { IGitModule } from '..';\nimport type {\n ExecOptions,\n ExecResult,\n GetCommitHistoryOptions,\n CommitInfo,\n ChangedFile,\n CommitAuthor,\n} from '../types';\nimport {\n BranchNotFoundError,\n BranchAlreadyExistsError,\n FileNotFoundError,\n RebaseNotInProgressError,\n} from '../errors';\n\ninterface MemoryCommit {\n hash: string;\n message: string;\n author: string;\n date: string;\n files: Map<string, string>;\n branch: string;\n}\n\ninterface MemoryGitState {\n repoRoot: string;\n currentBranch: string;\n branches: Set<string>;\n commits: MemoryCommit[];\n stagedFiles: string[];\n files: Map<string, string>;\n isRebaseInProgress: boolean;\n conflictedFiles: string[];\n remotes: Map<string, string[]>; // remote -> branches\n stashes: Array<{ hash: string; message: string; files: Map<string, string> }>;\n config: Map<string, string>;\n}\n\n/**\n * MemoryGitModule - In-memory Git mock for unit tests\n */\nexport class MemoryGitModule implements IGitModule {\n private state: MemoryGitState;\n\n constructor(repoRoot: string = '/test/repo') {\n this.state = {\n repoRoot,\n currentBranch: 'main',\n branches: new Set(['main']),\n commits: [],\n stagedFiles: [],\n files: new Map(),\n isRebaseInProgress: false,\n conflictedFiles: [],\n remotes: new Map([['origin', ['main']]]),\n stashes: [],\n config: new Map(),\n };\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // TEST HELPERS\n // ═══════════════════════════════════════════════════════════════════════\n\n setBranch(name: string): void {\n this.state.currentBranch = name;\n this.state.branches.add(name);\n }\n\n setBranches(names: string[]): void {\n this.state.branches = new Set(names);\n if (!this.state.branches.has(this.state.currentBranch)) {\n this.state.currentBranch = names[0] || 'main';\n }\n }\n\n setCommits(commits: CommitInfo[]): void {\n this.state.commits = commits.map((c) => ({\n ...c,\n files: new Map(),\n branch: this.state.currentBranch,\n }));\n }\n\n setFiles(files: Record<string, string>): void {\n this.state.files = new Map(Object.entries(files));\n }\n\n setFileContent(commitHash: string, filePath: string, content: string): void {\n const commit = this.state.commits.find((c) => c.hash === commitHash);\n if (commit) {\n commit.files.set(filePath, content);\n }\n this.state.files.set(filePath, content);\n }\n\n setStagedFiles(files: string[]): void {\n this.state.stagedFiles = files;\n }\n\n setRebaseInProgress(inProgress: boolean, conflictedFiles: string[] = []): void {\n this.state.isRebaseInProgress = inProgress;\n this.state.conflictedFiles = conflictedFiles;\n }\n\n setRemoteBranches(remote: string, branches: string[]): void {\n this.state.remotes.set(remote, branches);\n }\n\n clear(): void {\n this.state = {\n repoRoot: this.state.repoRoot,\n currentBranch: 'main',\n branches: new Set(['main']),\n commits: [],\n stagedFiles: [],\n files: new Map(),\n isRebaseInProgress: false,\n conflictedFiles: [],\n remotes: new Map([['origin', ['main']]]),\n stashes: [],\n config: new Map(),\n };\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // IGitModule IMPLEMENTATION\n // ═══════════════════════════════════════════════════════════════════════\n\n async exec(\n _command: string,\n _args: string[],\n _options?: ExecOptions\n ): Promise<ExecResult> {\n // Memory module doesn't support arbitrary commands\n return { exitCode: 0, stdout: '', stderr: '' };\n }\n\n async init(): Promise<void> {\n this.state.branches.add('main');\n this.state.currentBranch = 'main';\n }\n\n async getRepoRoot(): Promise<string> {\n return this.state.repoRoot;\n }\n\n async getCurrentBranch(): Promise<string> {\n return this.state.currentBranch;\n }\n\n async getCommitHash(ref: string = 'HEAD'): Promise<string> {\n if (ref === 'HEAD') {\n const lastCommit = this.state.commits[this.state.commits.length - 1];\n return lastCommit?.hash || 'abc123def456';\n }\n const commit = this.state.commits.find((c) => c.hash.startsWith(ref));\n return commit?.hash || ref;\n }\n\n async setConfig(\n key: string,\n value: string,\n _scope?: 'local' | 'global' | 'system'\n ): Promise<void> {\n this.state.config.set(key, value);\n }\n\n async getMergeBase(branchA: string, branchB: string): Promise<string> {\n if (!this.state.branches.has(branchA)) {\n throw new BranchNotFoundError(branchA);\n }\n if (!this.state.branches.has(branchB)) {\n throw new BranchNotFoundError(branchB);\n }\n return this.state.commits[0]?.hash || 'merge-base-hash';\n }\n\n async getChangedFiles(\n _fromCommit: string,\n _toCommit: string,\n _pathFilter: string\n ): Promise<ChangedFile[]> {\n return [];\n }\n\n async getStagedFiles(): Promise<string[]> {\n return this.state.stagedFiles;\n }\n\n async getFileContent(commitHash: string, filePath: string): Promise<string> {\n const commit = this.state.commits.find((c) => c.hash === commitHash);\n if (commit?.files.has(filePath)) {\n return commit.files.get(filePath)!;\n }\n if (this.state.files.has(filePath)) {\n return this.state.files.get(filePath)!;\n }\n throw new FileNotFoundError(filePath, commitHash);\n }\n\n async getCommitHistory(\n _branch: string,\n options?: GetCommitHistoryOptions\n ): Promise<CommitInfo[]> {\n let commits = [...this.state.commits];\n if (options?.maxCount) {\n commits = commits.slice(0, options.maxCount);\n }\n return commits.map((c) => ({\n hash: c.hash,\n message: c.message,\n author: c.author,\n date: c.date,\n }));\n }\n\n async getCommitHistoryRange(\n fromHash: string,\n toHash: string,\n options?: GetCommitHistoryOptions\n ): Promise<CommitInfo[]> {\n const fromIndex = this.state.commits.findIndex((c) => c.hash === fromHash);\n const toIndex = this.state.commits.findIndex((c) => c.hash === toHash);\n\n let commits =\n fromIndex >= 0 && toIndex >= 0\n ? this.state.commits.slice(fromIndex + 1, toIndex + 1)\n : [];\n\n if (options?.maxCount) {\n commits = commits.slice(0, options.maxCount);\n }\n\n return commits.map((c) => ({\n hash: c.hash,\n message: c.message,\n author: c.author,\n date: c.date,\n }));\n }\n\n async getCommitMessage(commitHash: string): Promise<string> {\n const commit = this.state.commits.find((c) => c.hash === commitHash);\n return commit?.message || '';\n }\n\n async hasUncommittedChanges(_pathFilter?: string): Promise<boolean> {\n return this.state.stagedFiles.length > 0;\n }\n\n async isRebaseInProgress(): Promise<boolean> {\n return this.state.isRebaseInProgress;\n }\n\n async branchExists(branchName: string): Promise<boolean> {\n return this.state.branches.has(branchName);\n }\n\n async listRemoteBranches(remoteName: string): Promise<string[]> {\n return this.state.remotes.get(remoteName) || [];\n }\n\n async isRemoteConfigured(remoteName: string): Promise<boolean> {\n return this.state.remotes.has(remoteName);\n }\n\n async getBranchRemote(branchName: string): Promise<string | null> {\n if (!this.state.branches.has(branchName)) {\n throw new BranchNotFoundError(branchName);\n }\n // Check if any remote has this branch\n for (const [remote, branches] of this.state.remotes) {\n if (branches.includes(branchName)) {\n return remote;\n }\n }\n return null;\n }\n\n async getConflictedFiles(): Promise<string[]> {\n return this.state.conflictedFiles;\n }\n\n async checkoutBranch(branchName: string): Promise<void> {\n if (!this.state.branches.has(branchName)) {\n throw new BranchNotFoundError(branchName);\n }\n this.state.currentBranch = branchName;\n }\n\n async stash(message?: string): Promise<string | null> {\n if (this.state.stagedFiles.length === 0) {\n return null;\n }\n const hash = `stash-${Date.now()}`;\n this.state.stashes.push({\n hash,\n message: message || 'WIP',\n files: new Map(this.state.files),\n });\n this.state.stagedFiles = [];\n return hash;\n }\n\n async stashPop(): Promise<boolean> {\n const stash = this.state.stashes.pop();\n if (!stash) {\n return false;\n }\n for (const [path, content] of stash.files) {\n this.state.files.set(path, content);\n }\n return true;\n }\n\n async stashDrop(_stashHash?: string): Promise<void> {\n this.state.stashes.pop();\n }\n\n async checkoutOrphanBranch(branchName: string): Promise<void> {\n this.state.branches.add(branchName);\n this.state.currentBranch = branchName;\n }\n\n async fetch(_remote: string): Promise<void> {\n // No-op in memory\n }\n\n async pull(_remote: string, _branchName: string): Promise<void> {\n // No-op in memory\n }\n\n async pullRebase(_remote: string, _branchName: string): Promise<void> {\n // No-op in memory\n }\n\n async resetHard(_target: string): Promise<void> {\n this.state.stagedFiles = [];\n }\n\n async checkoutFilesFromBranch(\n sourceBranch: string,\n _filePaths: string[]\n ): Promise<void> {\n if (!this.state.branches.has(sourceBranch)) {\n throw new BranchNotFoundError(sourceBranch);\n }\n }\n\n async add(filePaths: string[], options?: { force?: boolean; contentMap?: Record<string, string> }): Promise<void> {\n for (const path of filePaths) {\n if (options?.contentMap?.[path] !== undefined) {\n this.state.files.set(path, options.contentMap[path]);\n }\n if (!this.state.stagedFiles.includes(path)) {\n this.state.stagedFiles.push(path);\n }\n }\n }\n\n async rm(filePaths: string[]): Promise<void> {\n for (const path of filePaths) {\n this.state.files.delete(path);\n this.state.stagedFiles = this.state.stagedFiles.filter((f) => f !== path);\n }\n }\n\n async commit(message: string, author?: CommitAuthor): Promise<string> {\n const hash = `commit-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n this.state.commits.push({\n hash,\n message,\n author: author ? `${author.name} <${author.email}>` : 'Test User <test@example.com>',\n date: new Date().toISOString(),\n files: new Map(this.state.files),\n branch: this.state.currentBranch,\n });\n this.state.stagedFiles = [];\n return hash;\n }\n\n async commitAllowEmpty(message: string, author?: CommitAuthor): Promise<string> {\n return this.commit(message, author);\n }\n\n async push(_remote: string, branchName: string): Promise<void> {\n // Add branch to remote\n const branches = this.state.remotes.get('origin') || [];\n if (!branches.includes(branchName)) {\n branches.push(branchName);\n this.state.remotes.set('origin', branches);\n }\n }\n\n async pushWithUpstream(_remote: string, branchName: string): Promise<void> {\n return this.push('origin', branchName);\n }\n\n async setUpstream(\n branchName: string,\n _remote: string,\n _remoteBranch: string\n ): Promise<void> {\n if (!this.state.branches.has(branchName)) {\n throw new BranchNotFoundError(branchName);\n }\n }\n\n async rebaseContinue(): Promise<string> {\n if (!this.state.isRebaseInProgress) {\n throw new RebaseNotInProgressError();\n }\n this.state.isRebaseInProgress = false;\n this.state.conflictedFiles = [];\n return this.state.commits[this.state.commits.length - 1]?.hash || 'rebase-hash';\n }\n\n async rebaseAbort(): Promise<void> {\n if (!this.state.isRebaseInProgress) {\n throw new RebaseNotInProgressError();\n }\n this.state.isRebaseInProgress = false;\n this.state.conflictedFiles = [];\n }\n\n async createBranch(branchName: string, _startPoint?: string): Promise<void> {\n if (this.state.branches.has(branchName)) {\n throw new BranchAlreadyExistsError(branchName);\n }\n this.state.branches.add(branchName);\n this.state.currentBranch = branchName;\n }\n\n async rebase(_targetBranch: string): Promise<void> {\n // No-op in memory, unless conflicts are set\n if (this.state.conflictedFiles.length > 0) {\n this.state.isRebaseInProgress = true;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/record_store/memory/memory_record_store.ts","../../src/config_store/memory/memory_config_store.ts","../../src/session_store/memory/memory_session_store.ts","../../src/key_provider/key_provider.ts","../../src/key_provider/memory/env_key_provider.ts","../../src/key_provider/memory/mock_key_provider.ts","../../src/file_lister/file_lister.errors.ts","../../src/file_lister/memory/memory_file_lister.ts","../../src/git/errors.ts","../../src/git/memory/memory_git_module.ts","../../src/record_projection/memory/memory_record_projection.ts"],"names":[],"mappings":"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","file":"memory.js","sourcesContent":["import type { RecordStore } from '../record_store';\n\n/**\n * Options for MemoryRecordStore\n */\nexport interface MemoryRecordStoreOptions<T> {\n /** Initial data */\n initial?: Map<string, T>;\n\n /** Clone data on get/put (default: true) */\n deepClone?: boolean;\n}\n\n/**\n * MemoryRecordStore<T> - In-memory implementation of RecordStore<T>\n *\n * Designed for unit tests and scenarios without persistence.\n * By default, clones values on get/put to prevent accidental mutations.\n *\n * @example\n * // Test setup\n * const store = new MemoryRecordStore<TaskRecord>();\n * await store.put('test-task-1', mockTask);\n *\n * // Assertions\n * expect(await store.exists('test-task-1')).toBe(true);\n * expect(store.size()).toBe(1);\n *\n * // Cleanup\n * store.clear();\n */\nexport class MemoryRecordStore<T> implements RecordStore<T> {\n private readonly data: Map<string, T>;\n private readonly deepClone: boolean;\n\n constructor(options: MemoryRecordStoreOptions<T> = {}) {\n this.data = options.initial ?? new Map();\n this.deepClone = options.deepClone ?? true;\n }\n\n private clone(value: T): T {\n if (!this.deepClone) return value;\n return JSON.parse(JSON.stringify(value));\n }\n\n async get(id: string): Promise<T | null> {\n const value = this.data.get(id);\n return value !== undefined ? this.clone(value) : null;\n }\n\n async put(id: string, value: T): Promise<void> {\n this.data.set(id, this.clone(value));\n }\n\n async putMany(entries: Array<{ id: string; value: T }>): Promise<void> {\n for (const { id, value } of entries) {\n await this.put(id, value);\n }\n }\n\n async delete(id: string): Promise<void> {\n this.data.delete(id);\n }\n\n async list(): Promise<string[]> {\n return Array.from(this.data.keys());\n }\n\n async exists(id: string): Promise<boolean> {\n return this.data.has(id);\n }\n\n // ─────────────────────────────────────────────────────────\n // Test Helpers (not part of RecordStore<T>, only for tests)\n // ─────────────────────────────────────────────────────────\n\n /** Clears all records from the store */\n clear(): void {\n this.data.clear();\n }\n\n /** Returns the number of records */\n size(): number {\n return this.data.size;\n }\n\n /** Returns a copy of the internal Map (for assertions) */\n getAll(): Map<string, T> {\n return new Map(this.data);\n }\n}\n","/**\n * MemoryConfigStore - In-memory implementation of ConfigStore\n *\n * Useful for testing and serverless environments where filesystem\n * access is not available or not desired.\n *\n * NOTE: Session state is handled by MemorySessionStore, not this class.\n */\n\nimport type { ConfigStore } from '../config_store';\nimport type { GitGovConfig } from '../../config_manager';\n\n/**\n * In-memory ConfigStore implementation for tests.\n *\n * Stores configuration in memory without filesystem I/O.\n * Provides methods to pre-populate data for testing scenarios.\n *\n * @example\n * ```typescript\n * const configStore = new MemoryConfigStore();\n * const sessionStore = new MemorySessionStore();\n *\n * // Pre-populate for testing\n * configStore.setConfig({\n * protocolVersion: '1.0',\n * projectId: 'test-project',\n * projectName: 'Test Project',\n * rootCycle: '1234567890-cycle-test'\n * });\n *\n * // Use in ConfigManager\n * const manager = new ConfigManager(configStore, sessionStore);\n * const config = await manager.loadConfig();\n * ```\n */\nexport class MemoryConfigStore implements ConfigStore {\n private config: GitGovConfig | null = null;\n\n /**\n * Load configuration from memory\n *\n * [EARS-A1] Returns null if no config set\n * [EARS-A2] Returns config set via setConfig\n * [EARS-A3] Returns config saved via saveConfig\n *\n * @returns GitGovConfig or null if not set\n */\n async loadConfig(): Promise<GitGovConfig | null> {\n return this.config;\n }\n\n /**\n * Save configuration to memory\n *\n * [EARS-A4] Persists config in memory, accessible via getConfig()\n */\n async saveConfig(config: GitGovConfig): Promise<void> {\n this.config = config;\n }\n\n // ==================== Test Helper Methods ====================\n\n /**\n * Set configuration directly (for test setup)\n *\n * [EARS-B1] Sets config synchronously, available via getConfig()\n * [EARS-B2] Accepts null to clear config\n */\n setConfig(config: GitGovConfig | null): void {\n this.config = config;\n }\n\n /**\n * Get current configuration (for test assertions)\n */\n getConfig(): GitGovConfig | null {\n return this.config;\n }\n\n /**\n * Clear all stored data (for test cleanup)\n *\n * [EARS-B3] Resets store to initial state (config = null)\n */\n clear(): void {\n this.config = null;\n }\n}\n","/**\n * MemorySessionStore - In-memory implementation of SessionStore\n *\n * Useful for testing and serverless environments where filesystem\n * access is not available or not desired.\n */\n\nimport type { SessionStore } from '../session_store';\nimport type { GitGovSession } from '../../session_manager';\n\n/**\n * In-memory SessionStore implementation for tests.\n *\n * Stores session state in memory without filesystem I/O.\n * Provides methods to pre-populate data for testing scenarios.\n *\n * @example\n * ```typescript\n * const store = new MemorySessionStore();\n *\n * // Pre-populate for testing\n * store.setSession({\n * lastSession: { actorId: 'human:test', timestamp: '2024-01-01T00:00:00Z' },\n * actorState: {}\n * });\n *\n * // Use in ConfigManager\n * const manager = new ConfigManager(configStore, store);\n * const session = await manager.loadSession();\n * ```\n */\nexport class MemorySessionStore implements SessionStore {\n private session: GitGovSession | null = null;\n private keyFiles: string[] = [];\n\n /**\n * Load session from memory\n * @returns GitGovSession or null if not set\n */\n async loadSession(): Promise<GitGovSession | null> {\n return this.session;\n }\n\n /**\n * Save session to memory\n */\n async saveSession(session: GitGovSession): Promise<void> {\n this.session = session;\n }\n\n /**\n * Detect actor from simulated .key files\n *\n * In MemorySessionStore, .key files are simulated via setKeyFiles().\n *\n * @returns Actor ID or null if no key files configured\n */\n async detectActorFromKeyFiles(): Promise<string | null> {\n const firstKeyFile = this.keyFiles[0];\n if (!firstKeyFile) {\n return null;\n }\n // Extract actor ID from filename (remove .key extension)\n return firstKeyFile.replace('.key', '');\n }\n\n // ==================== Test Helper Methods ====================\n\n /**\n * Set session directly (for test setup)\n */\n setSession(session: GitGovSession | null): void {\n this.session = session;\n }\n\n /**\n * Get current session (for test assertions)\n */\n getSession(): GitGovSession | null {\n return this.session;\n }\n\n /**\n * Set simulated .key files (for EARS-B9 testing)\n * @param keyFiles - Array of key filenames (e.g., [\"human:camilo.key\"])\n */\n setKeyFiles(keyFiles: string[]): void {\n this.keyFiles = keyFiles;\n }\n\n /**\n * Clear all stored data (for test cleanup)\n */\n clear(): void {\n this.session = null;\n this.keyFiles = [];\n }\n}\n","/**\n * KeyProvider Interface\n *\n * Abstracts private key storage for Actor signing operations.\n * Enables different backends: filesystem (development), environment variables (serverless),\n * or cloud KMS (enterprise).\n *\n * @module key_provider\n */\n\n/**\n * Error codes for KeyProvider operations.\n */\nexport type KeyProviderErrorCode =\n | 'KEY_NOT_FOUND'\n | 'KEY_READ_ERROR'\n | 'KEY_WRITE_ERROR'\n | 'KEY_DELETE_ERROR'\n | 'INVALID_KEY_FORMAT'\n | 'INVALID_ACTOR_ID';\n\n/**\n * Error thrown when key operations fail.\n */\nexport class KeyProviderError extends Error {\n constructor(\n message: string,\n public readonly code: KeyProviderErrorCode,\n public readonly actorId?: string\n ) {\n super(message);\n this.name = 'KeyProviderError';\n }\n}\n\n/**\n * Interface for managing private key storage.\n * Implementations handle the actual persistence mechanism.\n *\n * @example\n * ```typescript\n * // Filesystem backend (development)\n * const provider = new FsKeyProvider({ actorsDir: '.gitgov/actors' });\n *\n * // Environment backend (serverless)\n * const provider = new EnvKeyProvider({ prefix: 'GITGOV_KEY_' });\n *\n * // Usage\n * const privateKey = await provider.getPrivateKey('actor:human:alice');\n * if (privateKey) {\n * const signature = signPayload(payload, privateKey, actorId, role);\n * }\n * ```\n */\nexport interface KeyProvider {\n /**\n * Retrieves the private key for an actor.\n * @param actorId - The actor's ID (e.g., 'actor:human:alice')\n * @returns The base64-encoded private key, or null if not found\n */\n getPrivateKey(actorId: string): Promise<string | null>;\n\n /**\n * Stores a private key for an actor.\n * @param actorId - The actor's ID\n * @param privateKey - The base64-encoded private key\n * @throws KeyProviderError if write fails\n */\n setPrivateKey(actorId: string, privateKey: string): Promise<void>;\n\n /**\n * Checks if a private key exists for an actor.\n * @param actorId - The actor's ID\n * @returns true if key exists, false otherwise\n */\n hasPrivateKey(actorId: string): Promise<boolean>;\n\n /**\n * Deletes the private key for an actor.\n * @param actorId - The actor's ID\n * @returns true if key was deleted, false if it didn't exist\n */\n deletePrivateKey(actorId: string): Promise<boolean>;\n}\n","/**\n * EnvKeyProvider - Environment variable-based KeyProvider implementation\n *\n * Reads private keys from environment variables.\n * Used in serverless environments (Atlassian Forge, AWS Lambda, etc.) and CI/CD.\n *\n * @module key_provider/memory/env_key_provider\n */\n\nimport type { KeyProvider } from '../key_provider';\nimport { KeyProviderError } from '../key_provider';\n\n/**\n * Options for EnvKeyProvider.\n */\nexport interface EnvKeyProviderOptions {\n /** Prefix for environment variable names (default: 'GITGOV_KEY_') */\n prefix?: string;\n /** Environment object to read from (default: process.env) */\n env?: Record<string, string | undefined>;\n /** Allow writes to custom env object (default: false for process.env, true otherwise) */\n allowWrites?: boolean;\n}\n\n/**\n * Environment variable-based KeyProvider implementation.\n * Keys are read from environment variables with a configurable prefix.\n *\n * Variable naming: {prefix}{SANITIZED_ACTOR_ID}\n * Example: GITGOV_KEY_ACTOR_HUMAN_ALICE for actorId \"actor:human:alice\"\n *\n * @example\n * ```typescript\n * // Read from process.env (default, read-only)\n * const provider = new EnvKeyProvider({ prefix: 'GITGOV_KEY_' });\n *\n * // Read from custom env object (writable)\n * const customEnv = { GITGOV_KEY_ACTOR_BOT: 'base64key...' };\n * const provider = new EnvKeyProvider({ env: customEnv, allowWrites: true });\n * ```\n */\nexport class EnvKeyProvider implements KeyProvider {\n private readonly prefix: string;\n private readonly env: Record<string, string | undefined>;\n private readonly allowWrites: boolean;\n\n constructor(options: EnvKeyProviderOptions = {}) {\n this.prefix = options.prefix ?? 'GITGOV_KEY_';\n // [EARS-EKP12] Default to process.env, always allows reads\n this.env = options.env ?? process.env;\n // Default: allow writes only if using custom env object\n this.allowWrites = options.allowWrites ?? (options.env !== undefined);\n }\n\n /**\n * [EARS-KP01] Retrieves the private key from environment variable.\n * [EARS-EKP01] Reads from {prefix}{SANITIZED_ACTOR_ID}.\n * [EARS-EKP07] Returns null for empty or whitespace-only value.\n * [EARS-EKP08] Trims whitespace from value.\n */\n async getPrivateKey(actorId: string): Promise<string | null> {\n const varName = this.getEnvVarName(actorId);\n const value = this.env[varName];\n\n if (!value || value.trim() === '') {\n return null;\n }\n\n return value.trim();\n }\n\n /**\n * [EARS-KP03] Stores a private key in the environment object.\n * [EARS-EKP02] Sets env var in custom env object.\n * [EARS-EKP03] Throws KEY_WRITE_ERROR when writing to process.env.\n */\n async setPrivateKey(actorId: string, privateKey: string): Promise<void> {\n if (!this.allowWrites) {\n throw new KeyProviderError(\n 'Cannot write to environment variables in read-only mode. ' +\n 'Use a custom env object with allowWrites: true for writable storage.',\n 'KEY_WRITE_ERROR',\n actorId\n );\n }\n\n const varName = this.getEnvVarName(actorId);\n this.env[varName] = privateKey;\n }\n\n /**\n * Checks if a private key exists in environment variables.\n */\n async hasPrivateKey(actorId: string): Promise<boolean> {\n const varName = this.getEnvVarName(actorId);\n const value = this.env[varName];\n return value !== undefined && value.trim() !== '';\n }\n\n /**\n * [EARS-KP04] Deletes the private key from environment object.\n * [EARS-EKP10] Throws KEY_DELETE_ERROR in read-only mode.\n */\n async deletePrivateKey(actorId: string): Promise<boolean> {\n if (!this.allowWrites) {\n throw new KeyProviderError(\n 'Cannot delete environment variables in read-only mode.',\n 'KEY_DELETE_ERROR',\n actorId\n );\n }\n\n const varName = this.getEnvVarName(actorId);\n const existed = this.env[varName] !== undefined;\n delete this.env[varName];\n return existed;\n }\n\n /**\n * [EARS-EKP04] Builds environment variable name from actorId.\n * [EARS-EKP05] Converts to UPPERCASE.\n * [EARS-EKP06] Collapses multiple underscores.\n * [EARS-EKP11] Throws INVALID_ACTOR_ID if empty after sanitization.\n */\n private getEnvVarName(actorId: string): string {\n // Sanitize: replace non-alphanumeric with underscores, uppercase\n const sanitized = actorId\n .toUpperCase()\n .replace(/[^A-Z0-9]/g, '_')\n .replace(/_+/g, '_') // Collapse multiple underscores\n .replace(/^_|_$/g, ''); // Trim leading/trailing underscores\n\n // [EARS-EKP11] Throw if empty after sanitization\n if (!sanitized) {\n throw new KeyProviderError(\n 'Invalid actorId: empty after sanitization',\n 'INVALID_ACTOR_ID',\n actorId\n );\n }\n\n return `${this.prefix}${sanitized}`;\n }\n}\n","/**\n * MockKeyProvider - In-memory KeyProvider for testing\n *\n * Stores keys in a Map for unit testing without I/O.\n *\n * @module key_provider/memory/mock_key_provider\n */\n\nimport type { KeyProvider } from '../key_provider';\n\n/**\n * Options for MockKeyProvider.\n */\nexport interface MockKeyProviderOptions {\n /** Initial keys to populate (actorId -> privateKey) */\n keys?: Map<string, string> | Record<string, string>;\n}\n\n/**\n * In-memory KeyProvider for testing.\n * All operations use an internal Map, no I/O required.\n *\n * @example\n * ```typescript\n * // Empty provider\n * const provider = new MockKeyProvider();\n *\n * // Pre-populated provider\n * const provider = new MockKeyProvider({\n * keys: { 'actor:human:alice': 'base64key...' }\n * });\n *\n * // Use in tests\n * await provider.setPrivateKey('actor:bot:test', 'testkey');\n * const key = await provider.getPrivateKey('actor:bot:test');\n * ```\n */\nexport class MockKeyProvider implements KeyProvider {\n private readonly keys: Map<string, string>;\n\n constructor(options: MockKeyProviderOptions = {}) {\n if (options.keys instanceof Map) {\n this.keys = new Map(options.keys);\n } else if (options.keys) {\n this.keys = new Map(Object.entries(options.keys));\n } else {\n this.keys = new Map();\n }\n }\n\n /**\n * [EARS-KP01] Retrieves the private key for an actor.\n */\n async getPrivateKey(actorId: string): Promise<string | null> {\n return this.keys.get(actorId) ?? null;\n }\n\n /**\n * [EARS-KP03] Stores a private key for an actor.\n * [EARS-MKP03] Overwrites existing key if present.\n */\n async setPrivateKey(actorId: string, privateKey: string): Promise<void> {\n this.keys.set(actorId, privateKey);\n }\n\n /**\n * [EARS-MKP07] Checks if a private key exists for an actor.\n */\n async hasPrivateKey(actorId: string): Promise<boolean> {\n return this.keys.has(actorId);\n }\n\n /**\n * [EARS-KP04] Deletes the private key for an actor.\n */\n async deletePrivateKey(actorId: string): Promise<boolean> {\n return this.keys.delete(actorId);\n }\n\n /**\n * [EARS-MKP04] Returns the number of stored keys (useful for testing).\n */\n size(): number {\n return this.keys.size;\n }\n\n /**\n * [EARS-MKP05] Clears all stored keys (useful for test cleanup).\n */\n clear(): void {\n this.keys.clear();\n }\n\n /**\n * [EARS-MKP06] Returns all stored actor IDs (useful for testing).\n */\n listActorIds(): string[] {\n return Array.from(this.keys.keys());\n }\n}\n","/**\n * Error codes for FileLister operations.\n */\nexport type FileListerErrorCode =\n | 'FILE_NOT_FOUND'\n | 'READ_ERROR'\n | 'PERMISSION_DENIED'\n | 'INVALID_PATH'\n | 'NETWORK_ERROR';\n\n/**\n * Error thrown when file operations fail.\n */\nexport class FileListerError extends Error {\n constructor(\n message: string,\n public readonly code: FileListerErrorCode,\n public readonly filePath?: string\n ) {\n super(message);\n this.name = 'FileListerError';\n }\n}\n","/**\n * MemoryFileLister - In-memory FileLister for testing\n *\n * Simulates filesystem operations using a Map.\n * Used for unit testing without actual I/O.\n *\n * @module file_lister/memory/memory_file_lister\n */\n\nimport picomatch from 'picomatch';\nimport type { FileLister, FileListOptions, FileStats, MemoryFileListerOptions } from '../file_lister';\nimport { FileListerError } from '../file_lister';\n\n/**\n * Matches file paths against multiple glob patterns using picomatch.\n */\nfunction matchPatterns(patterns: string[], filePaths: string[]): string[] {\n const isMatch = picomatch(patterns);\n return filePaths.filter(filePath => isMatch(filePath));\n}\n\n/**\n * Filters out files matching ignore patterns.\n */\nfunction filterIgnored(filePaths: string[], ignorePatterns: string[]): string[] {\n if (!ignorePatterns.length) return filePaths;\n const isIgnored = picomatch(ignorePatterns);\n return filePaths.filter(filePath => !isIgnored(filePath));\n}\n\n/**\n * In-memory FileLister for testing.\n * Simulates filesystem operations using a Map.\n *\n * @example\n * ```typescript\n * const lister = new MemoryFileLister({\n * files: new Map([\n * ['src/index.ts', 'export const x = 1;'],\n * ['README.md', '# Project'],\n * ])\n * });\n *\n * // Or with object syntax\n * const lister = new MemoryFileLister({\n * files: { 'src/index.ts': 'code...', 'README.md': '# Project' }\n * });\n *\n * const files = await lister.list(['**\\/*.ts']);\n * ```\n */\nexport class MemoryFileLister implements FileLister {\n private readonly files: Map<string, string>;\n private readonly stats: Map<string, FileStats>;\n\n /**\n * [EARS-MFL01] Constructs MemoryFileLister with provided files.\n */\n constructor(options: MemoryFileListerOptions = {}) {\n // [EARS-MFL01] Accept both Map and Record<string, string>\n if (options.files instanceof Map) {\n this.files = new Map(options.files);\n } else if (options.files) {\n this.files = new Map(Object.entries(options.files));\n } else {\n this.files = new Map();\n }\n this.stats = options.stats ?? new Map();\n }\n\n /**\n * [EARS-FL01] Lists files matching glob patterns.\n * [EARS-MFL02] Filters files using glob patterns.\n */\n async list(patterns: string[], options?: FileListOptions): Promise<string[]> {\n const allPaths = Array.from(this.files.keys());\n\n // [EARS-MFL02] Match patterns\n let matched = matchPatterns(patterns, allPaths);\n\n // Filter ignored patterns\n if (options?.ignore?.length) {\n matched = filterIgnored(matched, options.ignore);\n }\n\n return matched.sort();\n }\n\n /**\n * [EARS-FL02] Checks if a file exists.\n */\n async exists(filePath: string): Promise<boolean> {\n return this.files.has(filePath);\n }\n\n /**\n * [EARS-FL03] Reads file content as string.\n */\n async read(filePath: string): Promise<string> {\n const content = this.files.get(filePath);\n if (content === undefined) {\n throw new FileListerError(\n `File not found: ${filePath}`,\n 'FILE_NOT_FOUND',\n filePath\n );\n }\n return content;\n }\n\n /**\n * [EARS-FL04] Gets file statistics.\n * [EARS-MFL03] Generates stats from content if not explicitly provided.\n */\n async stat(filePath: string): Promise<FileStats> {\n if (!this.files.has(filePath)) {\n throw new FileListerError(\n `File not found: ${filePath}`,\n 'FILE_NOT_FOUND',\n filePath\n );\n }\n\n // Return explicit stats if provided\n const explicitStats = this.stats.get(filePath);\n if (explicitStats) {\n return explicitStats;\n }\n\n // [EARS-MFL03] Generate stats from content\n const content = this.files.get(filePath)!;\n return {\n size: content.length,\n mtime: Date.now(),\n isFile: true,\n };\n }\n\n // ============================================\n // Testing utilities\n // ============================================\n\n /**\n * [EARS-MFL04] Adds a file to the mock filesystem.\n */\n addFile(filePath: string, content: string): void {\n this.files.set(filePath, content);\n }\n\n /**\n * Removes a file from the mock filesystem.\n */\n removeFile(filePath: string): boolean {\n this.stats.delete(filePath);\n return this.files.delete(filePath);\n }\n\n /**\n * Returns the number of files.\n */\n size(): number {\n return this.files.size;\n }\n\n /**\n * Clears all files.\n */\n clear(): void {\n this.files.clear();\n this.stats.clear();\n }\n\n /**\n * Returns all file paths.\n */\n listPaths(): string[] {\n return Array.from(this.files.keys());\n }\n}\n","/**\n * Custom Error Classes for GitModule\n * \n * These errors provide typed exceptions for better error handling\n * and diagnostics in the Git module operations.\n */\n\n/**\n * Base error class for all Git-related errors\n */\nexport class GitError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'GitError';\n Object.setPrototypeOf(this, GitError.prototype);\n }\n}\n\n/**\n * Error thrown when a Git command fails\n */\nexport class GitCommandError extends GitError {\n public readonly stderr: string;\n public readonly stdout?: string | undefined;\n public readonly command?: string | undefined;\n\n constructor(message: string, stderr: string = '', command?: string | undefined, stdout?: string) {\n super(message);\n this.name = 'GitCommandError';\n this.stderr = stderr;\n this.stdout = stdout;\n this.command = command;\n Object.setPrototypeOf(this, GitCommandError.prototype);\n }\n}\n\n/**\n * Error thrown when a branch does not exist\n */\nexport class BranchNotFoundError extends GitError {\n public readonly branchName: string;\n\n constructor(branchName: string) {\n super(`Branch not found: ${branchName}`);\n this.name = 'BranchNotFoundError';\n this.branchName = branchName;\n Object.setPrototypeOf(this, BranchNotFoundError.prototype);\n }\n}\n\n/**\n * Error thrown when a file does not exist in a commit\n */\nexport class FileNotFoundError extends GitError {\n public readonly filePath: string;\n public readonly commitHash: string;\n\n constructor(filePath: string, commitHash: string) {\n super(`File not found: ${filePath} in commit ${commitHash}`);\n this.name = 'FileNotFoundError';\n this.filePath = filePath;\n this.commitHash = commitHash;\n Object.setPrototypeOf(this, FileNotFoundError.prototype);\n }\n}\n\n/**\n * Error thrown when a merge conflict occurs\n */\nexport class MergeConflictError extends GitError {\n public readonly conflictedFiles: string[];\n\n constructor(conflictedFiles: string[]) {\n super(`Merge conflict detected in ${conflictedFiles.length} file(s)`);\n this.name = 'MergeConflictError';\n this.conflictedFiles = conflictedFiles;\n Object.setPrototypeOf(this, MergeConflictError.prototype);\n }\n}\n\n/**\n * Error thrown when a rebase conflict occurs\n */\nexport class RebaseConflictError extends GitError {\n public readonly conflictedFiles: string[];\n\n constructor(conflictedFiles: string[]) {\n super(`Rebase conflict detected in ${conflictedFiles.length} file(s)`);\n this.name = 'RebaseConflictError';\n this.conflictedFiles = conflictedFiles;\n Object.setPrototypeOf(this, RebaseConflictError.prototype);\n }\n}\n\n/**\n * Error thrown when trying to continue/abort a rebase that is not in progress\n */\nexport class RebaseNotInProgressError extends GitError {\n constructor() {\n super('No rebase in progress');\n this.name = 'RebaseNotInProgressError';\n Object.setPrototypeOf(this, RebaseNotInProgressError.prototype);\n }\n}\n\n/**\n * Error thrown when trying to create a branch that already exists\n */\nexport class BranchAlreadyExistsError extends GitError {\n public readonly branchName: string;\n\n constructor(branchName: string) {\n super(`Branch already exists: ${branchName}`);\n this.name = 'BranchAlreadyExistsError';\n this.branchName = branchName;\n Object.setPrototypeOf(this, BranchAlreadyExistsError.prototype);\n }\n}\n\n","/**\n * MemoryGitModule - In-memory Git implementation for tests\n *\n * This module provides a mock implementation of IGitModule for unit testing.\n * All state is kept in memory with no filesystem operations.\n *\n * Test Helpers:\n * - setBranch(name): Set current branch\n * - setCommits(commits[]): Set commit history\n * - setFiles(files): Set file contents\n * - clear(): Reset all state\n *\n * @module git/memory\n */\n\nimport type { IGitModule } from '..';\nimport type {\n ExecOptions,\n ExecResult,\n GetCommitHistoryOptions,\n CommitInfo,\n ChangedFile,\n CommitAuthor,\n} from '../types';\nimport {\n BranchNotFoundError,\n BranchAlreadyExistsError,\n FileNotFoundError,\n RebaseNotInProgressError,\n} from '../errors';\n\ninterface MemoryCommit {\n hash: string;\n message: string;\n author: string;\n date: string;\n files: Map<string, string>;\n branch: string;\n}\n\ninterface MemoryGitState {\n repoRoot: string;\n currentBranch: string;\n branches: Set<string>;\n commits: MemoryCommit[];\n stagedFiles: string[];\n files: Map<string, string>;\n isRebaseInProgress: boolean;\n conflictedFiles: string[];\n remotes: Map<string, string[]>; // remote -> branches\n stashes: Array<{ hash: string; message: string; files: Map<string, string> }>;\n config: Map<string, string>;\n}\n\n/**\n * MemoryGitModule - In-memory Git mock for unit tests\n */\nexport class MemoryGitModule implements IGitModule {\n private state: MemoryGitState;\n\n constructor(repoRoot: string = '/test/repo') {\n this.state = {\n repoRoot,\n currentBranch: 'main',\n branches: new Set(['main']),\n commits: [],\n stagedFiles: [],\n files: new Map(),\n isRebaseInProgress: false,\n conflictedFiles: [],\n remotes: new Map([['origin', ['main']]]),\n stashes: [],\n config: new Map(),\n };\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // TEST HELPERS\n // ═══════════════════════════════════════════════════════════════════════\n\n setBranch(name: string): void {\n this.state.currentBranch = name;\n this.state.branches.add(name);\n }\n\n setBranches(names: string[]): void {\n this.state.branches = new Set(names);\n if (!this.state.branches.has(this.state.currentBranch)) {\n this.state.currentBranch = names[0] || 'main';\n }\n }\n\n setCommits(commits: CommitInfo[]): void {\n this.state.commits = commits.map((c) => ({\n ...c,\n files: new Map(),\n branch: this.state.currentBranch,\n }));\n }\n\n setFiles(files: Record<string, string>): void {\n this.state.files = new Map(Object.entries(files));\n }\n\n setFileContent(commitHash: string, filePath: string, content: string): void {\n const commit = this.state.commits.find((c) => c.hash === commitHash);\n if (commit) {\n commit.files.set(filePath, content);\n }\n this.state.files.set(filePath, content);\n }\n\n setStagedFiles(files: string[]): void {\n this.state.stagedFiles = files;\n }\n\n setRebaseInProgress(inProgress: boolean, conflictedFiles: string[] = []): void {\n this.state.isRebaseInProgress = inProgress;\n this.state.conflictedFiles = conflictedFiles;\n }\n\n setRemoteBranches(remote: string, branches: string[]): void {\n this.state.remotes.set(remote, branches);\n }\n\n clear(): void {\n this.state = {\n repoRoot: this.state.repoRoot,\n currentBranch: 'main',\n branches: new Set(['main']),\n commits: [],\n stagedFiles: [],\n files: new Map(),\n isRebaseInProgress: false,\n conflictedFiles: [],\n remotes: new Map([['origin', ['main']]]),\n stashes: [],\n config: new Map(),\n };\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // IGitModule IMPLEMENTATION\n // ═══════════════════════════════════════════════════════════════════════\n\n async exec(\n _command: string,\n _args: string[],\n _options?: ExecOptions\n ): Promise<ExecResult> {\n // Memory module doesn't support arbitrary commands\n return { exitCode: 0, stdout: '', stderr: '' };\n }\n\n async init(): Promise<void> {\n this.state.branches.add('main');\n this.state.currentBranch = 'main';\n }\n\n async getRepoRoot(): Promise<string> {\n return this.state.repoRoot;\n }\n\n async getCurrentBranch(): Promise<string> {\n return this.state.currentBranch;\n }\n\n async getCommitHash(ref: string = 'HEAD'): Promise<string> {\n if (ref === 'HEAD') {\n const lastCommit = this.state.commits[this.state.commits.length - 1];\n return lastCommit?.hash || 'abc123def456';\n }\n const commit = this.state.commits.find((c) => c.hash.startsWith(ref));\n return commit?.hash || ref;\n }\n\n async setConfig(\n key: string,\n value: string,\n _scope?: 'local' | 'global' | 'system'\n ): Promise<void> {\n this.state.config.set(key, value);\n }\n\n async getMergeBase(branchA: string, branchB: string): Promise<string> {\n if (!this.state.branches.has(branchA)) {\n throw new BranchNotFoundError(branchA);\n }\n if (!this.state.branches.has(branchB)) {\n throw new BranchNotFoundError(branchB);\n }\n return this.state.commits[0]?.hash || 'merge-base-hash';\n }\n\n async getChangedFiles(\n _fromCommit: string,\n _toCommit: string,\n _pathFilter: string\n ): Promise<ChangedFile[]> {\n return [];\n }\n\n async getStagedFiles(): Promise<string[]> {\n return this.state.stagedFiles;\n }\n\n async getFileContent(commitHash: string, filePath: string): Promise<string> {\n const commit = this.state.commits.find((c) => c.hash === commitHash);\n if (commit?.files.has(filePath)) {\n return commit.files.get(filePath)!;\n }\n if (this.state.files.has(filePath)) {\n return this.state.files.get(filePath)!;\n }\n throw new FileNotFoundError(filePath, commitHash);\n }\n\n async getCommitHistory(\n _branch: string,\n options?: GetCommitHistoryOptions\n ): Promise<CommitInfo[]> {\n let commits = [...this.state.commits];\n if (options?.maxCount) {\n commits = commits.slice(0, options.maxCount);\n }\n return commits.map((c) => ({\n hash: c.hash,\n message: c.message,\n author: c.author,\n date: c.date,\n }));\n }\n\n async getCommitHistoryRange(\n fromHash: string,\n toHash: string,\n options?: GetCommitHistoryOptions\n ): Promise<CommitInfo[]> {\n const fromIndex = this.state.commits.findIndex((c) => c.hash === fromHash);\n const toIndex = this.state.commits.findIndex((c) => c.hash === toHash);\n\n let commits =\n fromIndex >= 0 && toIndex >= 0\n ? this.state.commits.slice(fromIndex + 1, toIndex + 1)\n : [];\n\n if (options?.maxCount) {\n commits = commits.slice(0, options.maxCount);\n }\n\n return commits.map((c) => ({\n hash: c.hash,\n message: c.message,\n author: c.author,\n date: c.date,\n }));\n }\n\n async getCommitMessage(commitHash: string): Promise<string> {\n const commit = this.state.commits.find((c) => c.hash === commitHash);\n return commit?.message || '';\n }\n\n async hasUncommittedChanges(_pathFilter?: string): Promise<boolean> {\n return this.state.stagedFiles.length > 0;\n }\n\n async isRebaseInProgress(): Promise<boolean> {\n return this.state.isRebaseInProgress;\n }\n\n async branchExists(branchName: string): Promise<boolean> {\n return this.state.branches.has(branchName);\n }\n\n async listRemoteBranches(remoteName: string): Promise<string[]> {\n return this.state.remotes.get(remoteName) || [];\n }\n\n async isRemoteConfigured(remoteName: string): Promise<boolean> {\n return this.state.remotes.has(remoteName);\n }\n\n async getBranchRemote(branchName: string): Promise<string | null> {\n if (!this.state.branches.has(branchName)) {\n throw new BranchNotFoundError(branchName);\n }\n // Check if any remote has this branch\n for (const [remote, branches] of this.state.remotes) {\n if (branches.includes(branchName)) {\n return remote;\n }\n }\n return null;\n }\n\n async getConflictedFiles(): Promise<string[]> {\n return this.state.conflictedFiles;\n }\n\n async checkoutBranch(branchName: string): Promise<void> {\n if (!this.state.branches.has(branchName)) {\n throw new BranchNotFoundError(branchName);\n }\n this.state.currentBranch = branchName;\n }\n\n async stash(message?: string): Promise<string | null> {\n if (this.state.stagedFiles.length === 0) {\n return null;\n }\n const hash = `stash-${Date.now()}`;\n this.state.stashes.push({\n hash,\n message: message || 'WIP',\n files: new Map(this.state.files),\n });\n this.state.stagedFiles = [];\n return hash;\n }\n\n async stashPop(): Promise<boolean> {\n const stash = this.state.stashes.pop();\n if (!stash) {\n return false;\n }\n for (const [path, content] of stash.files) {\n this.state.files.set(path, content);\n }\n return true;\n }\n\n async stashDrop(_stashHash?: string): Promise<void> {\n this.state.stashes.pop();\n }\n\n async checkoutOrphanBranch(branchName: string): Promise<void> {\n this.state.branches.add(branchName);\n this.state.currentBranch = branchName;\n }\n\n async fetch(_remote: string): Promise<void> {\n // No-op in memory\n }\n\n async pull(_remote: string, _branchName: string): Promise<void> {\n // No-op in memory\n }\n\n async pullRebase(_remote: string, _branchName: string): Promise<void> {\n // No-op in memory\n }\n\n async resetHard(_target: string): Promise<void> {\n this.state.stagedFiles = [];\n }\n\n async checkoutFilesFromBranch(\n sourceBranch: string,\n _filePaths: string[]\n ): Promise<void> {\n if (!this.state.branches.has(sourceBranch)) {\n throw new BranchNotFoundError(sourceBranch);\n }\n }\n\n async add(filePaths: string[], options?: { force?: boolean; contentMap?: Record<string, string> }): Promise<void> {\n for (const path of filePaths) {\n if (options?.contentMap?.[path] !== undefined) {\n this.state.files.set(path, options.contentMap[path]);\n }\n if (!this.state.stagedFiles.includes(path)) {\n this.state.stagedFiles.push(path);\n }\n }\n }\n\n async rm(filePaths: string[]): Promise<void> {\n for (const path of filePaths) {\n this.state.files.delete(path);\n this.state.stagedFiles = this.state.stagedFiles.filter((f) => f !== path);\n }\n }\n\n async commit(message: string, author?: CommitAuthor): Promise<string> {\n const hash = `commit-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n this.state.commits.push({\n hash,\n message,\n author: author ? `${author.name} <${author.email}>` : 'Test User <test@example.com>',\n date: new Date().toISOString(),\n files: new Map(this.state.files),\n branch: this.state.currentBranch,\n });\n this.state.stagedFiles = [];\n return hash;\n }\n\n async commitAllowEmpty(message: string, author?: CommitAuthor): Promise<string> {\n return this.commit(message, author);\n }\n\n async push(_remote: string, branchName: string): Promise<void> {\n // Add branch to remote\n const branches = this.state.remotes.get('origin') || [];\n if (!branches.includes(branchName)) {\n branches.push(branchName);\n this.state.remotes.set('origin', branches);\n }\n }\n\n async pushWithUpstream(_remote: string, branchName: string): Promise<void> {\n return this.push('origin', branchName);\n }\n\n async setUpstream(\n branchName: string,\n _remote: string,\n _remoteBranch: string\n ): Promise<void> {\n if (!this.state.branches.has(branchName)) {\n throw new BranchNotFoundError(branchName);\n }\n }\n\n async rebaseContinue(): Promise<string> {\n if (!this.state.isRebaseInProgress) {\n throw new RebaseNotInProgressError();\n }\n this.state.isRebaseInProgress = false;\n this.state.conflictedFiles = [];\n return this.state.commits[this.state.commits.length - 1]?.hash || 'rebase-hash';\n }\n\n async rebaseAbort(): Promise<void> {\n if (!this.state.isRebaseInProgress) {\n throw new RebaseNotInProgressError();\n }\n this.state.isRebaseInProgress = false;\n this.state.conflictedFiles = [];\n }\n\n async createBranch(branchName: string, _startPoint?: string): Promise<void> {\n if (this.state.branches.has(branchName)) {\n throw new BranchAlreadyExistsError(branchName);\n }\n this.state.branches.add(branchName);\n this.state.currentBranch = branchName;\n }\n\n async rebase(_targetBranch: string): Promise<void> {\n // No-op in memory, unless conflicts are set\n if (this.state.conflictedFiles.length > 0) {\n this.state.isRebaseInProgress = true;\n }\n }\n}\n","import type { IRecordProjection, IndexData, ProjectionContext } from '../record_projection.types';\n\n/**\n * MemoryRecordProjection - In-memory IRecordProjection for testing.\n *\n * Stores IndexData in a Map keyed by context.repoIdentifier.\n * Used exclusively in tests to avoid filesystem I/O.\n */\nexport class MemoryRecordProjection implements IRecordProjection {\n private storage = new Map<string, IndexData>();\n\n async persist(data: IndexData, context: ProjectionContext): Promise<void> {\n const key = context.repoIdentifier ?? '__default__';\n this.storage.set(key, data);\n }\n\n async read(context: ProjectionContext): Promise<IndexData | null> {\n const key = context.repoIdentifier ?? '__default__';\n return this.storage.get(key) ?? null;\n }\n\n async exists(context: ProjectionContext): Promise<boolean> {\n const key = context.repoIdentifier ?? '__default__';\n return this.storage.has(key);\n }\n\n async clear(context: ProjectionContext): Promise<void> {\n const key = context.repoIdentifier ?? '__default__';\n this.storage.delete(key);\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { K as KeyProvider } from './key_provider-CRpHFGjN.js';
|
|
2
|
-
import {
|
|
2
|
+
import { g as FileLister, M as MemoryFileListerOptions, h as FileListOptions, i as FileStats } from './index-Bhc341pf.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* EnvKeyProvider - Environment variable-based KeyProvider implementation
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { a as IRecordProjection, b as IndexData, P as ProjectionContext } from './record_projection.types-B8AM7u8U.js';
|
|
2
|
+
import './record_store-BXKWqon5.js';
|
|
3
|
+
|
|
4
|
+
type JsonValue = string | number | boolean | null | JsonValue[] | {
|
|
5
|
+
[key: string]: JsonValue;
|
|
6
|
+
};
|
|
7
|
+
type ProjectionWhereUnique = {
|
|
8
|
+
repoId_projectionType: {
|
|
9
|
+
repoId: string;
|
|
10
|
+
projectionType: string;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
type ProjectionRow = {
|
|
14
|
+
id: string;
|
|
15
|
+
repoId: string;
|
|
16
|
+
projectionType: string;
|
|
17
|
+
data: JsonValue;
|
|
18
|
+
lastCommitHash: string | null;
|
|
19
|
+
createdAt: Date;
|
|
20
|
+
updatedAt: Date;
|
|
21
|
+
};
|
|
22
|
+
type ProjectionDelegate = {
|
|
23
|
+
upsert(args: {
|
|
24
|
+
where: ProjectionWhereUnique;
|
|
25
|
+
create: {
|
|
26
|
+
repoId: string;
|
|
27
|
+
projectionType: string;
|
|
28
|
+
data: JsonValue;
|
|
29
|
+
lastCommitHash: string | null;
|
|
30
|
+
};
|
|
31
|
+
update: {
|
|
32
|
+
data: JsonValue;
|
|
33
|
+
lastCommitHash: string | null;
|
|
34
|
+
};
|
|
35
|
+
}): PromiseLike<unknown>;
|
|
36
|
+
findUnique(args: {
|
|
37
|
+
where: ProjectionWhereUnique;
|
|
38
|
+
select?: {
|
|
39
|
+
id: true;
|
|
40
|
+
};
|
|
41
|
+
}): PromiseLike<ProjectionRow | {
|
|
42
|
+
id: string;
|
|
43
|
+
} | null>;
|
|
44
|
+
deleteMany(args: {
|
|
45
|
+
where: {
|
|
46
|
+
repoId: string;
|
|
47
|
+
projectionType: string;
|
|
48
|
+
};
|
|
49
|
+
}): PromiseLike<unknown>;
|
|
50
|
+
};
|
|
51
|
+
type ProjectionClient = {
|
|
52
|
+
projection: ProjectionDelegate;
|
|
53
|
+
};
|
|
54
|
+
type PrismaRecordProjectionOptions = {
|
|
55
|
+
client: ProjectionClient;
|
|
56
|
+
repoId: string;
|
|
57
|
+
projectionType?: string;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
declare class PrismaRecordProjection implements IRecordProjection {
|
|
61
|
+
private readonly client;
|
|
62
|
+
private readonly repoId;
|
|
63
|
+
private readonly projectionType;
|
|
64
|
+
constructor(options: PrismaRecordProjectionOptions);
|
|
65
|
+
persist(data: IndexData, context: ProjectionContext): Promise<void>;
|
|
66
|
+
read(_context: ProjectionContext): Promise<IndexData | null>;
|
|
67
|
+
exists(_context: ProjectionContext): Promise<boolean>;
|
|
68
|
+
clear(_context: ProjectionContext): Promise<void>;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export { type JsonValue, PrismaRecordProjection, type PrismaRecordProjectionOptions, type ProjectionClient, type ProjectionDelegate };
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// src/record_projection/prisma/prisma_record_projection.ts
|
|
2
|
+
var PrismaRecordProjection = class {
|
|
3
|
+
client;
|
|
4
|
+
repoId;
|
|
5
|
+
projectionType;
|
|
6
|
+
constructor(options) {
|
|
7
|
+
this.client = options.client;
|
|
8
|
+
this.repoId = options.repoId;
|
|
9
|
+
this.projectionType = options.projectionType ?? "index";
|
|
10
|
+
}
|
|
11
|
+
async persist(data, context) {
|
|
12
|
+
await this.client.projection.upsert({
|
|
13
|
+
where: {
|
|
14
|
+
repoId_projectionType: {
|
|
15
|
+
repoId: this.repoId,
|
|
16
|
+
projectionType: this.projectionType
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
create: {
|
|
20
|
+
repoId: this.repoId,
|
|
21
|
+
projectionType: this.projectionType,
|
|
22
|
+
data: JSON.parse(JSON.stringify(data)),
|
|
23
|
+
lastCommitHash: context.lastCommitHash ?? null
|
|
24
|
+
},
|
|
25
|
+
update: {
|
|
26
|
+
data: JSON.parse(JSON.stringify(data)),
|
|
27
|
+
lastCommitHash: context.lastCommitHash ?? null
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
async read(_context) {
|
|
32
|
+
const row = await this.client.projection.findUnique({
|
|
33
|
+
where: {
|
|
34
|
+
repoId_projectionType: {
|
|
35
|
+
repoId: this.repoId,
|
|
36
|
+
projectionType: this.projectionType
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
if (!row || !("data" in row)) return null;
|
|
41
|
+
return row.data;
|
|
42
|
+
}
|
|
43
|
+
async exists(_context) {
|
|
44
|
+
const row = await this.client.projection.findUnique({
|
|
45
|
+
where: {
|
|
46
|
+
repoId_projectionType: {
|
|
47
|
+
repoId: this.repoId,
|
|
48
|
+
projectionType: this.projectionType
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
select: { id: true }
|
|
52
|
+
});
|
|
53
|
+
return row !== null;
|
|
54
|
+
}
|
|
55
|
+
async clear(_context) {
|
|
56
|
+
await this.client.projection.deleteMany({
|
|
57
|
+
where: {
|
|
58
|
+
repoId: this.repoId,
|
|
59
|
+
projectionType: this.projectionType
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export { PrismaRecordProjection };
|
|
66
|
+
//# sourceMappingURL=prisma.js.map
|
|
67
|
+
//# sourceMappingURL=prisma.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/record_projection/prisma/prisma_record_projection.ts"],"names":[],"mappings":";AAGO,IAAM,yBAAN,MAA0D;AAAA,EAC9C,MAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EAEjB,YAAY,OAAA,EAAwC;AAClD,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,cAAA,GAAiB,QAAQ,cAAA,IAAkB,OAAA;AAAA,EAClD;AAAA,EAEA,MAAM,OAAA,CAAQ,IAAA,EAAiB,OAAA,EAA2C;AACxE,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO;AAAA,MAClC,KAAA,EAAO;AAAA,QACL,qBAAA,EAAuB;AAAA,UACrB,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,gBAAgB,IAAA,CAAK;AAAA;AACvB,OACF;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,gBAAgB,IAAA,CAAK,cAAA;AAAA,QACrB,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,QACrC,cAAA,EAAgB,QAAQ,cAAA,IAAkB;AAAA,OAC5C;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,QACrC,cAAA,EAAgB,QAAQ,cAAA,IAAkB;AAAA;AAC5C,KACD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,KAAK,QAAA,EAAwD;AACjE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,CAAO,WAAW,UAAA,CAAW;AAAA,MAClD,KAAA,EAAO;AAAA,QACL,qBAAA,EAAuB;AAAA,UACrB,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,gBAAgB,IAAA,CAAK;AAAA;AACvB;AACF,KACD,CAAA;AACD,IAAA,IAAI,CAAC,GAAA,IAAO,EAAE,MAAA,IAAU,MAAM,OAAO,IAAA;AACrC,IAAA,OAAO,GAAA,CAAI,IAAA;AAAA,EACb;AAAA,EAEA,MAAM,OAAO,QAAA,EAA+C;AAC1D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,CAAO,WAAW,UAAA,CAAW;AAAA,MAClD,KAAA,EAAO;AAAA,QACL,qBAAA,EAAuB;AAAA,UACrB,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,gBAAgB,IAAA,CAAK;AAAA;AACvB,OACF;AAAA,MACA,MAAA,EAAQ,EAAE,EAAA,EAAI,IAAA;AAAK,KACpB,CAAA;AACD,IAAA,OAAO,GAAA,KAAQ,IAAA;AAAA,EACjB;AAAA,EAEA,MAAM,MAAM,QAAA,EAA4C;AACtD,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW;AAAA,MACtC,KAAA,EAAO;AAAA,QACL,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,gBAAgB,IAAA,CAAK;AAAA;AACvB,KACD,CAAA;AAAA,EACH;AACF","file":"prisma.js","sourcesContent":["import type { IRecordProjection, IndexData, ProjectionContext } from '../record_projection.types';\nimport type { JsonValue, ProjectionClient, PrismaRecordProjectionOptions } from './prisma_record_projection.types';\n\nexport class PrismaRecordProjection implements IRecordProjection {\n private readonly client: ProjectionClient;\n private readonly repoId: string;\n private readonly projectionType: string;\n\n constructor(options: PrismaRecordProjectionOptions) {\n this.client = options.client;\n this.repoId = options.repoId;\n this.projectionType = options.projectionType ?? 'index';\n }\n\n async persist(data: IndexData, context: ProjectionContext): Promise<void> {\n await this.client.projection.upsert({\n where: {\n repoId_projectionType: {\n repoId: this.repoId,\n projectionType: this.projectionType,\n },\n },\n create: {\n repoId: this.repoId,\n projectionType: this.projectionType,\n data: JSON.parse(JSON.stringify(data)) as JsonValue,\n lastCommitHash: context.lastCommitHash ?? null,\n },\n update: {\n data: JSON.parse(JSON.stringify(data)) as JsonValue,\n lastCommitHash: context.lastCommitHash ?? null,\n },\n });\n }\n\n async read(_context: ProjectionContext): Promise<IndexData | null> {\n const row = await this.client.projection.findUnique({\n where: {\n repoId_projectionType: {\n repoId: this.repoId,\n projectionType: this.projectionType,\n },\n },\n });\n if (!row || !('data' in row)) return null;\n return row.data as unknown as IndexData;\n }\n\n async exists(_context: ProjectionContext): Promise<boolean> {\n const row = await this.client.projection.findUnique({\n where: {\n repoId_projectionType: {\n repoId: this.repoId,\n projectionType: this.projectionType,\n },\n },\n select: { id: true },\n });\n return row !== null;\n }\n\n async clear(_context: ProjectionContext): Promise<void> {\n await this.client.projection.deleteMany({\n where: {\n repoId: this.repoId,\n projectionType: this.projectionType,\n },\n });\n }\n}\n"]}
|