memkin 0.4.2 → 0.4.3

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 (135) hide show
  1. package/dist/apply/candidate-selection.d.ts +60 -0
  2. package/dist/apply/candidate-selection.d.ts.map +1 -0
  3. package/dist/apply/candidate-selection.js +159 -0
  4. package/dist/apply/candidate-selection.js.map +1 -0
  5. package/dist/apply/cutover.d.ts +45 -0
  6. package/dist/apply/cutover.d.ts.map +1 -0
  7. package/dist/apply/cutover.js +85 -0
  8. package/dist/apply/cutover.js.map +1 -0
  9. package/dist/apply/engine.d.ts +34 -0
  10. package/dist/apply/engine.d.ts.map +1 -0
  11. package/dist/apply/engine.js +255 -0
  12. package/dist/apply/engine.js.map +1 -0
  13. package/dist/apply/ids.d.ts +9 -0
  14. package/dist/apply/ids.d.ts.map +1 -0
  15. package/dist/apply/ids.js +0 -0
  16. package/dist/apply/ids.js.map +1 -0
  17. package/dist/apply/page-content.d.ts +14 -0
  18. package/dist/apply/page-content.d.ts.map +1 -0
  19. package/dist/apply/page-content.js +0 -0
  20. package/dist/apply/page-content.js.map +1 -0
  21. package/dist/apply/rematerialize.d.ts +13 -0
  22. package/dist/apply/rematerialize.d.ts.map +1 -0
  23. package/dist/apply/rematerialize.js +150 -0
  24. package/dist/apply/rematerialize.js.map +1 -0
  25. package/dist/apply/rollback.d.ts +20 -0
  26. package/dist/apply/rollback.d.ts.map +1 -0
  27. package/dist/apply/rollback.js +117 -0
  28. package/dist/apply/rollback.js.map +1 -0
  29. package/dist/apply/shadow-runner.d.ts +47 -0
  30. package/dist/apply/shadow-runner.d.ts.map +1 -0
  31. package/dist/apply/shadow-runner.js +84 -0
  32. package/dist/apply/shadow-runner.js.map +1 -0
  33. package/dist/apply/types.d.ts +51 -0
  34. package/dist/apply/types.d.ts.map +1 -0
  35. package/dist/apply/types.js +13 -0
  36. package/dist/apply/types.js.map +1 -0
  37. package/dist/cli.js +5 -0
  38. package/dist/cli.js.map +1 -1
  39. package/dist/consolidator/consolidator.d.ts +21 -2
  40. package/dist/consolidator/consolidator.d.ts.map +1 -1
  41. package/dist/consolidator/consolidator.js +16 -1
  42. package/dist/consolidator/consolidator.js.map +1 -1
  43. package/dist/core/config.d.ts +42 -0
  44. package/dist/core/config.d.ts.map +1 -1
  45. package/dist/core/config.js +25 -0
  46. package/dist/core/config.js.map +1 -1
  47. package/dist/core/pipeline.d.ts +26 -1
  48. package/dist/core/pipeline.d.ts.map +1 -1
  49. package/dist/core/pipeline.js +26 -0
  50. package/dist/core/pipeline.js.map +1 -1
  51. package/dist/core/schemas.d.ts +16 -16
  52. package/dist/daemon/serve-runtime.d.ts +1 -1
  53. package/dist/daemon/serve-runtime.d.ts.map +1 -1
  54. package/dist/daemon/serve-runtime.js +26 -1
  55. package/dist/daemon/serve-runtime.js.map +1 -1
  56. package/dist/distiller/authority-matrix.d.ts +22 -0
  57. package/dist/distiller/authority-matrix.d.ts.map +1 -0
  58. package/dist/distiller/authority-matrix.js +29 -0
  59. package/dist/distiller/authority-matrix.js.map +1 -0
  60. package/dist/distiller/contract.d.ts +1427 -0
  61. package/dist/distiller/contract.d.ts.map +1 -0
  62. package/dist/distiller/contract.js +166 -0
  63. package/dist/distiller/contract.js.map +1 -0
  64. package/dist/distiller/index.d.ts +83 -0
  65. package/dist/distiller/index.d.ts.map +1 -0
  66. package/dist/distiller/index.js +226 -0
  67. package/dist/distiller/index.js.map +1 -0
  68. package/dist/distiller/map-reduce.d.ts +81 -0
  69. package/dist/distiller/map-reduce.d.ts.map +1 -0
  70. package/dist/distiller/map-reduce.js +92 -0
  71. package/dist/distiller/map-reduce.js.map +1 -0
  72. package/dist/distiller/msg-id.d.ts +55 -0
  73. package/dist/distiller/msg-id.d.ts.map +1 -0
  74. package/dist/distiller/msg-id.js +91 -0
  75. package/dist/distiller/msg-id.js.map +1 -0
  76. package/dist/distiller/payload-privacy.d.ts +18 -0
  77. package/dist/distiller/payload-privacy.d.ts.map +1 -0
  78. package/dist/distiller/payload-privacy.js +51 -0
  79. package/dist/distiller/payload-privacy.js.map +1 -0
  80. package/dist/distiller/prompt.d.ts +28 -0
  81. package/dist/distiller/prompt.d.ts.map +1 -0
  82. package/dist/distiller/prompt.js +69 -0
  83. package/dist/distiller/prompt.js.map +1 -0
  84. package/dist/distiller/raw-privacy.d.ts +55 -0
  85. package/dist/distiller/raw-privacy.d.ts.map +1 -0
  86. package/dist/distiller/raw-privacy.js +123 -0
  87. package/dist/distiller/raw-privacy.js.map +1 -0
  88. package/dist/distiller/segmenter.d.ts +40 -0
  89. package/dist/distiller/segmenter.d.ts.map +1 -0
  90. package/dist/distiller/segmenter.js +75 -0
  91. package/dist/distiller/segmenter.js.map +1 -0
  92. package/dist/embedded-assets.generated.d.ts.map +1 -1
  93. package/dist/embedded-assets.generated.js +5 -4
  94. package/dist/embedded-assets.generated.js.map +1 -1
  95. package/dist/eval/golden.d.ts +12 -12
  96. package/dist/server/api.d.ts.map +1 -1
  97. package/dist/server/api.js +6 -1
  98. package/dist/server/api.js.map +1 -1
  99. package/dist/setup/generate-config.d.ts.map +1 -1
  100. package/dist/setup/generate-config.js +3 -0
  101. package/dist/setup/generate-config.js.map +1 -1
  102. package/dist/setup/validate-config.d.ts +2 -1
  103. package/dist/setup/validate-config.d.ts.map +1 -1
  104. package/dist/setup/validate-config.js.map +1 -1
  105. package/dist/store/agent-sessions.d.ts.map +1 -1
  106. package/dist/store/agent-sessions.js +3 -1
  107. package/dist/store/agent-sessions.js.map +1 -1
  108. package/dist/store/distilled-payload.d.ts +50 -0
  109. package/dist/store/distilled-payload.d.ts.map +1 -0
  110. package/dist/store/distilled-payload.js +117 -0
  111. package/dist/store/distilled-payload.js.map +1 -0
  112. package/dist/store/engine-factory.d.ts.map +1 -1
  113. package/dist/store/engine-factory.js +8 -1
  114. package/dist/store/engine-factory.js.map +1 -1
  115. package/dist/store/migrations/index.d.ts.map +1 -1
  116. package/dist/store/migrations/index.js +139 -0
  117. package/dist/store/migrations/index.js.map +1 -1
  118. package/dist/store/search.d.ts.map +1 -1
  119. package/dist/store/search.js +15 -8
  120. package/dist/store/search.js.map +1 -1
  121. package/dist/store/source-filter.d.ts +19 -0
  122. package/dist/store/source-filter.d.ts.map +1 -0
  123. package/dist/store/source-filter.js +44 -0
  124. package/dist/store/source-filter.js.map +1 -0
  125. package/dist/store/timeline.d.ts.map +1 -1
  126. package/dist/store/timeline.js +15 -8
  127. package/dist/store/timeline.js.map +1 -1
  128. package/dist/synth/scope.d.ts.map +1 -1
  129. package/dist/synth/scope.js +10 -4
  130. package/dist/synth/scope.js.map +1 -1
  131. package/package.json +2 -1
  132. package/web/dist/assets/index-Cie2dVF3.js +5167 -0
  133. package/web/dist/assets/index-diZtO98v.css +2 -0
  134. package/web/dist/assets/newsreader-T5L87s1n.woff2 +0 -0
  135. package/web/dist/index.html +19 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/distiller/contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Distillation output contract v4 (spec §5).
3
+ *
4
+ * A `DistilledPayload` is the target-agnostic, immutable product of session
5
+ * distillation: a set of signals, each a member of a Zod discriminated union
6
+ * keyed by `type`. PR-2 only produces and persists this payload; it never
7
+ * writes pages (that is PR-4's apply engine).
8
+ *
9
+ * Design notes:
10
+ * - Discriminated union: every `type` carries its own additional fields and
11
+ * admission rules. Strict validation — the distiller retries once on failure
12
+ * before parking the revision in `retrying`.
13
+ * - authority is a three-value ladder (user_confirmed / assistant_claimed /
14
+ * assistant_proposed). The per-type admissibility matrix lives in
15
+ * authority-matrix.ts (spec §5).
16
+ * - Dates use ISO 8601 (z.string().datetime()).
17
+ * - preference.category and knowledge.source_kind are closed enums, not free
18
+ * text.
19
+ * - reference.url is required and must additionally be locatable inside the
20
+ * evidence message text — that cross-check lives in msg-id.ts (it needs the
21
+ * transcript), not here.
22
+ * - Payload-internal dedup: no two signals may share (type, slugify(topic)).
23
+ * That guarantee is why the two-layer ID scheme (spec §6.1) needs no ordinal.
24
+ */
25
+ import { z } from "zod";
26
+ // ── Enums ──────────────────────────────────────────────────────────────────
27
+ export const SignalTypeSchema = z.enum([
28
+ "decision",
29
+ "task",
30
+ "reference",
31
+ "preference",
32
+ "knowledge",
33
+ "discovery",
34
+ ]);
35
+ export const AuthoritySchema = z.enum([
36
+ "user_confirmed",
37
+ "assistant_claimed",
38
+ "assistant_proposed",
39
+ ]);
40
+ export const TaskStatusSchema = z.enum(["open", "in_progress", "done", "cancelled"]);
41
+ export const PreferenceCategorySchema = z.enum([
42
+ "tooling",
43
+ "workflow",
44
+ "communication",
45
+ "coding_style",
46
+ "ui",
47
+ "personal",
48
+ "other",
49
+ ]);
50
+ export const KnowledgeSourceKindSchema = z.enum([
51
+ "documentation",
52
+ "experiment",
53
+ "external_reference",
54
+ "domain_fact",
55
+ "observation",
56
+ ]);
57
+ export const DiscoverySubtypeSchema = z.enum(["insight", "pattern", "risk", "procedure"]);
58
+ // ── Evidence ─────────────────────────────────────────────────────────────────
59
+ // A programmatic msg_id range. IDs are assigned by the pipeline (msg-id.ts);
60
+ // the model may only reference given IDs, and bounds are checked there.
61
+ export const MsgRangeSchema = z.object({
62
+ start: z.string().min(1),
63
+ end: z.string().min(1),
64
+ });
65
+ // ── Common fields (all signals) ──────────────────────────────────────────────
66
+ const commonShape = {
67
+ topic: z.string().min(1),
68
+ what: z.string().min(1),
69
+ why: z.string().optional(),
70
+ project: z.string().optional(),
71
+ entities: z.array(z.string()),
72
+ authority: AuthoritySchema,
73
+ supersedes_topic: z.string().optional(),
74
+ evidence: z.array(MsgRangeSchema).min(1),
75
+ persistence_reason: z.string().min(1),
76
+ };
77
+ // An ISO 8601 date-time string. z.string().datetime() rejects date-only forms.
78
+ const isoDate = z.string().datetime();
79
+ // ── Per-type variants ─────────────────────────────────────────────────────────
80
+ export const DecisionSignalSchema = z.object({
81
+ type: z.literal("decision"),
82
+ ...commonShape,
83
+ });
84
+ export const TaskSignalSchema = z.object({
85
+ type: z.literal("task"),
86
+ ...commonShape,
87
+ owner: z.string().optional(),
88
+ due_date: isoDate.optional(),
89
+ status: TaskStatusSchema,
90
+ });
91
+ export const ReferenceSignalSchema = z.object({
92
+ type: z.literal("reference"),
93
+ ...commonShape,
94
+ url: z.string().min(1),
95
+ trigger: z.string().optional(),
96
+ });
97
+ export const PreferenceSignalSchema = z.object({
98
+ type: z.literal("preference"),
99
+ ...commonShape,
100
+ subject: z.string().min(1),
101
+ category: PreferenceCategorySchema,
102
+ });
103
+ export const KnowledgeSignalSchema = z.object({
104
+ type: z.literal("knowledge"),
105
+ ...commonShape,
106
+ source_kind: KnowledgeSourceKindSchema,
107
+ valid_at: isoDate.optional(),
108
+ invalid_at: isoDate.optional(),
109
+ });
110
+ export const DiscoverySignalSchema = z.object({
111
+ type: z.literal("discovery"),
112
+ ...commonShape,
113
+ subtype: DiscoverySubtypeSchema,
114
+ });
115
+ export const DistilledSignalSchema = z.discriminatedUnion("type", [
116
+ DecisionSignalSchema,
117
+ TaskSignalSchema,
118
+ ReferenceSignalSchema,
119
+ PreferenceSignalSchema,
120
+ KnowledgeSignalSchema,
121
+ DiscoverySignalSchema,
122
+ ]);
123
+ // ── Payload ───────────────────────────────────────────────────────────────────
124
+ // Payload-internal dedup on (type, slugify(topic)) is enforced by a superRefine
125
+ // so callers get a single validation surface.
126
+ export const DistilledPayloadSchema = z
127
+ .object({
128
+ signals: z.array(DistilledSignalSchema),
129
+ })
130
+ .superRefine((payload, ctx) => {
131
+ const seen = new Set();
132
+ for (let i = 0; i < payload.signals.length; i++) {
133
+ const s = payload.signals[i];
134
+ const key = `${s.type}::${slugifyTopic(s.topic)}`;
135
+ if (seen.has(key)) {
136
+ ctx.addIssue({
137
+ code: z.ZodIssueCode.custom,
138
+ path: ["signals", i, "topic"],
139
+ message: `duplicate (type, slugify(topic)): "${key}" — merge these signals`,
140
+ });
141
+ }
142
+ seen.add(key);
143
+ }
144
+ });
145
+ /**
146
+ * Deterministic topic slug used both for payload-internal dedup and downstream
147
+ * ID derivation (spec §6.1 normalized_topic). Lowercase, collapse whitespace,
148
+ * strip punctuation, hyphenate.
149
+ */
150
+ export function slugifyTopic(topic) {
151
+ return topic
152
+ .toLowerCase()
153
+ .trim()
154
+ .replace(/[^\p{L}\p{N}\s-]/gu, "")
155
+ .replace(/[\s_]+/g, "-")
156
+ .replace(/-+/g, "-")
157
+ .replace(/^-|-$/g, "");
158
+ }
159
+ /** Safe-parse wrapper returning a discriminated result rather than throwing. */
160
+ export function parsePayload(input) {
161
+ const res = DistilledPayloadSchema.safeParse(input);
162
+ if (res.success)
163
+ return { ok: true, payload: res.data };
164
+ return { ok: false, error: res.error };
165
+ }
166
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/distiller/contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * SessionDistiller — orchestration (spec §4, §5, §11 PR-2).
3
+ *
4
+ * Ties the ledger → distill → outbox flow together, with the HARD PR-2 boundary
5
+ * that NOTHING is applied and NO page is written. Per tick:
6
+ *
7
+ * 1. Pick up pending revisions (discovered, or retrying whose backoff elapsed).
8
+ * 2. Silence gate: only distill sessions idle ≥ silence window (default 30 min).
9
+ * 3. Stale guard: the ledger revision's content_hash must still match the file
10
+ * (a torn/updated snapshot is left for a later tick).
11
+ * 4. Replay guard: if a payload already exists for the revision, never call the
12
+ * LLM — just ensure the ledger is linked/advanced.
13
+ * 5. Distill: pre-LLM raw privacy → segment → sequential map-reduce → evidence
14
+ * validation → second-pass payload privacy → persist to outbox → distilled.
15
+ * 6. On invalid output: retry ONCE in-tick; still bad → retrying (+ retry_count),
16
+ * or dead_letter once retries are exhausted.
17
+ *
18
+ * The orchestrator reads transcripts through an injectable TranscriptSource so it
19
+ * is testable with in-memory content and independent of the collector's file IO.
20
+ */
21
+ import type { PrivacyConfig } from "../core/config.js";
22
+ import type { LLMProvider } from "../extractors/providers/types.js";
23
+ import type { AgentSessionStore } from "../store/agent-sessions.js";
24
+ import type { DistilledPayloadStore } from "../store/distilled-payload.js";
25
+ import { type RawInputMessage } from "./msg-id.js";
26
+ /** A source of transcript content, keyed by (sourceInstance, sessionId). */
27
+ export interface TranscriptSource {
28
+ load(sourceInstance: string, sessionId: string): Promise<{
29
+ content: string;
30
+ mtimeMs: number;
31
+ } | null>;
32
+ }
33
+ export interface DistillerOpts {
34
+ /** Silence window before a session is eligible for its first distillation. */
35
+ silenceMs?: number;
36
+ /** Max retries before dead-lettering a revision. */
37
+ maxRetries?: number;
38
+ /** Backoff before a retrying revision is retried. */
39
+ retryBackoffMs?: number;
40
+ /** Segment token budget for map-reduce. */
41
+ maxSegmentTokens?: number;
42
+ /** Injectable clock (ms). */
43
+ now?: () => number;
44
+ }
45
+ export interface SessionDistillerDeps {
46
+ sessions: AgentSessionStore;
47
+ payloads: DistilledPayloadStore;
48
+ provider: LLMProvider;
49
+ privacy: PrivacyConfig;
50
+ transcripts: TranscriptSource;
51
+ opts?: DistillerOpts;
52
+ }
53
+ export interface TickResult {
54
+ considered: number;
55
+ distilled: number;
56
+ skipped: number;
57
+ failed: number;
58
+ deadLettered: number;
59
+ replayed: number;
60
+ }
61
+ export declare class SessionDistiller {
62
+ private readonly deps;
63
+ private readonly now;
64
+ constructor(deps: SessionDistillerDeps);
65
+ private opt;
66
+ /** Process one tick over pending revisions. */
67
+ runTick(): Promise<TickResult>;
68
+ private processRevision;
69
+ /**
70
+ * Run the distill pipeline once with a single in-tick retry. Returns the
71
+ * validated payload + reversible restoration map, or a failure.
72
+ */
73
+ private distillOnce;
74
+ private handleFailure;
75
+ private safeMark;
76
+ }
77
+ /**
78
+ * Parse a claude-code / codex-style JSONL transcript into ordered role+text
79
+ * messages. Tolerant: skips non-conversation lines and unparseable content.
80
+ * Kept local so the distiller does not depend on the collector's file IO.
81
+ */
82
+ export declare function parseTranscript(content: string): RawInputMessage[];
83
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/distiller/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAiC,MAAM,4BAA4B,CAAC;AACnG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAE3E,OAAO,EAAgB,KAAK,eAAe,EAAoB,MAAM,aAAa,CAAC;AAKnF,4EAA4E;AAC5E,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CACF,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,aAAa;IAC5B,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2CAA2C;IAC3C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6BAA6B;IAC7B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,QAAQ,EAAE,qBAAqB,CAAC;IAChC,QAAQ,EAAE,WAAW,CAAC;IACtB,OAAO,EAAE,aAAa,CAAC;IACvB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AASD,qBAAa,gBAAgB;IAGf,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEN,IAAI,EAAE,oBAAoB;IAIvD,OAAO,CAAC,GAAG;IAKX,+CAA+C;IACzC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;YAsBtB,eAAe;IAsE7B;;;OAGG;YACW,WAAW;YAiCX,aAAa;YAkBb,QAAQ;CAOvB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,EAAE,CAgClE"}
@@ -0,0 +1,226 @@
1
+ /**
2
+ * SessionDistiller — orchestration (spec §4, §5, §11 PR-2).
3
+ *
4
+ * Ties the ledger → distill → outbox flow together, with the HARD PR-2 boundary
5
+ * that NOTHING is applied and NO page is written. Per tick:
6
+ *
7
+ * 1. Pick up pending revisions (discovered, or retrying whose backoff elapsed).
8
+ * 2. Silence gate: only distill sessions idle ≥ silence window (default 30 min).
9
+ * 3. Stale guard: the ledger revision's content_hash must still match the file
10
+ * (a torn/updated snapshot is left for a later tick).
11
+ * 4. Replay guard: if a payload already exists for the revision, never call the
12
+ * LLM — just ensure the ledger is linked/advanced.
13
+ * 5. Distill: pre-LLM raw privacy → segment → sequential map-reduce → evidence
14
+ * validation → second-pass payload privacy → persist to outbox → distilled.
15
+ * 6. On invalid output: retry ONCE in-tick; still bad → retrying (+ retry_count),
16
+ * or dead_letter once retries are exhausted.
17
+ *
18
+ * The orchestrator reads transcripts through an injectable TranscriptSource so it
19
+ * is testable with in-memory content and independent of the collector's file IO.
20
+ */
21
+ import { createHash } from "node:crypto";
22
+ import { mapReduceDistill } from "./map-reduce.js";
23
+ import { assignMsgIds, validateEvidence } from "./msg-id.js";
24
+ import { redactPayload } from "./payload-privacy.js";
25
+ import { RawMessagePrivacyProcessor } from "./raw-privacy.js";
26
+ import { segmentMessages } from "./segmenter.js";
27
+ const DEFAULTS = {
28
+ silenceMs: 30 * 60_000,
29
+ maxRetries: 3,
30
+ retryBackoffMs: 5 * 60_000,
31
+ maxSegmentTokens: 3000,
32
+ };
33
+ export class SessionDistiller {
34
+ deps;
35
+ now;
36
+ constructor(deps) {
37
+ this.deps = deps;
38
+ this.now = deps.opts?.now ?? (() => Date.now());
39
+ }
40
+ opt(key) {
41
+ const v = this.deps.opts?.[key];
42
+ return typeof v === "number" ? v : DEFAULTS[key];
43
+ }
44
+ /** Process one tick over pending revisions. */
45
+ async runTick() {
46
+ const result = {
47
+ considered: 0,
48
+ distilled: 0,
49
+ skipped: 0,
50
+ failed: 0,
51
+ deadLettered: 0,
52
+ replayed: 0,
53
+ };
54
+ const pending = [
55
+ ...(await this.deps.sessions.listSessions({ state: "discovered" })),
56
+ ...(await this.deps.sessions.listSessions({ state: "retrying" })),
57
+ ];
58
+ for (const rev of pending) {
59
+ result.considered++;
60
+ await this.processRevision(rev, result);
61
+ }
62
+ return result;
63
+ }
64
+ async processRevision(rev, result) {
65
+ // Replay guard: a payload already exists → never call the LLM again.
66
+ const existing = await this.deps.payloads.getByRevision(rev.id);
67
+ if (existing) {
68
+ result.replayed++;
69
+ if (rev.state === "discovered") {
70
+ await this.safeMark(rev.id, "distilled");
71
+ }
72
+ return;
73
+ }
74
+ const file = await this.deps.transcripts.load(rev.sourceInstance, rev.sessionId);
75
+ if (!file) {
76
+ result.skipped++;
77
+ return;
78
+ }
79
+ // Silence gate.
80
+ if (this.now() - file.mtimeMs < this.opt("silenceMs")) {
81
+ result.skipped++;
82
+ return;
83
+ }
84
+ // Stale guard: the ledger revision must match the current file content.
85
+ const currentHash = createHash("sha256").update(file.content).digest("hex");
86
+ if (currentHash !== rev.contentHash) {
87
+ result.skipped++;
88
+ return;
89
+ }
90
+ // Retry backoff: a retrying revision waits before its next attempt.
91
+ if (rev.state === "retrying") {
92
+ const since = Date.parse(rev.updatedAt);
93
+ if (Number.isFinite(since) && this.now() - since < this.opt("retryBackoffMs")) {
94
+ result.skipped++;
95
+ return;
96
+ }
97
+ }
98
+ const messages = parseTranscript(file.content);
99
+ if (messages.length === 0) {
100
+ result.skipped++;
101
+ return;
102
+ }
103
+ const outcome = await this.distillOnce(messages);
104
+ if (outcome.ok) {
105
+ // Second-pass privacy + persist to outbox.
106
+ const clean = redactPayload(outcome.payload, this.deps.privacy);
107
+ await this.deps.payloads.persist({
108
+ sourceInstance: rev.sourceInstance,
109
+ sessionId: rev.sessionId,
110
+ revisionId: rev.id,
111
+ contentHash: rev.contentHash,
112
+ payload: clean,
113
+ restorationMap: outcome.restorationMap,
114
+ });
115
+ // persist() advances discovered→distilled; a retrying revision needs an
116
+ // explicit transition back to distilled.
117
+ if (rev.state === "retrying") {
118
+ await this.safeMark(rev.id, "distilled");
119
+ }
120
+ result.distilled++;
121
+ return;
122
+ }
123
+ // Failure path: retry / dead-letter.
124
+ await this.handleFailure(rev, result);
125
+ }
126
+ /**
127
+ * Run the distill pipeline once with a single in-tick retry. Returns the
128
+ * validated payload + reversible restoration map, or a failure.
129
+ */
130
+ async distillOnce(messages) {
131
+ const parsed = assignMsgIds(messages);
132
+ // First pass: redact raw text BEFORE the LLM sees it.
133
+ const rawPrivacy = new RawMessagePrivacyProcessor(this.deps.privacy);
134
+ const { messages: redacted, restorationMap } = rawPrivacy.redactMessages(parsed);
135
+ const segments = segmentMessages(redacted, {
136
+ maxSegmentTokens: this.opt("maxSegmentTokens"),
137
+ });
138
+ for (let attempt = 0; attempt < 2; attempt++) {
139
+ try {
140
+ const { payload } = await mapReduceDistill(segments, this.deps.provider);
141
+ // Evidence bounds + reference.url locatability against the (redacted)
142
+ // messages actually shown to the model.
143
+ const ev = validateEvidence(payload.signals, redacted);
144
+ if (!ev.ok)
145
+ continue;
146
+ return { ok: true, payload, restorationMap };
147
+ }
148
+ catch {
149
+ // fall through to retry / failure
150
+ }
151
+ }
152
+ return { ok: false };
153
+ }
154
+ async handleFailure(rev, result) {
155
+ if (rev.state === "retrying") {
156
+ // Already retrying: dead-letter once retries are exhausted, else bump count.
157
+ if (rev.retryCount >= this.opt("maxRetries")) {
158
+ await this.safeMark(rev.id, "dead_letter");
159
+ result.deadLettered++;
160
+ }
161
+ else {
162
+ await this.deps.sessions.incrementRetry(rev.id);
163
+ result.failed++;
164
+ }
165
+ return;
166
+ }
167
+ // First failure for a discovered revision → retrying (+1).
168
+ await this.safeMark(rev.id, "retrying");
169
+ await this.deps.sessions.incrementRetry(rev.id);
170
+ result.failed++;
171
+ }
172
+ async safeMark(id, next) {
173
+ try {
174
+ await this.deps.sessions.markState(id, next);
175
+ }
176
+ catch {
177
+ // Illegal transition (already advanced by a concurrent tick) — ignore.
178
+ }
179
+ }
180
+ }
181
+ /**
182
+ * Parse a claude-code / codex-style JSONL transcript into ordered role+text
183
+ * messages. Tolerant: skips non-conversation lines and unparseable content.
184
+ * Kept local so the distiller does not depend on the collector's file IO.
185
+ */
186
+ export function parseTranscript(content) {
187
+ const out = [];
188
+ for (const line of content.split("\n")) {
189
+ const trimmed = line.trim();
190
+ if (!trimmed)
191
+ continue;
192
+ let obj;
193
+ try {
194
+ obj = JSON.parse(trimmed);
195
+ }
196
+ catch {
197
+ continue;
198
+ }
199
+ const type = obj.type;
200
+ if (type !== "user" && type !== "assistant")
201
+ continue;
202
+ const message = obj.message;
203
+ if (!message)
204
+ continue;
205
+ const role = message.role === "assistant" ? "assistant" : "user";
206
+ let text;
207
+ const content = message.content;
208
+ if (typeof content === "string") {
209
+ text = content;
210
+ }
211
+ else if (Array.isArray(content)) {
212
+ text = content
213
+ .filter((b) => b.type === "text" && b.text)
214
+ .map((b) => b.text ?? "")
215
+ .join("\n\n");
216
+ }
217
+ else {
218
+ continue;
219
+ }
220
+ if (!text.trim())
221
+ continue;
222
+ out.push({ role, content: text });
223
+ }
224
+ return out;
225
+ }
226
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/distiller/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAwB,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAyCjD,MAAM,QAAQ,GAAG;IACf,SAAS,EAAE,EAAE,GAAG,MAAM;IACtB,UAAU,EAAE,CAAC;IACb,cAAc,EAAE,CAAC,GAAG,MAAM;IAC1B,gBAAgB,EAAE,IAAI;CACvB,CAAC;AAEF,MAAM,OAAO,gBAAgB;IAGE;IAFZ,GAAG,CAAe;IAEnC,YAA6B,IAA0B;QAA1B,SAAI,GAAJ,IAAI,CAAsB;QACrD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAClD,CAAC;IAEO,GAAG,CAAkC,GAAM;QACjD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAA0B,CAAC,CAAC;QACvD,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACnD,CAAC;IAED,+CAA+C;IAC/C,KAAK,CAAC,OAAO;QACX,MAAM,MAAM,GAAe;YACzB,UAAU,EAAE,CAAC;YACb,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,CAAC;YACT,YAAY,EAAE,CAAC;YACf,QAAQ,EAAE,CAAC;SACZ,CAAC;QAEF,MAAM,OAAO,GAAG;YACd,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;YACnE,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;SAClE,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,GAAoB,EAAE,MAAkB;QACpE,qEAAqE;QACrE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChE,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,GAAG,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;gBAC/B,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;YAC3C,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QACjF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,gBAAgB;QAChB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YACtD,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,wEAAwE;QACxE,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,IAAI,WAAW,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC;YACpC,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,oEAAoE;QACpE,IAAI,GAAG,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACxC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAC9E,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO;YACT,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;YACf,2CAA2C;YAC3C,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChE,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC/B,cAAc,EAAE,GAAG,CAAC,cAAc;gBAClC,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,UAAU,EAAE,GAAG,CAAC,EAAE;gBAClB,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,OAAO,EAAE,KAAK;gBACd,cAAc,EAAE,OAAO,CAAC,cAAc;aACvC,CAAC,CAAC;YACH,wEAAwE;YACxE,yCAAyC;YACzC,IAAI,GAAG,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;gBAC7B,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;YAC3C,CAAC;YACD,MAAM,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,qCAAqC;QACrC,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,WAAW,CAAC,QAA2B;QAQnD,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QAEtC,sDAAsD;QACtD,MAAM,UAAU,GAAG,IAAI,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAEjF,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,EAAE;YACzC,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC;SAC/C,CAAC,CAAC;QAEH,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACzE,sEAAsE;gBACtE,wCAAwC;gBACxC,MAAM,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBACvD,IAAI,CAAC,EAAE,CAAC,EAAE;oBAAE,SAAS;gBACrB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;YAC/C,CAAC;YAAC,MAAM,CAAC;gBACP,kCAAkC;YACpC,CAAC;QACH,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,GAAoB,EAAE,MAAkB;QAClE,IAAI,GAAG,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YAC7B,6EAA6E;YAC7E,IAAI,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC7C,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;gBAC3C,MAAM,CAAC,YAAY,EAAE,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChD,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,CAAC;YACD,OAAO;QACT,CAAC;QACD,2DAA2D;QAC3D,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QACxC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,EAAU,EAAE,IAAkB;QACnD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;QACzE,CAAC;IACH,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,IAAI,GAA4B,CAAC;QACjC,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACtB,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,WAAW;YAAE,SAAS;QACtD,MAAM,OAAO,GAAG,GAAG,CAAC,OAA2D,CAAC;QAChF,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;QACjE,IAAI,IAAY,CAAC;QACjB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,GAAG,OAAO,CAAC;QACjB,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,IAAI,GAAI,OAAmD;iBACxD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC;iBAC1C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;iBACxB,IAAI,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAS;QAC3B,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Sequential map-reduce distillation (spec §5.1).
3
+ *
4
+ * MAP (sequential, not parallel): each segment is distilled in order; the prompt
5
+ * for segment N carries forward segment N-1's `carry_forward` (in-progress topics
6
+ * / undecided items) so `overturned` can be filled reliably. Session counts are
7
+ * low, so sequential cost is acceptable.
8
+ *
9
+ * Intermediate per-segment schema:
10
+ * { seg_no, summary, tentative_signals[], overturned[], carry_forward }
11
+ *
12
+ * REDUCE: merges the tentative signals into a final payload. The reduce prompt
13
+ * carries the explicit rule "conclusions appearing in any `overturned` must not
14
+ * enter the final signals". We additionally post-filter overturned topics
15
+ * programmatically so a model slip cannot leak a retracted conclusion back in.
16
+ *
17
+ * The final payload is only structurally validated here (parsePayload). Evidence
18
+ * bounds + reference.url locatability (msg-id.ts) and second-pass privacy run in
19
+ * the orchestrator, which has the full transcript.
20
+ */
21
+ import { z } from "zod";
22
+ import type { LLMProvider } from "../extractors/providers/types.js";
23
+ import { type DistilledPayload } from "./contract.js";
24
+ import type { Segment } from "./segmenter.js";
25
+ export declare const OverturnedSchema: z.ZodObject<{
26
+ topic: z.ZodString;
27
+ reason: z.ZodOptional<z.ZodString>;
28
+ }, "strip", z.ZodTypeAny, {
29
+ topic: string;
30
+ reason?: string | undefined;
31
+ }, {
32
+ topic: string;
33
+ reason?: string | undefined;
34
+ }>;
35
+ export declare const SegmentSummarySchema: z.ZodObject<{
36
+ seg_no: z.ZodNumber;
37
+ summary: z.ZodString;
38
+ tentative_signals: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">;
39
+ overturned: z.ZodArray<z.ZodObject<{
40
+ topic: z.ZodString;
41
+ reason: z.ZodOptional<z.ZodString>;
42
+ }, "strip", z.ZodTypeAny, {
43
+ topic: string;
44
+ reason?: string | undefined;
45
+ }, {
46
+ topic: string;
47
+ reason?: string | undefined;
48
+ }>, "many">;
49
+ carry_forward: z.ZodString;
50
+ }, "strip", z.ZodTypeAny, {
51
+ summary: string;
52
+ seg_no: number;
53
+ tentative_signals: Record<string, unknown>[];
54
+ overturned: {
55
+ topic: string;
56
+ reason?: string | undefined;
57
+ }[];
58
+ carry_forward: string;
59
+ }, {
60
+ summary: string;
61
+ seg_no: number;
62
+ tentative_signals: Record<string, unknown>[];
63
+ overturned: {
64
+ topic: string;
65
+ reason?: string | undefined;
66
+ }[];
67
+ carry_forward: string;
68
+ }>;
69
+ export type SegmentSummary = z.infer<typeof SegmentSummarySchema>;
70
+ export interface MapReduceResult {
71
+ payload: DistilledPayload;
72
+ overturnedTopics: string[];
73
+ segmentSummaries: SegmentSummary[];
74
+ }
75
+ /**
76
+ * Run sequential map over segments then a single reduce.
77
+ * `criteria` is the judgment-declaration prompt fragment (spec §5 / §11 task 2.9);
78
+ * callers inject the embedded distill criteria.
79
+ */
80
+ export declare function mapReduceDistill(segments: Segment[], provider: LLMProvider, criteria?: string): Promise<MapReduceResult>;
81
+ //# sourceMappingURL=map-reduce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-reduce.d.ts","sourceRoot":"","sources":["../../src/distiller/map-reduce.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EACL,KAAK,gBAAgB,EAItB,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAK9C,eAAO,MAAM,gBAAgB;;;;;;;;;EAG3B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB,EAAE,cAAc,EAAE,CAAC;CACpC;AAWD;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,OAAO,EAAE,EACnB,QAAQ,EAAE,WAAW,EACrB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,CAoD1B"}