@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
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env node
2
+ // Top-level bin shim: resolve the installed per-platform binary package and exec it.
3
+ // The platform binary embeds the Bun runtime + app + skills, so the consumer needs
4
+ // neither Node nor Bun to RUN mmagent (Node is only present here because npm uses it).
5
+ import { spawnSync } from 'node:child_process';
6
+ import { createRequire } from 'node:module';
7
+
8
+ const require = createRequire(import.meta.url);
9
+
10
+ // libc detection for linux (glibc vs musl).
11
+ function linuxLibc() {
12
+ try {
13
+ const report = typeof process.report?.getReport === 'function' ? process.report.getReport() : null;
14
+ const glibc = report?.header?.glibcVersionRuntime;
15
+ return glibc ? 'glibc' : 'musl';
16
+ } catch { return 'glibc'; }
17
+ }
18
+
19
+ const { platform, arch } = process;
20
+ const os = platform === 'win32' ? 'windows' : platform; // darwin | linux | windows
21
+ let target = `bun-${os}-${arch}`;
22
+ if (os === 'linux' && linuxLibc() === 'musl') target += '-musl';
23
+
24
+ const pkg = `@zhixuan92/mmagent-${os}-${arch}${os === 'linux' && linuxLibc() === 'musl' ? '-musl' : ''}`;
25
+ const binFile = os === 'windows' ? 'mmagent.exe' : 'mmagent';
26
+
27
+ let binPath;
28
+ try {
29
+ binPath = require.resolve(`${pkg}/${binFile}`);
30
+ } catch {
31
+ process.stderr.write(
32
+ `mmagent: no prebuilt binary for ${target}. Your platform may be unsupported ` +
33
+ `(64-bit darwin/linux/windows only). Install Bun and run from source as a fallback.\n`,
34
+ );
35
+ process.exit(1);
36
+ }
37
+
38
+ const res = spawnSync(binPath, process.argv.slice(2), { stdio: 'inherit' });
39
+ // On Alpine/musl the compiled binary links libstdc++/libgcc (a Bun requirement).
40
+ // Exit 127 with no normal run usually means those are missing on a bare image.
41
+ if (res.status === 127 && os === 'linux') {
42
+ process.stderr.write(
43
+ 'mmagent: the binary failed to start. On Alpine/musl, install the C++ runtime: ' +
44
+ '`apk add --no-cache libstdc++ libgcc` (node:alpine images already include these).\n',
45
+ );
46
+ }
47
+ process.exit(res.status ?? 1);
package/package.json CHANGED
@@ -1,66 +1,28 @@
1
1
  {
2
2
  "name": "@zhixuan92/multi-model-agent",
3
- "version": "4.9.0",
4
- "type": "module",
5
- "license": "MIT",
6
- "description": "Standalone HTTP server for multi-model-agent. Routes tool-invocation work to Claude, Codex, or OpenAI-compatible sub-agents with async-polling REST dispatch and installable skills for Claude Code, Gemini CLI, Codex CLI, and Cursor.",
7
- "author": "Zhang Zhixuan <zhangzhixuan312@gmail.com>",
8
- "keywords": [
9
- "llm",
10
- "claude",
11
- "codex",
12
- "openai",
13
- "agent",
14
- "multi-model",
15
- "delegation",
16
- "http-server"
17
- ],
18
- "repository": {
19
- "type": "git",
20
- "url": "git+https://github.com/zhixuan312/multi-model-agent.git",
21
- "directory": "packages/server"
22
- },
23
- "homepage": "https://github.com/zhixuan312/multi-model-agent#readme",
24
- "bugs": "https://github.com/zhixuan312/multi-model-agent/issues",
25
- "files": [
26
- "dist",
27
- "scripts/postinstall.js"
28
- ],
29
- "main": "dist/http/server.js",
30
- "types": "dist/http/server.d.ts",
3
+ "version": "5.0.0",
31
4
  "bin": {
32
- "mmagent": "dist/cli/index.js",
33
- "multi-model-agent": "dist/cli/index.js"
34
- },
35
- "exports": {
36
- ".": {
37
- "types": "./dist/http/server.d.ts",
38
- "import": "./dist/http/server.js"
39
- },
40
- "./server": {
41
- "types": "./dist/http/server.d.ts",
42
- "import": "./dist/http/server.js"
43
- }
5
+ "mmagent": "bin/mmagent.mjs",
6
+ "multi-model-agent": "bin/mmagent.mjs"
44
7
  },
45
8
  "scripts": {
46
- "prebuild": "rm -rf dist",
47
- "build": "tsc && rm -rf dist/skills && cp -R src/skills dist/skills && node scripts/inject-skill-version.mjs && chmod +x dist/cli/index.js",
48
- "postinstall": "node scripts/postinstall.js",
49
- "prepublishOnly": "npm run build"
9
+ "postinstall": "node postinstall.mjs"
50
10
  },
51
- "engines": {
52
- "node": ">=22.0.0"
53
- },
54
- "dependencies": {
55
- "@asteasolutions/zod-to-openapi": "^8.5.0",
56
- "@zhixuan92/multi-model-agent-core": "^4.9.0",
57
- "gray-matter": "^4.0.3",
58
- "minimist": "^1.2.8",
59
- "proper-lockfile": "^4.1.2",
60
- "zod": "^4.0.0"
11
+ "optionalDependencies": {
12
+ "@zhixuan92/mmagent-darwin-arm64": "5.0.0",
13
+ "@zhixuan92/mmagent-darwin-x64": "5.0.0",
14
+ "@zhixuan92/mmagent-linux-x64": "5.0.0",
15
+ "@zhixuan92/mmagent-linux-arm64": "5.0.0",
16
+ "@zhixuan92/mmagent-linux-x64-musl": "5.0.0",
17
+ "@zhixuan92/mmagent-linux-arm64-musl": "5.0.0",
18
+ "@zhixuan92/mmagent-windows-x64": "5.0.0",
19
+ "@zhixuan92/mmagent-windows-arm64": "5.0.0"
61
20
  },
62
- "devDependencies": {
63
- "@types/minimist": "^1.2.5",
64
- "@types/proper-lockfile": "^4.1.4"
21
+ "files": [
22
+ "bin",
23
+ "postinstall.mjs"
24
+ ],
25
+ "engines": {
26
+ "node": ">=18"
65
27
  }
66
28
  }
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from 'node:child_process';
3
+ import { dirname, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ const shim = join(dirname(fileURLToPath(import.meta.url)), 'bin', 'mmagent.mjs');
6
+ const c = spawn(process.execPath, [shim, 'sync-skills', '--if-exists', '--silent', '--best-effort'], { stdio: 'inherit' });
7
+ c.on('exit', (code) => process.exit(code ?? 0));
8
+ c.on('error', () => process.exit(0));
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Zhang Zhixuan
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
package/README.md DELETED
@@ -1,306 +0,0 @@
1
- # @zhixuan92/multi-model-agent
2
-
3
- [![npm](https://img.shields.io/npm/v/@zhixuan92/multi-model-agent?label=npm)](https://www.npmjs.com/package/@zhixuan92/multi-model-agent)
4
-
5
- Local HTTP daemon that delegates tool-using work to sub-agents on different LLM providers. One process serves Claude Code, Codex CLI, Gemini CLI, and Cursor via installable skills.
6
-
7
- *Renamed from `@zhixuan92/multi-model-agent-mcp` in 3.0.0 — the package no longer uses MCP. See [CHANGELOG](https://github.com/zhixuan312/multi-model-agent/blob/master/CHANGELOG.md).*
8
-
9
- ## Why
10
-
11
- Your flagship model reasoning about architecture is money well spent. That same model grepping files, writing boilerplate, and running tests is waste.
12
-
13
- | Project | MMA — MiniMax-M2.7 | MMA — DeepSeek V4 Pro | Flagship: Claude Opus 4.7 |
14
- |---|---|---|---|
15
- | Feature impl (30 files, ~50 tasks) | **$1.50** · **33× ROI** · ~35 min | **~$2.50** · **20× ROI** · ~15 min | $50 · 1× · *baseline* |
16
- | Full web SPA (59 tasks) | **$5.65** · **12× ROI** · ~50 min | **~$9** · **7.5× ROI** · ~22 min | $68 · 1× · *baseline* |
17
- | Backend microservice (91 tasks) | **$8.21** · **13× ROI** · ~1.5 hrs | **~$14** · **7.5× ROI** · ~40 min | $104 · 1× · *baseline* |
18
-
19
- Plus structural quality: implementation and review run on **different** model families — different blind spots, catches what self-review can't.
20
-
21
- ## Initial setup
22
-
23
- Four steps, in order.
24
-
25
- ### 1. Install CLI + skills
26
-
27
- ```bash
28
- npm i -g @zhixuan92/multi-model-agent # requires Node ≥ 22
29
- mmagent sync-skills # auto-detect all clients (idempotent install + update)
30
- # or pin a specific target:
31
- mmagent sync-skills --target=claude-code # claude-code | gemini-cli | codex-cli | cursor
32
- ```
33
-
34
- | Client | Install location | Loaded |
35
- |---|---|---|
36
- | Claude Code | `~/.claude/skills/` | next session |
37
- | Gemini CLI | Gemini CLI skill directory | next session (requires version with external-skill support) |
38
- | Codex CLI | `~/.codex/skills/` | next session |
39
- | Cursor | Cursor extension manifest | restart Cursor |
40
-
41
- ### 2. Choose your main model — intentionally
42
-
43
- Your **main model** is **the model you'd use without mmagent** — the cost baseline for every per-task headline (`$X actual / $Y saved vs <mainModel> (Z× ROI)`).
44
-
45
- - Heavy Claude Code user → `claude-opus-4-7`
46
- - ChatGPT-led workflow → `gpt-5.5`
47
- - Gemini-led workflow → `gemini-3.1-pro`
48
-
49
- Both `X-MMA-Client` and `X-MMA-Main-Model` are required on tool routes (`400 client_required` / `400 main_model_required` if missing). The 4.3.0 auto-detect chain was reverted in 4.4.0 — the claude-agent-sdk used by claude-tier workers wrote JSONL files into the same `~/.claude/projects/<slug>/` the resolver was reading, so auto-detect could return a worker's model as the calling agent's "main". The calling client is the only reliable source.
50
-
51
- ```bash
52
- export MMAGENT_CLIENT=claude-code # or codex-cli, gemini-cli, cursor
53
- export MMAGENT_MAIN_MODEL=claude-opus-4-7 # whatever your calling agent runs on
54
- ```
55
-
56
- ### 3. Write the config
57
-
58
- Paste this into your shell — it creates `~/.multi-model/config.json` with the minimum-viable starter config (overwrites any existing file at that path):
59
-
60
- ```bash
61
- mkdir -p ~/.multi-model && cat > ~/.multi-model/config.json <<'EOF'
62
- {
63
- "agents": {
64
- "standard": {
65
- "type": "claude-compatible",
66
- "model": "deepseek-v4-pro",
67
- "baseUrl": "https://api.deepseek.com/anthropic",
68
- "apiKeyEnv": "DEEPSEEK_API_KEY"
69
- },
70
- "complex": {
71
- "type": "codex",
72
- "model": "gpt-5.5"
73
- }
74
- }
75
- }
76
- EOF
77
- ```
78
-
79
- That's the whole minimum-viable file. All other knobs (`server.*`, `defaults.timeoutMs`, `defaults.tools`, …) have sane built-in defaults — see [Configuration reference](#configuration-reference).
80
-
81
- ### 4. Start the daemon + verify
82
-
83
- Two ways — pick one:
84
-
85
- **Option A — let your AI client auto-spawn it.** Open your client (Claude Code / Codex CLI / etc.) and call any mma-* skill; the skill's preflight check spawns `mmagent serve` on `127.0.0.1:7337` and reuses it for every subsequent call.
86
-
87
- **Option B — start it manually.** Useful when you want the daemon up before opening a client:
88
-
89
- ```bash
90
- mmagent serve # 127.0.0.1:7337 by default
91
- curl -s http://localhost:7337/health # → {"status":"ok"}
92
- ```
93
-
94
- For an always-on background install (survives reboots): [launchd / systemd templates](./scripts/README.md).
95
-
96
- ## Updating
97
-
98
- ```bash
99
- npm install -g @zhixuan92/multi-model-agent@latest
100
- pkill -f "mmagent serve" # stop the running daemon
101
- mmagent sync-skills # reconcile installed skills with the new bundle
102
- # next AI-client session respawns the daemon via the skill preflight
103
- ```
104
-
105
- A drift warning prints on `mmagent serve` if installed skills are older than the daemon. To rotate the auth token: `rm ~/.multi-model/auth-token && mmagent serve`.
106
-
107
- ## Skills
108
-
109
- Skills are the surface your AI client sees. `mmagent sync-skills` writes them to the client's skill directory and keeps them reconciled across upgrades; the client then picks the right one based on what you ask. You don't call them by hand — you describe the work, the client routes it to the matching skill, the skill calls the matching REST endpoint.
110
-
111
- ### Work-delegation skills
112
-
113
- | Skill | Target endpoint | Use when |
114
- |---|---|---|
115
- | `mma-delegate` | `POST /delegate` | Ad-hoc implementation or research tasks **without** a plan file — run them in parallel on cheap workers. |
116
- | `mma-execute-plan` | `POST /execute-plan` | A plan / spec markdown exists on disk with numbered task headings; implement one or more tasks from it. |
117
- | `mma-investigate` | `POST /investigate` | Answer a question about *this* codebase ("how does X work", "where is Y called") without burning main-context tokens on grep + reads. |
118
- | `mma-explore` | (orchestrator playbook — no dedicated route) | Fans out `mma-investigate` + `mma-research` + `mma-journal-recall` in parallel and synthesises 3–5 distinct directions. Run before `superpowers:brainstorming`. Not for "where is X" questions (use `mma-investigate`). |
119
- | `mma-research` | `POST /research` | External multi-source research with citations — arxiv, semantic_scholar, github_search, brave-with-`site:`-filters — for a focused question. |
120
- | `mma-debug` | `POST /debug` | A test fails, a build breaks, or behavior is unexpected — delegate the reproduce/trace, keep the hypothesis on the main agent. |
121
- | `mma-review` | `POST /review` | Source-code review (pre-merge, post-implementation, security-focused). One worker per file, in parallel. |
122
- | `mma-audit` | `POST /audit` | Audit a spec / plan / design doc / recommendation doc for executability blockers (contradictions, ambiguity, recommendation-coherence gaps). Default is the comprehensive sweep; `security` and `performance` are narrow opt-in lenses. |
123
- | `mma-journal-record` | `POST /journal-record` | Record a durable project learning into the cross-agent journal — what was tried, what happened, the lesson — integrated into a graph of ADR "node" files under `.mmagent/journal/` (create / refine / supersede / merge with typed edges). |
124
- | `mma-journal-recall` | `POST /journal-recall` | Recall relevant prior learnings from the journal for a question or situation — traverses the node graph rather than keyword-filtering. |
125
-
126
- ### Plumbing skills
127
-
128
- | Skill | Target endpoint | Use when |
129
- |---|---|---|
130
- | `mma-context-blocks` | `POST/DELETE /context-blocks` | The same large doc (>~2 KB) will be referenced by 2+ subsequent mma-* calls — register once, pass the ID instead of re-uploading. |
131
- | `mma-retry` | `POST /retry` | A previous batch came back partial — re-run only the failed indices without re-dispatching the whole batch. |
132
-
133
- The `multi-model-agent` skill (no `mma-` prefix) is a top-level overview your client reads first to pick which `mma-*` skill applies.
134
-
135
- ### Two generic usage samples
136
-
137
- **Sample 1 — implement a feature from a plan**
138
-
139
- ```
140
- You: "Execute tasks 3, 4, and 5 from docs/plans/auth-rewrite.md"
141
-
142
- Client picks mma-execute-plan (plan file on disk, multiple independent tasks)
143
-
144
- mmagent dispatches 3 workers in parallel on the standard agent (e.g. MiniMax-M2.7),
145
- each runs cross-agent review on the complex agent, returns a structured report.
146
-
147
- You see one consolidated headline: "$0.04 actual / $1.20 saved vs claude-opus-4-7 (30× ROI)"
148
- ```
149
-
150
- **Sample 2 — debug a failing test (multiple skills chained)**
151
-
152
- ```
153
- You: "tests/auth/session.test.ts is failing intermittently after the token-refresh refactor — figure it out and fix it"
154
-
155
- Step 1 — mma-context-blocks
156
- The failing test output + the refactor diff are ~8 KB and will be referenced by every
157
- downstream call. Register once, get a contextBlockId, reuse it.
158
-
159
- Step 2 — mma-debug
160
- Worker reproduces the failure, traces across session.ts + token-refresh.ts, returns a
161
- root-cause hypothesis: "race between refresh-in-flight and session.invalidate()".
162
- Main agent stays on the hypothesis, decides the fix shape.
163
-
164
- Step 3 — mma-delegate
165
- Dispatch the actual code change as an ad-hoc task (no plan file). Worker writes the
166
- fix, runs the failing test 20× to confirm the race is gone.
167
-
168
- Step 4 — mma-review (with the acceptance checklist in the brief)
169
- Reviewer worker checks the diff against the acceptance criteria: (a) failing
170
- test now passes, (b) no other auth tests regressed, (c) refresh path still
171
- emits the expected telemetry.
172
-
173
- Total cost: ~$0.08. Main-context tokens consumed: just the hypotheses and the verdicts.
174
- ```
175
-
176
- ## Configuration reference
177
-
178
- ### Lookup order
179
-
180
- `--config <path>` → `$MMAGENT_CONFIG` → `<cwd>/.multi-model-agent.json` → `~/.multi-model/config.json`.
181
-
182
- ### Agent types
183
-
184
- | Type | Auth | When to pick |
185
- |---|---|---|
186
- | `claude` | Local Claude Code OAuth (`claude login`) | Stay on Claude end-to-end with subscription auth |
187
- | `codex` | Codex CLI subscription (`codex login`) | OpenAI flagship work without juggling API keys |
188
- | `openai-compatible` | `apiKey` or `apiKeyEnv` | Any OpenAI-compatible endpoint — MiniMax, Groq, Together, local vLLM, plus OpenAI direct |
189
- | `claude-compatible` | `apiKey` or `apiKeyEnv` | Vendors exposing an Anthropic-format endpoint (DeepSeek's `/anthropic`, etc.) — preserves thinking content blocks across multi-turn tool use |
190
-
191
- DeepSeek V4 Pro under `claude-compatible` keeps reasoning ON; under `openai-compatible` it works but auto-disables thinking.
192
-
193
- ### Tuning
194
-
195
- Every `defaults` knob has a built-in. Override only when you need to.
196
-
197
- | Field | Default | What it does |
198
- |---|---|---|
199
- | `defaults.timeoutMs` | `3600000` (60 min) | Hard task-level wall-clock cap (bumped from 30 min in 3.9.0) |
200
- | `defaults.stallTimeoutMs` | `1200000` (20 min) | Aborts in-flight runs idle for this long (bumped from 10 min in 3.9.0) |
201
- | `defaults.tools` | `"full"` | Tool surface: `none` / `readonly` / `no-shell` / `full` |
202
- | `defaults.sandboxPolicy` | `"cwd-only"` | Path-traversal + symlink confinement to the request's `cwd` |
203
-
204
- ### Telemetry
205
-
206
- **Off by default.** Opt in via `mmagent telemetry enable` (or `MMAGENT_TELEMETRY=1`), or set in config:
207
-
208
- ```json
209
- {
210
- "agents": { "...": "..." },
211
- "telemetry": { "enabled": true }
212
- }
213
- ```
214
-
215
- Every upload batch is signed with a per-install Ed25519 key (TOFU; lives at `~/.multi-model/identity.json`); receivers can verify it came from the install whose `installId` it claims. Full disclosure: [PRIVACY.md](https://github.com/zhixuan312/multi-model-agent/blob/master/PRIVACY.md).
216
-
217
- ### Verbose / diagnostics
218
-
219
- ```json
220
- {
221
- "agents": { "...": "..." },
222
- "diagnostics": { "log": true, "verbose": true }
223
- }
224
- ```
225
-
226
- Or per-run via `mmagent serve --verbose --log`. JSONL goes to `~/.multi-model/logs/mmagent-<date>.jsonl`; large request bodies (>16 KB UTF-8) spill to `~/.multi-model/logs/requests/<batchId>.json`.
227
-
228
- > **Note:** verbose logs may include prompts, file paths, and other task content — disable for production servers handling sensitive data.
229
-
230
- ### Auth token
231
-
232
- Generated on first `mmagent serve`. Retrieve with `mmagent print-token`, or set `MMAGENT_AUTH_TOKEN` to override.
233
-
234
- ## REST API
235
-
236
- 15 endpoints. All tool endpoints are async: they return `202 { batchId, statusUrl }` immediately and the executor runs in the background. Poll `GET /batch/:id` for the terminal envelope.
237
-
238
- | Endpoint | Purpose |
239
- |---|---|
240
- | `POST /delegate?cwd=<abs>` | Fan out ad-hoc tasks to sub-agents |
241
- | `POST /audit?cwd=<abs>` | Audit a document (or a code-execution plan via `subtype: 'plan'`) |
242
- | `POST /review?cwd=<abs>` | Review code (pass acceptance checklists in the brief for verification-style checks) |
243
- | `POST /debug?cwd=<abs>` | Debug a failure with a hypothesis |
244
- | `POST /execute-plan?cwd=<abs>` | Implement from a plan file |
245
- | `POST /retry?cwd=<abs>` | Re-run specific tasks from a previous batch |
246
- | `POST /investigate?cwd=<abs>` | Codebase Q&A — structured answer with file:line citations + confidence |
247
- | `POST /research?cwd=<abs>` | External multi-source research — arxiv, semantic_scholar, github_search, brave-with-`site:`-filters — for a focused question |
248
- | `POST /journal-record?cwd=<abs>` | Record one learning into the project's cross-agent journal graph (`.mmagent/journal/`) — create / refine / supersede / merge |
249
- | `POST /journal-recall?cwd=<abs>` | Recall relevant prior learnings from the journal graph for a question or situation |
250
- | `GET /batch/:id[?taskIndex=N]` | Poll a batch: `202 text/plain` (pending) or `200 application/json` (terminal). `?taskIndex=N` slices on complete state |
251
- | `POST /context-blocks?cwd=<abs>` | Register a reusable context block |
252
- | `DELETE /context-blocks/:id?cwd=<abs>` | Delete a context block |
253
- | `GET /health` | Liveness probe (unauthenticated, loopback-only) |
254
- | `GET /status` | Server status (authenticated, loopback-only) |
255
-
256
- All tool endpoints require bearer auth: `Authorization: Bearer <token>`.
257
-
258
- ## Operator commands
259
-
260
- ```bash
261
- mmagent serve [--verbose] [--log] # start daemon
262
- mmagent info [--json] # cliVersion, bind/port, token fingerprint, daemon identity
263
- mmagent status [--json] # health + stats from a running daemon
264
- mmagent logs [--follow] [--batch=<id>] # tail today's diagnostic log
265
- mmagent print-token # print the current auth token
266
- mmagent sync-skills [--target=<client>] [--all-targets] [--dry-run] [--json] # idempotent install + update + reconcile
267
- mmagent disable [--target=<client>] [--all-targets] [--dry-run] [--json] # remove skills + pin off (survives upgrades)
268
- mmagent enable [--target=<client>] [--all-targets] [--dry-run] [--json] # clear the pin + reinstall skills
269
- mmagent telemetry status # show consent state + source
270
- mmagent telemetry enable # opt in
271
- mmagent telemetry disable # opt out + delete local queue
272
- mmagent telemetry reset-id # rotate the local Ed25519 identity
273
- mmagent telemetry dump-queue # print the locally-queued events as JSON
274
- ```
275
-
276
- ## Architecture
277
-
278
- `mmagent serve` runs a loopback HTTP server. Each tool call dispatches to a labor agent (standard or complex), runs a cross-agent review cycle, and returns a structured report. Tasks run in parallel; each has a wall-clock timeout.
279
-
280
- Full design rationale: [DIRECTION.md](https://github.com/zhixuan312/multi-model-agent/blob/master/DIRECTION.md). Layer map and request lifecycle: [docs/ARCHITECTURE.md](https://github.com/zhixuan312/multi-model-agent/blob/master/docs/ARCHITECTURE.md).
281
-
282
- ## Troubleshooting
283
-
284
- | Symptom | Fix |
285
- |---|---|
286
- | Port 7337 already in use | `lsof -nP -i :7337` → kill the stale process |
287
- | Daemon stale after upgrade | `pkill -f "mmagent serve"`; the skill preflight respawns it on next client session |
288
- | Skill version mismatch | `mmagent sync-skills` and restart your client |
289
- | `401 unauthorized` from a skill | `export MMAGENT_AUTH_TOKEN=$(mmagent print-token)` |
290
- | `pkill` reports success but `mmagent info` still shows the old PID | The pattern didn't match — try `kill <pid-from-mmagent-info>` directly |
291
- | TLS `handshake_failure` to a known-good telemetry endpoint | Local DNS cache is stale. `sudo dscacheutil -flushcache && sudo killall -HUP mDNSResponder` (macOS); restart the daemon so its Node process re-resolves |
292
- | Local telemetry queue stops draining | Daemon's flusher is in exponential backoff after a transport failure (capped at 1 hr). Restart the daemon to force an immediate boot-flush |
293
-
294
- ## What's new in 4.9.0
295
-
296
- - **Delegate skill passthrough.** `POST /delegate` tasks accept an optional `skills: string[]`. Each name is resolved from the caller's skill store (by `X-MMA-Client`), staged into an ephemeral per-task directory, and delivered natively — Claude workers via a local SDK plugin, Codex workers via an ephemeral `CODEX_HOME`. Unknown names hard-fail just that task; omitting `skills` is byte-for-byte the previous behavior.
297
-
298
- Full history: [CHANGELOG](https://github.com/zhixuan312/multi-model-agent/blob/master/CHANGELOG.md).
299
-
300
- ## Full documentation
301
-
302
- → **[github.com/zhixuan312/multi-model-agent](https://github.com/zhixuan312/multi-model-agent)**
303
-
304
- ## License
305
-
306
- [MIT](./LICENSE) — Copyright (c) 2026 Zhang Zhixuan
@@ -1,62 +0,0 @@
1
- #!/usr/bin/env node
2
- import { type ParsedArgs } from 'minimist';
3
- import { type MultiModelConfig } from '@zhixuan92/multi-model-agent-core';
4
- /**
5
- * Minimal I/O dependencies — allows tests to intercept stdout/stderr and
6
- * override process.argv / process.exit.
7
- */
8
- export interface CliDeps {
9
- /**
10
- * argv[0..] (not including node path or script path) passed to minimist.
11
- * Defaults to process.argv.slice(2).
12
- */
13
- argv?: () => string[];
14
- /**
15
- * Current working directory. Defaults to process.cwd().
16
- * Used only for resolving the CWD/.multi-model-agent.json discovery path.
17
- */
18
- cwd?: () => string;
19
- /**
20
- * Home directory. Defaults to os.homedir().
21
- * Used only for resolving the ~/.multi-model/config.json discovery path.
22
- */
23
- homeDir?: () => string;
24
- /**
25
- * Environment variable accessor. Defaults to process.env.
26
- */
27
- env?: () => Record<string, string | undefined>;
28
- /** Write to stdout. Defaults to process.stdout.write.bind(process.stdout). */
29
- stdout?: (s: string) => boolean;
30
- /** Write to stderr. Defaults to process.stderr.write.bind(process.stderr). */
31
- stderr?: (s: string) => boolean;
32
- /** Exit the process. Defaults to process.exit. */
33
- exit?: (code: number) => never;
34
- }
35
- /** Parse minimist args from an argv array. */
36
- export declare function parseArgs(argv: string[]): ParsedArgs;
37
- /**
38
- * Resolve the config file path using the discovery order:
39
- * 1. --config <path> (explicit flag)
40
- * 2. $MMAGENT_CONFIG (env var)
41
- * 3. CWD/.multi-model-agent.json
42
- * 4. ~/.multi-model/config.json
43
- *
44
- * Returns the first path that exists, or undefined if none exist.
45
- * Does NOT validate or parse the file — caller uses loadConfigFromFile().
46
- */
47
- export declare function resolveConfigPath(explicit: string | undefined, env: Record<string, string | undefined>, cwd: string, home: string): string | undefined;
48
- /**
49
- * Load config using the discovery order.
50
- * Tries each candidate in priority order and returns the first successfully
51
- * loaded config. Returns an error listing all attempted paths if none are found
52
- * or every found file is unreadable/invalid.
53
- */
54
- export declare function loadConfig(explicitPath: string | undefined, deps: Pick<CliDeps, 'cwd' | 'homeDir' | 'env'>): Promise<MultiModelConfig>;
55
- /**
56
- * Main entry point — exported so it can be unit-tested without subprocess spawning.
57
- *
58
- * @param deps I/O dependencies (defaults to real process globals).
59
- */
60
- export declare function main(deps?: CliDeps): Promise<void>;
61
- export type { MultiModelConfig };
62
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AA0BA,OAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,mCAAmC,CAAC;AAU3C;;;GAGG;AACH,MAAM,WAAW,OAAO;IACtB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;IACtB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC;IACvB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAC/C,8EAA8E;IAC9E,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAChC,8EAA8E;IAC9E,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAChC,kDAAkD;IAClD,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC;CAChC;AAED,8CAA8C;AAC9C,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CASpD;AA4BD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAKpB;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG,SAAS,GAAG,KAAK,CAAC,GAC7C,OAAO,CAAC,gBAAgB,CAAC,CA0B3B;AAuCD;;;;GAIG;AACH,wBAAsB,IAAI,CAAC,IAAI,GAAE,OAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAuK5D;AA+BD,YAAY,EAAE,gBAAgB,EAAE,CAAC"}