@vortex-os/memory-extended 0.5.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.
Files changed (181) hide show
  1. package/README.md +244 -0
  2. package/dist/consolidate/index.d.ts +7 -0
  3. package/dist/consolidate/index.d.ts.map +1 -0
  4. package/dist/consolidate/index.js +4 -0
  5. package/dist/consolidate/index.js.map +1 -0
  6. package/dist/consolidate/proposer.d.ts +43 -0
  7. package/dist/consolidate/proposer.d.ts.map +1 -0
  8. package/dist/consolidate/proposer.js +276 -0
  9. package/dist/consolidate/proposer.js.map +1 -0
  10. package/dist/consolidate/query.d.ts +32 -0
  11. package/dist/consolidate/query.d.ts.map +1 -0
  12. package/dist/consolidate/query.js +40 -0
  13. package/dist/consolidate/query.js.map +1 -0
  14. package/dist/consolidate/store.d.ts +21 -0
  15. package/dist/consolidate/store.d.ts.map +1 -0
  16. package/dist/consolidate/store.js +91 -0
  17. package/dist/consolidate/store.js.map +1 -0
  18. package/dist/consolidate/types.d.ts +68 -0
  19. package/dist/consolidate/types.d.ts.map +1 -0
  20. package/dist/consolidate/types.js +2 -0
  21. package/dist/consolidate/types.js.map +1 -0
  22. package/dist/index.d.ts +7 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +7 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/internal/frontmatter.d.ts +6 -0
  27. package/dist/internal/frontmatter.d.ts.map +1 -0
  28. package/dist/internal/frontmatter.js +38 -0
  29. package/dist/internal/frontmatter.js.map +1 -0
  30. package/dist/internal/proactive-curator-helpers.d.ts +171 -0
  31. package/dist/internal/proactive-curator-helpers.d.ts.map +1 -0
  32. package/dist/internal/proactive-curator-helpers.js +162 -0
  33. package/dist/internal/proactive-curator-helpers.js.map +1 -0
  34. package/dist/mcp/document-tools.d.ts +144 -0
  35. package/dist/mcp/document-tools.d.ts.map +1 -0
  36. package/dist/mcp/document-tools.js +319 -0
  37. package/dist/mcp/document-tools.js.map +1 -0
  38. package/dist/mcp/index.d.ts +34 -0
  39. package/dist/mcp/index.d.ts.map +1 -0
  40. package/dist/mcp/index.js +29 -0
  41. package/dist/mcp/index.js.map +1 -0
  42. package/dist/mcp/install.d.ts +72 -0
  43. package/dist/mcp/install.d.ts.map +1 -0
  44. package/dist/mcp/install.js +92 -0
  45. package/dist/mcp/install.js.map +1 -0
  46. package/dist/mcp/memory-tools.d.ts +101 -0
  47. package/dist/mcp/memory-tools.d.ts.map +1 -0
  48. package/dist/mcp/memory-tools.js +105 -0
  49. package/dist/mcp/memory-tools.js.map +1 -0
  50. package/dist/mcp/recall-tool.d.ts +52 -0
  51. package/dist/mcp/recall-tool.d.ts.map +1 -0
  52. package/dist/mcp/recall-tool.js +60 -0
  53. package/dist/mcp/recall-tool.js.map +1 -0
  54. package/dist/mcp/server.d.ts +32 -0
  55. package/dist/mcp/server.d.ts.map +1 -0
  56. package/dist/mcp/server.js +113 -0
  57. package/dist/mcp/server.js.map +1 -0
  58. package/dist/recall/engine.d.ts +38 -0
  59. package/dist/recall/engine.d.ts.map +1 -0
  60. package/dist/recall/engine.js +113 -0
  61. package/dist/recall/engine.js.map +1 -0
  62. package/dist/recall/index.d.ts +22 -0
  63. package/dist/recall/index.d.ts.map +1 -0
  64. package/dist/recall/index.js +20 -0
  65. package/dist/recall/index.js.map +1 -0
  66. package/dist/recall/intent.d.ts +24 -0
  67. package/dist/recall/intent.d.ts.map +1 -0
  68. package/dist/recall/intent.js +95 -0
  69. package/dist/recall/intent.js.map +1 -0
  70. package/dist/recall/render.d.ts +11 -0
  71. package/dist/recall/render.d.ts.map +1 -0
  72. package/dist/recall/render.js +23 -0
  73. package/dist/recall/render.js.map +1 -0
  74. package/dist/recall/types.d.ts +72 -0
  75. package/dist/recall/types.d.ts.map +1 -0
  76. package/dist/recall/types.js +2 -0
  77. package/dist/recall/types.js.map +1 -0
  78. package/dist/sessionArchive/adapters/claude-code.d.ts +3 -0
  79. package/dist/sessionArchive/adapters/claude-code.d.ts.map +1 -0
  80. package/dist/sessionArchive/adapters/claude-code.js +276 -0
  81. package/dist/sessionArchive/adapters/claude-code.js.map +1 -0
  82. package/dist/sessionArchive/adapters/claude-desktop.d.ts +3 -0
  83. package/dist/sessionArchive/adapters/claude-desktop.d.ts.map +1 -0
  84. package/dist/sessionArchive/adapters/claude-desktop.js +234 -0
  85. package/dist/sessionArchive/adapters/claude-desktop.js.map +1 -0
  86. package/dist/sessionArchive/adapters/codex.d.ts +3 -0
  87. package/dist/sessionArchive/adapters/codex.d.ts.map +1 -0
  88. package/dist/sessionArchive/adapters/codex.js +322 -0
  89. package/dist/sessionArchive/adapters/codex.js.map +1 -0
  90. package/dist/sessionArchive/adapters/gemini.d.ts +3 -0
  91. package/dist/sessionArchive/adapters/gemini.d.ts.map +1 -0
  92. package/dist/sessionArchive/adapters/gemini.js +248 -0
  93. package/dist/sessionArchive/adapters/gemini.js.map +1 -0
  94. package/dist/sessionArchive/adapters/index.d.ts +5 -0
  95. package/dist/sessionArchive/adapters/index.d.ts.map +1 -0
  96. package/dist/sessionArchive/adapters/index.js +5 -0
  97. package/dist/sessionArchive/adapters/index.js.map +1 -0
  98. package/dist/sessionArchive/index.d.ts +9 -0
  99. package/dist/sessionArchive/index.d.ts.map +1 -0
  100. package/dist/sessionArchive/index.js +6 -0
  101. package/dist/sessionArchive/index.js.map +1 -0
  102. package/dist/sessionArchive/ingest.d.ts +68 -0
  103. package/dist/sessionArchive/ingest.d.ts.map +1 -0
  104. package/dist/sessionArchive/ingest.js +134 -0
  105. package/dist/sessionArchive/ingest.js.map +1 -0
  106. package/dist/sessionArchive/normalize.d.ts +15 -0
  107. package/dist/sessionArchive/normalize.d.ts.map +1 -0
  108. package/dist/sessionArchive/normalize.js +40 -0
  109. package/dist/sessionArchive/normalize.js.map +1 -0
  110. package/dist/sessionArchive/store.d.ts +118 -0
  111. package/dist/sessionArchive/store.d.ts.map +1 -0
  112. package/dist/sessionArchive/store.js +491 -0
  113. package/dist/sessionArchive/store.js.map +1 -0
  114. package/dist/sessionArchive/types.d.ts +124 -0
  115. package/dist/sessionArchive/types.d.ts.map +1 -0
  116. package/dist/sessionArchive/types.js +24 -0
  117. package/dist/sessionArchive/types.js.map +1 -0
  118. package/dist/sqlite/drift.d.ts +22 -0
  119. package/dist/sqlite/drift.d.ts.map +1 -0
  120. package/dist/sqlite/drift.js +69 -0
  121. package/dist/sqlite/drift.js.map +1 -0
  122. package/dist/sqlite/index.d.ts +22 -0
  123. package/dist/sqlite/index.d.ts.map +1 -0
  124. package/dist/sqlite/index.js +4 -0
  125. package/dist/sqlite/index.js.map +1 -0
  126. package/dist/sqlite/rebuild.d.ts +32 -0
  127. package/dist/sqlite/rebuild.d.ts.map +1 -0
  128. package/dist/sqlite/rebuild.js +80 -0
  129. package/dist/sqlite/rebuild.js.map +1 -0
  130. package/dist/sqlite/schema.d.ts +15 -0
  131. package/dist/sqlite/schema.d.ts.map +1 -0
  132. package/dist/sqlite/schema.js +41 -0
  133. package/dist/sqlite/schema.js.map +1 -0
  134. package/dist/sqlite/store.d.ts +49 -0
  135. package/dist/sqlite/store.d.ts.map +1 -0
  136. package/dist/sqlite/store.js +179 -0
  137. package/dist/sqlite/store.js.map +1 -0
  138. package/dist/sqlite/types.d.ts +57 -0
  139. package/dist/sqlite/types.d.ts.map +1 -0
  140. package/dist/sqlite/types.js +2 -0
  141. package/dist/sqlite/types.js.map +1 -0
  142. package/dist/vector/backend-brute.d.ts +38 -0
  143. package/dist/vector/backend-brute.d.ts.map +1 -0
  144. package/dist/vector/backend-brute.js +112 -0
  145. package/dist/vector/backend-brute.js.map +1 -0
  146. package/dist/vector/embedder.d.ts +59 -0
  147. package/dist/vector/embedder.d.ts.map +1 -0
  148. package/dist/vector/embedder.js +47 -0
  149. package/dist/vector/embedder.js.map +1 -0
  150. package/dist/vector/index.d.ts +24 -0
  151. package/dist/vector/index.d.ts.map +1 -0
  152. package/dist/vector/index.js +7 -0
  153. package/dist/vector/index.js.map +1 -0
  154. package/dist/vector/math.d.ts +21 -0
  155. package/dist/vector/math.d.ts.map +1 -0
  156. package/dist/vector/math.js +34 -0
  157. package/dist/vector/math.js.map +1 -0
  158. package/dist/vector/schema.d.ts +14 -0
  159. package/dist/vector/schema.d.ts.map +1 -0
  160. package/dist/vector/schema.js +24 -0
  161. package/dist/vector/schema.js.map +1 -0
  162. package/dist/vector/segment.d.ts +65 -0
  163. package/dist/vector/segment.d.ts.map +1 -0
  164. package/dist/vector/segment.js +72 -0
  165. package/dist/vector/segment.js.map +1 -0
  166. package/dist/vector/session.d.ts +90 -0
  167. package/dist/vector/session.d.ts.map +1 -0
  168. package/dist/vector/session.js +242 -0
  169. package/dist/vector/session.js.map +1 -0
  170. package/dist/vector/store.d.ts +69 -0
  171. package/dist/vector/store.d.ts.map +1 -0
  172. package/dist/vector/store.js +131 -0
  173. package/dist/vector/store.js.map +1 -0
  174. package/dist/vector/types.d.ts +109 -0
  175. package/dist/vector/types.d.ts.map +1 -0
  176. package/dist/vector/types.js +24 -0
  177. package/dist/vector/types.js.map +1 -0
  178. package/package.json +96 -0
  179. package/scripts/mcp-stdio.mjs +143 -0
  180. package/scripts/rebuild-memory-sqlite.mjs +39 -0
  181. package/scripts/rebuild-memory-vector.mjs +64 -0
@@ -0,0 +1,68 @@
1
+ import type { AdapterEnv, AdapterOptions, HostId, TranscriptAdapter } from "./types.js";
2
+ export interface IngestParams {
3
+ readonly adapters: readonly TranscriptAdapter[];
4
+ /** Where to write `_session-archive/`. Typically the instance's `data/` directory. */
5
+ readonly dataDir: string;
6
+ /** Filter to sessions started in this cwd. Omit (or use `cwdAnywhere`) to ingest everything. */
7
+ readonly cwd?: string;
8
+ readonly cwdAnywhere?: boolean;
9
+ /** ISO-8601 lower bound for session start. */
10
+ readonly since?: string;
11
+ /** Redaction hook + future per-adapter options. */
12
+ readonly options?: AdapterOptions;
13
+ /** Skip sessions whose source mtime is within this many ms of `now`. Default 30 seconds. */
14
+ readonly liveSessionSkipMs?: number;
15
+ /** Optional progress callback for UI / logging. */
16
+ readonly onProgress?: (event: ProgressEvent) => void;
17
+ /** Optional env overrides — for testing or running against a fake home. */
18
+ readonly env?: Partial<AdapterEnv>;
19
+ }
20
+ export type ProgressEvent = {
21
+ kind: "detect";
22
+ host: HostId;
23
+ present: boolean;
24
+ } | {
25
+ kind: "list";
26
+ host: HostId;
27
+ count: number;
28
+ } | {
29
+ kind: "read";
30
+ host: HostId;
31
+ sessionId: string;
32
+ } | {
33
+ kind: "skip";
34
+ host: HostId;
35
+ sessionId: string;
36
+ reason: "live" | "already-ingested" | "oversize";
37
+ } | {
38
+ kind: "host-skip";
39
+ host: HostId;
40
+ reason: string;
41
+ } | {
42
+ kind: "error";
43
+ host: HostId;
44
+ sessionId?: string;
45
+ error: Error;
46
+ };
47
+ export interface IngestResult {
48
+ readonly hostsDetected: readonly HostId[];
49
+ readonly sessionsListed: number;
50
+ readonly sessionsIngested: number;
51
+ readonly sessionsSkipped: number;
52
+ readonly errors: ReadonlyArray<{
53
+ host: HostId;
54
+ sessionId?: string;
55
+ error: Error;
56
+ }>;
57
+ }
58
+ /**
59
+ * Orchestrator: detect adapters in parallel, list sessions, read each end-to-end, apply optional
60
+ * redaction, persist via `SessionArchiveStore`. Idempotent — re-runs only ingest sessions whose
61
+ * source mtime advanced past the last persisted value.
62
+ *
63
+ * `ClaudeDesktopRunningError` thrown by the Claude Desktop adapter's `list()` is caught at the
64
+ * host level: that host is skipped (with a `host-skip` progress event) but the orchestrator
65
+ * continues with the remaining adapters.
66
+ */
67
+ export declare function ingest(params: IngestParams): Promise<IngestResult>;
68
+ //# sourceMappingURL=ingest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../src/sessionArchive/ingest.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,MAAM,EAGN,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAIpB,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAChD,sFAAsF;IACtF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gGAAgG;IAChG,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,8CAA8C;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,mDAAmD;IACnD,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAClC,4FAA4F;IAC5F,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,mDAAmD;IACnD,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IACrD,2EAA2E;IAC3E,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;CACpC;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,GAAG,UAAU,CAAA;CAAE,GACnG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC;AAEtE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC,CAAC;CACpF;AAED;;;;;;;;GAQG;AACH,wBAAsB,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAwHxE"}
@@ -0,0 +1,134 @@
1
+ import { homedir } from "node:os";
2
+ import { SessionArchiveStore } from "./store.js";
3
+ import { applyRedact } from "./normalize.js";
4
+ import { ClaudeDesktopRunningError, MAX_TRANSCRIPT_BYTES } from "./types.js";
5
+ const DEFAULT_LIVE_SKIP_MS = 30_000;
6
+ /**
7
+ * Orchestrator: detect adapters in parallel, list sessions, read each end-to-end, apply optional
8
+ * redaction, persist via `SessionArchiveStore`. Idempotent — re-runs only ingest sessions whose
9
+ * source mtime advanced past the last persisted value.
10
+ *
11
+ * `ClaudeDesktopRunningError` thrown by the Claude Desktop adapter's `list()` is caught at the
12
+ * host level: that host is skipped (with a `host-skip` progress event) but the orchestrator
13
+ * continues with the remaining adapters.
14
+ */
15
+ export async function ingest(params) {
16
+ const env = {
17
+ home: params.env?.home ?? homedir(),
18
+ platform: params.env?.platform ?? process.platform,
19
+ now: params.env?.now ?? (() => new Date()),
20
+ };
21
+ const liveSkipMs = params.liveSessionSkipMs ?? DEFAULT_LIVE_SKIP_MS;
22
+ const nowMs = env.now().getTime();
23
+ const emit = params.onProgress ?? (() => { });
24
+ const store = new SessionArchiveStore(params.dataDir);
25
+ const errors = [];
26
+ const hostsDetected = [];
27
+ let sessionsListed = 0;
28
+ let sessionsIngested = 0;
29
+ let sessionsSkipped = 0;
30
+ try {
31
+ // 1. detect all adapters in parallel
32
+ const detections = await Promise.all(params.adapters.map(async (adapter) => {
33
+ try {
34
+ const present = await adapter.detect(env);
35
+ emit({ kind: "detect", host: adapter.host, present });
36
+ return present ? adapter : null;
37
+ }
38
+ catch (err) {
39
+ const error = toError(err);
40
+ errors.push({ host: adapter.host, error });
41
+ emit({ kind: "error", host: adapter.host, error });
42
+ return null;
43
+ }
44
+ }));
45
+ const active = detections.filter((a) => a !== null);
46
+ hostsDetected.push(...active.map((a) => a.host));
47
+ // 2. list + read + store per host
48
+ const listQuery = {
49
+ cwd: params.cwd,
50
+ cwdAnywhere: params.cwdAnywhere,
51
+ since: params.since,
52
+ };
53
+ for (const adapter of active) {
54
+ let descriptors;
55
+ try {
56
+ descriptors = await adapter.list(listQuery, env);
57
+ }
58
+ catch (err) {
59
+ if (err instanceof ClaudeDesktopRunningError) {
60
+ emit({ kind: "host-skip", host: adapter.host, reason: err.message });
61
+ errors.push({ host: adapter.host, error: err });
62
+ continue;
63
+ }
64
+ const error = toError(err);
65
+ errors.push({ host: adapter.host, error });
66
+ emit({ kind: "error", host: adapter.host, error });
67
+ continue;
68
+ }
69
+ emit({ kind: "list", host: adapter.host, count: descriptors.length });
70
+ sessionsListed += descriptors.length;
71
+ for (const descriptor of descriptors) {
72
+ // Size cap: `descriptor.bytes` was captured from stat.size in list().
73
+ // Skip (and emit) before reading so one oversized file can never be
74
+ // pulled into memory.
75
+ if (descriptor.bytes > MAX_TRANSCRIPT_BYTES) {
76
+ sessionsSkipped++;
77
+ emit({
78
+ kind: "skip",
79
+ host: adapter.host,
80
+ sessionId: descriptor.sessionId,
81
+ reason: "oversize",
82
+ });
83
+ continue;
84
+ }
85
+ if (nowMs - descriptor.mtimeMs < liveSkipMs) {
86
+ sessionsSkipped++;
87
+ emit({
88
+ kind: "skip",
89
+ host: adapter.host,
90
+ sessionId: descriptor.sessionId,
91
+ reason: "live",
92
+ });
93
+ continue;
94
+ }
95
+ if (store.hasIngested(descriptor.host, descriptor.sessionId, descriptor.mtimeMs)) {
96
+ sessionsSkipped++;
97
+ emit({
98
+ kind: "skip",
99
+ host: adapter.host,
100
+ sessionId: descriptor.sessionId,
101
+ reason: "already-ingested",
102
+ });
103
+ continue;
104
+ }
105
+ emit({ kind: "read", host: adapter.host, sessionId: descriptor.sessionId });
106
+ try {
107
+ const session = await adapter.read(descriptor, env);
108
+ const normalized = applyRedact(session, params.options);
109
+ store.writeSession(normalized, descriptor.path, descriptor.mtimeMs);
110
+ sessionsIngested++;
111
+ }
112
+ catch (err) {
113
+ const error = toError(err);
114
+ errors.push({ host: adapter.host, sessionId: descriptor.sessionId, error });
115
+ emit({ kind: "error", host: adapter.host, sessionId: descriptor.sessionId, error });
116
+ }
117
+ }
118
+ }
119
+ }
120
+ finally {
121
+ store.close();
122
+ }
123
+ return {
124
+ hostsDetected,
125
+ sessionsListed,
126
+ sessionsIngested,
127
+ sessionsSkipped,
128
+ errors,
129
+ };
130
+ }
131
+ function toError(err) {
132
+ return err instanceof Error ? err : new Error(String(err));
133
+ }
134
+ //# sourceMappingURL=ingest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/sessionArchive/ingest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { AdapterOptions, VortexTranscriptEvent, VortexTranscriptSession } from "./types.js";
2
+ /** Strip ANSI escape sequences from a string. Adapter authors call this on free-text fields
3
+ * (tool_result content, message text where the host emits coloured output). */
4
+ export declare function stripAnsi(text: string): string;
5
+ /** Apply the optional redaction hook to every event in a session. Returns a fresh session value. */
6
+ export declare function applyRedact(session: VortexTranscriptSession, options: AdapterOptions | undefined): VortexTranscriptSession;
7
+ /**
8
+ * Derive `turnId` per event by treating each `user_message` as a turn boundary.
9
+ * Returns a parallel array; callers map it back onto their event list.
10
+ *
11
+ * Used by Claude Code (`parentUuid` chain is collapsed before calling) and by Gemini.
12
+ * Codex uses `event_msg/task_started.payload.turn_id` directly and skips this helper.
13
+ */
14
+ export declare function deriveTurnIdsByUserBoundary(events: ReadonlyArray<Pick<VortexTranscriptEvent, "kind">>): readonly string[];
15
+ //# sourceMappingURL=normalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/sessionArchive/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAOjG;gFACgF;AAChF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,oGAAoG;AACpG,wBAAgB,WAAW,CACzB,OAAO,EAAE,uBAAuB,EAChC,OAAO,EAAE,cAAc,GAAG,SAAS,GAClC,uBAAuB,CAOzB;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC,GACzD,SAAS,MAAM,EAAE,CAYnB"}
@@ -0,0 +1,40 @@
1
+ // ANSI escape sequence regex — CSI (ESC[) and Fe sequences (ESC@-_).
2
+ // Same pattern used by the ansi-regex / strip-ansi npm packages.
3
+ // eslint-disable-next-line no-control-regex
4
+ const ANSI_RE = /\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g;
5
+ /** Strip ANSI escape sequences from a string. Adapter authors call this on free-text fields
6
+ * (tool_result content, message text where the host emits coloured output). */
7
+ export function stripAnsi(text) {
8
+ return text.replace(ANSI_RE, "");
9
+ }
10
+ /** Apply the optional redaction hook to every event in a session. Returns a fresh session value. */
11
+ export function applyRedact(session, options) {
12
+ if (!options?.redact)
13
+ return session;
14
+ const redact = options.redact;
15
+ return {
16
+ ...session,
17
+ events: session.events.map((ev) => redact(ev)),
18
+ };
19
+ }
20
+ /**
21
+ * Derive `turnId` per event by treating each `user_message` as a turn boundary.
22
+ * Returns a parallel array; callers map it back onto their event list.
23
+ *
24
+ * Used by Claude Code (`parentUuid` chain is collapsed before calling) and by Gemini.
25
+ * Codex uses `event_msg/task_started.payload.turn_id` directly and skips this helper.
26
+ */
27
+ export function deriveTurnIdsByUserBoundary(events) {
28
+ const out = new Array(events.length);
29
+ let currentTurn = "turn-0";
30
+ let counter = 0;
31
+ events.forEach((ev, idx) => {
32
+ if (ev.kind === "user_message") {
33
+ currentTurn = `turn-${counter}`;
34
+ counter++;
35
+ }
36
+ out[idx] = currentTurn;
37
+ });
38
+ return out;
39
+ }
40
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/sessionArchive/normalize.ts"],"names":[],"mappings":"AAEA,qEAAqE;AACrE,iEAAiE;AACjE,4CAA4C;AAC5C,MAAM,OAAO,GAAG,wCAAwC,CAAC;AAEzD;gFACgF;AAChF,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,WAAW,CACzB,OAAgC,EAChC,OAAmC;IAEnC,IAAI,CAAC,OAAO,EAAE,MAAM;QAAE,OAAO,OAAO,CAAC;IACrC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,OAAO;QACL,GAAG,OAAO;QACV,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CACzC,MAA0D;IAE1D,MAAM,GAAG,GAAa,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,WAAW,GAAG,QAAQ,CAAC;IAC3B,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE;QACzB,IAAI,EAAE,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAC/B,WAAW,GAAG,QAAQ,OAAO,EAAE,CAAC;YAChC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;IACzB,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,118 @@
1
+ import type { HostId, VortexTranscriptSession } from "./types.js";
2
+ export interface IngestedRow {
3
+ readonly host: HostId;
4
+ readonly sessionId: string;
5
+ readonly mtimeMs: number;
6
+ }
7
+ export interface SessionMetadataRow {
8
+ readonly host: HostId;
9
+ readonly sessionId: string;
10
+ readonly cwd: string | null;
11
+ readonly startedAt: string | null;
12
+ readonly endedAt: string | null;
13
+ readonly model: string | null;
14
+ readonly eventCount: number;
15
+ readonly ingestedAt: number;
16
+ /** ISO-8601 of the last curate review, or null if not yet reviewed. */
17
+ readonly reviewedAt: string | null;
18
+ }
19
+ export interface EventRow {
20
+ readonly idx: number;
21
+ readonly turnId: string | null;
22
+ readonly kind: string;
23
+ readonly at: string | null;
24
+ readonly text: string | null;
25
+ readonly toolUseId: string | null;
26
+ }
27
+ export interface ListSessionsOptions {
28
+ /** Only sessions ingested strictly after this epoch-ms cutoff. */
29
+ readonly sinceMs?: number;
30
+ /** Restrict to these hosts. Empty/undefined = all hosts. */
31
+ readonly hosts?: readonly HostId[];
32
+ /** Cap the result count. Newest-ingested first. */
33
+ readonly limit?: number;
34
+ /** Only sessions not yet curate-reviewed (reviewed_at IS NULL). */
35
+ readonly onlyUnreviewed?: boolean;
36
+ }
37
+ /**
38
+ * Append-only store backing the sessionArchive namespace.
39
+ *
40
+ * Layout under `<dataDir>/_session-archive/`:
41
+ * raw/<host>/<session-id>.{jsonl|json} ← byte-for-byte copy of host file (when available)
42
+ * normalized/YYYY/MM/<session-id>.jsonl ← vortex VortexTranscriptEvent JSONL
43
+ * metadata.sqlite ← ingested_sessions + events + events_fts
44
+ *
45
+ * SQLite indexes are rebuildable from the normalized JSONL — they are derived state, not SoT.
46
+ */
47
+ export declare class SessionArchiveStore {
48
+ readonly archiveDir: string;
49
+ readonly rawDir: string;
50
+ readonly normalizedDir: string;
51
+ readonly dbPath: string;
52
+ private db;
53
+ constructor(dataDir: string);
54
+ /** True iff a session with the same (host, sessionId) is already ingested at or beyond the given mtime. */
55
+ hasIngested(host: HostId, sessionId: string, mtimeMs: number): boolean;
56
+ /** All rows in `ingested_sessions` — used by the orchestrator for incremental re-scan. */
57
+ listIngested(): readonly IngestedRow[];
58
+ /**
59
+ * Session metadata — used by consolidate (and any future analyzer) to
60
+ * filter recently-ingested sessions before pulling their event bodies.
61
+ *
62
+ * Ordered newest-ingested first. `sinceMs` is checked against
63
+ * `ingested_at`, not the session's own `started_at`, so a session that
64
+ * was ingested today but happened weeks ago still surfaces on a
65
+ * "consolidate since last run" query.
66
+ */
67
+ listSessions(options?: ListSessionsOptions): readonly SessionMetadataRow[];
68
+ /**
69
+ * Replay all events of one session, in original order. Useful for analyzers
70
+ * (consolidate, future LLM-driven tooling) that need the actual content,
71
+ * not just metadata.
72
+ */
73
+ readSessionEvents(host: HostId, sessionId: string): readonly EventRow[];
74
+ /**
75
+ * Persist a normalized session — writes the raw copy (if a source path is provided),
76
+ * writes the normalized JSONL, and replaces metadata + events rows in a single transaction.
77
+ */
78
+ writeSession(session: VortexTranscriptSession, rawSourcePath: string | null, sourceMtimeMs: number): void;
79
+ /**
80
+ * DB-only upsert of a session's metadata + events — no file writes. Shared
81
+ * by {@link writeSession} (fresh ingest, which also writes the raw +
82
+ * normalized files first) and {@link reindexFromNormalized} (a session whose
83
+ * normalized text is already on disk, typically pulled from another machine
84
+ * via git). `INSERT OR REPLACE` intentionally clears `reviewed_at`: a
85
+ * re-indexed session has new content since any prior review, so curate
86
+ * should surface it again.
87
+ */
88
+ private indexSession;
89
+ /**
90
+ * Index any normalized transcript on disk that this DB has not seen yet, and
91
+ * return the session ids newly indexed.
92
+ *
93
+ * The normalized JSONL under `normalized/` is the synced source of truth; the
94
+ * sqlite DB is local, derived, and gitignored. So a session created on another
95
+ * machine arrives here as a normalized file (via git pull) with no DB row
96
+ * until this runs — this is what makes a pulled conversation searchable on
97
+ * this machine. Already-indexed sessions are skipped by `(host, sessionId)`.
98
+ */
99
+ reindexFromNormalized(): {
100
+ indexed: number;
101
+ sessionIds: readonly string[];
102
+ };
103
+ /** Every `*.jsonl` under the normalized dir (`normalized/YYYY/MM/<id>.jsonl`). */
104
+ private listNormalizedFiles;
105
+ /** Stamp a session as curate-reviewed at the given ISO-8601 time (last write wins). */
106
+ markReviewed(host: HostId, sessionId: string, atIso: string): void;
107
+ /**
108
+ * Additive schema migrations for DBs created by an earlier version.
109
+ * `CREATE TABLE IF NOT EXISTS` will not add a column to a table that
110
+ * already exists, so new columns are introduced here, guarded by a
111
+ * column-presence check so the migration is idempotent.
112
+ */
113
+ private migrate;
114
+ close(): void;
115
+ private writeRawCopy;
116
+ private writeNormalized;
117
+ }
118
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/sessionArchive/store.ts"],"names":[],"mappings":"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"}