@0xmaxma/claude-gateway 1.6.9 → 1.7.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.
Files changed (214) hide show
  1. package/README.md +149 -20
  2. package/config.template.json +59 -1
  3. package/dist/agent/dreaming/accept.d.ts +43 -0
  4. package/dist/agent/dreaming/accept.d.ts.map +1 -0
  5. package/dist/agent/dreaming/accept.js +230 -0
  6. package/dist/agent/dreaming/accept.js.map +1 -0
  7. package/dist/agent/dreaming/applier.d.ts +77 -0
  8. package/dist/agent/dreaming/applier.d.ts.map +1 -0
  9. package/dist/agent/dreaming/applier.js +406 -0
  10. package/dist/agent/dreaming/applier.js.map +1 -0
  11. package/dist/agent/dreaming/audit.d.ts +27 -0
  12. package/dist/agent/dreaming/audit.d.ts.map +1 -0
  13. package/dist/agent/dreaming/audit.js +100 -0
  14. package/dist/agent/dreaming/audit.js.map +1 -0
  15. package/dist/agent/dreaming/compactor.d.ts +66 -0
  16. package/dist/agent/dreaming/compactor.d.ts.map +1 -0
  17. package/dist/agent/dreaming/compactor.js +306 -0
  18. package/dist/agent/dreaming/compactor.js.map +1 -0
  19. package/dist/agent/dreaming/config.d.ts +19 -0
  20. package/dist/agent/dreaming/config.d.ts.map +1 -0
  21. package/dist/agent/dreaming/config.js +107 -0
  22. package/dist/agent/dreaming/config.js.map +1 -0
  23. package/dist/agent/dreaming/episodic.d.ts +42 -0
  24. package/dist/agent/dreaming/episodic.d.ts.map +1 -0
  25. package/dist/agent/dreaming/episodic.js +116 -0
  26. package/dist/agent/dreaming/episodic.js.map +1 -0
  27. package/dist/agent/dreaming/gather.d.ts +31 -0
  28. package/dist/agent/dreaming/gather.d.ts.map +1 -0
  29. package/dist/agent/dreaming/gather.js +55 -0
  30. package/dist/agent/dreaming/gather.js.map +1 -0
  31. package/dist/agent/dreaming/index.d.ts +87 -0
  32. package/dist/agent/dreaming/index.d.ts.map +1 -0
  33. package/dist/agent/dreaming/index.js +377 -0
  34. package/dist/agent/dreaming/index.js.map +1 -0
  35. package/dist/agent/dreaming/migrate-cli.d.ts +17 -0
  36. package/dist/agent/dreaming/migrate-cli.d.ts.map +1 -0
  37. package/dist/agent/dreaming/migrate-cli.js +42 -0
  38. package/dist/agent/dreaming/migrate-cli.js.map +1 -0
  39. package/dist/agent/dreaming/migrate.d.ts +72 -0
  40. package/dist/agent/dreaming/migrate.d.ts.map +1 -0
  41. package/dist/agent/dreaming/migrate.js +374 -0
  42. package/dist/agent/dreaming/migrate.js.map +1 -0
  43. package/dist/agent/dreaming/report.d.ts +39 -0
  44. package/dist/agent/dreaming/report.d.ts.map +1 -0
  45. package/dist/agent/dreaming/report.js +121 -0
  46. package/dist/agent/dreaming/report.js.map +1 -0
  47. package/dist/agent/dreaming/reviewer.d.ts +43 -0
  48. package/dist/agent/dreaming/reviewer.d.ts.map +1 -0
  49. package/dist/agent/dreaming/reviewer.js +249 -0
  50. package/dist/agent/dreaming/reviewer.js.map +1 -0
  51. package/dist/agent/dreaming/staleness.d.ts +68 -0
  52. package/dist/agent/dreaming/staleness.d.ts.map +1 -0
  53. package/dist/agent/dreaming/staleness.js +281 -0
  54. package/dist/agent/dreaming/staleness.js.map +1 -0
  55. package/dist/agent/dreaming/types.d.ts +130 -0
  56. package/dist/agent/dreaming/types.d.ts.map +1 -0
  57. package/dist/agent/dreaming/types.js +10 -0
  58. package/dist/agent/dreaming/types.js.map +1 -0
  59. package/dist/agent/knowledge/archive-db.d.ts +114 -0
  60. package/dist/agent/knowledge/archive-db.d.ts.map +1 -0
  61. package/dist/agent/knowledge/archive-db.js +474 -0
  62. package/dist/agent/knowledge/archive-db.js.map +1 -0
  63. package/dist/agent/knowledge/chunk.d.ts +21 -0
  64. package/dist/agent/knowledge/chunk.d.ts.map +1 -0
  65. package/dist/agent/knowledge/chunk.js +67 -0
  66. package/dist/agent/knowledge/chunk.js.map +1 -0
  67. package/dist/agent/knowledge/config.d.ts +20 -0
  68. package/dist/agent/knowledge/config.d.ts.map +1 -0
  69. package/dist/agent/knowledge/config.js +143 -0
  70. package/dist/agent/knowledge/config.js.map +1 -0
  71. package/dist/agent/knowledge/graph-demo.d.ts +25 -0
  72. package/dist/agent/knowledge/graph-demo.d.ts.map +1 -0
  73. package/dist/agent/knowledge/graph-demo.js +132 -0
  74. package/dist/agent/knowledge/graph-demo.js.map +1 -0
  75. package/dist/agent/knowledge/index.d.ts +24 -0
  76. package/dist/agent/knowledge/index.d.ts.map +1 -0
  77. package/dist/agent/knowledge/index.js +50 -0
  78. package/dist/agent/knowledge/index.js.map +1 -0
  79. package/dist/agent/knowledge/indexer.d.ts +34 -0
  80. package/dist/agent/knowledge/indexer.d.ts.map +1 -0
  81. package/dist/agent/knowledge/indexer.js +271 -0
  82. package/dist/agent/knowledge/indexer.js.map +1 -0
  83. package/dist/agent/knowledge/lifecycle.d.ts +91 -0
  84. package/dist/agent/knowledge/lifecycle.d.ts.map +1 -0
  85. package/dist/agent/knowledge/lifecycle.js +205 -0
  86. package/dist/agent/knowledge/lifecycle.js.map +1 -0
  87. package/dist/agent/knowledge/provenance.d.ts +15 -0
  88. package/dist/agent/knowledge/provenance.d.ts.map +1 -0
  89. package/dist/agent/knowledge/provenance.js +37 -0
  90. package/dist/agent/knowledge/provenance.js.map +1 -0
  91. package/dist/agent/knowledge/reindex-cli.d.ts +13 -0
  92. package/dist/agent/knowledge/reindex-cli.d.ts.map +1 -0
  93. package/dist/agent/knowledge/reindex-cli.js +53 -0
  94. package/dist/agent/knowledge/reindex-cli.js.map +1 -0
  95. package/dist/agent/knowledge/reindex-spawn.d.ts +30 -0
  96. package/dist/agent/knowledge/reindex-spawn.d.ts.map +1 -0
  97. package/dist/agent/knowledge/reindex-spawn.js +97 -0
  98. package/dist/agent/knowledge/reindex-spawn.js.map +1 -0
  99. package/dist/agent/knowledge/shared-promote.d.ts +18 -0
  100. package/dist/agent/knowledge/shared-promote.d.ts.map +1 -0
  101. package/dist/agent/knowledge/shared-promote.js +29 -0
  102. package/dist/agent/knowledge/shared-promote.js.map +1 -0
  103. package/dist/agent/knowledge/shared-writer.d.ts +24 -0
  104. package/dist/agent/knowledge/shared-writer.d.ts.map +1 -0
  105. package/dist/agent/knowledge/shared-writer.js +97 -0
  106. package/dist/agent/knowledge/shared-writer.js.map +1 -0
  107. package/dist/agent/knowledge/types.d.ts +83 -0
  108. package/dist/agent/knowledge/types.d.ts.map +1 -0
  109. package/dist/agent/knowledge/types.js +12 -0
  110. package/dist/agent/knowledge/types.js.map +1 -0
  111. package/dist/agent/knowledge/wiki.d.ts +107 -0
  112. package/dist/agent/knowledge/wiki.d.ts.map +1 -0
  113. package/dist/agent/knowledge/wiki.js +415 -0
  114. package/dist/agent/knowledge/wiki.js.map +1 -0
  115. package/dist/agent/memory-metrics.d.ts +48 -0
  116. package/dist/agent/memory-metrics.d.ts.map +1 -0
  117. package/dist/agent/memory-metrics.js +156 -0
  118. package/dist/agent/memory-metrics.js.map +1 -0
  119. package/dist/agent/runner.d.ts +24 -1
  120. package/dist/agent/runner.d.ts.map +1 -1
  121. package/dist/agent/runner.js +82 -6
  122. package/dist/agent/runner.js.map +1 -1
  123. package/dist/agent/skill-learning/config.d.ts +18 -0
  124. package/dist/agent/skill-learning/config.d.ts.map +1 -0
  125. package/dist/agent/skill-learning/config.js +71 -0
  126. package/dist/agent/skill-learning/config.js.map +1 -0
  127. package/dist/agent/skill-learning/curator.d.ts +45 -0
  128. package/dist/agent/skill-learning/curator.d.ts.map +1 -0
  129. package/dist/agent/skill-learning/curator.js +171 -0
  130. package/dist/agent/skill-learning/curator.js.map +1 -0
  131. package/dist/agent/skill-learning/index.d.ts +79 -0
  132. package/dist/agent/skill-learning/index.d.ts.map +1 -0
  133. package/dist/agent/skill-learning/index.js +308 -0
  134. package/dist/agent/skill-learning/index.js.map +1 -0
  135. package/dist/agent/skill-learning/metrics.d.ts +13 -0
  136. package/dist/agent/skill-learning/metrics.d.ts.map +1 -0
  137. package/dist/agent/skill-learning/metrics.js +109 -0
  138. package/dist/agent/skill-learning/metrics.js.map +1 -0
  139. package/dist/agent/skill-learning/notifier.d.ts +111 -0
  140. package/dist/agent/skill-learning/notifier.d.ts.map +1 -0
  141. package/dist/agent/skill-learning/notifier.js +398 -0
  142. package/dist/agent/skill-learning/notifier.js.map +1 -0
  143. package/dist/agent/skill-learning/reviewer.d.ts +61 -0
  144. package/dist/agent/skill-learning/reviewer.d.ts.map +1 -0
  145. package/dist/agent/skill-learning/reviewer.js +271 -0
  146. package/dist/agent/skill-learning/reviewer.js.map +1 -0
  147. package/dist/agent/skill-learning/telemetry.d.ts +22 -0
  148. package/dist/agent/skill-learning/telemetry.d.ts.map +1 -0
  149. package/dist/agent/skill-learning/telemetry.js +90 -0
  150. package/dist/agent/skill-learning/telemetry.js.map +1 -0
  151. package/dist/agent/skill-learning/trigger.d.ts +23 -0
  152. package/dist/agent/skill-learning/trigger.d.ts.map +1 -0
  153. package/dist/agent/skill-learning/trigger.js +44 -0
  154. package/dist/agent/skill-learning/trigger.js.map +1 -0
  155. package/dist/agent/skill-learning/types.d.ts +165 -0
  156. package/dist/agent/skill-learning/types.d.ts.map +1 -0
  157. package/dist/agent/skill-learning/types.js +11 -0
  158. package/dist/agent/skill-learning/types.js.map +1 -0
  159. package/dist/agent/skill-learning/writer.d.ts +37 -0
  160. package/dist/agent/skill-learning/writer.d.ts.map +1 -0
  161. package/dist/agent/skill-learning/writer.js +223 -0
  162. package/dist/agent/skill-learning/writer.js.map +1 -0
  163. package/dist/agent/workspace-loader.d.ts +83 -6
  164. package/dist/agent/workspace-loader.d.ts.map +1 -1
  165. package/dist/agent/workspace-loader.js +207 -14
  166. package/dist/agent/workspace-loader.js.map +1 -1
  167. package/dist/api/gateway-router.d.ts +2 -0
  168. package/dist/api/gateway-router.d.ts.map +1 -1
  169. package/dist/api/gateway-router.js +293 -6
  170. package/dist/api/gateway-router.js.map +1 -1
  171. package/dist/api/skills-router.d.ts +2 -2
  172. package/dist/api/skills-router.d.ts.map +1 -1
  173. package/dist/api/skills-router.js +61 -1
  174. package/dist/api/skills-router.js.map +1 -1
  175. package/dist/apps/agent-manager.d.ts +7 -0
  176. package/dist/apps/agent-manager.d.ts.map +1 -1
  177. package/dist/apps/agent-manager.js +13 -1
  178. package/dist/apps/agent-manager.js.map +1 -1
  179. package/dist/config/migrator.d.ts +2 -0
  180. package/dist/config/migrator.d.ts.map +1 -1
  181. package/dist/config/migrator.js +72 -1
  182. package/dist/config/migrator.js.map +1 -1
  183. package/dist/history/cleanup.d.ts +7 -0
  184. package/dist/history/cleanup.d.ts.map +1 -1
  185. package/dist/history/cleanup.js +27 -0
  186. package/dist/history/cleanup.js.map +1 -1
  187. package/dist/history/db.d.ts +65 -0
  188. package/dist/history/db.d.ts.map +1 -1
  189. package/dist/history/db.js +261 -0
  190. package/dist/history/db.js.map +1 -1
  191. package/dist/index.js +122 -20
  192. package/dist/index.js.map +1 -1
  193. package/dist/session/process.d.ts +10 -0
  194. package/dist/session/process.d.ts.map +1 -1
  195. package/dist/session/process.js +86 -1
  196. package/dist/session/process.js.map +1 -1
  197. package/dist/skills/loader.d.ts +8 -0
  198. package/dist/skills/loader.d.ts.map +1 -1
  199. package/dist/skills/loader.js +29 -1
  200. package/dist/skills/loader.js.map +1 -1
  201. package/dist/types.d.ts +116 -0
  202. package/dist/types.d.ts.map +1 -1
  203. package/dist/ui/web-ui.d.ts.map +1 -1
  204. package/dist/ui/web-ui.js +1126 -3
  205. package/dist/ui/web-ui.js.map +1 -1
  206. package/mcp/package.json +2 -1
  207. package/mcp/server.ts +2 -0
  208. package/mcp/tools/memory/archive-reader.test.ts +212 -0
  209. package/mcp/tools/memory/archive-reader.ts +253 -0
  210. package/mcp/tools/memory/module.ts +152 -0
  211. package/mcp/tools/memory/retrieval-recorder.ts +66 -0
  212. package/mcp/tools/skills/module.ts +28 -0
  213. package/package.json +1 -1
  214. package/resource/claude_gateway.svg +1038 -112
@@ -0,0 +1,374 @@
1
+ "use strict";
2
+ /**
3
+ * One-shot memory migration (planning-65) — drain an over-budget MEMORY.md that
4
+ * accumulated task-log before write-routing existed.
5
+ *
6
+ * Two deterministic passes, both non-destructive (content is relocated, never
7
+ * deleted — everything stays searchable via `memory_search`):
8
+ *
9
+ * Pass 1 — terminal sweep: reuse the shipped compactor (#337) to move
10
+ * MERGED/CLOSED/✅-marked blocks to `memory/archive/completed.md`.
11
+ *
12
+ * Pass 2 — episodic route-out: an injected classifier (`routeOut`, in
13
+ * production a print-only reviewer) proposes which REMAINING MEMORY.md blocks
14
+ * are episodic task-log. Each surviving proposal moves the block's text to
15
+ * `memory/<topic>.md` and removes the block from MEMORY.md. Pinned sections
16
+ * (`## User`, `## Feedback`, `## Preferences`) are hard-excluded — never moved.
17
+ *
18
+ * `mode:"propose"` writes a `.dreaming/migration-plan.md` review file and mutates
19
+ * MEMORY.md not at all (beyond Pass 1's deterministic sweep, which is always safe
20
+ * and idempotent). `mode:"apply"` performs the moves (archive-first, then one
21
+ * backed-up atomic rewrite of MEMORY.md).
22
+ */
23
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ var desc = Object.getOwnPropertyDescriptor(m, k);
26
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
27
+ desc = { enumerable: true, get: function() { return m[k]; } };
28
+ }
29
+ Object.defineProperty(o, k2, desc);
30
+ }) : (function(o, m, k, k2) {
31
+ if (k2 === undefined) k2 = k;
32
+ o[k2] = m[k];
33
+ }));
34
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
35
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
36
+ }) : function(o, v) {
37
+ o["default"] = v;
38
+ });
39
+ var __importStar = (this && this.__importStar) || (function () {
40
+ var ownKeys = function(o) {
41
+ ownKeys = Object.getOwnPropertyNames || function (o) {
42
+ var ar = [];
43
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
44
+ return ar;
45
+ };
46
+ return ownKeys(o);
47
+ };
48
+ return function (mod) {
49
+ if (mod && mod.__esModule) return mod;
50
+ var result = {};
51
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
52
+ __setModuleDefault(result, mod);
53
+ return result;
54
+ };
55
+ })();
56
+ Object.defineProperty(exports, "__esModule", { value: true });
57
+ exports.pinnedRanges = pinnedRanges;
58
+ exports.isTargetPinned = isTargetPinned;
59
+ exports.migrateMemory = migrateMemory;
60
+ exports.makeRouteOut = makeRouteOut;
61
+ const fs = __importStar(require("fs"));
62
+ const path = __importStar(require("path"));
63
+ const compactor_1 = require("./compactor");
64
+ const episodic_1 = require("./episodic");
65
+ const audit_1 = require("./audit");
66
+ /** h2 sections whose entries are durable and must NEVER be routed to episodic. */
67
+ const PINNED_SECTION_RE = /^##\s+(user|feedback|preference|preferences|profile)\b/i;
68
+ const SECTION_RE = /^#{1,2}\s/;
69
+ function readOnDisk(filePath) {
70
+ try {
71
+ return fs.readFileSync(filePath, 'utf8');
72
+ }
73
+ catch {
74
+ return '';
75
+ }
76
+ }
77
+ function atomicWrite(filePath, content) {
78
+ const dir = path.dirname(filePath);
79
+ fs.mkdirSync(dir, { recursive: true });
80
+ const tmp = path.join(dir, `.tmp-migrate-${process.pid}-${process.hrtime.bigint().toString(36)}`);
81
+ try {
82
+ fs.writeFileSync(tmp, content, 'utf8');
83
+ fs.renameSync(tmp, filePath);
84
+ }
85
+ catch (err) {
86
+ try {
87
+ fs.rmSync(tmp, { force: true });
88
+ }
89
+ catch {
90
+ /* best-effort */
91
+ }
92
+ throw err;
93
+ }
94
+ }
95
+ /** Char range [start,end) of each pinned section in `memory` (heading → next h1/h2). */
96
+ function pinnedRanges(memory) {
97
+ const lines = memory.split('\n');
98
+ const ranges = [];
99
+ let offset = 0;
100
+ let openStart = -1;
101
+ for (const line of lines) {
102
+ const lineLen = line.length + 1; // +1 for the split '\n'
103
+ if (SECTION_RE.test(line)) {
104
+ // Close a currently-open pinned section at this heading.
105
+ if (openStart >= 0) {
106
+ ranges.push([openStart, offset]);
107
+ openStart = -1;
108
+ }
109
+ if (PINNED_SECTION_RE.test(line))
110
+ openStart = offset;
111
+ }
112
+ offset += lineLen;
113
+ }
114
+ if (openStart >= 0)
115
+ ranges.push([openStart, memory.length]);
116
+ return ranges;
117
+ }
118
+ function inPinned(index, ranges) {
119
+ return ranges.some(([s, e]) => index >= s && index < e);
120
+ }
121
+ /** True iff the block at `original.indexOf(target)` sits inside a pinned section. */
122
+ function isTargetPinned(memory, target) {
123
+ if (!target)
124
+ return false;
125
+ const at = memory.indexOf(target);
126
+ if (at === -1)
127
+ return false;
128
+ return inPinned(at, pinnedRanges(memory));
129
+ }
130
+ /**
131
+ * Validate route-out proposals against the current MEMORY.md: keep only episodic
132
+ * `add`s with a topic + content whose `target` block occurs EXACTLY once and is
133
+ * NOT inside a pinned section.
134
+ */
135
+ function planMoves(memory, proposals) {
136
+ const ranges = pinnedRanges(memory);
137
+ const out = [];
138
+ for (const p of proposals) {
139
+ if (p.tier !== 'episodic' || p.op !== 'add' || !p.topic || !p.content)
140
+ continue;
141
+ const target = p.target ?? '';
142
+ if (!target)
143
+ continue;
144
+ const first = memory.indexOf(target);
145
+ if (first === -1)
146
+ continue; // block not found → skip
147
+ if (memory.indexOf(target, first + target.length) !== -1)
148
+ continue; // ambiguous → skip
149
+ if (inPinned(first, ranges))
150
+ continue; // pinned section → never move
151
+ out.push({ proposal: p, index: first });
152
+ }
153
+ return out;
154
+ }
155
+ /** Remove each planned block from `memory` in one pass (splice by index, desc). */
156
+ function removeBlocks(memory, planned) {
157
+ let next = memory;
158
+ const sorted = [...planned].sort((a, b) => b.index - a.index);
159
+ for (const { proposal, index } of sorted) {
160
+ const target = proposal.target ?? '';
161
+ // Re-resolve against the ORIGINAL memory offset; splice literally.
162
+ next = next.slice(0, index) + next.slice(index + target.length);
163
+ }
164
+ // Collapse the blank-line gaps left by removed blocks.
165
+ return next.replace(/\n{3,}/g, '\n\n');
166
+ }
167
+ /**
168
+ * Run the migration. Never throws on a per-pass error — returns what it managed
169
+ * to do. In `apply` mode the episodic notes are written BEFORE MEMORY.md is
170
+ * rewritten (archive-first), and MEMORY.md is backed up before the atomic write.
171
+ */
172
+ async function migrateMemory(workspaceDir, opts) {
173
+ const now = opts.now ?? Date.now();
174
+ const episodicDir = opts.episodicArchiveDir || episodic_1.DEFAULT_EPISODIC_DIR;
175
+ const memPath = path.join(workspaceDir, 'MEMORY.md');
176
+ const before = readOnDisk(memPath).length;
177
+ // Pass 1 — deterministic terminal sweep (always safe, idempotent). Skipped by
178
+ // the nightly dream, which already ran the compactor this tick (planning-67).
179
+ let terminalArchived = 0;
180
+ if (!opts.skipTerminalSweep) {
181
+ try {
182
+ terminalArchived = (0, compactor_1.compactCompletedEntries)(workspaceDir, now).archivedCount;
183
+ }
184
+ catch {
185
+ terminalArchived = 0;
186
+ }
187
+ }
188
+ // Pass 2 — episodic route-out (gated on an injected classifier).
189
+ const memory = readOnDisk(memPath);
190
+ let planned = [];
191
+ if (opts.routeOut && memory.trim()) {
192
+ let proposals = [];
193
+ try {
194
+ proposals = (await opts.routeOut(memory)) ?? [];
195
+ }
196
+ catch {
197
+ proposals = [];
198
+ }
199
+ planned = planMoves(memory, proposals);
200
+ }
201
+ if (opts.mode === 'propose') {
202
+ // Write a human-review plan; mutate MEMORY.md not at all in Pass 2.
203
+ let planPath;
204
+ try {
205
+ const dir = path.join(workspaceDir, audit_1.DREAMING_DIR);
206
+ fs.mkdirSync(dir, { recursive: true });
207
+ planPath = path.join(dir, 'migration-plan.md');
208
+ const lines = [
209
+ '# Memory migration plan (planning-65)',
210
+ '',
211
+ `Terminal sweep archived: ${terminalArchived} block(s) → memory/archive/completed.md`,
212
+ `Episodic route-out proposed: ${planned.length} block(s)`,
213
+ '',
214
+ '## Proposed episodic moves (MEMORY.md → memory/<topic>.md)',
215
+ '',
216
+ ...planned.map((m) => `- → \`memory/${m.proposal.topic}.md\` — ${m.proposal.reason || '(episodic task-log)'}\n` +
217
+ ` \`\`\`\n ${(m.proposal.target ?? '').replace(/\n/g, '\n ')}\n \`\`\``),
218
+ '',
219
+ '_Run with --apply to perform these moves (pinned sections excluded, content stays searchable)._',
220
+ ];
221
+ atomicWrite(planPath, lines.join('\n') + '\n');
222
+ }
223
+ catch {
224
+ planPath = undefined;
225
+ }
226
+ return {
227
+ terminalArchived,
228
+ episodicMoved: 0,
229
+ episodicPlanned: planned.length,
230
+ planPath,
231
+ memoryCharsBefore: before,
232
+ memoryCharsAfter: readOnDisk(memPath).length,
233
+ };
234
+ }
235
+ // apply mode — archive first, then one backed-up rewrite of MEMORY.md.
236
+ let episodicMoved = 0;
237
+ if (planned.length > 0) {
238
+ const moved = [];
239
+ for (const m of planned) {
240
+ const res = (0, episodic_1.appendEpisodicNote)(workspaceDir, episodicDir, m.proposal.topic, m.proposal.content, now);
241
+ if (res.ok)
242
+ moved.push(m);
243
+ }
244
+ if (moved.length > 0) {
245
+ // CAS: only rewrite if MEMORY.md is unchanged since we read it.
246
+ if (readOnDisk(memPath) === memory) {
247
+ const next = removeBlocks(memory, moved);
248
+ try {
249
+ const dir = path.join(workspaceDir, audit_1.DREAMING_DIR, 'backups');
250
+ fs.mkdirSync(dir, { recursive: true });
251
+ atomicWrite(path.join(dir, `MEMORY.md.${now}.migrate.bak`), memory);
252
+ }
253
+ catch {
254
+ /* best-effort backup */
255
+ }
256
+ atomicWrite(memPath, next);
257
+ episodicMoved = moved.length;
258
+ }
259
+ }
260
+ }
261
+ return {
262
+ terminalArchived,
263
+ episodicMoved,
264
+ episodicPlanned: planned.length,
265
+ memoryCharsBefore: before,
266
+ memoryCharsAfter: readOnDisk(memPath).length,
267
+ };
268
+ }
269
+ // ── Route-out classifier (shared by the migrate CLI and the nightly dream) ──────
270
+ const ROUTE_OUT_PROMPT = `You migrate an AI agent's MEMORY.md. MEMORY.md is injected into every prompt, so it must hold ONLY durable facts (user preferences, standing rules, identity, lessons). EPISODIC task-log — a record of what happened (completed/merged work, PR/issue status, dated progress notes) — must move to a searchable archive.
271
+
272
+ You are given the current MEMORY.md. Identify the blocks that are EPISODIC task-log and should move out. For each, return the EXACT block text to remove (verbatim, so it can be located) and the note to archive.
273
+
274
+ NEVER move blocks under a "## User", "## Feedback", or "## Preferences" section — those are durable and pinned.
275
+
276
+ Respond with STRICT JSON only (no prose/fences):
277
+ {"moves":[{"target":"<exact block text from MEMORY.md to remove>","topic":"<lowercase-kebab-slug>","content":"<text to archive>","reason":"<why episodic>"}]}
278
+ - topic MUST match ^[a-z0-9-]{1,64}$. moves: [] if nothing should move.`;
279
+ /** Extract the first balanced top-level JSON object from free text (fence-safe). */
280
+ function extractJson(text) {
281
+ const start = text.indexOf('{');
282
+ if (start < 0)
283
+ return null;
284
+ let depth = 0;
285
+ let inStr = false;
286
+ let esc = false;
287
+ for (let i = start; i < text.length; i++) {
288
+ const ch = text[i];
289
+ if (inStr) {
290
+ if (esc)
291
+ esc = false;
292
+ else if (ch === '\\')
293
+ esc = true;
294
+ else if (ch === '"')
295
+ inStr = false;
296
+ }
297
+ else if (ch === '"')
298
+ inStr = true;
299
+ else if (ch === '{')
300
+ depth++;
301
+ else if (ch === '}') {
302
+ depth--;
303
+ if (depth === 0)
304
+ return text.slice(start, i + 1);
305
+ }
306
+ }
307
+ return null;
308
+ }
309
+ /** Unwrap a `claude -p --output-format json` envelope, else return stdout as-is. */
310
+ function parseEnvelope(stdout) {
311
+ try {
312
+ const env = JSON.parse(stdout);
313
+ return typeof env['result'] === 'string' ? env['result'] : stdout;
314
+ }
315
+ catch {
316
+ return stdout;
317
+ }
318
+ }
319
+ /**
320
+ * Build the injected route-out classifier that `migrateMemory` consumes, backed by
321
+ * a print-only claude spawn (no tools, untrusted input — same safety model as the
322
+ * dreaming reviewer). Injectable `spawn` keeps it fully testable without a model.
323
+ */
324
+ function makeRouteOut(spawn) {
325
+ return async (memory) => {
326
+ const prompt = `${ROUTE_OUT_PROMPT}\n\n<current_memory>\n${memory}\n</current_memory>\n\nOutput the JSON now:`;
327
+ let stdout = '';
328
+ try {
329
+ const r = await spawn([], prompt);
330
+ if (r.timedOut)
331
+ return [];
332
+ stdout = r.stdout;
333
+ }
334
+ catch {
335
+ return [];
336
+ }
337
+ const jsonStr = extractJson(parseEnvelope(stdout));
338
+ if (!jsonStr)
339
+ return [];
340
+ let parsed;
341
+ try {
342
+ parsed = JSON.parse(jsonStr);
343
+ }
344
+ catch {
345
+ return [];
346
+ }
347
+ const moves = parsed?.['moves'];
348
+ if (!Array.isArray(moves))
349
+ return [];
350
+ const out = [];
351
+ for (const m of moves) {
352
+ if (!m || typeof m !== 'object')
353
+ continue;
354
+ const o = m;
355
+ const target = typeof o['target'] === 'string' ? o['target'] : '';
356
+ const content = typeof o['content'] === 'string' ? o['content'] : '';
357
+ const topic = o['topic'];
358
+ if (!target || !content || !(0, episodic_1.isValidTopicSlug)(topic))
359
+ continue;
360
+ out.push({
361
+ op: 'add',
362
+ tier: 'episodic',
363
+ topic,
364
+ content,
365
+ target,
366
+ reason: typeof o['reason'] === 'string' ? o['reason'] : '',
367
+ score: 1,
368
+ recallCount: 0,
369
+ });
370
+ }
371
+ return out;
372
+ };
373
+ }
374
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../src/agent/dreaming/migrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Parse the dream audit trail (`.dreaming/DREAMS.md` + `promotions.jsonl`) into a
3
+ * structured, newest-first list of runs for the dashboard's "Nightly dreaming" tab.
4
+ *
5
+ * DREAMS.md is the source of truth for *every* run (including no-change / skipped
6
+ * nights) — it carries the header (iso + outcome + mode), summary, and the
7
+ * tokens/sessions footer. promotions.jsonl carries the structured proposal ops
8
+ * (with full `content`), all ops of one run sharing that run's `ts`. The two are
9
+ * joined by `ts` (DREAMS.md's iso parses back to exactly the promotions `ts`).
10
+ *
11
+ * Pure + deterministic (no clock, no disk) so it is unit-testable. Both inputs are
12
+ * untrusted on-disk text — every field is defensively coerced.
13
+ */
14
+ export interface DreamProposalView {
15
+ /** Position within its run's proposal list — the accept target the UI sends back. */
16
+ index: number;
17
+ op: string;
18
+ file: string;
19
+ target?: string;
20
+ content?: string;
21
+ reason: string;
22
+ score: number;
23
+ recallCount: number;
24
+ /** True when this proposal was applied to memory via a manual dashboard accept. */
25
+ accepted: boolean;
26
+ }
27
+ export interface DreamRunReport {
28
+ ts: number;
29
+ iso: string;
30
+ outcome: string;
31
+ mode: string;
32
+ summary: string;
33
+ tokens: number;
34
+ sessions: number;
35
+ applied: number | null;
36
+ proposals: DreamProposalView[];
37
+ }
38
+ export declare function parseDreamReport(dreamsMd: string, promotionsJsonl: string, acceptedJsonl?: string): DreamRunReport[];
39
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/agent/dreaming/report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,iBAAiB;IAChC,qFAAqF;IACrF,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,iBAAiB,EAAE,CAAC;CAChC;AAyED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EACvB,aAAa,SAAK,GACjB,cAAc,EAAE,CA6BlB"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ /**
3
+ * Parse the dream audit trail (`.dreaming/DREAMS.md` + `promotions.jsonl`) into a
4
+ * structured, newest-first list of runs for the dashboard's "Nightly dreaming" tab.
5
+ *
6
+ * DREAMS.md is the source of truth for *every* run (including no-change / skipped
7
+ * nights) — it carries the header (iso + outcome + mode), summary, and the
8
+ * tokens/sessions footer. promotions.jsonl carries the structured proposal ops
9
+ * (with full `content`), all ops of one run sharing that run's `ts`. The two are
10
+ * joined by `ts` (DREAMS.md's iso parses back to exactly the promotions `ts`).
11
+ *
12
+ * Pure + deterministic (no clock, no disk) so it is unit-testable. Both inputs are
13
+ * untrusted on-disk text — every field is defensively coerced.
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.parseDreamReport = parseDreamReport;
17
+ function groupPromotionsByTs(jsonl, acceptedKeys) {
18
+ const byTs = new Map();
19
+ for (const raw of jsonl.split('\n')) {
20
+ const line = raw.trim();
21
+ if (!line)
22
+ continue;
23
+ let o;
24
+ try {
25
+ o = JSON.parse(line);
26
+ }
27
+ catch {
28
+ continue; // skip a malformed line rather than fail the whole report
29
+ }
30
+ const ts = Number(o.ts);
31
+ if (!Number.isFinite(ts))
32
+ continue;
33
+ const arr = byTs.get(ts) ?? [];
34
+ const index = arr.length; // position within this run — the accept target
35
+ const view = {
36
+ index,
37
+ op: String(o.op ?? ''),
38
+ file: o.tier === 'episodic' && typeof o.topic === 'string'
39
+ ? `memory/${o.topic}.md`
40
+ : String(o.file ?? ''),
41
+ target: typeof o.target === 'string' ? o.target : undefined,
42
+ content: typeof o.content === 'string' ? o.content : undefined,
43
+ reason: String(o.reason ?? ''),
44
+ score: Number(o.score) || 0,
45
+ recallCount: Number(o.recallCount) || 0,
46
+ accepted: acceptedKeys.has(`${ts}:${index}`),
47
+ };
48
+ arr.push(view);
49
+ byTs.set(ts, arr);
50
+ }
51
+ return byTs;
52
+ }
53
+ /** Parse `accepted.jsonl` into a set of `"<ts>:<index>"` keys. */
54
+ function parseAcceptedKeys(acceptedJsonl) {
55
+ const keys = new Set();
56
+ for (const raw of acceptedJsonl.split('\n')) {
57
+ const line = raw.trim();
58
+ if (!line)
59
+ continue;
60
+ try {
61
+ const o = JSON.parse(line);
62
+ const ts = Number(o.ts);
63
+ const idx = Number(o.index);
64
+ if (Number.isFinite(ts) && Number.isFinite(idx))
65
+ keys.add(`${ts}:${idx}`);
66
+ }
67
+ catch {
68
+ /* skip malformed line */
69
+ }
70
+ }
71
+ return keys;
72
+ }
73
+ /** First meaningful prose line(s) after the header, before the first bullet / italic / rule. */
74
+ function extractSummary(sectionLines) {
75
+ const out = [];
76
+ for (let i = 1; i < sectionLines.length; i++) {
77
+ const l = sectionLines[i].trim();
78
+ if (!l) {
79
+ if (out.length)
80
+ break; // blank after we've collected summary → done
81
+ continue; // leading blank → keep looking
82
+ }
83
+ if (l.startsWith('- ') || l.startsWith('_') || l.startsWith('---') || l.startsWith('## '))
84
+ break;
85
+ out.push(l);
86
+ }
87
+ return out.join(' ');
88
+ }
89
+ function parseDreamReport(dreamsMd, promotionsJsonl, acceptedJsonl = '') {
90
+ const acceptedKeys = parseAcceptedKeys(acceptedJsonl);
91
+ const byTs = groupPromotionsByTs(promotionsJsonl, acceptedKeys);
92
+ const runs = [];
93
+ // Each run is a "## <iso> — <outcome> (<mode>)" section.
94
+ const sections = dreamsMd.split(/\n(?=## )/);
95
+ for (const sec of sections) {
96
+ const lines = sec.split('\n');
97
+ const header = lines[0].match(/^## (\S+) — (.+?) \((propose|auto)\)\s*$/);
98
+ if (!header)
99
+ continue;
100
+ const iso = header[1];
101
+ const ts = Date.parse(iso);
102
+ if (!Number.isFinite(ts))
103
+ continue;
104
+ const tok = sec.match(/_tokens: (\d+), sessions: (\d+)_/);
105
+ const app = sec.match(/applied (\d+) op/);
106
+ runs.push({
107
+ ts,
108
+ iso,
109
+ outcome: header[2].trim(),
110
+ mode: header[3],
111
+ summary: extractSummary(lines),
112
+ tokens: tok ? Number(tok[1]) : 0,
113
+ sessions: tok ? Number(tok[2]) : 0,
114
+ applied: app ? Number(app[1]) : null,
115
+ proposals: byTs.get(ts) ?? [],
116
+ });
117
+ }
118
+ runs.sort((a, b) => b.ts - a.ts); // newest first
119
+ return runs;
120
+ }
121
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/agent/dreaming/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Dream reviewer — turns a lookback transcript slice into memory-consolidation
3
+ * *proposals*. Same safety model as the skill-learning reviewer:
4
+ * - print-only: `claude -p`, NO tools, NO `--dangerously-skip-permissions`.
5
+ * The transcript is untrusted (prompt-injection surface); the model can only
6
+ * emit a JSON proposal — the gateway, not the model, owns any write. In
7
+ * propose mode nothing is written to memory at all.
8
+ * - async spawn only (reuses `makeClaudeSpawn`); NEVER `spawnSync`.
9
+ * - never throws — any failure resolves to zero proposals.
10
+ */
11
+ import { type ClaudeSpawnFn } from '../skill-learning/reviewer';
12
+ import type { DreamReviewResult, ResolvedDreamingCfg } from './types';
13
+ export interface DreamReviewerInput {
14
+ /** The lookback transcript slice to consolidate (already trimmed by the caller). */
15
+ transcript: string;
16
+ /** Current MEMORY.md content, so the reviewer proposes deltas, not duplicates. */
17
+ currentMemory: string;
18
+ /** Current USER.md content. */
19
+ currentUser: string;
20
+ /**
21
+ * TRUE on-disk size of MEMORY.md in chars (NOT the truncated context above) and
22
+ * its soft budget. When present and over budget, the reviewer is told to enter
23
+ * net-shrink mode (#337). Optional so callers/tests can omit budget signalling.
24
+ */
25
+ memoryChars?: number;
26
+ memoryBudget?: number;
27
+ /**
28
+ * Write routing (planning-65): when true, the reviewer is told the two-tier
29
+ * contract (durable → MEMORY.md/USER.md, episodic task-log → memory/<topic>.md)
30
+ * and may emit `tier:"episodic"` ops. When false/absent it behaves exactly as
31
+ * before (durable ops only) — a clean kill-switch.
32
+ */
33
+ writeRouting?: boolean;
34
+ }
35
+ /** Exposed for tests: the exact prompt fed to the reviewer for a given input. */
36
+ export declare function buildDreamPrompt(input: DreamReviewerInput): string;
37
+ /** Coerce a parsed envelope into a safe review result. Any deviation ⇒ empty proposals. */
38
+ export declare function coerceReview(raw: unknown, tokensSpent: number): DreamReviewResult;
39
+ /**
40
+ * Run the dream reviewer. Never throws — any failure resolves to zero proposals.
41
+ */
42
+ export declare function runDreamReviewer(input: DreamReviewerInput, cfg: ResolvedDreamingCfg, spawnFn?: ClaudeSpawnFn): Promise<DreamReviewResult>;
43
+ //# sourceMappingURL=reviewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewer.d.ts","sourceRoot":"","sources":["../../../src/agent/dreaming/reviewer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEjF,OAAO,KAAK,EAAiB,iBAAiB,EAAa,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEhG,MAAM,WAAW,kBAAkB;IACjC,oFAAoF;IACpF,UAAU,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,aAAa,EAAE,MAAM,CAAC;IACtB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAmED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAElE;AAqGD,2FAA2F;AAC3F,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,iBAAiB,CAWjF;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,kBAAkB,EACzB,GAAG,EAAE,mBAAmB,EACxB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,iBAAiB,CAAC,CA0C5B"}