@0xmaxma/claude-gateway 1.6.8 → 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 (223) 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/share-router.d.ts.map +1 -1
  172. package/dist/api/share-router.js +27 -1
  173. package/dist/api/share-router.js.map +1 -1
  174. package/dist/api/skills-router.d.ts +2 -2
  175. package/dist/api/skills-router.d.ts.map +1 -1
  176. package/dist/api/skills-router.js +61 -1
  177. package/dist/api/skills-router.js.map +1 -1
  178. package/dist/apps/agent-manager.d.ts +7 -0
  179. package/dist/apps/agent-manager.d.ts.map +1 -1
  180. package/dist/apps/agent-manager.js +13 -1
  181. package/dist/apps/agent-manager.js.map +1 -1
  182. package/dist/config/migrator.d.ts +2 -0
  183. package/dist/config/migrator.d.ts.map +1 -1
  184. package/dist/config/migrator.js +72 -1
  185. package/dist/config/migrator.js.map +1 -1
  186. package/dist/history/cleanup.d.ts +7 -0
  187. package/dist/history/cleanup.d.ts.map +1 -1
  188. package/dist/history/cleanup.js +27 -0
  189. package/dist/history/cleanup.js.map +1 -1
  190. package/dist/history/db.d.ts +65 -0
  191. package/dist/history/db.d.ts.map +1 -1
  192. package/dist/history/db.js +261 -0
  193. package/dist/history/db.js.map +1 -1
  194. package/dist/index.js +122 -20
  195. package/dist/index.js.map +1 -1
  196. package/dist/session/process.d.ts +10 -0
  197. package/dist/session/process.d.ts.map +1 -1
  198. package/dist/session/process.js +86 -1
  199. package/dist/session/process.js.map +1 -1
  200. package/dist/share/share-store.d.ts +11 -0
  201. package/dist/share/share-store.d.ts.map +1 -1
  202. package/dist/share/share-store.js +3 -1
  203. package/dist/share/share-store.js.map +1 -1
  204. package/dist/skills/loader.d.ts +8 -0
  205. package/dist/skills/loader.d.ts.map +1 -1
  206. package/dist/skills/loader.js +29 -1
  207. package/dist/skills/loader.js.map +1 -1
  208. package/dist/types.d.ts +116 -0
  209. package/dist/types.d.ts.map +1 -1
  210. package/dist/ui/web-ui.d.ts.map +1 -1
  211. package/dist/ui/web-ui.js +1126 -3
  212. package/dist/ui/web-ui.js.map +1 -1
  213. package/mcp/package.json +2 -1
  214. package/mcp/server.ts +2 -0
  215. package/mcp/tools/image/module.ts +114 -9
  216. package/mcp/tools/memory/archive-reader.test.ts +212 -0
  217. package/mcp/tools/memory/archive-reader.ts +253 -0
  218. package/mcp/tools/memory/module.ts +152 -0
  219. package/mcp/tools/memory/retrieval-recorder.ts +66 -0
  220. package/mcp/tools/shared/share-client.ts +20 -1
  221. package/mcp/tools/skills/module.ts +28 -0
  222. package/package.json +1 -1
  223. package/resource/claude_gateway.svg +1038 -112
@@ -0,0 +1,377 @@
1
+ "use strict";
2
+ /**
3
+ * DreamingManager — nightly memory consolidation, propose (dry-run) slice.
4
+ *
5
+ * Orchestrates: gather lookback transcript → print-only reviewer proposes memory
6
+ * ops → write DREAMS.md diary + JSONL audit. In propose mode (the only mode
7
+ * implemented here) NO memory file is mutated. The `auto` applier is a P3
8
+ * follow-up; until it lands, `auto` behaves like `propose` (logs proposals only).
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.DreamingManager = void 0;
45
+ exports.selectProposals = selectProposals;
46
+ exports.agentJitterMs = agentJitterMs;
47
+ const fs = __importStar(require("fs"));
48
+ const path = __importStar(require("path"));
49
+ const cleanup_1 = require("../../history/cleanup");
50
+ const config_1 = require("../skill-learning/config");
51
+ const config_2 = require("./config");
52
+ const gather_1 = require("./gather");
53
+ const reviewer_1 = require("./reviewer");
54
+ const audit_1 = require("./audit");
55
+ const applier_1 = require("./applier");
56
+ const compactor_1 = require("./compactor");
57
+ const staleness_1 = require("./staleness");
58
+ const migrate_1 = require("./migrate");
59
+ const MS_PER_MINUTE = 60 * 1000;
60
+ // Cap the current-memory context fed to the reviewer so a large MEMORY.md (which
61
+ // is exactly what dreaming exists to shrink) can't blow up the prompt.
62
+ const REVIEWER_CONTEXT_CAP = 12000;
63
+ // Hard ceiling on shrink ops per run so a runaway over-budget reviewer can't thrash.
64
+ const MAX_SHRINK_OPS_PER_RUN = 30;
65
+ /** A proposal that reduces (or does not grow) MEMORY.md length. */
66
+ function isShrinkOp(p) {
67
+ if (p.op === 'remove')
68
+ return true;
69
+ if (p.op === 'replace')
70
+ return (p.content ?? '').trim().length <= (p.target ?? '').length;
71
+ return false;
72
+ }
73
+ /**
74
+ * Select which proposals to apply this run (#337). Under budget: the classic
75
+ * first-N cap. Over budget (overageFactor > 1): keep the non-shrink (add/grow)
76
+ * cap at `maxChanges`, but allow proportionally MORE shrink ops (remove /
77
+ * length-reducing replace) so an over-budget file converges instead of trickling
78
+ * at `maxChanges`/night. Capped at MAX_SHRINK_OPS_PER_RUN.
79
+ */
80
+ function selectProposals(proposals, maxChanges, overageFactor) {
81
+ if (overageFactor <= 1 || maxChanges <= 0)
82
+ return proposals.slice(0, maxChanges);
83
+ const shrinkCap = Math.min(maxChanges * Math.ceil(overageFactor), MAX_SHRINK_OPS_PER_RUN);
84
+ const out = [];
85
+ let nonShrink = 0;
86
+ let shrink = 0;
87
+ for (const p of proposals) {
88
+ if (isShrinkOp(p)) {
89
+ if (shrink >= shrinkCap)
90
+ continue;
91
+ shrink++;
92
+ }
93
+ else {
94
+ if (nonShrink >= maxChanges)
95
+ continue;
96
+ nonShrink++;
97
+ }
98
+ out.push(p);
99
+ }
100
+ return out;
101
+ }
102
+ function readFileSafe(filePath) {
103
+ try {
104
+ return fs.readFileSync(filePath, 'utf8');
105
+ }
106
+ catch {
107
+ return '';
108
+ }
109
+ }
110
+ /**
111
+ * planning-68 — deterministic per-agent jitter (ms) added to the nightly delay so
112
+ * agents don't all fire at `dreamHour:00` together (thundering herd → concurrent
113
+ * `claude -p` spawns). A stable string hash of `agentId` mapped into
114
+ * `[0, windowMinutes*60_000)`; NOT `Math.random`, so the offset is the same across
115
+ * reschedules and is unit-testable. Non-finite or `<= 0` window ⇒ 0 (feature off).
116
+ */
117
+ function agentJitterMs(agentId, windowMinutes) {
118
+ if (!Number.isFinite(windowMinutes))
119
+ return 0;
120
+ const windowMs = Math.max(0, Math.floor(windowMinutes)) * 60000;
121
+ if (windowMs <= 0)
122
+ return 0;
123
+ let h = 0;
124
+ for (let i = 0; i < agentId.length; i++) {
125
+ h = (Math.imul(h, 31) + agentId.charCodeAt(i)) >>> 0;
126
+ }
127
+ return h % windowMs;
128
+ }
129
+ class DreamingManager {
130
+ constructor(deps) {
131
+ this.deps = deps;
132
+ this.cfg = (0, config_2.resolveDreamingConfig)(deps.agentCfg, deps.globalCfg);
133
+ }
134
+ log(msg, data) {
135
+ this.deps.logger?.info(msg, data);
136
+ }
137
+ /**
138
+ * Run one dream cycle. Never throws. In propose mode it writes only the diary
139
+ * + audit and mutates no memory file.
140
+ */
141
+ async dreamOnce(now = Date.now()) {
142
+ const cfg = this.cfg;
143
+ const base = { proposalCount: 0, tokensSpent: 0, mode: cfg.mode };
144
+ if (!cfg.enabled || cfg.maxChangesPerRun <= 0) {
145
+ return { outcome: 'skipped-disabled', ...base };
146
+ }
147
+ const gathered = (0, gather_1.gatherTranscript)(this.deps.db, cfg, now);
148
+ // Quiet window: if the agent was active within quietMinutes, defer.
149
+ if (gathered.lastActivityMs > 0 && now - gathered.lastActivityMs < cfg.quietMinutes * MS_PER_MINUTE) {
150
+ return { outcome: 'skipped-quiet', ...base };
151
+ }
152
+ const memoryPath = path.join(this.deps.workspaceDir, 'MEMORY.md');
153
+ const memoryBudget = this.deps.memoryBudgetChars ?? 8000;
154
+ // DETERMINISTIC COMPACTION (#337): before the LLM reviewer, archive terminal
155
+ // (MERGED/CLOSED) log entries out to a searchable memory/archive/ file, leaving
156
+ // a pointer. This is the primary shrink lever for append-only PR/issue logs and
157
+ // needs no transcript — so it runs (auto mode only) even on empty-transcript
158
+ // nights. Best-effort; never blocks the dream.
159
+ let compactedCount = 0;
160
+ if (cfg.mode === 'auto') {
161
+ try {
162
+ compactedCount = (0, compactor_1.compactCompletedEntries)(this.deps.workspaceDir, now).archivedCount;
163
+ }
164
+ catch {
165
+ compactedCount = 0;
166
+ }
167
+ }
168
+ // ARCHIVE STALENESS GC (planning-66): after the compactor, keep the Lane-2
169
+ // archive's SEARCH quality high — soft-invalidate superseded / aged-out /
170
+ // low-recall entries (move to memory/archive/stale.md, never delete) and
171
+ // promote back anything retrieved after invalidation. Deterministic, memory-
172
+ // only (no session restart), best-effort. Auto mode only; injectable clock.
173
+ if (cfg.mode === 'auto' && cfg.staleness.enabled) {
174
+ try {
175
+ (0, staleness_1.runStalenessGc)(this.deps.workspaceDir, cfg.staleness, { now });
176
+ }
177
+ catch {
178
+ /* best-effort — never blocks the dream */
179
+ }
180
+ }
181
+ // EMBEDDED ROUTE-OUT (planning-67): when MEMORY.md is over budget, drain its
182
+ // episodic task-log to memory/<topic>.md automatically — archive-first, so
183
+ // every moved block stays searchable (no manual `dreaming:migrate` per agent).
184
+ // Runs auto-mode + routing-on + over-budget only; transcript-independent (like
185
+ // the compactor) so a quiet agent still self-drains; idempotent (skips once
186
+ // under budget); pinned sections excluded inside migrateMemory. Best-effort.
187
+ let routedOut = 0;
188
+ if (cfg.mode === 'auto' &&
189
+ this.deps.writeRouting &&
190
+ cfg.autoRouteOut &&
191
+ this.deps.routeOutFn) {
192
+ const chars = readFileSafe(memoryPath).length;
193
+ if (chars > memoryBudget) {
194
+ try {
195
+ const res = await (0, migrate_1.migrateMemory)(this.deps.workspaceDir, {
196
+ mode: 'apply',
197
+ skipTerminalSweep: true, // the compactor already ran this tick
198
+ episodicArchiveDir: this.deps.episodicArchiveDir || 'memory',
199
+ routeOut: this.deps.routeOutFn,
200
+ now,
201
+ });
202
+ routedOut = res.episodicMoved;
203
+ }
204
+ catch {
205
+ /* best-effort — never blocks the dream */
206
+ }
207
+ }
208
+ }
209
+ if (routedOut > 0) {
210
+ this.log('dream: embedded route-out drained episodic task-log', { routedOut });
211
+ }
212
+ if (!gathered.transcript.trim()) {
213
+ this.audit(now, 'skipped-empty', '', [], 0, 0, cfg.mode === 'auto' ? 0 : undefined, compactedCount);
214
+ return { outcome: 'skipped-empty', ...base, compactedCount };
215
+ }
216
+ // Read the TRUE on-disk MEMORY.md size for the budget signal (the reviewer
217
+ // context below is truncated, so it can't be used to measure the file).
218
+ const memoryChars = readFileSafe(memoryPath).length;
219
+ const currentMemory = readFileSafe(memoryPath).slice(0, REVIEWER_CONTEXT_CAP);
220
+ const currentUser = readFileSafe(path.join(this.deps.workspaceDir, 'USER.md')).slice(0, REVIEWER_CONTEXT_CAP);
221
+ let review;
222
+ try {
223
+ review = await (0, reviewer_1.runDreamReviewer)({
224
+ transcript: gathered.transcript,
225
+ currentMemory,
226
+ currentUser,
227
+ memoryChars,
228
+ memoryBudget,
229
+ writeRouting: this.deps.writeRouting,
230
+ }, cfg, this.deps.spawnFn);
231
+ }
232
+ catch (err) {
233
+ // Defensive only: runDreamReviewer is contracted NEVER to throw — it converts
234
+ // every spawn failure into a `timedOut` result. The #352 catch that logged
235
+ // here was therefore dead code. Keep a minimal guard so a future contract
236
+ // break still audits instead of crashing, but the REAL reviewer-failure
237
+ // diagnostic lives on the reachable branch below (#353).
238
+ this.log('dream: reviewer threw unexpectedly (contract violation)', {
239
+ agentId: this.deps.agentId,
240
+ error: err instanceof Error ? err.message : String(err),
241
+ compacted: compactedCount,
242
+ });
243
+ this.audit(now, 'error', '', [], 0, gathered.sessionCount, undefined, compactedCount);
244
+ return { outcome: 'error', ...base, compactedCount };
245
+ }
246
+ // Over budget ⇒ allow proportionally more shrink ops so the file converges (#337).
247
+ const overageFactor = memoryBudget > 0 ? memoryChars / memoryBudget : 1;
248
+ const proposals = selectProposals(review.proposals, cfg.maxChangesPerRun, overageFactor);
249
+ const outcome = review.timedOut
250
+ ? 'error'
251
+ : proposals.length > 0
252
+ ? 'proposed'
253
+ : 'no-changes';
254
+ // Surface WHY the reviewer produced no usable output (#353). This was
255
+ // previously invisible: makeClaudeSpawn discarded stderr and collapsed
256
+ // timeout / spawn-error / non-zero-exit into a lone `timedOut`, and the #352
257
+ // reviewer-catch log above was unreachable (runDreamReviewer never throws).
258
+ // Log the distinguishable reason HERE, on the branch that actually fires, so
259
+ // the next dream night records the real cause (timeout vs API 429 vs …).
260
+ if (review.timedOut || review.failureReason) {
261
+ this.log('dream: reviewer produced no usable output', {
262
+ agentId: this.deps.agentId,
263
+ outcome,
264
+ failureReason: review.failureReason ?? 'unknown',
265
+ stderrTail: review.stderrTail,
266
+ compacted: compactedCount,
267
+ });
268
+ }
269
+ // AUTO MODE (K4): apply the ops to memory through the safe applier (backup +
270
+ // ordered anchor re-resolution + bounded-loss + net-negative + append-only
271
+ // fallback). Writing MEMORY.md/USER.md is memory-only ⇒ no session restart
272
+ // (Part A). PROPOSE MODE mutates nothing — diary + audit only.
273
+ let appliedCount = 0;
274
+ if (cfg.mode === 'auto' && outcome === 'proposed') {
275
+ let appliedProposals = [];
276
+ try {
277
+ const applied = (0, applier_1.applyDreamProposals)(this.deps.workspaceDir, proposals, {
278
+ memoryBudgetChars: memoryBudget,
279
+ userBudgetChars: this.deps.userBudgetChars ?? 3000,
280
+ // planning-65: route episodic ops to memory/<topic>.md only when routing is on.
281
+ episodicArchiveDir: this.deps.writeRouting
282
+ ? this.deps.episodicArchiveDir || 'memory'
283
+ : undefined,
284
+ // planning-67: relocate net-shrink `remove`s to a searchable archive
285
+ // (never silently delete) when routing is on.
286
+ archivePrunedRemovals: this.deps.writeRouting === true,
287
+ }, now);
288
+ appliedCount = applied.totalApplied;
289
+ appliedProposals = applied.appliedProposals;
290
+ }
291
+ catch {
292
+ appliedCount = 0; // applier never throws, but stay a safe no-op regardless
293
+ }
294
+ // Per-agent→shared promotion (K3↔K4): contribute ONLY the `add`s the applier
295
+ // actually wrote to local memory — never a proposal that was skipped locally
296
+ // (net-negative / bounded-loss), so the shared vault can't gain content the
297
+ // agent's own memory refused. Gated + wired by the gateway (shared enabled +
298
+ // mode auto); best-effort — a promotion failure never affects the local dream.
299
+ if (this.deps.sharedPromote) {
300
+ for (const p of appliedProposals) {
301
+ // Only durable `add`s promote to shared; episodic task-log stays local.
302
+ if (p.op !== 'add' || !p.content || p.tier === 'episodic')
303
+ continue;
304
+ try {
305
+ this.deps.sharedPromote(p);
306
+ }
307
+ catch {
308
+ /* best-effort */
309
+ }
310
+ }
311
+ }
312
+ }
313
+ this.audit(now, outcome, review.summary, proposals, review.tokensSpent, gathered.sessionCount, cfg.mode === 'auto' ? appliedCount : undefined, compactedCount);
314
+ this.log('Dream run complete', {
315
+ agentId: this.deps.agentId,
316
+ outcome,
317
+ mode: cfg.mode,
318
+ proposals: proposals.length,
319
+ applied: appliedCount,
320
+ compacted: compactedCount,
321
+ tokens: review.tokensSpent,
322
+ });
323
+ return {
324
+ outcome,
325
+ proposalCount: proposals.length,
326
+ tokensSpent: review.tokensSpent,
327
+ mode: cfg.mode,
328
+ appliedCount,
329
+ compactedCount,
330
+ };
331
+ }
332
+ audit(ts, outcome, summary, proposals, tokensSpent, sessionCount, appliedCount, compactedCount) {
333
+ (0, audit_1.writeDreamAudit)(this.deps.workspaceDir, {
334
+ ts,
335
+ outcome,
336
+ mode: this.cfg.mode,
337
+ summary,
338
+ proposals,
339
+ tokensSpent,
340
+ sessionCount,
341
+ appliedCount,
342
+ compactedCount,
343
+ });
344
+ }
345
+ /**
346
+ * Start the nightly dream scheduler (mirror `startCurator`): a self-rescheduling
347
+ * unref'd timer at `dreamHour` in `dreamTimezone`. Best-effort; never throws at
348
+ * boot (invalid tz already normalized to UTC in resolveDreamingConfig).
349
+ */
350
+ startDreaming() {
351
+ if (!this.cfg.enabled || this.cfg.maxChangesPerRun <= 0)
352
+ return;
353
+ const tz = (0, config_1.isValidTimezone)(this.cfg.dreamTimezone) ? this.cfg.dreamTimezone : 'UTC';
354
+ const schedule = () => {
355
+ // planning-68: spread agents across a window so they don't all fire at
356
+ // dreamHour:00 together (deterministic per-agent offset, stable per reschedule).
357
+ const delay = (0, cleanup_1.msUntilNextTime)(this.cfg.dreamHour, this.cfg.dreamMinute, tz) +
358
+ agentJitterMs(this.deps.agentId, this.cfg.staggerWindowMinutes);
359
+ this.timer = setTimeout(() => {
360
+ void this.dreamOnce(Date.now()).catch(() => {
361
+ /* best-effort */
362
+ });
363
+ schedule();
364
+ }, delay);
365
+ if (typeof this.timer.unref === 'function') {
366
+ this.timer.unref();
367
+ }
368
+ };
369
+ schedule();
370
+ }
371
+ stop() {
372
+ if (this.timer)
373
+ clearTimeout(this.timer);
374
+ }
375
+ }
376
+ exports.DreamingManager = DreamingManager;
377
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent/dreaming/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * One-shot memory migration entry (planning-65).
4
+ *
5
+ * Drains an over-budget MEMORY.md: a deterministic terminal sweep (#337
6
+ * compactor) + an LLM route-out pass that moves episodic task-log blocks to
7
+ * `memory/<topic>.md`. Pinned sections are excluded and nothing is deleted
8
+ * (content is relocated, still searchable via `memory_search`).
9
+ *
10
+ * Usage: node migrate-cli.js <workspaceDir> [--apply] [<reviewModel>]
11
+ * (default is a dry-run that writes .dreaming/migration-plan.md)
12
+ *
13
+ * The route-out classifier is a print-only `claude -p` (no tools, untrusted
14
+ * input) — same safety model as the dreaming reviewer.
15
+ */
16
+ export {};
17
+ //# sourceMappingURL=migrate-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-cli.d.ts","sourceRoot":"","sources":["../../../src/agent/dreaming/migrate-cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;GAaG"}
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * One-shot memory migration entry (planning-65).
5
+ *
6
+ * Drains an over-budget MEMORY.md: a deterministic terminal sweep (#337
7
+ * compactor) + an LLM route-out pass that moves episodic task-log blocks to
8
+ * `memory/<topic>.md`. Pinned sections are excluded and nothing is deleted
9
+ * (content is relocated, still searchable via `memory_search`).
10
+ *
11
+ * Usage: node migrate-cli.js <workspaceDir> [--apply] [<reviewModel>]
12
+ * (default is a dry-run that writes .dreaming/migration-plan.md)
13
+ *
14
+ * The route-out classifier is a print-only `claude -p` (no tools, untrusted
15
+ * input) — same safety model as the dreaming reviewer.
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ const reviewer_1 = require("../skill-learning/reviewer");
19
+ const migrate_1 = require("./migrate");
20
+ const DEFAULT_MODEL = 'claude-haiku-4-5-20251001';
21
+ async function main() {
22
+ const workspaceDir = process.argv[2];
23
+ if (!workspaceDir) {
24
+ process.stderr.write('usage: migrate-cli <workspaceDir> [--apply] [<reviewModel>]\n');
25
+ process.exit(2);
26
+ return;
27
+ }
28
+ const apply = process.argv.includes('--apply');
29
+ const model = process.argv.find((a, i) => i >= 3 && a !== '--apply') ?? DEFAULT_MODEL;
30
+ const result = await (0, migrate_1.migrateMemory)(workspaceDir, {
31
+ mode: apply ? 'apply' : 'propose',
32
+ routeOut: (0, migrate_1.makeRouteOut)((0, reviewer_1.makeClaudeSpawn)(model)),
33
+ });
34
+ process.stdout.write(JSON.stringify(result, null, 2) + '\n');
35
+ }
36
+ void main()
37
+ .then(() => process.exit(0))
38
+ .catch((err) => {
39
+ process.stderr.write(`[migrate-cli] ${err.message}\n`);
40
+ process.exit(1);
41
+ });
42
+ //# sourceMappingURL=migrate-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-cli.js","sourceRoot":"","sources":["../../../src/agent/dreaming/migrate-cli.ts"],"names":[],"mappings":";;AACA;;;;;;;;;;;;;GAaG;;AAEH,yDAA6D;AAC7D,uCAAwD;AAExD,MAAM,aAAa,GAAG,2BAA2B,CAAC;AAElD,KAAK,UAAU,IAAI;IACjB,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC;QACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,IAAI,aAAa,CAAC;IAEtF,MAAM,MAAM,GAAG,MAAM,IAAA,uBAAa,EAAC,YAAY,EAAE;QAC/C,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;QACjC,QAAQ,EAAE,IAAA,sBAAY,EAAC,IAAA,0BAAe,EAAC,KAAK,CAAC,CAAC;KAC/C,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAC/D,CAAC;AAED,KAAK,IAAI,EAAE;KACR,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KAC3B,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAkB,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;IAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * One-shot memory migration (planning-65) — drain an over-budget MEMORY.md that
3
+ * accumulated task-log before write-routing existed.
4
+ *
5
+ * Two deterministic passes, both non-destructive (content is relocated, never
6
+ * deleted — everything stays searchable via `memory_search`):
7
+ *
8
+ * Pass 1 — terminal sweep: reuse the shipped compactor (#337) to move
9
+ * MERGED/CLOSED/✅-marked blocks to `memory/archive/completed.md`.
10
+ *
11
+ * Pass 2 — episodic route-out: an injected classifier (`routeOut`, in
12
+ * production a print-only reviewer) proposes which REMAINING MEMORY.md blocks
13
+ * are episodic task-log. Each surviving proposal moves the block's text to
14
+ * `memory/<topic>.md` and removes the block from MEMORY.md. Pinned sections
15
+ * (`## User`, `## Feedback`, `## Preferences`) are hard-excluded — never moved.
16
+ *
17
+ * `mode:"propose"` writes a `.dreaming/migration-plan.md` review file and mutates
18
+ * MEMORY.md not at all (beyond Pass 1's deterministic sweep, which is always safe
19
+ * and idempotent). `mode:"apply"` performs the moves (archive-first, then one
20
+ * backed-up atomic rewrite of MEMORY.md).
21
+ */
22
+ import type { ClaudeSpawnFn } from '../skill-learning/reviewer';
23
+ import type { DreamProposal } from './types';
24
+ export type MigrateMode = 'propose' | 'apply';
25
+ export interface MigrateOptions {
26
+ mode: MigrateMode;
27
+ /**
28
+ * Classifier that, given the (post-sweep) MEMORY.md, returns episodic-move
29
+ * proposals: `{op:'add', tier:'episodic', topic, content, target}` where
30
+ * `target` is the exact MEMORY.md block text to remove. Injected so it is
31
+ * fully testable without a live model; production wraps the dream reviewer.
32
+ */
33
+ routeOut?: (memory: string) => Promise<DreamProposal[]> | DreamProposal[];
34
+ /** Episodic archive dir (relative to workspace). Default "memory". */
35
+ episodicArchiveDir?: string;
36
+ /**
37
+ * planning-67: skip Pass 1 (terminal sweep). The nightly dream already runs
38
+ * the compactor before this call, so re-running it would be a redundant no-op;
39
+ * the embedded route-out stage sets this to go straight to Pass 2.
40
+ */
41
+ skipTerminalSweep?: boolean;
42
+ now?: number;
43
+ }
44
+ export interface MigrateResult {
45
+ /** Terminal-state blocks archived by the compactor sweep (Pass 1). */
46
+ terminalArchived: number;
47
+ /** Episodic blocks moved to memory/<topic>.md (Pass 2, apply mode only). */
48
+ episodicMoved: number;
49
+ /** Episodic-move proposals that survived validation (propose + apply). */
50
+ episodicPlanned: number;
51
+ /** Path to the written migration-plan.md (propose mode). */
52
+ planPath?: string;
53
+ memoryCharsBefore: number;
54
+ memoryCharsAfter: number;
55
+ }
56
+ /** Char range [start,end) of each pinned section in `memory` (heading → next h1/h2). */
57
+ export declare function pinnedRanges(memory: string): Array<[number, number]>;
58
+ /** True iff the block at `original.indexOf(target)` sits inside a pinned section. */
59
+ export declare function isTargetPinned(memory: string, target: string): boolean;
60
+ /**
61
+ * Run the migration. Never throws on a per-pass error — returns what it managed
62
+ * to do. In `apply` mode the episodic notes are written BEFORE MEMORY.md is
63
+ * rewritten (archive-first), and MEMORY.md is backed up before the atomic write.
64
+ */
65
+ export declare function migrateMemory(workspaceDir: string, opts: MigrateOptions): Promise<MigrateResult>;
66
+ /**
67
+ * Build the injected route-out classifier that `migrateMemory` consumes, backed by
68
+ * a print-only claude spawn (no tools, untrusted input — same safety model as the
69
+ * dreaming reviewer). Injectable `spawn` keeps it fully testable without a model.
70
+ */
71
+ export declare function makeRouteOut(spawn: ClaudeSpawnFn): (memory: string) => Promise<DreamProposal[]>;
72
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/agent/dreaming/migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAQH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAM7C,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC;AAE9C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,WAAW,CAAC;IAClB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC;IAC1E,sEAAsE;IACtE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,sEAAsE;IACtE,gBAAgB,EAAE,MAAM,CAAC;IACzB,4EAA4E;IAC5E,aAAa,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,eAAe,EAAE,MAAM,CAAC;IACxB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AA2BD,wFAAwF;AACxF,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAmBpE;AAMD,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAKtE;AAyCD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,aAAa,CAAC,CAmGxB;AA+CD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC,CA0C/F"}