@zhixuan92/multi-model-agent 4.9.1 → 5.0.1

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 (251) hide show
  1. package/README.md +4 -3
  2. package/bin/mmagent.mjs +47 -0
  3. package/package.json +24 -43
  4. package/postinstall.mjs +8 -0
  5. package/dist/cli/index.d.ts +0 -62
  6. package/dist/cli/index.d.ts.map +0 -1
  7. package/dist/cli/index.js +0 -345
  8. package/dist/cli/index.js.map +0 -1
  9. package/dist/cli/info.d.ts +0 -22
  10. package/dist/cli/info.d.ts.map +0 -1
  11. package/dist/cli/info.js +0 -100
  12. package/dist/cli/info.js.map +0 -1
  13. package/dist/cli/logs.d.ts +0 -15
  14. package/dist/cli/logs.d.ts.map +0 -1
  15. package/dist/cli/logs.js +0 -102
  16. package/dist/cli/logs.js.map +0 -1
  17. package/dist/cli/print-token.d.ts +0 -18
  18. package/dist/cli/print-token.d.ts.map +0 -1
  19. package/dist/cli/print-token.js +0 -60
  20. package/dist/cli/print-token.js.map +0 -1
  21. package/dist/cli/serve.d.ts +0 -28
  22. package/dist/cli/serve.d.ts.map +0 -1
  23. package/dist/cli/serve.js +0 -405
  24. package/dist/cli/serve.js.map +0 -1
  25. package/dist/cli/status.d.ts +0 -49
  26. package/dist/cli/status.d.ts.map +0 -1
  27. package/dist/cli/status.js +0 -155
  28. package/dist/cli/status.js.map +0 -1
  29. package/dist/cli/sync-skills.d.ts +0 -58
  30. package/dist/cli/sync-skills.d.ts.map +0 -1
  31. package/dist/cli/sync-skills.js +0 -266
  32. package/dist/cli/sync-skills.js.map +0 -1
  33. package/dist/cli/telemetry.d.ts +0 -10
  34. package/dist/cli/telemetry.d.ts.map +0 -1
  35. package/dist/cli/telemetry.js +0 -161
  36. package/dist/cli/telemetry.js.map +0 -1
  37. package/dist/cli/toggle.d.ts +0 -26
  38. package/dist/cli/toggle.d.ts.map +0 -1
  39. package/dist/cli/toggle.js +0 -185
  40. package/dist/cli/toggle.js.map +0 -1
  41. package/dist/http/async-dispatch.d.ts +0 -44
  42. package/dist/http/async-dispatch.d.ts.map +0 -1
  43. package/dist/http/async-dispatch.js +0 -175
  44. package/dist/http/async-dispatch.js.map +0 -1
  45. package/dist/http/auth.d.ts +0 -20
  46. package/dist/http/auth.d.ts.map +0 -1
  47. package/dist/http/auth.js +0 -56
  48. package/dist/http/auth.js.map +0 -1
  49. package/dist/http/canonicalize-file-paths.d.ts +0 -8
  50. package/dist/http/canonicalize-file-paths.d.ts.map +0 -1
  51. package/dist/http/canonicalize-file-paths.js +0 -43
  52. package/dist/http/canonicalize-file-paths.js.map +0 -1
  53. package/dist/http/cwd-validator.d.ts +0 -11
  54. package/dist/http/cwd-validator.d.ts.map +0 -1
  55. package/dist/http/cwd-validator.js +0 -130
  56. package/dist/http/cwd-validator.js.map +0 -1
  57. package/dist/http/errors.d.ts +0 -4
  58. package/dist/http/errors.d.ts.map +0 -1
  59. package/dist/http/errors.js +0 -9
  60. package/dist/http/errors.js.map +0 -1
  61. package/dist/http/execution-context.d.ts +0 -18
  62. package/dist/http/execution-context.d.ts.map +0 -1
  63. package/dist/http/execution-context.js +0 -61
  64. package/dist/http/execution-context.js.map +0 -1
  65. package/dist/http/handler-deps.d.ts +0 -19
  66. package/dist/http/handler-deps.d.ts.map +0 -1
  67. package/dist/http/handler-deps.js +0 -2
  68. package/dist/http/handler-deps.js.map +0 -1
  69. package/dist/http/handlers/control/batch-slice.d.ts +0 -4
  70. package/dist/http/handlers/control/batch-slice.d.ts.map +0 -1
  71. package/dist/http/handlers/control/batch-slice.js +0 -40
  72. package/dist/http/handlers/control/batch-slice.js.map +0 -1
  73. package/dist/http/handlers/control/batch.d.ts +0 -23
  74. package/dist/http/handlers/control/batch.d.ts.map +0 -1
  75. package/dist/http/handlers/control/batch.js +0 -332
  76. package/dist/http/handlers/control/batch.js.map +0 -1
  77. package/dist/http/handlers/control/context-blocks.d.ts +0 -22
  78. package/dist/http/handlers/control/context-blocks.d.ts.map +0 -1
  79. package/dist/http/handlers/control/context-blocks.js +0 -111
  80. package/dist/http/handlers/control/context-blocks.js.map +0 -1
  81. package/dist/http/handlers/introspection/health.d.ts +0 -20
  82. package/dist/http/handlers/introspection/health.d.ts.map +0 -1
  83. package/dist/http/handlers/introspection/health.js +0 -18
  84. package/dist/http/handlers/introspection/health.js.map +0 -1
  85. package/dist/http/handlers/introspection/status.d.ts +0 -26
  86. package/dist/http/handlers/introspection/status.d.ts.map +0 -1
  87. package/dist/http/handlers/introspection/status.js +0 -136
  88. package/dist/http/handlers/introspection/status.js.map +0 -1
  89. package/dist/http/handlers/tools/audit.d.ts +0 -4
  90. package/dist/http/handlers/tools/audit.d.ts.map +0 -1
  91. package/dist/http/handlers/tools/audit.js +0 -43
  92. package/dist/http/handlers/tools/audit.js.map +0 -1
  93. package/dist/http/handlers/tools/debug.d.ts +0 -4
  94. package/dist/http/handlers/tools/debug.d.ts.map +0 -1
  95. package/dist/http/handlers/tools/debug.js +0 -43
  96. package/dist/http/handlers/tools/debug.js.map +0 -1
  97. package/dist/http/handlers/tools/delegate.d.ts +0 -4
  98. package/dist/http/handlers/tools/delegate.d.ts.map +0 -1
  99. package/dist/http/handlers/tools/delegate.js +0 -43
  100. package/dist/http/handlers/tools/delegate.js.map +0 -1
  101. package/dist/http/handlers/tools/execute-plan.d.ts +0 -4
  102. package/dist/http/handlers/tools/execute-plan.d.ts.map +0 -1
  103. package/dist/http/handlers/tools/execute-plan.js +0 -45
  104. package/dist/http/handlers/tools/execute-plan.js.map +0 -1
  105. package/dist/http/handlers/tools/investigate.d.ts +0 -4
  106. package/dist/http/handlers/tools/investigate.d.ts.map +0 -1
  107. package/dist/http/handlers/tools/investigate.js +0 -64
  108. package/dist/http/handlers/tools/investigate.js.map +0 -1
  109. package/dist/http/handlers/tools/journal-recall.d.ts +0 -4
  110. package/dist/http/handlers/tools/journal-recall.d.ts.map +0 -1
  111. package/dist/http/handlers/tools/journal-recall.js +0 -40
  112. package/dist/http/handlers/tools/journal-recall.js.map +0 -1
  113. package/dist/http/handlers/tools/journal-record.d.ts +0 -4
  114. package/dist/http/handlers/tools/journal-record.d.ts.map +0 -1
  115. package/dist/http/handlers/tools/journal-record.js +0 -35
  116. package/dist/http/handlers/tools/journal-record.js.map +0 -1
  117. package/dist/http/handlers/tools/research.d.ts +0 -4
  118. package/dist/http/handlers/tools/research.d.ts.map +0 -1
  119. package/dist/http/handlers/tools/research.js +0 -64
  120. package/dist/http/handlers/tools/research.js.map +0 -1
  121. package/dist/http/handlers/tools/retry.d.ts +0 -4
  122. package/dist/http/handlers/tools/retry.d.ts.map +0 -1
  123. package/dist/http/handlers/tools/retry.js +0 -73
  124. package/dist/http/handlers/tools/retry.js.map +0 -1
  125. package/dist/http/handlers/tools/review.d.ts +0 -4
  126. package/dist/http/handlers/tools/review.d.ts.map +0 -1
  127. package/dist/http/handlers/tools/review.js +0 -43
  128. package/dist/http/handlers/tools/review.js.map +0 -1
  129. package/dist/http/middleware/body-reader.d.ts +0 -16
  130. package/dist/http/middleware/body-reader.d.ts.map +0 -1
  131. package/dist/http/middleware/body-reader.js +0 -44
  132. package/dist/http/middleware/body-reader.js.map +0 -1
  133. package/dist/http/middleware/caller-identity.d.ts +0 -16
  134. package/dist/http/middleware/caller-identity.d.ts.map +0 -1
  135. package/dist/http/middleware/caller-identity.js +0 -16
  136. package/dist/http/middleware/caller-identity.js.map +0 -1
  137. package/dist/http/middleware/decompress.d.ts +0 -14
  138. package/dist/http/middleware/decompress.d.ts.map +0 -1
  139. package/dist/http/middleware/decompress.js +0 -51
  140. package/dist/http/middleware/decompress.js.map +0 -1
  141. package/dist/http/project-registry.d.ts +0 -54
  142. package/dist/http/project-registry.d.ts.map +0 -1
  143. package/dist/http/project-registry.js +0 -130
  144. package/dist/http/project-registry.js.map +0 -1
  145. package/dist/http/request-observability.d.ts +0 -8
  146. package/dist/http/request-observability.d.ts.map +0 -1
  147. package/dist/http/request-observability.js +0 -20
  148. package/dist/http/request-observability.js.map +0 -1
  149. package/dist/http/request-pipeline.d.ts +0 -16
  150. package/dist/http/request-pipeline.d.ts.map +0 -1
  151. package/dist/http/request-pipeline.js +0 -144
  152. package/dist/http/request-pipeline.js.map +0 -1
  153. package/dist/http/server.d.ts +0 -17
  154. package/dist/http/server.d.ts.map +0 -1
  155. package/dist/http/server.js +0 -300
  156. package/dist/http/server.js.map +0 -1
  157. package/dist/http/types.d.ts +0 -20
  158. package/dist/http/types.d.ts.map +0 -1
  159. package/dist/http/types.js +0 -2
  160. package/dist/http/types.js.map +0 -1
  161. package/dist/skill-install/disabled-state.d.ts +0 -35
  162. package/dist/skill-install/disabled-state.d.ts.map +0 -1
  163. package/dist/skill-install/disabled-state.js +0 -96
  164. package/dist/skill-install/disabled-state.js.map +0 -1
  165. package/dist/skill-install/discover.d.ts +0 -29
  166. package/dist/skill-install/discover.d.ts.map +0 -1
  167. package/dist/skill-install/discover.js +0 -104
  168. package/dist/skill-install/discover.js.map +0 -1
  169. package/dist/skill-install/include-utils.d.ts +0 -27
  170. package/dist/skill-install/include-utils.d.ts.map +0 -1
  171. package/dist/skill-install/include-utils.js +0 -90
  172. package/dist/skill-install/include-utils.js.map +0 -1
  173. package/dist/skill-install/manifest.d.ts +0 -82
  174. package/dist/skill-install/manifest.d.ts.map +0 -1
  175. package/dist/skill-install/manifest.js +0 -215
  176. package/dist/skill-install/manifest.js.map +0 -1
  177. package/dist/skill-install/skill-installer-common.d.ts +0 -26
  178. package/dist/skill-install/skill-installer-common.d.ts.map +0 -1
  179. package/dist/skill-install/skill-installer-common.js +0 -139
  180. package/dist/skill-install/skill-installer-common.js.map +0 -1
  181. package/dist/skill-install/skill-installers/claude-code.d.ts +0 -43
  182. package/dist/skill-install/skill-installers/claude-code.d.ts.map +0 -1
  183. package/dist/skill-install/skill-installers/claude-code.js +0 -65
  184. package/dist/skill-install/skill-installers/claude-code.js.map +0 -1
  185. package/dist/skill-install/skill-installers/codex-cli.d.ts +0 -27
  186. package/dist/skill-install/skill-installers/codex-cli.d.ts.map +0 -1
  187. package/dist/skill-install/skill-installers/codex-cli.js +0 -84
  188. package/dist/skill-install/skill-installers/codex-cli.js.map +0 -1
  189. package/dist/skill-install/skill-installers/cursor.d.ts +0 -72
  190. package/dist/skill-install/skill-installers/cursor.d.ts.map +0 -1
  191. package/dist/skill-install/skill-installers/cursor.js +0 -81
  192. package/dist/skill-install/skill-installers/cursor.js.map +0 -1
  193. package/dist/skill-install/skill-installers/gemini-cli.d.ts +0 -50
  194. package/dist/skill-install/skill-installers/gemini-cli.d.ts.map +0 -1
  195. package/dist/skill-install/skill-installers/gemini-cli.js +0 -72
  196. package/dist/skill-install/skill-installers/gemini-cli.js.map +0 -1
  197. package/dist/skill-install/skill-manifest-sync.d.ts +0 -11
  198. package/dist/skill-install/skill-manifest-sync.d.ts.map +0 -1
  199. package/dist/skill-install/skill-manifest-sync.js +0 -65
  200. package/dist/skill-install/skill-manifest-sync.js.map +0 -1
  201. package/dist/skills/_shared/auth.md +0 -41
  202. package/dist/skills/_shared/error-handling.md +0 -31
  203. package/dist/skills/_shared/polling.md +0 -88
  204. package/dist/skills/_shared/response-shape.md +0 -55
  205. package/dist/skills/_shared/review-policy.md +0 -15
  206. package/dist/skills/mma-audit/SKILL.md +0 -270
  207. package/dist/skills/mma-context-blocks/SKILL.md +0 -148
  208. package/dist/skills/mma-debug/SKILL.md +0 -208
  209. package/dist/skills/mma-delegate/SKILL.md +0 -216
  210. package/dist/skills/mma-execute-plan/SKILL.md +0 -214
  211. package/dist/skills/mma-explore/SKILL.md +0 -190
  212. package/dist/skills/mma-investigate/SKILL.md +0 -258
  213. package/dist/skills/mma-journal-recall/SKILL.md +0 -242
  214. package/dist/skills/mma-journal-record/SKILL.md +0 -189
  215. package/dist/skills/mma-research/SKILL.md +0 -223
  216. package/dist/skills/mma-retry/SKILL.md +0 -221
  217. package/dist/skills/mma-review/SKILL.md +0 -209
  218. package/dist/skills/multi-model-agent/SKILL.md +0 -206
  219. package/dist/telemetry/consent.d.ts +0 -4
  220. package/dist/telemetry/consent.d.ts.map +0 -1
  221. package/dist/telemetry/consent.js +0 -40
  222. package/dist/telemetry/consent.js.map +0 -1
  223. package/dist/telemetry/flusher.d.ts +0 -19
  224. package/dist/telemetry/flusher.d.ts.map +0 -1
  225. package/dist/telemetry/flusher.js +0 -277
  226. package/dist/telemetry/flusher.js.map +0 -1
  227. package/dist/telemetry/generation.d.ts +0 -9
  228. package/dist/telemetry/generation.d.ts.map +0 -1
  229. package/dist/telemetry/generation.js +0 -33
  230. package/dist/telemetry/generation.js.map +0 -1
  231. package/dist/telemetry/identity.d.ts +0 -9
  232. package/dist/telemetry/identity.d.ts.map +0 -1
  233. package/dist/telemetry/identity.js +0 -35
  234. package/dist/telemetry/identity.js.map +0 -1
  235. package/dist/telemetry/install-id.d.ts +0 -13
  236. package/dist/telemetry/install-id.d.ts.map +0 -1
  237. package/dist/telemetry/install-id.js +0 -49
  238. package/dist/telemetry/install-id.js.map +0 -1
  239. package/dist/telemetry/install-meta.d.ts +0 -10
  240. package/dist/telemetry/install-meta.d.ts.map +0 -1
  241. package/dist/telemetry/install-meta.js +0 -15
  242. package/dist/telemetry/install-meta.js.map +0 -1
  243. package/dist/telemetry/queue.d.ts +0 -35
  244. package/dist/telemetry/queue.d.ts.map +0 -1
  245. package/dist/telemetry/queue.js +0 -287
  246. package/dist/telemetry/queue.js.map +0 -1
  247. package/dist/telemetry/recorder.d.ts +0 -39
  248. package/dist/telemetry/recorder.d.ts.map +0 -1
  249. package/dist/telemetry/recorder.js +0 -173
  250. package/dist/telemetry/recorder.js.map +0 -1
  251. package/scripts/postinstall.js +0 -36
package/README.md CHANGED
@@ -25,7 +25,7 @@ Four steps, in order.
25
25
  ### 1. Install CLI + skills
26
26
 
27
27
  ```bash
28
- npm i -g @zhixuan92/multi-model-agent # requires Node ≥ 22
28
+ npm i -g @zhixuan92/multi-model-agent # standalone binary (Bun embedded) — npm uses Node ≥18 only to install; the daemon needs no Node/Bun
29
29
  mmagent sync-skills # auto-detect all clients (idempotent install + update)
30
30
  # or pin a specific target:
31
31
  mmagent sync-skills --target=claude-code # claude-code | gemini-cli | codex-cli | cursor
@@ -233,7 +233,7 @@ Generated on first `mmagent serve`. Retrieve with `mmagent print-token`, or set
233
233
 
234
234
  ## REST API
235
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.
236
+ 16 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
237
 
238
238
  | Endpoint | Purpose |
239
239
  |---|---|
@@ -250,6 +250,7 @@ Generated on first `mmagent serve`. Retrieve with `mmagent print-token`, or set
250
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
251
  | `POST /context-blocks?cwd=<abs>` | Register a reusable context block |
252
252
  | `DELETE /context-blocks/:id?cwd=<abs>` | Delete a context block |
253
+ | `POST /control/batch-slice` | Slice an in-flight batch — return a subset of its tasks by index |
253
254
  | `GET /health` | Liveness probe (unauthenticated, loopback-only) |
254
255
  | `GET /status` | Server status (authenticated, loopback-only) |
255
256
 
@@ -288,7 +289,7 @@ Full design rationale: [DIRECTION.md](https://github.com/zhixuan312/multi-model-
288
289
  | Skill version mismatch | `mmagent sync-skills` and restart your client |
289
290
  | `401 unauthorized` from a skill | `export MMAGENT_AUTH_TOKEN=$(mmagent print-token)` |
290
291
  | `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
+ | 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 process re-resolves |
292
293
  | 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
 
294
295
  ## What's new in 4.9.0
@@ -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,10 +1,7 @@
1
1
  {
2
2
  "name": "@zhixuan92/multi-model-agent",
3
- "version": "4.9.1",
4
- "type": "module",
5
- "license": "MIT",
3
+ "version": "5.0.1",
6
4
  "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
5
  "keywords": [
9
6
  "llm",
10
7
  "claude",
@@ -15,52 +12,36 @@
15
12
  "delegation",
16
13
  "http-server"
17
14
  ],
15
+ "license": "MIT",
16
+ "homepage": "https://github.com/zhixuan312/multi-model-agent#readme",
18
17
  "repository": {
19
18
  "type": "git",
20
- "url": "git+https://github.com/zhixuan312/multi-model-agent.git",
21
- "directory": "packages/server"
19
+ "url": "git+https://github.com/zhixuan312/multi-model-agent.git"
22
20
  },
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",
31
21
  "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
- }
22
+ "mmagent": "bin/mmagent.mjs",
23
+ "multi-model-agent": "bin/mmagent.mjs"
44
24
  },
45
25
  "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"
50
- },
51
- "engines": {
52
- "node": ">=22.0.0"
26
+ "postinstall": "node postinstall.mjs"
53
27
  },
54
- "dependencies": {
55
- "@asteasolutions/zod-to-openapi": "^8.5.0",
56
- "@zhixuan92/multi-model-agent-core": "^4.9.1",
57
- "gray-matter": "^4.0.3",
58
- "minimist": "^1.2.8",
59
- "proper-lockfile": "^4.1.2",
60
- "zod": "^4.0.0"
28
+ "optionalDependencies": {
29
+ "@zhixuan92/mmagent-darwin-arm64": "5.0.1",
30
+ "@zhixuan92/mmagent-darwin-x64": "5.0.1",
31
+ "@zhixuan92/mmagent-linux-x64": "5.0.1",
32
+ "@zhixuan92/mmagent-linux-arm64": "5.0.1",
33
+ "@zhixuan92/mmagent-linux-x64-musl": "5.0.1",
34
+ "@zhixuan92/mmagent-linux-arm64-musl": "5.0.1",
35
+ "@zhixuan92/mmagent-windows-x64": "5.0.1",
36
+ "@zhixuan92/mmagent-windows-arm64": "5.0.1"
61
37
  },
62
- "devDependencies": {
63
- "@types/minimist": "^1.2.5",
64
- "@types/proper-lockfile": "^4.1.4"
38
+ "files": [
39
+ "bin",
40
+ "postinstall.mjs",
41
+ "README.md",
42
+ "LICENSE"
43
+ ],
44
+ "engines": {
45
+ "node": ">=18"
65
46
  }
66
47
  }
@@ -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));
@@ -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"}
package/dist/cli/index.js DELETED
@@ -1,345 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * CLI entry point for `mmagent` / `multi-model-agent`.
4
- *
5
- * Usage:
6
- * mmagent serve [--config <path>]
7
- * mmagent --help
8
- * mmagent --version
9
- *
10
- * Config discovery order (highest priority → lowest):
11
- * 1. --config <path> (explicit flag)
12
- * 2. $MMAGENT_CONFIG env var
13
- * 3. CWD/.multi-model-agent.json
14
- * 4. ~/.multi-model/config.json
15
- *
16
- * All side effects (process.exit, stdout/stderr writes) are contained in the
17
- * bootstrap at the bottom of this file. The internal `main()` function is
18
- * exported so it can be unit-tested without spawning subprocesses.
19
- *
20
- * Signal lifecycle is owned by `serve.ts` — this module delegates to
21
- * `startServe()` which registers SIGTERM/SIGINT handlers and manages process.exit.
22
- */
23
- import * as path from 'node:path';
24
- import * as fs from 'node:fs';
25
- import * as os from 'node:os';
26
- import { fileURLToPath } from 'node:url';
27
- import minimist from 'minimist';
28
- import { loadConfigFromFile, } from '@zhixuan92/multi-model-agent-core';
29
- import { startServe } from './serve.js';
30
- import { printToken } from './print-token.js';
31
- import { runStatus, buildServerUrl } from './status.js';
32
- import { runInfo } from './info.js';
33
- import { runSyncSkills } from './sync-skills.js';
34
- import { runDisable, runEnable } from './toggle.js';
35
- import { runLogs } from './logs.js';
36
- import { runTelemetry } from './telemetry.js';
37
- /** Parse minimist args from an argv array. */
38
- export function parseArgs(argv) {
39
- return minimist(argv, {
40
- string: ['config', 'batch'],
41
- boolean: ['help', 'version', 'json', 'dry-run', 'if-exists', 'silent', 'best-effort', 'follow', 'log'],
42
- alias: { config: 'c', help: 'h', version: 'v', json: 'j' },
43
- // Note: stopEarly is NOT set. With stopEarly:true, options after the first
44
- // positional argument (the subcommand) would be silently dropped. E.g.
45
- // `mmagent serve --config ./config.json` would lose --config.
46
- });
47
- }
48
- /**
49
- * Build the ordered list of config-file candidates from discovery sources.
50
- * Returns an array of resolved paths; callers filter for existence and
51
- * iterate in priority order. This single builder ensures that
52
- * resolveConfigPath() and loadConfig() cannot drift apart.
53
- */
54
- function buildCandidatePaths(explicit, env, cwd, home) {
55
- const paths = [];
56
- if (explicit)
57
- paths.push(explicit);
58
- const envVal = (env['MMAGENT_CONFIG'] ?? '').trim();
59
- if (envVal)
60
- paths.push(envVal);
61
- paths.push(path.join(cwd, '.multi-model-agent.json'));
62
- paths.push(path.join(home, '.multi-model', 'config.json'));
63
- return paths;
64
- }
65
- /**
66
- * Resolve the config file path using the discovery order:
67
- * 1. --config <path> (explicit flag)
68
- * 2. $MMAGENT_CONFIG (env var)
69
- * 3. CWD/.multi-model-agent.json
70
- * 4. ~/.multi-model/config.json
71
- *
72
- * Returns the first path that exists, or undefined if none exist.
73
- * Does NOT validate or parse the file — caller uses loadConfigFromFile().
74
- */
75
- export function resolveConfigPath(explicit, env, cwd, home) {
76
- for (const p of buildCandidatePaths(explicit, env, cwd, home)) {
77
- if (p && fs.existsSync(p))
78
- return p;
79
- }
80
- return undefined;
81
- }
82
- /**
83
- * Load config using the discovery order.
84
- * Tries each candidate in priority order and returns the first successfully
85
- * loaded config. Returns an error listing all attempted paths if none are found
86
- * or every found file is unreadable/invalid.
87
- */
88
- export async function loadConfig(explicitPath, deps) {
89
- const cwd = deps.cwd?.() ?? process.cwd();
90
- const home = deps.homeDir?.() ?? os.homedir();
91
- const env = deps.env?.() ?? process.env;
92
- const attempted = [];
93
- for (const p of buildCandidatePaths(explicitPath, env, cwd, home)) {
94
- if (!p) {
95
- attempted.push('<source: not set>');
96
- continue;
97
- }
98
- attempted.push(p);
99
- if (!fs.existsSync(p))
100
- continue;
101
- try {
102
- return await loadConfigFromFile(p);
103
- }
104
- catch (err) {
105
- const msg = err instanceof Error ? err.message : String(err);
106
- throw new Error(`Config error (${p}): ${msg}`);
107
- }
108
- }
109
- throw new Error(`No config file found. Tried:\n${attempted.join('\n')}\n` +
110
- `Set one via --config, $MMAGENT_CONFIG, or place it at a default location above.`);
111
- }
112
- const HELP_TEXT = `\
113
- mmagent — multi-model-agent HTTP server
114
-
115
- Usage:
116
- mmagent [command] [options]
117
-
118
- Commands:
119
- serve Start the HTTP server (default)
120
- print-token Print the bearer auth token to stdout
121
- info Print config + daemon identity (works offline)
122
- status Show server status (requires a running server)
123
- sync-skills Install + update + reconcile all shipped skills (single upsert command, replaces 4.0.x install-skill / update-skills)
124
- disable Remove MMA skills from clients and pin them off (survives npm upgrades)
125
- enable Restore MMA skills (clears a prior \`disable\`, then re-syncs)
126
- logs Tail the diagnostic log (use --follow / --batch=<id>)
127
- telemetry Manage telemetry consent (status|enable|disable|reset-id|dump-queue)
128
-
129
- Global options:
130
- --config, -c <path> Path to config file
131
- --help, -h Show this help
132
- --version, -v Show version
133
- `;
134
- /**
135
- * Read the server package version from package.json, walking up from this file.
136
- */
137
- function readServerVersion() {
138
- try {
139
- const thisDir = path.dirname(fileURLToPath(import.meta.url));
140
- const pkgPath = path.join(thisDir, '..', '..', 'package.json');
141
- const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
142
- return pkg.version ?? '0.0.0';
143
- }
144
- catch {
145
- return '0.0.0';
146
- }
147
- }
148
- /**
149
- * Main entry point — exported so it can be unit-tested without subprocess spawning.
150
- *
151
- * @param deps I/O dependencies (defaults to real process globals).
152
- */
153
- export async function main(deps = {}) {
154
- const argv = deps.argv?.() ?? process.argv.slice(2);
155
- const stdout = deps.stdout ?? process.stdout.write.bind(process.stdout);
156
- const stderr = deps.stderr ?? process.stderr.write.bind(process.stderr);
157
- const exit = deps.exit ?? process.exit.bind(process);
158
- const opts = parseArgs(argv);
159
- const positional = opts._;
160
- const subcommand = positional[0] ?? 'serve';
161
- const configArg = typeof opts['config'] === 'string' ? opts['config'] : undefined;
162
- if (opts['help']) {
163
- stdout(HELP_TEXT);
164
- return;
165
- }
166
- if (opts['version']) {
167
- stdout(readServerVersion() + '\n');
168
- return;
169
- }
170
- switch (subcommand) {
171
- case 'serve': {
172
- const config = await loadConfig(configArg, deps);
173
- // Stderr event streaming is always on (4.7.3+; no --verbose flag).
174
- // --log enables JSONL persistence to ~/.multi-model/logs/mmagent-YYYY-MM-DD.jsonl.
175
- if (opts['log'] === true) {
176
- if (!config.diagnostics)
177
- config.diagnostics = { log: false };
178
- config.diagnostics.log = true;
179
- }
180
- // startServe() blocks until a signal arrives and exits the process.
181
- await startServe(config, exit);
182
- break;
183
- }
184
- case 'print-token': {
185
- const config = await loadConfig(configArg, deps).catch(() => null);
186
- const tokenFile = config
187
- ? config.server.auth.tokenFile
188
- : path.join(deps.homeDir?.() ?? os.homedir(), '.multi-model', 'auth-token');
189
- const code = printToken({
190
- homeDir: deps.homeDir?.() ?? os.homedir(),
191
- tokenFile,
192
- env: deps.env?.() ?? process.env,
193
- stdout: deps.stdout,
194
- stderr: deps.stderr,
195
- });
196
- exit(code);
197
- break;
198
- }
199
- case 'status': {
200
- const jsonFlag = opts['json'] === true;
201
- const config = await loadConfig(configArg, deps).catch(() => null);
202
- const home = deps.homeDir?.() ?? os.homedir();
203
- const tokenFile = config
204
- ? config.server.auth.tokenFile
205
- : path.join(home, '.multi-model', 'auth-token');
206
- const serverUrl = config
207
- ? buildServerUrl(config.server.bind, config.server.port)
208
- : buildServerUrl('127.0.0.1', 7337);
209
- const code = await runStatus({
210
- serverUrl,
211
- tokenFile,
212
- json: jsonFlag,
213
- env: deps.env?.() ?? process.env,
214
- homeDir: home,
215
- stdout: deps.stdout,
216
- stderr: deps.stderr,
217
- });
218
- exit(code);
219
- break;
220
- }
221
- case 'info': {
222
- const jsonFlag = opts['json'] === true;
223
- const config = await loadConfig(configArg, deps).catch(() => null);
224
- if (!config) {
225
- stderr(`mmagent info: cannot load config. Set --config or $MMAGENT_CONFIG.\n`);
226
- exit(1);
227
- break;
228
- }
229
- const code = await runInfo({
230
- cliVersion: readServerVersion(),
231
- bind: config.server.bind,
232
- port: config.server.port,
233
- tokenFile: config.server.auth.tokenFile,
234
- homeDir: deps.homeDir?.() ?? os.homedir(),
235
- json: jsonFlag,
236
- stdout: deps.stdout,
237
- stderr: deps.stderr,
238
- });
239
- exit(code);
240
- break;
241
- }
242
- case 'logs': {
243
- const config = await loadConfig(configArg, deps).catch(() => null);
244
- if (!config) {
245
- stderr(`mmagent logs: cannot load config. Set --config or $MMAGENT_CONFIG.\n`);
246
- exit(1);
247
- break;
248
- }
249
- const code = await runLogs({
250
- config,
251
- homeDir: deps.homeDir?.() ?? os.homedir(),
252
- follow: opts['follow'] === true,
253
- batchId: typeof opts['batch'] === 'string' ? opts['batch'] : undefined,
254
- stdout: deps.stdout,
255
- stderr: deps.stderr,
256
- });
257
- exit(code);
258
- break;
259
- }
260
- case 'sync-skills': {
261
- // Forward argv tokens that come after the subcommand name so
262
- // sync-skills' own minimist sees `--target=`, `--all-targets`, etc.
263
- const subCmdIdx = argv.indexOf('sync-skills');
264
- const subArgv = subCmdIdx >= 0 ? argv.slice(subCmdIdx + 1) : positional.slice(1);
265
- const code = await runSyncSkills({
266
- argv: subArgv,
267
- homeDir: deps.homeDir?.() ?? os.homedir(),
268
- ifExists: opts['if-exists'] === true,
269
- silent: opts['silent'] === true,
270
- bestEffort: opts['best-effort'] === true,
271
- stdout: deps.stdout,
272
- stderr: deps.stderr,
273
- });
274
- exit(code);
275
- break;
276
- }
277
- case 'enable':
278
- case 'disable': {
279
- // Forward argv tokens after the subcommand name so toggle's own minimist
280
- // sees --target=, --all-targets, --dry-run, --json.
281
- const subCmdIdx = argv.indexOf(subcommand);
282
- const subArgv = subCmdIdx >= 0 ? argv.slice(subCmdIdx + 1) : positional.slice(1);
283
- const run = subcommand === 'disable' ? runDisable : runEnable;
284
- const code = await run({
285
- argv: subArgv,
286
- homeDir: deps.homeDir?.() ?? os.homedir(),
287
- cliVersion: readServerVersion(),
288
- stdout: deps.stdout,
289
- stderr: deps.stderr,
290
- });
291
- exit(code);
292
- break;
293
- }
294
- case 'telemetry': {
295
- const home = deps.homeDir?.() ?? path.join(os.homedir(), '.multi-model');
296
- const telemetrySubcommand = positional[1] ?? 'status';
297
- const validSubcommands = ['status', 'enable', 'disable', 'reset-id', 'dump-queue'];
298
- if (!validSubcommands.includes(telemetrySubcommand)) {
299
- stderr(`mmagent telemetry: unknown subcommand '${telemetrySubcommand}'\nValid: ${validSubcommands.join(', ')}\n`);
300
- exit(1);
301
- break;
302
- }
303
- const code = await runTelemetry({
304
- subcommand: telemetrySubcommand,
305
- homeDir: home,
306
- stdout: deps.stdout,
307
- stderr: deps.stderr,
308
- });
309
- exit(code);
310
- break;
311
- }
312
- default: {
313
- stderr(`Unknown command: ${subcommand}\nRun 'mmagent --help' for usage.\n`);
314
- exit(1);
315
- }
316
- }
317
- }
318
- // ── Bootstrap ──────────────────────────────────────────────────────────────
319
- // Only run main() when this module is executed as the CLI entry point.
320
- // Tests import main() directly and pass CliDeps.
321
- function isMain() {
322
- try {
323
- const argv1 = process.argv[1];
324
- if (!argv1)
325
- return false;
326
- // Resolve to absolute path and follow symlinks — npm installs the bin as a
327
- // symlink in node_modules/.bin/, so argv[1] points at the symlink, not the
328
- // real file. fs.realpathSync follows the link so it matches import.meta.url.
329
- const entryPath = import.meta.url.startsWith('file://')
330
- ? fileURLToPath(import.meta.url)
331
- : path.resolve(argv1);
332
- return fs.realpathSync(path.resolve(argv1)) === entryPath;
333
- }
334
- catch {
335
- return false;
336
- }
337
- }
338
- if (isMain()) {
339
- void main().catch((err) => {
340
- const msg = err instanceof Error ? err.message : String(err);
341
- process.stderr.write(`mmagent: ${msg}\n`);
342
- process.exit(1);
343
- });
344
- }
345
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,QAA6B,MAAM,UAAU,CAAC;AACrD,OAAO,EACL,kBAAkB,GAEnB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAkC9C,8CAA8C;AAC9C,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,OAAO,QAAQ,CAAC,IAAI,EAAE;QACpB,MAAM,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC3B,OAAO,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,CAAC;QACtG,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE;QAC1D,2EAA2E;QAC3E,uEAAuE;QACvE,8DAA8D;KAC/D,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,SAAS,mBAAmB,CAC1B,QAA4B,EAC5B,GAAuC,EACvC,GAAW,EACX,IAAY;IAEZ,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEnC,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,IAAI,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAE/B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC,CAAC;IAEtD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC;IAE3D,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAA4B,EAC5B,GAAuC,EACvC,GAAW,EACX,IAAY;IAEZ,KAAK,MAAM,CAAC,IAAI,mBAAmB,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;QAC9D,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,YAAgC,EAChC,IAA8C;IAE9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC;IAExC,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,KAAK,MAAM,CAAC,IAAI,mBAAmB,CAAC,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;QAClE,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,SAAS,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACpC,SAAS;QACX,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,SAAS;QAChC,IAAI,CAAC;YACH,OAAO,MAAM,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CACb,iCAAiC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;QACzD,iFAAiF,CAClF,CAAC;AACJ,CAAC;AAED,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;CAqBjB,CAAC;AAEF;;GAEG;AACH,SAAS,iBAAiB;IACxB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAyB,CAAC;QACjF,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAgB,EAAE;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAErD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,CAAa,CAAC;IACtC,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;IAC5C,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAElF,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACjB,MAAM,CAAC,SAAS,CAAC,CAAC;QAClB,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACpB,MAAM,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC,CAAC;QACnC,OAAO;IACT,CAAC;IAED,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACjD,mEAAmE;YACnE,mFAAmF;YACnF,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;gBACzB,IAAI,CAAC,MAAM,CAAC,WAAW;oBAAE,MAAM,CAAC,WAAW,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;gBAC7D,MAAM,CAAC,WAAW,CAAC,GAAG,GAAG,IAAI,CAAC;YAChC,CAAC;YACD,oEAAoE;YACpE,MAAM,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC/B,MAAM;QACR,CAAC;QACD,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YACnE,MAAM,SAAS,GAAG,MAAM;gBACtB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS;gBAC9B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;YAC9E,MAAM,IAAI,GAAG,UAAU,CAAC;gBACtB,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE;gBACzC,SAAS;gBACT,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,OAAO,CAAC,GAAG;gBAChC,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,CAAC;YACX,MAAM;QACR,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;YACvC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YACnE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YAC9C,MAAM,SAAS,GAAG,MAAM;gBACtB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS;gBAC9B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;YAClD,MAAM,SAAS,GAAG,MAAM;gBACtB,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBACxD,CAAC,CAAC,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YACtC,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC;gBAC3B,SAAS;gBACT,SAAS;gBACT,IAAI,EAAE,QAAQ;gBACd,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,OAAO,CAAC,GAAG;gBAChC,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,CAAC;YACX,MAAM;QACR,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;YACvC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YACnE,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,CAAC,sEAAsE,CAAC,CAAC;gBAC/E,IAAI,CAAC,CAAC,CAAC,CAAC;gBACR,MAAM;YACR,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC;gBACzB,UAAU,EAAE,iBAAiB,EAAE;gBAC/B,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;gBACxB,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;gBACxB,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS;gBACvC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE;gBACzC,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,CAAC;YACX,MAAM;QACR,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YACnE,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,CAAC,sEAAsE,CAAC,CAAC;gBAC/E,IAAI,CAAC,CAAC,CAAC,CAAC;gBACR,MAAM;YACR,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC;gBACzB,MAAM;gBACN,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE;gBACzC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI;gBAC/B,OAAO,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;gBACtE,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,CAAC;YACX,MAAM;QACR,CAAC;QACD,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,6DAA6D;YAC7D,oEAAoE;YACpE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjF,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC;gBAC/B,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE;gBACzC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI;gBACpC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI;gBAC/B,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,IAAI;gBACxC,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,CAAC;YACX,MAAM;QACR,CAAC;QACD,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,yEAAyE;YACzE,oDAAoD;YACpD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC3C,MAAM,OAAO,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjF,MAAM,GAAG,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;YAC9D,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC;gBACrB,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE;gBACzC,UAAU,EAAE,iBAAiB,EAAE;gBAC/B,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,CAAC;YACX,MAAM;QACR,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;YACzE,MAAM,mBAAmB,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;YACtD,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;YACnF,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBACpD,MAAM,CAAC,0CAA0C,mBAAmB,aAAa,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClH,IAAI,CAAC,CAAC,CAAC,CAAC;gBACR,MAAM;YACR,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC;gBAC9B,UAAU,EAAE,mBAAkF;gBAC9F,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,CAAC;YACX,MAAM;QACR,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,CAAC,oBAAoB,UAAU,qCAAqC,CAAC,CAAC;YAC5E,IAAI,CAAC,CAAC,CAAC,CAAC;QACV,CAAC;IACH,CAAC;AACH,CAAC;AAED,8EAA8E;AAE9E,uEAAuE;AACvE,iDAAiD;AACjD,SAAS,MAAM;IACb,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,2EAA2E;QAC3E,2EAA2E;QAC3E,6EAA6E;QAC7E,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;YACrD,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YAChC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxB,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,SAAS,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,IAAI,MAAM,EAAE,EAAE,CAAC;IACb,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QACjC,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,22 +0,0 @@
1
- export interface InfoDeps {
2
- /** CLI package version (read from the server package.json at startup). */
3
- cliVersion: string;
4
- /** Config bind address (e.g. '127.0.0.1'). */
5
- bind: string;
6
- /** Config port (e.g. 7337). */
7
- port: number;
8
- /** Token file path (already resolved from config, no tilde expansion yet). */
9
- tokenFile: string;
10
- /** Home dir for tilde expansion. Defaults to os.homedir(). */
11
- homeDir?: string;
12
- /** Emit machine-readable JSON instead of a human summary. */
13
- json?: boolean;
14
- /** stdout writer (for testing). */
15
- stdout?: (s: string) => boolean;
16
- /** stderr writer (for testing). */
17
- stderr?: (s: string) => boolean;
18
- /** Injectable fetch for testing; defaults to global fetch. */
19
- fetch?: typeof fetch;
20
- }
21
- export declare function runInfo(deps: InfoDeps): Promise<number>;
22
- //# sourceMappingURL=info.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../src/cli/info.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,QAAQ;IACvB,0EAA0E;IAC1E,UAAU,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,SAAS,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,mCAAmC;IACnC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAChC,mCAAmC;IACnC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAChC,8DAA8D;IAC9D,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAsBD,wBAAsB,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CA2E7D"}