@zhixuan92/multi-model-agent-core 4.0.2 → 4.0.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 (192) hide show
  1. package/README.md +18 -6
  2. package/dist/bounded-execution/activity-tracker-types.d.ts +2 -2
  3. package/dist/bounded-execution/activity-tracker-types.d.ts.map +1 -1
  4. package/dist/bounded-execution/activity-tracker.d.ts +3 -3
  5. package/dist/bounded-execution/activity-tracker.d.ts.map +1 -1
  6. package/dist/bounded-execution/activity-tracker.js +15 -15
  7. package/dist/bounded-execution/activity-tracker.js.map +1 -1
  8. package/dist/config/model-profile-registry.d.ts +0 -10
  9. package/dist/config/model-profile-registry.d.ts.map +1 -1
  10. package/dist/config/model-profile-registry.js +126 -8
  11. package/dist/config/model-profile-registry.js.map +1 -1
  12. package/dist/config/schema.d.ts +0 -1
  13. package/dist/config/schema.d.ts.map +1 -1
  14. package/dist/config/schema.js +3 -1
  15. package/dist/config/schema.js.map +1 -1
  16. package/dist/escalation/delegate-with-escalation.d.ts +24 -0
  17. package/dist/escalation/delegate-with-escalation.d.ts.map +1 -1
  18. package/dist/escalation/delegate-with-escalation.js +5 -0
  19. package/dist/escalation/delegate-with-escalation.js.map +1 -1
  20. package/dist/escalation/fallback-types.d.ts +1 -1
  21. package/dist/escalation/fallback-types.d.ts.map +1 -1
  22. package/dist/escalation/fallback.js +2 -2
  23. package/dist/escalation/fallback.js.map +1 -1
  24. package/dist/events/cloud-events.d.ts +3 -4
  25. package/dist/events/cloud-events.d.ts.map +1 -1
  26. package/dist/events/cloud-events.js +0 -1
  27. package/dist/events/cloud-events.js.map +1 -1
  28. package/dist/events/event-builder.d.ts +4 -2
  29. package/dist/events/event-builder.d.ts.map +1 -1
  30. package/dist/events/event-builder.js +47 -45
  31. package/dist/events/event-builder.js.map +1 -1
  32. package/dist/events/observability-events.d.ts +7 -8
  33. package/dist/events/observability-events.d.ts.map +1 -1
  34. package/dist/events/running-headline-sink.d.ts +26 -0
  35. package/dist/events/running-headline-sink.d.ts.map +1 -0
  36. package/dist/events/running-headline-sink.js +116 -0
  37. package/dist/events/running-headline-sink.js.map +1 -0
  38. package/dist/events/telemetry-types.d.ts +20 -20
  39. package/dist/events/telemetry-types.js +8 -8
  40. package/dist/events/telemetry-types.js.map +1 -1
  41. package/dist/events/verbose-log-channel.d.ts +22 -2
  42. package/dist/events/verbose-log-channel.d.ts.map +1 -1
  43. package/dist/events/verbose-log-channel.js +46 -9
  44. package/dist/events/verbose-log-channel.js.map +1 -1
  45. package/dist/index.d.ts +4 -1
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +4 -1
  48. package/dist/index.js.map +1 -1
  49. package/dist/intake/brief-compiler-slots/delegate.d.ts +1 -0
  50. package/dist/intake/brief-compiler-slots/delegate.d.ts.map +1 -1
  51. package/dist/intake/brief-compiler-slots/delegate.js +10 -2
  52. package/dist/intake/brief-compiler-slots/delegate.js.map +1 -1
  53. package/dist/lifecycle/executor-output-types.d.ts +2 -2
  54. package/dist/lifecycle/executor-output-types.d.ts.map +1 -1
  55. package/dist/lifecycle/handlers/baseline-handlers.d.ts.map +1 -1
  56. package/dist/lifecycle/handlers/baseline-handlers.js +48 -1
  57. package/dist/lifecycle/handlers/baseline-handlers.js.map +1 -1
  58. package/dist/lifecycle/handlers/quality-chain-handlers.d.ts.map +1 -1
  59. package/dist/lifecycle/handlers/quality-chain-handlers.js +126 -6
  60. package/dist/lifecycle/handlers/quality-chain-handlers.js.map +1 -1
  61. package/dist/lifecycle/handlers/review-diff-handler.d.ts.map +1 -1
  62. package/dist/lifecycle/handlers/review-diff-handler.js +36 -1
  63. package/dist/lifecycle/handlers/review-diff-handler.js.map +1 -1
  64. package/dist/lifecycle/handlers/run-verify-command-handler.js +11 -2
  65. package/dist/lifecycle/handlers/run-verify-command-handler.js.map +1 -1
  66. package/dist/lifecycle/handlers/spec-chain-handlers.d.ts.map +1 -1
  67. package/dist/lifecycle/handlers/spec-chain-handlers.js +107 -6
  68. package/dist/lifecycle/handlers/spec-chain-handlers.js.map +1 -1
  69. package/dist/lifecycle/handlers/terminal-handlers.d.ts +8 -0
  70. package/dist/lifecycle/handlers/terminal-handlers.d.ts.map +1 -1
  71. package/dist/lifecycle/handlers/terminal-handlers.js +168 -11
  72. package/dist/lifecycle/handlers/terminal-handlers.js.map +1 -1
  73. package/dist/lifecycle/lifecycle-context.d.ts +0 -2
  74. package/dist/lifecycle/lifecycle-context.d.ts.map +1 -1
  75. package/dist/lifecycle/merge-stage-stats.d.ts +31 -0
  76. package/dist/lifecycle/merge-stage-stats.d.ts.map +1 -0
  77. package/dist/lifecycle/merge-stage-stats.js +64 -0
  78. package/dist/lifecycle/merge-stage-stats.js.map +1 -0
  79. package/dist/lifecycle/shared-compute.js +4 -4
  80. package/dist/lifecycle/shared-compute.js.map +1 -1
  81. package/dist/lifecycle/stage-plan-builder.d.ts.map +1 -1
  82. package/dist/lifecycle/stage-plan-builder.js +6 -0
  83. package/dist/lifecycle/stage-plan-builder.js.map +1 -1
  84. package/dist/lifecycle/stage-plan-types.d.ts +3 -0
  85. package/dist/lifecycle/stage-plan-types.d.ts.map +1 -1
  86. package/dist/lifecycle/stage-progression.d.ts +20 -0
  87. package/dist/lifecycle/stage-progression.d.ts.map +1 -0
  88. package/dist/lifecycle/stage-progression.js +165 -0
  89. package/dist/lifecycle/stage-progression.js.map +1 -0
  90. package/dist/lifecycle/task-executor.d.ts.map +1 -1
  91. package/dist/lifecycle/task-executor.js +55 -10
  92. package/dist/lifecycle/task-executor.js.map +1 -1
  93. package/dist/lifecycle/task-runner.d.ts +7 -3
  94. package/dist/lifecycle/task-runner.d.ts.map +1 -1
  95. package/dist/lifecycle/task-runner.js +43 -7
  96. package/dist/lifecycle/task-runner.js.map +1 -1
  97. package/dist/providers/anthropic-messages-adapter.d.ts.map +1 -1
  98. package/dist/providers/anthropic-messages-adapter.js +25 -1
  99. package/dist/providers/anthropic-messages-adapter.js.map +1 -1
  100. package/dist/providers/base/result-builders.d.ts +1 -1
  101. package/dist/providers/base/result-builders.d.ts.map +1 -1
  102. package/dist/providers/base/result-builders.js +4 -4
  103. package/dist/providers/base/result-builders.js.map +1 -1
  104. package/dist/providers/make-runner-shell.d.ts.map +1 -1
  105. package/dist/providers/make-runner-shell.js +6 -5
  106. package/dist/providers/make-runner-shell.js.map +1 -1
  107. package/dist/providers/openai-chat-adapter.d.ts +0 -2
  108. package/dist/providers/openai-chat-adapter.d.ts.map +1 -1
  109. package/dist/providers/openai-chat-adapter.js +2 -3
  110. package/dist/providers/openai-chat-adapter.js.map +1 -1
  111. package/dist/providers/openai-responses-adapter.d.ts +1 -2
  112. package/dist/providers/openai-responses-adapter.d.ts.map +1 -1
  113. package/dist/providers/openai-responses-adapter.js +67 -39
  114. package/dist/providers/openai-responses-adapter.js.map +1 -1
  115. package/dist/providers/provider-factory.d.ts.map +1 -1
  116. package/dist/providers/provider-factory.js +45 -9
  117. package/dist/providers/provider-factory.js.map +1 -1
  118. package/dist/providers/runner-adapter.d.ts +10 -0
  119. package/dist/providers/runner-adapter.d.ts.map +1 -1
  120. package/dist/providers/runner-shell-types.d.ts +33 -0
  121. package/dist/providers/runner-shell-types.d.ts.map +1 -1
  122. package/dist/providers/runner-shell.d.ts +10 -1
  123. package/dist/providers/runner-shell.d.ts.map +1 -1
  124. package/dist/providers/runner-shell.js +251 -18
  125. package/dist/providers/runner-shell.js.map +1 -1
  126. package/dist/providers/runner-types.d.ts +21 -2
  127. package/dist/providers/runner-types.d.ts.map +1 -1
  128. package/dist/providers/tool-name-sets.d.ts +29 -0
  129. package/dist/providers/tool-name-sets.d.ts.map +1 -0
  130. package/dist/providers/tool-name-sets.js +41 -0
  131. package/dist/providers/tool-name-sets.js.map +1 -0
  132. package/dist/reporting/headline-composer.d.ts +12 -0
  133. package/dist/reporting/headline-composer.d.ts.map +1 -1
  134. package/dist/reporting/headline-composer.js.map +1 -1
  135. package/dist/reporting/headline-templates/audit.d.ts.map +1 -1
  136. package/dist/reporting/headline-templates/audit.js +26 -6
  137. package/dist/reporting/headline-templates/audit.js.map +1 -1
  138. package/dist/reporting/headline-templates/delegate.d.ts.map +1 -1
  139. package/dist/reporting/headline-templates/delegate.js +25 -6
  140. package/dist/reporting/headline-templates/delegate.js.map +1 -1
  141. package/dist/reporting/headline-templates/execute-plan.d.ts.map +1 -1
  142. package/dist/reporting/headline-templates/execute-plan.js +4 -1
  143. package/dist/reporting/headline-templates/execute-plan.js.map +1 -1
  144. package/dist/reporting/headline-templates/review.d.ts.map +1 -1
  145. package/dist/reporting/headline-templates/review.js +14 -7
  146. package/dist/reporting/headline-templates/review.js.map +1 -1
  147. package/dist/reporting/headline-text.d.ts +31 -0
  148. package/dist/reporting/headline-text.d.ts.map +1 -0
  149. package/dist/reporting/headline-text.js +42 -0
  150. package/dist/reporting/headline-text.js.map +1 -0
  151. package/dist/reporting/severity.d.ts +40 -0
  152. package/dist/reporting/severity.d.ts.map +1 -0
  153. package/dist/reporting/severity.js +57 -0
  154. package/dist/reporting/severity.js.map +1 -0
  155. package/dist/reporting/structured-report.d.ts +3 -3
  156. package/dist/research/explore-orchestrator.d.ts.map +1 -1
  157. package/dist/research/explore-orchestrator.js +4 -5
  158. package/dist/research/explore-orchestrator.js.map +1 -1
  159. package/dist/review/annotator-engine.d.ts +8 -0
  160. package/dist/review/annotator-engine.d.ts.map +1 -1
  161. package/dist/review/annotator-engine.js +7 -1
  162. package/dist/review/annotator-engine.js.map +1 -1
  163. package/dist/review/review-types.d.ts +6 -2
  164. package/dist/review/review-types.d.ts.map +1 -1
  165. package/dist/review/reviewer-engine.d.ts +11 -0
  166. package/dist/review/reviewer-engine.d.ts.map +1 -1
  167. package/dist/review/reviewer-engine.js +18 -1
  168. package/dist/review/reviewer-engine.js.map +1 -1
  169. package/dist/review/reviewer-output-parser.d.ts.map +1 -1
  170. package/dist/review/reviewer-output-parser.js +27 -5
  171. package/dist/review/reviewer-output-parser.js.map +1 -1
  172. package/dist/stores/batch-registry.d.ts +18 -0
  173. package/dist/stores/batch-registry.d.ts.map +1 -1
  174. package/dist/stores/batch-registry.js +10 -0
  175. package/dist/stores/batch-registry.js.map +1 -1
  176. package/dist/stores/context-block-tool.d.ts +14 -0
  177. package/dist/stores/context-block-tool.d.ts.map +1 -1
  178. package/dist/stores/context-block-tool.js.map +1 -1
  179. package/dist/stores/file-backed-context-block-store.d.ts +63 -0
  180. package/dist/stores/file-backed-context-block-store.d.ts.map +1 -0
  181. package/dist/stores/file-backed-context-block-store.js +293 -0
  182. package/dist/stores/file-backed-context-block-store.js.map +1 -0
  183. package/dist/stores/project-context-registry.d.ts +16 -3
  184. package/dist/stores/project-context-registry.d.ts.map +1 -1
  185. package/dist/stores/project-context-registry.js +9 -2
  186. package/dist/stores/project-context-registry.js.map +1 -1
  187. package/dist/tools/audit/schema.d.ts +2 -2
  188. package/dist/tools/retry/tool-config.js +1 -1
  189. package/dist/tools/retry/tool-config.js.map +1 -1
  190. package/dist/tools/review/schema.d.ts +1 -1
  191. package/dist/types/enums.d.ts +10 -10
  192. package/package.json +5 -1
@@ -0,0 +1,293 @@
1
+ /**
2
+ * FileBackedContextBlockStore — disk-backed implementation of
3
+ * `ContextBlockStore` so context blocks survive daemon restarts.
4
+ *
5
+ * Per the wire-telemetry-gaps plan, Gap 4: round-over-round audit is the
6
+ * documented use case for context blocks; a memory-only store loses
7
+ * everything on `npm run serve` cycles, breaking the recipe. This store
8
+ * persists to disk and reloads lazily on first access.
9
+ *
10
+ * Layout: `<projectCwd>/.mma/context-blocks/<id>.txt` (content) +
11
+ * `<id>.meta.json` ({ createdAt, ttlMs, lengthChars, sha256 }).
12
+ *
13
+ * Operational properties (per round-2 F5/F6/F7/F8/F9):
14
+ * - **Authoritative cwd**: store root is constructed from `projectCwd`
15
+ * supplied at construction time. NOT daemon cwd, NOT task cwd.
16
+ * - **Permissions**: directory `0700`, files `0600`. Audit findings can
17
+ * carry sensitive code excerpts; user-only access by default.
18
+ * - **TTL**: 7 days default. Enforced on `get()` (lazy delete on
19
+ * stale read), at the start of `register()` (opportunistic GC if
20
+ * last sweep was over `gcCheckIntervalMs` ago), and via
21
+ * `runIdleSweep()` for periodic timer-driven sweeps.
22
+ * - **Size caps**: per-block 1 MiB, per-store 100 MiB total — measured
23
+ * via `Buffer.byteLength(content, 'utf8')` so multi-byte content
24
+ * can't sneak past the cap. Oldest-first eviction when total cap
25
+ * is exceeded.
26
+ * - **Atomic writes**: temp-file → fsync → rename. GC treats orphaned
27
+ * pairs (content without metadata or vice versa) as corrupt and
28
+ * deletes both — recovers cleanly from daemon SIGKILL mid-write.
29
+ * - **Gitignore awareness**: on first directory creation, log a
30
+ * stderr breadcrumb suggesting `.mma/` be added to the project's
31
+ * `.gitignore` (we do NOT auto-edit the ignore file — surprising
32
+ * and may not be a git repo).
33
+ *
34
+ * Pinning is a no-op on this implementation — disk persistence is
35
+ * stronger than the in-memory pin contract. The `pin`/`unpin` methods
36
+ * exist on the interface for API symmetry and to satisfy the LRU-skip
37
+ * contract that batch-registry expects, but disk eviction always
38
+ * respects TTL only.
39
+ */
40
+ import { createHash, randomUUID } from 'node:crypto';
41
+ import * as fs from 'node:fs';
42
+ import * as path from 'node:path';
43
+ const DEFAULT_TTL_MS = 7 * 24 * 60 * 60 * 1000;
44
+ const DEFAULT_GC_INTERVAL_MS = 60 * 60 * 1000;
45
+ const DEFAULT_MAX_BLOCK_BYTES = 1 * 1024 * 1024;
46
+ const DEFAULT_MAX_TOTAL_BYTES = 100 * 1024 * 1024;
47
+ export class FileBackedContextBlockStore {
48
+ rootDir;
49
+ _ttlMs;
50
+ gcCheckIntervalMs;
51
+ maxBlockBytes;
52
+ maxTotalBytes;
53
+ lastSweepMs = 0;
54
+ /** Pin counts are kept in memory only — they're an active-batch
55
+ * protection signal, not a persistence concern. Lost on restart;
56
+ * TTL-based GC handles the recovery side. */
57
+ pinCounts = new Map();
58
+ constructor(projectCwd, opts = {}) {
59
+ this.rootDir = path.resolve(projectCwd, '.mma', 'context-blocks');
60
+ this._ttlMs = opts.ttlMs ?? DEFAULT_TTL_MS;
61
+ this.gcCheckIntervalMs = opts.gcCheckIntervalMs ?? DEFAULT_GC_INTERVAL_MS;
62
+ this.maxBlockBytes = opts.maxBlockBytes ?? DEFAULT_MAX_BLOCK_BYTES;
63
+ this.maxTotalBytes = opts.maxTotalBytes ?? DEFAULT_MAX_TOTAL_BYTES;
64
+ this.ensureRoot();
65
+ }
66
+ register(content, opts = {}) {
67
+ const byteSize = Buffer.byteLength(content, 'utf8');
68
+ if (byteSize > this.maxBlockBytes) {
69
+ throw new Error(`Context block exceeds per-block cap of ${this.maxBlockBytes} bytes (got ${byteSize}).`);
70
+ }
71
+ const id = opts.id ?? randomUUID();
72
+ const now = Date.now();
73
+ const sha256 = createHash('sha256').update(content).digest('hex');
74
+ const meta = {
75
+ createdAt: now,
76
+ ttlMs: this._ttlMs,
77
+ lengthChars: content.length,
78
+ sha256,
79
+ };
80
+ // Opportunistic GC + size-cap enforcement before we write.
81
+ if (now - this.lastSweepMs > this.gcCheckIntervalMs) {
82
+ this.runIdleSweep(now, this._ttlMs);
83
+ this.lastSweepMs = now;
84
+ }
85
+ this.evictUntilFits(byteSize);
86
+ this.atomicWrite(this.contentPath(id), content);
87
+ this.atomicWrite(this.metaPath(id), JSON.stringify(meta) + '\n');
88
+ return { id, lengthChars: content.length, sha256 };
89
+ }
90
+ get(id) {
91
+ const meta = this.readMeta(id);
92
+ if (!meta)
93
+ return undefined;
94
+ const now = Date.now();
95
+ if (now - meta.createdAt > meta.ttlMs) {
96
+ // Expired: lazy-delete (matches in-memory store semantics)
97
+ this.deleteFiles(id);
98
+ return undefined;
99
+ }
100
+ try {
101
+ return fs.readFileSync(this.contentPath(id), 'utf8');
102
+ }
103
+ catch {
104
+ // Content missing but meta present — orphan; clean up.
105
+ this.deleteFiles(id);
106
+ return undefined;
107
+ }
108
+ }
109
+ delete(id) {
110
+ const existed = fs.existsSync(this.contentPath(id)) || fs.existsSync(this.metaPath(id));
111
+ this.deleteFiles(id);
112
+ this.pinCounts.delete(id);
113
+ return existed;
114
+ }
115
+ pin(id) {
116
+ this.pinCounts.set(id, (this.pinCounts.get(id) ?? 0) + 1);
117
+ }
118
+ unpin(id) {
119
+ const cur = this.pinCounts.get(id) ?? 0;
120
+ if (cur <= 1)
121
+ this.pinCounts.delete(id);
122
+ else
123
+ this.pinCounts.set(id, cur - 1);
124
+ }
125
+ refcount(id) {
126
+ return this.pinCounts.get(id) ?? 0;
127
+ }
128
+ runIdleSweep(now, idleTtlMs) {
129
+ let evicted = 0;
130
+ for (const id of this.listIds()) {
131
+ if ((this.pinCounts.get(id) ?? 0) > 0)
132
+ continue;
133
+ const meta = this.readMeta(id);
134
+ if (!meta) {
135
+ // Orphan content (no meta) — corrupt half-write recovery
136
+ this.deleteFiles(id);
137
+ evicted++;
138
+ continue;
139
+ }
140
+ // Use the entry's stored ttlMs (may differ from caller's idleTtlMs)
141
+ // OR caller's idleTtlMs, whichever is shorter — caller wins for
142
+ // explicit forced sweeps.
143
+ const effectiveTtl = Math.min(meta.ttlMs, idleTtlMs);
144
+ if (now - meta.createdAt > effectiveTtl) {
145
+ this.deleteFiles(id);
146
+ evicted++;
147
+ }
148
+ }
149
+ return evicted;
150
+ }
151
+ get ttlMs() {
152
+ return this._ttlMs;
153
+ }
154
+ /** Number of entries currently on disk (counted by id, not by file —
155
+ * orphan halves count once). */
156
+ get size() {
157
+ return this.listIds().length;
158
+ }
159
+ /** Delete every block. Used by project-registry on idle eviction. */
160
+ clear() {
161
+ for (const id of this.listIds())
162
+ this.deleteFiles(id);
163
+ this.pinCounts.clear();
164
+ }
165
+ /** Sum of all on-disk content bytes (no caching — fresh read each call).
166
+ * Used by tests + `evictUntilFits`. */
167
+ totalBytesOnDisk() {
168
+ let total = 0;
169
+ for (const id of this.listIds()) {
170
+ try {
171
+ total += fs.statSync(this.contentPath(id)).size;
172
+ }
173
+ catch {
174
+ // missing file — skip
175
+ }
176
+ }
177
+ return total;
178
+ }
179
+ // ── private helpers ────────────────────────────────────────────────
180
+ ensureRoot() {
181
+ const created = !fs.existsSync(this.rootDir);
182
+ fs.mkdirSync(this.rootDir, { recursive: true, mode: 0o700 });
183
+ if (created) {
184
+ // First-creation breadcrumb: nudge the user about gitignore. We
185
+ // intentionally do NOT modify their .gitignore — that would
186
+ // surprise users + may not be a git repo at all.
187
+ process.stderr.write(`[mmagent] created ${this.rootDir} — add ".mma/" to .gitignore (contains worker-output context blocks)\n`);
188
+ }
189
+ }
190
+ contentPath(id) {
191
+ return path.join(this.rootDir, `${id}.txt`);
192
+ }
193
+ metaPath(id) {
194
+ return path.join(this.rootDir, `${id}.meta.json`);
195
+ }
196
+ listIds() {
197
+ let entries;
198
+ try {
199
+ entries = fs.readdirSync(this.rootDir);
200
+ }
201
+ catch {
202
+ return [];
203
+ }
204
+ const ids = new Set();
205
+ for (const name of entries) {
206
+ if (name.endsWith('.meta.json'))
207
+ ids.add(name.slice(0, -'.meta.json'.length));
208
+ else if (name.endsWith('.txt'))
209
+ ids.add(name.slice(0, -'.txt'.length));
210
+ }
211
+ return [...ids];
212
+ }
213
+ readMeta(id) {
214
+ try {
215
+ const raw = fs.readFileSync(this.metaPath(id), 'utf8');
216
+ const parsed = JSON.parse(raw);
217
+ if (typeof parsed.createdAt === 'number'
218
+ && typeof parsed.ttlMs === 'number'
219
+ && typeof parsed.lengthChars === 'number'
220
+ && typeof parsed.sha256 === 'string') {
221
+ return parsed;
222
+ }
223
+ }
224
+ catch {
225
+ // unreadable / corrupt
226
+ }
227
+ return undefined;
228
+ }
229
+ deleteFiles(id) {
230
+ try {
231
+ fs.unlinkSync(this.contentPath(id));
232
+ }
233
+ catch { /* ignore */ }
234
+ try {
235
+ fs.unlinkSync(this.metaPath(id));
236
+ }
237
+ catch { /* ignore */ }
238
+ }
239
+ /**
240
+ * Atomic write: temp-file → fsync → rename. Recovers cleanly from
241
+ * daemon SIGKILL mid-write — readers either see the old content or
242
+ * the new content, never a partial write. The .tmp suffix uses a
243
+ * random nonce so concurrent writers don't collide.
244
+ */
245
+ atomicWrite(targetPath, content) {
246
+ const tmpPath = `${targetPath}.tmp.${process.pid}.${randomUUID()}`;
247
+ const fd = fs.openSync(tmpPath, 'w', 0o600);
248
+ try {
249
+ fs.writeSync(fd, content);
250
+ fs.fsyncSync(fd);
251
+ }
252
+ finally {
253
+ fs.closeSync(fd);
254
+ }
255
+ fs.renameSync(tmpPath, targetPath);
256
+ }
257
+ /**
258
+ * Oldest-first eviction loop until total disk usage + incoming bytes
259
+ * fits under maxTotalBytes. Pinned entries are skipped (matches
260
+ * in-memory store semantics — pinned blocks are held by an active
261
+ * batch and shouldn't be evicted mid-run).
262
+ */
263
+ evictUntilFits(incomingBytes) {
264
+ let total = this.totalBytesOnDisk();
265
+ if (total + incomingBytes <= this.maxTotalBytes)
266
+ return;
267
+ const candidates = [];
268
+ for (const id of this.listIds()) {
269
+ if ((this.pinCounts.get(id) ?? 0) > 0)
270
+ continue;
271
+ const meta = this.readMeta(id);
272
+ if (!meta)
273
+ continue;
274
+ let bytes = 0;
275
+ try {
276
+ bytes = fs.statSync(this.contentPath(id)).size;
277
+ }
278
+ catch {
279
+ continue;
280
+ }
281
+ candidates.push({ id, createdAt: meta.createdAt, bytes });
282
+ }
283
+ // Oldest-first
284
+ candidates.sort((a, b) => a.createdAt - b.createdAt);
285
+ for (const c of candidates) {
286
+ if (total + incomingBytes <= this.maxTotalBytes)
287
+ break;
288
+ this.deleteFiles(c.id);
289
+ total -= c.bytes;
290
+ }
291
+ }
292
+ }
293
+ //# sourceMappingURL=file-backed-context-block-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-backed-context-block-store.js","sourceRoot":"","sources":["../../src/stores/file-backed-context-block-store.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,10 @@
1
- import { InMemoryContextBlockStore } from './context-block-tool.js';
1
+ import { type ContextBlockStore } from './context-block-tool.js';
2
2
  import { BatchCache } from './batch-cache.js';
3
3
  export interface ProjectContext {
4
4
  readonly cwd: string;
5
- readonly contextBlocks: InMemoryContextBlockStore;
5
+ /** 4.0.3+: store is the interface — concrete class chosen at
6
+ * createProjectContext (file-backed by default, in-memory in tests). */
7
+ readonly contextBlocks: ContextBlockStore;
6
8
  /** Per-project terminal-only retention index; authoritative live-batch lookup is via BatchRegistry.countActiveForProject(cwd). */
7
9
  readonly batchCache: BatchCache;
8
10
  readonly createdAt: number;
@@ -13,5 +15,16 @@ export interface ProjectContext {
13
15
  readonly activeSessions: Set<string>;
14
16
  pendingReservations: number;
15
17
  }
16
- export declare function createProjectContext(cwd: string): ProjectContext;
18
+ export interface CreateProjectContextOptions {
19
+ /** Override the context-block store. When omitted, defaults to a
20
+ * FileBackedContextBlockStore rooted at `<cwd>/.mma/context-blocks/`
21
+ * so blocks survive daemon restarts (Gap 4 fix). Tests pass an
22
+ * InMemoryContextBlockStore to avoid filesystem side effects. */
23
+ contextBlockStore?: ContextBlockStore;
24
+ }
25
+ export declare function createProjectContext(cwd: string, opts?: CreateProjectContextOptions): ProjectContext;
26
+ /** Test-only convenience constructor that uses the in-memory store. Call
27
+ * sites that need filesystem isolation (and don't care about persistence)
28
+ * should use this instead of passing the option each time. */
29
+ export declare function createInMemoryProjectContext(cwd: string): ProjectContext;
17
30
  //# sourceMappingURL=project-context-registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-context-registry.d.ts","sourceRoot":"","sources":["../../src/stores/project-context-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,aAAa,EAAE,yBAAyB,CAAC;IAClD,kIAAkI;IAClI,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,oGAAoG;IACpG,cAAc,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,cAAc,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrC,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAYhE"}
1
+ {"version":3,"file":"project-context-registry.d.ts","sourceRoot":"","sources":["../../src/stores/project-context-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5F,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;6EACyE;IACzE,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC;IAC1C,kIAAkI;IAClI,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,oGAAoG;IACpG,cAAc,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,cAAc,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrC,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,2BAA2B;IAC1C;;;sEAGkE;IAClE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,2BAAgC,GACrC,cAAc,CAYhB;AAED;;+DAE+D;AAC/D,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAExE"}
@@ -1,10 +1,11 @@
1
1
  import { InMemoryContextBlockStore } from './context-block-tool.js';
2
+ import { FileBackedContextBlockStore } from './file-backed-context-block-store.js';
2
3
  import { BatchCache } from './batch-cache.js';
3
- export function createProjectContext(cwd) {
4
+ export function createProjectContext(cwd, opts = {}) {
4
5
  const now = Date.now();
5
6
  return {
6
7
  cwd,
7
- contextBlocks: new InMemoryContextBlockStore(),
8
+ contextBlocks: opts.contextBlockStore ?? new FileBackedContextBlockStore(cwd),
8
9
  batchCache: new BatchCache(),
9
10
  createdAt: now,
10
11
  lastActivityAt: now,
@@ -13,4 +14,10 @@ export function createProjectContext(cwd) {
13
14
  pendingReservations: 0,
14
15
  };
15
16
  }
17
+ /** Test-only convenience constructor that uses the in-memory store. Call
18
+ * sites that need filesystem isolation (and don't care about persistence)
19
+ * should use this instead of passing the option each time. */
20
+ export function createInMemoryProjectContext(cwd) {
21
+ return createProjectContext(cwd, { contextBlockStore: new InMemoryContextBlockStore() });
22
+ }
16
23
  //# sourceMappingURL=project-context-registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-context-registry.js","sourceRoot":"","sources":["../../src/stores/project-context-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAiB9C,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,OAAO;QACL,GAAG;QACH,aAAa,EAAE,IAAI,yBAAyB,EAAE;QAC9C,UAAU,EAAE,IAAI,UAAU,EAAE;QAC5B,SAAS,EAAE,GAAG;QACd,cAAc,EAAE,GAAG;QACnB,cAAc,EAAE,IAAI,GAAG,EAAU;QACjC,cAAc,EAAE,CAAC;QACjB,mBAAmB,EAAE,CAAC;KACvB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"project-context-registry.js","sourceRoot":"","sources":["../../src/stores/project-context-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAA0B,MAAM,yBAAyB,CAAC;AAC5F,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AA2B9C,MAAM,UAAU,oBAAoB,CAClC,GAAW,EACX,OAAoC,EAAE;IAEtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,OAAO;QACL,GAAG;QACH,aAAa,EAAE,IAAI,CAAC,iBAAiB,IAAI,IAAI,2BAA2B,CAAC,GAAG,CAAC;QAC7E,UAAU,EAAE,IAAI,UAAU,EAAE;QAC5B,SAAS,EAAE,GAAG;QACd,cAAc,EAAE,GAAG;QACnB,cAAc,EAAE,IAAI,GAAG,EAAU;QACjC,cAAc,EAAE,CAAC;QACjB,mBAAmB,EAAE,CAAC;KACvB,CAAC;AACJ,CAAC;AAED;;+DAE+D;AAC/D,MAAM,UAAU,4BAA4B,CAAC,GAAW;IACtD,OAAO,oBAAoB,CAAC,GAAG,EAAE,EAAE,iBAAiB,EAAE,IAAI,yBAAyB,EAAE,EAAE,CAAC,CAAC;AAC3F,CAAC"}
@@ -2,15 +2,15 @@ import { z } from 'zod';
2
2
  export declare const inputSchema: z.ZodObject<{
3
3
  document: z.ZodOptional<z.ZodString>;
4
4
  auditType: z.ZodUnion<readonly [z.ZodEnum<{
5
- style: "style";
6
5
  security: "security";
7
6
  performance: "performance";
7
+ style: "style";
8
8
  correctness: "correctness";
9
9
  general: "general";
10
10
  }>, z.ZodArray<z.ZodEnum<{
11
- style: "style";
12
11
  security: "security";
13
12
  performance: "performance";
13
+ style: "style";
14
14
  correctness: "correctness";
15
15
  }>>]>;
16
16
  filePaths: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -36,7 +36,7 @@ export const toolConfig = {
36
36
  sandboxPolicy: origTask?.sandboxPolicy ?? defaults?.sandboxPolicy ?? 'cwd-only',
37
37
  cwd: origTask?.cwd ?? ctx.projectContext?.cwd ?? ctx.cwd,
38
38
  contextBlockIds: origTask?.contextBlockIds ?? [],
39
- mainModel: origTask?.mainModel ?? defaults?.mainModel ?? undefined,
39
+ mainModel: origTask?.mainModel,
40
40
  done: origTask?.done,
41
41
  autoCommit: origTask?.autoCommit ?? false,
42
42
  };
@@ -1 +1 @@
1
- {"version":3,"file":"tool-config.js","sourceRoot":"","sources":["../../../src/tools/retry/tool-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool-config.js","sourceRoot":"","sources":["../../../src/tools/retry/tool-config.ts"],"names":[],"mappings":"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"}
@@ -2,9 +2,9 @@ import { z } from 'zod';
2
2
  export declare const inputSchema: z.ZodObject<{
3
3
  code: z.ZodOptional<z.ZodString>;
4
4
  focus: z.ZodOptional<z.ZodArray<z.ZodEnum<{
5
- style: "style";
6
5
  security: "security";
7
6
  performance: "performance";
7
+ style: "style";
8
8
  correctness: "correctness";
9
9
  }>>>;
10
10
  filePaths: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -4,13 +4,13 @@ export declare const TierEnum: z.ZodEnum<{
4
4
  complex: "complex";
5
5
  }>;
6
6
  export declare const RouteEnum: z.ZodEnum<{
7
- review: "review";
8
- retry: "retry";
9
7
  delegate: "delegate";
10
8
  audit: "audit";
9
+ review: "review";
11
10
  verify: "verify";
12
11
  debug: "debug";
13
12
  "execute-plan": "execute-plan";
13
+ retry: "retry";
14
14
  investigate: "investigate";
15
15
  explore: "explore";
16
16
  explore_internal: "explore_internal";
@@ -90,13 +90,6 @@ export declare const InvestigationConfidenceEnum: z.ZodEnum<{
90
90
  }>;
91
91
  export declare const FindingConfidenceSchema: z.ZodNumber;
92
92
  export declare const EventTypeEnum: z.ZodEnum<{
93
- fallback: "fallback";
94
- worker_start: "worker_start";
95
- turn_start: "turn_start";
96
- tool_call: "tool_call";
97
- text_emission: "text_emission";
98
- turn_complete: "turn_complete";
99
- heartbeat: "heartbeat";
100
93
  batch_completed: "batch_completed";
101
94
  batch_failed: "batch_failed";
102
95
  cost_check: "cost_check";
@@ -110,7 +103,9 @@ export declare const EventTypeEnum: z.ZodEnum<{
110
103
  explore_synthesize_start: "explore_synthesize_start";
111
104
  explore_thread_completed: "explore_thread_completed";
112
105
  explore_thread_started: "explore_thread_started";
106
+ fallback: "fallback";
113
107
  fallback_unavailable: "fallback_unavailable";
108
+ heartbeat: "heartbeat";
114
109
  "read_only_review.quality": "read_only_review.quality";
115
110
  "read_only_review.terminal": "read_only_review.terminal";
116
111
  review_decision: "review_decision";
@@ -118,9 +113,14 @@ export declare const EventTypeEnum: z.ZodEnum<{
118
113
  stall_abort: "stall_abort";
119
114
  task_completed: "task_completed";
120
115
  task_started: "task_started";
116
+ text_emission: "text_emission";
121
117
  time_check: "time_check";
118
+ tool_call: "tool_call";
119
+ turn_complete: "turn_complete";
120
+ turn_start: "turn_start";
122
121
  verify_skipped: "verify_skipped";
123
122
  verify_step: "verify_step";
123
+ worker_start: "worker_start";
124
124
  }>;
125
125
  export declare const ReviewEngineTypeEnum: z.ZodEnum<{
126
126
  reviewer: "reviewer";
@@ -146,9 +146,9 @@ export declare const IncompleteReasonEnum: z.ZodEnum<{
146
146
  * Defined here so the closed-enum ratchet covers it before adoption.
147
147
  */
148
148
  export declare const EvidenceKindEnum: z.ZodEnum<{
149
- fix: "fix";
150
149
  reproducer: "reproducer";
151
150
  code_path: "code_path";
151
+ fix: "fix";
152
152
  }>;
153
153
  export declare const DiagLoopEnum: z.ZodEnum<{
154
154
  spec: "spec";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhixuan92/multi-model-agent-core",
3
- "version": "4.0.2",
3
+ "version": "4.0.3",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "Core library for multi-model-agent: provider runners (Claude, Codex, OpenAI-compatible), routing logic, config schema, and tool/sandbox primitives.",
@@ -56,6 +56,10 @@
56
56
  "types": "./dist/lifecycle/task-runner.d.ts",
57
57
  "import": "./dist/lifecycle/task-runner.js"
58
58
  },
59
+ "./lifecycle/stage-progression": {
60
+ "types": "./dist/lifecycle/stage-progression.d.ts",
61
+ "import": "./dist/lifecycle/stage-progression.js"
62
+ },
59
63
  "./events/verbose-line": {
60
64
  "types": "./dist/events/verbose-line.d.ts",
61
65
  "import": "./dist/events/verbose-line.js"