@gilangjavier/chrona 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/store.ts","../src/types.ts","../src/utils.ts","../src/validate.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { ChromaStore } from \"./store.js\";\nimport type { MemoryScope, MemoryType, SourceKind } from \"./types.js\";\nimport { parseCsv, parseJsonObject, toIsoString } from \"./utils.js\";\nimport { parseMemoryScope, parseMemoryType, parseSourceKind } from \"./validate.js\";\n\ninterface CommonOptions {\n db?: string;\n json?: boolean;\n}\n\nfunction openStore(options: CommonOptions): ChromaStore {\n return new ChromaStore(resolve(options.db ?? process.env.CHRONA_DB ?? \".chrona/chrona.db\"));\n}\n\nfunction emit(value: unknown, asJson?: boolean): void {\n if (asJson) {\n console.log(JSON.stringify(value, null, 2));\n return;\n }\n\n if (typeof value === \"string\") {\n console.log(value);\n return;\n }\n\n console.log(JSON.stringify(value, null, 2));\n}\n\nfunction parseScopes(value?: string): MemoryScope[] | undefined {\n const scopes = parseCsv(value).map(parseMemoryScope);\n return scopes.length ? scopes : undefined;\n}\n\nfunction parseTypes(value?: string): MemoryType[] | undefined {\n const types = parseCsv(value).map(parseMemoryType);\n return types.length ? types : undefined;\n}\n\nfunction parseTags(value?: string): string[] | undefined {\n const tags = parseCsv(value);\n return tags.length ? tags : undefined;\n}\n\nconst program = new Command();\n\nprogram\n .name(\"chrona\")\n .description(\"Time-aware local memory store for agents\")\n .version(\"0.1.0\")\n .option(\"--db <path>\", \"Path to the SQLite database\")\n .option(\"--json\", \"Emit machine-readable JSON\");\n\nprogram\n .command(\"init\")\n .description(\"Create or open the memory database\")\n .action(() => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n store.init();\n emit({ ok: true, db: store.path }, options.json);\n store.close();\n });\n\nprogram\n .command(\"add\")\n .description(\"Add a memory entry\")\n .requiredOption(\"--type <type>\")\n .requiredOption(\"--text <text>\")\n .requiredOption(\"--source-kind <kind>\")\n .requiredOption(\"--source-value <value>\")\n .requiredOption(\"--confidence <number>\")\n .requiredOption(\"--scope <scope>\")\n .option(\"--id <id>\")\n .option(\"--created-at <iso>\")\n .option(\"--tags <items>\", \"Comma-separated tags\")\n .option(\"--expires-at <iso>\")\n .option(\"--links <items>\", \"Comma-separated links\")\n .option(\"--metadata <json>\", \"Metadata JSON object\")\n .action((commandOptions) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const entry = store.add({\n id: commandOptions.id,\n type: parseMemoryType(commandOptions.type),\n text: commandOptions.text,\n createdAt: commandOptions.createdAt,\n source: {\n kind: parseSourceKind(commandOptions.sourceKind as SourceKind),\n value: commandOptions.sourceValue\n },\n confidence: Number(commandOptions.confidence),\n scope: parseMemoryScope(commandOptions.scope),\n tags: parseCsv(commandOptions.tags),\n expiresAt: commandOptions.expiresAt,\n links: parseCsv(commandOptions.links),\n metadata: parseJsonObject(commandOptions.metadata)\n });\n emit(entry, true);\n store.close();\n });\n\nprogram\n .command(\"search\")\n .description(\"Search memory entries by keyword\")\n .argument(\"<query>\")\n .option(\"--scopes <items>\", \"Comma-separated scopes\")\n .option(\"--types <items>\", \"Comma-separated types\")\n .option(\"--tags <items>\", \"Comma-separated tags\")\n .option(\"--source-kind <kind>\")\n .option(\"--source-value <value>\")\n .option(\"--before <iso>\")\n .option(\"--after <iso>\")\n .option(\"--include-expired\", \"Include expired entries\")\n .option(\"--limit <number>\", \"Maximum result count\", \"50\")\n .action((query, commandOptions) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const result = store.search({\n query,\n scopes: parseScopes(commandOptions.scopes),\n types: parseTypes(commandOptions.types),\n tags: parseTags(commandOptions.tags),\n sourceKind: commandOptions.sourceKind ? parseSourceKind(commandOptions.sourceKind as SourceKind) : undefined,\n sourceValue: commandOptions.sourceValue,\n before: commandOptions.before,\n after: commandOptions.after,\n includeExpired: Boolean(commandOptions.includeExpired),\n limit: Number(commandOptions.limit)\n });\n emit(result, true);\n store.close();\n });\n\nprogram\n .command(\"timeline\")\n .description(\"View time-ordered memory entries\")\n .option(\"--scopes <items>\", \"Comma-separated scopes\")\n .option(\"--types <items>\", \"Comma-separated types\")\n .option(\"--tags <items>\", \"Comma-separated tags\")\n .option(\"--source-kind <kind>\")\n .option(\"--source-value <value>\")\n .option(\"--before <iso>\")\n .option(\"--after <iso>\")\n .option(\"--include-expired\", \"Include expired entries\")\n .option(\"--order <direction>\", \"asc or desc\", \"asc\")\n .option(\"--limit <number>\", \"Maximum result count\", \"50\")\n .action((commandOptions) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const result = store.timeline({\n scopes: parseScopes(commandOptions.scopes),\n types: parseTypes(commandOptions.types),\n tags: parseTags(commandOptions.tags),\n sourceKind: commandOptions.sourceKind ? parseSourceKind(commandOptions.sourceKind as SourceKind) : undefined,\n sourceValue: commandOptions.sourceValue,\n before: commandOptions.before,\n after: commandOptions.after,\n includeExpired: Boolean(commandOptions.includeExpired),\n order: commandOptions.order === \"desc\" ? \"desc\" : \"asc\",\n limit: Number(commandOptions.limit)\n });\n emit(result, true);\n store.close();\n });\n\nprogram\n .command(\"get\")\n .description(\"Get a memory entry by id\")\n .argument(\"<id>\")\n .action((id) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const result = store.get(id);\n emit(result, true);\n store.close();\n });\n\nprogram\n .command(\"export\")\n .description(\"Export entries as JSONL\")\n .option(\"--output <path>\")\n .option(\"--scopes <items>\", \"Comma-separated scopes\")\n .option(\"--types <items>\", \"Comma-separated types\")\n .option(\"--tags <items>\", \"Comma-separated tags\")\n .option(\"--source-kind <kind>\")\n .option(\"--source-value <value>\")\n .option(\"--before <iso>\")\n .option(\"--after <iso>\")\n .option(\"--include-expired\", \"Include expired entries\")\n .option(\"--order <direction>\", \"asc or desc\", \"asc\")\n .option(\"--limit <number>\", \"Maximum result count\", \"1000\")\n .action((commandOptions) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const jsonl = store.exportJsonl({\n scopes: parseScopes(commandOptions.scopes),\n types: parseTypes(commandOptions.types),\n tags: parseTags(commandOptions.tags),\n sourceKind: commandOptions.sourceKind ? parseSourceKind(commandOptions.sourceKind as SourceKind) : undefined,\n sourceValue: commandOptions.sourceValue,\n before: commandOptions.before,\n after: commandOptions.after,\n includeExpired: Boolean(commandOptions.includeExpired),\n order: commandOptions.order === \"desc\" ? \"desc\" : \"asc\",\n limit: Number(commandOptions.limit)\n });\n\n if (commandOptions.output) {\n writeFileSync(resolve(commandOptions.output), jsonl ? `${jsonl}\\n` : \"\");\n emit({ ok: true, output: resolve(commandOptions.output) }, options.json);\n } else {\n emit(jsonl, false);\n }\n\n store.close();\n });\n\nprogram\n .command(\"import\")\n .description(\"Import entries from JSONL\")\n .argument(\"[input]\", \"Path to JSONL file, or - for stdin\", \"-\")\n .action((input) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const jsonl = input === \"-\" ? readFileSync(0, \"utf8\") : readFileSync(resolve(input), \"utf8\");\n const result = store.importJsonl(jsonl);\n emit(result, true);\n store.close();\n });\n\nprogram\n .command(\"gc\")\n .description(\"Delete expired entries\")\n .option(\"--now <iso>\", \"Override current time for deterministic runs\")\n .action((commandOptions) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const result = store.gc(commandOptions.now ? toIsoString(commandOptions.now) : new Date());\n emit(result, true);\n store.close();\n });\n\nprogram.parseAsync(process.argv).catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(message);\n process.exitCode = 1;\n});\n","import Database from \"better-sqlite3\";\nimport { mkdirSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport type {\n AddMemoryInput,\n ExportOptions,\n GcResult,\n ImportResult,\n MemoryEntry,\n QueryOptions,\n SearchOptions,\n TimelineOptions\n} from \"./types.js\";\nimport { normalizeEntry } from \"./validate.js\";\nimport { serializeJson, toIsoString } from \"./utils.js\";\n\ninterface MemoryRow {\n id: string;\n type: MemoryEntry[\"type\"];\n text: string;\n created_at: string;\n source_kind: MemoryEntry[\"source\"][\"kind\"];\n source_value: string;\n confidence: number;\n scope: MemoryEntry[\"scope\"];\n tags_json: string;\n expires_at: string | null;\n links_json: string;\n metadata_json: string;\n}\n\nexport class ChromaStore {\n readonly path: string;\n readonly db: Database.Database;\n\n constructor(path = resolve(process.cwd(), \".chrona/chrona.db\")) {\n this.path = resolve(path);\n mkdirSync(dirname(this.path), { recursive: true });\n this.db = new Database(this.path);\n this.db.pragma(\"journal_mode = WAL\");\n this.db.pragma(\"foreign_keys = ON\");\n this.db.pragma(\"busy_timeout = 5000\");\n }\n\n init(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS memories (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n text TEXT NOT NULL,\n created_at TEXT NOT NULL,\n source_kind TEXT NOT NULL,\n source_value TEXT NOT NULL,\n confidence REAL NOT NULL,\n scope TEXT NOT NULL,\n tags_json TEXT NOT NULL,\n expires_at TEXT,\n links_json TEXT NOT NULL,\n metadata_json TEXT NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_memories_created_at ON memories(created_at);\n CREATE INDEX IF NOT EXISTS idx_memories_scope ON memories(scope);\n CREATE INDEX IF NOT EXISTS idx_memories_type ON memories(type);\n CREATE INDEX IF NOT EXISTS idx_memories_expires_at ON memories(expires_at);\n CREATE INDEX IF NOT EXISTS idx_memories_source ON memories(source_kind, source_value);\n `);\n }\n\n close(): void {\n this.db.close();\n }\n\n add(input: AddMemoryInput): MemoryEntry {\n const entry = normalizeEntry(input);\n this.init();\n\n this.db.prepare(`\n INSERT INTO memories (\n id,\n type,\n text,\n created_at,\n source_kind,\n source_value,\n confidence,\n scope,\n tags_json,\n expires_at,\n links_json,\n metadata_json\n ) VALUES (\n @id,\n @type,\n @text,\n @created_at,\n @source_kind,\n @source_value,\n @confidence,\n @scope,\n @tags_json,\n @expires_at,\n @links_json,\n @metadata_json\n )\n `).run(this.toRow(entry));\n\n return entry;\n }\n\n get(id: string): MemoryEntry | null {\n this.init();\n const row = this.db.prepare(\"SELECT * FROM memories WHERE id = ?\").get(id) as MemoryRow | undefined;\n return row ? this.fromRow(row) : null;\n }\n\n search(options: SearchOptions): MemoryEntry[] {\n this.init();\n const { sql, params } = this.buildQuery(\n options,\n [\n \"(\",\n \"lower(text) LIKE @query\",\n \"OR lower(tags_json) LIKE @query\",\n \"OR lower(source_kind || ':' || source_value) LIKE @query\",\n \"OR lower(metadata_json) LIKE @query\",\n \")\"\n ].join(\" \"),\n { query: `%${options.query.toLowerCase()}%` },\n \"ORDER BY created_at DESC, confidence DESC, id ASC\"\n );\n\n return this.db.prepare(sql).all(params).map((row) => this.fromRow(row as MemoryRow));\n }\n\n timeline(options: TimelineOptions = {}): MemoryEntry[] {\n this.init();\n const direction = options.order === \"desc\" ? \"DESC\" : \"ASC\";\n const { sql, params } = this.buildQuery(options, undefined, {}, `ORDER BY created_at ${direction}, id ASC`);\n return this.db.prepare(sql).all(params).map((row) => this.fromRow(row as MemoryRow));\n }\n\n exportJsonl(options: ExportOptions = {}): string {\n return this.timeline(options).map((entry) => JSON.stringify(entry)).join(\"\\n\");\n }\n\n importJsonl(input: string): ImportResult {\n this.init();\n const lines = input.split(/\\r?\\n/).map((line) => line.trim()).filter(Boolean);\n const ids: string[] = [];\n let imported = 0;\n let updated = 0;\n\n const statement = this.db.prepare(`\n INSERT INTO memories (\n id,\n type,\n text,\n created_at,\n source_kind,\n source_value,\n confidence,\n scope,\n tags_json,\n expires_at,\n links_json,\n metadata_json\n ) VALUES (\n @id,\n @type,\n @text,\n @created_at,\n @source_kind,\n @source_value,\n @confidence,\n @scope,\n @tags_json,\n @expires_at,\n @links_json,\n @metadata_json\n )\n ON CONFLICT(id) DO UPDATE SET\n type = excluded.type,\n text = excluded.text,\n created_at = excluded.created_at,\n source_kind = excluded.source_kind,\n source_value = excluded.source_value,\n confidence = excluded.confidence,\n scope = excluded.scope,\n tags_json = excluded.tags_json,\n expires_at = excluded.expires_at,\n links_json = excluded.links_json,\n metadata_json = excluded.metadata_json\n `);\n\n const transaction = this.db.transaction(() => {\n for (const line of lines) {\n const entry = normalizeEntry(JSON.parse(line) as AddMemoryInput);\n const exists = this.get(entry.id);\n statement.run(this.toRow(entry));\n ids.push(entry.id);\n if (exists) {\n updated += 1;\n } else {\n imported += 1;\n }\n }\n });\n\n transaction();\n\n return {\n imported,\n updated,\n ids: [...ids].sort((a, b) => a.localeCompare(b))\n };\n }\n\n gc(now?: string | Date): GcResult {\n this.init();\n const nowIso = toIsoString(now);\n const rows = this.db.prepare(\n \"SELECT id FROM memories WHERE expires_at IS NOT NULL AND expires_at <= ? ORDER BY expires_at ASC, id ASC\"\n ).all(nowIso) as Array<{ id: string }>;\n const ids = rows.map((row) => row.id);\n\n if (ids.length > 0) {\n this.db.prepare(\"DELETE FROM memories WHERE expires_at IS NOT NULL AND expires_at <= ?\").run(nowIso);\n }\n\n return {\n deleted: ids.length,\n ids,\n now: nowIso\n };\n }\n\n private buildQuery(\n options: QueryOptions,\n extraWhere?: string,\n extraParams: Record<string, unknown> = {},\n orderBy = \"ORDER BY created_at ASC, id ASC\"\n ): { sql: string; params: Record<string, unknown> } {\n const where: string[] = [];\n const params: Record<string, unknown> = { ...extraParams };\n\n if (!options.includeExpired) {\n where.push(\"(expires_at IS NULL OR expires_at > @now)\");\n params.now = toIsoString();\n }\n\n if (options.scopes?.length) {\n const placeholders = options.scopes.map((_, index) => `@scope${index}`);\n where.push(`scope IN (${placeholders.join(\", \")})`);\n for (const [index, scope] of options.scopes.entries()) {\n params[`scope${index}`] = scope;\n }\n }\n\n if (options.types?.length) {\n const placeholders = options.types.map((_, index) => `@type${index}`);\n where.push(`type IN (${placeholders.join(\", \")})`);\n for (const [index, type] of options.types.entries()) {\n params[`type${index}`] = type;\n }\n }\n\n if (options.tags?.length) {\n const tagParts: string[] = [];\n for (const [index, tag] of options.tags.entries()) {\n const key = `tag${index}`;\n tagParts.push(`lower(tags_json) LIKE @${key}`);\n params[key] = `%${tag.toLowerCase()}%`;\n }\n where.push(`(${tagParts.join(\" OR \")})`);\n }\n\n if (options.sourceKind) {\n where.push(\"source_kind = @sourceKind\");\n params.sourceKind = options.sourceKind;\n }\n\n if (options.sourceValue) {\n where.push(\"source_value = @sourceValue\");\n params.sourceValue = options.sourceValue;\n }\n\n if (options.before) {\n where.push(\"created_at <= @before\");\n params.before = toIsoString(options.before);\n }\n\n if (options.after) {\n where.push(\"created_at >= @after\");\n params.after = toIsoString(options.after);\n }\n\n if (extraWhere) {\n where.push(extraWhere);\n }\n\n const limit = Math.max(1, Math.min(options.limit ?? 50, 1000));\n params.limit = limit;\n const whereSql = where.length ? `WHERE ${where.join(\" AND \")}` : \"\";\n\n return {\n sql: `SELECT * FROM memories ${whereSql} ${orderBy} LIMIT @limit`,\n params\n };\n }\n\n private toRow(entry: MemoryEntry): Record<string, unknown> {\n return {\n id: entry.id,\n type: entry.type,\n text: entry.text,\n created_at: entry.createdAt,\n source_kind: entry.source.kind,\n source_value: entry.source.value,\n confidence: entry.confidence,\n scope: entry.scope,\n tags_json: serializeJson(entry.tags),\n expires_at: entry.expiresAt ?? null,\n links_json: serializeJson(entry.links ?? []),\n metadata_json: serializeJson(entry.metadata ?? {})\n };\n }\n\n private fromRow(row: MemoryRow): MemoryEntry {\n return {\n id: row.id,\n type: row.type,\n text: row.text,\n createdAt: row.created_at,\n source: {\n kind: row.source_kind,\n value: row.source_value\n },\n confidence: row.confidence,\n scope: row.scope,\n tags: JSON.parse(row.tags_json) as string[],\n expiresAt: row.expires_at ?? undefined,\n links: JSON.parse(row.links_json) as string[],\n metadata: JSON.parse(row.metadata_json) as Record<string, unknown>\n };\n }\n}\n","export const memoryTypes = [\"decision\", \"preference\", \"fact\", \"incident\", \"constraint\"] as const;\nexport const memoryScopes = [\"user\", \"project\", \"org\", \"shared\"] as const;\nexport const sourceKinds = [\"tool\", \"session\", \"repo\"] as const;\n\nexport type MemoryType = (typeof memoryTypes)[number];\nexport type MemoryScope = (typeof memoryScopes)[number];\nexport type SourceKind = (typeof sourceKinds)[number];\n\nexport interface MemorySource {\n kind: SourceKind;\n value: string;\n}\n\nexport interface MemoryEntry {\n id: string;\n type: MemoryType;\n text: string;\n createdAt: string;\n source: MemorySource;\n confidence: number;\n scope: MemoryScope;\n tags: string[];\n expiresAt?: string;\n links?: string[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface AddMemoryInput {\n id?: string;\n type: MemoryType;\n text: string;\n createdAt?: string;\n source: MemorySource;\n confidence: number;\n scope: MemoryScope;\n tags: string[];\n expiresAt?: string;\n links?: string[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface QueryOptions {\n scopes?: MemoryScope[];\n types?: MemoryType[];\n tags?: string[];\n sourceKind?: SourceKind;\n sourceValue?: string;\n before?: string;\n after?: string;\n includeExpired?: boolean;\n limit?: number;\n}\n\nexport interface SearchOptions extends QueryOptions {\n query: string;\n}\n\nexport interface TimelineOptions extends QueryOptions {\n order?: \"asc\" | \"desc\";\n}\n\nexport interface ExportOptions extends TimelineOptions {}\n\nexport interface ImportResult {\n imported: number;\n updated: number;\n ids: string[];\n}\n\nexport interface GcResult {\n deleted: number;\n ids: string[];\n now: string;\n}\n","import { randomUUID } from \"node:crypto\";\n\nexport function toIsoString(value?: string | Date): string {\n const date = value instanceof Date ? value : value ? new Date(value) : new Date();\n const iso = date.toISOString();\n\n if (Number.isNaN(date.getTime())) {\n throw new Error(`Invalid date: ${String(value)}`);\n }\n\n return iso;\n}\n\nexport function uniqueSorted(values: string[] | undefined): string[] {\n return [...new Set((values ?? []).map((value) => value.trim()).filter(Boolean))].sort((a, b) => a.localeCompare(b));\n}\n\nexport function normalizeConfidence(value: number): number {\n if (!Number.isFinite(value) || value < 0 || value > 1) {\n throw new Error(\"confidence must be between 0 and 1\");\n }\n\n return Number(value.toFixed(6));\n}\n\nexport function parseJsonObject(value: unknown): Record<string, unknown> | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value === \"object\" && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n\n if (typeof value !== \"string\" || value.trim() === \"\") {\n throw new Error(\"metadata must be an object or JSON object string\");\n }\n\n const parsed = JSON.parse(value) as unknown;\n\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"metadata must be a JSON object\");\n }\n\n return parsed as Record<string, unknown>;\n}\n\nexport function parseCsv(value?: string): string[] {\n if (!value) {\n return [];\n }\n\n return value.split(\",\").map((item) => item.trim()).filter(Boolean);\n}\n\nexport function ensureId(value?: string): string {\n return value?.trim() || randomUUID();\n}\n\nexport function serializeJson(value: unknown): string {\n return JSON.stringify(value ?? {});\n}\n","import {\n memoryScopes,\n memoryTypes,\n sourceKinds,\n type AddMemoryInput,\n type MemoryEntry,\n type MemoryScope,\n type MemoryType,\n type SourceKind\n} from \"./types.js\";\nimport { ensureId, normalizeConfidence, parseJsonObject, toIsoString, uniqueSorted } from \"./utils.js\";\n\nfunction includesValue<T extends string>(values: readonly T[], value: string, label: string): T {\n if (!values.includes(value as T)) {\n throw new Error(`Invalid ${label}: ${value}`);\n }\n\n return value as T;\n}\n\nexport function parseMemoryType(value: string): MemoryType {\n return includesValue(memoryTypes, value, \"type\");\n}\n\nexport function parseMemoryScope(value: string): MemoryScope {\n return includesValue(memoryScopes, value, \"scope\");\n}\n\nexport function parseSourceKind(value: string): SourceKind {\n return includesValue(sourceKinds, value, \"source kind\");\n}\n\nexport function normalizeEntry(input: AddMemoryInput | MemoryEntry): MemoryEntry {\n if (!input.text.trim()) {\n throw new Error(\"text is required\");\n }\n\n if (!input.source?.value?.trim()) {\n throw new Error(\"source.value is required\");\n }\n\n return {\n id: ensureId(input.id),\n type: parseMemoryType(input.type),\n text: input.text.trim(),\n createdAt: toIsoString(input.createdAt),\n source: {\n kind: parseSourceKind(input.source.kind),\n value: input.source.value.trim()\n },\n confidence: normalizeConfidence(input.confidence),\n scope: parseMemoryScope(input.scope),\n tags: uniqueSorted(input.tags),\n expiresAt: input.expiresAt ? toIsoString(input.expiresAt) : undefined,\n links: uniqueSorted(input.links),\n metadata: parseJsonObject(input.metadata)\n };\n}\n"],"mappings":"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","names":["import_node_fs","import_node_path","Database"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/mcp.ts","../src/store.ts","../src/types.ts","../src/utils.ts","../src/validate.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { startChronaMcpServer } from \"./mcp.js\";\nimport { ChromaStore } from \"./store.js\";\nimport type { MemoryScope, MemoryType, SourceKind } from \"./types.js\";\nimport { parseCsv, parseJsonObject, toIsoString } from \"./utils.js\";\nimport { parseMemoryScope, parseMemoryType, parseSourceKind } from \"./validate.js\";\n\ninterface CommonOptions {\n db?: string;\n json?: boolean;\n}\n\nfunction openStore(options: CommonOptions): ChromaStore {\n return new ChromaStore(resolve(options.db ?? process.env.CHRONA_DB ?? \".chrona/chrona.db\"));\n}\n\nfunction emit(value: unknown, asJson?: boolean): void {\n if (asJson) {\n console.log(JSON.stringify(value, null, 2));\n return;\n }\n\n if (typeof value === \"string\") {\n console.log(value);\n return;\n }\n\n console.log(JSON.stringify(value, null, 2));\n}\n\nfunction parseScopes(value?: string): MemoryScope[] | undefined {\n const scopes = parseCsv(value).map(parseMemoryScope);\n return scopes.length ? scopes : undefined;\n}\n\nfunction parseTypes(value?: string): MemoryType[] | undefined {\n const types = parseCsv(value).map(parseMemoryType);\n return types.length ? types : undefined;\n}\n\nfunction parseTags(value?: string): string[] | undefined {\n const tags = parseCsv(value);\n return tags.length ? tags : undefined;\n}\n\nconst program = new Command();\n\nprogram\n .name(\"chrona\")\n .description(\"Time-aware local memory store for agents\")\n .version(\"0.1.1\")\n .option(\"--db <path>\", \"Path to the SQLite database\")\n .option(\"--json\", \"Emit machine-readable JSON\");\n\nprogram\n .command(\"init\")\n .description(\"Create or open the memory database\")\n .action(() => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n store.init();\n emit({ ok: true, db: store.path }, options.json);\n store.close();\n });\n\nprogram\n .command(\"add\")\n .description(\"Add a memory entry\")\n .requiredOption(\"--type <type>\")\n .requiredOption(\"--text <text>\")\n .requiredOption(\"--source-kind <kind>\")\n .requiredOption(\"--source-value <value>\")\n .requiredOption(\"--confidence <number>\")\n .requiredOption(\"--scope <scope>\")\n .option(\"--id <id>\")\n .option(\"--created-at <iso>\")\n .option(\"--tags <items>\", \"Comma-separated tags\")\n .option(\"--expires-at <iso>\")\n .option(\"--links <items>\", \"Comma-separated links\")\n .option(\"--metadata <json>\", \"Metadata JSON object\")\n .action((commandOptions) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const entry = store.add({\n id: commandOptions.id,\n type: parseMemoryType(commandOptions.type),\n text: commandOptions.text,\n createdAt: commandOptions.createdAt,\n source: {\n kind: parseSourceKind(commandOptions.sourceKind as SourceKind),\n value: commandOptions.sourceValue\n },\n confidence: Number(commandOptions.confidence),\n scope: parseMemoryScope(commandOptions.scope),\n tags: parseCsv(commandOptions.tags),\n expiresAt: commandOptions.expiresAt,\n links: parseCsv(commandOptions.links),\n metadata: parseJsonObject(commandOptions.metadata)\n });\n emit(entry, true);\n store.close();\n });\n\nprogram\n .command(\"search\")\n .description(\"Search memory entries by keyword\")\n .argument(\"<query>\")\n .option(\"--scopes <items>\", \"Comma-separated scopes\")\n .option(\"--types <items>\", \"Comma-separated types\")\n .option(\"--tags <items>\", \"Comma-separated tags\")\n .option(\"--source-kind <kind>\")\n .option(\"--source-value <value>\")\n .option(\"--before <iso>\")\n .option(\"--after <iso>\")\n .option(\"--include-expired\", \"Include expired entries\")\n .option(\"--limit <number>\", \"Maximum result count\", \"50\")\n .action((query, commandOptions) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const result = store.search({\n query,\n scopes: parseScopes(commandOptions.scopes),\n types: parseTypes(commandOptions.types),\n tags: parseTags(commandOptions.tags),\n sourceKind: commandOptions.sourceKind ? parseSourceKind(commandOptions.sourceKind as SourceKind) : undefined,\n sourceValue: commandOptions.sourceValue,\n before: commandOptions.before,\n after: commandOptions.after,\n includeExpired: Boolean(commandOptions.includeExpired),\n limit: Number(commandOptions.limit)\n });\n emit(result, true);\n store.close();\n });\n\nprogram\n .command(\"timeline\")\n .description(\"View time-ordered memory entries\")\n .option(\"--scopes <items>\", \"Comma-separated scopes\")\n .option(\"--types <items>\", \"Comma-separated types\")\n .option(\"--tags <items>\", \"Comma-separated tags\")\n .option(\"--source-kind <kind>\")\n .option(\"--source-value <value>\")\n .option(\"--before <iso>\")\n .option(\"--after <iso>\")\n .option(\"--include-expired\", \"Include expired entries\")\n .option(\"--order <direction>\", \"asc or desc\", \"asc\")\n .option(\"--limit <number>\", \"Maximum result count\", \"50\")\n .action((commandOptions) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const result = store.timeline({\n scopes: parseScopes(commandOptions.scopes),\n types: parseTypes(commandOptions.types),\n tags: parseTags(commandOptions.tags),\n sourceKind: commandOptions.sourceKind ? parseSourceKind(commandOptions.sourceKind as SourceKind) : undefined,\n sourceValue: commandOptions.sourceValue,\n before: commandOptions.before,\n after: commandOptions.after,\n includeExpired: Boolean(commandOptions.includeExpired),\n order: commandOptions.order === \"desc\" ? \"desc\" : \"asc\",\n limit: Number(commandOptions.limit)\n });\n emit(result, true);\n store.close();\n });\n\nprogram\n .command(\"get\")\n .description(\"Get a memory entry by id\")\n .argument(\"<id>\")\n .action((id) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const result = store.get(id);\n emit(result, true);\n store.close();\n });\n\nprogram\n .command(\"export\")\n .description(\"Export entries as JSONL\")\n .option(\"--output <path>\")\n .option(\"--scopes <items>\", \"Comma-separated scopes\")\n .option(\"--types <items>\", \"Comma-separated types\")\n .option(\"--tags <items>\", \"Comma-separated tags\")\n .option(\"--source-kind <kind>\")\n .option(\"--source-value <value>\")\n .option(\"--before <iso>\")\n .option(\"--after <iso>\")\n .option(\"--include-expired\", \"Include expired entries\")\n .option(\"--order <direction>\", \"asc or desc\", \"asc\")\n .option(\"--limit <number>\", \"Maximum result count\", \"1000\")\n .action((commandOptions) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const jsonl = store.exportJsonl({\n scopes: parseScopes(commandOptions.scopes),\n types: parseTypes(commandOptions.types),\n tags: parseTags(commandOptions.tags),\n sourceKind: commandOptions.sourceKind ? parseSourceKind(commandOptions.sourceKind as SourceKind) : undefined,\n sourceValue: commandOptions.sourceValue,\n before: commandOptions.before,\n after: commandOptions.after,\n includeExpired: Boolean(commandOptions.includeExpired),\n order: commandOptions.order === \"desc\" ? \"desc\" : \"asc\",\n limit: Number(commandOptions.limit)\n });\n\n if (commandOptions.output) {\n writeFileSync(resolve(commandOptions.output), jsonl ? `${jsonl}\\n` : \"\");\n emit({ ok: true, output: resolve(commandOptions.output) }, options.json);\n } else {\n emit(jsonl, false);\n }\n\n store.close();\n });\n\nprogram\n .command(\"import\")\n .description(\"Import entries from JSONL\")\n .argument(\"[input]\", \"Path to JSONL file, or - for stdin\", \"-\")\n .action((input) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const jsonl = input === \"-\" ? readFileSync(0, \"utf8\") : readFileSync(resolve(input), \"utf8\");\n const result = store.importJsonl(jsonl);\n emit(result, true);\n store.close();\n });\n\nprogram\n .command(\"gc\")\n .description(\"Delete expired entries\")\n .option(\"--now <iso>\", \"Override current time for deterministic runs\")\n .action((commandOptions) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const result = store.gc(commandOptions.now ? toIsoString(commandOptions.now) : new Date());\n emit(result, true);\n store.close();\n });\n\nprogram\n .command(\"mcp\")\n .description(\"Run the Chrona MCP server\")\n .option(\"--db <path>\", \"Path to the SQLite database\")\n .option(\"--stdio\", \"Use stdio transport\")\n .option(\"--port <number>\", \"Serve MCP over Streamable HTTP on the given port\")\n .action(async (commandOptions) => {\n const options = program.opts<CommonOptions>();\n const dbPath = commandOptions.db ?? options.db ?? process.env.CHRONA_DB ?? \".chrona/chrona.db\";\n const port = commandOptions.port === undefined ? undefined : Number(commandOptions.port);\n\n if (commandOptions.stdio && port !== undefined) {\n throw new Error(\"Choose either --stdio or --port, not both\");\n }\n\n if (port !== undefined && (!Number.isInteger(port) || port < 1 || port > 65535)) {\n throw new Error(`Invalid port: ${String(commandOptions.port)}`);\n }\n\n await startChronaMcpServer({\n dbPath,\n port\n });\n });\n\nprogram.parseAsync(process.argv).catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(message);\n process.exitCode = 1;\n});\n","import { createServer, type IncomingMessage, type Server as HttpServer, type ServerResponse } from \"node:http\";\nimport { resolve } from \"node:path\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport * as z from \"zod/v4\";\nimport { ChromaStore } from \"./store.js\";\nimport { memoryScopes, memoryTypes, sourceKinds, type AddMemoryInput, type MemoryEntry, type QueryOptions } from \"./types.js\";\n\nconst memoryTypeSchema = z.enum(memoryTypes);\nconst memoryScopeSchema = z.enum(memoryScopes);\nconst sourceKindSchema = z.enum(sourceKinds);\nconst jsonValueSchema = z.json();\nconst jsonObjectSchema = z.record(z.string(), jsonValueSchema);\nconst sourceSchema = z.object({\n kind: sourceKindSchema,\n value: z.string().trim().min(1)\n});\nconst memoryEntrySchema = z.object({\n id: z.string(),\n type: memoryTypeSchema,\n text: z.string(),\n createdAt: z.string(),\n source: sourceSchema,\n confidence: z.number(),\n scope: memoryScopeSchema,\n tags: z.array(z.string()),\n expiresAt: z.string().optional(),\n links: z.array(z.string()),\n metadata: jsonObjectSchema\n});\nconst queryOptionsSchema = z.object({\n scopes: z.array(memoryScopeSchema).optional(),\n types: z.array(memoryTypeSchema).optional(),\n tags: z.array(z.string()).optional(),\n sourceKind: sourceKindSchema.optional(),\n sourceValue: z.string().trim().min(1).optional(),\n before: z.string().optional(),\n after: z.string().optional(),\n includeExpired: z.boolean().default(false)\n});\n\nexport const chronaAddInputSchema = z.object({\n id: z.string().trim().min(1).optional(),\n type: memoryTypeSchema,\n text: z.string().trim().min(1),\n createdAt: z.string().optional(),\n source: sourceSchema,\n confidence: z.number().min(0).max(1),\n scope: memoryScopeSchema,\n tags: z.array(z.string()).default([]),\n expiresAt: z.string().optional(),\n links: z.array(z.string()).default([]),\n metadata: jsonObjectSchema.default({})\n});\nexport const chronaAddResultSchema = z.object({\n entry: memoryEntrySchema\n});\nexport const chronaGetInputSchema = z.object({\n id: z.string().trim().min(1)\n});\nexport const chronaGetResultSchema = z.object({\n entry: memoryEntrySchema.nullable()\n});\nexport const chronaSearchInputSchema = queryOptionsSchema.extend({\n query: z.string().trim().min(1),\n limit: z.number().int().min(1).max(1000).default(50)\n});\nexport const chronaSearchResultSchema = z.object({\n count: z.number().int().min(0),\n items: z.array(memoryEntrySchema)\n});\nexport const chronaTimelineInputSchema = queryOptionsSchema.extend({\n order: z.enum([\"asc\", \"desc\"]).default(\"asc\"),\n limit: z.number().int().min(1).max(1000).default(50)\n});\nexport const chronaTimelineResultSchema = z.object({\n count: z.number().int().min(0),\n items: z.array(memoryEntrySchema)\n});\nexport const chronaExportInputSchema = queryOptionsSchema.extend({\n order: z.enum([\"asc\", \"desc\"]).default(\"asc\"),\n limit: z.number().int().min(1).max(1000).default(1000)\n});\nexport const chronaExportResultSchema = z.object({\n count: z.number().int().min(0),\n jsonl: z.string()\n});\nexport const chronaImportInputSchema = z.object({\n jsonl: z.string()\n});\nexport const chronaImportResultSchema = z.object({\n imported: z.number().int().min(0),\n updated: z.number().int().min(0),\n ids: z.array(z.string())\n});\nexport const chronaGcInputSchema = z.object({\n now: z.string().optional()\n});\nexport const chronaGcResultSchema = z.object({\n deleted: z.number().int().min(0),\n ids: z.array(z.string()),\n now: z.string()\n});\n\nexport type ChronaAddInput = z.input<typeof chronaAddInputSchema>;\nexport type ChronaAddResult = z.infer<typeof chronaAddResultSchema>;\nexport type ChronaGetInput = z.input<typeof chronaGetInputSchema>;\nexport type ChronaGetResult = z.infer<typeof chronaGetResultSchema>;\nexport type ChronaSearchInput = z.input<typeof chronaSearchInputSchema>;\nexport type ChronaSearchResult = z.infer<typeof chronaSearchResultSchema>;\nexport type ChronaTimelineInput = z.input<typeof chronaTimelineInputSchema>;\nexport type ChronaTimelineResult = z.infer<typeof chronaTimelineResultSchema>;\nexport type ChronaExportInput = z.input<typeof chronaExportInputSchema>;\nexport type ChronaExportResult = z.infer<typeof chronaExportResultSchema>;\nexport type ChronaImportInput = z.input<typeof chronaImportInputSchema>;\nexport type ChronaImportResult = z.infer<typeof chronaImportResultSchema>;\nexport type ChronaGcInput = z.input<typeof chronaGcInputSchema>;\nexport type ChronaGcResult = z.infer<typeof chronaGcResultSchema>;\n\nexport interface ChronaMcpHandlers {\n add(input: ChronaAddInput): ChronaAddResult;\n get(input: ChronaGetInput): ChronaGetResult;\n search(input: ChronaSearchInput): ChronaSearchResult;\n timeline(input: ChronaTimelineInput): ChronaTimelineResult;\n export(input: ChronaExportInput): ChronaExportResult;\n import(input: ChronaImportInput): ChronaImportResult;\n gc(input?: ChronaGcInput): ChronaGcResult;\n}\n\ntype JsonValue = z.infer<typeof jsonValueSchema>;\ntype JsonObject = z.infer<typeof jsonObjectSchema>;\n\nexport interface StartChronaMcpServerOptions {\n dbPath: string;\n port?: number;\n}\n\nfunction withStore<T>(dbPath: string, run: (store: ChromaStore) => T): T {\n const store = new ChromaStore(dbPath);\n\n try {\n return run(store);\n } finally {\n store.close();\n }\n}\n\nfunction toQueryOptions(input: z.infer<typeof queryOptionsSchema> & { limit?: number; order?: \"asc\" | \"desc\" }): QueryOptions {\n return {\n scopes: input.scopes,\n types: input.types,\n tags: input.tags,\n sourceKind: input.sourceKind,\n sourceValue: input.sourceValue,\n before: input.before,\n after: input.after,\n includeExpired: input.includeExpired,\n limit: input.limit\n };\n}\n\nfunction sortJsonValue(value: JsonValue): JsonValue {\n if (Array.isArray(value)) {\n return value.map(sortJsonValue);\n }\n\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, innerValue]) => [key, sortJsonValue(innerValue)])\n );\n }\n\n return value;\n}\n\nfunction toOutputEntry(entry: MemoryEntry): z.infer<typeof memoryEntrySchema> {\n const base = {\n id: entry.id,\n type: entry.type,\n text: entry.text,\n createdAt: entry.createdAt,\n source: {\n kind: entry.source.kind,\n value: entry.source.value\n },\n confidence: entry.confidence,\n scope: entry.scope,\n tags: [...entry.tags],\n links: [...(entry.links ?? [])],\n metadata: sortJsonValue((entry.metadata ?? {}) as JsonObject) as JsonObject\n };\n\n if (entry.expiresAt) {\n return {\n ...base,\n expiresAt: entry.expiresAt\n };\n }\n\n return base;\n}\n\nfunction toToolResult<T extends object>(value: T): { content: Array<{ type: \"text\"; text: string }>; structuredContent: T } {\n const stableValue = sortJsonValue(value as JsonValue) as T;\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(stableValue, null, 2)\n }\n ],\n structuredContent: stableValue\n };\n}\n\nfunction lineCount(value: string): number {\n return value === \"\" ? 0 : value.split(\"\\n\").length;\n}\n\nexport function createChronaMcpHandlers(dbPath: string): ChronaMcpHandlers {\n const resolvedDbPath = resolve(dbPath);\n\n return {\n add(input) {\n const args = chronaAddInputSchema.parse(input);\n\n return withStore(resolvedDbPath, (store) => {\n const entry = store.add({\n id: args.id,\n type: args.type,\n text: args.text,\n createdAt: args.createdAt,\n source: args.source,\n confidence: args.confidence,\n scope: args.scope,\n tags: args.tags,\n expiresAt: args.expiresAt,\n links: args.links,\n metadata: args.metadata\n } satisfies AddMemoryInput);\n\n return {\n entry: toOutputEntry(entry)\n };\n });\n },\n get(input) {\n const args = chronaGetInputSchema.parse(input);\n\n return withStore(resolvedDbPath, (store) => {\n const entry = store.get(args.id);\n\n return {\n entry: entry ? toOutputEntry(entry) : null\n };\n });\n },\n search(input) {\n const args = chronaSearchInputSchema.parse(input);\n\n return withStore(resolvedDbPath, (store) => {\n const items = store.search({\n ...toQueryOptions(args),\n query: args.query\n }).map(toOutputEntry);\n\n return {\n count: items.length,\n items\n };\n });\n },\n timeline(input) {\n const args = chronaTimelineInputSchema.parse(input);\n\n return withStore(resolvedDbPath, (store) => {\n const items = store.timeline({\n ...toQueryOptions(args),\n order: args.order\n }).map(toOutputEntry);\n\n return {\n count: items.length,\n items\n };\n });\n },\n export(input) {\n const args = chronaExportInputSchema.parse(input);\n\n return withStore(resolvedDbPath, (store) => {\n const jsonl = store.exportJsonl({\n ...toQueryOptions(args),\n order: args.order\n });\n\n return {\n count: lineCount(jsonl),\n jsonl\n };\n });\n },\n import(input) {\n const args = chronaImportInputSchema.parse(input);\n\n return withStore(resolvedDbPath, (store) => store.importJsonl(args.jsonl));\n },\n gc(input = {}) {\n const args = chronaGcInputSchema.parse(input);\n\n return withStore(resolvedDbPath, (store) => store.gc(args.now));\n }\n };\n}\n\nexport function createChronaMcpServer(dbPath: string): McpServer {\n const handlers = createChronaMcpHandlers(dbPath);\n const server = new McpServer({\n name: \"chrona\",\n version: \"0.1.1\"\n });\n\n server.registerTool(\n \"chrona_add\",\n {\n description: \"Add a memory entry to Chrona.\",\n inputSchema: chronaAddInputSchema,\n outputSchema: chronaAddResultSchema\n },\n async (input) => toToolResult(handlers.add(input))\n );\n\n server.registerTool(\n \"chrona_get\",\n {\n description: \"Get a memory entry by id.\",\n inputSchema: chronaGetInputSchema,\n outputSchema: chronaGetResultSchema,\n annotations: { readOnlyHint: true }\n },\n async (input) => toToolResult(handlers.get(input))\n );\n\n server.registerTool(\n \"chrona_search\",\n {\n description: \"Search memory entries with deterministic ordering.\",\n inputSchema: chronaSearchInputSchema,\n outputSchema: chronaSearchResultSchema,\n annotations: { readOnlyHint: true }\n },\n async (input) => toToolResult(handlers.search(input))\n );\n\n server.registerTool(\n \"chrona_timeline\",\n {\n description: \"List memory entries in time order.\",\n inputSchema: chronaTimelineInputSchema,\n outputSchema: chronaTimelineResultSchema,\n annotations: { readOnlyHint: true }\n },\n async (input) => toToolResult(handlers.timeline(input))\n );\n\n server.registerTool(\n \"chrona_export\",\n {\n description: \"Export matching entries as deterministic JSONL.\",\n inputSchema: chronaExportInputSchema,\n outputSchema: chronaExportResultSchema,\n annotations: { readOnlyHint: true }\n },\n async (input) => toToolResult(handlers.export(input))\n );\n\n server.registerTool(\n \"chrona_import\",\n {\n description: \"Import entries from JSONL.\",\n inputSchema: chronaImportInputSchema,\n outputSchema: chronaImportResultSchema\n },\n async (input) => toToolResult(handlers.import(input))\n );\n\n server.registerTool(\n \"chrona_gc\",\n {\n description: \"Delete expired memory entries.\",\n inputSchema: chronaGcInputSchema,\n outputSchema: chronaGcResultSchema\n },\n async (input) => toToolResult(handlers.gc(input))\n );\n\n return server;\n}\n\nasync function readRequestBody(request: IncomingMessage): Promise<unknown> {\n const chunks: Buffer[] = [];\n\n for await (const chunk of request) {\n chunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n }\n\n const body = Buffer.concat(chunks).toString(\"utf8\").trim();\n return body === \"\" ? undefined : JSON.parse(body);\n}\n\nfunction sendHttpJson(response: ServerResponse, statusCode: number, payload: unknown): void {\n response.statusCode = statusCode;\n response.setHeader(\"content-type\", \"application/json\");\n response.end(JSON.stringify(payload));\n}\n\nfunction createChronaMcpHttpServer(dbPath: string, port: number): HttpServer {\n return createServer(async (request, response) => {\n const requestUrl = new URL(request.url ?? \"/\", `http://${request.headers.host ?? `127.0.0.1:${port}`}`);\n\n if (requestUrl.pathname !== \"/mcp\") {\n sendHttpJson(response, 404, {\n error: {\n code: 404,\n message: \"Not found\"\n }\n });\n return;\n }\n\n if (request.method !== \"POST\") {\n sendHttpJson(response, 405, {\n error: {\n code: 405,\n message: \"Method not allowed\"\n }\n });\n return;\n }\n\n const server = createChronaMcpServer(dbPath);\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined\n });\n\n response.on(\"close\", () => {\n transport.close().catch(() => undefined);\n server.close().catch(() => undefined);\n });\n\n try {\n const parsedBody = await readRequestBody(request);\n await server.connect(transport);\n await transport.handleRequest(request, response, parsedBody);\n } catch (error) {\n if (!response.headersSent) {\n sendHttpJson(response, 500, {\n error: {\n code: 500,\n message: error instanceof Error ? error.message : String(error)\n }\n });\n }\n }\n });\n}\n\nexport async function startChronaMcpServer(options: StartChronaMcpServerOptions): Promise<void> {\n const resolvedDbPath = resolve(options.dbPath);\n\n if (options.port !== undefined) {\n const server = createChronaMcpHttpServer(resolvedDbPath, options.port);\n\n await new Promise<void>((resolvePromise, reject) => {\n server.once(\"error\", reject);\n server.listen(options.port, \"127.0.0.1\", () => {\n server.off(\"error\", reject);\n console.error(`Chrona MCP server listening on http://127.0.0.1:${options.port}/mcp`);\n resolvePromise();\n });\n });\n\n return;\n }\n\n const server = createChronaMcpServer(resolvedDbPath);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","import Database from \"better-sqlite3\";\nimport { mkdirSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport type {\n AddMemoryInput,\n ExportOptions,\n GcResult,\n ImportResult,\n MemoryEntry,\n QueryOptions,\n SearchOptions,\n TimelineOptions\n} from \"./types.js\";\nimport { normalizeEntry } from \"./validate.js\";\nimport { serializeJson, toIsoString } from \"./utils.js\";\n\ninterface MemoryRow {\n id: string;\n type: MemoryEntry[\"type\"];\n text: string;\n created_at: string;\n source_kind: MemoryEntry[\"source\"][\"kind\"];\n source_value: string;\n confidence: number;\n scope: MemoryEntry[\"scope\"];\n tags_json: string;\n expires_at: string | null;\n links_json: string;\n metadata_json: string;\n}\n\nexport class ChromaStore {\n readonly path: string;\n readonly db: Database.Database;\n\n constructor(path = resolve(process.cwd(), \".chrona/chrona.db\")) {\n this.path = resolve(path);\n mkdirSync(dirname(this.path), { recursive: true });\n this.db = new Database(this.path);\n this.db.pragma(\"journal_mode = WAL\");\n this.db.pragma(\"foreign_keys = ON\");\n this.db.pragma(\"busy_timeout = 5000\");\n }\n\n init(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS memories (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n text TEXT NOT NULL,\n created_at TEXT NOT NULL,\n source_kind TEXT NOT NULL,\n source_value TEXT NOT NULL,\n confidence REAL NOT NULL,\n scope TEXT NOT NULL,\n tags_json TEXT NOT NULL,\n expires_at TEXT,\n links_json TEXT NOT NULL,\n metadata_json TEXT NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_memories_created_at ON memories(created_at);\n CREATE INDEX IF NOT EXISTS idx_memories_scope ON memories(scope);\n CREATE INDEX IF NOT EXISTS idx_memories_type ON memories(type);\n CREATE INDEX IF NOT EXISTS idx_memories_expires_at ON memories(expires_at);\n CREATE INDEX IF NOT EXISTS idx_memories_source ON memories(source_kind, source_value);\n `);\n }\n\n close(): void {\n this.db.close();\n }\n\n add(input: AddMemoryInput): MemoryEntry {\n const entry = normalizeEntry(input);\n this.init();\n\n this.db.prepare(`\n INSERT INTO memories (\n id,\n type,\n text,\n created_at,\n source_kind,\n source_value,\n confidence,\n scope,\n tags_json,\n expires_at,\n links_json,\n metadata_json\n ) VALUES (\n @id,\n @type,\n @text,\n @created_at,\n @source_kind,\n @source_value,\n @confidence,\n @scope,\n @tags_json,\n @expires_at,\n @links_json,\n @metadata_json\n )\n `).run(this.toRow(entry));\n\n return entry;\n }\n\n get(id: string): MemoryEntry | null {\n this.init();\n const row = this.db.prepare(\"SELECT * FROM memories WHERE id = ?\").get(id) as MemoryRow | undefined;\n return row ? this.fromRow(row) : null;\n }\n\n search(options: SearchOptions): MemoryEntry[] {\n this.init();\n const { sql, params } = this.buildQuery(\n options,\n [\n \"(\",\n \"lower(text) LIKE @query\",\n \"OR lower(tags_json) LIKE @query\",\n \"OR lower(source_kind || ':' || source_value) LIKE @query\",\n \"OR lower(metadata_json) LIKE @query\",\n \")\"\n ].join(\" \"),\n { query: `%${options.query.toLowerCase()}%` },\n \"ORDER BY created_at DESC, confidence DESC, id ASC\"\n );\n\n return this.db.prepare(sql).all(params).map((row) => this.fromRow(row as MemoryRow));\n }\n\n timeline(options: TimelineOptions = {}): MemoryEntry[] {\n this.init();\n const direction = options.order === \"desc\" ? \"DESC\" : \"ASC\";\n const { sql, params } = this.buildQuery(options, undefined, {}, `ORDER BY created_at ${direction}, id ASC`);\n return this.db.prepare(sql).all(params).map((row) => this.fromRow(row as MemoryRow));\n }\n\n exportJsonl(options: ExportOptions = {}): string {\n return this.timeline(options).map((entry) => JSON.stringify(entry)).join(\"\\n\");\n }\n\n importJsonl(input: string): ImportResult {\n this.init();\n const lines = input.split(/\\r?\\n/).map((line) => line.trim()).filter(Boolean);\n const ids: string[] = [];\n let imported = 0;\n let updated = 0;\n\n const statement = this.db.prepare(`\n INSERT INTO memories (\n id,\n type,\n text,\n created_at,\n source_kind,\n source_value,\n confidence,\n scope,\n tags_json,\n expires_at,\n links_json,\n metadata_json\n ) VALUES (\n @id,\n @type,\n @text,\n @created_at,\n @source_kind,\n @source_value,\n @confidence,\n @scope,\n @tags_json,\n @expires_at,\n @links_json,\n @metadata_json\n )\n ON CONFLICT(id) DO UPDATE SET\n type = excluded.type,\n text = excluded.text,\n created_at = excluded.created_at,\n source_kind = excluded.source_kind,\n source_value = excluded.source_value,\n confidence = excluded.confidence,\n scope = excluded.scope,\n tags_json = excluded.tags_json,\n expires_at = excluded.expires_at,\n links_json = excluded.links_json,\n metadata_json = excluded.metadata_json\n `);\n\n const transaction = this.db.transaction(() => {\n for (const line of lines) {\n const entry = normalizeEntry(JSON.parse(line) as AddMemoryInput);\n const exists = this.get(entry.id);\n statement.run(this.toRow(entry));\n ids.push(entry.id);\n if (exists) {\n updated += 1;\n } else {\n imported += 1;\n }\n }\n });\n\n transaction();\n\n return {\n imported,\n updated,\n ids: [...ids].sort((a, b) => a.localeCompare(b))\n };\n }\n\n gc(now?: string | Date): GcResult {\n this.init();\n const nowIso = toIsoString(now);\n const rows = this.db.prepare(\n \"SELECT id FROM memories WHERE expires_at IS NOT NULL AND expires_at <= ? ORDER BY expires_at ASC, id ASC\"\n ).all(nowIso) as Array<{ id: string }>;\n const ids = rows.map((row) => row.id);\n\n if (ids.length > 0) {\n this.db.prepare(\"DELETE FROM memories WHERE expires_at IS NOT NULL AND expires_at <= ?\").run(nowIso);\n }\n\n return {\n deleted: ids.length,\n ids,\n now: nowIso\n };\n }\n\n private buildQuery(\n options: QueryOptions,\n extraWhere?: string,\n extraParams: Record<string, unknown> = {},\n orderBy = \"ORDER BY created_at ASC, id ASC\"\n ): { sql: string; params: Record<string, unknown> } {\n const where: string[] = [];\n const params: Record<string, unknown> = { ...extraParams };\n\n if (!options.includeExpired) {\n where.push(\"(expires_at IS NULL OR expires_at > @now)\");\n params.now = toIsoString();\n }\n\n if (options.scopes?.length) {\n const placeholders = options.scopes.map((_, index) => `@scope${index}`);\n where.push(`scope IN (${placeholders.join(\", \")})`);\n for (const [index, scope] of options.scopes.entries()) {\n params[`scope${index}`] = scope;\n }\n }\n\n if (options.types?.length) {\n const placeholders = options.types.map((_, index) => `@type${index}`);\n where.push(`type IN (${placeholders.join(\", \")})`);\n for (const [index, type] of options.types.entries()) {\n params[`type${index}`] = type;\n }\n }\n\n if (options.tags?.length) {\n const tagParts: string[] = [];\n for (const [index, tag] of options.tags.entries()) {\n const key = `tag${index}`;\n tagParts.push(`lower(tags_json) LIKE @${key}`);\n params[key] = `%${tag.toLowerCase()}%`;\n }\n where.push(`(${tagParts.join(\" OR \")})`);\n }\n\n if (options.sourceKind) {\n where.push(\"source_kind = @sourceKind\");\n params.sourceKind = options.sourceKind;\n }\n\n if (options.sourceValue) {\n where.push(\"source_value = @sourceValue\");\n params.sourceValue = options.sourceValue;\n }\n\n if (options.before) {\n where.push(\"created_at <= @before\");\n params.before = toIsoString(options.before);\n }\n\n if (options.after) {\n where.push(\"created_at >= @after\");\n params.after = toIsoString(options.after);\n }\n\n if (extraWhere) {\n where.push(extraWhere);\n }\n\n const limit = Math.max(1, Math.min(options.limit ?? 50, 1000));\n params.limit = limit;\n const whereSql = where.length ? `WHERE ${where.join(\" AND \")}` : \"\";\n\n return {\n sql: `SELECT * FROM memories ${whereSql} ${orderBy} LIMIT @limit`,\n params\n };\n }\n\n private toRow(entry: MemoryEntry): Record<string, unknown> {\n return {\n id: entry.id,\n type: entry.type,\n text: entry.text,\n created_at: entry.createdAt,\n source_kind: entry.source.kind,\n source_value: entry.source.value,\n confidence: entry.confidence,\n scope: entry.scope,\n tags_json: serializeJson(entry.tags),\n expires_at: entry.expiresAt ?? null,\n links_json: serializeJson(entry.links ?? []),\n metadata_json: serializeJson(entry.metadata ?? {})\n };\n }\n\n private fromRow(row: MemoryRow): MemoryEntry {\n return {\n id: row.id,\n type: row.type,\n text: row.text,\n createdAt: row.created_at,\n source: {\n kind: row.source_kind,\n value: row.source_value\n },\n confidence: row.confidence,\n scope: row.scope,\n tags: JSON.parse(row.tags_json) as string[],\n expiresAt: row.expires_at ?? undefined,\n links: JSON.parse(row.links_json) as string[],\n metadata: JSON.parse(row.metadata_json) as Record<string, unknown>\n };\n }\n}\n","export const memoryTypes = [\"decision\", \"preference\", \"fact\", \"incident\", \"constraint\"] as const;\nexport const memoryScopes = [\"user\", \"project\", \"org\", \"shared\"] as const;\nexport const sourceKinds = [\"tool\", \"session\", \"repo\"] as const;\n\nexport type MemoryType = (typeof memoryTypes)[number];\nexport type MemoryScope = (typeof memoryScopes)[number];\nexport type SourceKind = (typeof sourceKinds)[number];\n\nexport interface MemorySource {\n kind: SourceKind;\n value: string;\n}\n\nexport interface MemoryEntry {\n id: string;\n type: MemoryType;\n text: string;\n createdAt: string;\n source: MemorySource;\n confidence: number;\n scope: MemoryScope;\n tags: string[];\n expiresAt?: string;\n links?: string[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface AddMemoryInput {\n id?: string;\n type: MemoryType;\n text: string;\n createdAt?: string;\n source: MemorySource;\n confidence: number;\n scope: MemoryScope;\n tags: string[];\n expiresAt?: string;\n links?: string[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface QueryOptions {\n scopes?: MemoryScope[];\n types?: MemoryType[];\n tags?: string[];\n sourceKind?: SourceKind;\n sourceValue?: string;\n before?: string;\n after?: string;\n includeExpired?: boolean;\n limit?: number;\n}\n\nexport interface SearchOptions extends QueryOptions {\n query: string;\n}\n\nexport interface TimelineOptions extends QueryOptions {\n order?: \"asc\" | \"desc\";\n}\n\nexport interface ExportOptions extends TimelineOptions {}\n\nexport interface ImportResult {\n imported: number;\n updated: number;\n ids: string[];\n}\n\nexport interface GcResult {\n deleted: number;\n ids: string[];\n now: string;\n}\n","import { randomUUID } from \"node:crypto\";\n\nexport function toIsoString(value?: string | Date): string {\n const date = value instanceof Date ? value : value ? new Date(value) : new Date();\n const iso = date.toISOString();\n\n if (Number.isNaN(date.getTime())) {\n throw new Error(`Invalid date: ${String(value)}`);\n }\n\n return iso;\n}\n\nexport function uniqueSorted(values: string[] | undefined): string[] {\n return [...new Set((values ?? []).map((value) => value.trim()).filter(Boolean))].sort((a, b) => a.localeCompare(b));\n}\n\nexport function normalizeConfidence(value: number): number {\n if (!Number.isFinite(value) || value < 0 || value > 1) {\n throw new Error(\"confidence must be between 0 and 1\");\n }\n\n return Number(value.toFixed(6));\n}\n\nexport function parseJsonObject(value: unknown): Record<string, unknown> | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value === \"object\" && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n\n if (typeof value !== \"string\" || value.trim() === \"\") {\n throw new Error(\"metadata must be an object or JSON object string\");\n }\n\n const parsed = JSON.parse(value) as unknown;\n\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"metadata must be a JSON object\");\n }\n\n return parsed as Record<string, unknown>;\n}\n\nexport function parseCsv(value?: string): string[] {\n if (!value) {\n return [];\n }\n\n return value.split(\",\").map((item) => item.trim()).filter(Boolean);\n}\n\nexport function ensureId(value?: string): string {\n return value?.trim() || randomUUID();\n}\n\nexport function serializeJson(value: unknown): string {\n return JSON.stringify(value ?? {});\n}\n","import {\n memoryScopes,\n memoryTypes,\n sourceKinds,\n type AddMemoryInput,\n type MemoryEntry,\n type MemoryScope,\n type MemoryType,\n type SourceKind\n} from \"./types.js\";\nimport { ensureId, normalizeConfidence, parseJsonObject, toIsoString, uniqueSorted } from \"./utils.js\";\n\nfunction includesValue<T extends string>(values: readonly T[], value: string, label: string): T {\n if (!values.includes(value as T)) {\n throw new Error(`Invalid ${label}: ${value}`);\n }\n\n return value as T;\n}\n\nexport function parseMemoryType(value: string): MemoryType {\n return includesValue(memoryTypes, value, \"type\");\n}\n\nexport function parseMemoryScope(value: string): MemoryScope {\n return includesValue(memoryScopes, value, \"scope\");\n}\n\nexport function parseSourceKind(value: string): SourceKind {\n return includesValue(sourceKinds, value, \"source kind\");\n}\n\nexport function normalizeEntry(input: AddMemoryInput | MemoryEntry): MemoryEntry {\n if (!input.text.trim()) {\n throw new Error(\"text is required\");\n }\n\n if (!input.source?.value?.trim()) {\n throw new Error(\"source.value is required\");\n }\n\n return {\n id: ensureId(input.id),\n type: parseMemoryType(input.type),\n text: input.text.trim(),\n createdAt: toIsoString(input.createdAt),\n source: {\n kind: parseSourceKind(input.source.kind),\n value: input.source.value.trim()\n },\n confidence: normalizeConfidence(input.confidence),\n scope: parseMemoryScope(input.scope),\n tags: uniqueSorted(input.tags),\n expiresAt: input.expiresAt ? toIsoString(input.expiresAt) : undefined,\n links: uniqueSorted(input.links),\n metadata: parseJsonObject(input.metadata)\n };\n}\n"],"mappings":"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","names":["import_node_fs","import_node_path","import_node_path","Database","server"]}
package/dist/cli.js CHANGED
@@ -6,8 +6,9 @@ import {
6
6
  parseMemoryScope,
7
7
  parseMemoryType,
8
8
  parseSourceKind,
9
+ startChronaMcpServer,
9
10
  toIsoString
10
- } from "./chunk-PPAKIDJE.js";
11
+ } from "./chunk-4QI4QC33.js";
11
12
 
12
13
  // src/cli.ts
13
14
  import { Command } from "commander";
@@ -40,7 +41,7 @@ function parseTags(value) {
40
41
  return tags.length ? tags : void 0;
41
42
  }
42
43
  var program = new Command();
43
- program.name("chrona").description("Time-aware local memory store for agents").version("0.1.0").option("--db <path>", "Path to the SQLite database").option("--json", "Emit machine-readable JSON");
44
+ program.name("chrona").description("Time-aware local memory store for agents").version("0.1.1").option("--db <path>", "Path to the SQLite database").option("--json", "Emit machine-readable JSON");
44
45
  program.command("init").description("Create or open the memory database").action(() => {
45
46
  const options = program.opts();
46
47
  const store = openStore(options);
@@ -152,6 +153,21 @@ program.command("gc").description("Delete expired entries").option("--now <iso>"
152
153
  emit(result, true);
153
154
  store.close();
154
155
  });
156
+ program.command("mcp").description("Run the Chrona MCP server").option("--db <path>", "Path to the SQLite database").option("--stdio", "Use stdio transport").option("--port <number>", "Serve MCP over Streamable HTTP on the given port").action(async (commandOptions) => {
157
+ const options = program.opts();
158
+ const dbPath = commandOptions.db ?? options.db ?? process.env.CHRONA_DB ?? ".chrona/chrona.db";
159
+ const port = commandOptions.port === void 0 ? void 0 : Number(commandOptions.port);
160
+ if (commandOptions.stdio && port !== void 0) {
161
+ throw new Error("Choose either --stdio or --port, not both");
162
+ }
163
+ if (port !== void 0 && (!Number.isInteger(port) || port < 1 || port > 65535)) {
164
+ throw new Error(`Invalid port: ${String(commandOptions.port)}`);
165
+ }
166
+ await startChronaMcpServer({
167
+ dbPath,
168
+ port
169
+ });
170
+ });
155
171
  program.parseAsync(process.argv).catch((error) => {
156
172
  const message = error instanceof Error ? error.message : String(error);
157
173
  console.error(message);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { ChromaStore } from \"./store.js\";\nimport type { MemoryScope, MemoryType, SourceKind } from \"./types.js\";\nimport { parseCsv, parseJsonObject, toIsoString } from \"./utils.js\";\nimport { parseMemoryScope, parseMemoryType, parseSourceKind } from \"./validate.js\";\n\ninterface CommonOptions {\n db?: string;\n json?: boolean;\n}\n\nfunction openStore(options: CommonOptions): ChromaStore {\n return new ChromaStore(resolve(options.db ?? process.env.CHRONA_DB ?? \".chrona/chrona.db\"));\n}\n\nfunction emit(value: unknown, asJson?: boolean): void {\n if (asJson) {\n console.log(JSON.stringify(value, null, 2));\n return;\n }\n\n if (typeof value === \"string\") {\n console.log(value);\n return;\n }\n\n console.log(JSON.stringify(value, null, 2));\n}\n\nfunction parseScopes(value?: string): MemoryScope[] | undefined {\n const scopes = parseCsv(value).map(parseMemoryScope);\n return scopes.length ? scopes : undefined;\n}\n\nfunction parseTypes(value?: string): MemoryType[] | undefined {\n const types = parseCsv(value).map(parseMemoryType);\n return types.length ? types : undefined;\n}\n\nfunction parseTags(value?: string): string[] | undefined {\n const tags = parseCsv(value);\n return tags.length ? tags : undefined;\n}\n\nconst program = new Command();\n\nprogram\n .name(\"chrona\")\n .description(\"Time-aware local memory store for agents\")\n .version(\"0.1.0\")\n .option(\"--db <path>\", \"Path to the SQLite database\")\n .option(\"--json\", \"Emit machine-readable JSON\");\n\nprogram\n .command(\"init\")\n .description(\"Create or open the memory database\")\n .action(() => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n store.init();\n emit({ ok: true, db: store.path }, options.json);\n store.close();\n });\n\nprogram\n .command(\"add\")\n .description(\"Add a memory entry\")\n .requiredOption(\"--type <type>\")\n .requiredOption(\"--text <text>\")\n .requiredOption(\"--source-kind <kind>\")\n .requiredOption(\"--source-value <value>\")\n .requiredOption(\"--confidence <number>\")\n .requiredOption(\"--scope <scope>\")\n .option(\"--id <id>\")\n .option(\"--created-at <iso>\")\n .option(\"--tags <items>\", \"Comma-separated tags\")\n .option(\"--expires-at <iso>\")\n .option(\"--links <items>\", \"Comma-separated links\")\n .option(\"--metadata <json>\", \"Metadata JSON object\")\n .action((commandOptions) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const entry = store.add({\n id: commandOptions.id,\n type: parseMemoryType(commandOptions.type),\n text: commandOptions.text,\n createdAt: commandOptions.createdAt,\n source: {\n kind: parseSourceKind(commandOptions.sourceKind as SourceKind),\n value: commandOptions.sourceValue\n },\n confidence: Number(commandOptions.confidence),\n scope: parseMemoryScope(commandOptions.scope),\n tags: parseCsv(commandOptions.tags),\n expiresAt: commandOptions.expiresAt,\n links: parseCsv(commandOptions.links),\n metadata: parseJsonObject(commandOptions.metadata)\n });\n emit(entry, true);\n store.close();\n });\n\nprogram\n .command(\"search\")\n .description(\"Search memory entries by keyword\")\n .argument(\"<query>\")\n .option(\"--scopes <items>\", \"Comma-separated scopes\")\n .option(\"--types <items>\", \"Comma-separated types\")\n .option(\"--tags <items>\", \"Comma-separated tags\")\n .option(\"--source-kind <kind>\")\n .option(\"--source-value <value>\")\n .option(\"--before <iso>\")\n .option(\"--after <iso>\")\n .option(\"--include-expired\", \"Include expired entries\")\n .option(\"--limit <number>\", \"Maximum result count\", \"50\")\n .action((query, commandOptions) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const result = store.search({\n query,\n scopes: parseScopes(commandOptions.scopes),\n types: parseTypes(commandOptions.types),\n tags: parseTags(commandOptions.tags),\n sourceKind: commandOptions.sourceKind ? parseSourceKind(commandOptions.sourceKind as SourceKind) : undefined,\n sourceValue: commandOptions.sourceValue,\n before: commandOptions.before,\n after: commandOptions.after,\n includeExpired: Boolean(commandOptions.includeExpired),\n limit: Number(commandOptions.limit)\n });\n emit(result, true);\n store.close();\n });\n\nprogram\n .command(\"timeline\")\n .description(\"View time-ordered memory entries\")\n .option(\"--scopes <items>\", \"Comma-separated scopes\")\n .option(\"--types <items>\", \"Comma-separated types\")\n .option(\"--tags <items>\", \"Comma-separated tags\")\n .option(\"--source-kind <kind>\")\n .option(\"--source-value <value>\")\n .option(\"--before <iso>\")\n .option(\"--after <iso>\")\n .option(\"--include-expired\", \"Include expired entries\")\n .option(\"--order <direction>\", \"asc or desc\", \"asc\")\n .option(\"--limit <number>\", \"Maximum result count\", \"50\")\n .action((commandOptions) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const result = store.timeline({\n scopes: parseScopes(commandOptions.scopes),\n types: parseTypes(commandOptions.types),\n tags: parseTags(commandOptions.tags),\n sourceKind: commandOptions.sourceKind ? parseSourceKind(commandOptions.sourceKind as SourceKind) : undefined,\n sourceValue: commandOptions.sourceValue,\n before: commandOptions.before,\n after: commandOptions.after,\n includeExpired: Boolean(commandOptions.includeExpired),\n order: commandOptions.order === \"desc\" ? \"desc\" : \"asc\",\n limit: Number(commandOptions.limit)\n });\n emit(result, true);\n store.close();\n });\n\nprogram\n .command(\"get\")\n .description(\"Get a memory entry by id\")\n .argument(\"<id>\")\n .action((id) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const result = store.get(id);\n emit(result, true);\n store.close();\n });\n\nprogram\n .command(\"export\")\n .description(\"Export entries as JSONL\")\n .option(\"--output <path>\")\n .option(\"--scopes <items>\", \"Comma-separated scopes\")\n .option(\"--types <items>\", \"Comma-separated types\")\n .option(\"--tags <items>\", \"Comma-separated tags\")\n .option(\"--source-kind <kind>\")\n .option(\"--source-value <value>\")\n .option(\"--before <iso>\")\n .option(\"--after <iso>\")\n .option(\"--include-expired\", \"Include expired entries\")\n .option(\"--order <direction>\", \"asc or desc\", \"asc\")\n .option(\"--limit <number>\", \"Maximum result count\", \"1000\")\n .action((commandOptions) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const jsonl = store.exportJsonl({\n scopes: parseScopes(commandOptions.scopes),\n types: parseTypes(commandOptions.types),\n tags: parseTags(commandOptions.tags),\n sourceKind: commandOptions.sourceKind ? parseSourceKind(commandOptions.sourceKind as SourceKind) : undefined,\n sourceValue: commandOptions.sourceValue,\n before: commandOptions.before,\n after: commandOptions.after,\n includeExpired: Boolean(commandOptions.includeExpired),\n order: commandOptions.order === \"desc\" ? \"desc\" : \"asc\",\n limit: Number(commandOptions.limit)\n });\n\n if (commandOptions.output) {\n writeFileSync(resolve(commandOptions.output), jsonl ? `${jsonl}\\n` : \"\");\n emit({ ok: true, output: resolve(commandOptions.output) }, options.json);\n } else {\n emit(jsonl, false);\n }\n\n store.close();\n });\n\nprogram\n .command(\"import\")\n .description(\"Import entries from JSONL\")\n .argument(\"[input]\", \"Path to JSONL file, or - for stdin\", \"-\")\n .action((input) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const jsonl = input === \"-\" ? readFileSync(0, \"utf8\") : readFileSync(resolve(input), \"utf8\");\n const result = store.importJsonl(jsonl);\n emit(result, true);\n store.close();\n });\n\nprogram\n .command(\"gc\")\n .description(\"Delete expired entries\")\n .option(\"--now <iso>\", \"Override current time for deterministic runs\")\n .action((commandOptions) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const result = store.gc(commandOptions.now ? toIsoString(commandOptions.now) : new Date());\n emit(result, true);\n store.close();\n });\n\nprogram.parseAsync(process.argv).catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(message);\n process.exitCode = 1;\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { startChronaMcpServer } from \"./mcp.js\";\nimport { ChromaStore } from \"./store.js\";\nimport type { MemoryScope, MemoryType, SourceKind } from \"./types.js\";\nimport { parseCsv, parseJsonObject, toIsoString } from \"./utils.js\";\nimport { parseMemoryScope, parseMemoryType, parseSourceKind } from \"./validate.js\";\n\ninterface CommonOptions {\n db?: string;\n json?: boolean;\n}\n\nfunction openStore(options: CommonOptions): ChromaStore {\n return new ChromaStore(resolve(options.db ?? process.env.CHRONA_DB ?? \".chrona/chrona.db\"));\n}\n\nfunction emit(value: unknown, asJson?: boolean): void {\n if (asJson) {\n console.log(JSON.stringify(value, null, 2));\n return;\n }\n\n if (typeof value === \"string\") {\n console.log(value);\n return;\n }\n\n console.log(JSON.stringify(value, null, 2));\n}\n\nfunction parseScopes(value?: string): MemoryScope[] | undefined {\n const scopes = parseCsv(value).map(parseMemoryScope);\n return scopes.length ? scopes : undefined;\n}\n\nfunction parseTypes(value?: string): MemoryType[] | undefined {\n const types = parseCsv(value).map(parseMemoryType);\n return types.length ? types : undefined;\n}\n\nfunction parseTags(value?: string): string[] | undefined {\n const tags = parseCsv(value);\n return tags.length ? tags : undefined;\n}\n\nconst program = new Command();\n\nprogram\n .name(\"chrona\")\n .description(\"Time-aware local memory store for agents\")\n .version(\"0.1.1\")\n .option(\"--db <path>\", \"Path to the SQLite database\")\n .option(\"--json\", \"Emit machine-readable JSON\");\n\nprogram\n .command(\"init\")\n .description(\"Create or open the memory database\")\n .action(() => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n store.init();\n emit({ ok: true, db: store.path }, options.json);\n store.close();\n });\n\nprogram\n .command(\"add\")\n .description(\"Add a memory entry\")\n .requiredOption(\"--type <type>\")\n .requiredOption(\"--text <text>\")\n .requiredOption(\"--source-kind <kind>\")\n .requiredOption(\"--source-value <value>\")\n .requiredOption(\"--confidence <number>\")\n .requiredOption(\"--scope <scope>\")\n .option(\"--id <id>\")\n .option(\"--created-at <iso>\")\n .option(\"--tags <items>\", \"Comma-separated tags\")\n .option(\"--expires-at <iso>\")\n .option(\"--links <items>\", \"Comma-separated links\")\n .option(\"--metadata <json>\", \"Metadata JSON object\")\n .action((commandOptions) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const entry = store.add({\n id: commandOptions.id,\n type: parseMemoryType(commandOptions.type),\n text: commandOptions.text,\n createdAt: commandOptions.createdAt,\n source: {\n kind: parseSourceKind(commandOptions.sourceKind as SourceKind),\n value: commandOptions.sourceValue\n },\n confidence: Number(commandOptions.confidence),\n scope: parseMemoryScope(commandOptions.scope),\n tags: parseCsv(commandOptions.tags),\n expiresAt: commandOptions.expiresAt,\n links: parseCsv(commandOptions.links),\n metadata: parseJsonObject(commandOptions.metadata)\n });\n emit(entry, true);\n store.close();\n });\n\nprogram\n .command(\"search\")\n .description(\"Search memory entries by keyword\")\n .argument(\"<query>\")\n .option(\"--scopes <items>\", \"Comma-separated scopes\")\n .option(\"--types <items>\", \"Comma-separated types\")\n .option(\"--tags <items>\", \"Comma-separated tags\")\n .option(\"--source-kind <kind>\")\n .option(\"--source-value <value>\")\n .option(\"--before <iso>\")\n .option(\"--after <iso>\")\n .option(\"--include-expired\", \"Include expired entries\")\n .option(\"--limit <number>\", \"Maximum result count\", \"50\")\n .action((query, commandOptions) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const result = store.search({\n query,\n scopes: parseScopes(commandOptions.scopes),\n types: parseTypes(commandOptions.types),\n tags: parseTags(commandOptions.tags),\n sourceKind: commandOptions.sourceKind ? parseSourceKind(commandOptions.sourceKind as SourceKind) : undefined,\n sourceValue: commandOptions.sourceValue,\n before: commandOptions.before,\n after: commandOptions.after,\n includeExpired: Boolean(commandOptions.includeExpired),\n limit: Number(commandOptions.limit)\n });\n emit(result, true);\n store.close();\n });\n\nprogram\n .command(\"timeline\")\n .description(\"View time-ordered memory entries\")\n .option(\"--scopes <items>\", \"Comma-separated scopes\")\n .option(\"--types <items>\", \"Comma-separated types\")\n .option(\"--tags <items>\", \"Comma-separated tags\")\n .option(\"--source-kind <kind>\")\n .option(\"--source-value <value>\")\n .option(\"--before <iso>\")\n .option(\"--after <iso>\")\n .option(\"--include-expired\", \"Include expired entries\")\n .option(\"--order <direction>\", \"asc or desc\", \"asc\")\n .option(\"--limit <number>\", \"Maximum result count\", \"50\")\n .action((commandOptions) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const result = store.timeline({\n scopes: parseScopes(commandOptions.scopes),\n types: parseTypes(commandOptions.types),\n tags: parseTags(commandOptions.tags),\n sourceKind: commandOptions.sourceKind ? parseSourceKind(commandOptions.sourceKind as SourceKind) : undefined,\n sourceValue: commandOptions.sourceValue,\n before: commandOptions.before,\n after: commandOptions.after,\n includeExpired: Boolean(commandOptions.includeExpired),\n order: commandOptions.order === \"desc\" ? \"desc\" : \"asc\",\n limit: Number(commandOptions.limit)\n });\n emit(result, true);\n store.close();\n });\n\nprogram\n .command(\"get\")\n .description(\"Get a memory entry by id\")\n .argument(\"<id>\")\n .action((id) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const result = store.get(id);\n emit(result, true);\n store.close();\n });\n\nprogram\n .command(\"export\")\n .description(\"Export entries as JSONL\")\n .option(\"--output <path>\")\n .option(\"--scopes <items>\", \"Comma-separated scopes\")\n .option(\"--types <items>\", \"Comma-separated types\")\n .option(\"--tags <items>\", \"Comma-separated tags\")\n .option(\"--source-kind <kind>\")\n .option(\"--source-value <value>\")\n .option(\"--before <iso>\")\n .option(\"--after <iso>\")\n .option(\"--include-expired\", \"Include expired entries\")\n .option(\"--order <direction>\", \"asc or desc\", \"asc\")\n .option(\"--limit <number>\", \"Maximum result count\", \"1000\")\n .action((commandOptions) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const jsonl = store.exportJsonl({\n scopes: parseScopes(commandOptions.scopes),\n types: parseTypes(commandOptions.types),\n tags: parseTags(commandOptions.tags),\n sourceKind: commandOptions.sourceKind ? parseSourceKind(commandOptions.sourceKind as SourceKind) : undefined,\n sourceValue: commandOptions.sourceValue,\n before: commandOptions.before,\n after: commandOptions.after,\n includeExpired: Boolean(commandOptions.includeExpired),\n order: commandOptions.order === \"desc\" ? \"desc\" : \"asc\",\n limit: Number(commandOptions.limit)\n });\n\n if (commandOptions.output) {\n writeFileSync(resolve(commandOptions.output), jsonl ? `${jsonl}\\n` : \"\");\n emit({ ok: true, output: resolve(commandOptions.output) }, options.json);\n } else {\n emit(jsonl, false);\n }\n\n store.close();\n });\n\nprogram\n .command(\"import\")\n .description(\"Import entries from JSONL\")\n .argument(\"[input]\", \"Path to JSONL file, or - for stdin\", \"-\")\n .action((input) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const jsonl = input === \"-\" ? readFileSync(0, \"utf8\") : readFileSync(resolve(input), \"utf8\");\n const result = store.importJsonl(jsonl);\n emit(result, true);\n store.close();\n });\n\nprogram\n .command(\"gc\")\n .description(\"Delete expired entries\")\n .option(\"--now <iso>\", \"Override current time for deterministic runs\")\n .action((commandOptions) => {\n const options = program.opts<CommonOptions>();\n const store = openStore(options);\n const result = store.gc(commandOptions.now ? toIsoString(commandOptions.now) : new Date());\n emit(result, true);\n store.close();\n });\n\nprogram\n .command(\"mcp\")\n .description(\"Run the Chrona MCP server\")\n .option(\"--db <path>\", \"Path to the SQLite database\")\n .option(\"--stdio\", \"Use stdio transport\")\n .option(\"--port <number>\", \"Serve MCP over Streamable HTTP on the given port\")\n .action(async (commandOptions) => {\n const options = program.opts<CommonOptions>();\n const dbPath = commandOptions.db ?? options.db ?? process.env.CHRONA_DB ?? \".chrona/chrona.db\";\n const port = commandOptions.port === undefined ? undefined : Number(commandOptions.port);\n\n if (commandOptions.stdio && port !== undefined) {\n throw new Error(\"Choose either --stdio or --port, not both\");\n }\n\n if (port !== undefined && (!Number.isInteger(port) || port < 1 || port > 65535)) {\n throw new Error(`Invalid port: ${String(commandOptions.port)}`);\n }\n\n await startChronaMcpServer({\n dbPath,\n port\n });\n });\n\nprogram.parseAsync(process.argv).catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(message);\n process.exitCode = 1;\n});\n"],"mappings":"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","names":[]}