@zhixuan92/multi-model-agent 4.9.0 → 5.0.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 (252) hide show
  1. package/bin/mmagent.mjs +47 -0
  2. package/package.json +19 -57
  3. package/postinstall.mjs +8 -0
  4. package/LICENSE +0 -21
  5. package/README.md +0 -306
  6. package/dist/cli/index.d.ts +0 -62
  7. package/dist/cli/index.d.ts.map +0 -1
  8. package/dist/cli/index.js +0 -345
  9. package/dist/cli/index.js.map +0 -1
  10. package/dist/cli/info.d.ts +0 -22
  11. package/dist/cli/info.d.ts.map +0 -1
  12. package/dist/cli/info.js +0 -100
  13. package/dist/cli/info.js.map +0 -1
  14. package/dist/cli/logs.d.ts +0 -15
  15. package/dist/cli/logs.d.ts.map +0 -1
  16. package/dist/cli/logs.js +0 -102
  17. package/dist/cli/logs.js.map +0 -1
  18. package/dist/cli/print-token.d.ts +0 -18
  19. package/dist/cli/print-token.d.ts.map +0 -1
  20. package/dist/cli/print-token.js +0 -60
  21. package/dist/cli/print-token.js.map +0 -1
  22. package/dist/cli/serve.d.ts +0 -28
  23. package/dist/cli/serve.d.ts.map +0 -1
  24. package/dist/cli/serve.js +0 -405
  25. package/dist/cli/serve.js.map +0 -1
  26. package/dist/cli/status.d.ts +0 -49
  27. package/dist/cli/status.d.ts.map +0 -1
  28. package/dist/cli/status.js +0 -155
  29. package/dist/cli/status.js.map +0 -1
  30. package/dist/cli/sync-skills.d.ts +0 -58
  31. package/dist/cli/sync-skills.d.ts.map +0 -1
  32. package/dist/cli/sync-skills.js +0 -266
  33. package/dist/cli/sync-skills.js.map +0 -1
  34. package/dist/cli/telemetry.d.ts +0 -10
  35. package/dist/cli/telemetry.d.ts.map +0 -1
  36. package/dist/cli/telemetry.js +0 -161
  37. package/dist/cli/telemetry.js.map +0 -1
  38. package/dist/cli/toggle.d.ts +0 -26
  39. package/dist/cli/toggle.d.ts.map +0 -1
  40. package/dist/cli/toggle.js +0 -185
  41. package/dist/cli/toggle.js.map +0 -1
  42. package/dist/http/async-dispatch.d.ts +0 -44
  43. package/dist/http/async-dispatch.d.ts.map +0 -1
  44. package/dist/http/async-dispatch.js +0 -175
  45. package/dist/http/async-dispatch.js.map +0 -1
  46. package/dist/http/auth.d.ts +0 -20
  47. package/dist/http/auth.d.ts.map +0 -1
  48. package/dist/http/auth.js +0 -56
  49. package/dist/http/auth.js.map +0 -1
  50. package/dist/http/canonicalize-file-paths.d.ts +0 -8
  51. package/dist/http/canonicalize-file-paths.d.ts.map +0 -1
  52. package/dist/http/canonicalize-file-paths.js +0 -43
  53. package/dist/http/canonicalize-file-paths.js.map +0 -1
  54. package/dist/http/cwd-validator.d.ts +0 -11
  55. package/dist/http/cwd-validator.d.ts.map +0 -1
  56. package/dist/http/cwd-validator.js +0 -130
  57. package/dist/http/cwd-validator.js.map +0 -1
  58. package/dist/http/errors.d.ts +0 -4
  59. package/dist/http/errors.d.ts.map +0 -1
  60. package/dist/http/errors.js +0 -9
  61. package/dist/http/errors.js.map +0 -1
  62. package/dist/http/execution-context.d.ts +0 -18
  63. package/dist/http/execution-context.d.ts.map +0 -1
  64. package/dist/http/execution-context.js +0 -61
  65. package/dist/http/execution-context.js.map +0 -1
  66. package/dist/http/handler-deps.d.ts +0 -19
  67. package/dist/http/handler-deps.d.ts.map +0 -1
  68. package/dist/http/handler-deps.js +0 -2
  69. package/dist/http/handler-deps.js.map +0 -1
  70. package/dist/http/handlers/control/batch-slice.d.ts +0 -4
  71. package/dist/http/handlers/control/batch-slice.d.ts.map +0 -1
  72. package/dist/http/handlers/control/batch-slice.js +0 -40
  73. package/dist/http/handlers/control/batch-slice.js.map +0 -1
  74. package/dist/http/handlers/control/batch.d.ts +0 -23
  75. package/dist/http/handlers/control/batch.d.ts.map +0 -1
  76. package/dist/http/handlers/control/batch.js +0 -332
  77. package/dist/http/handlers/control/batch.js.map +0 -1
  78. package/dist/http/handlers/control/context-blocks.d.ts +0 -22
  79. package/dist/http/handlers/control/context-blocks.d.ts.map +0 -1
  80. package/dist/http/handlers/control/context-blocks.js +0 -111
  81. package/dist/http/handlers/control/context-blocks.js.map +0 -1
  82. package/dist/http/handlers/introspection/health.d.ts +0 -20
  83. package/dist/http/handlers/introspection/health.d.ts.map +0 -1
  84. package/dist/http/handlers/introspection/health.js +0 -18
  85. package/dist/http/handlers/introspection/health.js.map +0 -1
  86. package/dist/http/handlers/introspection/status.d.ts +0 -26
  87. package/dist/http/handlers/introspection/status.d.ts.map +0 -1
  88. package/dist/http/handlers/introspection/status.js +0 -136
  89. package/dist/http/handlers/introspection/status.js.map +0 -1
  90. package/dist/http/handlers/tools/audit.d.ts +0 -4
  91. package/dist/http/handlers/tools/audit.d.ts.map +0 -1
  92. package/dist/http/handlers/tools/audit.js +0 -43
  93. package/dist/http/handlers/tools/audit.js.map +0 -1
  94. package/dist/http/handlers/tools/debug.d.ts +0 -4
  95. package/dist/http/handlers/tools/debug.d.ts.map +0 -1
  96. package/dist/http/handlers/tools/debug.js +0 -43
  97. package/dist/http/handlers/tools/debug.js.map +0 -1
  98. package/dist/http/handlers/tools/delegate.d.ts +0 -4
  99. package/dist/http/handlers/tools/delegate.d.ts.map +0 -1
  100. package/dist/http/handlers/tools/delegate.js +0 -43
  101. package/dist/http/handlers/tools/delegate.js.map +0 -1
  102. package/dist/http/handlers/tools/execute-plan.d.ts +0 -4
  103. package/dist/http/handlers/tools/execute-plan.d.ts.map +0 -1
  104. package/dist/http/handlers/tools/execute-plan.js +0 -45
  105. package/dist/http/handlers/tools/execute-plan.js.map +0 -1
  106. package/dist/http/handlers/tools/investigate.d.ts +0 -4
  107. package/dist/http/handlers/tools/investigate.d.ts.map +0 -1
  108. package/dist/http/handlers/tools/investigate.js +0 -64
  109. package/dist/http/handlers/tools/investigate.js.map +0 -1
  110. package/dist/http/handlers/tools/journal-recall.d.ts +0 -4
  111. package/dist/http/handlers/tools/journal-recall.d.ts.map +0 -1
  112. package/dist/http/handlers/tools/journal-recall.js +0 -40
  113. package/dist/http/handlers/tools/journal-recall.js.map +0 -1
  114. package/dist/http/handlers/tools/journal-record.d.ts +0 -4
  115. package/dist/http/handlers/tools/journal-record.d.ts.map +0 -1
  116. package/dist/http/handlers/tools/journal-record.js +0 -35
  117. package/dist/http/handlers/tools/journal-record.js.map +0 -1
  118. package/dist/http/handlers/tools/research.d.ts +0 -4
  119. package/dist/http/handlers/tools/research.d.ts.map +0 -1
  120. package/dist/http/handlers/tools/research.js +0 -64
  121. package/dist/http/handlers/tools/research.js.map +0 -1
  122. package/dist/http/handlers/tools/retry.d.ts +0 -4
  123. package/dist/http/handlers/tools/retry.d.ts.map +0 -1
  124. package/dist/http/handlers/tools/retry.js +0 -73
  125. package/dist/http/handlers/tools/retry.js.map +0 -1
  126. package/dist/http/handlers/tools/review.d.ts +0 -4
  127. package/dist/http/handlers/tools/review.d.ts.map +0 -1
  128. package/dist/http/handlers/tools/review.js +0 -43
  129. package/dist/http/handlers/tools/review.js.map +0 -1
  130. package/dist/http/middleware/body-reader.d.ts +0 -16
  131. package/dist/http/middleware/body-reader.d.ts.map +0 -1
  132. package/dist/http/middleware/body-reader.js +0 -44
  133. package/dist/http/middleware/body-reader.js.map +0 -1
  134. package/dist/http/middleware/caller-identity.d.ts +0 -16
  135. package/dist/http/middleware/caller-identity.d.ts.map +0 -1
  136. package/dist/http/middleware/caller-identity.js +0 -16
  137. package/dist/http/middleware/caller-identity.js.map +0 -1
  138. package/dist/http/middleware/decompress.d.ts +0 -14
  139. package/dist/http/middleware/decompress.d.ts.map +0 -1
  140. package/dist/http/middleware/decompress.js +0 -51
  141. package/dist/http/middleware/decompress.js.map +0 -1
  142. package/dist/http/project-registry.d.ts +0 -54
  143. package/dist/http/project-registry.d.ts.map +0 -1
  144. package/dist/http/project-registry.js +0 -130
  145. package/dist/http/project-registry.js.map +0 -1
  146. package/dist/http/request-observability.d.ts +0 -8
  147. package/dist/http/request-observability.d.ts.map +0 -1
  148. package/dist/http/request-observability.js +0 -20
  149. package/dist/http/request-observability.js.map +0 -1
  150. package/dist/http/request-pipeline.d.ts +0 -16
  151. package/dist/http/request-pipeline.d.ts.map +0 -1
  152. package/dist/http/request-pipeline.js +0 -144
  153. package/dist/http/request-pipeline.js.map +0 -1
  154. package/dist/http/server.d.ts +0 -17
  155. package/dist/http/server.d.ts.map +0 -1
  156. package/dist/http/server.js +0 -300
  157. package/dist/http/server.js.map +0 -1
  158. package/dist/http/types.d.ts +0 -20
  159. package/dist/http/types.d.ts.map +0 -1
  160. package/dist/http/types.js +0 -2
  161. package/dist/http/types.js.map +0 -1
  162. package/dist/skill-install/disabled-state.d.ts +0 -35
  163. package/dist/skill-install/disabled-state.d.ts.map +0 -1
  164. package/dist/skill-install/disabled-state.js +0 -96
  165. package/dist/skill-install/disabled-state.js.map +0 -1
  166. package/dist/skill-install/discover.d.ts +0 -29
  167. package/dist/skill-install/discover.d.ts.map +0 -1
  168. package/dist/skill-install/discover.js +0 -104
  169. package/dist/skill-install/discover.js.map +0 -1
  170. package/dist/skill-install/include-utils.d.ts +0 -27
  171. package/dist/skill-install/include-utils.d.ts.map +0 -1
  172. package/dist/skill-install/include-utils.js +0 -90
  173. package/dist/skill-install/include-utils.js.map +0 -1
  174. package/dist/skill-install/manifest.d.ts +0 -82
  175. package/dist/skill-install/manifest.d.ts.map +0 -1
  176. package/dist/skill-install/manifest.js +0 -215
  177. package/dist/skill-install/manifest.js.map +0 -1
  178. package/dist/skill-install/skill-installer-common.d.ts +0 -26
  179. package/dist/skill-install/skill-installer-common.d.ts.map +0 -1
  180. package/dist/skill-install/skill-installer-common.js +0 -139
  181. package/dist/skill-install/skill-installer-common.js.map +0 -1
  182. package/dist/skill-install/skill-installers/claude-code.d.ts +0 -43
  183. package/dist/skill-install/skill-installers/claude-code.d.ts.map +0 -1
  184. package/dist/skill-install/skill-installers/claude-code.js +0 -65
  185. package/dist/skill-install/skill-installers/claude-code.js.map +0 -1
  186. package/dist/skill-install/skill-installers/codex-cli.d.ts +0 -27
  187. package/dist/skill-install/skill-installers/codex-cli.d.ts.map +0 -1
  188. package/dist/skill-install/skill-installers/codex-cli.js +0 -84
  189. package/dist/skill-install/skill-installers/codex-cli.js.map +0 -1
  190. package/dist/skill-install/skill-installers/cursor.d.ts +0 -72
  191. package/dist/skill-install/skill-installers/cursor.d.ts.map +0 -1
  192. package/dist/skill-install/skill-installers/cursor.js +0 -81
  193. package/dist/skill-install/skill-installers/cursor.js.map +0 -1
  194. package/dist/skill-install/skill-installers/gemini-cli.d.ts +0 -50
  195. package/dist/skill-install/skill-installers/gemini-cli.d.ts.map +0 -1
  196. package/dist/skill-install/skill-installers/gemini-cli.js +0 -72
  197. package/dist/skill-install/skill-installers/gemini-cli.js.map +0 -1
  198. package/dist/skill-install/skill-manifest-sync.d.ts +0 -11
  199. package/dist/skill-install/skill-manifest-sync.d.ts.map +0 -1
  200. package/dist/skill-install/skill-manifest-sync.js +0 -65
  201. package/dist/skill-install/skill-manifest-sync.js.map +0 -1
  202. package/dist/skills/_shared/auth.md +0 -41
  203. package/dist/skills/_shared/error-handling.md +0 -31
  204. package/dist/skills/_shared/polling.md +0 -88
  205. package/dist/skills/_shared/response-shape.md +0 -55
  206. package/dist/skills/_shared/review-policy.md +0 -15
  207. package/dist/skills/mma-audit/SKILL.md +0 -270
  208. package/dist/skills/mma-context-blocks/SKILL.md +0 -148
  209. package/dist/skills/mma-debug/SKILL.md +0 -208
  210. package/dist/skills/mma-delegate/SKILL.md +0 -216
  211. package/dist/skills/mma-execute-plan/SKILL.md +0 -214
  212. package/dist/skills/mma-explore/SKILL.md +0 -190
  213. package/dist/skills/mma-investigate/SKILL.md +0 -258
  214. package/dist/skills/mma-journal-recall/SKILL.md +0 -242
  215. package/dist/skills/mma-journal-record/SKILL.md +0 -189
  216. package/dist/skills/mma-research/SKILL.md +0 -223
  217. package/dist/skills/mma-retry/SKILL.md +0 -221
  218. package/dist/skills/mma-review/SKILL.md +0 -209
  219. package/dist/skills/multi-model-agent/SKILL.md +0 -206
  220. package/dist/telemetry/consent.d.ts +0 -4
  221. package/dist/telemetry/consent.d.ts.map +0 -1
  222. package/dist/telemetry/consent.js +0 -40
  223. package/dist/telemetry/consent.js.map +0 -1
  224. package/dist/telemetry/flusher.d.ts +0 -19
  225. package/dist/telemetry/flusher.d.ts.map +0 -1
  226. package/dist/telemetry/flusher.js +0 -277
  227. package/dist/telemetry/flusher.js.map +0 -1
  228. package/dist/telemetry/generation.d.ts +0 -9
  229. package/dist/telemetry/generation.d.ts.map +0 -1
  230. package/dist/telemetry/generation.js +0 -33
  231. package/dist/telemetry/generation.js.map +0 -1
  232. package/dist/telemetry/identity.d.ts +0 -9
  233. package/dist/telemetry/identity.d.ts.map +0 -1
  234. package/dist/telemetry/identity.js +0 -35
  235. package/dist/telemetry/identity.js.map +0 -1
  236. package/dist/telemetry/install-id.d.ts +0 -13
  237. package/dist/telemetry/install-id.d.ts.map +0 -1
  238. package/dist/telemetry/install-id.js +0 -49
  239. package/dist/telemetry/install-id.js.map +0 -1
  240. package/dist/telemetry/install-meta.d.ts +0 -10
  241. package/dist/telemetry/install-meta.d.ts.map +0 -1
  242. package/dist/telemetry/install-meta.js +0 -15
  243. package/dist/telemetry/install-meta.js.map +0 -1
  244. package/dist/telemetry/queue.d.ts +0 -35
  245. package/dist/telemetry/queue.d.ts.map +0 -1
  246. package/dist/telemetry/queue.js +0 -287
  247. package/dist/telemetry/queue.js.map +0 -1
  248. package/dist/telemetry/recorder.d.ts +0 -39
  249. package/dist/telemetry/recorder.d.ts.map +0 -1
  250. package/dist/telemetry/recorder.js +0 -173
  251. package/dist/telemetry/recorder.js.map +0 -1
  252. package/scripts/postinstall.js +0 -36
@@ -1,287 +0,0 @@
1
- import { createHash } from 'node:crypto';
2
- import { writeFile, readFile, rename, stat, open } from 'node:fs/promises';
3
- import { existsSync } from 'node:fs';
4
- import { join } from 'node:path';
5
- import lockfile from 'proper-lockfile';
6
- const QUEUE_FILE = 'telemetry-queue.ndjson';
7
- const MAX_SIZE_BYTES = 10 * 1024 * 1024; // 10 MiB
8
- const MAX_RECORDS = 10_000;
9
- const CAP_TRUNCATE_COUNT = 1_000;
10
- const MAX_BATCH_READ = 500;
11
- const LOCK_OPTIONS = {
12
- retries: { retries: 10, minTimeout: 50, maxTimeout: 150, factor: 1.3 },
13
- };
14
- let capWarned = false;
15
- function resetCapWarning() {
16
- capWarned = false;
17
- }
18
- function deepSort(obj) {
19
- if (Array.isArray(obj))
20
- return obj.map(deepSort);
21
- if (obj !== null && typeof obj === 'object') {
22
- const sorted = {};
23
- for (const key of Object.keys(obj).sort()) {
24
- sorted[key] = deepSort(obj[key]);
25
- }
26
- return sorted;
27
- }
28
- return obj;
29
- }
30
- function canonicalSerialize(record) {
31
- return JSON.stringify(deepSort(record)) + '\n';
32
- }
33
- function hashLine(line) {
34
- return createHash('sha256').update(line).digest('hex');
35
- }
36
- async function ensureFile(p) {
37
- if (!existsSync(p)) {
38
- try {
39
- await writeFile(p, '', { mode: 0o600, flag: 'wx' });
40
- }
41
- catch {
42
- // race: another process created it between our check and write
43
- }
44
- }
45
- }
46
- export class Queue {
47
- #dir;
48
- #queuePath;
49
- #approxCount = 0;
50
- #appendsSinceCapCheck = 0;
51
- constructor(dir) {
52
- this.#dir = dir;
53
- this.#queuePath = join(dir, QUEUE_FILE);
54
- }
55
- get queuePath() {
56
- return this.#queuePath;
57
- }
58
- async append(record) {
59
- // Ensure file exists before locking (proper-lockfile requires it)
60
- await ensureFile(this.#queuePath);
61
- let release = null;
62
- try {
63
- release = await lockfile.lock(this.#queuePath, LOCK_OPTIONS);
64
- }
65
- catch {
66
- return; // lock timeout — silently skip
67
- }
68
- try {
69
- await this.#enforceCap();
70
- const line = canonicalSerialize(record);
71
- const fd = await open(this.#queuePath, 'a', 0o600);
72
- try {
73
- await fd.write(line);
74
- }
75
- finally {
76
- await fd.close();
77
- }
78
- // fsync skipped here — best-effort, adds significant per-append latency.
79
- // OS buffers are flushed on process exit; crash recovery is handled by
80
- // the corruption-rotation path on next readBatch.
81
- }
82
- finally {
83
- if (release)
84
- await release();
85
- }
86
- }
87
- async readBatch(maxRecords = MAX_BATCH_READ) {
88
- const records = [];
89
- const meta = [];
90
- // Don't create if missing; just return empty
91
- if (!existsSync(this.#queuePath))
92
- return { records, meta };
93
- let release = null;
94
- try {
95
- release = await lockfile.lock(this.#queuePath, LOCK_OPTIONS);
96
- }
97
- catch {
98
- return { records, meta };
99
- }
100
- try {
101
- if (!existsSync(this.#queuePath))
102
- return { records, meta };
103
- const content = await readFile(this.#queuePath, 'utf8');
104
- if (!content.trim())
105
- return { records, meta };
106
- const lines = content.split('\n');
107
- let byteOffset = 0;
108
- for (const line of lines) {
109
- if (records.length >= maxRecords)
110
- break;
111
- if (!line.trim()) {
112
- byteOffset += line.length + 1;
113
- continue;
114
- }
115
- const lineBytes = line + '\n';
116
- try {
117
- const record = JSON.parse(line);
118
- records.push(record);
119
- meta.push({
120
- byteOffset,
121
- byteLength: Buffer.byteLength(lineBytes),
122
- sha256: hashLine(lineBytes),
123
- });
124
- }
125
- catch {
126
- // Corrupted line: rotate entire file and stop reading
127
- await this.#rotateCorrupted();
128
- return { records, meta: [] };
129
- }
130
- byteOffset += Buffer.byteLength(lineBytes);
131
- }
132
- }
133
- finally {
134
- if (release)
135
- await release();
136
- }
137
- return { records, meta };
138
- }
139
- /**
140
- * Remove records whose SHA-256 hashes are in the provided set.
141
- * Rebuilds the queue file from scratch — safe for arbitrary (non-contiguous)
142
- * removal. Returns the number of records actually removed.
143
- */
144
- async removeRecords(hashes) {
145
- if (hashes.size === 0)
146
- return 0;
147
- if (!existsSync(this.#queuePath))
148
- return 0;
149
- let release = null;
150
- try {
151
- release = await lockfile.lock(this.#queuePath, LOCK_OPTIONS);
152
- }
153
- catch {
154
- return 0;
155
- }
156
- try {
157
- if (!existsSync(this.#queuePath))
158
- return 0;
159
- const content = await readFile(this.#queuePath, 'utf8');
160
- const lines = content.split('\n');
161
- let removed = 0;
162
- const kept = [];
163
- for (const line of lines) {
164
- if (!line.trim())
165
- continue;
166
- const lineBytes = line + '\n';
167
- if (hashes.has(hashLine(lineBytes))) {
168
- removed++;
169
- }
170
- else {
171
- kept.push(line);
172
- }
173
- }
174
- if (removed === 0)
175
- return 0;
176
- const newContent = kept.join('\n') + (kept.length > 0 ? '\n' : '');
177
- const tmpPath = this.#queuePath + '.rm.' + Date.now();
178
- await writeFile(tmpPath, newContent, { mode: 0o600 });
179
- await rename(tmpPath, this.#queuePath);
180
- return removed;
181
- }
182
- finally {
183
- if (release)
184
- await release();
185
- }
186
- }
187
- async truncate(expectedMeta) {
188
- if (expectedMeta.length === 0)
189
- return;
190
- if (!existsSync(this.#queuePath))
191
- return;
192
- let release = null;
193
- try {
194
- release = await lockfile.lock(this.#queuePath, LOCK_OPTIONS);
195
- }
196
- catch {
197
- return;
198
- }
199
- try {
200
- if (!existsSync(this.#queuePath))
201
- return;
202
- const content = await readFile(this.#queuePath, 'utf8');
203
- const lines = content.split('\n');
204
- // Verify SHA-256 of the first expectedMeta.length records
205
- let byteOffset = 0;
206
- let verified = 0;
207
- for (const line of lines) {
208
- if (verified >= expectedMeta.length)
209
- break;
210
- if (!line.trim()) {
211
- byteOffset += line.length + 1;
212
- continue;
213
- }
214
- const lineBytes = line + '\n';
215
- const actualHash = hashLine(lineBytes);
216
- if (actualHash !== expectedMeta[verified].sha256 ||
217
- byteOffset !== expectedMeta[verified].byteOffset) {
218
- return; // hash mismatch — don't truncate
219
- }
220
- byteOffset += Buffer.byteLength(lineBytes);
221
- verified++;
222
- }
223
- if (verified === 0)
224
- return;
225
- // Atomically truncate: write remainder to temp file + rename
226
- const remainder = content.slice(byteOffset);
227
- const tmpPath = this.#queuePath + '.tmp.' + Date.now();
228
- await writeFile(tmpPath, remainder, { mode: 0o600 });
229
- await rename(tmpPath, this.#queuePath);
230
- }
231
- finally {
232
- if (release)
233
- await release();
234
- }
235
- }
236
- async #enforceCap() {
237
- this.#approxCount++;
238
- this.#appendsSinceCapCheck++;
239
- // Only check periodically to avoid reading the file on every append
240
- if (this.#appendsSinceCapCheck < 100 && this.#approxCount < MAX_RECORDS)
241
- return;
242
- this.#appendsSinceCapCheck = 0;
243
- // Quick size check first
244
- const st = await stat(this.#queuePath);
245
- if (st.size <= MAX_SIZE_BYTES && this.#approxCount <= MAX_RECORDS)
246
- return;
247
- // Full check: read the file to get exact record count
248
- const content = await readFile(this.#queuePath, 'utf8');
249
- const lines = content.split('\n').filter(l => l.trim());
250
- const recordCount = lines.length;
251
- if (st.size <= MAX_SIZE_BYTES && recordCount <= MAX_RECORDS) {
252
- this.#approxCount = recordCount;
253
- return;
254
- }
255
- if (!capWarned) {
256
- console.warn('mma-telemetry: queue capped (10 MiB or 10,000 events), dropping oldest 1,000');
257
- capWarned = true;
258
- }
259
- // Compute byte offset to drop exactly CAP_TRUNCATE_COUNT records
260
- let dropped = 0;
261
- let cutOffset = 0;
262
- for (const line of content.split('\n')) {
263
- if (dropped >= CAP_TRUNCATE_COUNT)
264
- break;
265
- if (!line.trim()) {
266
- cutOffset += line.length + 1;
267
- continue;
268
- }
269
- cutOffset += Buffer.byteLength(line + '\n');
270
- dropped++;
271
- }
272
- const remainder = content.slice(cutOffset);
273
- const tmpPath = this.#queuePath + '.cap.' + Date.now();
274
- await writeFile(tmpPath, remainder, { mode: 0o600 });
275
- await rename(tmpPath, this.#queuePath);
276
- // Reset approximate counter after truncation
277
- this.#approxCount = Math.max(0, recordCount - CAP_TRUNCATE_COUNT);
278
- }
279
- async #rotateCorrupted() {
280
- const ts = Date.now();
281
- const corruptedPath = this.#queuePath.replace('.ndjson', `.corrupted-${ts}.ndjson`);
282
- await rename(this.#queuePath, corruptedPath);
283
- await writeFile(this.#queuePath, '', { mode: 0o600 });
284
- }
285
- }
286
- export { resetCapWarning };
287
- //# sourceMappingURL=queue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/telemetry/queue.ts"],"names":[],"mappings":"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"}
@@ -1,39 +0,0 @@
1
- import type { TaskCompletedEventType } from '@zhixuan92/multi-model-agent-core/events/wire-schema';
2
- type BuildContext = unknown;
3
- export interface ValidationWarningsResult {
4
- warnings: Array<{
5
- rule: string;
6
- path: string;
7
- }>;
8
- baseIssues: Array<{
9
- path: string;
10
- message: string;
11
- }>;
12
- refinedIssues: Array<{
13
- path: string;
14
- message: string;
15
- }>;
16
- }
17
- /**
18
- * Run both base-schema and cross-field validation on a built event
19
- * without dropping it. Returns deduplicated warnings and separate
20
- * issue lists for logging. Deduplication key is `message::path` so
21
- * a base-schema issue that also surfaces in the superRefine'd parse
22
- * is stored once.
23
- */
24
- export declare function collectValidationWarnings(event: TaskCompletedEventType): ValidationWarningsResult;
25
- export interface Recorder {
26
- readonly signal: AbortSignal;
27
- recordTaskCompleted(ctx: BuildContext): void;
28
- enqueue(event: Record<string, unknown>): void;
29
- revokeIdentity(options?: {
30
- deleteInstallId?: boolean;
31
- }): Promise<void>;
32
- }
33
- export declare function getRecorder(): Recorder;
34
- export declare function createRecorder(opts: {
35
- homeDir: string;
36
- mmagentVersion: string;
37
- }): Recorder;
38
- export {};
39
- //# sourceMappingURL=recorder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../../src/telemetry/recorder.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,sBAAsB,EAAuB,MAAM,sDAAsD,CAAC;AAIxH,KAAK,YAAY,GAAG,OAAO,CAAC;AAK5B,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzD;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,sBAAsB,GAC5B,wBAAwB,CAmC1B;AAgBD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,mBAAmB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAAC;IAC7C,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC9C,cAAc,CAAC,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxE;AAID,wBAAgB,WAAW,IAAI,QAAQ,CAKtC;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAAG,QAAQ,CAI1F"}
@@ -1,173 +0,0 @@
1
- import { existsSync, unlinkSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- import { decide } from './consent.js';
4
- import { getOrCreateIdentity } from './identity.js';
5
- import { deleteInstallId } from './install-id.js';
6
- import { buildInstallMeta } from './install-meta.js';
7
- import { Queue } from './queue.js';
8
- import { readGeneration, bumpGeneration } from './generation.js';
9
- import { SCHEMA_VERSION, TaskCompletedEventSchema, ValidatedTaskCompletedEventSchema } from '@zhixuan92/multi-model-agent-core/events/wire-schema';
10
- function buildTaskCompletedEvent(_ctx) {
11
- throw new Error('buildTaskCompletedEvent removed — use TelemetryUploader → toWireRecord path');
12
- }
13
- /**
14
- * Run both base-schema and cross-field validation on a built event
15
- * without dropping it. Returns deduplicated warnings and separate
16
- * issue lists for logging. Deduplication key is `message::path` so
17
- * a base-schema issue that also surfaces in the superRefine'd parse
18
- * is stored once.
19
- */
20
- export function collectValidationWarnings(event) {
21
- const warningsMap = new Map();
22
- const baseIssues = [];
23
- const refinedIssues = [];
24
- const baseParsed = TaskCompletedEventSchema.safeParse(event);
25
- if (!baseParsed.success) {
26
- for (const i of baseParsed.error.issues) {
27
- const path = i.path.join('.');
28
- const key = `${i.message}::${path}`;
29
- warningsMap.set(key, { rule: i.message, path });
30
- baseIssues.push({ path, message: i.message });
31
- }
32
- }
33
- const refined = ValidatedTaskCompletedEventSchema.safeParse(event);
34
- if (!refined.success) {
35
- for (const i of refined.error.issues) {
36
- const path = i.path.join('.');
37
- const key = `${i.message}::${path}`;
38
- warningsMap.set(key, { rule: i.message, path });
39
- refinedIssues.push({ path, message: i.message });
40
- }
41
- }
42
- // R6b: soft warning when cached tokens grossly exceed input tokens per stage.
43
- // Non-nullability is enforced by the schema; treat null as 0 for this check.
44
- for (const r6b of checkR6b(event)) {
45
- const key = `${r6b.rule}::${r6b.path}`;
46
- if (!warningsMap.has(key)) {
47
- warningsMap.set(key, r6b);
48
- }
49
- }
50
- return { warnings: [...warningsMap.values()], baseIssues, refinedIssues };
51
- }
52
- function checkR6b(event) {
53
- const warnings = [];
54
- for (let i = 0; i < event.stages.length; i++) {
55
- const s = event.stages[i];
56
- if (s.inputTokens > 0) {
57
- const cachedSum = (s.cachedReadTokens ?? 0) + (s.cachedNonReadTokens ?? 0);
58
- if (cachedSum > 100 * s.inputTokens) {
59
- warnings.push({ rule: 'R6b', path: `stages[${i}]` });
60
- }
61
- }
62
- }
63
- return warnings;
64
- }
65
- let _recorder = null;
66
- export function getRecorder() {
67
- if (!_recorder) {
68
- throw new Error('Recorder not initialized — call createRecorder first');
69
- }
70
- return _recorder;
71
- }
72
- export function createRecorder(opts) {
73
- const recorder = _buildRecorder(opts);
74
- _recorder = recorder;
75
- return recorder;
76
- }
77
- function _buildRecorder(opts) {
78
- const { homeDir, mmagentVersion } = opts;
79
- const queue = new Queue(homeDir);
80
- const controller = new AbortController();
81
- let _installId = null;
82
- let dropped = 0;
83
- const resolveInstallId = () => {
84
- if (!_installId) {
85
- _installId = getOrCreateIdentity(homeDir).installId;
86
- }
87
- return _installId;
88
- };
89
- const enqueue = (event) => {
90
- try {
91
- const d = decide(homeDir);
92
- if (!d.enabled)
93
- return;
94
- const id = resolveInstallId();
95
- const meta = buildInstallMeta({ installId: id, mmagentVersion });
96
- const gen = readGeneration(homeDir);
97
- queue.append({
98
- schemaVersion: SCHEMA_VERSION,
99
- installId: meta.installId,
100
- mmagentVersion: meta.mmagentVersion,
101
- os: meta.os,
102
- nodeMajor: meta.nodeMajor,
103
- generation: gen,
104
- events: [event],
105
- }).catch(() => {
106
- dropped++;
107
- });
108
- }
109
- catch {
110
- dropped++;
111
- }
112
- };
113
- return {
114
- get signal() {
115
- return controller.signal;
116
- },
117
- enqueue,
118
- recordTaskCompleted(ctx) {
119
- try {
120
- const d = decide(homeDir);
121
- if (!d.enabled)
122
- return;
123
- const event = buildTaskCompletedEvent(ctx);
124
- const ev = event;
125
- const { warnings, baseIssues, refinedIssues } = collectValidationWarnings(ev);
126
- if (baseIssues.length > 0) {
127
- console.warn('mma-telemetry: schema warning (event still emitted)', {
128
- eventId: ev.eventId,
129
- issues: baseIssues,
130
- });
131
- }
132
- if (refinedIssues.length > 0) {
133
- const stageModelsByName = (ev.stages ?? []).reduce((acc, s) => {
134
- if (s.name && s.model)
135
- acc[s.name] = s.model;
136
- return acc;
137
- }, {});
138
- console.warn('mma-telemetry: cross-field warning (event still emitted)', {
139
- eventId: ev.eventId,
140
- implementerModel: ev.implementerModel,
141
- stageModels: stageModelsByName,
142
- totalDurationMs: ev.totalDurationMs,
143
- inputTokens: ev.inputTokens,
144
- outputTokens: ev.outputTokens,
145
- issues: refinedIssues.map((e) => ({
146
- rule: e.message,
147
- path: e.path,
148
- })),
149
- });
150
- }
151
- const enrichedEvent = warnings.length > 0
152
- ? { ...event, validation_warnings: warnings }
153
- : event;
154
- enqueue(enrichedEvent);
155
- }
156
- catch {
157
- dropped++;
158
- }
159
- },
160
- async revokeIdentity(options) {
161
- await bumpGeneration(homeDir);
162
- controller.abort();
163
- const queuePath = join(homeDir, 'telemetry-queue.ndjson');
164
- if (existsSync(queuePath))
165
- unlinkSync(queuePath);
166
- _installId = null;
167
- if (options?.deleteInstallId) {
168
- deleteInstallId(homeDir);
169
- }
170
- },
171
- };
172
- }
173
- //# sourceMappingURL=recorder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recorder.js","sourceRoot":"","sources":["../../src/telemetry/recorder.ts"],"names":[],"mappings":"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"}
@@ -1,36 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * postinstall.js — stable wrapper.
4
- *
5
- * Runs on every `npm install @zhixuan92/multi-model-agent`.
6
- *
7
- * Calls `mmagent sync-skills --if-exists --silent --best-effort` so that
8
- * users who previously installed skills get their Claude Code / Gemini /
9
- * Codex / Cursor copies refreshed to match this release. Exits 0 on every
10
- * failure mode so npm install never breaks the user's environment.
11
- *
12
- * The wrapper is committed (always present) so publishing does not
13
- * accidentally bundle a CLI build step that references a missing file.
14
- */
15
- import { existsSync } from 'node:fs';
16
- import { spawn } from 'node:child_process';
17
- import { dirname, join } from 'node:path';
18
- import { fileURLToPath } from 'node:url';
19
-
20
- const here = dirname(fileURLToPath(import.meta.url));
21
- const cli = join(here, '..', 'dist', 'cli', 'index.js');
22
-
23
- // If dist hasn't been built yet (e.g. during the repo's own install before
24
- // build), do nothing — the published tarball always includes dist.
25
- if (!existsSync(cli)) {
26
- process.exit(0);
27
- }
28
-
29
- const child = spawn(
30
- process.execPath,
31
- [cli, 'sync-skills', '--if-exists', '--silent', '--best-effort'],
32
- { stdio: 'inherit' },
33
- );
34
-
35
- child.on('exit', (code) => process.exit(code ?? 0));
36
- child.on('error', () => process.exit(0));