@hasna/mementos 0.8.0 → 0.10.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.
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAmCtC,wBAAgB,SAAS,IAAI,MAAM,CAkBlC;AA4WD,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAerD;AA+BD,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,wBAAgB,GAAG,IAAI,MAAM,CAE5B;AAED,wBAAgB,IAAI,IAAI,MAAM,CAE7B;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,IAAI,CAef"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAmCtC,wBAAgB,SAAS,IAAI,MAAM,CAkBlC;AAsYD,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAerD;AA+BD,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,wBAAgB,GAAG,IAAI,MAAM,CAE5B;AAED,wBAAgB,IAAI,IAAI,MAAM,CAE7B;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,IAAI,CAef"}
@@ -0,0 +1,49 @@
1
+ import { Database } from "bun:sqlite";
2
+ export type SessionJobSource = "claude-code" | "codex" | "manual" | "open-sessions";
3
+ export type SessionJobStatus = "pending" | "processing" | "completed" | "failed";
4
+ export interface SessionMemoryJob {
5
+ id: string;
6
+ session_id: string;
7
+ agent_id: string | null;
8
+ project_id: string | null;
9
+ source: SessionJobSource;
10
+ status: SessionJobStatus;
11
+ transcript: string;
12
+ chunk_count: number;
13
+ memories_extracted: number;
14
+ error: string | null;
15
+ metadata: Record<string, unknown>;
16
+ created_at: string;
17
+ started_at: string | null;
18
+ completed_at: string | null;
19
+ }
20
+ export interface CreateSessionJobInput {
21
+ session_id: string;
22
+ transcript: string;
23
+ source?: SessionJobSource;
24
+ agent_id?: string;
25
+ project_id?: string;
26
+ metadata?: Record<string, unknown>;
27
+ }
28
+ export interface SessionJobFilter {
29
+ agent_id?: string;
30
+ project_id?: string;
31
+ status?: SessionJobStatus;
32
+ session_id?: string;
33
+ limit?: number;
34
+ offset?: number;
35
+ }
36
+ export interface UpdateSessionJobInput {
37
+ status?: SessionJobStatus;
38
+ chunk_count?: number;
39
+ memories_extracted?: number;
40
+ error?: string | null;
41
+ started_at?: string | null;
42
+ completed_at?: string | null;
43
+ }
44
+ export declare function createSessionJob(input: CreateSessionJobInput, db?: Database): SessionMemoryJob;
45
+ export declare function getSessionJob(id: string, db?: Database): SessionMemoryJob | null;
46
+ export declare function listSessionJobs(filter?: SessionJobFilter, db?: Database): SessionMemoryJob[];
47
+ export declare function updateSessionJob(id: string, updates: UpdateSessionJobInput, db?: Database): SessionMemoryJob | null;
48
+ export declare function getNextPendingJob(db?: Database): SessionMemoryJob | null;
49
+ //# sourceMappingURL=session-jobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-jobs.d.ts","sourceRoot":"","sources":["../../src/db/session-jobs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAyB,MAAM,YAAY,CAAC;AAG7D,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,eAAe,CAAC;AACpF,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEjF,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AA6BD,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,qBAAqB,EAC5B,EAAE,CAAC,EAAE,QAAQ,GACZ,gBAAgB,CAwBlB;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,gBAAgB,GAAG,IAAI,CAOhF;AAED,wBAAgB,eAAe,CAC7B,MAAM,CAAC,EAAE,gBAAgB,EACzB,EAAE,CAAC,EAAE,QAAQ,GACZ,gBAAgB,EAAE,CAiCpB;AAED,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,qBAAqB,EAC9B,EAAE,CAAC,EAAE,QAAQ,GACZ,gBAAgB,GAAG,IAAI,CAwCzB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,gBAAgB,GAAG,IAAI,CASxE"}
package/dist/index.js CHANGED
@@ -434,7 +434,30 @@ var MIGRATIONS = [
434
434
  CREATE INDEX IF NOT EXISTS idx_webhook_hooks_type ON webhook_hooks(type);
435
435
  CREATE INDEX IF NOT EXISTS idx_webhook_hooks_enabled ON webhook_hooks(enabled);
436
436
  INSERT OR IGNORE INTO _migrations (id) VALUES (10);
437
+ `,
437
438
  `
439
+ CREATE TABLE IF NOT EXISTS session_memory_jobs (
440
+ id TEXT PRIMARY KEY,
441
+ session_id TEXT NOT NULL,
442
+ agent_id TEXT,
443
+ project_id TEXT,
444
+ source TEXT NOT NULL DEFAULT 'manual' CHECK(source IN ('claude-code','codex','manual','open-sessions')),
445
+ status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending','processing','completed','failed')),
446
+ transcript TEXT NOT NULL,
447
+ chunk_count INTEGER NOT NULL DEFAULT 0,
448
+ memories_extracted INTEGER NOT NULL DEFAULT 0,
449
+ error TEXT,
450
+ metadata TEXT NOT NULL DEFAULT '{}',
451
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
452
+ started_at TEXT,
453
+ completed_at TEXT
454
+ );
455
+ CREATE INDEX IF NOT EXISTS idx_session_memory_jobs_status ON session_memory_jobs(status);
456
+ CREATE INDEX IF NOT EXISTS idx_session_memory_jobs_agent ON session_memory_jobs(agent_id);
457
+ CREATE INDEX IF NOT EXISTS idx_session_memory_jobs_project ON session_memory_jobs(project_id);
458
+ CREATE INDEX IF NOT EXISTS idx_session_memory_jobs_session ON session_memory_jobs(session_id);
459
+ INSERT OR IGNORE INTO _migrations (id) VALUES (13);
460
+ `
438
461
  ];
439
462
  var _db = null;
440
463
  function getDatabase(dbPath) {
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Open-sessions connector — bridge between open-sessions REST API and mementos.
3
+ *
4
+ * When open-sessions ingests a new session, this connector fetches the session
5
+ * transcript and submits it to mementos for memory extraction.
6
+ *
7
+ * Usage:
8
+ * const connector = new OpenSessionsConnector({ openSessionsUrl, mementosUrl });
9
+ * await connector.ingestSession(sessionId, { agentId, projectId });
10
+ * await connector.syncRecentSessions({ since: "2026-03-17", limit: 10 });
11
+ */
12
+ export interface OpenSessionsConnectorConfig {
13
+ /** open-sessions REST API base URL */
14
+ openSessionsUrl: string;
15
+ /** mementos REST API base URL */
16
+ mementosUrl: string;
17
+ /** Optional auth token for open-sessions */
18
+ openSessionsToken?: string;
19
+ /** Default agent ID for extracted memories */
20
+ defaultAgentId?: string;
21
+ /** Default project ID for extracted memories */
22
+ defaultProjectId?: string;
23
+ }
24
+ export interface IngestResult {
25
+ sessionId: string;
26
+ jobId: string;
27
+ status: "queued" | "skipped" | "error";
28
+ message: string;
29
+ }
30
+ export declare class OpenSessionsConnector {
31
+ private config;
32
+ constructor(config: OpenSessionsConnectorConfig);
33
+ /**
34
+ * Fetch a session transcript from open-sessions and ingest into mementos.
35
+ */
36
+ ingestSession(sessionId: string, options?: {
37
+ agentId?: string;
38
+ projectId?: string;
39
+ }): Promise<IngestResult>;
40
+ /**
41
+ * Fetch and ingest multiple recent sessions.
42
+ */
43
+ syncRecentSessions(options?: {
44
+ since?: string;
45
+ limit?: number;
46
+ agentId?: string;
47
+ projectId?: string;
48
+ }): Promise<IngestResult[]>;
49
+ private fetchSessionTranscript;
50
+ private listRecentSessionIds;
51
+ }
52
+ /**
53
+ * Create a connector from environment variables.
54
+ *
55
+ * OPEN_SESSIONS_URL — open-sessions server URL
56
+ * OPEN_SESSIONS_TOKEN — optional auth token
57
+ * MEMENTOS_URL — mementos server URL (default: http://localhost:19428)
58
+ */
59
+ export declare function connectorFromEnv(): OpenSessionsConnector;
60
+ //# sourceMappingURL=open-sessions-connector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-sessions-connector.d.ts","sourceRoot":"","sources":["../../src/lib/open-sessions-connector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,2BAA2B;IAC1C,sCAAsC;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAA8B;gBAEhC,MAAM,EAAE,2BAA2B;IAI/C;;OAEG;IACG,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACrD,OAAO,CAAC,YAAY,CAAC;IAwCxB;;OAEG;IACG,kBAAkB,CAAC,OAAO,GAAE;QAChC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YAelB,sBAAsB;YAiBtB,oBAAoB;CAqBnC;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,qBAAqB,CAWxD"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Auto-resolve agent_id and project_id from session metadata.
3
+ * When a session is ingested without explicit agent/project context,
4
+ * try to detect them from available metadata fields.
5
+ */
6
+ import type { Database } from "bun:sqlite";
7
+ export interface AutoResolveResult {
8
+ agentId: string | null;
9
+ projectId: string | null;
10
+ confidence: "high" | "low" | "none";
11
+ method: string;
12
+ }
13
+ /**
14
+ * Attempt to resolve agent_id and project_id from metadata fields.
15
+ *
16
+ * Strategy:
17
+ * 1. If metadata.agentName matches an existing agent → agentId = agent.id, confidence=high
18
+ * 2. If metadata.workingDir matches a registered project path → projectId = project.id, confidence=high
19
+ * 3. If metadata.gitRemote contains a repo name that matches a project name → confidence=low
20
+ * 4. Otherwise confidence=none
21
+ */
22
+ export declare function autoResolveAgentProject(metadata: {
23
+ workingDir?: string;
24
+ agentName?: string;
25
+ gitRemote?: string;
26
+ sessionSource?: string;
27
+ }, db?: Database): AutoResolveResult;
28
+ //# sourceMappingURL=session-auto-resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-auto-resolve.d.ts","sourceRoot":"","sources":["../../src/lib/session-auto-resolve.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQ3C,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE;IACR,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,EACD,EAAE,CAAC,EAAE,QAAQ,GACZ,iBAAiB,CAsFnB"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Session transcript processor.
3
+ * Takes a full session transcript, chunks it, calls LLM to extract memories,
4
+ * saves extracted memories tagged with session_id + source.
5
+ * All failures are silently caught — never throws.
6
+ */
7
+ import type { Database } from "bun:sqlite";
8
+ export interface ChunkResult {
9
+ chunkIndex: number;
10
+ memoriesExtracted: number;
11
+ }
12
+ export interface ProcessingResult {
13
+ jobId: string;
14
+ chunksProcessed: number;
15
+ memoriesExtracted: number;
16
+ errors: string[];
17
+ }
18
+ /**
19
+ * Split a transcript into chunks with overlap.
20
+ */
21
+ export declare function chunkTranscript(transcript: string, chunkSize?: number, overlap?: number): string[];
22
+ /**
23
+ * Extract memories from a single chunk using the available LLM provider.
24
+ * Returns the count of memories saved.
25
+ */
26
+ export declare function extractMemoriesFromChunk(chunk: string, context: {
27
+ sessionId: string;
28
+ agentId?: string;
29
+ projectId?: string;
30
+ source?: string;
31
+ }, db?: Database): Promise<number>;
32
+ /**
33
+ * Process a session memory job end-to-end.
34
+ * Fetches the job, marks it processing, chunks transcript, extracts memories.
35
+ * Updates job status to completed or failed.
36
+ */
37
+ export declare function processSessionJob(jobId: string, db?: Database): Promise<ProcessingResult>;
38
+ //# sourceMappingURL=session-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-processor.d.ts","sourceRoot":"","sources":["../../src/lib/session-processor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAa3C,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAaD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,SAAS,SAAO,EAChB,OAAO,SAAM,GACZ,MAAM,EAAE,CAeV;AAMD;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,EACD,EAAE,CAAC,EAAE,QAAQ,GACZ,OAAO,CAAC,MAAM,CAAC,CAyHjB;AAMD;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,EAAE,CAAC,EAAE,QAAQ,GACZ,OAAO,CAAC,gBAAgB,CAAC,CA+F3B"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Background queue for session memory job processing.
3
+ * Polls for pending jobs every 5 seconds, processes one at a time (concurrency=1).
4
+ * Fire-and-forget: enqueueSessionJob() returns immediately, processing happens async.
5
+ */
6
+ export interface SessionQueueStats {
7
+ pending: number;
8
+ processing: number;
9
+ completed: number;
10
+ failed: number;
11
+ }
12
+ /**
13
+ * Enqueue a job ID for processing. Fire-and-forget.
14
+ * The background worker will pick it up within the next polling interval.
15
+ */
16
+ export declare function enqueueSessionJob(jobId: string): void;
17
+ /**
18
+ * Get in-memory queue stats.
19
+ * Note: pending/completed/failed counts come from DB when a full scan is needed;
20
+ * this returns a lightweight in-memory snapshot.
21
+ */
22
+ export declare function getSessionQueueStats(): SessionQueueStats;
23
+ /**
24
+ * Start the background polling worker.
25
+ * Idempotent — safe to call multiple times (only starts once).
26
+ */
27
+ export declare function startSessionQueueWorker(): void;
28
+ //# sourceMappingURL=session-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-queue.d.ts","sourceRoot":"","sources":["../../src/lib/session-queue.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAeD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAMrD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,iBAAiB,CA6BxD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAQ9C"}